<?xml version="1.0"?>
<rdf:RDF
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns="http://purl.org/rss/1.0/"
>
<channel rdf:about="http://planet.ocamlcore.org">
	<title>OCamlcore Planet</title>
	<link>http://planet.ocamlcore.org</link>
	<description>OCamlcore Planet - http://planet.ocamlcore.org</description>

	<items>
		<rdf:Seq>
			<rdf:li rdf:resource="https://forge.ocamlcore.org/projects/ocaml-sfml/" />
			<rdf:li rdf:resource="http://blog.camlcity.org/blog/ocamlnet3_release.html" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-5888658295182480819.post-7074949462450985008" />
			<rdf:li rdf:resource="tag:le-gall.net,2010-09-01:/sylvain+violaine/blog/64" />
			<rdf:li rdf:resource="http://forge.ocamlcore.org/forum/forum.php?forum_id=665" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-1445545651031573301.post-1791120058389526317" />
			<rdf:li rdf:resource="tag:le-gall.net,2010-08-26:/sylvain+violaine/blog/63" />
			<rdf:li rdf:resource="http://ocaml.janestcapital.com/83 at http://ocaml.janestcapital.com" />
			<rdf:li rdf:resource="http://caml.inria.fr/cgi-bin/hump.cgi?contrib=643" />
			<rdf:li rdf:resource="http://caml.inria.fr/cgi-bin/hump.cgi?contrib=294" />
		</rdf:Seq>
	</items>
</channel>

<item rdf:about="https://forge.ocamlcore.org/projects/ocaml-sfml/">
	<title>OCamlCore Forge Projects: ocaml-sfml</title>
	<link>https://forge.ocamlcore.org/projects/ocaml-sfml/</link>
	<content:encoded>OCaml binding for SFML (Simple and Fast Multimedia Library)  http://www.sfml-dev.org/</content:encoded>
	<dc:date>2010-09-02T01:00:25+00:00</dc:date>
</item>
<item rdf:about="http://blog.camlcity.org/blog/ocamlnet3_release.html">
	<title>Gerd Stolpmann: Ocamlnet 3 finally released</title>
	<link>http://blog.camlcity.org/blog/ocamlnet3_release.html</link>
	<content:encoded>&lt;div&gt;
  &lt;b&gt;What's new in Ocamlnet 3&lt;/b&gt;&lt;br /&gt; 
&lt;/div&gt;

&lt;div&gt;
  
So, finally it is there:
&lt;a href=&quot;http://projects.camlcity.org/projects/ocamlnet.html&quot;&gt;Ocamlnet 
3.0.0&lt;/a&gt;. After almost 3 years of development, many parts of Ocamlnet
have been touched and extended while keeping most of the existing APIs.
It is not immediately visible what the striking new features are, so a
bit of explanation is necessary.

&lt;/div&gt;

&lt;div&gt;
  
&lt;p&gt;
When renovating a building, it is common to do this floor by floor. In
this sense, Ocamlnet 3.0.0 focused on the foundation and the first
floor. Also, the renovation is not yet finished - many features still
need to be added, like supporting SSL for more protocols. This is now
easier thanks to some new basic APIs that have been introduced in the
first step.

&lt;/p&gt;&lt;h2&gt;Netsys&lt;/h2&gt;

&lt;p&gt;
One of the parts that got most attention is &lt;code&gt;Netsys&lt;/code&gt;, the
library adding the missing links to the operating system (OS). One of
the driving forces was the port to Win32. This lead to the introduction
of generalized versions of &lt;code&gt;Unix.read&lt;/code&gt; and &lt;code&gt;Unix.write&lt;/code&gt;
calls (defined in &lt;code&gt;Netsys&lt;/code&gt;):

&lt;/p&gt;&lt;pre&gt;val gread : fd_style -&amp;gt; Unix.file_descr -&amp;gt; string -&amp;gt; int -&amp;gt; int -&amp;gt; int
val gwrite : fd_style -&amp;gt; Unix.file_descr -&amp;gt; string -&amp;gt; int -&amp;gt; int -&amp;gt; int
&lt;/pre&gt;

For getting some Win32-specific emulations right, it is sometimes
required to call other functions instead of &lt;code&gt;Unix.read&lt;/code&gt;
and &lt;code&gt;Unix.write&lt;/code&gt;, e.g. &lt;code&gt;Netsys_win32.pipe_read&lt;/code&gt;
and &lt;code&gt;Netsys_win32.pipe_write&lt;/code&gt;. In order to avoid that such
case distinctions are scattered over the whole library, the idea of
defining these generic functions was born. In &lt;code&gt;fd_style&lt;/code&gt; the
user passes in how to handle the
descriptor. Usually &lt;code&gt;fd_style&lt;/code&gt; is automatically determined
by another function &lt;code&gt;get_fd_style&lt;/code&gt; (this requires a few
system calls and is factored out because of this). Although targeting mostly
at Win32, there are already
some benefits for POSIX systems, e.g. the &lt;code&gt;fd_style&lt;/code&gt; already
encodes whether a descriptor is a socket, and whether it is connected,
which is sometimes quite useful information. In the future, this system
will be extended:

&lt;ul&gt;
  &lt;li&gt;&lt;p&gt;Seekable files are currently not well supported by the
         asynchronous I/O layer. The reason is that the &lt;code&gt;select&lt;/code&gt;
         and &lt;code&gt;poll&lt;/code&gt; system calls cannot predict whether I/O would be 
         blocking or non-blocking (and thus always say non-blocking).
         This can be improved by using special AIO calls of the OS.
         Of course, files for which AIO is to be used need to be
         flagged specially, and a new &lt;code&gt;fd_style&lt;/code&gt; could
         do so.
  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;There are also some ideas for labeling SSL sockets by a special
         &lt;code&gt;fd_style&lt;/code&gt;. This would make it a bit easier to
	 support SSL thoughout the library. This is a bit more work
	 than just calling &lt;code&gt;Ssl.read&lt;/code&gt; and &lt;code&gt;Ssl.write&lt;/code&gt;,
	 though, because the SSL protocol allows renegotiations at any
	 time, and a read may also require writes on the socket level,
	 and vice versa.
&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;

Another new idea on the &lt;code&gt;Netsys&lt;/code&gt; level is a little object
definition called &lt;code&gt;pollset&lt;/code&gt;:

&lt;pre&gt;class type pollset =
object
  method find : Unix.file_descr -&amp;gt; Netsys_posix.poll_req_events
  method add : Unix.file_descr -&amp;gt; Netsys_posix.poll_req_events -&amp;gt; unit
  method remove : Unix.file_descr -&amp;gt; unit
  method wait : float -&amp;gt; 
                ( Unix.file_descr * 
                  Netsys_posix.poll_req_events * 
                  Netsys_posix.poll_act_events ) list
  method dispose : unit -&amp;gt; unit
  method cancel_wait : bool -&amp;gt; unit
end
&lt;/pre&gt;

A &lt;code&gt;pollset&lt;/code&gt; represents a set of file descriptor events one
wants to poll. Again, this data structure was originally required
for the Win32 port (because Win32 is very different in this respect),
but there are also advantages for Unix systems. Nowadays, there are
various improved APIs for polling such as Linux epoll or BSD kqueue.
The &lt;code&gt;pollset&lt;/code&gt; abstraction will make it very easy to support
these - the user simply selects one of the advanced implementations
of &lt;code&gt;pollset&lt;/code&gt;, and thanks to dynamic binding of object
methods it is automatically used everywhere. (One of the next
versions of Ocamlnet will allow this.)

&lt;p&gt;Another word about polling. The Ocaml runtime only provides
&lt;code&gt;select&lt;/code&gt;. Although not as bad as claimed by some people,
it imposes artificial limitations, especially about the number of
supported file descriptors. Because of this, &lt;code&gt;Netsys_posix&lt;/code&gt;
includes now a binding of the &lt;code&gt;poll&lt;/code&gt; system call which is not
suffering from this disease. Of course, &lt;code&gt;poll&lt;/code&gt; is now the
only poll API used throughout Ocamlnet (and, as noted, even better
APIs will be supported in one of the next releases).

&lt;/p&gt;&lt;p&gt;Other additions on the OS level for Unix systems:

&lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;Netsys_posix.spawn&lt;/code&gt; is a new way of starting subprograms,
with special support for monitoring the subprocesses asynchronously
  &lt;/li&gt;&lt;li&gt;There are now bindings for syslog in &lt;code&gt;Netsys_posix&lt;/code&gt;
  &lt;/li&gt;&lt;li&gt;The system calls &lt;code&gt;fsync&lt;/code&gt; and &lt;code&gt;fdatasync&lt;/code&gt; are
supported
  &lt;/li&gt;&lt;li&gt;If the OS provides this call, &lt;code&gt;fadvise&lt;/code&gt; can be invoked
to control the page cache
  &lt;/li&gt;&lt;li&gt;There is also &lt;code&gt;fallocate&lt;/code&gt; to allocate disk space, so far
the OS provides it
  &lt;/li&gt;&lt;li&gt;POSIX semaphores are supported, so far the OS provides the complete
interface (i.e. named semaphores for synchronization between unrelated
processes)
  &lt;/li&gt;&lt;li&gt;There is a coordinator module for signals, &lt;code&gt;Netsys_signal&lt;/code&gt;,
so that various users of signals do not mutually override their handlers
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
For all systems, &lt;code&gt;Netsys&lt;/code&gt; implements:

&lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;Wrappers for multicasting system calls on sockets
  &lt;/li&gt;&lt;li&gt;In &lt;code&gt;Netsys_mem&lt;/code&gt; there is now special support for
using bigarrays of chars as efficient I/O buffers. Such
bigarray-backed buffers are called &lt;code&gt;memory&lt;/code&gt; (reminding us
to the fact that these buffers are not relocatable like strings, but
bound to fixed memory addresses). There are functions for allocating
page-aligned or cache-line-aligned &lt;code&gt;memory&lt;/code&gt; buffers. Also,
there is experimental support for copying Ocaml values into buffers
(used by the Camlbox module, see below). Finally, there are also
versions of &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;recv&lt;/code&gt;
and &lt;code&gt;send&lt;/code&gt; operating on memory buffers rather than strings.
These versions open the door to zero-copy network I/O (if supported by
the OS).
  &lt;/li&gt;&lt;li&gt;For better support of multi-threading there is now a version of
the thread API that even exists when the thread library is not linked in,
so that especially critical sections are emulated as no-ops in the 
single-threaded case. It is hoped that more functions can be made
thread-safe by this new feature (in &lt;code&gt;Netsys_oothr&lt;/code&gt;).
  &lt;/li&gt;&lt;li&gt;The exception registry &lt;code&gt;Netexn&lt;/code&gt; is now almost outdated,
because the Ocaml standard library recently introduced a similar
feature (yes, sometimes feature wishes are honoured :-).
&lt;/li&gt;&lt;/ul&gt;

&lt;h2&gt;Equeue&lt;/h2&gt;

&lt;p&gt;
As &lt;code&gt;Netsys&lt;/code&gt; uses now pollsets to manage
polling, &lt;code&gt;Equeue&lt;/code&gt; had to be rewritten to take advantage of
this. In particular, there is now &lt;code&gt;Unixqueue_pollset&lt;/code&gt; which
is a port of the old &lt;code&gt;Unixqueue&lt;/code&gt; API around pollsets. For
the user, there is absolutely no difference.

&lt;/p&gt;&lt;p&gt;
What's more important is the extension of the engine API. Ocamlnet 2
introduced engines as a way of expressing a suspended I/O possibility,
but there was only limited support for it in the library. This has now
changed - engines are now a first class member of Ocamlnet. In particular,
there are now much more synchronization primitives (e.g.
&lt;code&gt;stream_seq_engine&lt;/code&gt; for executing an open number of engines
in sequence, or &lt;code&gt;msync_engine&lt;/code&gt; for waiting for the
completion of multiple engines). This development was mostly driven by
another project of mine: Plasma (see other blog articles on this
site). Plasma uses engines for all kinds of concurrent execution of
I/O code, and while I was developing Plasma, I extended the Ocamlnet
engine API step by step.

&lt;/p&gt;&lt;p&gt;
There is also now a way to call RPC procedures with an engine:
&lt;code&gt;Rpc_proxy.ManagedClient.rpc_engine&lt;/code&gt;. This function has
originally also been developed for the Plasma project.

&lt;/p&gt;&lt;p&gt;
For simpler I/O needs, I added &lt;code&gt;Uq_io&lt;/code&gt;. It contains 
&quot;engineered&quot; versions of simple I/O functions like &lt;code&gt;input&lt;/code&gt;,
&lt;code&gt;input_line&lt;/code&gt; or &lt;code&gt;flush&lt;/code&gt;. &lt;code&gt;Uq_io&lt;/code&gt; is
not limited to file descriptors, but works also on top of a number
of other I/O devices (including virtual ones).

&lt;/p&gt;&lt;p&gt;
The operators &lt;code&gt;++&lt;/code&gt; and &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; have been
introduced as abbreviations for sequential execution, and result
mapping of engines, respectively. For example, the synchronous
code

&lt;/p&gt;&lt;pre&gt;let line1 = input_line ch_in in
let line2 = input_line ch_in in
output_string ch_out (line1 ^ line2 ^ &quot;\n&quot;)
&lt;/pre&gt;

would now look in &quot;engineered&quot; code:

&lt;pre&gt;Uq_io.input_line_e d_in ++
  (fun line1 -&amp;gt;
    Uq_io.input_line_e d_in ++
      (fun line2 -&amp;gt;
        Uq_io.output_string_e d_out (line1 ^ line2 ^ &quot;\n&quot;)
      )
  )
&lt;/pre&gt;

Not bad, if you compare with the previous solution (hand-coding a
scanner for lines, writing the event handler routines, etc., adding
up to 100-200 lines of code).


&lt;h2&gt;Netplex&lt;/h2&gt;

The development in the &lt;code&gt;Netplex&lt;/code&gt; area was focused on easing
multi-processing. With &lt;code&gt;Netplex&lt;/code&gt; it is very easy to run
code in several worker processes, e.g. for network servers. What was
missing up to now, however, was an easy way to manage the
collaboration of the processes.

&lt;p&gt;
&lt;code&gt;Netplex&lt;/code&gt; worker processes got now a number of ways to
talk to each other:

&lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;It is now possible to store variables in a common place, so that
each process can get and set these (&lt;code&gt;Netplex_sharedvar&lt;/code&gt;).
Of course, this mechanism is typed.
  &lt;/li&gt;&lt;li&gt;There are mutexes and semaphores for synchronization
(&lt;code&gt;Netplex_mutex&lt;/code&gt; and &lt;code&gt;Netplex_semaphore&lt;/code&gt;)
  &lt;/li&gt;&lt;li&gt;Each process can be directly contacted via a private channel,
the so-called container socket. This is also an RPC mechanism, but
unlike normal RPC servers the caller directly addresses a process
(and not only a service in general, and the Netplex machinery automatically
selects the destination process). There is also a directory so that
processes can see which other processes exist.
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
The implementation of these mechanisms is not yet optimal, but the APIs
are defined and backed by simple but robust modules. It is expected that
in the future more sophisticated implementations will become available,
e.g. the &lt;code&gt;Netplex_sharedvar&lt;/code&gt; code use a shared memory object
if the OS supports that.

&lt;/p&gt;&lt;p&gt;
Another addition are &quot;levers&quot;. This kind of handle exists within the
Netplex master process, but can be activated from the child processes.
It is a kind of little RPC function for a special purpose: Sometimes
the process model requires that certain functionality must be done
within the scope of the master process. An example would be the start
of another child process. By doing that via a lever, this action can
also be triggered from any child process.

&lt;/p&gt;&lt;p&gt;
Besides that there are numerous smaller enhancements. Especially
the module &lt;code&gt;Netplex_cenv&lt;/code&gt; has been extended, e.g. there
are now timers that can be attached to the Netplex event queue.

&lt;/p&gt;&lt;h2&gt;RPC&lt;/h2&gt;

The development went into two directions: First, it was aimed at a
more powerful RPC client implementation, and second, performance
performance performance.

&lt;p&gt;
The improved client is called &lt;code&gt;Rpc_proxy&lt;/code&gt;. All experience
went in that I made at my Ocaml job at Mylife.com - lots of RPC calls
in an unreliable environment (if you have hundreds of machines, one
box is always down). Clients can now be recycled, they can react
better on errors, and even load balancing and fail-over to alternate
endpoints are now supported. (See the other blog posting, &quot;The next
server, please!&quot;.)

&lt;/p&gt;&lt;p&gt;
Performance improvements were achieved by two means: First, the XDR
encoding and decoding was optimized. This has not yet come to an end
yet, but certain XDR types like arrays of strings are now processed a
lot faster. The other strategy was to replace many string buffers by
bigarrays of char (see under &quot;memory&quot; above). This allows it to get rid
of a number of copy operations, especially when large strings are
transmitted via RPC. This new string representation is even accessible
by user code via a new XDR type &lt;code&gt;_managed string&lt;/code&gt;. This
may avoid even more copies.

&lt;/p&gt;&lt;h2&gt;Shell&lt;/h2&gt;

The API of &lt;code&gt;Shell&lt;/code&gt; is mostly the same - only a few
suspicious functions have been removed. The implementation, however,
has changed a lot.

&lt;p&gt;
&lt;code&gt;Shell&lt;/code&gt; now uses the new &lt;code&gt;Netsys&lt;/code&gt; functions for
starting subprocesses. As these functions are written in C, one gets
some immediate benefits: &lt;code&gt;Shell&lt;/code&gt; is now officially supported
for multi-threaded programs because it is possible to do the signal
handling right in C (but still, this is notoriously difficult). Also,
there is now no risk anymore that the Ocaml garbage collector wants to
clean up in the worst moment, namely between fork and exec.

&lt;/p&gt;&lt;p&gt;
Another benefit is that &lt;code&gt;Shell&lt;/code&gt; works now also under Win32.
The C part is completely different, though.


&lt;/p&gt;&lt;h2&gt;Netcgi&lt;/h2&gt;

Not much has changed here, only that the old version &lt;code&gt;Netcgi1&lt;/code&gt;
is gone now.


&lt;h2&gt;Camlboxes&lt;/h2&gt;

An exciting but still experimental addition are Camlboxes. They are
designed as a fast way of sending messages between unrelated
processes. Camlboxes use shared memory for communication.

&lt;p&gt;
This works as follows: If process 1 want to send process 2 a message,
both have to map the same memory pages into their address space. The
message is orignally an Ocaml value somewhere in the private memory
of process 1. With the help of Camlbox this value is now copied to
shared memory so that, and this is the pivotal point, process 2 can
directly access the value without additional decoding step. This
reduces greatly the overhead of message sending - actually only a
relatively fast value copy is done, bypassing any kernel-controlled
I/O devices.

&lt;/p&gt;&lt;p&gt;
For passing a short message, this takes now only a few microseconds.
Most of that time is spent for synchronization, of course, not for
copying. (On the hardware level, the synchronization is mostly done by
moving cache lines from one CPU core to the other, so this is some
kind of hidden copying. It is worth noting that Camlboxes are way
faster on single-core machines than on multi-cores because this
low-level synchronization is not required then.)

&lt;/p&gt;&lt;p&gt;
Camlboxes have one downside, though. They are not perfectly integrated
into the garbage collecting machinery, and because of this, one has to
follow some programming rules. In particular, there is no way to
recognize that a message (or part of it) is no longer referenced, so
messages are manually deleted, and there is of course the danger that
bad code keeps references to (or into) deleted messages. For fixing
this, we would need more help by the Ocaml GC.

&lt;/p&gt;&lt;p&gt;
Another problem is missing integration with &lt;code&gt;Equeue&lt;/code&gt;.
Camlboxes are synchronous by design - that's the price for their speed.


&lt;/p&gt;&lt;h2&gt;Where to get Ocamlnet 3&lt;/h2&gt;

Look at the &lt;a href=&quot;http://projects.camlcity.org/projects/ocamlnet.html&quot;&gt;
project page&lt;/a&gt; for the newest version and links to the manual, mailing
list, etc.
&lt;br /&gt; &lt;br /&gt;

&lt;img src=&quot;http://blog.camlcity.org/files/img/blog/ocamlnet3_release_bug.gif&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;


&lt;/div&gt;

&lt;div&gt;
  Gerd Stolpmann works as O'Caml consultant.
&lt;a href=&quot;http://www.gerd-stolpmann.de/buero/work_ocaml_search.html.en&quot;&gt;
He is accepting new customers!&lt;/a&gt;


&lt;/div&gt;

&lt;div&gt;
  
&lt;/div&gt;</content:encoded>
	<dc:date>2010-09-01T23:00:16+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-5888658295182480819.post-7074949462450985008">
	<title>Matías Giovannini: Rewriting the Rules</title>
	<link>http://alaska-kamtchatka.blogspot.com/2010/09/rewriting-rules.html</link>
	<content:encoded>The last article on pa_do sparked an interesting conversation with its author, Christophe Troestler, and reader bluestorm. It's true that pa_infix can establish optional rewrite rules for operators as a side-effect (or as an &quot;added bonus&quot; in the creator's words) of it installing new symbols with given arity, precedence and associativity. Given that rewrite rules are purely syntactical artifacts,</content:encoded>
	<dc:date>2010-09-01T21:21:26+00:00</dc:date>
	<dc:creator>Matías Giovannini</dc:creator>
</item>
<item rdf:about="tag:le-gall.net,2010-09-01:/sylvain+violaine/blog/64">
	<title>Sylvain Le Gall: OCaml 3.12 with Debian Sid right now!</title>
	<link>http://le-gall.net/sylvain+violaine/blog/index.php?2010/09/01/64-ocaml-312-with-debian-sid-right-now</link>
	<content:encoded>&lt;p&gt;Some careful readers of &lt;a href=&quot;http://planet.ocamlcore.org&quot;&gt;Planet OCamlCore&lt;/a&gt; should wonder why the OCaml packages in Debian has not yet been upgraded to 3.12.0. For the &lt;a href=&quot;http://planet.debian.org&quot;&gt;Planet Debian&lt;/a&gt; readers, this is the latest version of the Objective Caml programming language.&lt;/p&gt;


&lt;p&gt;The answer is simple: Debian Squeeze froze on 6th August. This means that Debian folks focus on fixing release critical bugs and avoid doing big transitions in unstable (Sid). In particular, the Debian OCaml maintainers has decided to keep OCaml 3.11.2 for Squeeze, because the delay was really too short: OCaml 3.12 was out on 2nd August.&lt;/p&gt;


&lt;p&gt;A great work has already been done by S. Glondu and the rest of the Debian OCaml maintainers to spot possible problems. The result was a series of &lt;a href=&quot;http://bugs.debian.org/cgi-bin/pkgreport.cgi?users=debian-ocaml-maint@lists.debian.org;tag=ocaml312-ftbfs&quot;&gt;bugs&lt;/a&gt; submitted to the Debian BTS. This effort has started quite early and have been updated with various OCaml release candidates.&lt;/p&gt;


&lt;p&gt;S. Glondu has also built an unofficial Debian repository of OCaml 3.12.0 packages &lt;a href=&quot;http://ocaml.debian.net/debian/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Let's use it to experiment with OCaml 3.12.0.&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;schroot setup&lt;/h3&gt;


&lt;p&gt;Following &lt;a href=&quot;http://le-gall.net/sylvain+violaine/blog/tb.php?id=63&amp;amp;chk=l7kjxi&quot;&gt;my last post&lt;/a&gt; about schroot and CentOS, we will use a schroot to isolate our installation of unofficial OCaml 3.12.0 packages.&lt;/p&gt;


&lt;h4&gt;approx&lt;/h4&gt;


&lt;p&gt;&lt;a href=&quot;http://git.debian.org/?p=pkg-ocaml-maint/packages/approx.git&quot;&gt;approx&lt;/a&gt; is a debian caching proxy server for Debian archive files. It is very effective and simple to setup. It is already on my server (Debian Lenny, approx v3.3.0). I just have to add a single line to create a proxy for ocaml 3.12 packages:&lt;/p&gt;


&lt;pre&gt; $ echo &quot;ocaml-312   http://ocaml.debian.net/debian/ocaml-3.12.0&quot; &amp;gt;&amp;gt; /etc/approx/approx.conf
 $ invoke-rc.d approx restart&lt;/pre&gt;


&lt;p&gt;approx is written in OCaml, if you want to know how I come to it.&lt;/p&gt;


&lt;h4&gt;debootstrap and schroot&lt;/h4&gt;


&lt;p&gt;We create a chroot environment with Debian Sid:&lt;/p&gt;


&lt;pre&gt;# PROXY = host where approx is installed, debian/ points to official Debian repository of 
# your choice. 
$ debootstrap sid sid-amd64-ocaml312 http://PROXY:9999/debian&lt;/pre&gt;


&lt;p&gt;We create a section for sid-amd64-ocaml312 in &lt;em&gt;/etc/schroot/schroot.conf&lt;/em&gt; (Debian Lenny):&lt;/p&gt;


&lt;pre&gt;[sid-amd64-ocaml312]
description=Debian sid/amd64 with OCaml 3.12.0
type=directory
location=/srv/chroot/sid-amd64-ocaml312
priority=3
users=XXX
root-groups=root
run-setup-scripts=true
run-exec-scripts=true&lt;/pre&gt;


&lt;p&gt;Replace XXX by your login.&lt;/p&gt;


&lt;p&gt;And we install additional softwares:&lt;/p&gt;

&lt;pre&gt; $ schroot -c sid-amd64-ocaml312 apt-get update
 $ schroot -c sid-amd64-ocaml312 apt-get install vim-nox sudo&lt;/pre&gt;


&lt;h3&gt;OCaml 3.12 packages&lt;/h3&gt;


&lt;p&gt;Now we can start the setup to access OCaml 3.12.0 packages.&lt;/p&gt;


&lt;p&gt;The repository is signed by S. Glondu GPG key (see &lt;a href=&quot;http://ocaml.debian.net/debian/ocaml-3.12.0/&quot;&gt;here&lt;/a&gt;). We need to get it and inject it into apt:&lt;/p&gt;


&lt;pre&gt;$ gpg --recv-key 49881AD3 
gpg: requête de la clé 49881AD3 du serveur hkp keys.gnupg.net
gpg: clé 49881AD3: « Stéphane Glondu &amp;lt;steph@glondu.net&amp;gt; » n'a pas changé
gpg:        Quantité totale traitée: 1
gpg:                      inchangée: 1
$ gpg -a --export 49881AD3 &amp;gt; glondu.gpg
$ schroot -c sid-amd64-ocaml312 apt-key add glondu.gpg&lt;/pre&gt;


&lt;p&gt;The following part is done in the schroot:&lt;/p&gt;


&lt;pre&gt;$ schroot -c sid-amd64-ocaml312
# PROXY = host where approx is installed
(sid-amd64-ocaml312)$ echo &quot;deb http://PROXY:9999/ocaml-312 sid main&quot; &amp;gt;&amp;gt; /etc/apt/sources.list
(sid-amd64-ocaml312)$ cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; /etc/apt/preferences
Package: *
Pin: release l=ocaml
Pin-Priority: 1001
EOF
(sid-amd64-ocaml312)$ apt-get update 
...
(sid-amd64-ocaml312)$ apt-cache policy ocaml
  Installé : (aucun)
  Candidat : 3.12.0-1~38
 Table de version :
     3.12.0-1~38 0
       1001 http://atto/ocaml-312/ sid/main amd64 Packages
     3.11.2-1 0
        500 http://atto/debian/ sid/main amd64 Packages&lt;/pre&gt;


&lt;pre&gt;(sid-amd64-ocaml312)$ apt-get install ocaml-nox libtype-conv-camlp4-dev libounit-ocaml-dev...&lt;/pre&gt;


&lt;p&gt;That's it. The &lt;em&gt;apt-policy&lt;/em&gt; command shows that OCaml 3.12 for the ocaml-312 repository has an higher priority for installation.&lt;/p&gt;


&lt;p&gt;Good luck playing with OCaml 3.12.0.&lt;/p&gt;</content:encoded>
	<dc:date>2010-09-01T17:07:18+00:00</dc:date>
	<dc:creator>gildor</dc:creator>
</item>
<item rdf:about="http://forge.ocamlcore.org/forum/forum.php?forum_id=665">
	<title>OCamlCore Forge News: ocaml-data-notation: release 0.0.2</title>
	<link>http://forge.ocamlcore.org/forum/forum.php?forum_id=665</link>
	<content:encoded>This is a bugfix release that workaround camlp4 differences between OCaml 3.11 and 3.12. You can now compile odn with both versions.

Sylvain Le Gall</content:encoded>
	<dc:date>2010-09-01T04:27:37+00:00</dc:date>
	<dc:creator>Sylvain Le Gall</dc:creator>
</item>
<item rdf:about="tag:blogger.com,1999:blog-1445545651031573301.post-1791120058389526317">
	<title>Jake Donham: ocamljs 0.3</title>
	<link>http://ambassadortothecomputers.blogspot.com/2010/08/ocamljs-03.html</link>
	<content:encoded>&lt;p&gt;I am happy to announce version 0.3 of ocamljs. Ocamljs is a system for compiling OCaml to Javascript. It includes a Javascript back-end for the OCaml compiler, as well as several support libraries, such as bindings to the browser DOM. Ocamljs also works with &lt;a href=&quot;http://jaked.github.com/orpc&quot;&gt;orpc&lt;/a&gt; for RPC over HTTP, and &lt;a href=&quot;http://jaked.github.com/froc&quot;&gt;froc&lt;/a&gt; for functional reactive browser programming.&lt;/p&gt; 
 
&lt;p&gt;Changes since version 0.2 include:&lt;/p&gt; 
 
&lt;ul&gt; 
&lt;li&gt;support for OCaml 3.11.x and 3.12.0&lt;/li&gt; 
 
&lt;li&gt;jQuery binding (contributed by Dave Benjamin)&lt;/li&gt; 
 
&lt;li&gt;full support for OCaml objects (interoperable with Javascript objects)&lt;/li&gt; 
 
&lt;li&gt;Lwt 2.x support&lt;/li&gt; 
 
&lt;li&gt;ocamllex and ocamlyacc support&lt;/li&gt; 
 
&lt;li&gt;better interoperability with Javascript&lt;/li&gt; 
 
&lt;li&gt;many small fixes and improvements&lt;/li&gt; 
&lt;/ul&gt; 
 
&lt;p&gt;Development of ocamljs has moved from Google Code to Github; see&lt;/p&gt; 
 
&lt;ul&gt; 
&lt;li&gt;project page: &lt;a href=&quot;http://github.com/jaked/ocamljs&quot;&gt;http://github.com/jaked/ocamljs&lt;/a&gt;&lt;/li&gt; 
 
&lt;li&gt;documentation: &lt;a href=&quot;http://jaked.github.com/ocamljs&quot;&gt;http://jaked.github.com/ocamljs&lt;/a&gt;&lt;/li&gt; 
 
&lt;li&gt;downloads: &lt;a href=&quot;http://github.com/jaked/ocamljs/downloads&quot;&gt;http://github.com/jaked/ocamljs/downloads&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;b&gt;Comparison to js_of_ocaml&lt;/b&gt; 
&lt;p&gt;Since I last did an &lt;code&gt;ocamljs&lt;/code&gt; release, a new OCaml-to-Javascript system has arrived, &lt;a href=&quot;http://ocsigen.org/js_of_ocaml/&quot;&gt;&lt;code&gt;js_of_ocaml&lt;/code&gt;&lt;/a&gt;. I want to say a little about how the two systems compare:&lt;/p&gt; 
 
&lt;p&gt;&lt;code&gt;Ocamljs&lt;/code&gt; is a back-end to the existing OCaml compiler; it translates the “lambda” intermediate language to Javascript. (This is also where the bytecode and native code back-ends connect to the common front-end.) &lt;code&gt;Js_of_ocaml&lt;/code&gt; post-processes ordinary OCaml bytecode (compiled and linked with the ordinary OCaml bytecode compiler) into Javascript. With &lt;code&gt;ocamljs&lt;/code&gt; you need a special installation of the compiler (and special support for &lt;code&gt;ocamlbuild&lt;/code&gt; and &lt;code&gt;ocamlfind&lt;/code&gt;), you need to recompile libraries, and you need the OCaml source to build it. With &lt;code&gt;js_of_ocaml&lt;/code&gt; you don’t need any of this.&lt;/p&gt; 
 
&lt;p&gt;Since &lt;code&gt;ocamljs&lt;/code&gt; recompiles libraries, it’s possible to special-case code for the Javascript build to take advantage of Javascript facilities. For example, &lt;code&gt;ocamljs&lt;/code&gt; implements the &lt;code&gt;Buffer&lt;/code&gt; module on top of Javascript arrays instead of strings, for better performance. Similarly, it implements &lt;code&gt;CamlinternalOO&lt;/code&gt; to use Javascript method dispatch directly instead of layering OCaml method dispatch on top. &lt;code&gt;Js_of_ocaml&lt;/code&gt; can’t do this (or at least it would be necessary to recognize the compiled bytecode and replace it with the special case).&lt;/p&gt; 
 
&lt;p&gt;Because &lt;code&gt;js_of_ocaml&lt;/code&gt; works from bytecode, it can’t always know the type of values (at the bytecode level, &lt;code&gt;int&lt;/code&gt;s, &lt;code&gt;bool&lt;/code&gt;s, and &lt;code&gt;char&lt;/code&gt;s all have the same representation, for example). This makes interoperating with native Javascript more difficult: you usually need conversion functions between the OCaml and Javascript representation of values when you call a Javascript function from OCaml. &lt;code&gt;Ocamljs&lt;/code&gt; has more information to work with, and can represent OCaml bools as Javascript bools, for example, so you can usually call a Javascript function from OCaml without conversions.&lt;/p&gt; 
 
&lt;p&gt;&lt;code&gt;Ocamljs&lt;/code&gt; has a mixed representation of strings: literal strings and the result of &lt;code&gt;^&lt;/code&gt;, &lt;code&gt;Buffer.contents&lt;/code&gt;, and &lt;code&gt;Printf.sprintf&lt;/code&gt; are all immutable Javascript strings; strings created with &lt;code&gt;String.create&lt;/code&gt; are mutable strings implemented by Javascript arrays (with a &lt;code&gt;toString&lt;/code&gt; method which returns the represented string). This is good for interoperability—you can usually pass a string directly to Javascript—but it doesn’t match regular OCaml’s semantics, and it can cause runtime failures (e.g. if you try to mutate an immutable string). &lt;code&gt;Js_of_ocaml&lt;/code&gt; implements only mutable strings, so you need conversions when calling Javascript, but the semantics match regular OCaml.&lt;/p&gt; 
 
&lt;p&gt;With &lt;code&gt;ocamljs&lt;/code&gt;, Javascript objects can be called from OCaml using the ordinary OCaml method-call syntax, and objects written in OCaml can be called using the ordinary Javascript syntax. With &lt;code&gt;js_of_ocaml&lt;/code&gt;, a special syntax is needed to call Javascript objects, and OCaml objects can’t easily be called from Javascript. However, there is an advantage to having a special call syntax: with &lt;code&gt;ocamljs&lt;/code&gt; it is not possible to partially apply calls to native Javascript methods, but this is not caught by the compiler, so there can be a runtime failure.&lt;/p&gt; 
 
&lt;p&gt;&lt;code&gt;Ocamljs&lt;/code&gt; supports inline Javascript, while &lt;code&gt;js_of_ocaml&lt;/code&gt; does not. I think it might be possible for &lt;code&gt;js_of_ocaml&lt;/code&gt; to do so using the same approach that &lt;code&gt;ocamljs&lt;/code&gt; takes: use Camlp4 quotations to embed a syntax tree, then convert the syntax tree from its OCaml representation (as lambda code or bytecode) into Javascript. However, you would still need conversion functions between OCaml and Javascript values.&lt;/p&gt; 
 
&lt;p&gt;I haven’t compared the performance of the two systems. It seems like there must be a speed penalty to translating from bytecode compared to translating from lambda code. On the other hand, while &lt;code&gt;ocamljs&lt;/code&gt; is very naive in its translation, &lt;code&gt;js_of_ocaml&lt;/code&gt; makes several optimization passes. With many programs it doesn’t matter, since most of the time is spent in browser code. (For example, the &lt;code&gt;planet&lt;/code&gt; example seems to run at the same speed in &lt;a href=&quot;http://jaked.github.com/ocamljs/examples/dom/planet/&quot;&gt;&lt;code&gt;ocamljs&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;http://ocsigen.org/js_of_ocaml/planet/&quot;&gt;&lt;code&gt;js_of_ocaml&lt;/code&gt;&lt;/a&gt;.) It would be interesting to compare them on something computationally intensive like Andrej Bauer’s &lt;a href=&quot;http://random-art.org/&quot;&gt;random-art.org&lt;/a&gt;.&lt;/p&gt; 
 
&lt;p&gt;&lt;code&gt;Js_of_ocaml&lt;/code&gt; is more complete and careful in its implementation of OCaml (e.g. it supports &lt;code&gt;int64&lt;/code&gt;s), and it generates much more compact code than &lt;code&gt;ocamljs&lt;/code&gt;. I hope to close the gap in these areas, possibly by borrowing some code and good ideas from &lt;code&gt;js_of_ocaml&lt;/code&gt;.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/1445545651031573301-1791120058389526317?l=ambassadortothecomputers.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2010-08-26T21:45:00+00:00</dc:date>
	<dc:creator>Jake Donham</dc:creator>
</item>
<item rdf:about="tag:le-gall.net,2010-08-26:/sylvain+violaine/blog/63">
	<title>Sylvain Le Gall: CentOS 5 chroot with schroot</title>
	<link>http://le-gall.net/sylvain+violaine/blog/index.php?2010/08/26/63-centos-5-chroot-with-schroot</link>
	<content:encoded>&lt;p&gt;OCaml compiles native executables in static mode. It allows to have a minimal set of dependencies when delivering an executable. It has also disadvantages like the size of the executable and problems arising when considering libraries update -- but this is another topic. There is still one strong dependency that you should not forget when you want to deliver a product for most of the Linux distributions: dependency on the glibc version.&lt;/p&gt;


&lt;p&gt;Trying to run OASIS compiled with Debian Lenny, on CentOS 5.5:&lt;/p&gt;

&lt;pre&gt;$ OASIS
.../OASIS: /lib64/libc.so.6: version `GLIBC_2.7' not found (required by .../OASIS)&lt;/pre&gt;


&lt;p&gt;So when compiling for delivery, one should choose the oldest distribution he targets. In my case, I choose &lt;a href=&quot;http://www.centos.org/&quot;&gt;CentOS 5&lt;/a&gt; which comes with glibc v2.5. I usually choose &lt;a href=&quot;http://www.debian.org&quot;&gt;Debian stable&lt;/a&gt; at the moment of writing Debian Lenny. But for now, the Debian Lenny's glibc is newer (v2.7) than the one coming from the CentOS 5.5 stable release. CentOS is a Red Hat like Linux distribution.&lt;/p&gt;


&lt;p&gt;I use a Debian Lenny amd64 host system and I decided to setup a chroot of CentOS 5 i386 and amd64. I also setup &lt;a href=&quot;http://packages.debian.org/schroot&quot;&gt;schroot&lt;/a&gt; to use my CentOS chroot.&lt;/p&gt;


&lt;h4&gt;CentOS 5 amd64 setup&lt;/h4&gt;


&lt;p&gt;First of all we use &lt;a href=&quot;http://xen-tools.org/software/rinse/&quot;&gt;rinse&lt;/a&gt;, which can setup a RPM based distribution in a chroot. The version v1.3 shipped with Debian Lenny has some &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=535453&quot;&gt;bugs&lt;/a&gt;: it doesn't install nss and other mandatory packages. So I downloaded v1.7 directly from Debian Sid. There is no dependencies problems and the package is &lt;em&gt;arch:all&lt;/em&gt;, so it is straightforward to install:&lt;/p&gt;


&lt;pre&gt;$ wget http://ftp.de.debian.org/debian/pool/main/r/rinse/rinse_1.7-1_all.deb # Replace ftp.de.debian.org by your preferred Debian mirror
$ dpkg -i rinse_1.7-1_all.deb&lt;/pre&gt;


&lt;p&gt;Then I create the chroot directory and launch rinse:&lt;/p&gt;


&lt;pre&gt;$ mkdir /srv/chroot/centos5-amd64
$ rinse --arch amd64 --distribution centos-5 --directory /srv/chroot/centos5-amd64 # N.B. you must use --arch, the default is i386&lt;/pre&gt;


&lt;p&gt;Once installation is complete, you can add an entry for this distribution in &lt;em&gt;/etc/schroot/schroot.conf&lt;/em&gt;:&lt;/p&gt;


&lt;pre&gt;[centos5-amd64]
description=Centos 5 (amd64)
location=/srv/chroot/centos5-amd64
priority=3
users=XXX
groups=
root-groups=root
type=directory
run-setup-scripts=true
run-exec-scripts=true&lt;/pre&gt;


&lt;p&gt;Replace XXX by your login.&lt;/p&gt;


&lt;p&gt;If you try to login directly, you will get warnings:&lt;/p&gt;


&lt;pre&gt;$ schroot -c centos5-i386
I : [chroot centos5-i386-a952de23-7f4b-4bae-a9b9-752ecee4a185] Exécution de l'interpréteur de commandes initial : « /bin/bash »
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied&lt;/pre&gt;


&lt;p&gt;This is a bit misleading because the real problem is that nothing is created in &lt;em&gt;/dev/&lt;/em&gt;. CentOS delegates creating char/block devices to udev. You have two solutions to solve this issue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;login and call MAKEDEV to create missing devices:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;$ MAKEDEV random
$ MAKEDEV console
$ MAKEDEV zero
$ MAKEDEV null
$ MAKEDEV stdout
$ MAKEDEV stdin
$ MAKEDEV stderr&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;use an already setup Debian chroot to copy the missing devices:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;$ rsync -av /srv/chroot/lenny-amd64/dev/* /srv/chroot/centos5-amd64/dev/&lt;/pre&gt;


&lt;p&gt;That's it, you now have a functional chrooted CentOS 5 environment:&lt;/p&gt;


&lt;pre&gt;$ schroot -c centos5-amd64 cat /etc/redhat-release
I : [chroot centos5-amd64-b9bae264-285b-4d17-a046-13386736cecd] Exécution de la commande : « cat /etc/redhat-release »
CentOS release 5.5 (Final)&lt;/pre&gt;


&lt;h4&gt;CentOS 5 i386 setup&lt;/h4&gt;


&lt;p&gt;To setup an i386 environment, we follow almost the same scheme, except we need to fix a bug in rinse v1.7: we need to call &lt;em&gt;linux32&lt;/em&gt; before executing &lt;em&gt;chroot&lt;/em&gt;. The problem is that the first stage installation of rinse install an i386/686 environment but as soon as you call &lt;em&gt;chroot yum install ...&lt;/em&gt;, it will guess that the system is amd64 and will install missing packages. See the Debian bug &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594477&quot;&gt;report&lt;/a&gt; and the example patch attached to correct this behavior.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;WARNING: this &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;filename=linux32-example.patch;att=1;bug=594477&quot;&gt;patch&lt;/a&gt; is just an example, you can apply it for creating CentOS i386 chroot on Lenny amd64 host but you should remove the patch as soon as the installation is complete.&lt;/strong&gt;&lt;/p&gt;


&lt;pre&gt;$ mkdir /srv/chroot/centos5-i386/
$ rinse --arch i386 --distribution centos-5 --directory /srv/chroot/centos5-i386 # With /usr/lib/rinse/centos-5/post-install.sh patched 
$ rsync -av /srv/chroot/lenny-i386/dev/* /srv/chroot/centos5-i386/dev/&lt;/pre&gt;


&lt;p&gt;Add this distribution to &lt;em&gt;/etc/schroot/schroot.conf&lt;/em&gt;:&lt;/p&gt;


&lt;pre&gt;[centos5-i386]
description=Centos 5 (i386)
location=/srv/chroot/centos5-i386
priority=3
users=XXX
groups=
root-groups=root
type=directory
run-setup-scripts=true
run-exec-scripts=true
personality=linux32&lt;/pre&gt;


&lt;p&gt;You now have a schroot of CentOS 5 i386:&lt;/p&gt;


&lt;pre&gt;$ schroot -c centos5-i386 cat /etc/redhat-release
I : [chroot centos5-i386-9acafa91-9862-4488-aaef-4ab2a482771e] Exécution de la commande : « cat /etc/redhat-release »
CentOS release 5.5 (Final)&lt;/pre&gt;


&lt;p&gt;Happy schroot hacking!&lt;/p&gt;</content:encoded>
	<dc:date>2010-08-26T15:43:58+00:00</dc:date>
	<dc:creator>gildor</dc:creator>
</item>
<item rdf:about="http://ocaml.janestcapital.com/83 at http://ocaml.janestcapital.com">
	<title>Jane Street: BOFs, Tutorials and Talks, oh my!</title>
	<link>http://ocaml.janestcapital.com/?q=node/83</link>
	<content:encoded>&lt;p&gt;I'm on the program committee for CUFP this year, so I'm a bit biased, but I feel very good about this year's program.  For the first time, CUFP will be broken up into three parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://cufp.org/conference/schedule&quot;&gt;CUFP Tutorials&lt;/a&gt; on Friday October 1st.  This is really the descendent of last year's DEFUN workshop.  The tutorials were picked carefully, both for the interest of the topic and the quality of the teacher.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cufp.org/conference/schedule&quot;&gt;CUFP Talks&lt;/a&gt; on Saturday October 2nd.  Having been involved for a few years now, I really think it's an unusually strong group of talks.  I would be pretty happy if we had a schedule populated with the best of the talks that we rejected, much less the ones that we ended up accepting.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cufp.org/bofs-2010&quot;&gt;CUFP BOFs&lt;/a&gt; on the evenings of Thursday and Friday (Sep 30th and Oct 1).  I'm really looking forward to these.  These BOFs are still being organized, so you should follow the link and see if you have ideas to contribute.  The BOFs should hopefully attract people from outside the usual CUFP audience, and we're hoping it will be a good way for FP developers to get together, talk about issues important to the various and sundry FP communities, and really get some work done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, if you're interested, register &lt;a href=&quot;https://regmaster3.com/2010conf/ICFP10/register.php&quot;&gt;here&lt;/a&gt;.  Note that CUFP is being run as part of ICFP and the family of related workshops, so you go through the same registration process.&lt;/p&gt;

&lt;p&gt;See you in Baltimore!&lt;/p&gt;</content:encoded>
	<dc:date>2010-08-26T00:57:12+00:00</dc:date>
	<dc:creator>yminsky</dc:creator>
</item>
<item rdf:about="http://caml.inria.fr/cgi-bin/hump.cgi?contrib=643">
	<title>The Caml Humps: Frama-C Boron-20100401</title>
	<link>http://caml.inria.fr/cgi-bin/hump.cgi?contrib=643</link>
	<content:encoded>Frama-C is a suite of tools dedicated to the analysis of the source code of software written in C.</content:encoded>
	<dc:date>2010-08-25T17:09:10+00:00</dc:date>
</item>
<item rdf:about="http://caml.inria.fr/cgi-bin/hump.cgi?contrib=294">
	<title>The Caml Humps: Otags 3.11.1</title>
	<link>http://caml.inria.fr/cgi-bin/hump.cgi?contrib=294</link>
	<content:encoded>An Emacs tag generator for Ocaml source files, working also with syntaxes extended with Camlp4.</content:encoded>
	<dc:date>2010-08-25T11:49:20+00:00</dc:date>
</item>

</rdf:RDF>
