<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4900486588862577097</id><updated>2011-11-15T17:41:39.782+01:00</updated><category term='postgresql'/><category term='mmx'/><category term='sse2'/><category term='x86'/><category term='vesa'/><category term='assembler'/><category term='algorithms'/><category term='graph'/><category term='blogasek'/><category term='kabaret'/><category term='znaleziska'/><category term='python'/><category term='polish'/><category term='free book'/><category term='grafika komputerowa'/><category term='perfect hashing'/><category term='advertisement'/><category term='pic'/><category term='c++'/><category term='papers'/><category term='humor'/><category term='x.org'/><category term='demoscene'/><category term='plpgsql'/><category term='extensions'/><category term='python3'/><category term='DAG'/><category term='programming'/><category term='music'/><category term='recenzje'/><category term='huffman coding'/><category term='SIMD'/><category term='pthreads'/><category term='memory managment'/><category term='branchless'/><category term='trie'/><category term='c'/><category term='pascal'/><category term='wikipedia'/><category term='dreams'/><category term='DAWG'/><category term='sql'/><category term='ssse3'/><category term='STL'/><category term='sse'/><category term='dictionary'/><category term='low level'/><category term='regular expressions'/><category term='sse5'/><category term='data compression'/><category term='antigravity'/><title type='text'>Notes on computers, programming and all the stuff</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-271369126676245121</id><published>2011-10-27T21:23:00.000+02:00</published><updated>2011-10-27T21:23:42.298+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='sse'/><title type='text'>itoa on steroids</title><content type='html'>Function &lt;tt&gt;itoa&lt;/tt&gt; implemented with SSE instructions is about 3 times faster then scalar CPU version. &lt;a href="http://0x80.pl/articles/sse-itoa.html"&gt;Read more&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-271369126676245121?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/271369126676245121/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=271369126676245121' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/271369126676245121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/271369126676245121'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/10/itoa-on-steroids.html' title='itoa on steroids'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7729646107666865933</id><published>2011-04-16T22:33:00.000+02:00</published><updated>2011-04-16T22:33:46.815+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogasek'/><title type='text'>Embedded in Academia</title><content type='html'>New link in blogroll -- blog of prof. John Regehr: low level code, bugs in C compilers and beautiful photos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7729646107666865933?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7729646107666865933/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7729646107666865933' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7729646107666865933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7729646107666865933'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/04/embedded-in-academia.html' title='Embedded in Academia'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-9035220469193302322</id><published>2011-04-13T19:09:00.002+02:00</published><updated>2011-04-13T19:09:36.961+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='papers'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>Regular expressions derivatives</title><content type='html'>Have you ever heard about "regular expression derivatives"?  No? Me too. This is very interseting idea, that have pratical usage in pattern matching.&lt;br /&gt;&lt;br /&gt;Matthew Might wrote a sample program using the idea: &lt;a class="reference external" href="http://matt.might.net/articles/implementation-of-regular-expression-matching-in-scheme-with-derivatives/"&gt;A regular expression matcher in Scheme using derivatives&lt;/a&gt;.  There is also a detailed paper on this topic: &lt;a class="reference external" href="http://www.ccs.neu.edu/home/turon/re-deriv.pdf"&gt;Regular-expression derivatives re-examined&lt;/a&gt; by Owens, Reppy and Turon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-9035220469193302322?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/9035220469193302322/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=9035220469193302322' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/9035220469193302322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/9035220469193302322'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/04/regular-expressions-derivatives.html' title='Regular expressions derivatives'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-2016180908988341903</id><published>2011-04-13T19:08:00.000+02:00</published><updated>2011-04-13T19:08:42.593+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='DAG'/><title type='text'>Traversing DAGs</title><content type='html'>If DAG has got one component, then the simplest traversing&lt;br /&gt;method is depth-first-search, which could be easily implemented&lt;br /&gt;recursively (using implicit stack).&lt;br /&gt;&lt;br /&gt;&lt;pre class="code-block c literal-block"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;DAGNode&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="c1"&gt;// user data&lt;br /&gt;&lt;/span&gt;        &lt;span class="n"&gt;bool&lt;/span&gt;    &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// after construction = 0&lt;br /&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;DFS_aux&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DAGNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span class="c1"&gt;// visit node&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br /&gt;                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;                        &lt;span class="n"&gt;DFS_aux&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;DFS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DAGNode&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;DFS_aux&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;On every call of &lt;tt class="docutils literal"&gt;DFS()&lt;/tt&gt; variable &lt;tt class="docutils literal"&gt;val&lt;/tt&gt; is switched, and  &lt;tt class="docutils literal"&gt;visited&lt;/tt&gt; member is marked alternately with &lt;tt class="docutils literal"&gt;true&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;false&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;There is just &lt;b&gt;one problem&lt;/b&gt; — what if traversing method stop execution before visiting all nodes? Of course in such situation we have to visit DAG twice: on first pass reset (possibly many times) &lt;tt class="docutils literal"&gt;visited&lt;/tt&gt; member to &lt;tt class="docutils literal"&gt;false&lt;/tt&gt;, and then visit once each node.&lt;br /&gt;&lt;br /&gt;But usually &lt;tt class="docutils literal"&gt;bool&lt;/tt&gt; have at least 8 bits, so numbers could be used instead of boolean values 0 or 1. On each call of&lt;tt class="docutils literal"&gt; DFS()&lt;/tt&gt; a reference number is incremented, thanks that even if previous call stopped in the middle procedure will work&lt;br /&gt;correctly.&lt;br /&gt;&lt;br /&gt;The only moment when &lt;tt class="docutils literal"&gt;visited&lt;/tt&gt; markers have to be cleared is wrapping a reference numbers to zero. This happen every 256 calls if 8-bit values used; for wider counters (16, 32 bits)&lt;br /&gt;max value is greater.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code-block c literal-block"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;DFS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DAGNode&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span class="c1"&gt;// set visited member of all nodes to 0&lt;br /&gt;&lt;/span&gt;                &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;DFS_aux&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-2016180908988341903?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/2016180908988341903/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=2016180908988341903' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2016180908988341903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2016180908988341903'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/04/traversing-dags.html' title='Traversing DAGs'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8013806190034091436</id><published>2011-04-09T22:04:00.002+02:00</published><updated>2011-04-10T18:29:29.595+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perfect hashing'/><category scheme='http://www.blogger.com/atom/ns#' term='DAWG'/><category scheme='http://www.blogger.com/atom/ns#' term='dictionary'/><title type='text'>DAWG as dictionary? Yes!</title><content type='html'>If you read Wikipedia entry about &lt;a href="http://en.wikipedia.org/wiki/DAWG"&gt;DAWG&lt;/a&gt;, then you find following sentence:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Because the terminal nodes of a DAWG can be reached by multiple paths, a DAWG is not suitable for storing auxiliary information relating to each path, e.g. a word's frequency in the English language. A trie would be more useful in such a case.&lt;/i&gt;&lt;/blockquote&gt;This isn't true!&lt;br /&gt;&lt;br /&gt;There is a quite simple algorithm, that allow to perform two-way &lt;b&gt;minimal perfect hashing&lt;/b&gt; (MPH), i.e. convert any path representing a word to a unique number, or back --- a number to a path (word). Values lie in range 1..&lt;i&gt;n&lt;/i&gt;, where &lt;i&gt;n&lt;/i&gt; is number of distinct words saved in DAWG.&lt;br /&gt;&lt;br /&gt;The algorithm is described in &lt;i&gt;Applications of Finite Automata Representing Large Vocabularies&lt;/i&gt;, by &lt;b&gt;Claudio Lucchiesi&lt;/b&gt; and &lt;b&gt;Tomasz Kowaltowski&lt;/b&gt; (preprint is freely available somewhere online).&lt;br /&gt;&lt;br /&gt;The main part of the algorithm is assigning to each node a number of reachable words from a node; this can be easily done in one pass. Then these numbers are used to perform perfect hashing. Hashing algorithm is fast and simple, translation from pseudocode presented in the paper is straightforward.&lt;br /&gt;&lt;br /&gt;Algorithm requires additional memory for numbers in each node and a table of size &lt;i&gt;n&lt;/i&gt; to implement dictionary lookups.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've updated &lt;a href="http://0x80.pl/proj/pydawg"&gt;pyDAWG&lt;/a&gt; to support MPH.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8013806190034091436?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8013806190034091436/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8013806190034091436' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8013806190034091436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8013806190034091436'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/04/dawg-as-dictionary-yes.html' title='DAWG as dictionary? Yes!'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-6748957830530075909</id><published>2011-04-09T15:10:00.003+02:00</published><updated>2011-04-09T20:44:42.205+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python3'/><category scheme='http://www.blogger.com/atom/ns#' term='extensions'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='graph'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>pyDAWG</title><content type='html'>&lt;a href="http://0x80.pl/proj/pydawg/"&gt;pyDAWG&lt;/a&gt; is a python module implementing &lt;a href="http://en.wikipedia.org/wiki/DAWG"&gt;Directed Acyclic Word Graph&lt;/a&gt;, that allow to store set of words in a compacted way. DAWGs are much smaller then tries, while sharing the main advantage of tries - linear time to check if word is present in a set.&lt;br /&gt;&lt;br /&gt;The main module is a C extension, there is also a pure python code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-6748957830530075909?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/6748957830530075909/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=6748957830530075909' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6748957830530075909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6748957830530075909'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/04/pydawg.html' title='pyDAWG'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-5259031467436492812</id><published>2011-04-08T22:46:00.001+02:00</published><updated>2011-04-08T22:46:57.889+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extensions'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python: C extensions - sequence-like object</title><content type='html'>If class have to support standard &lt;tt&gt;len()&lt;/tt&gt; function or operator &lt;tt&gt;in&lt;/tt&gt;, then must be a sequence-like. This require variable of type &lt;tt&gt;PySequenceMethods&lt;/tt&gt;, that store addresses of proper functions. Finally address of this structure have to be assigned to &lt;tt&gt;tp_as_sequence&lt;/tt&gt; member of main &lt;tt&gt;PyTypeObject&lt;/tt&gt; variable.&lt;br /&gt;&lt;br /&gt;Here is sample code: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;static PySequenceMethods class_seq;&lt;br /&gt;&lt;br /&gt;static PyTypeObject class_type_dsc = {&lt;br /&gt; ...&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;ssize_t&lt;br /&gt;classmeth_len(PyObject* self) {&lt;br /&gt; if (not error)&lt;br /&gt;  return sequence_size;&lt;br /&gt; else&lt;br /&gt;  return -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int&lt;br /&gt;classmeth_contains(PyObject* self, PyObject* value) {&lt;br /&gt; if (not error) {&lt;br /&gt;  if (value in self)&lt;br /&gt;   return 1;&lt;br /&gt;  else&lt;br /&gt;   return 0;&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt;  return -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PyMODINIT_FUNC&lt;br /&gt;PyInit_module() {&lt;br /&gt; class_seq.sq_length   = classmeth_len;&lt;br /&gt; class_seq.sq_contains = classmeth_contains;&lt;br /&gt;&lt;br /&gt; class_type_dsc.tp_as_sequence = &amp;amp;class_seq;&lt;br /&gt;&lt;br /&gt; ...&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-5259031467436492812?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/5259031467436492812/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=5259031467436492812' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5259031467436492812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5259031467436492812'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/04/c-extensions-to-python-sequence-like.html' title='Python: C extensions - sequence-like object'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8821061066401286400</id><published>2011-03-29T23:06:00.000+02:00</published><updated>2011-03-29T23:06:06.364+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python3'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>pyahocorasick</title><content type='html'>&lt;a href="http://0x80.pl/proj/pyahocorasick/index.html"&gt;Python module&lt;/a&gt; implementing Aho-Corasick algorithm has been released. C extension (for Py3k) and pure python code are available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8821061066401286400?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8821061066401286400/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8821061066401286400' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8821061066401286400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8821061066401286400'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/03/pyahocorasick.html' title='pyahocorasick'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8630893797105060194</id><published>2011-03-28T21:58:00.000+02:00</published><updated>2011-03-28T21:58:52.355+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='low level'/><category scheme='http://www.blogger.com/atom/ns#' term='memory managment'/><title type='text'>Internal memory fragmentation</title><content type='html'>In previous post I've advertised my text about trie representations.&lt;br /&gt;&lt;br /&gt;Depending on particular representation internal memory fragmentation vary from 25% to 46% (in GNU libc). In other words if trie should occupy 100MB then  in the worst case real memory usage is around 200MB. I've never suppose that fragmentation could be so significant.&lt;br /&gt;&lt;br /&gt;When quite simple memory pools were used, then &lt;a href="http://0x80.pl/articles/trie-representation.html"&gt;internal fragmentation&lt;/a&gt; has been cut down to 1-2%! Impressive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8630893797105060194?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8630893797105060194/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8630893797105060194' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8630893797105060194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8630893797105060194'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/03/internal-memory-fragmentation.html' title='Internal memory fragmentation'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7394835015127975846</id><published>2011-03-26T17:39:00.000+01:00</published><updated>2011-03-26T17:39:58.970+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='trie'/><category scheme='http://www.blogger.com/atom/ns#' term='memory managment'/><title type='text'>Efficient trie representation</title><content type='html'>While implementing &lt;a href="http://en.wikipedia.org/wiki/Aho-Corasick"&gt;Aho-Corasick algorithm&lt;/a&gt; I've checked &lt;a href="http://0x80.pl/articles/trie-representation.html"&gt;several trie representations&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7394835015127975846?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7394835015127975846/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7394835015127975846' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7394835015127975846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7394835015127975846'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/03/efficient-trie-representation.html' title='Efficient trie representation'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-915976422364683780</id><published>2011-02-27T16:08:00.000+01:00</published><updated>2011-02-27T16:08:54.736+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python3'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='antigravity'/><title type='text'>Python3: import antigravity</title><content type='html'>Works fine!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-915976422364683780?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/915976422364683780/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=915976422364683780' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/915976422364683780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/915976422364683780'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/02/python3-import-antigravity.html' title='Python3: import antigravity'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-5608246776778629444</id><published>2011-02-23T21:17:00.000+01:00</published><updated>2011-02-23T21:17:36.720+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grafika komputerowa'/><category scheme='http://www.blogger.com/atom/ns#' term='free book'/><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><title type='text'>Grafika komputerowa I</title><content type='html'>Całkiem udany &lt;a href="http://mst.mimuw.edu.pl/lecture.php?lecture=gk1"&gt;skrypt do grafiki komputerowej&lt;/a&gt; autorstwa &lt;span class="one-author"&gt;&lt;/span&gt;&lt;a href="http://www.mimuw.edu.pl/%7Eprzemek"&gt;Przemysława Kiciaka&lt;/a&gt; udostępnił UW w ramach swojego portalu z materiałami dydaktycznymi. Obszerna tematyka, więc miejscami skrótowo i ogólnikowo, ale ogólnie wygląda zachęcająco.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-5608246776778629444?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/5608246776778629444/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=5608246776778629444' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5608246776778629444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5608246776778629444'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2011/02/grafika-komputerowa-i.html' title='Grafika komputerowa I'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8652782308746530854</id><published>2010-10-10T21:28:00.001+02:00</published><updated>2010-10-10T23:18:04.393+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pic'/><category scheme='http://www.blogger.com/atom/ns#' term='advertisement'/><title type='text'>PIC Language</title><content type='html'>Yesterday I made my first diagram with PIC (see &lt;a href="http://en.wikipedia.org/wiki/Pic_language"&gt;Wikipedia&lt;/a&gt;) and... I felt in love. Language is just perfect, intuitive and powerful. Try it and you will never use any popular drawing software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8652782308746530854?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8652782308746530854/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8652782308746530854' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8652782308746530854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8652782308746530854'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/10/pic-languge.html' title='PIC Language'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8156480076540218784</id><published>2010-09-28T23:44:00.000+02:00</published><updated>2010-09-28T23:44:04.932+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='x.org'/><category scheme='http://www.blogger.com/atom/ns#' term='vesa'/><title type='text'>Xorg VESA driver - higher resolutions</title><content type='html'>Default configuration of VESA driver allows resolutions 640x480 and 800x600.&lt;br /&gt;It is quite simple to get higher resolutions - in section &lt;tt&gt;Monitor&lt;/tt&gt; of &lt;tt&gt;/etc/X11/xorg.conf&lt;/tt&gt; we have to set horizontal and vertical refresh rates. By default these values are set to lowest, safe area.&lt;br /&gt;&lt;br /&gt;Here are my settings:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Section "Monitor"&lt;br /&gt;        Identifier   "Monitor0"&lt;br /&gt;        VendorName   "Monitor Vendor"&lt;br /&gt;        ModelName    "Monitor Model"&lt;br /&gt;&lt;br /&gt;        HorizSync    42.0 - 80.0&lt;br /&gt;        VertRefresh  55.0 - 100.0 &lt;br /&gt;EndSection&lt;/pre&gt;&lt;br /&gt;X.org is able to work at 1280x1024 with vertical refresh rate 75Hz. HTH&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8156480076540218784?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8156480076540218784/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8156480076540218784' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8156480076540218784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8156480076540218784'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/09/xorg-vesa-driver-higher-resolutions.html' title='Xorg VESA driver - higher resolutions'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7917586658584862218</id><published>2010-08-24T09:38:00.001+02:00</published><updated>2010-09-28T23:45:38.876+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plpgsql'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>PostgrSQL: printf in PL/pgSQL</title><content type='html'>PostgreSQL wiki has &lt;a href="http://wiki.postgresql.org/wiki/Sprintf"&gt;entry about sprintf&lt;/a&gt; - is is quite simple approach (and isn't marked as &lt;b&gt;immutable&lt;/b&gt;), the main drawback is iterating over all chars of format string. Here is a version use &lt;tt&gt;strpos&lt;/tt&gt; to locate % in format string, and it's faster around 2 times:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;CREATE OR REPLACE FUNCTION printf2(fmt text, variadic args anyarray) RETURNS text&lt;br /&gt;LANGUAGE plpgsql IMMUTABLE AS $$&lt;br /&gt;   DECLARE&lt;br /&gt;      argcnt  int  := 1;&lt;br /&gt;      head    text := '';     -- result&lt;br /&gt;      tail    text := fmt;    -- unprocessed part&lt;br /&gt;      k       int;&lt;br /&gt;   BEGIN&lt;br /&gt;      LOOP&lt;br /&gt;         k := strpos(tail, '%');&lt;br /&gt;         IF k = 0 THEN&lt;br /&gt;            -- no more '%'&lt;br /&gt;            head := head || tail;&lt;br /&gt;            EXIT;&lt;br /&gt;         ELSE&lt;br /&gt;            IF substring(tail, k+1, 1) = '%' THEN&lt;br /&gt;               -- escape sequence '%%'&lt;br /&gt;               head := head || substring(tail, 1, k);&lt;br /&gt;               tail := substring(tail, k+2);&lt;br /&gt;            ELSE&lt;br /&gt;               -- insert argument&lt;br /&gt;               head := head || substring(tail, 1, k-1) || COALESCE(args[argcnt]::text, '');&lt;br /&gt;               tail := substring(tail, k+1);&lt;br /&gt;               argcnt := argcnt + 1;&lt;br /&gt;            END IF;&lt;br /&gt;         END IF;&lt;br /&gt;      END LOOP;&lt;br /&gt;   RETURN head;&lt;br /&gt;END;&lt;br /&gt;$$;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7917586658584862218?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7917586658584862218/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7917586658584862218' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7917586658584862218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7917586658584862218'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/08/postgrsql-printf-in-plpgsql.html' title='PostgrSQL: printf in PL/pgSQL'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-5286516822122232048</id><published>2010-07-17T11:43:00.002+02:00</published><updated>2010-07-19T12:57:57.827+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='ssse3'/><category scheme='http://www.blogger.com/atom/ns#' term='sse'/><title type='text'>SSSE3 population count vs hardware</title><content type='html'>&lt;b&gt;Peter Kankowski&lt;/b&gt; &lt;a href="http://www.strchr.com/crc32_popcnt"&gt;compared&lt;/a&gt; speed of SSE4.2 instructions &lt;tt&gt;crc32&lt;/tt&gt; and &lt;tt&gt;popcnt&lt;/tt&gt; against software implementations. Hardware CRC32 is significantly faster, but population count is &lt;b&gt;slightly&lt;/b&gt; slower than my &lt;a href="http://0x80.pl/articles/sse-popcount.html"&gt;SSSE3 popcount&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-5286516822122232048?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/5286516822122232048/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=5286516822122232048' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5286516822122232048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5286516822122232048'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/07/ssse3-population-count-vs-hardware.html' title='SSSE3 population count vs hardware'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7230469179326369463</id><published>2010-05-09T23:01:00.002+02:00</published><updated>2010-05-09T23:24:03.687+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='branchless'/><category scheme='http://www.blogger.com/atom/ns#' term='x86'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='SIMD'/><title type='text'>Branchless set mask if value greater or how to print hex values</title><content type='html'>Suppose we need to get mask when nonnegative argument is greater then some constant value; in other words, we want to evaluate following expression:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;if x &amp;gt; const_n then&lt;br /&gt;   mask := 0xffffffff;&lt;br /&gt;else&lt;br /&gt;   mask := 0x00000000;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Portable branchless solution:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;choose magic number &lt;tt&gt;M := (1 &amp;lt;&amp;lt; (k-1)) - 1 - n&lt;/tt&gt;, where &lt;i&gt;k&lt;/i&gt; is a bit position, for example 31 if we operate on 32-bit words&lt;/li&gt;&lt;li&gt;calculate &lt;tt&gt;R := x + M&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;k-th bit of R is set if &lt;tt&gt;x &amp;gt; n&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;fill mask with this bit - see note&lt;a href="http://wmula.blogspot.com/2010/04/fill-word-with-selected-bit.html"&gt; Fill  word with selected bit&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The key to understand this trick is binary form of M: &lt;tt&gt;0111..1111zzzz&lt;/tt&gt;, where z is 0 or 1 depending on n value. When x is greater then n, then x + M has form &lt;tt&gt;1000..000zzzz&lt;/tt&gt;, because carry bit propagate through series of ones to k-th position of result.&lt;br /&gt;&lt;br /&gt;Real world example - branchless converting hex digit to ASCII (M=0x7ffffff6 for k=31 and n=9).&lt;br /&gt;&lt;br /&gt;&lt;pre class="sample-code"&gt;; input:    eax - hex digit&lt;br /&gt;; output:   eax - ASCII letter (0-9, A-F or a-f)&lt;br /&gt;; destroys: ebx&lt;br /&gt;&lt;br /&gt;        andl 0xf, %eax&lt;br /&gt;        leal 0x7ffffff6(%eax), %ebx     ; MSB(ebx)=1 when eax &amp;gt;= 10&lt;br /&gt;        sarl $31, %ebx                  ; ebx - mask&lt;br /&gt;        andl  $7, %ebx                  ; ebx = 7 when eax &amp;gt;= 10 (for A-F letters)&lt;br /&gt;        ;andl $39, %ebx                 ; ebx = 39 when eax &amp;gt;= 10 (for a-f letters)&lt;br /&gt;        leal '0'(%eax, %ebx), %eax      ; eax = '0' + eax + ebx =&amp;gt; ASCII letter&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It is also possible to convert 4 hex digits in parallel using similar algorithm, but input data have to be correctly prepared. Moreover generating mask requires 3 instructon and one extra register (in scalar version just one arithmetic shift). I guess it wont be fast on x86, maybe this approach would be good for SIMD code, where similar code transforms  more bytes at once.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sample-code"&gt;; input: eax - four hex digits in form [0a0b0c0d]&lt;br /&gt;; output: eax - four ascii letters&lt;br /&gt;; destroys: ebx, ecx&lt;br /&gt;&lt;br /&gt;        leal 0x76767676(%eax), %ebx        ; MSB of each byte is set when corresponding eax byte is &amp;gt;= 10&lt;br /&gt;                                           ; (here: 0x7f - 9 = 0x76)&lt;br /&gt;        andl $0x80808080, %ebx&lt;br /&gt;        movl %ebx, %ecx&lt;br /&gt;        shrl    $7, %ebx&lt;br /&gt;        subl %ebx, %ecx                    ; ecx - byte-wise mask&lt;br /&gt;        ;andl $0x07070707, %ecx            ; for ASCII letters A-F&lt;br /&gt;        andl $0x27272727, %ecx             ; for ASCII letters a-f&lt;br /&gt;        leal 0x30303030(%eax, %ecx), %eax  ; ecx - four ascii letters&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;See also: &lt;a href="http://wm.ite.pl/articles/sse-hexprint.html"&gt;SSSE3: printing hex values&lt;/a&gt; (weird use of PSHUFB instruction)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7230469179326369463?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7230469179326369463/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7230469179326369463' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7230469179326369463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7230469179326369463'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/05/branchless-set-mask-if-value-greater-or.html' title='Branchless set mask if value greater or how to print hex values'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-6109774235724313961</id><published>2010-05-01T23:06:00.003+02:00</published><updated>2010-05-02T22:01:23.878+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='x86'/><category scheme='http://www.blogger.com/atom/ns#' term='sse2'/><category scheme='http://www.blogger.com/atom/ns#' term='ssse3'/><category scheme='http://www.blogger.com/atom/ns#' term='sse'/><title type='text'>Speedup reversing table of bytes</title><content type='html'>With help of BSWAP instruction or SSE instructions (&lt;tt&gt;PSHUFD&lt;/tt&gt;, &lt;tt&gt;PSHUFLW&lt;/tt&gt;, &lt;tt&gt;PSHUFHW&lt;/tt&gt;) or SSSE3 instruction (&lt;tt&gt;PSHUFB&lt;/tt&gt;) reversing table can be faster. Speedup depends on three factors:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;table size: larger=faster&lt;/li&gt;&lt;li&gt;table address: aligned=faster/much faster (&lt;b&gt;15.5 speedup&lt;/b&gt; - possible! see chart)&lt;/li&gt;&lt;li&gt;CPU type&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://wm.ite.pl/snippets/asm/reverse_tab/core2-aligned-movaps.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://wm.ite.pl/snippets/asm/reverse_tab/core2-aligned-movaps.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://wm.ite.pl/notesen.html#note-2010-8"&gt;Read full article&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-6109774235724313961?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/6109774235724313961/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=6109774235724313961' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6109774235724313961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6109774235724313961'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/05/speedup-reversing-table-of-bytes.html' title='Speedup reversing table of bytes'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7331636934698437772</id><published>2010-04-11T18:38:00.004+02:00</published><updated>2010-04-12T22:16:10.862+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='branchless'/><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='x86'/><title type='text'>Determining if an integer is a power of 2</title><content type='html'>Method from &lt;a href="http://graphics.stanford.edu/%7Eseander/bithacks.html"&gt;Bit Twiddling Hacks&lt;/a&gt;: &lt;tt&gt;(x != 0) &amp;amp;&amp;amp; (x &amp;amp; (x-1) == 0)&lt;/tt&gt;. GCC compiles this to following code:&lt;br /&gt;&lt;pre class="sample-code"&gt;; input/ouput: eax&lt;br /&gt;; destroys: ebx&lt;br /&gt;&lt;br /&gt;        test    %eax,  %eax     ; x == 0?&lt;br /&gt;        jz      1f&lt;br /&gt;&lt;br /&gt;        leal -1(%eax), %ebx     ; ebx := x-1&lt;br /&gt;        test    %eax,  %ebx     ; ZF  := (eax &amp; ebx == 0)&lt;br /&gt;&lt;br /&gt;        setz     %al&lt;br /&gt;        movzx    %al, %eax       ; eax := ZF&lt;br /&gt;1:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We can use also &lt;tt&gt;BSF&lt;/tt&gt; and &lt;tt&gt;BSR&lt;/tt&gt; instructions, that determines position of first and last bit=1. If number is power of 2, then just one bit is set, and thus these positions are equal. &lt;tt&gt;BSx&lt;/tt&gt; sets also ZF flag if input value is zero.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sample-code"&gt;; input/output: eax&lt;br /&gt;; destroys: ebx, edx&lt;br /&gt;&lt;br /&gt;        bsf     %eax, %ebx      ; ebx := LSB's position if eax != 0, ZF = 1 if eax = 0&lt;br /&gt;        jz      1f&lt;br /&gt;        bsr     %eax, %edx      ; edx := MSB's position&lt;br /&gt;&lt;br /&gt;        cmp     %ebx, %edx      ; ZF  := (ebx = edx)&lt;br /&gt;&lt;br /&gt;        setz    %al&lt;br /&gt;        movzx   %al, %eax       ; eax := ZF&lt;br /&gt;1:&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7331636934698437772?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7331636934698437772/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7331636934698437772' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7331636934698437772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7331636934698437772'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/04/determining-if-integer-is-power-of-2.html' title='Determining if an integer is a power of 2'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8588201026554262657</id><published>2010-04-08T21:56:00.001+02:00</published><updated>2010-04-08T22:14:12.625+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='branchless'/><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='x86'/><title type='text'>Brenchless conditional exchange</title><content type='html'>Suppose we have to exchange (or just move) two registers A and B:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;C := A xor B&lt;/li&gt;&lt;li&gt; C := 0 if &lt;i&gt;condition&lt;/i&gt; is not true&lt;/li&gt;&lt;li&gt;A := A xor C&lt;/li&gt;&lt;li&gt;B := B xor C&lt;/li&gt;&lt;/ol&gt;If C is 0, then&amp;nbsp; A and B left unchanged, else A and B are swapped. If only conditional move from B to A is needed, then step 4th have to be skipped.&lt;br /&gt;&lt;br /&gt;Here is a sample x86 code, where &lt;i&gt;condition&lt;/i&gt; is value of CF:&lt;br /&gt;&lt;pre class="sample-code"&gt;sbb edx, edx ; part of step 2. - edx = 0xffffff if CF=1, 0x000000 otherwise&lt;br /&gt;mov ecx, eax&lt;br /&gt;xor ecx, ebx ; step 1&lt;br /&gt;and ecx, edx ; completed step 2. - now C is 0 or (A xor B)&lt;br /&gt;xor eax, ecx ; step 3&lt;br /&gt;xor ebx, ecx ; step 4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Branchless moves are possible in Pentium Pro and higher with instructions &lt;tt&gt;cmov&lt;i&gt;cc&lt;/i&gt;&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;See also &lt;a href="http://en.wikipedia.org/wiki/XOR_linked_list"&gt;XOR linked list&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8588201026554262657?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8588201026554262657/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8588201026554262657' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8588201026554262657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8588201026554262657'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/04/brenchless-conditional-exchange.html' title='Brenchless conditional exchange'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7511163242888900993</id><published>2010-04-03T16:37:00.001+02:00</published><updated>2010-04-08T21:34:55.610+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='STL'/><title type='text'>STL: map with string as key - access speedup</title><content type='html'>The idea is quite simple: we do not have a single &lt;tt&gt;stl::map&amp;lt;string, something&amp;gt;&lt;/tt&gt;, but vector of maps, indexed with O(1) time - each map store keys sharing certain properties. Drawback: additional memory.&lt;br /&gt;&lt;br /&gt;I've tested following grouping schemes:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;string, something=""&gt;length of string,&lt;/string,&gt;&lt;/li&gt;&lt;li&gt;&lt;string, something=""&gt;first letter of string (one level trie),&lt;/string,&gt;&lt;/li&gt;&lt;li&gt;both length and first letter.&lt;/li&gt;&lt;/ol&gt;Third is the fastest - around &lt;b&gt;60%&lt;/b&gt; faster then plain std::map from gcc (red-black tree).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tests:&lt;/b&gt; my program read plain text (I've used &lt;i&gt;The Illiad&lt;/i&gt; from &lt;a href="http://gutenberg.org/"&gt;http://gutenberg.org&lt;/a&gt;), text is splitted into words (~190000) and then each words is inserted into dictonary (~28000 distinct words); then the same words are searched in dictionaries. Table below summarizes results on my computer (gcc 4.3.4 from cygwin).&lt;br /&gt;&lt;br /&gt;&lt;pre style="overflow: auto;"&gt;+-------------+--------------------------------+--------------------------------+&lt;br /&gt;|             |          running time [ms]     |            speedup [%]         |&lt;br /&gt;| data struct +----------+----------+----------+----------+----------+----------+&lt;br /&gt;|             |    min   |   avg    |   max    |   min    |   avg    |   max    |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;|                                          inserting                            |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;|  std::map   |    269   |   287    |   355    |   100    |   100    |   100    |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;| first char  |    218   |   241    |   395    |    81    |    84    |   111    |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;|   length    |    218   |   240    |   345    |    81    |    84    |    97    |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;| len./char   |    165   |   172    |   207    |    &lt;b&gt;61&lt;/b&gt;    |    &lt;b&gt;60&lt;/b&gt;    |    &lt;b&gt;58&lt;/b&gt;    |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;|                                            finding                            |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;|  std::map   |    295   |   322    |   483    |   100    |   100    |   100    |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;| first char  |    243   |   263    |   460    |    82    |    82    |    95    |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;|   length    |    238   |   248    |   292    |    80    |    77    |    60    |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;br /&gt;| len./char   |    184   |   190    |   241    |    &lt;b&gt;62&lt;/b&gt;    |    &lt;b&gt;60&lt;/b&gt;    |    &lt;b&gt;50&lt;/b&gt;    |&lt;br /&gt;+-------------+----------+----------+----------+----------+----------+----------+&lt;/pre&gt;&lt;br /&gt;Download &lt;a class="reference external" href="http://wm.ite.pl/snippets/stdmap-speedup.cpp"&gt;test program&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7511163242888900993?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7511163242888900993/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7511163242888900993' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7511163242888900993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7511163242888900993'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/04/stl-map-with-string-as-key-access.html' title='STL: map with string as key - access speedup'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-429499935585668386</id><published>2010-04-01T20:21:00.006+02:00</published><updated>2010-04-01T21:11:26.757+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='branchless'/><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='x86'/><title type='text'>Branchless signum</title><content type='html'>Problem: calculate value of &lt;a href="http://en.wikipedia.org/wiki/Sign_function"&gt;sign(x)&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;-1 when x &amp;lt; 0&lt;/li&gt;&lt;li&gt;0 when x = 0,&lt;/li&gt;&lt;li&gt;+1 when x &amp;gt; 0.&lt;/li&gt;&lt;/ul&gt;My solution do not involve any hardaware specific things like ALU flags nor special instructions - just plain AND, OR, shifts.&lt;pre style="overflow: auto; padding: 1ex; border: 1px dotted; background: none repeat scroll 0% 0% rgb(238, 238, 238);"&gt; ; input: eax = X&lt;br /&gt;&lt;br /&gt; movl %eax, %ebx&lt;br /&gt; sarl $31, %eax  // eax = -1 if X less then zero, 0 otherwise&lt;br /&gt;&lt;br /&gt; andl $0x7fffffff, %ebx&lt;br /&gt; addl $0x7fffffff, %ebx // MSB is set if any lower bits were set&lt;br /&gt; shrl $31, $ebx  // eax = +1 if X greater then zero, 0 otherwise&lt;br /&gt;&lt;br /&gt; orl %ebx, %eax  // eax = result&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;C99 implementation:&lt;br /&gt;&lt;pre style="overflow: auto; padding: 1ex; border: 1px dotted; background: none repeat scroll 0% 0% rgb(238, 238, 238);"&gt;int32_t sign(int32_t x) {&lt;br /&gt; int32_t y;&lt;br /&gt; y = (x &amp;amp; 0x7fffffff) + 0x7fffffff;&lt;br /&gt; return (x &gt;&gt; 31) | ((uint32_t)y &gt;&gt; 31);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-429499935585668386?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/429499935585668386/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=429499935585668386' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/429499935585668386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/429499935585668386'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/04/branchless-signum.html' title='Branchless signum'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-1841922693618102681</id><published>2010-04-01T19:05:00.008+02:00</published><updated>2010-05-09T23:32:46.474+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='branchless'/><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='x86'/><title type='text'>Fill word with selected bit</title><content type='html'>This is continuation of subproblem from previous post: we have a word (byte, dword, whatever) and want to fill it with selected bit.&lt;br /&gt;&lt;br /&gt;1. The most general algorithm:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;mask bit&lt;br /&gt;&lt;tt&gt;[101&lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;1010] =&amp;gt; [000&lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;0000]&lt;/tt&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;clone word&lt;br /&gt;a=&lt;tt&gt;[000&lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;0000]&lt;/tt&gt;, b=&lt;tt&gt;[000&lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;0000]&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;shift bit in first word to MSB, and to LSB in second word&lt;br /&gt;a=&lt;tt&gt;[&lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;0000000]&lt;/tt&gt;, b=&lt;tt&gt;[0000000&lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;]&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;subtract c = a - b&lt;br /&gt;c=&lt;tt&gt;[&lt;span style="font-weight: bold;"&gt;0&lt;/span&gt;1111111]&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;add missing MSB c = c OR a&lt;br /&gt;c=&lt;tt&gt;[11111111]&lt;/tt&gt;&lt;/li&gt;&lt;/ol&gt;2. If arithmetic shifts are supported:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;shift bit to MSB&lt;br /&gt;a=&lt;tt&gt;[&lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;0000000]&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;arithmetic shift right&lt;br /&gt;a=[11111111]&lt;/li&gt;&lt;/ol&gt;3. On processor 386+ we can copy selected bit from reg to carry flag (CF) with &lt;tt&gt;bt reg, reg&lt;/tt&gt; and then clone CF with &lt;tt&gt;sbb reg, reg&lt;/tt&gt;.&lt;br /&gt;&lt;pre class="sample-code"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;&lt;br /&gt;uint32_t fill1(uint32_t a, int bit) {&lt;br /&gt;uint32_t b;&lt;br /&gt;&lt;br /&gt;b = a = a &amp;amp; (1 &amp;lt;&amp;lt; bit);&lt;br /&gt;&lt;br /&gt;a &amp;lt;&amp;lt;= 31 - bit;&lt;br /&gt;b &amp;gt;&amp;gt;= bit;&lt;br /&gt;&lt;br /&gt;return (a - b) | a;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;uint32_t fill2(uint32_t a, int bit) {&lt;br /&gt;a &amp;lt;&amp;lt;= 31 - bit;&lt;br /&gt;return (int32_t)(a) &amp;gt;&amp;gt; 31;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;uint32_t fill386(uint32_t a, int bit) {&lt;br /&gt;uint32_t result;             &lt;br /&gt;__asm__ __volatile__ (&lt;br /&gt;"bt  %1, %0\n"&lt;br /&gt;"sbb %0, %0\n"&lt;br /&gt;: "=r" (result)&lt;br /&gt;: "r" (bit), "0" (a)&lt;br /&gt;);&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char* argv[]) {&lt;br /&gt;uint32_t x, i;&lt;br /&gt;if (argc &amp;gt; 1)&lt;br /&gt;x = (unsigned long)strtol(argv[1], NULL, 0);&lt;br /&gt;&lt;br /&gt;printf("input = %08x\n", x);&lt;br /&gt;for (i=0; i &amp;lt; 32; i++)&lt;br /&gt;printf("bit %2d: fill1 = %08x, fill2 = %08x, fill386 = %08x\n",&lt;br /&gt;i,&lt;br /&gt;fill1(x, i),&lt;br /&gt;fill2(x, i),&lt;br /&gt;fill386(x, i)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;return EXIT_SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-1841922693618102681?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/1841922693618102681/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=1841922693618102681' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1841922693618102681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1841922693618102681'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/04/fill-word-with-selected-bit.html' title='Fill word with selected bit'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-563521916194992464</id><published>2010-03-31T21:41:00.005+02:00</published><updated>2010-04-01T19:05:01.568+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='mmx'/><category scheme='http://www.blogger.com/atom/ns#' term='sse5'/><category scheme='http://www.blogger.com/atom/ns#' term='sse'/><title type='text'>Transpose bits in byte using SIMD instructions</title><content type='html'>Method presented here allows to get &lt;b&gt;any bit permutation&lt;/b&gt;, transposition is just one of possible operations. Lookup-based approach would be faster, but algorithm is worth to (re)show.&lt;br /&gt;&lt;br /&gt;Algorithm outline for 8-byte vector (with SSE instruction it is possible to get 2 operations in parallel):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;fill vector with given byte&lt;br /&gt;&lt;tt&gt;[11010001] =&amp;gt;&lt;/tt&gt;&lt;br /&gt;&lt;tt&gt;[11010001|11010001|11010001|11010001|11010001|11010001|11010001|11010001]&lt;/tt&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;leave one bit per byte&lt;br /&gt;&lt;tt&gt;[&lt;b&gt;1&lt;/b&gt;0000000|0&lt;b&gt;1&lt;/b&gt;000000|00&lt;b&gt;0&lt;/b&gt;00000|000&lt;b&gt;1&lt;/b&gt;0000|0000&lt;b&gt;0&lt;/b&gt;000|00000&lt;b&gt;0&lt;/b&gt;00|000000&lt;b&gt;0&lt;/b&gt;0|0000000&lt;b&gt;1&lt;/b&gt;]&lt;/tt&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;perform desired transposition ("move" bits around)&lt;br /&gt;&lt;tt&gt;[0000000&lt;b&gt;1&lt;/b&gt;|0000000&lt;b&gt;1&lt;/b&gt;0|00000&lt;b&gt;0&lt;/b&gt;00|0000&lt;b&gt;1&lt;/b&gt;000|000&lt;b&gt;0&lt;/b&gt;0000|00&lt;b&gt;0&lt;/b&gt;00000|0&lt;b&gt;0&lt;/b&gt;000000|&lt;b&gt;1&lt;/b&gt;0000000]&lt;/tt&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;perform horizontal OR of all bytes&lt;br /&gt;&lt;tt&gt;[10001011]&lt;/tt&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Here is my &lt;a href="http://wm.ite.pl/articles/snippets.html#transpozycja-bitow-update"&gt;old MMX code&lt;/a&gt; (polish text); below SSE/SSE5 implementation details.&lt;br /&gt;&lt;br /&gt;Ad 1. Series of &lt;tt&gt;punpcklbw/punpcklwb/shufps&lt;/tt&gt; or &lt;tt&gt;pshufb&lt;/tt&gt; if CPU supports SSSE3.&lt;br /&gt;&lt;pre&gt;# 1.1&lt;br /&gt;movd      %eax, %xmm0&lt;br /&gt;shufps    $0x00, %xmm0, %xmm0&lt;br /&gt;punpcklbw %xmm0, %xmm0&lt;br /&gt;punpcklwd %xmm0, %xmm0&lt;br /&gt;&lt;br /&gt;# 1.2&lt;br /&gt;pxor      %xmm1, %xmm1&lt;br /&gt;movd       %eax, %xmm0&lt;br /&gt;pshufb    %xmm1, %xmm0&lt;br /&gt;&lt;/pre&gt;Ad 2. Simple &lt;tt&gt;pand&lt;/tt&gt; with mask &lt;tt&gt;packed_qword(0x8040201008040201)&lt;/tt&gt;.&lt;br /&gt;&lt;pre&gt;pand  MASK1, %xmm0&lt;br /&gt;&lt;/pre&gt;Ad 3. If plain SSE instructions are supported this step require some work. First each bit is populated to fill whole byte (using &lt;tt&gt;pcmpeq&lt;/tt&gt; - we get negated result), then mask bits on desired positons.&lt;br /&gt;&lt;br /&gt;SSE5 has powerful instruction &lt;tt&gt;protb&lt;/tt&gt; that can do perform rotation of each byte with &lt;b&gt;independent amount&lt;/b&gt; - so in this case just one instruction is needed.&lt;br /&gt;&lt;pre&gt;# SSE&lt;br /&gt;pcmpeq  %xmm1, %xmm0&lt;br /&gt;&lt;b&gt;pandn&lt;/b&gt;   MASK2, %xmm0&lt;br /&gt;&lt;br /&gt;# SSE5&lt;br /&gt;protb    ROT, %xmm0, %xmm0&lt;br /&gt;&lt;/pre&gt;Ad 4. Since bits are placed on &lt;b&gt;distinct positions&lt;/b&gt;, we can use instruction &lt;tt&gt;psadbw&lt;/tt&gt;, that calculate horizontal sums of bytewide differences from two registers (separately for low and high registers half). If one register is full of zeros, we get sum of bytes from other register.&lt;br /&gt;&lt;pre&gt;psadbw  %xmm1, %xmm0&lt;br /&gt;movd    %xmm0, %eax&lt;br /&gt;&lt;/pre&gt;Depending on instruction set three (SSE) or two (SSE5) additional tables are needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-563521916194992464?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/563521916194992464/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=563521916194992464' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/563521916194992464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/563521916194992464'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/03/rotate-bits-in-byte-using-simd.html' title='Transpose bits in byte using SIMD instructions'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-3287385299645114578</id><published>2010-03-31T18:56:00.005+02:00</published><updated>2010-04-03T18:04:02.027+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><category scheme='http://www.blogger.com/atom/ns#' term='pthreads'/><title type='text'>Opis biblioteki pthreads na Wikibooks</title><content type='html'>W ramach głębszego poznawania biblioteki pthreads utworzyłem w serwisie &lt;a href="http://pl.wikibooks.org/"&gt;wikibooks&lt;/a&gt; opis &lt;a href="http://pl.wikibooks.org/wiki/POSIX_Threads"&gt;POSIX Threads&lt;/a&gt;, zawierający bardzo podstawowe informacje o większości funkcji tej biblioteki oraz nieco o rozszerzeniach Linuxowej implementacji. Integralną częścią są przykładowe programy.&lt;br /&gt;&lt;br /&gt;(Wikibooks niestety nie zyskał takiej popularności, jak Wikipedia, a to całkiem wygodna platforma do tworzenia różnego rodzaju podręczników).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-3287385299645114578?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/3287385299645114578/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=3287385299645114578' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/3287385299645114578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/3287385299645114578'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/03/opis-biblioteki-pthreads-na-wikibooks.html' title='Opis biblioteki pthreads na Wikibooks'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7271806598847392902</id><published>2010-03-30T10:14:00.010+02:00</published><updated>2010-04-08T22:01:32.534+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>PostgreSQL: get selected rows with given order</title><content type='html'>Suppose that database stores some kind of dictionary and user picks some items, but wants to keep order. For example dictionary has entries with id=0..10, and user picked 9, 2, 4 and 0. This simple query does the job (query splitted):&lt;br /&gt;&lt;br /&gt;&lt;pre class="sample-code"&gt;&lt;b&gt;foo = SELECT (ARRAY[9,2,4,0])[i] AS index, i AS ord FROM  generate_series(1, 4) AS i&lt;/b&gt;;&lt;br /&gt;SELECT * FROM dictionary INNER JOIN &lt;b&gt;(foo) ON dictionary.id=foo.index ORDER BY foo.ord&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7271806598847392902?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7271806598847392902/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7271806598847392902' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7271806598847392902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7271806598847392902'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2010/03/postgresql-get-selected-rows-with-given.html' title='PostgreSQL: get selected rows with given order'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-5510877636880486412</id><published>2009-11-14T21:45:00.004+01:00</published><updated>2009-11-14T21:55:00.337+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kabaret'/><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><title type='text'>Słowa mistrza</title><content type='html'>Wczoraj późnym wieczorem czytałem jakiś wywiad z mistrzem Andrzejem Poniedzielskim, z którego wynotowałem następujące zdanie:&lt;blockquote&gt;Dziś każdy pisze sobie muzykę i teksty, zapowiada, wykonuje, a telewizja sprawia wrażenie, że jeszcze ktoś oprócz niego samego się tym bawi.&lt;br /&gt;&lt;/blockquote&gt;Przed chwilą natomiast przypadkiem oglądnąłem Kabaretowy Klub Dwójki prowadzony przez liderów dwóch najpopularniejszych formacji... i właśnie tak mi się ten cytat z Poniedzielskiego skojarzył.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-5510877636880486412?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/5510877636880486412/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=5510877636880486412' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5510877636880486412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5510877636880486412'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/11/sowa-mistrza.html' title='Słowa mistrza'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-3121558689874917395</id><published>2009-09-21T12:36:00.001+02:00</published><updated>2009-09-21T12:38:57.427+02:00</updated><title type='text'>I'm not afraid</title><content type='html'>I use &lt;tt&gt;goto&lt;/tt&gt; statements!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-3121558689874917395?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/3121558689874917395/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=3121558689874917395' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/3121558689874917395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/3121558689874917395'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/09/im-not-afraid.html' title='I&apos;m not afraid'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-5875437779009659878</id><published>2009-08-11T20:20:00.005+02:00</published><updated>2009-08-22T15:10:50.726+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>C++ main disfunctions</title><content type='html'>In my opinion there are two main disadvantages of C++:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;lack of &lt;span style="font-weight: bold;"&gt;local functions&lt;/span&gt; (called sometimes "nested")&lt;/li&gt;&lt;li&gt;lack of pointers to class method ("delegates")&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Ad 1. &lt;a href="http://www.gotw.ca/gotw/058.htm"&gt;GotW #58&lt;/a&gt; shows use of &lt;span style="font-weight: bold;"&gt;local class&lt;/span&gt; to simulate local functions, but this is partial solution - class has no direct access to objects existing in outer scope. This force programmer to manage many things manually (more work) and is place of potential error.&lt;br /&gt;&lt;br /&gt;Ad 2. Borland has &lt;tt&gt;__closure&lt;/tt&gt; extension (no portable code), there are some portable libraries that does the trick. But everything is not compatible with each other, we can forget about real code reuse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-5875437779009659878?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/5875437779009659878/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=5875437779009659878' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5875437779009659878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5875437779009659878'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/08/c-main-disfunctions.html' title='C++ main disfunctions'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-2980687135812158397</id><published>2009-06-30T08:19:00.002+02:00</published><updated>2010-03-31T19:07:37.146+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><title type='text'>Cytat dnia</title><content type='html'>Naprawdę rozczulający cytat:&lt;br /&gt;&lt;blockquote&gt;Zarządzanie pamięcią w C++ to podstawowy&lt;br /&gt;wyróżnik języka i jedna z jego najmocniejszych&lt;br /&gt;stron, jeśli się umie ją stosować.&lt;/blockquote&gt;Życzę zatem wszystkim programistom C++ udanego debug^Wdnia. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-2980687135812158397?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/2980687135812158397/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=2980687135812158397' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2980687135812158397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2980687135812158397'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/06/cytat-dnia.html' title='Cytat dnia'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-2018897278390316773</id><published>2009-06-04T18:26:00.006+02:00</published><updated>2009-06-05T20:28:12.272+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><title type='text'>Napisał o mnie Witold Piecuch!</title><content type='html'>Okres przedwyborczy to czas wyjątkowy, prawie jak Wigilia. Politycy mówią ludzkim głosem i to nie do kamer, tylko do ludzi!&lt;br /&gt;&lt;br /&gt;Kandydat na europosła z ramienia partii demokraci.pzpr, pan Witold Piecuch, raczył wypowiedzieć się na temat mojej skromnej osoby. Niestety, nie są to słowa pochlebne - otóż wg pana Piecucha jestem niepoprawnym naiwniakiem, na dodatek dziwacznym, bo dającym sobie wciskać różne populistyczne i patriotyczne kity.&lt;br /&gt;&lt;br /&gt;Na dowód pozwolę sobie zacytować fragment ulotki wyborczej w/w kandydata:&lt;br /&gt;&lt;blockquote&gt;[...] Chcę udowodnić, że Podkarpacie nie musi być jakimś &lt;span style="font-weight: bold;"&gt;dziwacznym bastionem sił narodowo-populistycznych&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;wiecznie zwodzonym&lt;/span&gt; przez różnych cwaniaków.&lt;br /&gt;&lt;/blockquote&gt;Aż chciałoby się powiedzieć: "Diamencie stukaratowy. Madrość Twoja jak stąd do baobabu".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-2018897278390316773?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/2018897278390316773/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=2018897278390316773' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2018897278390316773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2018897278390316773'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/06/napisa-o-mnie-witold-piecuch.html' title='Napisał o mnie Witold Piecuch!'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-3194189359851590687</id><published>2009-05-07T11:08:00.006+02:00</published><updated>2009-05-07T11:27:33.338+02:00</updated><title type='text'>Dlaczego Polska pozostanie państwem pastewno-buraczanym?</title><content type='html'>Najpierw fragment &lt;a href="http://www.polskatimes.pl/opinie/wywiady/108951,sciaganie-jest-jak-korupcja-w-futbolu,id,t.html"&gt;wypowiedzi&lt;/a&gt; profesora Łukasza Turskiego:&lt;br /&gt;&lt;blockquote&gt;W krajach o tradycji anglosaskiej ściąganie praktycznie nie istnieje. Oczywiście ono się tam zdarza, bo tam nie żyją sami święci. Tyle, że tam brutalność karania za oszustwa szkolne jest niebywała. W Colorado jest szkoła pilotów amerykańskiej armii. Na jednym z najważniejszych egzaminów złapano tam uczniów na ściąganiu. I wywalono z uczelni cały rocznik, na którego szkolenie wydano wiele milionów dolarów. Zapamiętałem wypowiedź komendanta szkoły: „My oddajemy w ręce pilotów naszych sił zbrojnych niezwykle drogie urządzenia i musimy mieć do nich pełne zaufanie. Nas nie stać na to, żebyśmy powierzali bezpieczeństwo Stanów Zjednoczonych ludziom, którzy oszukują”. Tam naprawdę mało się ściąga, a jeśli już ktoś tak zrobi, to się za nim – jak z Edwardem Kennedym, który miał taką wpadkę jako młody człowiek – ciągnie to potem przez całe życie.&lt;br /&gt;&lt;/blockquote&gt;A teraz reklama serwowana na wykopie:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XF4bZsRhsKo/SgKmRdLdQcI/AAAAAAAAAAM/nTLecj9VcTM/s1600-h/sciagi.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 533px; height: 75px;" src="http://3.bp.blogspot.com/_XF4bZsRhsKo/SgKmRdLdQcI/AAAAAAAAAAM/nTLecj9VcTM/s320/sciagi.PNG" alt="" id="BLOGGER_PHOTO_ID_5333007727580758466" border="0" /&gt;&lt;/a&gt;Czy nie czujecie się Państwo zażenowani, że jesteśmy takim zadupiem cywilizacyjnym?[1] Taka reklama przechodzi bez echa, a przecież serwis wykop jest jednym z popularniejszych w polskiej Sieci.&lt;br /&gt;&lt;br /&gt;Dopóki będziemy przymykać oko na małe oszustwa (no, nie takie małe), dopóki kombinatorstwo," radzenie sobie", "siła przebicia", będą najwyższą cnotą Polaka, kraj nasz  pozostanie pastewno-buraczanym, którego największym osiągnięciem tzw. high-tech będzie &lt;span style="font-weight: bold;"&gt;montownia komputerów&lt;/span&gt; marki Dell. Zaś minister edukacji, pani Hall, beż żenady będzie wygłaszała, że matematyka jest nam potrzebna do... numerowania domów przy ulicy.&lt;br /&gt;&lt;br /&gt;([1] Wiem, że przeciętnego wykształciucha bardziej wstydzi "kurdupel Kaczor", względnie "krótkie rączki Gosiewskiego").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-3194189359851590687?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/3194189359851590687/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=3194189359851590687' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/3194189359851590687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/3194189359851590687'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/05/dlaczego-polska-pozostanie-panstwem.html' title='Dlaczego Polska pozostanie państwem pastewno-buraczanym?'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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://3.bp.blogspot.com/_XF4bZsRhsKo/SgKmRdLdQcI/AAAAAAAAAAM/nTLecj9VcTM/s72-c/sciagi.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-5735830874194859134</id><published>2009-04-27T17:00:00.003+02:00</published><updated>2009-04-28T14:46:07.417+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><title type='text'>Polaris - Background stories</title><content type='html'>Najnowsza płyta &lt;a href="http://polarismusic.eu/"&gt;Polarisa&lt;/a&gt; pt. &lt;a href="http://polarismusic.eu/d_background.html"&gt;Background Stories&lt;/a&gt; właśnie doszła. Przesłuchałem już całą i mogę powiedzieć, że to kilkadziesiąt minut ciekawych i miłych dla ucha kompozycji.&lt;br /&gt;&lt;br /&gt;Dopisek: Po całym dniu słuchania mogę tylko potwierdzić, że pierwsze wrażenia były trafne; warto mieć tę płytkę.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-5735830874194859134?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/5735830874194859134/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=5735830874194859134' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5735830874194859134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5735830874194859134'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/04/polaris-background-stories.html' title='Polaris - Background stories'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8152384031968820604</id><published>2009-04-16T00:40:00.003+02:00</published><updated>2009-04-16T00:59:24.522+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogasek'/><title type='text'>Nic nie umie, a wie wszystko!</title><content type='html'>Są takie kierunki studiów, które wzbudzają we mnie autentyczne przerażenie, np. &lt;span style="font-style: italic;"&gt;gender studies&lt;/span&gt; (że niby my faceci to coś mamy, a kobietom tego brakuje - albo odwrotnie). Ale kierunek pod tytułem &lt;span style="font-weight: bold;"&gt;europeistyka&lt;/span&gt; jest jakimś koszmarem, który chyba spełnia tę samą rolę co parę lat temu &lt;span style="font-weight: bold;"&gt;zarządzanie-i-marketing&lt;/span&gt; (na jednym wydechu mówimy!). Dlaczego o tym piszę? Otóż w radiowej Trójce kilka dni temu gościło dwóch studentów rzeczonej &lt;span style="font-weight: bold;"&gt;europeistyki&lt;/span&gt; i jeden z nich wypowiedział takie zdanie, przy którym żartobliwie proponowane przez Andrzeja Poniedzielskiego "emaile do Koryntian" są przysłowiowym pikusiem. Student ów, przypominam - &lt;span style="font-weight: bold;"&gt;europeistyki&lt;/span&gt; - wygłosił był następującą kwestię: "Ludzie nie powinni być &lt;span style="font-weight: bold;"&gt;indywiduami&lt;/span&gt;, ale działać bardziej na rzecz społeczeństwa". Tak, &lt;span style="font-weight: bold;"&gt;indywiduami&lt;/span&gt;, nie przesłyszałem się. Przepraszam bardzo, ale jest to błąd semantyczny na poziomie 4 klasy szkoły podstawowej; to tak jakby dewaluację pomylić z defloracją. Chorobą przybity do łoża boleści mogłem tylko zawyć z żałości i rzucić kilkoma indywiduami na ka i ha.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8152384031968820604?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8152384031968820604/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8152384031968820604' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8152384031968820604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8152384031968820604'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/04/nic-nie-umie-wie-wszystko.html' title='Nic nie umie, a wie wszystko!'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-6770162146031348462</id><published>2009-03-28T16:11:00.002+01:00</published><updated>2009-03-28T16:19:40.566+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><title type='text'>Wandale a ClueBot</title><content type='html'>Wandale na Wikipedii to smutna rzecz, jednak większość z nich ma spryt rozwielitki (nie ujmując &lt;a href="http://pl.wikipedia.org/wiki/Rozwielitka"&gt;rozwielitkom&lt;/a&gt;). Zawsze bowiem bawi mnie, gdy widzę działania ClueBota - robota pracującego na Wikipedii, który automatycznie anuluje edycje wandali. Wykrywa takie edycje na podstawie jakiś w miarę prostych reguł i jeszcze nie widziałem, żeby się pomylił. To naprawdę przezabawne, gdy bezmyślny skrypt komputerowy jest w stanie "przechytrzyć" zdałoby się &lt;span style="font-style: italic;"&gt;homo sapiens&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-6770162146031348462?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/6770162146031348462/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=6770162146031348462' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6770162146031348462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6770162146031348462'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/03/wandale-cluebot.html' title='Wandale a ClueBot'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-6059040261044658498</id><published>2009-03-27T22:11:00.001+01:00</published><updated>2009-03-27T22:12:43.940+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='free book'/><title type='text'>The C Book</title><content type='html'>&lt;a href="http://publications.gbdirect.co.uk/c_book/"&gt;Online version of &lt;cite&gt;The C Book&lt;/cite&gt;&lt;/a&gt;, second      edition by Mike Banahan, Declan Brady and Mark Doran, originally      published by Addison Wesley in 1991.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-6059040261044658498?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/6059040261044658498/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=6059040261044658498' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6059040261044658498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6059040261044658498'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/03/c-book.html' title='The C Book'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8608076325390685366</id><published>2009-03-23T20:53:00.002+01:00</published><updated>2009-03-23T21:06:46.439+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>Re: more constraints</title><content type='html'>I &lt;a href="http://wmula.blogspot.com/2008/08/more-constraints-please.html"&gt;complained&lt;/a&gt; about C++'s lack of possibility to make some class members read-only on certain level of access protection (public, protected). Well, it is possible with references, but is just solution at syntax level - it needs additional storage, require two separate entities and proper initialization:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Class {&lt;br /&gt; public:&lt;br /&gt;  Class() : val(_val) {}&lt;br /&gt;&lt;br /&gt;  const int&amp;amp; val; // const ref&lt;br /&gt;&lt;br /&gt;  void set_val(int newval) {_val = newval;}&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;  int _val; // value&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;I don't like this code...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8608076325390685366?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8608076325390685366/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8608076325390685366' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8608076325390685366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8608076325390685366'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/03/re-more-constraints.html' title='Re: more constraints'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-5296535678545176572</id><published>2009-03-23T20:42:00.004+01:00</published><updated>2009-03-23T20:51:35.518+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kabaret'/><title type='text'>Nie mogę obronić się przed prawdziwą sztuką</title><content type='html'>Trafiłem ostatnio na jakiś kabaret w TV, było całkiem nieźle, do czasu aż nie padło sakramentalne "k...a" (rzecz jasna zupełnie zbędne); oczywiście w telewizji publicznej owa "k...a" została starannie wypikana.  Nie byli jednak w stanie wypikać mojego "wyp...", gdy przełączałem kanał.&lt;br /&gt;&lt;br /&gt;Czy naprawdę nie da się zrobić skeczu bez "k...y"?  To jakiś defekt mózgu?  Bo zauważyłem, że kabarety coraz chętniej i bez oporów po "k...y" sięgają.  Nie przeczę, że fanom z gimnazjów "k...a" rzucona na scenie może  imponować, że na youtubie "k....jących" oglądnie cała masa, może nawet owa "k...a" stanie się kultowa.&lt;br /&gt;&lt;br /&gt;Jednak na dłuższą metę takie prostactwo jest męczące i nie rokuje dobrze. Drodzy Twórcy Kabaretowi - nie idźcie tą drogą, na youtubie świat się nie kończy, zaś gimnazjaliści kiedyś wyrosną. I kto was będzie oglądał?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-5296535678545176572?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/5296535678545176572/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=5296535678545176572' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5296535678545176572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5296535678545176572'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/03/nie-moge-obronic-sie-przed-prawdziwa.html' title='Nie mogę obronić się przed prawdziwą sztuką'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-1975228985991530264</id><published>2009-03-23T19:09:00.003+01:00</published><updated>2009-03-23T19:19:35.853+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><title type='text'>O wandalizmach na Wikipedii</title><content type='html'>Bardzo celny komentarz ze strony &lt;a href="http://prawica.net/index.php?q=node/2576"&gt;prawica.net&lt;/a&gt;, autorstwa osoby podpisującej się jako Prawicowiec (dotyczący wandalizmu pt. &lt;a href="http://pl.wikipedia.org/wiki/Henryk_Batuta"&gt;Henryk Batuta&lt;/a&gt;):&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Grupa Warszawiaków, która "postanowiła dokonać ciekawej prowokacji" przez wprowadzenie do Wikipedii fałszywego hasła postąpiła nieetycznie nadużywając zaufania redaktorów tej encyklopedii. &lt;/p&gt; &lt;p&gt;Nadużyła ta grupa durniów również zaufania czytelników, ponieważ normalny człowiek z reguły nie spodziewa się, że jacyś idioci będą wpisywać do Wikipedii wyssane z palca bzdury. Palant wpuszczający do Internetu fałszywki zachowuje się tak samo, jak ten, co rozsyła komputerowe wirusy nie przynoszące nikomu korzyści (poza zboczoną satysfakcją palanta), a mogące narobić wielu szkód. &lt;/p&gt; &lt;p&gt;Niestety, ludzie przyzwoici są na ogół bezradni wobec kretynów, którzy za nic sobie mają zasady wzajemnego zaufania i przyzwoitości obowiązujące w środowisku cywilizowanym i zanieczyszczają to środowisko wydzielinami swych pokrzywionych mózgów. &lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-1975228985991530264?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/1975228985991530264/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=1975228985991530264' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1975228985991530264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1975228985991530264'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/03/o-wandalizmach-na-wikipedii.html' title='O wandalizmach na Wikipedii'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-1987652536458132786</id><published>2009-03-22T21:59:00.003+01:00</published><updated>2009-03-22T22:10:16.226+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>Mądrości Wschodu i Zachodu</title><content type='html'>Na wykopie podano linkę do &lt;a href="http://www.okiem.pl/"&gt;pewnej strony&lt;/a&gt;, a tam znalazłem absolutną perełkę nt różnic między buddystami a chrześcijanami:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Etyka buddyzmu&lt;/span&gt;&lt;br /&gt;Buddysta w danej sytuacji może zachować się tak samo, jak zachowałby się chrześcijanin, ale też może zdarzyć się inaczej (M. Masny "Czy chrześcijanin może być buddystą").&lt;br /&gt;&lt;/blockquote&gt;Nie wiem jak dla Państwa, ale dla mnie bomba!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-1987652536458132786?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/1987652536458132786/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=1987652536458132786' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1987652536458132786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1987652536458132786'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2009/03/madrosci-wschodu-i-zachodu.html' title='Mądrości Wschodu i Zachodu'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-2983858320563011737</id><published>2008-12-14T03:39:00.001+01:00</published><updated>2008-12-14T03:40:32.731+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='free book'/><title type='text'>Neural Networks - A Systematic Introduction</title><content type='html'>Book by &lt;span style="font-weight: bold;"&gt;Raul Rojas&lt;/span&gt;&lt;i&gt;: &lt;/i&gt;&lt;a href="http://page.mi.fu-berlin.de/rojas/neural/index.html.html"&gt;http://page.mi.fu-berlin.de/rojas/neural/index.html.html&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-2983858320563011737?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/2983858320563011737/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=2983858320563011737' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2983858320563011737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2983858320563011737'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/12/neural-networks-systematic-introduction.html' title='Neural Networks - A Systematic Introduction'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-2121331236721688776</id><published>2008-12-11T22:28:00.002+01:00</published><updated>2008-12-11T22:41:44.416+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Farscape</title><content type='html'>Few weeks ago I heard part of a track from &lt;a href="http://www.myspace.com/farscape2008"&gt;Farscape&lt;/a&gt; by &lt;span class="nametext"&gt;Klaus Schulze &amp;amp; Lisa Gerrard. I've felt in love and decided to grab the CDs as fast as I can. Definitively one of the best piece of music I have ever heard... masterpiece.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-2121331236721688776?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/2121331236721688776/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=2121331236721688776' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2121331236721688776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/2121331236721688776'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/12/farscape.html' title='Farscape'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-6753155149085734846</id><published>2008-10-19T22:24:00.006+02:00</published><updated>2011-04-14T21:57:29.317+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='free book'/><title type='text'>Text algorithms - book</title><content type='html'>Book by &lt;a href="http://www-igm.univ-mlv.fr/%7Emac/index_en.html"&gt;M. Crochemore&lt;/a&gt; and &lt;a href="http://web.njit.edu/%7Erytter/"&gt;W.Rytter&lt;/a&gt; is available in a PostScript format:&lt;br /&gt;&lt;strike&gt;&lt;a href="http://web.njit.edu/%7Erytter/TEACHING/TEXTS/book.html"&gt;http://web.njit.edu/~rytter/TEACHING/TEXTS/book.html&lt;/a&gt;. I don't see any copyright/licensing notices, but we probably can assume that is free for private use.&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;Update (2011-04-14): book is freely available on M. Crochemore's site, in a PDF format, just &lt;a href="http://www-igm.univ-mlv.fr/%7Emac/"&gt;click&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-6753155149085734846?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/6753155149085734846/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=6753155149085734846' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6753155149085734846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6753155149085734846'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/10/text-algorithns-book.html' title='Text algorithms - book'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-651420957380519045</id><published>2008-10-17T01:50:00.003+02:00</published><updated>2008-10-18T16:44:23.046+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='demoscene'/><title type='text'>Demovibes Live</title><content type='html'>What can I say? New &lt;a href="http://demovibes.org"&gt;demovibes set, live remixes&lt;/a&gt; is available. Thanks Willb.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-651420957380519045?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/651420957380519045/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=651420957380519045' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/651420957380519045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/651420957380519045'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/10/demovibes-live.html' title='Demovibes Live'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-5027165456769216686</id><published>2008-10-05T22:01:00.007+02:00</published><updated>2008-10-20T12:59:57.523+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><title type='text'>"Wprowadzenie do grafiki komputerowej"</title><content type='html'>Piszę o książce Foleya, van Dama, et al., w przekładzie &lt;a href="http://grafi.ii.pw.edu.pl/jza/index.html"&gt;prof. Jana Zabrodzkiego&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;WNT wciąż sprzedaje i reklamuje ten podręcznik słowami "oto książka uznawana w świecie za najlepszą pozycję dotyczącą grafiki komputerowej". Nie mogę zaprzeczyć, że książka jest dobrą pozycją, np. rozdziały o modelu wirtualnej kamery, barwie, czy rasteryzacji są wyśmienite i "ponadczasowe" (fakt, rasteryzacją mało kto się teraz zajmuje, ale warto wiedzieć, może przyjdzie nam coś narysować na jakimś 8051?).&lt;br /&gt;&lt;br /&gt;Proszę jednak pamiętać, że to jest przekład książki ukończonej w 1990 roku, czyli 18 lat temu; pierwsze polskie wydanie ukazało się w 1995. W międzyczasie postęp w dziedzinie informatyki nastąpił ogromny. Rozdziały o generowaniu fotorealistycznych obrazów mówią ledwie o podstawowych metodach, nie ma opisanych wielu modeli oświetlenia, nie ma bardziej zaawansowanych metod generowanie obrazów (path-tracing, bidirectional path-tracing, photon mapping, subsurface-scattering). Rozdział o krzywych i powierzchniach parametrycznych jest bardzo krótki, o wiele lepiej zaglądnąć do "Podstaw modelowania krzywych i powierzchni" P. Kiciaka (WNT 2005), choć to pozycja dość ciężka. O CSG są dosłownie dwie strony; z resztą wiele problemów jest wyłącznie zasygnalizowanych - np. antyaliasing przy rasteryzacji, budowanie drzew BSP i inne. (Jeśli chodzi o algorytmy graficzne to WNT wydało w 2006 świetną "Goemetrię obliczeniową" van Berga et al.).&lt;br /&gt;&lt;br /&gt;Gdy kupiłem "Wprowadzenie..." chyba w 2000 roku, może wcześniej, wówczas o powszechnym dostępie do Internetu można było pomarzyć - książka to było &lt;b&gt;coś&lt;/b&gt;, była - nie bójmy się tego określenia - oknem na świat. Poza tym raczej nie było alternatyw, no może poza jedną na wpół sensowną książką "Grafika PC bez tajemnic". Obecnie wszystko to można znaleźć po paru klikach w Sieci, choćby przez angielską Wikipedię, która zwykle ma bardzo ciekawe linki zewnętrzne. Przy okazji polecam dwie strony o &lt;a href="http://www.idav.ucdavis.edu/education/CAGDNotes/GraphicsNotes/homepage.html"&gt;grafice&lt;/a&gt; i &lt;a href="http://www.idav.ucdavis.edu/education/CAGDNotes/CAGDNotes/homepage.html"&gt;krzywych&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Więc jeśli ktoś rozważa kupno tej pozycji to powiedziałbym tak: jeśli wydanie 60-70 złotych nie stanowi dużego problemu, warto mieć pod ręką. W przeciwnym razie lepiej wydać tę kwotę na wspomnianą "Geometrię..." albo "Podstawy...", bo ceny porównywalne.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-5027165456769216686?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/5027165456769216686/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=5027165456769216686' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5027165456769216686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/5027165456769216686'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/10/wprowdzenie-do-grafiki-komputerowej.html' title='&quot;Wprowadzenie do grafiki komputerowej&quot;'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7633671721628490608</id><published>2008-10-02T23:00:00.002+02:00</published><updated>2008-10-02T23:03:05.849+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='znaleziska'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><title type='text'>VIPER - Visual Pascal InterpretER</title><content type='html'>Nice on-line Pascal interpreter with data structures visualiztion (trees, linked lists, etc.). Link: &lt;a href="http://viper.mimuw.edu.pl/"&gt;http://viper.mimuw.edu.pl/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7633671721628490608?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7633671721628490608/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7633671721628490608' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7633671721628490608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7633671721628490608'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/10/viper-visual-pascal-interpreter.html' title='VIPER - Visual Pascal InterpretER'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-1253773611865405133</id><published>2008-09-27T00:46:00.003+02:00</published><updated>2008-09-27T11:11:50.758+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><title type='text'>WikiSpam</title><content type='html'>Enlarge your Wikipedia for free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-1253773611865405133?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/1253773611865405133/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=1253773611865405133' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1253773611865405133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1253773611865405133'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/09/wikispam.html' title='WikiSpam'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-6197354117880814825</id><published>2008-09-12T13:10:00.005+02:00</published><updated>2008-10-05T22:45:13.736+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='znaleziska'/><category scheme='http://www.blogger.com/atom/ns#' term='huffman coding'/><category scheme='http://www.blogger.com/atom/ns#' term='data compression'/><title type='text'>Error Resilience in Compressed Data</title><content type='html'>I've found very interesting PhD thesis "Error Resilience in Compressed Data — Selected Topics" by &lt;a href="http://www.mimuw.edu.pl/~mbiskup/"&gt;Marek Biskup&lt;/a&gt;; author concentrated on decoding broken messages encoded with Huffman codes. Additionally parallel decoding of Huffman-coded messages is shown.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-6197354117880814825?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/6197354117880814825/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=6197354117880814825' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6197354117880814825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/6197354117880814825'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/09/error-resilience-in-compressed-data.html' title='Error Resilience in Compressed Data'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-1878573513235712057</id><published>2008-09-09T02:02:00.004+02:00</published><updated>2008-10-05T23:21:02.589+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><title type='text'>Kompresja danych</title><content type='html'>Zakupiłem ostatnio książkę &lt;a href="http://www.ire.pw.edu.pl/~arturp/"&gt;Artura Przelaskowskiego&lt;/a&gt; "Kompresja danych" (BTC 2005). To co do tej pory przeczytałem robi bardzo dobre wrażenie, wydaje mi się jakoś bardziej przyjazne od "Wprowadzenie do kompresji" &lt;a href="http://www.mathcs.duq.edu/drozdek/"&gt;Adama Drozdka&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Jednakże jednej rzeczy mi brakuje: &lt;b&gt;indeksu&lt;/b&gt;; to naprawdę ważna rzecz dla czytelnika, kiedy często sięga po pozycję. Poza tym wydaje mi się, że rezygnacja z wcięć akapitowych ekstrawagancka jest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-1878573513235712057?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/1878573513235712057/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=1878573513235712057' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1878573513235712057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1878573513235712057'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/09/kompresja-danych.html' title='Kompresja danych'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8647849652175509332</id><published>2008-09-05T19:19:00.003+02:00</published><updated>2008-09-22T21:34:01.992+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><title type='text'>Informatyka na Wikipedii</title><content type='html'>Kiedy w 2003 roku trafiłem na polską Wikipedię, był to projekt raczkujący, ledwie 20 tysięcy haseł (teraz 500 tysięcy i rośnie!). Wówczas wyczytałem na stronie jednej z osób, że jest informatykiem, ale zajmuje się innymi dziedzinami, bo "informatyka jest wyeksploatowana". To oczywista bzdura była i niestety jest nadal. Informatyka to bardzo zapuszczona działka. Przedwczoraj poprawiłem nieco hasło &lt;a href="http://pl.wikipedia.org/wiki/W%C4%85tek_(informatyka)"&gt;&lt;b&gt;wątek&lt;/b&gt;&lt;/a&gt; - jego wcześniejsza wersja absolutnie nie dawała odpowiedzi na pytanie "czym jest wątek?". Nawet osoba, która raz w życiu napisała prosty program i od czasu do czasu "grepuje gzipy" nie byłaby w stanie skumać OCB, a cóż dopiero zwykły człowiek.&lt;br /&gt;&lt;br /&gt;Moim marzeniem są hasła przystępnie napisane zarówno dla praktyków, teoretyków jak również zwykłych czytelników. Żeby ten ostatni przeczytał i mniej więcej wiedział czym jest to, o czym czytał, praktyk żeby widział jakie są podstawy teoretyczne, a teoretyk jakie zastosowania praktyczne.&lt;br /&gt;&lt;br /&gt;Już niedługo Jerzy Ludwichowski poprowadzi dyskusję na konferencji Polskiego Towarzystwa Informatycznego właśnie na ten temat. Mam nadzieję, że m.in. dzięki temu Wikipedia przyciągnie większą liczbę profesjonalistów, nauczycieli akademickich, ażeby nasze wspólne dzieło było jak najlepsze.&lt;br /&gt;&lt;br /&gt;BTW to ostatnie brzmi jak wyimek z manifestu Marksa, ale po prawdzie Wikipedia to najlepszy przykład an-archistycznego projektu.  Wyobraźcie sobie jak wyglądałaby Wikipedia, gdyby w rządzie był minister do spraw Wikipedii, zaś budżet finansował serwery. Wyglądałoby to pewnie jak Polska Biblioteka Internetowa - 3 miliony złotych w plecy, bo funkcjonalność na poziomie Web 0,0001, zasoby biedne, skany kulawe. A na moje pytania ile w tym roku MSWiA wydało na PBI ministerialne biurwy nie odpowiedziały.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8647849652175509332?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8647849652175509332/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8647849652175509332' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8647849652175509332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8647849652175509332'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/09/informatyka-na-wikipedii.html' title='Informatyka na Wikipedii'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8224267654844896745</id><published>2008-08-30T22:04:00.003+02:00</published><updated>2008-10-18T16:47:10.488+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><category scheme='http://www.blogger.com/atom/ns#' term='data compression'/><title type='text'>LZP - metoda kompresji</title><content type='html'>Jeśli kiedyś będziecie potrzebowali wiedzieć jak działa algorytm LZP, to na coraz  bardziej niezawodnej &lt;a href="http://pl.wikipedia.org/wiki/LZP"&gt;Wikipedii&lt;/a&gt; znajdziecie. Dla stron polskich G**gle zwraca 10 stron na krzyż.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8224267654844896745?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8224267654844896745/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8224267654844896745' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8224267654844896745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8224267654844896745'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/08/lzp-metoda-kompresji.html' title='LZP - metoda kompresji'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-4616223064569118115</id><published>2008-08-26T21:36:00.013+02:00</published><updated>2008-10-07T01:53:57.998+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='znaleziska'/><category scheme='http://www.blogger.com/atom/ns#' term='polish'/><title type='text'>Bylejakość</title><content type='html'>Na pewnej popularnej stronie dla programistów  czytamy (przez litość nie podaję linku):&lt;br /&gt;&lt;blockquote&gt;Krzywa Beziera to krzywa wielomianowa trzeciego stopnia, czyli taka która może być definiowana za pomocą trzech wielomianów (odpowiednio dla współrzędnych x, y i z) z pewnym parametrem t.&lt;br /&gt;&lt;/blockquote&gt;Ludzie, co za kosmiczne bzdury! Wielomianowa krzywa Beziera nie ma ograniczonego stopnia, stopień wielomianów może być dowolny. Sama zaś krzywa Beziera jest krzywą &lt;b&gt;parametryczną&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Z tego tekstu wynika, że liczba wielomianów potrzebnych do określenia krzywej jest równa stopniu wielomianu -- tak oczywiście nie jest. Liczba wielomianów zależy od liczby wymiarów przestrzeni w której określana jest krzywa, wielomiany mogą być dowolnego stopnia; np. można mieć krzywą przestrzenną (czyli 3 wielomiany) ale wielomiany stopnia 125.&lt;br /&gt;&lt;br /&gt;Dalej, co to znaczy "wielomiany z pewnym parametrem"? Ja pamiętam jeszcze ze szkoły średniej zadania w rodzaju "dla jakiego parametru c wielomian &lt;i&gt;jakiśtam&lt;/i&gt; nie ma pierwiastków", ale tutaj rzecz jasna nie chodzi o to. Mowa oczywiście o wielomianach jednej zmiennej, zwyczajowo argument jest tutaj oznaczany literką 't', a nie 'x' jak się przyzwyczailiśmy.&lt;br /&gt;&lt;br /&gt;Dalej jest jeszcze jeden cymes:&lt;br /&gt;&lt;blockquote&gt;Krzywe trzeciego stopnia są również krzywymi najniższego stopnia, które nie leżą w jednej płaszczyźnie w 3D.&lt;br /&gt;&lt;/blockquote&gt;Czyli, że co -- nie można określić w przestrzeni krzywej trzeciego stopnia, która leżałaby na płaszczyźnie? (Odpowiedź brzmi oczywiście: nie, na całe szczęście można). A poza tym "w jednej płaszczyźnie" -- ale z czym? Bez sensu kompletnie. O co więc chodzi: krzywa 3-stopnia opisywana jest 4 punktami kontrolnymi, i taka liczba punktów może być niewspółpłaszczyznowa, a co za tym idzie krzywa nie będzie płaska.&lt;br /&gt;&lt;br /&gt;Dlaczego o tym piszę? Bo razi mnie taka bylejakość, a poza tym lubię się czasem przypieprzyć; na Wikipedii taki tekst by &lt;strike&gt;chyba&lt;/strike&gt; &lt;b&gt;na pewno&lt;/b&gt; nie przeszedł (z resztą mamy na wiki całkiem nieźle opracowany temat krzywych i powierzchni Beziera).&lt;br /&gt;&lt;br /&gt;27.08.2008 - dwie drobne poprawki&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-4616223064569118115?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/4616223064569118115/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=4616223064569118115' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/4616223064569118115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/4616223064569118115'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/08/bylejako.html' title='Bylejakość'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-8154198779569804913</id><published>2008-08-24T13:52:00.007+02:00</published><updated>2008-08-24T15:03:54.070+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dreams'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Wrap me!</title><content type='html'>Inheritance is fundamental way of creating new types in OOP.  Apart of this, there is another important technique: &lt;b&gt;composition&lt;/b&gt;, using many object to create higher level objects that provide interface to selected members of component objects.  Inheritance is supported by many languages at syntax level, &lt;b&gt;composition&lt;/b&gt; -- not!&lt;br /&gt;&lt;br /&gt;Consider simple (real-world) example: we have GUI objects -- static label, and list box, we want another widget, labeled list box, a composition of these two simple widgets.  We have to write tons of wrappers, that just call label or list methods.  Here is example (C++):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Label {&lt;br /&gt; public:&lt;br /&gt;  void set_text(string s);&lt;br /&gt;  string get_text();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class ListBox {&lt;br /&gt; public:&lt;br /&gt;  void   clear();&lt;br /&gt;  int    add_item(string s, bool uppercase);&lt;br /&gt;  string get_item(int index);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class LabeledListBox {&lt;br /&gt; public:&lt;br /&gt;  void   set_label(string s) {label.set_text(s);}&lt;br /&gt;  string get_label() {return label.get_text();}&lt;br /&gt;&lt;br /&gt;  void   clear() {box.clear();}&lt;br /&gt;  int    add_item(string s) {return box.add_item(s, false);}&lt;br /&gt;  int    add_item_uppercase(string s) {return box.add_item(s, true);}&lt;br /&gt;  string get_item(int index) {return box.get_item(inex);}&lt;br /&gt; private:&lt;br /&gt;  Label label;&lt;br /&gt;  ListBox box;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course C++ compiler is able to inline LabeledListBox methods, but programmer have to write many lines of code that merely call another methods.  He must know types of arguments, returned values and other.  And if some class is changed, he must update classes that use this one.  He must maintain all these stupid wrappers.  &lt;b&gt;Wrappers are evil&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Wrappers are so frequently used in programming, that I'm still don't know why syntax of popular languages do not reflect this state.  This is my view of syntax, but I hope shows the intention -- simple things should remain simple on screen:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class LabeledListBox {&lt;br /&gt; public:&lt;br /&gt;  method set_label is label.set_text; // rename&lt;br /&gt;  method get_label is label.get_text; // rename&lt;br /&gt;&lt;br /&gt;  method clear, get_item from box; // publish two methods of box object&lt;br /&gt;  method add_item is box.add_item with uppercase=false;  // create simple wrappers&lt;br /&gt;  method add_item_upperacase is box.add_item with uppercase=true; // with default arguments set to const&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;  Label label;&lt;br /&gt;  ListBox box;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-8154198779569804913?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/8154198779569804913/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=8154198779569804913' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8154198779569804913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/8154198779569804913'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/08/wrap-me.html' title='Wrap me!'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7613132097101667394</id><published>2008-08-19T20:06:00.005+02:00</published><updated>2008-10-18T16:45:54.430+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>Coroutines in C++</title><content type='html'>What a surprise, there is a &lt;b&gt;portable&lt;/b&gt; &lt;a href="http://www.akira.ruc.dk/~keld/"&gt;library&lt;/a&gt; for &lt;a href="http://en.wikipedia.org/wiki/coroutine"&gt;coroutines&lt;/a&gt; written 9 years ago by   &lt;b&gt;Keld Helsgaun&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Today I compiled some examples using gcc (MinGW) and seems to work!  Great!  I will try to explore this library and show some additional examples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7613132097101667394?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7613132097101667394/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7613132097101667394' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7613132097101667394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7613132097101667394'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/08/coroutines-in-c.html' title='Coroutines in C++'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-7853955443555942548</id><published>2008-08-15T18:58:00.004+02:00</published><updated>2008-08-15T19:53:29.697+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dreams'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>More constraints, please</title><content type='html'>In C++ classes have public, protected and private members. Variable member can be also declared as &lt;tt&gt;const&lt;/tt&gt; or &lt;tt&gt;static const&lt;/tt&gt; and it make such member read-only.&lt;br /&gt;&lt;br /&gt;But it would be really great if we can select level of protection, and declare that some variable is &lt;tt&gt;const&lt;/tt&gt; only when accessed at public or protected level.  Here is a sample:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class C1 { // C++ - present&lt;br /&gt; public:&lt;br /&gt;  void foo_x() { /* do some magic with x */ x = 5; }&lt;br /&gt;  int get_x() const { return x;}&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;  int x;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class C2 { // C++ - future?&lt;br /&gt; public:&lt;br /&gt;  void foo_x() { /* do some magic with x */ x = 5; }&lt;br /&gt; &lt;br /&gt; public &lt;b&gt;const&lt;/b&gt;:&lt;br /&gt;  int x;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Member &lt;tt&gt;x&lt;/tt&gt; can be freely read/write within C2 member functions, but when accessed from outside, &lt;tt&gt;x&lt;/tt&gt; is read only.&lt;br /&gt;&lt;br /&gt;This is not as powerful as Borland's extension &lt;tt&gt;__property&lt;/tt&gt;, which allow to declare property as alias for member variable, or setup getter/setter for a property. However I think proposed extension wouldn't bring much work for compilers authors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-7853955443555942548?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/7853955443555942548/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=7853955443555942548' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7853955443555942548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/7853955443555942548'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/08/more-constraints-please.html' title='More constraints, please'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-1593704261522275431</id><published>2008-08-13T09:52:00.003+02:00</published><updated>2008-08-27T19:18:54.775+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dreams'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><title type='text'>With C++</title><content type='html'>C++ has lack of everything useful, you won't find local functions for example. But I really miss Pascal &lt;tt&gt;with&lt;/tt&gt; statement. I know people say that would confuse programmer or even compiler. Wait! Pascal programmers were not confused, Pascal compilers were able to deal with this. Moreover, C++ programmers are not confused with tons of nested name spaces, crazy visibility rules and other odds.&lt;br /&gt;&lt;br /&gt;Here is a snippet from my program:&lt;br /&gt;&lt;pre&gt;for (unsigned i=0; i &amp;lt; data.measure_dist.size(); i++)&lt;br /&gt;  if (data.measure_dist[i].active)&lt;br /&gt;     find_crosspoints(&lt;br /&gt;         data.measure_dist[i].point_1,&lt;br /&gt;         data.measure_dist[i].point_2,&lt;br /&gt;         outline,&lt;br /&gt;         data.measure_dist[i].crosspoints&lt;br /&gt;     );&lt;br /&gt;&lt;/pre&gt;Using with would make this much clearer:&lt;br /&gt;&lt;pre&gt;for (unsigned i=0; i &amp;lt; data.measure_dist.size(); i++)&lt;br /&gt;  with (data.measure_dist[i]) {&lt;br /&gt;     if (active)&lt;br /&gt;         find_crosspoints(point_1, point_2, outline, crosspoints);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;Does anybody confused about this code? Does anybody don't know what above code do? I don't think so.&lt;br /&gt;&lt;br /&gt;Lets continue. With could also accept more complex syntax and allow temporary rename different entities. This (inefficient!) code finds all intersection between two sets of segments:&lt;br /&gt;&lt;pre&gt;double u, v; // parameters, lerp(A, B, u) = A + u*(B-A)&lt;br /&gt;for (int i=0; i &amp;lt; data.points.inner.size() - 1; i++)&lt;br /&gt;  for (int j=0; j &amp;lt; data.points.outer.size() - 1; j++) {&lt;br /&gt;      bool b = intersection(&lt;br /&gt;          data.outline.inner[i],&lt;br /&gt;          data.outline.inner[i+1],&lt;br /&gt;          data.outline.outer[j],&lt;br /&gt;          data.outline.outer[j+1],&lt;br /&gt;          u, v);&lt;br /&gt;&lt;br /&gt;      if (b)&lt;br /&gt;          crosspoints.add(lerp(data.outline.inner[i], data.outline.inner[i+1], u));&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;Now compare with following code:&lt;br /&gt;&lt;pre&gt;double u, v;&lt;br /&gt;with (data.points) {&lt;br /&gt;  with (inner as A, outer as B) {&lt;br /&gt;      for (int i=0; i &amp;lt; A.size() - 1; i++)&lt;br /&gt;          for (int j=0; j &amp;lt; B.size() - 1; j++)&lt;br /&gt;              if (intersection(A[i], A[i+1], B[i], B[i+1]))&lt;br /&gt;                  crosspoints.add(lerp(A[i], A[i+1], u));&lt;br /&gt;      }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Code is easier, cleaner, compacted. In next posts I will show some other ideas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-1593704261522275431?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/1593704261522275431/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=1593704261522275431' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1593704261522275431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/1593704261522275431'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/08/with-c.html' title='With C++'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry><entry><id>tag:blogger.com,1999:blog-4900486588862577097.post-3924470686812924367</id><published>2008-08-11T00:38:00.000+02:00</published><updated>2008-08-11T00:52:11.668+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='demoscene'/><title type='text'>demoscene.tv</title><content type='html'>For a years I was big fan of demoscene. When I was young, demos and intros (some watched over and over, like "Jizz" by TBL) pushed me to learn many new things; moreover I still like to listen demoscene music; for example tracks from music disc "Ambrozia" released by group Pulse around 10 years ago still sound nice.&lt;br /&gt;&lt;br /&gt;Now youtube is full of old and new demos uploaded by Good People. But on the net there are Much Better Good People, who created &lt;a href="http://demoscene.tv"&gt;http://demoscene.tv&lt;/a&gt; - you can watch demos in high quality, yeah. BTW I love "Photon" by Purple.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4900486588862577097-3924470686812924367?l=wmula.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wmula.blogspot.com/feeds/3924470686812924367/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4900486588862577097&amp;postID=3924470686812924367' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/3924470686812924367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4900486588862577097/posts/default/3924470686812924367'/><link rel='alternate' type='text/html' href='http://wmula.blogspot.com/2008/08/demoscenetv.html' title='demoscene.tv'/><author><name>Wojciech Muła</name><uri>http://www.blogger.com/profile/08330413422626283672</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></entry></feed>
