<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Bluish Coder: erlang</title>
 <link href="http://bluishcoder.co.nz/tag/erlang/atom.xml" rel="self"/>
 <link href="http://bluishcoder.co.nz/"/>
 <updated>2018-12-17T08:49:52+13:00</updated>
 <id>http://bluishcoder.co.nz/</id>
 <author>
   <name>Bluishcoder</name>
   <email>admin@bluishcoder.co.nz</email>
 </author>

 
 <entry>
   <title>Building Erlang for Android</title>
   <link href="http://bluishcoder.co.nz/2015/06/21/building-erlang-for-android.html"/>
   <updated>2015-06-21T19:00:00+12:00</updated>
   <id>http://bluishcoder.co.nz/2015/06/21/building-erlang-for-android</id>
   <content type="html">&lt;p&gt;Support for building &lt;a href=&quot;http://www.erlang.org/&quot;&gt;Erlang&lt;/a&gt; on Android is provided in the standard Erlang source.&lt;/p&gt;

&lt;h2&gt;Build setup&lt;/h2&gt;

&lt;p&gt;I use the &lt;a href=&quot;https://github.com/erlang/otp&quot;&gt;Erlang git version&lt;/a&gt; for building. Cloning can be done with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone https://github.com/erlang/otp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In the &lt;a href=&quot;https://github.com/erlang/otp/tree/maint/xcomp&quot;&gt;xcomp&lt;/a&gt; directory of the cloned repository there is an &lt;a href=&quot;https://github.com/erlang/otp/blob/maint/xcomp/erl-xcomp-arm-android.conf&quot;&gt;erl-xcomp-arm-android.conf&lt;/a&gt; file that contains details for cross compiling to Android. This can be modified per the instructions in the &lt;a href=&quot;http://www.erlang.org/doc/installation_guide/INSTALL-CROSS.html&quot;&gt;Erlang cross compilation documentation&lt;/a&gt; but the defaults are probably fine.&lt;/p&gt;

&lt;p&gt;Some environment variables need to be set to locate the Android NDK:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export NDK_ROOT=/path/to/ndk/root
export NDK_PLAT=android-21
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;NDK_PLAT&lt;/code&gt; environment variable identifies the Android API version to use for building. In this case &lt;code&gt;android-21&lt;/code&gt; is for KitKat (See &lt;a href=&quot;https://developer.android.com/guide/topics/manifest/uses-sdk-element.html&quot;&gt;STABLE-APIS.html&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Add the path to the Android version of the &lt;code&gt;gcc&lt;/code&gt; compiler:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export PATH=$PATH:$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When building from the git repository an initial step of generating configuration files needs to be done. This requires &lt;code&gt;autoconf&lt;/code&gt; version 2.59. If &lt;code&gt;autoconf2.59&lt;/code&gt; is the command to run this version you may need to change some symlinks or defaults for your OS or you can edit the &lt;a href=&quot;https://github.com/erlang/otp/blob/maint/otp_build&quot;&gt;otp_build&lt;/a&gt; file to replace occurences of &lt;code&gt;autoconf&lt;/code&gt; with &lt;code&gt;autoconf2.59&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Building&lt;/h2&gt;

&lt;p&gt;Building from git requires generating build configuration files first:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./otp_build autoconf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once generated, run the configure step. This will configure both a host version of Erlang for bootstrapping and the Android version:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./otp_build configure --xcomp-conf=xcomp/erl-xcomp-arm-android.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Build a bootstrap system of Erlang for the host machine, followed by one for the Android target:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./otp_build boot -a
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Installing&lt;/h2&gt;

&lt;p&gt;Installing to an Android device involves running a build step to copy the files to a temporary directory, run a script to change paths to the directory where the installation will be on the Android device and pushing the final result to the device.&lt;/p&gt;

&lt;p&gt;In the following series of commands I use &lt;code&gt;/tmp/erlang&lt;/code&gt; as the temporary directory on the host system and &lt;code&gt;/data/local/tmp/erlang&lt;/code&gt; as the install directory on the Android device. The directory &lt;code&gt;/data/local/tmp&lt;/code&gt; is writable on non-rooted Android KitKat devices. It&#39;s useful for testing.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./otp_build release -a /tmp/erlang
cd /tmp/erlang
./Install -cross -minimal /data/local/tmp/erlang
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;One of the files &lt;code&gt;bin/epmd&lt;/code&gt; is a symlink which &lt;code&gt;adb push&lt;/code&gt; has problems with. For the copying of the files below I delete the file and manually recreate the symlink after the push:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;adb shell mkdir /data/local/tmp/erlang
cd /tmp
rm erlang/bin/epmd
adb push erlang /data/local/tmp/erlang/
adb shell ln -s /data/local/tmp/erlang/erts-6.4.1/bin/epmd \
                /data/local/tmp/erlang/bin/epmd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;adb&lt;/code&gt; commands assume the device is already connected and can be accessed via &lt;code&gt;adb&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Running&lt;/h2&gt;

&lt;p&gt;Once the final push completes Erlang can be run via &lt;code&gt;adb shell&lt;/code&gt; or a terminal application on the device:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ adb shell
$ cd /data/local/tmp/erlang
$ sh bin/erl    
Eshell V6.4.1  (abort with ^G)
1&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You may get an error about &lt;code&gt;sed&lt;/code&gt; not being found. This is due to a &lt;code&gt;sed&lt;/code&gt; command run on the first argument of the &lt;code&gt;erl&lt;/code&gt; shell script. A workaround for this is to build an Android version of &lt;code&gt;sed&lt;/code&gt; and install it along with Erlang.&lt;/p&gt;

&lt;h2&gt;Networking&lt;/h2&gt;

&lt;p&gt;I&#39;ve tested with some basic Erlang functionality and it works fine. Some tweaks need to be made for networking however. The method Erlang uses for DNS lookup doesn&#39;t work on Android. By default it&#39;s using native system calls. With a configuration file it can be changed to use its own internal DNS method. Create a file with the following contents:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{lookup, [file,dns]}.
{nameserver, {8,8,8,8}}.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In this case the nameserver for DNS lookups is hardcoded to Google&#39;s DNS. Ideally this would be looked up somehow using Android functionality for whatever is configured on the phone but this works for test cases. Push this file to the device and run &lt;code&gt;erl&lt;/code&gt; with it passed as an argument like so (&lt;code&gt;inetrc&lt;/code&gt; is the name I used for the file in this case):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ adb push inetrc /data/local/tmp/erlang/
$ adb shell
$ cd/data/local/tmp/erlang
$ sh bin/erl -kernel inetrc &#39;&quot;./inetrc&quot;&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Network examples should now work:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1&amp;gt; inets:start().
ok
2&amp;gt; inet_res:getbyname(&quot;www.example.com&quot;,a).
{ok,{hostent,&quot;www.example.com&quot;,[],inet,4,[{93,184,216,34}]}}
3&amp;gt; httpc:request(get, {&quot;http://bluishcoder.co.nz/index.html&quot;, []}, [], []).
{ok,...}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;More information on the &lt;code&gt;inetrc&lt;/code&gt; file format is available &lt;a href=&quot;http://www.erlang.org/doc/apps/erts/inet_cfg.html&quot;&gt;in the Erlang documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;This showed that a basic installation of Erlang works on Android. I&#39;ve also tested on a Firefox OS phone with root access. An interesting project would be to install Erlang on either a Firefox OS or an Android AOSP build as a system service and write phone services in Erlang as a test for an Erlang based device.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Erlang on the OpenMoko Cellphone</title>
   <link href="http://bluishcoder.co.nz/2007/09/16/erlang-on-openmoko-cellphone.html"/>
   <updated>2007-09-16T15:32:00+12:00</updated>
   <id>http://bluishcoder.co.nz/2007/09/16/erlang-on-openmoko-cellphone</id>
   <content type="html">&lt;p&gt;Tony Garnock-Jones has got &lt;a href=&quot;http://www.lshift.net/blog/2007/09/16/erlang-on-neo1973-cellphone&quot;&gt;Erlang running on the OpenMoko phone&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Running the interactive erlang shell on a cellphone is pretty cool. Erlang&#39;s
built-in clustering support works fine: I&#39;ve successfully connected an erlang
node on my pc to a node on the phone using the USB ethernet support the phone
provides.&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Erlang and Mobile Phones</title>
   <link href="http://bluishcoder.co.nz/2007/01/05/erlang-and-mobile-phones.html"/>
   <updated>2007-01-05T14:55:00+13:00</updated>
   <id>http://bluishcoder.co.nz/2007/01/05/erlang-and-mobile-phones</id>
   <content type="html">&lt;p&gt;Luke Gorrie has &lt;a href=&quot;http://lukego.livejournal.com/&quot;&gt;started a new weblog&lt;/a&gt; and he&#39;s posting about his experiences learning Squeak Smalltalk. In his &lt;a href=&quot;http://lukego.livejournal.com/765.html&quot;&gt;first post to the weblog&lt;/a&gt; he mentions what he&#39;s been working on the past couple of years:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The past couple of years I&#39;ve instead worked really hard with some friends to
build up a happy little Erlang company with an office where we drink our
coffee. We&#39;ve developed and marketed a system for mobile phone companies to
keep track of all the mobile phones their customers are using and to
automatically send configurations for picture messaging, web browsing, and so
on. We&#39;ve installed these systems in over 60 countries and have more than 200
million of you puny humans represented in our Mnesia databases. We&#39;re the
market leaders and have only a fraction of our competitors&#39; staff size, but
of course you guessed this when I said &quot;Erlang&quot;. :-)&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Trapexit is back</title>
   <link href="http://bluishcoder.co.nz/2006/07/19/trapexit-is-back.html"/>
   <updated>2006-07-19T15:00:00+12:00</updated>
   <id>http://bluishcoder.co.nz/2006/07/19/trapexit-is-back</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.trapexit.org/&quot;&gt;Trapexit&lt;/a&gt;, one of the best Erlang resource websites is back in action. The &lt;a href=&quot;http://forum.trapexit.org/&quot;&gt;forum on trapexit&lt;/a&gt; mirrors the Erlang mailing list and has a much better search mechanism  it&#39;s a great resource and I missed it while Trapexit was down. &lt;a href=&quot;http://forum.trapexit.org/viewtopic.php?t=5828&quot;&gt;Announcement of Trapexit coming back is here&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lightweight Erlang with Package Management</title>
   <link href="http://bluishcoder.co.nz/2006/07/01/lightweight-erlang-with-package.html"/>
   <updated>2006-07-01T15:32:00+12:00</updated>
   <id>http://bluishcoder.co.nz/2006/07/01/lightweight-erlang-with-package</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.erlang.org/ml-archive/erlang-questions/200607/msg00000.html&quot;&gt;A post&lt;/a&gt; on the Erlang mailing points to a &lt;a href=&quot;http://erlrt.process-one.net/?page=index&quot;&gt;lightweight distribution of Erlang&lt;/a&gt; with package management facilities to enable installing extra functionality.&lt;/p&gt;

&lt;p&gt;The first install is a 1.4MB file which expands to 3MB. This is compares favourably to a &lt;a href=&quot;http://www.erlang.org/download.html&quot;&gt;full Erlang installation&lt;/a&gt; of 35MB (for the windows download).&lt;/p&gt;

&lt;p&gt;Functions are included to list, install, remove and upgrade packages.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Little Smalltalk and Javascript for Minix</title>
   <link href="http://bluishcoder.co.nz/2006/06/22/little-smalltalk-and-javascript-for.html"/>
   <updated>2006-06-22T01:17:00+12:00</updated>
   <id>http://bluishcoder.co.nz/2006/06/22/little-smalltalk-and-javascript-for</id>
   <content type="html">&lt;p&gt;I&#39;ve been working on porting some small programs to Minix to get familiar with what&#39;s required for ports. From there I hope to get some bigger stuff working that I really want to use like &lt;a href=&quot;http://www.factorcode.org/&quot;&gt;Factor&lt;/a&gt; and &lt;a href=&quot;http://www.erlang.org/&quot;&gt;Erlang&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So far I have &lt;a href=&quot;http://www.minixtips.com/2006/06/little-smalltalk-for-minix-3.html&quot;&gt;Little Smalltalk&lt;/a&gt; working (including the web based class browser and editor) and &lt;a href=&quot;http://www.minixtips.com/2006/06/spidermonkey-javascript-for-minix.html&quot;&gt;SpiderMonkey Javascript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Porting is a little bit painful as there&#39;s quite a few things different under Minix. Eventually I want to try and develop some simple device drivers using these languages to see if the idea of &lt;a href=&quot;http://bluishcoder.co.nz/2006/06/minix-and-haskell.html&quot;&gt;user space device drivers in alternate languages&lt;/a&gt; is workable.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>HTML Template Languages</title>
   <link href="http://bluishcoder.co.nz/2006/06/20/html-template-languages.html"/>
   <updated>2006-06-20T11:56:00+12:00</updated>
   <id>http://bluishcoder.co.nz/2006/06/20/html-template-languages</id>
   <content type="html">&lt;p&gt;There&#39;s a discussion going on in the Erlang mailing list about &lt;a href=&quot;http://www.erlang.org/ml-archive/erlang-questions/200606/msg00328.html&quot;&gt;HTML template engines&lt;/a&gt;. This is JSP-style definition of HTML pages with portions replaced dynamically with data from an application.&lt;/p&gt;

&lt;p&gt;I&#39;ve leaned towards building HTML pages in code using Lisp style S-expressions for HTML, or Seaside style building of pages. This is also the approach I took in building the Factor continuation based web server and examples.&lt;/p&gt;

&lt;p&gt;For the recent Factor program I built I wanted to use a template engine though. It was a bigger program and it was easier to modify templates and see the change automatically. For that I used an engine that another contributer had provided which allowed embedded Factor code.&lt;/p&gt;

&lt;p&gt;The mailing list post pointed to a paper called &#39;&lt;a href=&quot;http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf&quot;&gt;Enforcing Strict Model-View Separation in Template Engines&lt;/a&gt;&#39; which describes limiting the power of a template engine to prevent developers from embedding to much application logic in the template page. I was dubious but the paper is quite convincing.&lt;/p&gt;

&lt;p&gt;It mentions &#39;&lt;a href=&quot;http://www.stringtemplate.org/&quot;&gt;StringTemplate&lt;/a&gt;&#39;, an engine built on these ideas. I&#39;m still looking for a good way of doing templates in Factor, Erlang, and other languages, so this might be a good source of ideas.&lt;/p&gt;

&lt;p&gt;If anyone has pointers to other articles or ideas on the topics please feel free to leave a comment or email me.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Real-time Wiki</title>
   <link href="http://bluishcoder.co.nz/2006/06/15/real-time-wiki.html"/>
   <updated>2006-06-15T16:24:00+12:00</updated>
   <id>http://bluishcoder.co.nz/2006/06/15/real-time-wiki</id>
   <content type="html">&lt;p&gt;From the &lt;a href=&quot;http://www.erlang.org/ml-archive/erlang-questions/200606/msg00342.html&quot;&gt;Erlang mailing list&lt;/a&gt; comes a pointer to &#39;&lt;a href=&quot;http://wiki.jabber.org/index.php/Real-time_wiki&quot;&gt;Real-time Wiki&lt;/a&gt;&#39;.&lt;/p&gt;

&lt;p&gt;It&#39;s a Google Summer of Code project that allows using XMPP (ie. Jabber) from a browser based client. Values can be changed from the server and the change is broadcast to the clients and instantly updated. It seems that the application for this is a Wiki that updates automatically when others change it.&lt;/p&gt;

&lt;p&gt;The implementation on the server side uses &lt;a href=&quot;http://ejabberd.jabber.ru/&quot;&gt;ejabberd&lt;/a&gt;, a Jabber server written in Erlang.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Handling X-Forwarded-For in Yaws</title>
   <link href="http://bluishcoder.co.nz/2006/05/25/handling-x-forwarded-for-in-yaws.html"/>
   <updated>2006-05-25T01:44:00+12:00</updated>
   <id>http://bluishcoder.co.nz/2006/05/25/handling-x-forwarded-for-in-yaws</id>
   <content type="html">&lt;p&gt;I run a &lt;a href=&quot;http://yaws.hyber.org/&quot;&gt;Yaws&lt;/a&gt; webserver behind a &lt;a href=&quot;http://www.apsis.ch/pound/&quot;&gt;Pound&lt;/a&gt; proxy. This works really well but all the IP addresses logged by Yaws appear as the localhost (127.0.0.1). This is due to Yaws picking up the IP address of the proxy as it forwards the request.&lt;/p&gt;

&lt;p&gt;Pound sends the original IP address as a header in the HTTP request called X-Forwarded-For. This finally bugged me enough to modify Yaws to display the X-Forwarded-For IP address if the header was there, otherwise display the normal IP address.&lt;/p&gt;

&lt;p&gt;The &#39;quick hack&#39; change was quite simple. I modified the &lt;code&gt;include/yaws_api.hrl&lt;/code&gt; file to add &lt;code&gt;x_fowarded_for&lt;/code&gt; to the &lt;code&gt;headers&lt;/code&gt; record:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-record(headers, {
   connection,
   accept,
   host,
   if_modified_since,
   if_match,
   if_none_match,
   if_range,
   if_unmodified_since,
   range,
   referer,
   user_agent,
   accept_ranges,
   cookie = [],
   keep_alive,
   location,
   content_length,
   content_type,
   content_encoding,
   authorization,
   transfer_encoding,
   x_forwarded_for,
   other = []   %% misc other headers
  }).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The idea being that this value will be set by Yaws when it first parses the HTTP request headers.  This is done by modifying the http_collect_headers function in &#39;src/yaws.erl&#39; to contain the following code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{ok, {http_header, _Num, &#39;X-Forwarded-For&#39;,_, X}} -&amp;gt;
     http_collect_headers(CliSock, Req, H#headers{x_forwarded_for = X},SSL)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This was basically a copy and paste of the way the other headers are handled. In the code that handles the logging I just check for the header and output the IP address if it is there, otherwise use the IP address from the request itself. This is done by a helper function I added to &lt;code&gt;src/yaws_server.erl&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;x_forwarded_for_or_ip(Ip, Item)-&amp;gt;
    case Item of
        undefined -&amp;gt; Ip;
        Item -&amp;gt; yaws:parse_ip(Item)
    end.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &#39;Item&#39; passed to this function is the &lt;code&gt;x_forwarded_for&lt;/code&gt; element of the &#39;headers&#39; record. If the &#39;X-Forwarded-For&#39; header exists I parse the string into an IP address using &lt;code&gt;yaws:parse_ip/1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;All that remains is to change the &lt;code&gt;maybe_access_log/3&lt;/code&gt; in &lt;code&gt;src/yaws_server.erl&lt;/code&gt; to call this helper function:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;     TrueIp = x_forwarded_for_or_ip(Ip, H#headers.x_forwarded_for),
     yaws_log:accesslog(SC#sconf.servername, TrueIp, User,
          [Meth, $\s, Path, $\s, Ver], 
          Status, Len, Referrer, UserAgent);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now all my IP&#39;s appear correctly forwarded from Pound in the Yaws server.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Erlang SMP Benchmarks</title>
   <link href="http://bluishcoder.co.nz/2006/03/10/erlang-smp-benchmarks.html"/>
   <updated>2006-03-10T08:01:00+13:00</updated>
   <id>http://bluishcoder.co.nz/2006/03/10/erlang-smp-benchmarks</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.erlang-stuff.net/blog/&quot;&gt;Joe Armstrong has started a weblog&lt;/a&gt; and on it he has &lt;a href=&quot;http://www.erlang-stuff.net/wordpress/?p=14&quot;&gt;posted results&lt;/a&gt; of some testing of the &lt;a href=&quot;http://bluishcoder.co.nz/2006/03/erlang-smp-support.html&quot;&gt;Erlang SMP snapshot&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Program 1 spawned N (typically 1000) processes on 4 processors. Each process
then pings all the other processes. This an 3.6 times faster on 4 CPUs than
on a single CPU.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Program 2 is a SIP stack - this ran 1.8 times faster on 4 processors than on
1 processor.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;These result are pretty good - to start with the Erlang system is
unoptimized, as is the application. Despite this fact the application runs
almost twice as fast on a four CPU system as it ran on a single CPU system.&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 
</feed>
