<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkEFRn89fyp7ImA9WhRUEEo.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728</id><updated>2012-01-20T15:43:37.167+01:00</updated><category term="mex" /><category term="guidelines" /><category term="dutch language union" /><category term="clr implementations" /><category term=".net 3.5" /><category term="fsm" /><category term="concurrent haskell" /><category term="compilers" /><category term="development" /><category term="hashcode" /><category term="seal" /><category term="metadataexchange" /><category term="forkIO" /><category term="framework design" /><category term="propositional logic" /><category term="adobe" /><category term="enka no joou" /><category term="tokenizer" /><category term="c# 3.0" /><category term="hash codes" /><category term="threading" /><category term="Mathematica" /><category term="roadmap" /><category term="make" /><category term="inter-process communication" /><category term="okitsune" /><category term="debian linux 4.0 etch" /><category term="markov ngram models" /><category term="finite state automaton" /><category term="uni mannheim" /><category term="nosql" /><category term="fxcop" /><category term="MSIL" /><category term="solaris" /><category term="approximation" /><category term="OCR" /><category term="drama" /><category term="linq" /><category term="unsafePerformIO" /><category term="java" /><category term="perplexity" /><category term="PDF" /><category term="example" /><category term="benihime" /><category term="store" /><category term="turkish students' association" /><category term="cem imre" /><category term="after" /><category term="class library" /><category term="concurrency" /><category term="finite state machine" /><category term="wordlister" /><category term="mono performance" /><category term="wordsmith tools" /><category term="machine translation" /><category term="Unicode" /><category term="mono 1.2.4 preview" /><category term="build" /><category term="pre-alpha" /><category term="visual studio 2005" /><category term="wcf 4.0" /><category term="theorem prover" /><category term="matoed" /><category term="GIMPS" /><category term="lucy corpus" /><category term="training set" /><category term="design" /><category term="Flensburg" /><category term="new project" /><category term="statistics" /><category term="segmentation" /><category term="svn" /><category term="porting" /><category term="reflection" /><category term="IDS" /><category term="Sertcom" /><category term="virtualdub" /><category term="mono 1.2.4" /><category term="i-d-e" /><category term="TinEye" /><category term="GNU" /><category term="紅姫" /><category term="reflection emit" /><category term="logo" /><category term="project openings" /><category term="PubMed" /><category term="GPL Version 3" /><category term="citation analysis" /><category term="sourcegrid" /><category term="mono/solaris" /><category term="CERTT" /><category term="compilation" /><category term="tenka" /><category term="propositional tableaux" /><category term="contact" /><category term="concept" /><category term="University of Ottowa" /><category term="狐" /><category term="cs5" /><category term="ids mannheim" /><category term="cetin sert" /><category term="aegisub" /><category term="fansub" /><category term="combining marks" /><category term="Institut für Deutsche Sprache" /><category term="character frequency lists" /><category term="photoshop" /><category term="windows vista ultimate" /><category term="implementation" /><category term="frequency lists" /><category term="music" /><category term="character frequencies" /><category term="distributed computing" /><category term="mono 1.2.6" /><category term="lexical functional grammar" /><category term="regex" /><category term="mono project" /><category term="research project" /><category term="IL" /><category term="acrobat" /><category term="ctp" /><category term="twitter" /><category term="runtime compilation" /><category term="server" /><category term="routing" /><category term="standards" /><category term="system.reflection.emit" /><category term="calculating perplexity" /><category term="mono 1.2.5" /><category term="mike scott" /><category term="solaris 10-x86" /><category term="Taalunie" /><category term="fansubbing" /><category term="high performance" /><category term="Unicode Standard 5.0" /><category term="installation" /><category term="boolean expressions" /><category term="automated reasoning" /><category term="part of speech tagging" /><category term="documentation" /><category term="erlang" /><category term="segmenter" /><category term="characters" /><category term="C" /><category term="hidden markov models" /><category term="directed acyclic graphs" /><category term="bcl" /><category term="CORSIS" /><category term="analytic tableaux" /><category term="Reverse Video Search" /><category term="dynamism" /><category term="joshi deka" /><category term="method" /><category term="edsl" /><category term="fgl" /><category term="ankh svn" /><category term="monadic IO" /><category term="fsf" /><category term="mono 1.9" /><category term="c#" /><category term="stackoverflow" /><category term="key/value" /><category term="test" /><category term="minimum" /><category term="windows xp" /><category term="japanese" /><category term="windows 2003" /><category term="System.Globalization.StringInfo" /><category term="grapheme clusters" /><category term="logarithmic space" /><category term="expert f#" /><category term="haskell" /><category term="tagger" /><category term="edit distance" /><category term=".net" /><category term="performance" /><category term="strings" /><category term="development plan" /><category term="xml" /><category term="f-structure" /><category term="computational linguistics" /><category term="fail whale" /><category term="64-bit" /><category term="refactoring" /><category term="logic" /><category term="os" /><category term="solaris 10/x86" /><category term="solaris 10" /><category term="erlang process" /><category term="monads" /><category term="improvement" /><category term="mono 2.0" /><category term="multi-core" /><category term="update dialog" /><category term="algorithm" /><category term="minimal" /><category term="links" /><category term="compile" /><category term="gui" /><category term="automated theorem proving" /><category term="j-drama" /><category term="visual studio" /><category term="minimum edit distance" /><category term="parallel computation" /><category term="markov n-gram models" /><category term="multi-threading" /><category term="advanced topics in information retrieval" /><category term="regular expressions" /><category term="screenshot" /><category term="china" /><category term="tenka text" /><category term="hmm" /><category term="x86-64" /><category term="mono 1.9_5" /><category term="Devanāgarī" /><category term="ELIT" /><category term="wiki" /><category term="mop girl" /><category term="hash code collision" /><category term="mono 1.9.5" /><category term="workflow" /><category term="cache" /><category term="debugging" /><category term="general public license" /><category term="free software foundation" /><category term="wordsmith tools 5.0" /><category term="functional graph library" /><category term="天花" /><category term="monad" /><category term="language models" /><category term="ahmed ghoneim" /><category term="x86" /><category term="API consistency" /><category term="assembly" /><category term="binary release" /><category term="USA" /><category term="GPL 3.0" /><category term="levenshtein distance" /><category term="download" /><category term="process networks" /><category term="f#" /><category term=".net 4.0" /><category term="address" /><category term="institut für politische wissenschaft" /><category term="comparison" /><category term="32-bit" /><category term="port" /><category term="LFG" /><category term="file" /><category term="tortoise svn" /><category term="code review" /><category term="wcf" /><category term="linux" /><category term="university of heidelberg" /><category term="hashset" /><category term="papa to musume" /><category term="operating systems" /><category term="office" /><category term="GPLv3" /><category term="fsa" /><category term="research" /><category term="wordmark" /><category term="f-structures" /><category term="fall 2007" /><category term="mersenne prime" /><category term="tutorial" /><category term="sorting" /><category term="IPW" /><category term="finereader" /><category term="fzi karlsruhe" /><category term="test set" /><category term="abbyy" /><category term="University of Cologne" /><category term="CIL" /><category term="precision" /><category term="2005" /><category term="levenshtein" /><category term="enka" /><category term="antconc" /><category term="markov chains" /><category term="lingenio" /><category term="jobs" /><category term="clock" /><category term="PageRank" /><category term="EndNote X3" /><category term="orcas" /><category term="functional programming" /><category term="japan" /><category term="Institut für Dokumentologie und Editorik" /><category term="collections" /><category term="hotaru no hikari" /><category term="mono" /><category term="data" /><category term="distribution" /><category term="heidelberg" /><category term="NTU" /><title>CORSIS</title><subtitle type="html">Corpus Analysis</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://corsis.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>59</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/corsis" /><feedburner:info uri="corsis" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CkEFRn88fSp7ImA9WhRUEEo.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-7794538437123258547</id><published>2012-01-20T14:44:00.001+01:00</published><updated>2012-01-20T15:43:37.175+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-20T15:43:37.175+01:00</app:edited><title>Tiny F# EDSL for creating system / hardware IDs on Windows using WMI classes</title><content type="html">SystemID EDSL Module:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Consolas;"&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;module&lt;/span&gt;&amp;nbsp;SystemID&amp;nbsp;=
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;open&lt;/span&gt;&amp;nbsp;System
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;open&lt;/span&gt;&amp;nbsp;System.Management
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;type&lt;/span&gt;&amp;nbsp;ClassName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;type&lt;/span&gt;&amp;nbsp;PropertyKey&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;type&lt;/span&gt;&amp;nbsp;PropertyValue&amp;nbsp;=&amp;nbsp;obj
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;type&lt;/span&gt;&amp;nbsp;IDComponent&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;ClassName&amp;nbsp;*&amp;nbsp;&amp;nbsp;PropertyKey&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;type&lt;/span&gt;&amp;nbsp;IDQueryResult&amp;nbsp;=&amp;nbsp;ClassName&amp;nbsp;*&amp;nbsp;(PropertyKey&amp;nbsp;*&amp;nbsp;PropertyValue)[][]
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;internal&lt;/span&gt;&amp;nbsp;qs&amp;nbsp;(t:ClassName)&amp;nbsp;(ps:PropertyKey[])&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;use&lt;/span&gt;&amp;nbsp;mos&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;ManagementObjectSearcher(&lt;span style="color: maroon;"&gt;"Select&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;String.Join(&lt;span style="color: maroon;"&gt;","&lt;/span&gt;,&amp;nbsp;ps)&amp;nbsp;+&amp;nbsp;&lt;span style="color: maroon;"&gt;"&amp;nbsp;From&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;t)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;col&amp;nbsp;=&amp;nbsp;mos.Get()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;arr&amp;nbsp;=&amp;nbsp;Seq.toArray
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;seq&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;o&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;col&amp;nbsp;&lt;span style="color: blue;"&gt;do&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;yield&lt;/span&gt;&amp;nbsp;seq&amp;nbsp;{&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;p&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;o.Properties&amp;nbsp;&lt;span style="color: blue;"&gt;do&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;yield&lt;/span&gt;&amp;nbsp;p.Name,&amp;nbsp;p.Value&amp;nbsp;}&amp;nbsp;|&amp;gt;&amp;nbsp;arr&amp;nbsp;}&amp;nbsp;|&amp;gt;&amp;nbsp;arr
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;with&lt;/span&gt;&amp;nbsp;_&amp;nbsp;&lt;span style="color: blue;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;[|[||]|]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;internal&lt;/span&gt;&amp;nbsp;gs&amp;nbsp;s&amp;nbsp;=&amp;nbsp;s|&amp;gt;Array.map&amp;nbsp;(Array.filter&amp;nbsp;(&lt;span style="color: blue;"&gt;fun&lt;/span&gt;&amp;nbsp;e&amp;nbsp;&lt;span style="color: blue;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;match&lt;/span&gt;&amp;nbsp;e&amp;nbsp;&lt;span style="color: blue;"&gt;with&lt;/span&gt;&amp;nbsp;k,&lt;span style="color: blue;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;&amp;nbsp;|_&lt;span style="color: blue;"&gt;-&amp;gt;true&lt;/span&gt;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;internal&lt;/span&gt;&amp;nbsp;vs&amp;nbsp;(t,&amp;nbsp;ns)&amp;nbsp;=&amp;nbsp;t,qs&amp;nbsp;t&amp;nbsp;ns&amp;nbsp;|&amp;gt;&amp;nbsp;gs
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;query&amp;nbsp;:&amp;nbsp;IDComponent[]&amp;nbsp;&lt;span style="color: blue;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;IDQueryResult[]&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;fun&lt;/span&gt;&amp;nbsp;(cs:IDComponent[])&amp;nbsp;&lt;span style="color: blue;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;cs&amp;nbsp;|&amp;gt;&amp;nbsp;Array.map&amp;nbsp;vs
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;module&lt;/span&gt;&amp;nbsp;Conversions&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;inline&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;bytes&amp;nbsp;(raw:string)&amp;nbsp;=&amp;nbsp;System.Text.Encoding.UTF8.GetBytes&amp;nbsp;raw
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;text&amp;nbsp;rs&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;System.Text.StringBuilder()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs&amp;nbsp;|&amp;gt;&amp;nbsp;Array.iter&amp;nbsp;(sprintf&amp;nbsp;&lt;span style="color: maroon;"&gt;"%A"&lt;/span&gt;&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;b.AppendLine&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;ignore)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b.ToString()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;sha&amp;nbsp;(raw:string)&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;sha&amp;nbsp;=&amp;nbsp;System.Security.Cryptography.SHA1.Create()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;|&amp;gt;&amp;nbsp;bytes&amp;nbsp;|&amp;gt;&amp;nbsp;sha.ComputeHash&amp;nbsp;|&amp;gt;&amp;nbsp;System.Convert.ToBase64String
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;inline&lt;/span&gt;&amp;nbsp;hex&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;raw&amp;nbsp;|&amp;gt;&amp;nbsp;bytes&amp;nbsp;|&amp;gt;&amp;nbsp;System.BitConverter.ToString&amp;nbsp;|&amp;gt;&amp;nbsp;&lt;span style="color: blue;"&gt;fun&lt;/span&gt;&amp;nbsp;x&amp;nbsp;&lt;span style="color: blue;"&gt;-&amp;gt;&lt;/span&gt;&amp;nbsp;x.Replace(&lt;span style="color: maroon;"&gt;"-"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: maroon;"&gt;""&lt;/span&gt;)
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;let&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;inline&lt;/span&gt;&amp;nbsp;(!/)&amp;nbsp;x&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;"Win32_"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;x
&lt;/pre&gt;
&lt;/pre&gt;
&lt;/pre&gt;
&lt;br /&gt;
Create custom system ID based-on operating system serial number:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;&amp;gt; &lt;b&gt;open SystemID&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;  &lt;b&gt;open SystemID.Conversions&lt;/b&gt;;;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;&amp;gt; &lt;b&gt;[| !/"OperatingSystem", [| "SerialNumber" |] |] |&amp;gt; query&lt;/b&gt;;;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;val it : IDQueryResult [] =
  [|("Win32_OperatingSystem",
     [|[|("SerialNumber", "00477-179-7015276-84376")|]|])|]
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;&amp;gt; &lt;b&gt;[| !/"OperatingSystem", [| "SerialNumber" |] |] |&amp;gt; query |&amp;gt; text |&amp;gt; sha |&amp;gt; hex&lt;/b&gt;;;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;val it : string = "433855487A6D4F76453845736667777061724A6E5336734F4434513D"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;div style="font-family: 'Times New Roman'; white-space: normal;"&gt;
&lt;/div&gt;
&lt;div style="font-family: 'Times New Roman'; white-space: normal;"&gt;
&lt;/div&gt;
&lt;div style="font-family: 'Times New Roman'; white-space: normal;"&gt;
&lt;br /&gt;
Create custom hardware ID based-on processor and BIOS information:&lt;/div&gt;
&lt;/pre&gt;
&lt;span style="background-color: white; color: blue; font-family: Consolas;"&gt;&amp;gt;   &lt;/span&gt;&lt;b style="background-color: white; color: blue; font-family: Consolas;"&gt;[| &lt;/b&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;&lt;b&gt;        !/"Processor", [| "Architecture"; "Caption"     ; "Name" |]
        !/"BIOS",      [| "ReleaseDate" ; "SerialNumber"         |]
    |] |&amp;gt; query&lt;/b&gt;;;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;val it : IDQueryResult [] =
  [|("Win32_Processor",
     [|[|("Architecture", 9us);
         ("Caption", "Intel64 Family 6 Model 30 Stepping 5");
         ("Name", "Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz")|]|]);
    ("Win32_BIOS", [|[|("ReleaseDate", "20090731000000.000000+000")|]|])|]&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="color: blue; font-family: Consolas;"&gt;&amp;gt;   &lt;b&gt;[| 
        !/"Processor", [| "Architecture"; "Caption"     ; "Name" |]
        !/"BIOS",      [| "ReleaseDate" ; "SerialNumber"         |]
    |] |&amp;gt; query |&amp;gt; text |&amp;gt; sha |&amp;gt; hex&lt;/b&gt;;;

val it : string = "544E50614E4A3579784168496C6E4445683843684D6A72314F41493D"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;div style="font-family: 'Times New Roman'; white-space: normal;"&gt;
&lt;/div&gt;
&lt;div style="font-family: 'Times New Roman'; font-size: medium; white-space: normal;"&gt;
&lt;span style="background-color: white;"&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: 'Times New Roman'; font-size: medium; white-space: normal;"&gt;
&lt;span style="background-color: white;"&gt;Choose and create system / hardware IDs exactly as you wish!&lt;/span&gt;&lt;/div&gt;
&lt;/pre&gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-7794538437123258547?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=OE6qeaTtlhY:OlAVpZNQrE8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=OE6qeaTtlhY:OlAVpZNQrE8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=OE6qeaTtlhY:OlAVpZNQrE8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=OE6qeaTtlhY:OlAVpZNQrE8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=OE6qeaTtlhY:OlAVpZNQrE8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=OE6qeaTtlhY:OlAVpZNQrE8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=OE6qeaTtlhY:OlAVpZNQrE8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=OE6qeaTtlhY:OlAVpZNQrE8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=OE6qeaTtlhY:OlAVpZNQrE8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/OE6qeaTtlhY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/7794538437123258547/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=7794538437123258547" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/7794538437123258547?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/7794538437123258547?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/OE6qeaTtlhY/tiny-f-edsl-for-creating-system.html" title="Tiny F# EDSL for creating system / hardware IDs on Windows using WMI classes" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2012/01/tiny-f-edsl-for-creating-system.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AAR3k5fSp7ImA9WhRTFU4.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-3267219773161616755</id><published>2011-11-05T23:59:00.001+01:00</published><updated>2011-11-06T00:29:06.725+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-06T00:29:06.725+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="logo" /><category scheme="http://www.blogger.com/atom/ns#" term="Mathematica" /><title>Corsis Research</title><content type="html">&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-985GvKdjl18/TrW_ighxZLI/AAAAAAAABmk/4ItRpvVA43g/s1600/logo.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-985GvKdjl18/TrW_ighxZLI/AAAAAAAABmk/4ItRpvVA43g/s1600/logo.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;2011 - Logo&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Solidity, growth, and new dimensions!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-3267219773161616755?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=RxLR6lX_VrQ:MZkzfa_mfto:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=RxLR6lX_VrQ:MZkzfa_mfto:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=RxLR6lX_VrQ:MZkzfa_mfto:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=RxLR6lX_VrQ:MZkzfa_mfto:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=RxLR6lX_VrQ:MZkzfa_mfto:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=RxLR6lX_VrQ:MZkzfa_mfto:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=RxLR6lX_VrQ:MZkzfa_mfto:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=RxLR6lX_VrQ:MZkzfa_mfto:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=RxLR6lX_VrQ:MZkzfa_mfto:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/RxLR6lX_VrQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/3267219773161616755/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=3267219773161616755" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/3267219773161616755?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/3267219773161616755?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/RxLR6lX_VrQ/corsis-research.html" title="Corsis Research" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-985GvKdjl18/TrW_ighxZLI/AAAAAAAABmk/4ItRpvVA43g/s72-c/logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2011/11/corsis-research.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEMQ3k-eyp7ImA9Wx9aFUw.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-5503158376907617596</id><published>2011-03-07T16:11:00.001+01:00</published><updated>2011-03-07T16:11:22.753+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-07T16:11:22.753+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="metadataexchange" /><category scheme="http://www.blogger.com/atom/ns#" term="routing" /><category scheme="http://www.blogger.com/atom/ns#" term="mex" /><category scheme="http://www.blogger.com/atom/ns#" term=".net 4.0" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="f#" /><category scheme="http://www.blogger.com/atom/ns#" term="wcf" /><category scheme="http://www.blogger.com/atom/ns#" term="wcf 4.0" /><title>WCF 4.0 routing with MetadataExchange using System.ServiceModel.Routing.RoutingService in F#</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;I posted a simple question on stackoverflow.com:&lt;/p&gt;  &lt;p&gt;&lt;span style="border-collapse: collapse; font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif; font-size: 14px; line-height: 18px;"&gt;  &lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; font-size: 14px; vertical-align: baseline; background-color: transparent; clear: both; padding-left: 30px;"&gt;  &lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-color: transparent; clear: both; padding: 0px;"&gt;I have service with working MEX at:&lt;/p&gt;  &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;net.tcp://remotehost:4508&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt;   &lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-color: transparent; clear: both; padding: 0px;"&gt;What is the shortest C#/F# code (hard time understanding XML configuration files ^_^") I could write to create a router to it at?:&lt;/p&gt;  &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;net.tcp://localhost:4508&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt;   &lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-color: transparent; clear: both; padding: 0px;"&gt;MEX should also be routed properly so that clients can use the router&lt;/p&gt;  &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;svcutil net.tcp://localhost:4508&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt;   &lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-size: 14px; vertical-align: baseline; background-color: transparent; clear: both; padding: 0px;"&gt;to discover service methods.&lt;/p&gt;  &lt;/p&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;and as has been usual with its users no one has been able to answer my question before I could come up with my own answer.&lt;/p&gt;  &lt;p&gt;Here's how to use F# and WCF 4.0 to route a service with NetTcp and MexTcp endpoints no XML involved, pure code:&lt;/p&gt;  &lt;p&gt;&lt;span style="border-collapse: collapse; font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif; font-size: 14px; line-height: 18px;"&gt;  &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;namespace CORSISmodule Application =    open System    open System.ServiceModel    open System.ServiceModel.Routing    open System.ServiceModel.Dispatcher    open System.ServiceModel.Description    let createSimpleRouter createBinding (routerAddress : string) serviceAddress =         let routerType = typeof&amp;lt;IRequestReplyRouter&amp;gt;        let routerContract = ContractDescription.GetContract(routerType)        let endpoint address = new ServiceEndpoint(routerContract, createBinding(), new EndpointAddress(address))        let serviceEndpoints = [| endpoint serviceAddress |]        let configuration = new RoutingConfiguration()        configuration.FilterTable.Add(new MatchAllMessageFilter(), serviceEndpoints)        let host = new ServiceHost(typeof&amp;lt;RoutingService&amp;gt;)        ignore &amp;lt;| host.AddServiceEndpoint(routerType, createBinding(), routerAddress)        host.Description.Behaviors.Add(new RoutingBehavior(configuration))        host            [&amp;lt;EntryPoint&amp;gt;]    let main(args) =        let (routerAddress, serviceAddress) =            match args with            | [| ra; sa |] -&amp;gt; (ra, sa)            | _ -&amp;gt; (&amp;quot;net.tcp://localhost:4508/&amp;quot;, &amp;quot;net.tcp://remotehost:4508/&amp;quot;)        let netTcp() = new NetTcpBinding(SecurityMode.None)        let mexTcp() = MetadataExchangeBindings.CreateMexTcpBinding()        let tcpRouter = createSimpleRouter netTcp  routerAddress           serviceAddress        let mexRouter = createSimpleRouter mexTcp (routerAddress + &amp;quot;mex&amp;quot;) (serviceAddress + &amp;quot;mex&amp;quot;)        tcpRouter.Open()        mexRouter.Open()        Console.WriteLine(&amp;quot;routing ...\n{0} &amp;lt;-&amp;gt; R:{1}&amp;quot;, serviceAddress, routerAddress)        ignore &amp;lt;| Console.ReadKey true        0&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt;   &lt;/span&gt;&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://corsis.posterous.com/wcf-40-routing-with-metadataexchange-using-sy"&gt;corsis&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-5503158376907617596?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=JqWtbxc8BZg:MBwAoGpXDPs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=JqWtbxc8BZg:MBwAoGpXDPs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=JqWtbxc8BZg:MBwAoGpXDPs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=JqWtbxc8BZg:MBwAoGpXDPs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=JqWtbxc8BZg:MBwAoGpXDPs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=JqWtbxc8BZg:MBwAoGpXDPs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=JqWtbxc8BZg:MBwAoGpXDPs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=JqWtbxc8BZg:MBwAoGpXDPs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=JqWtbxc8BZg:MBwAoGpXDPs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/JqWtbxc8BZg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/5503158376907617596/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=5503158376907617596" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/5503158376907617596?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/5503158376907617596?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/JqWtbxc8BZg/wcf-40-routing-with-metadataexchange.html" title="WCF 4.0 routing with MetadataExchange using System.ServiceModel.Routing.RoutingService in F#" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2011/03/wcf-40-routing-with-metadataexchange.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08ESXs4eyp7ImA9Wx9REUw.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-2130739085846731747</id><published>2010-12-12T00:12:00.003+01:00</published><updated>2010-12-12T02:03:28.533+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-12T02:03:28.533+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TinEye" /><category scheme="http://www.blogger.com/atom/ns#" term="Reverse Video Search" /><category scheme="http://www.blogger.com/atom/ns#" term="Mathematica" /><title>Words that are Hard to Say - Reverse Video Search with Mathematica and TinEye</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;It all started with this link:&amp;nbsp;&lt;span style="font-family: Calibri, sans-serif; font-size: 15px;"&gt;&lt;a href="http://www.facebook.com/video/video.php?v=150827548298158"&gt;http://www.facebook.com/video/video.php?v=150827548298158&lt;/a&gt;&lt;/span&gt;. My brother wrote to me saying he had seen this movie trailer and would like to watch it but the only link he had was of this facebook video which had no names mentioned.&lt;/p&gt;&lt;p&gt;I had a simple idea:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;extract a given number of frame images&lt;/li&gt;
&lt;li&gt;use TinEye to look for pages using similar images&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;I used Mathematica to extract the frames.&lt;/p&gt;&lt;p&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/temp-2010-12-11/rGIphgDmJHsajsCBAeAsalbFaisixhxmxkjADfJqaFscEIDqkBmuqDBnsxJo/words_that_are_hard_to_say_-_mathematica_search.png.scaled1000.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-12-11/rGIphgDmJHsajsCBAeAsalbFaisixhxmxkjADfJqaFscEIDqkBmuqDBnsxJo/words_that_are_hard_to_say_-_mathematica_search.png.scaled1000.png" width="1000" height="563"/&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Then, using TinEye, we performed a reverse image search on certain frames we picked manually.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.tineye.com/search/5728ec915156cc8f0568d27d5109bd9b9c79cbf9/"&gt;http://www.tineye.com/search/5728ec915156cc8f0568d27d5109bd9b9c79cbf9/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tineye.com/search/6a97500eef0bc33220555e02a8bd1f5500157a6e/"&gt;http://www.tineye.com/search/6a97500eef0bc33220555e02a8bd1f5500157a6e/&lt;/a&gt;&amp;nbsp;(here we actually got the result!! but overlooked it)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tineye.com/search/b2ecfa195ca5bc2883dcc63e53e2b307d3b739a2/"&gt;http://www.tineye.com/search/b2ecfa195ca5bc2883dcc63e53e2b307d3b739a2/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tineye.com/search/02b352b008c9ff144695745a630e0c3a30d492e3/"&gt;http://www.tineye.com/search/02b352b008c9ff144695745a630e0c3a30d492e3/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tineye.com/search/0f748c782fc992ddd8ac5cd8b5bfec323a933048/"&gt;http://www.tineye.com/search/0f748c782fc992ddd8ac5cd8b5bfec323a933048/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-12-11/EictugdnEkIHqlhzHDlsklokhABkAyoqmmHzElnFtJEydDhkgnzcrujtgrbc/test.jpg" width="328" height="247"/&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.tineye.com/search/18c255ad6a07e6a1a3f128d2ef942393a47ae3cb/"&gt;http://www.tineye.com/search/18c255ad6a07e6a1a3f128d2ef942393a47ae3cb/&lt;/a&gt;&amp;nbsp;(here we did a combined search using the first 4 result-returning images from above, and finally succeeded to see the name we were looking for)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;It was a fun experience! In the end we learned it was not a movie but a music video from a Korean artist.&lt;/p&gt;&lt;p&gt;And here's the music video:&lt;/p&gt;&lt;p&gt;&lt;object height="385" width="480"&gt;  &lt;param name="movie" value="http://www.youtube.com/v/t4sNaEpAdpc?fs=1&amp;amp;hl=en_US" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed src="http://www.youtube.com/v/t4sNaEpAdpc?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" height="385" width="480"&gt;&lt;/embed&gt;  &lt;/object&gt;  &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.scribd.com/doc/45110861/Mathematica-TinEye-VideoSearch" title="View Mathematica-TinEye-VideoSearch on Scribd" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; display: block; text-decoration: underline;"&gt;Mathematica-TinEye-VideoSearch&lt;/a&gt;   &lt;object data="http://d1.scribdassets.com/ScribdViewer.swf" type="application/x-shockwave-flash" height="600" width="980"&gt;  &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf" /&gt;&lt;param name="wmode" value="opaque" /&gt;&lt;param name="bgcolor" value="#ffffff" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="FlashVars" value="document_id=45110861&amp;amp;access_key=key-mg1exq4ppoaknnh99l1&amp;amp;page=1&amp;amp;viewMode=list" /&gt;&lt;embed src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=45110861&amp;amp;access_key=key-mg1exq4ppoaknnh99l1&amp;amp;page=1&amp;amp;viewMode=list" type="application/x-shockwave-flash" wmode="opaque" height="600" width="980"&gt;&lt;/embed&gt;  &lt;/object&gt;  &lt;/p&gt;&lt;p style="font-size: 10px;"&gt;&lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://corsis.posterous.com/words-that-are-hard-to-say"&gt;CORSIS&lt;/a&gt; &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-2130739085846731747?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XjBWVr16_Ns:_sGxWhZifQg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XjBWVr16_Ns:_sGxWhZifQg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XjBWVr16_Ns:_sGxWhZifQg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=XjBWVr16_Ns:_sGxWhZifQg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XjBWVr16_Ns:_sGxWhZifQg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=XjBWVr16_Ns:_sGxWhZifQg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XjBWVr16_Ns:_sGxWhZifQg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XjBWVr16_Ns:_sGxWhZifQg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=XjBWVr16_Ns:_sGxWhZifQg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/XjBWVr16_Ns" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/2130739085846731747/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=2130739085846731747" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/2130739085846731747?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/2130739085846731747?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/XjBWVr16_Ns/words-that-are-hard-to-say.html" title="Words that are Hard to Say - Reverse Video Search with Mathematica and TinEye" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://corsis.blogspot.com/2010/12/words-that-are-hard-to-say.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAGRH8yeCp7ImA9Wx5bEkQ.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-1219968907991226213</id><published>2010-10-28T22:28:00.001+02:00</published><updated>2010-10-28T22:28:45.190+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-28T22:28:45.190+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fail whale" /><category scheme="http://www.blogger.com/atom/ns#" term="photoshop" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="adobe" /><category scheme="http://www.blogger.com/atom/ns#" term="cs5" /><title>Oh Dear Photoshop CS5: "Content-Aware Fill Me that Big ** Whale!"</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/temp-2010-10-28/vEJInueqlzkgdGJDFjtCnBxFJAwedwdosuiGrwjihniFabJnfgsGDnhqsHwh/Fail-Whale-CA-Filled.png.scaled1000.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-10-28/vEJInueqlzkgdGJDFjtCnBxFJAwedwdosuiGrwjihniFabJnfgsGDnhqsHwh/Fail-Whale-CA-Filled.png.scaled500.png" width="500" height="375"/&gt;&lt;/a&gt; Having some fun with my new CS 5 ... it's beautiful. Bring on the next&amp;nbsp;Christmas party good god! We have got kids to turn into pirates and ninja and what not ...&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://corsis.posterous.com/oh-dear-photoshop-cs5-content-aware-fill-me-t"&gt;CORSIS&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-1219968907991226213?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=Z2jER8xo130:FBjL4AYXKsY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=Z2jER8xo130:FBjL4AYXKsY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=Z2jER8xo130:FBjL4AYXKsY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=Z2jER8xo130:FBjL4AYXKsY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=Z2jER8xo130:FBjL4AYXKsY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=Z2jER8xo130:FBjL4AYXKsY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=Z2jER8xo130:FBjL4AYXKsY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=Z2jER8xo130:FBjL4AYXKsY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=Z2jER8xo130:FBjL4AYXKsY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/Z2jER8xo130" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/1219968907991226213/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=1219968907991226213" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/1219968907991226213?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/1219968907991226213?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/Z2jER8xo130/oh-dear-photoshop-cs5-fill-me-that-big.html" title="Oh Dear Photoshop CS5: &amp;quot;Content-Aware Fill Me that Big ** Whale!&amp;quot;" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2010/10/oh-dear-photoshop-cs5-fill-me-that-big.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUMQXc7eyp7ImA9Wx5QE0Q.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-9183757183997098590</id><published>2010-09-02T03:18:00.001+02:00</published><updated>2010-09-02T03:18:00.903+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-02T03:18:00.903+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="server" /><category scheme="http://www.blogger.com/atom/ns#" term="data" /><category scheme="http://www.blogger.com/atom/ns#" term="key/value" /><category scheme="http://www.blogger.com/atom/ns#" term="file" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><category scheme="http://www.blogger.com/atom/ns#" term="nosql" /><category scheme="http://www.blogger.com/atom/ns#" term="cache" /><category scheme="http://www.blogger.com/atom/ns#" term="store" /><title>XML Key/Value Cache Optimizations</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;For a read-only XML file server with a simple path-based addressing scheme, I initially used ConcurrentDictionary&amp;lt;string, XElement&amp;gt; as a key/value cache. This generated and kept constantly in memory a lot of unnecessary XAttribute and XElement instances which contributed nothing to raw data transfers across the wire. Considering the fact that resident XAttribute or XElement instances in the file server process were totally useless because we do indexing and serve result paths via our query server, I switched to using&amp;nbsp;path-indexed string buffers with path-to-segment dictionaries as the new key/value cache.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Memory footprint for hundred documents, before/after&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/temp-2010-09-01/ldiHbkwwugehFykpggswGwcEEJAkIduGmiDuEtHCIGjAotxchxziatlpwriI/CropperCapture13.png.scaled1000.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-09-01/ldiHbkwwugehFykpggswGwcEEJAkIduGmiDuEtHCIGjAotxchxziatlpwriI/CropperCapture13.png.scaled500.png" width="500" height="511"/&gt;&lt;/a&gt; &lt;a href='http://posterous.com/getfile/files.posterous.com/temp-2010-09-01/oFyHyxBEGcJIdFltalBzIvzgekluclgyqJxhxsuttvtInlvenGxdBjEFmwfH/CropperCapture14.png.scaled1000.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-09-01/oFyHyxBEGcJIdFltalBzIvzgekluclgyqJxhxsuttvtInlvenGxdBjEFmwfH/CropperCapture14.png.scaled500.png" width="500" height="511"/&gt;&lt;/a&gt; &lt;div&gt;&lt;a href='http://corsis.posterous.com/xml-keyvalue-cache-optimizations'&gt;See and download the full gallery on posterous&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;My question on Stackoverflow.com with some code&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stackoverflow.com/questions/3613713/how-to-get-stream-positions-of-xml-elements-in-net"&gt;http://stackoverflow.com/questions/3613713/how-to-get-stream-positions-of-xml-elements-in-net&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Full working environment screenshots ^__^&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/temp-2010-09-01/vxrzlEHuAqImqBuJnCiutvzrBmuixaAjuzwBwhvqeixkprhlHaiihEvjAdsd/elit-xml-in-memory-old.png.scaled1000.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-09-01/vxrzlEHuAqImqBuJnCiutvzrBmuixaAjuzwBwhvqeixkprhlHaiihEvjAdsd/elit-xml-in-memory-old.png.scaled500.png" width="500" height="170"/&gt;&lt;/a&gt; &lt;a href='http://posterous.com/getfile/files.posterous.com/temp-2010-09-01/papgezbCvsmqJcAifEijpufACusFrvbwIgzsrvlkHuoljcawAiDolyvyoCAz/elit-xml-in-memory-new-1.png.scaled1000.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-09-01/papgezbCvsmqJcAifEijpufACusFrvbwIgzsrvlkHuoljcawAiDolyvyoCAz/elit-xml-in-memory-new-1.png.scaled500.png" width="500" height="170"/&gt;&lt;/a&gt; &lt;div&gt;&lt;a href='http://corsis.posterous.com/xml-keyvalue-cache-optimizations'&gt;See and download the full gallery on posterous&lt;/a&gt;&lt;/div&gt;&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://corsis.posterous.com/xml-keyvalue-cache-optimizations"&gt;CORSIS&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-9183757183997098590?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=fdfxcHf3Rfc:YBaRUT2hpg4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=fdfxcHf3Rfc:YBaRUT2hpg4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=fdfxcHf3Rfc:YBaRUT2hpg4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=fdfxcHf3Rfc:YBaRUT2hpg4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=fdfxcHf3Rfc:YBaRUT2hpg4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=fdfxcHf3Rfc:YBaRUT2hpg4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=fdfxcHf3Rfc:YBaRUT2hpg4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=fdfxcHf3Rfc:YBaRUT2hpg4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=fdfxcHf3Rfc:YBaRUT2hpg4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/fdfxcHf3Rfc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/9183757183997098590/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=9183757183997098590" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/9183757183997098590?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/9183757183997098590?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/fdfxcHf3Rfc/xml-keyvalue-cache-optimizations_02.html" title="XML Key/Value Cache Optimizations" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2010/09/xml-keyvalue-cache-optimizations_02.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcARXw-fCp7ImA9Wx5RE0g.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-922232468614797994</id><published>2010-08-16T02:12:00.003+02:00</published><updated>2010-08-21T03:10:44.254+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-21T03:10:44.254+02:00</app:edited><title>ELIT Private Alpha</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;&lt;img src="http://corsis.sourceforge.net/elit/Icons/bt-128x128.png" alt="" /&gt;&lt;img src="http://corsis.sourceforge.net/elit/Icons/uhd-128x128.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Launching &lt;a href="http://corsis.sourceforge.net/elit"&gt;ELIT Client&lt;/a&gt; for private alpha testing of political and social scientists from Heidelberg and Mannheim.&lt;/p&gt;&lt;p style="font-size: 10px;"&gt;&lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://corsis.posterous.com/elit-private-alpha"&gt;CORSIS&lt;/a&gt; &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-922232468614797994?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XHa4DCygBHI:5l9WTxkoVDc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XHa4DCygBHI:5l9WTxkoVDc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XHa4DCygBHI:5l9WTxkoVDc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=XHa4DCygBHI:5l9WTxkoVDc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XHa4DCygBHI:5l9WTxkoVDc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=XHa4DCygBHI:5l9WTxkoVDc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XHa4DCygBHI:5l9WTxkoVDc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=XHa4DCygBHI:5l9WTxkoVDc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=XHa4DCygBHI:5l9WTxkoVDc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/XHa4DCygBHI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/922232468614797994/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=922232468614797994" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/922232468614797994?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/922232468614797994?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/XHa4DCygBHI/elit-private-alpha.html" title="ELIT Private Alpha" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2010/08/elit-private-alpha.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8HQ3g8fCp7ImA9WxFaE08.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-4380191744816752097</id><published>2010-07-17T02:33:00.001+02:00</published><updated>2010-07-17T02:33:52.674+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-17T02:33:52.674+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="comparison" /><category scheme="http://www.blogger.com/atom/ns#" term="OCR" /><category scheme="http://www.blogger.com/atom/ns#" term="abbyy" /><category scheme="http://www.blogger.com/atom/ns#" term="acrobat" /><category scheme="http://www.blogger.com/atom/ns#" term="adobe" /><category scheme="http://www.blogger.com/atom/ns#" term="finereader" /><category scheme="http://www.blogger.com/atom/ns#" term="screenshot" /><title>OCR Comparison - FineReader 10 vs Acrobat 9</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;A silent midnight comparison of two OCR software.&lt;/p&gt;  &lt;h2 class="highlightbox"&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-07-16/vyndrvfwBxszJrJrEAGhIcyHEEofkdyxGgqonrdzomAxlxxFlCEifxEjyuDp/CropperCapture1.png.scaled500.png" width="347" height="377"/&gt; &lt;a href='http://posterous.com/getfile/files.posterous.com/temp-2010-07-16/cmatvzBiaJdjEHtmqdFxtFrxzksnofDykifAAjxbidvofmlvjwbfcCoyyzvz/CropperCapture3.png.scaled1000.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-07-16/cmatvzBiaJdjEHtmqdFxtFrxzksnofDykifAAjxbidvofmlvjwbfcCoyyzvz/CropperCapture3.png.scaled500.png" width="500" height="212"/&gt;&lt;/a&gt; &lt;div&gt;&lt;a href='http://corsis.posterous.com/ocr-comparison-acrobat-9-vs-finereader-10'&gt;See and download the full gallery on posterous&lt;/a&gt;&lt;/div&gt;&lt;/h2&gt;  &lt;p&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-07-16/rrCazCDJFHlnuIDAbdmEodwDFebvhgzlzFzpsGHyfutHJHjBkrjxmuIgtjas/CropperCapture4.png.scaled500.png" width="336" height="85"/&gt; &lt;a href='http://posterous.com/getfile/files.posterous.com/temp-2010-07-16/bnltIEEvxBhcywpCuzeueehyjFubwtJrAovdxCheojyscyarpwGabxiyDoIf/CropperCapture5.png.scaled1000.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-07-16/bnltIEEvxBhcywpCuzeueehyjFubwtJrAovdxCheojyscyarpwGabxiyDoIf/CropperCapture5.png.scaled500.png" width="500" height="43"/&gt;&lt;/a&gt; &lt;div&gt;&lt;a href='http://corsis.posterous.com/ocr-comparison-acrobat-9-vs-finereader-10'&gt;See and download the full gallery on posterous&lt;/a&gt;&lt;/div&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-07-16/wgDrlGtzuilGclhfupBHizGyJbDhvywGlpBbjDwaueBDgscIrdFEwbBoAxvi/CropperCapture6.png.scaled500.png" width="359" height="168"/&gt; &lt;a href='http://posterous.com/getfile/files.posterous.com/temp-2010-07-16/bxxlkBjHrovtCBdusyxDDfekidxbxvCkckBEcAnlHBEjeApdsvqtzmskkjfa/CropperCapture7.png.scaled1000.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-07-16/bxxlkBjHrovtCBdusyxDDfekidxbxvCkckBEcAnlHBEjeApdsvqtzmskkjfa/CropperCapture7.png.scaled500.png" width="500" height="90"/&gt;&lt;/a&gt; &lt;div&gt;&lt;a href='http://corsis.posterous.com/ocr-comparison-acrobat-9-vs-finereader-10'&gt;See and download the full gallery on posterous&lt;/a&gt;&lt;/div&gt;&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://corsis.posterous.com/ocr-comparison-acrobat-9-vs-finereader-10"&gt;CORSIS&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-4380191744816752097?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=vdSYn1OMZR0:Dad1GG2GFcc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=vdSYn1OMZR0:Dad1GG2GFcc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=vdSYn1OMZR0:Dad1GG2GFcc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=vdSYn1OMZR0:Dad1GG2GFcc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=vdSYn1OMZR0:Dad1GG2GFcc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=vdSYn1OMZR0:Dad1GG2GFcc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=vdSYn1OMZR0:Dad1GG2GFcc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=vdSYn1OMZR0:Dad1GG2GFcc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=vdSYn1OMZR0:Dad1GG2GFcc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/vdSYn1OMZR0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/4380191744816752097/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=4380191744816752097" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/4380191744816752097?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/4380191744816752097?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/vdSYn1OMZR0/ocr-comparison-finereader-10-vs-acrobat.html" title="OCR Comparison - FineReader 10 vs Acrobat 9" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://corsis.blogspot.com/2010/07/ocr-comparison-finereader-10-vs-acrobat.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMCRHw6eCp7ImA9WxFRFk0.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-2813895591910325247</id><published>2010-04-30T06:50:00.000+02:00</published><updated>2010-04-30T07:14:25.210+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-30T07:14:25.210+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stackoverflow" /><category scheme="http://www.blogger.com/atom/ns#" term="EndNote X3" /><category scheme="http://www.blogger.com/atom/ns#" term="citation analysis" /><category scheme="http://www.blogger.com/atom/ns#" term="PubMed" /><category scheme="http://www.blogger.com/atom/ns#" term="Mathematica" /><title>Hash Tables in Mathematica</title><content type="html">This week, after downloading citing and related paper numbers of around 50.000 papers that were presented as results to various simple searches in PubMed, we wanted to have a way to find out most cited authors.&lt;br /&gt;&lt;br /&gt;Both extremely new to Mathematica, we were yet to see anything that looked or behaved like hash tables so our first approach looked like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;recordsOfAuthor[author_]:=&lt;br /&gt;  Select[&lt;br /&gt;    records,&lt;br /&gt;    Composition[MemberQ[#, author]&amp;amp;, authorsOf]&lt;br /&gt;  ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;where records were a list of &lt;code&gt;XMLElement&lt;/code&gt;s containing &lt;a href="http://www.endnote.com/enX3info.asp"&gt;EndNote X3&lt;/a&gt; records (these roughly correspond to PubMed search results).&lt;br /&gt;&lt;br /&gt;Now I am not the guy to immediately understand the O-complexity of any given code, yet the first thing I had told my friend after we had finished downloading the citation numbers and right before we started coding the rest of our analysis tools was that we definitely needed to either find out how to use hash tables in Mathematica or do the whole thing in another language, otherwise we might have some headache.&lt;br /&gt;&lt;br /&gt;Our largest EndNote X3 search results file was a single 95MB XML document with 17.278 records (papers/reviews/etc.) and 52.666 unique authors, combined with another 8MB XML document containing the citation and related paper counts we had downloaded from PubMed for each record.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_etWDaQmHOe4/S9pEGSRof4I/AAAAAAAABN8/uWJfZKTPY4o/s1600/PubMedAllFieldsDRInfectDisease.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 247px;" src="http://2.bp.blogspot.com/_etWDaQmHOe4/S9pEGSRof4I/AAAAAAAABN8/uWJfZKTPY4o/s400/PubMedAllFieldsDRInfectDisease.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5465755972543217538" /&gt;&lt;/a&gt;x-axis: record number, y-axis: number of citations&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In another part of the code we have a map over all unique authors that uses the above function to sum the citation numbers of all records for every single author.&lt;br /&gt;&lt;br /&gt;Let's consider the worst case complexity now:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;52.666 unique authors&lt;/li&gt;&lt;li&gt;17.278 records&lt;/li&gt;&lt;li&gt;79.159 authors&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The latter two makes each call of &lt;code&gt;recordsOfAuthor&lt;/code&gt; cost 17.278 x 79.159 = 1.368.500.792 (1 billion, 368 million, 500 thousand and 792) operations! So with our 52.666 unique authors, we are talking about a whopping: 52.666 x 17.278 x 79.159 = 72.031.772.832.532 operations to find out all records of each author!!!!!!!!! 72 trillion, 31 billion, 772 million, 832 thousand and 532 operations!!!!!!!!!!!&lt;br /&gt;&lt;br /&gt;Our &lt;code&gt;recordsOfAuthor&lt;/code&gt; was O(n^3). No surprise that it made me wait for the results a whole night ... whose sweet slumber brought upon me a vision of myself being scolded and harshly criticized by my friend for being the slowest and most unsuccessful coder she has ever seen, then googling for a way to use hash tables in Mathematica and seeing myself go to stackoverflow and &lt;a href="http://stackoverflow.com/questions/1392007/is-there-hashtable-structure-in-wolfram-mathematic"&gt;reading an answer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now let's have a look at this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Clear[dic, dicAdd];&lt;br /&gt;dic[accNum_] := Null (* dictionary *)&lt;br /&gt;dicAdd[record_] := dic[accNumOf @ record] = record;&lt;br /&gt;&lt;br /&gt;dicAdd /@ records; (* 17.278 operations *)&lt;br /&gt;&lt;br /&gt;Clear[ar, arAdd, recordsOfAuthor];&lt;br /&gt;ar[author_] := {} (* ar: author records *)&lt;br /&gt;arAdd[record_] := (ar[#] = Append[ar[#], accNumOf @ record)&amp; /@ authorsOf @ record;&lt;br /&gt;&lt;br /&gt;arAdd /@ records; (* 79.159 operations *)&lt;br /&gt;&lt;br /&gt;recordsOfAuthor[author_] := author // ar // dic /@ # &amp; (* O(1) *)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now we first do 17.278 + 79.159 = 96.447 operations to create an O(1) version of &lt;code&gt;recordsOfAuthor&lt;/code&gt; by using &lt;a href="http://reference.wolfram.com/mathematica/ref/DownValues.html"&gt;function definitions&lt;/a&gt; as a hash table.&lt;br /&gt;&lt;br /&gt;With this version of &lt;code&gt;recordsOfAuthor&lt;/code&gt; the same map over all unique authors has become O(1) * n = O(n), so we have reduced the number of operations &lt;ul&gt;&lt;li&gt;from 72 trillion, 31 billion, 772 million, 832 thousand and 532&lt;/li&gt;&lt;li&gt;to just 52 thousand, 666!!!!!!&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;With all the being hated, blamed and made felt worthless by my best friend and one week of delay in development time, this has been an excellent lesson: about experience, understanding, patience, indifference, simplicity and trust &amp;ndash; I will never forget her words: "You always say, you'll finish, you'll finish but you never do!!"!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-2813895591910325247?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=ToheZfD77OY:V5gWto-zXgA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=ToheZfD77OY:V5gWto-zXgA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=ToheZfD77OY:V5gWto-zXgA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=ToheZfD77OY:V5gWto-zXgA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=ToheZfD77OY:V5gWto-zXgA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=ToheZfD77OY:V5gWto-zXgA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=ToheZfD77OY:V5gWto-zXgA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=ToheZfD77OY:V5gWto-zXgA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=ToheZfD77OY:V5gWto-zXgA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/ToheZfD77OY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/2813895591910325247/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=2813895591910325247" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/2813895591910325247?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/2813895591910325247?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/ToheZfD77OY/hash-tables-in-mathematica.html" title="Hash Tables in Mathematica" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_etWDaQmHOe4/S9pEGSRof4I/AAAAAAAABN8/uWJfZKTPY4o/s72-c/PubMedAllFieldsDRInfectDisease.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2010/04/hash-tables-in-mathematica.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUABRX84fyp7ImA9WxFSGUg.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-8440894498322454028</id><published>2010-04-22T19:06:00.011+02:00</published><updated>2010-04-22T19:35:54.137+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-22T19:35:54.137+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><category scheme="http://www.blogger.com/atom/ns#" term="advanced topics in information retrieval" /><category scheme="http://www.blogger.com/atom/ns#" term="PageRank" /><category scheme="http://www.blogger.com/atom/ns#" term="Mathematica" /><title>PageRanking in Mathematica</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_etWDaQmHOe4/S9CH0HWxRzI/AAAAAAAABNU/nO4Ly9BbaEA/s1600/AIR-bpi-1.png"&gt;&lt;img style="float:left; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 361px;" src="http://4.bp.blogspot.com/_etWDaQmHOe4/S9CH0HWxRzI/AAAAAAAABNU/nO4Ly9BbaEA/s400/AIR-bpi-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5463015677397911346" /&gt;&lt;/a&gt;In the "&lt;a href="http://www.cl.uni-heidelberg.de/courses/ss10/adv_inforet/"&gt;Advanced Topics in Information Retrieval&lt;/a&gt;" course I'm taking this term, we had a light introduction to PageRank algorithm and I wanted to redo the relevant slides and solve some exercises in Mathematica - which I happened to learn while providing programming support to my best friend in her endeavor of &lt;a href="http://ipp.uni-hd.de/index.php?id=57"&gt;mathematical modeling and simulation of drug resistance in infectious diseases&lt;/a&gt;!.&lt;br /&gt;&lt;br /&gt;Here it is as &lt;a href="http://corsis.sf.net/docs/AIR.pdf"&gt;PDF &lt;/a&gt;and &lt;a href="http://corsis.sf.net/docs/AIR.nb"&gt;Mathematica Notebook&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;It's truly amazing what you can achieve with Mathematica with tiny amounts of code. I find the selection of functions provided in version 7 and their implementations to be stunning examples of &lt;span style="font-style: italic;"&gt;programming done right&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-8440894498322454028?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=x91ORc3OIT4:ARWmMwQc9c4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=x91ORc3OIT4:ARWmMwQc9c4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=x91ORc3OIT4:ARWmMwQc9c4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=x91ORc3OIT4:ARWmMwQc9c4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=x91ORc3OIT4:ARWmMwQc9c4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=x91ORc3OIT4:ARWmMwQc9c4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=x91ORc3OIT4:ARWmMwQc9c4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=x91ORc3OIT4:ARWmMwQc9c4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=x91ORc3OIT4:ARWmMwQc9c4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/x91ORc3OIT4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/8440894498322454028/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=8440894498322454028" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8440894498322454028?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8440894498322454028?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/x91ORc3OIT4/pageranking-in-mathematica.html" title="PageRanking in Mathematica" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_etWDaQmHOe4/S9CH0HWxRzI/AAAAAAAABNU/nO4Ly9BbaEA/s72-c/AIR-bpi-1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2010/04/pageranking-in-mathematica.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EAQHo8eCp7ImA9WxBSGUw.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-8191882470065327972</id><published>2009-12-27T11:38:00.003+01:00</published><updated>2009-12-27T12:00:41.470+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-27T12:00:41.470+01:00</app:edited><title>2009 - 2010</title><content type="html">No news ... I asked someone to not tell me any so I will not post any personal news either. I'll be in Turkey for a week, meeting new friends and spending 2009's last and 2010's first days in their company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-8191882470065327972?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=SVZRc-HeTRc:aMlLhUxrsdU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=SVZRc-HeTRc:aMlLhUxrsdU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=SVZRc-HeTRc:aMlLhUxrsdU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=SVZRc-HeTRc:aMlLhUxrsdU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=SVZRc-HeTRc:aMlLhUxrsdU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=SVZRc-HeTRc:aMlLhUxrsdU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=SVZRc-HeTRc:aMlLhUxrsdU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=SVZRc-HeTRc:aMlLhUxrsdU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=SVZRc-HeTRc:aMlLhUxrsdU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/SVZRc-HeTRc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/8191882470065327972/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=8191882470065327972" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8191882470065327972?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8191882470065327972?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/SVZRc-HeTRc/2009-2010.html" title="2009 - 2010" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2009/12/2009-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ANRnw_eyp7ImA9WxNVF08.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-5739690102825270015</id><published>2009-10-26T10:58:00.005+01:00</published><updated>2009-10-28T12:36:37.243+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-28T12:36:37.243+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="institut für politische wissenschaft" /><category scheme="http://www.blogger.com/atom/ns#" term="ELIT" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="wiki" /><category scheme="http://www.blogger.com/atom/ns#" term="research" /><category scheme="http://www.blogger.com/atom/ns#" term="university of heidelberg" /><category scheme="http://www.blogger.com/atom/ns#" term="research project" /><category scheme="http://www.blogger.com/atom/ns#" term="IPW" /><category scheme="http://www.blogger.com/atom/ns#" term="CORSIS" /><category scheme="http://www.blogger.com/atom/ns#" term="cetin sert" /><title>CORSIS .2 First Applications</title><content type="html">As part of a research project I am involved in, the development version of CORSIS is now being used and actively extended with latest technologies. For more information, visit our &lt;a href="http://corsis.sf.net"&gt;new wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-5739690102825270015?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=scjK-W--7Q4:fBadcqkLJkw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=scjK-W--7Q4:fBadcqkLJkw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=scjK-W--7Q4:fBadcqkLJkw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=scjK-W--7Q4:fBadcqkLJkw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=scjK-W--7Q4:fBadcqkLJkw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=scjK-W--7Q4:fBadcqkLJkw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=scjK-W--7Q4:fBadcqkLJkw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=scjK-W--7Q4:fBadcqkLJkw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=scjK-W--7Q4:fBadcqkLJkw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/scjK-W--7Q4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/5739690102825270015/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=5739690102825270015" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/5739690102825270015?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/5739690102825270015?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/scjK-W--7Q4/corsis-2-first-applications.html" title="CORSIS .2 First Applications" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://corsis.blogspot.com/2009/10/corsis-2-first-applications.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYNRHc4eyp7ImA9WxVXGEs.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-1636120273815609346</id><published>2009-02-11T12:49:00.020+01:00</published><updated>2009-02-17T11:56:35.933+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-17T11:56:35.933+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="multi-threading" /><category scheme="http://www.blogger.com/atom/ns#" term="haskell" /><category scheme="http://www.blogger.com/atom/ns#" term="erlang" /><category scheme="http://www.blogger.com/atom/ns#" term="edsl" /><category scheme="http://www.blogger.com/atom/ns#" term="inter-process communication" /><category scheme="http://www.blogger.com/atom/ns#" term="multi-core" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrency" /><category scheme="http://www.blogger.com/atom/ns#" term="distributed computing" /><category scheme="http://www.blogger.com/atom/ns#" term="parallel computation" /><category scheme="http://www.blogger.com/atom/ns#" term="fzi karlsruhe" /><category scheme="http://www.blogger.com/atom/ns#" term="process networks" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrent haskell" /><category scheme="http://www.blogger.com/atom/ns#" term="forkIO" /><title>erlang ! hello</title><content type="html">&lt;p&gt;On Tuesday while reading &lt;a href="http://www.pragprog.com/titles/jaerlang/programming-erlang"&gt;Programming Erlang&lt;/a&gt; on suggestion of &lt;a href="http://www.fzi.de/lse/mitarbeiter.php?id=655"&gt;Andreas Cardeneo&lt;/a&gt; from the &lt;a href="http://www.fzi.de/eng/index.php"&gt;Research Center for Information Technology&lt;/a&gt; of the &lt;a href="http://www.uni-karlsruhe.de/index_en.php"&gt;University of Karlsruhe&lt;/a&gt;, I started to experiment in Haskell with &lt;a href="http://hackage.haskell.org/packages/archive/base/4.0.0.0/doc/html/Control-Concurrent-Chan.html#t:Chan"&gt;typed channels&lt;/a&gt; and &lt;a href="http://hackage.haskell.org/packages/archive/base/4.0.0.0/doc/html/Control-Concurrent.html#v:forkIO"&gt;lightweight threads&lt;/a&gt; to imitate Erlang style processes and networks thereof.&lt;/p&gt;&lt;p&gt;Here is &lt;a href="http://sert.homedns.org/hs/message.hs"&gt;the very early and raw code&lt;/a&gt; from a few hours of exploration.&lt;/p&gt;&lt;p&gt;And here is a simple interactive session in which a server is created that reads strings into integers. These integers then get _distributed one at a time_/_dealt_ to a first layer of 3 parallel nodes and they then travel to a second layer:&lt;/p&gt;&lt;pre name="code"&gt;*Erlang&gt; (server,out) ← serve (read :: String → Integer)&lt;br /&gt;*Erlang&gt; l1ts ← create 3 :: IO ([Chan Integer])&lt;br /&gt;*Erlang&gt; did  ← deal move ([(\y → y - x) | x ← [1..3]]) out l1ts&lt;br /&gt;*Erlang&gt; l2ts ← create 3 :: IO ([Chan Integer])&lt;br /&gt;*Erlang&gt; tids ← sequence $ zipWith (link move (2 *)) l1ts l2ts&lt;br /&gt;*Erlang&gt; server ·· [ show x | x ← [2..4] ]&lt;br /&gt;*Erlang&gt; all_ flush l2ts&lt;br /&gt;-- [[2],[2],[2]]&lt;br /&gt;{-&lt;br /&gt;   FLOW VIEW&lt;br /&gt;&lt;br /&gt;            l1    l2                     &lt;br /&gt;            ---   ---&lt;br /&gt;             1  →  2&lt;br /&gt;in    out   ---   ---&lt;br /&gt;---   --- ↗    &lt;br /&gt;"2"    2    ---   ---&lt;br /&gt;"3" →  3  →  1  →  2&lt;br /&gt;"4"    4    ---   ---&lt;br /&gt;---   --- ↘    &lt;br /&gt;            ---   ---&lt;br /&gt;             1  →  2 &lt;br /&gt;            ---   ---&lt;br /&gt;&lt;br /&gt;-- before "all_ flush l2ts" actually only l2 is not empty&lt;br /&gt;&lt;br /&gt;   ACTUAL STATE&lt;br /&gt;&lt;br /&gt;            l1    l2                     &lt;br /&gt;            ---   ---&lt;br /&gt;                →  2&lt;br /&gt;in    out   ---   ---&lt;br /&gt;---   --- ↗    &lt;br /&gt;            ---   ---&lt;br /&gt;    →     →     →  2&lt;br /&gt;            ---   ---&lt;br /&gt;---   --- ↘    &lt;br /&gt;            ---   ---&lt;br /&gt;                →  2 &lt;br /&gt;            ---   ---&lt;br /&gt;-}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;one could use such a system to distribute, say, processing of images to multiple parallel threads that utilize different cores or processors on a single machine. Using copy links (&lt;span style="font-family:monospace"&gt;link copy ...&lt;/span&gt;) instead of move links (&lt;span style="font-family:monospace"&gt;link move ...&lt;/span&gt;) would leave copies of the intermediate results on channels and we could see into the individual stages of a complex image manipulation. Tagging messages that travel between such processes would make it possible to divide a problem into pieces and process the pieces in parallel and put the results back together. One could make the inter-process communication lazy and declare a process network structure that produces results only when there is demand from the terminal nodes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Check out this &lt;a href="http://sert.homedns.org/hs/message.hs"&gt;link for more examples of different process networks&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;As I write these lines, I don't know if there is any prior Haskell work about such things but I could imagine this or a more serious endeavour turning into a nice little framework for distributed processing. By using more advanced primitives for communication than &lt;span style="font-family:monospace"&gt;forkIO&lt;/span&gt; and &lt;span style="font-family:monospace"&gt;Chan a&lt;/span&gt;, one might span a process network across machine boundaries.&lt;/p&gt;&lt;p&gt;In this blog post, 'process' means "a lightweight thread that reads from a channel and applies a function on what it has read and writes the result to another channel" and NOT "OS process".&lt;/p&gt;&lt;p&gt;This protoprototype of process networks has not been performance-tested in any way. This is very much an experiment and further investigation of the concept may or may not turn out to be useful.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-1636120273815609346?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=7QQvc2Ppz30:l1QgLekY5Lo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=7QQvc2Ppz30:l1QgLekY5Lo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=7QQvc2Ppz30:l1QgLekY5Lo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=7QQvc2Ppz30:l1QgLekY5Lo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=7QQvc2Ppz30:l1QgLekY5Lo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=7QQvc2Ppz30:l1QgLekY5Lo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=7QQvc2Ppz30:l1QgLekY5Lo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=7QQvc2Ppz30:l1QgLekY5Lo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=7QQvc2Ppz30:l1QgLekY5Lo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/7QQvc2Ppz30" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/1636120273815609346/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=1636120273815609346" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/1636120273815609346?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/1636120273815609346?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/7QQvc2Ppz30/erlang-hello.html" title="erlang ! hello" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2009/02/erlang-hello.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YNQX4zeCp7ImA9WxVXE0Q.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-8293484269970102497</id><published>2009-02-10T07:11:00.003+01:00</published><updated>2009-02-11T23:26:30.080+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-11T23:26:30.080+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="server" /><category scheme="http://www.blogger.com/atom/ns#" term="example" /><category scheme="http://www.blogger.com/atom/ns#" term="haskell" /><category scheme="http://www.blogger.com/atom/ns#" term="after" /><category scheme="http://www.blogger.com/atom/ns#" term="erlang" /><category scheme="http://www.blogger.com/atom/ns#" term="clock" /><category scheme="http://www.blogger.com/atom/ns#" term="erlang process" /><category scheme="http://www.blogger.com/atom/ns#" term="approximation" /><title>erlang ! hello</title><content type="html">&lt;p&gt;Here is the clock example from &lt;a href="http://www.pragprog.com/titls/jaerlang/programming-erlang"&gt;Programming Erlang&lt;/a&gt; (page 155) in Erlang [&lt;a href="http://sert.homedns.org/hs/clock.erl"&gt;clock.erl&lt;/a&gt;] and its very rudimentary approximations!? in Haskell [&lt;a href="http://sert.homedns.org/hs/clock2.hs"&gt;clock2.hs&lt;/a&gt;, &lt;a href="http://sert.homedns.org/hs/general2.hs"&gt;general2.hs&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/8551824799489151728-8293484269970102497?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=tOn1yblFzR8:w0pU4znnNus:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=tOn1yblFzR8:w0pU4znnNus:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=tOn1yblFzR8:w0pU4znnNus:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=tOn1yblFzR8:w0pU4znnNus:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=tOn1yblFzR8:w0pU4znnNus:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=tOn1yblFzR8:w0pU4znnNus:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=tOn1yblFzR8:w0pU4znnNus:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=tOn1yblFzR8:w0pU4znnNus:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=tOn1yblFzR8:w0pU4znnNus:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/tOn1yblFzR8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/8293484269970102497/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=8293484269970102497" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8293484269970102497?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8293484269970102497?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/tOn1yblFzR8/erlang-hello_10.html" title="erlang ! hello" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2009/02/erlang-hello_10.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEANR3g5eyp7ImA9WxVXEU8.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-3995870398379139166</id><published>2009-02-06T21:29:00.003+01:00</published><updated>2009-02-08T21:59:56.623+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-08T21:59:56.623+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="solaris 10" /><category scheme="http://www.blogger.com/atom/ns#" term="download" /><category scheme="http://www.blogger.com/atom/ns#" term="mono/solaris" /><category scheme="http://www.blogger.com/atom/ns#" term="mono 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris 10/x86" /><category scheme="http://www.blogger.com/atom/ns#" term="mono" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris 10-x86" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris" /><title>Mono 2.0 binary package for Solaris 10/x86</title><content type="html">Just received some fresh &lt;a href="http://corsis.sourceforge.net/redist/mono-2.0,REV=2009.01.21-SunOS5.8-i386-CSW.pkg.gz"&gt;Mono 2.0 binaries for Solaris 10/x86&lt;/a&gt;. Many thanks pablo! Mono 2.2 to follow after the weekend *^o^*!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-3995870398379139166?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=bTma8WHUCdU:9bctvI6EECk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=bTma8WHUCdU:9bctvI6EECk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=bTma8WHUCdU:9bctvI6EECk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=bTma8WHUCdU:9bctvI6EECk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=bTma8WHUCdU:9bctvI6EECk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=bTma8WHUCdU:9bctvI6EECk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=bTma8WHUCdU:9bctvI6EECk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=bTma8WHUCdU:9bctvI6EECk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=bTma8WHUCdU:9bctvI6EECk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/bTma8WHUCdU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/3995870398379139166/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=3995870398379139166" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/3995870398379139166?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/3995870398379139166?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/bTma8WHUCdU/mono-20-binary-package-for-solaris.html" title="Mono 2.0 binary package for Solaris 10/x86" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://corsis.blogspot.com/2009/02/mono-20-binary-package-for-solaris.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEHQnc_cCp7ImA9WxdVGUw.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-5646015692833741258</id><published>2008-07-24T16:54:00.008+02:00</published><updated>2008-07-24T17:50:33.948+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-24T17:50:33.948+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unsafePerformIO" /><category scheme="http://www.blogger.com/atom/ns#" term="lingenio" /><category scheme="http://www.blogger.com/atom/ns#" term="machine translation" /><category scheme="http://www.blogger.com/atom/ns#" term="directed acyclic graphs" /><category scheme="http://www.blogger.com/atom/ns#" term="haskell" /><category scheme="http://www.blogger.com/atom/ns#" term="lexical functional grammar" /><category scheme="http://www.blogger.com/atom/ns#" term="fgl" /><category scheme="http://www.blogger.com/atom/ns#" term="f-structure" /><category scheme="http://www.blogger.com/atom/ns#" term="functional graph library" /><category scheme="http://www.blogger.com/atom/ns#" term="debugging" /><category scheme="http://www.blogger.com/atom/ns#" term="LFG" /><category scheme="http://www.blogger.com/atom/ns#" term="f-structures" /><title>Debugging Haskell: LFG, AVM → DAG</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_etWDaQmHOe4/SIic5KJaYWI/AAAAAAAAAdo/L2MMyI4pEss/s1600-h/snapshot10.png"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_etWDaQmHOe4/SIic5KJaYWI/AAAAAAAAAdo/L2MMyI4pEss/s400/snapshot10.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5226599873353769314" /&gt;&lt;/a&gt;&lt;p&gt;A few days ago I had to do some debugging in Haskell while writing a function to draw directed acyclic graphs of attribute value matrices from LFG F-structures. UnsafePerformIO was great help there. I did most of this during a machine translation lecture given by &lt;a href="http://www.kurt-eberle.de/"&gt;Kurt Eberle&lt;/a&gt; of &lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px;" src="http://www.lingenio.de/favicon.ico" /&gt;&lt;a href="http://www.lingenio.de"&gt;lingenio&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Here are the debugging functions:&lt;/p&gt;&lt;pre name="code"&gt;deb1 :: Show a ⇒ a → a&lt;br /&gt;deb1 a = unsafePerformIO (print a &gt;&gt; return a)&lt;br /&gt;&lt;br /&gt;deb2 :: Show a ⇒ String → a → a&lt;br /&gt;deb2 msg a = unsafePerformIO (putStrLn (((msg ++) . show) a) &gt;&gt; return a)&lt;br /&gt;&lt;br /&gt;deb3 :: (Show a, Show b) ⇒ (a → Bool) → b → a → a&lt;br /&gt;deb3 p b a = unsafePerformIO $ esc p b a&lt;br /&gt;  where&lt;br /&gt;    esc p b a | p a       = putStr ((show b) ++ (show a)) &gt;&gt; return a&lt;br /&gt;              | otherwise = return a&lt;br /&gt;&lt;br /&gt;cond = (== "^OBL")&lt;br /&gt;dobj = deb3 cond&lt;/pre&gt;&lt;p&gt;And here is how I used them in context:&lt;/p&gt;&lt;pre name="code"&gt;core :: Integer → String → [(Integer,String)] → AVM → (String,[(Integer,String)],Integer)&lt;br /&gt;core i s ls (M att (A val)) = (s ++ x i ++ " [label=\"" ++ dobj s att ++ "\"];\n",(i,val):ls,i)&lt;br /&gt;core i s ls (M att (C mms)) = let (xs,xls,xi) = add i i s ls att mms in &lt;br /&gt;  (s ++ x i ++ " [label=\"" ++ att ++ "\"];\n" ++ xs,xls,xi)&lt;br /&gt;    where&lt;br /&gt;      add f i s ls att []     = ([],[],i)&lt;br /&gt;      add f i s ls att (m:ms) = (cs ++ rs,cls ++ rls,ri)&lt;br /&gt;        where&lt;br /&gt;          (cs,cls,ci) = core    ni sm ls m&lt;br /&gt;          (rs,rls,ri) = add  f  ci [] ls att ms&lt;br /&gt;          sm = x f ++ " -&gt; "&lt;br /&gt;          ni = i + 1&lt;/pre&gt;&lt;p&gt;I know core pretty much sucks in many ways o_O!! Still trying to figure out how I could keep such things maintainable in Haskell... (I will have a look at the FGL sometime soon.)&lt;/p&gt;&lt;p&gt;It was very easy to use type classes and unicode infix functions to achieve a really pretty syntax to represent F-structures though ^o^:&lt;/p&gt;&lt;pre&gt;s1 :: AVM&lt;br /&gt;s1 =  void ≈&lt;br /&gt;     [pred ≈ "antworten&lt;(^SUBJ)(^OBL)&gt;",&lt;br /&gt;&lt;br /&gt;      subj ≈ [pred ≈ pro,&lt;br /&gt;              num  ≈ sg, &lt;br /&gt;              cas  ≈ nom ],&lt;br /&gt;&lt;br /&gt;      obl  ≈ [pred ≈ "auf&lt;^OBJ&gt;",&lt;br /&gt;&lt;br /&gt;              obj  ≈ [pred ≈ "Brief",&lt;br /&gt;                      num  ≈ sg,&lt;br /&gt;                      cas  ≈ acc]    ],&lt;br /&gt;&lt;br /&gt;      tense ≈ present                   ]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Machine translation is the last lecture before sommer holidays *^o^*! I will have more time to work on Corsis again.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-5646015692833741258?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=AY5ZXoJt7uM:ueNs89brEIM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=AY5ZXoJt7uM:ueNs89brEIM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=AY5ZXoJt7uM:ueNs89brEIM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=AY5ZXoJt7uM:ueNs89brEIM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=AY5ZXoJt7uM:ueNs89brEIM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=AY5ZXoJt7uM:ueNs89brEIM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=AY5ZXoJt7uM:ueNs89brEIM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=AY5ZXoJt7uM:ueNs89brEIM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=AY5ZXoJt7uM:ueNs89brEIM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/AY5ZXoJt7uM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/5646015692833741258/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=5646015692833741258" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/5646015692833741258?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/5646015692833741258?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/AY5ZXoJt7uM/debugging-haskell-lfg-avm-dag.html" title="Debugging Haskell: LFG, AVM → DAG" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp0.blogger.com/_etWDaQmHOe4/SIic5KJaYWI/AAAAAAAAAdo/L2MMyI4pEss/s72-c/snapshot10.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://corsis.blogspot.com/2008/07/debugging-haskell-lfg-avm-dag.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MCR38_fyp7ImA9WxdVFE8.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-8032311539448827991</id><published>2008-07-17T09:17:00.007+02:00</published><updated>2008-07-19T00:51:06.147+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-19T00:51:06.147+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clr implementations" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="hash codes" /><category scheme="http://www.blogger.com/atom/ns#" term="distribution" /><category scheme="http://www.blogger.com/atom/ns#" term="strings" /><category scheme="http://www.blogger.com/atom/ns#" term="mono performance" /><category scheme="http://www.blogger.com/atom/ns#" term="mono" /><category scheme="http://www.blogger.com/atom/ns#" term="hash code collision" /><category scheme="http://www.blogger.com/atom/ns#" term="hashcode" /><title>mono string hash code collisions</title><content type="html">&lt;p&gt;After reading the following &lt;a href="http://www.drmaciver.com/2008/07/javalangstringhashcode/"&gt;blog post&lt;/a&gt; by &lt;a href="http://www.drmaciver.com/about/"&gt;David R. MacIver&lt;/a&gt; about hash code collisions in java strings:&lt;/p&gt;&lt;blockquote&gt;For reasons you either know about by now or don’t care about, I was curious as to how well String’s hashCode was distributed (I suspected the answer was “not very”). I ran a few quick experiments to verify this.&lt;br /&gt;&lt;br /&gt;For your amusement, here is a list of all hash collisions between alphanumeric strings of size 2: &lt;a href="http://www.drmaciver.com/collisions.txt"&gt;http://www.drmaciver.com/collisions.txt&lt;/a&gt; and here is a list of all which don’t collide with any others &lt;a href="http://www.drmaciver.com/noncolliding.txt"&gt;http://www.drmaciver.com/noncolliding.txt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some statistics: There are 3844 alphanumeric strings of size 2. Of these 3570 collide with at least one other string. That is, 274 of these strings (or about 7% of them) *don’t* collide with something else.&lt;br /&gt;&lt;br /&gt;Oh well. It’s a good thing no one would be stupid enough to rely on hashCode to distinguish the contents of two objects.&lt;/blockquote&gt;&lt;p&gt;I tested things with .NET 3.5 and MONO 1.9.1 on a 32-bit Windows Vista:&lt;br /&gt;&lt;br /&gt;running on .NET 3.5:&lt;br /&gt;3844 two-char strings&lt;br /&gt;14776336 comparisons&lt;br /&gt;0 collisions with one or more items&lt;br /&gt;0 total collisions&lt;br /&gt;&lt;br /&gt;running on mono 1.9.1:&lt;br /&gt;3844 two-char strings&lt;br /&gt;14776336 comparisons&lt;br /&gt;**3570** collisions with one or more items&lt;br /&gt;5250 total collisions&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sert.homelinux.org/projects/mono-collisions.txt"&gt;2-char-long-string-hashcode-collisions-mono-1.9.1&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;We then both went on to testing hash code collisions in 3-char-long strings. David in java:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;For what it’s worth, even fewer strings have unique hash codes for 3 characters. 3948 don’t collide, or about 1.6% of them.&lt;br /&gt;&lt;br /&gt;Also, this of course doesn’t mean that probability of a hash collision is really high. In reality it’s acceptable low. It’s just a demonstration that it’s not hard to find colliding pairs.&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;and I in mono 1.9.1: &lt;a href="http://sert.homelinux.org/projects/mono-collisions3.txt"&gt;3-char-long-string-hashcode-collisions-mono-1.9.1&lt;/a&gt;. 3948 don't collide and the colliding pairs seem to be the same ones again.&lt;/p&gt;&lt;p&gt;Microsoft's implementation seems to be doing a much better work here. I will inform mono devs soon about the situation ^_^&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-8032311539448827991?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=hhGG_AGi38M:mGd5iD-SE5Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=hhGG_AGi38M:mGd5iD-SE5Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=hhGG_AGi38M:mGd5iD-SE5Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=hhGG_AGi38M:mGd5iD-SE5Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=hhGG_AGi38M:mGd5iD-SE5Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=hhGG_AGi38M:mGd5iD-SE5Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=hhGG_AGi38M:mGd5iD-SE5Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=hhGG_AGi38M:mGd5iD-SE5Y:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=hhGG_AGi38M:mGd5iD-SE5Y:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/hhGG_AGi38M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/8032311539448827991/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=8032311539448827991" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8032311539448827991?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8032311539448827991?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/hhGG_AGi38M/mono-string-hash-code-collisions.html" title="mono string hash code collisions" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2008/07/mono-string-hash-code-collisions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMMQn86fCp7ImA9WxZUGU8.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-188060885516765630</id><published>2008-04-01T17:16:00.005+02:00</published><updated>2008-04-11T17:24:43.114+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-11T17:24:43.114+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mono 1.9" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris 10" /><category scheme="http://www.blogger.com/atom/ns#" term="download" /><category scheme="http://www.blogger.com/atom/ns#" term="mono/solaris" /><category scheme="http://www.blogger.com/atom/ns#" term="mono 1.9_5" /><category scheme="http://www.blogger.com/atom/ns#" term="mono 1.9.5" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris 10/x86" /><category scheme="http://www.blogger.com/atom/ns#" term="mono" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris 10-x86" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris" /><title>Mono 1.9 binary package for Solaris 10/x86</title><content type="html">&lt;a href="http://www.rientongroup.com/"&gt;Jonel Rienton&lt;/a&gt; has provided a &lt;a href="http://corsis.sourceforge.net/redist/mono-1.9.0.0-SunOS5.11-i386-CSW.pkg.gz"&gt;Mono 1.9.0 binary package for Solaris 10/x86&lt;/a&gt;! I am thankful to him for his kindness^_^!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-188060885516765630?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=9xkFykkgp2s:jUNVHndCYO4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=9xkFykkgp2s:jUNVHndCYO4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=9xkFykkgp2s:jUNVHndCYO4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=9xkFykkgp2s:jUNVHndCYO4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=9xkFykkgp2s:jUNVHndCYO4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=9xkFykkgp2s:jUNVHndCYO4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=9xkFykkgp2s:jUNVHndCYO4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=9xkFykkgp2s:jUNVHndCYO4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=9xkFykkgp2s:jUNVHndCYO4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/9xkFykkgp2s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/188060885516765630/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=188060885516765630" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/188060885516765630?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/188060885516765630?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/9xkFykkgp2s/mono-190-binary-package-for-solaris.html" title="Mono 1.9 binary package for Solaris 10/x86" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2008/04/mono-190-binary-package-for-solaris.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQFQH88cSp7ImA9WxZWGEQ.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-7398787564193538167</id><published>2008-02-21T06:43:00.018+01:00</published><updated>2008-03-19T03:38:31.179+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-19T03:38:31.179+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="狐" /><category scheme="http://www.blogger.com/atom/ns#" term="new project" /><category scheme="http://www.blogger.com/atom/ns#" term="haskell" /><category scheme="http://www.blogger.com/atom/ns#" term="theorem prover" /><category scheme="http://www.blogger.com/atom/ns#" term="propositional logic" /><category scheme="http://www.blogger.com/atom/ns#" term="propositional tableaux" /><category scheme="http://www.blogger.com/atom/ns#" term="automated theorem proving" /><category scheme="http://www.blogger.com/atom/ns#" term="automated reasoning" /><category scheme="http://www.blogger.com/atom/ns#" term="okitsune" /><category scheme="http://www.blogger.com/atom/ns#" term="analytic tableaux" /><category scheme="http://www.blogger.com/atom/ns#" term="logic" /><title>okitsune 狐</title><content type="html">&lt;p&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px; float:left; margin:5px 10px 10px 0;" src="http://www.haskell.org/haskellwiki_logo_small.png" border="0" alt="Haskell" /&gt;I am working on a new project called: okitsune 狐 - it is going to be a simple theorem prover of sorts for logic students. Okitsune is being written in Haskell and open for contributions: &lt;a href="http://okitsune.sourceforge.net/"&gt;okitsune.sourceforge.net&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://okitsune.svn.sourceforge.net/viewvc/okitsune/Test.hs?revision=26&amp;view=markup"&gt;code sample: analytic tableaux for propositional logic&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/8551824799489151728-7398787564193538167?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=HpcpbTnR6Jw:u_7sS8yFq1s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=HpcpbTnR6Jw:u_7sS8yFq1s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=HpcpbTnR6Jw:u_7sS8yFq1s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=HpcpbTnR6Jw:u_7sS8yFq1s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=HpcpbTnR6Jw:u_7sS8yFq1s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=HpcpbTnR6Jw:u_7sS8yFq1s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=HpcpbTnR6Jw:u_7sS8yFq1s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=HpcpbTnR6Jw:u_7sS8yFq1s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=HpcpbTnR6Jw:u_7sS8yFq1s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/HpcpbTnR6Jw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/7398787564193538167/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=7398787564193538167" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/7398787564193538167?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/7398787564193538167?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/HpcpbTnR6Jw/okitsune.html" title="okitsune 狐" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2008/02/okitsune.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUMRXYzeSp7ImA9WxdVGUw.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-6473671065614127667</id><published>2008-01-05T03:45:00.001+01:00</published><updated>2008-07-24T17:11:24.881+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-24T17:11:24.881+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="monads" /><category scheme="http://www.blogger.com/atom/ns#" term="expert f#" /><category scheme="http://www.blogger.com/atom/ns#" term="haskell" /><category scheme="http://www.blogger.com/atom/ns#" term="monad" /><category scheme="http://www.blogger.com/atom/ns#" term="monadic IO" /><category scheme="http://www.blogger.com/atom/ns#" term="f#" /><category scheme="http://www.blogger.com/atom/ns#" term="workflow" /><title>Haskell and F#: Language Design</title><content type="html">&lt;p&gt;After watching &lt;a href="http://www.haskell.org/haskellwiki/Video_presentations"&gt;a taste of Haskell&lt;/a&gt; by Simon Peyton-Jones and having a look at &lt;a href="http://research.microsoft.com/~simonpj/papers/history-of-haskell/history.pdf"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px; margin: -5px -5px -5px -5px;" src="http://corsis.sourceforge.net/images/silk/page_white_acrobat.png" border="0" alt="PDF" /&gt;A History of Haskell: being lazy with class&lt;/a&gt;, I am left with some open questions regarding the design of F#:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Why is F# not lazy?: What is the advantage of eagerness?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Is there a point in encapsulating side-effectful operations in monads while programming in F#? IO Monads etc.?&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:small"&gt;&lt;pre&gt;#light&lt;br /&gt;&lt;br /&gt;// Sample F# IO Monad : OSCON Haskell Video Part 2&lt;br /&gt;&lt;br /&gt;type IO&amp;lt;'a&amp;gt; = IO of 'a&lt;br /&gt;&lt;br /&gt;//  get: unit -&amp;gt; IO&amp;lt;string&amp;gt;&lt;br /&gt;let get () = IO(read_line    ())&lt;br /&gt;&lt;br /&gt;//  put: string -&amp;gt; IO&amp;lt;unit&amp;gt;&lt;br /&gt;let put x  = IO(print_string x)&lt;br /&gt;&lt;br /&gt;//     bind.e: IO&amp;lt;'a&amp;gt;  -&amp;gt;  'a&lt;br /&gt;// bind: IO&amp;lt;'a&amp;gt; -&amp;gt; ('a -&amp;gt; IO&amp;lt;'b&amp;gt;) -&amp;gt; IO&amp;lt;'b&amp;gt;&lt;br /&gt;let bind (x:IO&amp;lt;'a&amp;gt;) (y:('a -&amp;gt; IO&amp;lt;'b&amp;gt;)) = let e (IO(a)) = a in y (e x)&lt;br /&gt;let (&amp;gt;&amp;gt;=) = bind&lt;br /&gt;&lt;br /&gt;//  gp: unit -&amp;gt; IO&amp;lt;unit&amp;gt;&lt;br /&gt;let gp () = get () &amp;gt;&amp;gt;= put&lt;br /&gt;&lt;br /&gt;gp ()&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Why did the F# team chose ML and OCaml over Haskell?&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I hope someone from the F# team enlightens me on all these. I am still scrutinizing the 55-pages-long history of Haskell to create a list of questions I want to ask.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-6473671065614127667?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=gOb-pbJ_gSI:GEDvBWKB_QI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=gOb-pbJ_gSI:GEDvBWKB_QI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=gOb-pbJ_gSI:GEDvBWKB_QI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=gOb-pbJ_gSI:GEDvBWKB_QI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=gOb-pbJ_gSI:GEDvBWKB_QI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=gOb-pbJ_gSI:GEDvBWKB_QI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=gOb-pbJ_gSI:GEDvBWKB_QI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=gOb-pbJ_gSI:GEDvBWKB_QI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=gOb-pbJ_gSI:GEDvBWKB_QI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/gOb-pbJ_gSI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/6473671065614127667/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=6473671065614127667" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/6473671065614127667?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/6473671065614127667?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/gOb-pbJ_gSI/haskell-and-f-language-design.html" title="Haskell and F#: Language Design" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://corsis.blogspot.com/2008/01/haskell-and-f-language-design.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4ESHY8eip7ImA9WxVQEks.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-3143090178502940233</id><published>2008-01-03T00:45:00.001+01:00</published><updated>2009-01-29T23:08:29.872+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-29T23:08:29.872+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="segmentation" /><category scheme="http://www.blogger.com/atom/ns#" term="compilers" /><category scheme="http://www.blogger.com/atom/ns#" term="mono project" /><category scheme="http://www.blogger.com/atom/ns#" term="紅姫" /><category scheme="http://www.blogger.com/atom/ns#" term="regex" /><category scheme="http://www.blogger.com/atom/ns#" term="mono" /><category scheme="http://www.blogger.com/atom/ns#" term="benihime" /><category scheme="http://www.blogger.com/atom/ns#" term="regular expressions" /><category scheme="http://www.blogger.com/atom/ns#" term="refactoring" /><category scheme="http://www.blogger.com/atom/ns#" term="segmenter" /><title>Segmenter Compiler: Benihime, 紅姫</title><content type="html">&lt;p&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px; float:left; margin:5px 10px 10px 0; width: 32px;" src="http://corsis.sourceforge.net/images/silk/text_superscript.png" border="0" alt="update" /&gt;Code generation subsystem of Benihime is undergoing major refactoring with two goals: extensive use of generics in the public API and maximum amount of code reuse.&lt;/p&gt;&lt;p&gt;With &lt;a href="http://tirania.org/blog/archive/2007/Dec-28.html"&gt;major concern about the performance of the current regex implementation in Mono (1.2.6)&lt;/a&gt;, I wish I already had enough time to spare today to submit a standards-compliant regex compiler replacement as a contribution. I hope Benihime to become one in the near future.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-3143090178502940233?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=yehkqSvI5Z8:i-y_fl1eSng:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=yehkqSvI5Z8:i-y_fl1eSng:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=yehkqSvI5Z8:i-y_fl1eSng:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=yehkqSvI5Z8:i-y_fl1eSng:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=yehkqSvI5Z8:i-y_fl1eSng:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=yehkqSvI5Z8:i-y_fl1eSng:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=yehkqSvI5Z8:i-y_fl1eSng:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=yehkqSvI5Z8:i-y_fl1eSng:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=yehkqSvI5Z8:i-y_fl1eSng:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/yehkqSvI5Z8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/3143090178502940233/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=3143090178502940233" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/3143090178502940233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/3143090178502940233?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/yehkqSvI5Z8/segmenter-compiler-benihime.html" title="Segmenter Compiler: Benihime, 紅姫" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2008/01/segmenter-compiler-benihime.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IGRH06fCp7ImA9WB9aE08.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-4988898116137124785</id><published>2008-01-03T00:44:00.000+01:00</published><updated>2008-01-03T01:52:05.314+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-03T01:52:05.314+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="f#" /><title>Expert F#</title><content type="html">&lt;p&gt;On a completely unrelated note, I have been reading Expert F# and I must admit that I begin to like the language. If you are someone who is going to learn his first programming language or just feel like adding a new one to your arsenal, I strongly recommend having a look at F# – with interesting mix of paradigms, terse syntax and strong type inference, it is sure to be a pure delight to work with.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-4988898116137124785?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=R1Z8VN-snAg:9JeEPsh6RP4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=R1Z8VN-snAg:9JeEPsh6RP4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=R1Z8VN-snAg:9JeEPsh6RP4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=R1Z8VN-snAg:9JeEPsh6RP4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=R1Z8VN-snAg:9JeEPsh6RP4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=R1Z8VN-snAg:9JeEPsh6RP4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=R1Z8VN-snAg:9JeEPsh6RP4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=R1Z8VN-snAg:9JeEPsh6RP4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=R1Z8VN-snAg:9JeEPsh6RP4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/R1Z8VN-snAg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/4988898116137124785/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=4988898116137124785" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/4988898116137124785?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/4988898116137124785?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/R1Z8VN-snAg/expert-f.html" title="Expert F#" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://corsis.blogspot.com/2008/01/expert-f.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQHRHcyeCp7ImA9WB9aE0w.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-4460552037841151264</id><published>2008-01-01T18:18:00.000+01:00</published><updated>2008-01-03T00:42:15.990+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-03T00:42:15.990+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mono 1.2.6" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris 10" /><category scheme="http://www.blogger.com/atom/ns#" term="download" /><category scheme="http://www.blogger.com/atom/ns#" term="mono/solaris" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris 10/x86" /><category scheme="http://www.blogger.com/atom/ns#" term="mono" /><category scheme="http://www.blogger.com/atom/ns#" term="solaris 10-x86" /><title>Mono 1.2.6 binaries for Solaris 10/x86</title><content type="html">Duncan Mac Leod from &lt;a href="http://www.tucan-entertainment.com"&gt;Tucan Entertainment&lt;/a&gt; has been kind enough to share his &lt;a href="http://www.excelsior-online.org/download/non_project_related/solaris10_x86/mono_1_2_6_solaris10_x86.zip"&gt;Mono 1.2.6 binaries for Solaris 10/x86&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-4460552037841151264?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=IJ-2p2rch6o:MJJy8rdRitI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=IJ-2p2rch6o:MJJy8rdRitI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=IJ-2p2rch6o:MJJy8rdRitI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=IJ-2p2rch6o:MJJy8rdRitI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=IJ-2p2rch6o:MJJy8rdRitI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=IJ-2p2rch6o:MJJy8rdRitI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=IJ-2p2rch6o:MJJy8rdRitI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=IJ-2p2rch6o:MJJy8rdRitI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=IJ-2p2rch6o:MJJy8rdRitI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/IJ-2p2rch6o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/4460552037841151264/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=4460552037841151264" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/4460552037841151264?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/4460552037841151264?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/IJ-2p2rch6o/mono-126-binaries-for-solaris-10x86.html" title="Mono 1.2.6 binaries for Solaris 10/x86" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://corsis.blogspot.com/2008/01/mono-126-binaries-for-solaris-10x86.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8EQ3c9fSp7ImA9WxZREk4.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-8323085260646908644</id><published>2007-12-02T13:04:00.000+01:00</published><updated>2008-02-05T20:13:22.965+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-05T20:13:22.965+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="levenshtein distance" /><category scheme="http://www.blogger.com/atom/ns#" term="minimum edit distance" /><category scheme="http://www.blogger.com/atom/ns#" term="levenshtein" /><category scheme="http://www.blogger.com/atom/ns#" term="edit distance" /><category scheme="http://www.blogger.com/atom/ns#" term="algorithm" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><category scheme="http://www.blogger.com/atom/ns#" term="ahmed ghoneim" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><category scheme="http://www.blogger.com/atom/ns#" term="cetin sert" /><title>Levenshtein Distance Algorithm: Fastest Implementation in C#</title><content type="html">&lt;p&gt;Here is a cleaned-up performance test for several different implementations of levenshtein I have blogged about recently. This test was emailed to me by Ahmed Ghoneim, who has also kindly agreed to its publication on my blog. I am very grateful to him for his excellent contribution. I have slightly altered his file to do away with the unnecessary local variables in my C2C# port of the GNULevenshtein method.&lt;/p&gt;&lt;p&gt;I would like to hear from you which methods perform best on your machine. Please drop a comment ^_^!&lt;/p&gt;&lt;p&gt;&lt;a href="http://corsis.sourceforge.net/res/levenshtein/test/Program.cs"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN: -5px; BORDER-RIGHT-WIDTH: 0px" alt="C#" src="http://corsis.sourceforge.net/images/silk/page_white_csharp.png" border="0" /&gt;LevenshteinAlgorithmPerformanceTest.cs&lt;/a&gt;&lt;br /&gt;code only&lt;br /&gt;&lt;br /&gt;&lt;a href="http://corsis.sourceforge.net/res/levenshtein/test/packages"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN: -5px; BORDER-RIGHT-WIDTH: 0px" alt="Package" src="http://corsis.sourceforge.net/images/silk/package.png" border="0" /&gt;Packages&lt;/a&gt;&lt;br /&gt;code, data and sample binary in zip and self-executable zip formats&lt;/p&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;Please note that the GNULevenshtein method was found to be buggy! Here is the new replacement &lt;a href="http://corsis.svn.sourceforge.net/viewvc/corsis/trunk/Tenka.Text/Tenka.Text/TextMath.cs?revision=396&amp;amp;view=markup#l_777"&gt;method&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-8323085260646908644?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=4Tw517bHrrs:ONIEYZ55FJM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=4Tw517bHrrs:ONIEYZ55FJM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=4Tw517bHrrs:ONIEYZ55FJM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=4Tw517bHrrs:ONIEYZ55FJM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=4Tw517bHrrs:ONIEYZ55FJM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=4Tw517bHrrs:ONIEYZ55FJM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=4Tw517bHrrs:ONIEYZ55FJM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=4Tw517bHrrs:ONIEYZ55FJM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=4Tw517bHrrs:ONIEYZ55FJM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/4Tw517bHrrs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/8323085260646908644/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=8323085260646908644" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8323085260646908644?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8323085260646908644?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/4Tw517bHrrs/levenshtein-distance-algorithm-fastest.html" title="Levenshtein Distance Algorithm: Fastest Implementation in C#" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>13</thr:total><feedburner:origLink>http://corsis.blogspot.com/2007/12/levenshtein-distance-algorithm-fastest.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIGSHo9eip7ImA9WxVaE0U.&quot;"><id>tag:blogger.com,1999:blog-8551824799489151728.post-8792235638466572756</id><published>2007-11-26T00:55:00.001+01:00</published><updated>2009-04-10T19:12:09.462+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-10T19:12:09.462+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="markov chains" /><category scheme="http://www.blogger.com/atom/ns#" term="training set" /><category scheme="http://www.blogger.com/atom/ns#" term="test set" /><category scheme="http://www.blogger.com/atom/ns#" term="markov n-gram models" /><category scheme="http://www.blogger.com/atom/ns#" term="perplexity" /><category scheme="http://www.blogger.com/atom/ns#" term="markov ngram models" /><category scheme="http://www.blogger.com/atom/ns#" term="calculating perplexity" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><category scheme="http://www.blogger.com/atom/ns#" term="logarithmic space" /><category scheme="http://www.blogger.com/atom/ns#" term="language models" /><title>Perplexity in Markov N-Gram Models</title><content type="html">&lt;p&gt;While implementing the perplexity function on Markov n-gram models as it is described on page 14 of &lt;a href="http://www.cs.colorado.edu/%7Emartin/SLP/Updates/4.pdf"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px; margin: -5px -5px -5px -5px;" src="http://corsis.sourceforge.net/images/silk/page_white_acrobat.png" border="0" alt="PDF" /&gt;Jurafsky &amp; Martin's SLP to appear&lt;/a&gt;, I came across some floating point overflow, underflow issues and had to come up with equations to avoid them.&lt;/p&gt;&lt;p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://bp0.blogger.com/_etWDaQmHOe4/R0u5Gt8151I/AAAAAAAAAHo/REvTdvYvbnI/s400/perplexity.png" &gt;&lt;/p&gt;&lt;p&gt;Here is &lt;a href="http://corsis.sourceforge.net/cl/ecl/hw5/perplexity.pdf"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px; margin: -5px -5px -5px -5px;" src="http://corsis.sourceforge.net/images/silk/page_white_acrobat.png" border="0" alt="PDF" /&gt;my solution in detail&lt;/a&gt; and &lt;a href="http://corsis.svn.sourceforge.net/viewvc/corsis/trunk/Tenka.Text/Tenka.Text/Statistics/MarkovNGramm.cs?revision=389&amp;view=markup#l_416"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px; margin: -5px -5px -5px -5px;" src="http://corsis.sourceforge.net/images/silk/page_white_csharp.png" border="0" alt="C#" /&gt;its bigram implementation&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It took me a lot of whiteboarding and a few hours to figure this one out but the resulting libcorsis code is %100 foreign intellectual property free ^_^.&lt;/p&gt;&lt;p&gt;I am now looking for ways to analyze distributions graphically and testing different encapsulations of probability values and their interaction with the public API.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8551824799489151728-8792235638466572756?l=corsis.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/corsis?a=twcIACHcCFs:COlQpPzuXvk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=twcIACHcCFs:COlQpPzuXvk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=twcIACHcCFs:COlQpPzuXvk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=twcIACHcCFs:COlQpPzuXvk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=twcIACHcCFs:COlQpPzuXvk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=twcIACHcCFs:COlQpPzuXvk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=twcIACHcCFs:COlQpPzuXvk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/corsis?a=twcIACHcCFs:COlQpPzuXvk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/corsis?i=twcIACHcCFs:COlQpPzuXvk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/corsis/~4/twcIACHcCFs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://corsis.blogspot.com/feeds/8792235638466572756/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8551824799489151728&amp;postID=8792235638466572756" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8792235638466572756?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8551824799489151728/posts/default/8792235638466572756?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/corsis/~3/twcIACHcCFs/perplexity-in-markov-n-gram-models.html" title="Perplexity in Markov N-Gram Models" /><author><name>Cetin Sert</name><uri>http://www.blogger.com/profile/03520078566058489224</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp0.blogger.com/_etWDaQmHOe4/R0u5Gt8151I/AAAAAAAAAHo/REvTdvYvbnI/s72-c/perplexity.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://corsis.blogspot.com/2007/11/perplexity-in-markov-n-gram-models.html</feedburner:origLink></entry></feed>

