Previous week Up Next week

Hello

Here is the latest Caml Weekly News, for the week of 28 September to 05 October, 2004.

  1. OCaml code/algorithms for displaying directed graphs
  2. really HO Functions
  3. Dumping the OCaml state
  4. GODIVA 0.9.4 - GODI packaging made easy
  5. New release 2.2 of camlimages
  6. New release of advi
  7. New release of WhizzyTeX
  8. Ocaml server pages?

OCaml code/algorithms for displaying directed graphs

Archive: http://caml.inria.fr/archives/200409/msg00501.html

Richard Jones asked:
I have a directed graph (actually, links between web-pages).  I'd like
to display it "as planar as possible".  Are there any OCaml tools or
libraries which I can use?  The nearest I've found is ocamlgraph which
looks nice but doesn't seem to deal with the display side of things.
    
Keith Wansbrough answered:
Almost certainly Graphviz is your friend; specifically, the "dot" program.

  http://www.research.att.com/sw/tools/graphviz/

It's very easy to write your own binding to this (i.e., write out a
simple text file in .dot format), although I'm sure someone has
written one themselves if you prefer.

Another option is daVinci, but it went commercial a while ago - I'm
not sure what the license terms are.  It was certainly open and free
once upon a time.

  http://www.b-novative.com/products/daVinci/daVinci.html
    
Jean-Christophe Filliatre answered:
Indeed, ocamlgraph does not deal  with the display of graphs, which is
notoriously a difficult problem (and we are not graphs specialists, so
we won't enter such a trap). However, ocamlgraph has an output for the
ASCII .dot  format, to be used  for instance with the  Graphviz set of
tools:  http://www.research.att.com/sw/tools/graphviz/   (there  is  a
Debian package called graphviz for instance)

Among these  tools there  is one displaying  graphs (called  dot, with
outputs in various formats  including PostScript), which makes efforts
to  display planar graphs  (but sometimes  it fails  to draw  a planar
graph as planar). The dot input syntax is very simple.

On the Graphviz web site, you'll also find a lot of material regarding
the problem of graph layout.
    
Nicolas Cannasse answered:
You might have a look at Tulip :
http://tulip-software.org/
Last time I got demonstration of it, it was great !
(checkout the screenshots ^^)
    
Markus Mottl answered:
As others have already mentioned, Graphviz (the "dot"-utility) should
provide the layout functionality you need for your graphs.  If you need
an example of how this can be used from OCaml, just take a look at the
POMAP-library.  It uses "dot" to display partially ordered maps:

  http://www.oefai.at/~markus/home/ocaml_sources.html#POMAP
    
Diego Olivier Fernandez Pons answered:
Graph drawing is an open and active research topic which makes a heavy
usage of state-of-the-art optimization tools and algorithms.

Displaying a graph "as planar as possible" is (of course) an NP-hard
problem and even a very hard one because constraints are not totally
explicit (most of the time you would like an interactive tool that
allows you to add and remove constraints while looking for a
satisfactory answer).

Try AGD (it is built over LEDA)

   http://www.ads.tuwien.ac.at/AGD/
    

really HO Functions

Archive: http://caml.inria.fr/archives/200409/msg00518.html

Radu Grigore asked:
For this message I'll classify functions on "levels" based on how many
nested parenthesis are needed to represent their type.

Functions of level 0 (e.g. int -> int, char -> int -> int, ...) are
the most used in programming. In widespread languages like C#, Java
and C++ they are almost the only kind of functions used.

Functions of level 1 (e.g. ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)) are
used a lot when programming in a functional language. They are also
the ones that appear in examples and tutorials written for imperative
programmers. This category includes fold, iter, map, composition.

However a language like OCaml allows N to go up as much as you want.
My question is: are there functions of level >= 2 used in practice
(e.g. (('a -> 'b -> 'a) -> 'a -> 'b list -> 'a) -> 'c)? If so, are
there any typical ones that appear in many applications (maybe not as
widespread like map & company but at least of comparable usefulness)?
One example of a level 2 function (stolen from a recent post by Jon
Harrop) is this:
  let sum fold = fold (+);;
    
Jacques Carette answered:
The best answer is from Chris Okasaki in
Even Higher-Order Functions for Parsing or Why Would Anyone Ever Want To Use
a Sixth-Order Function? by Chris Okasaki. Journal of Functional Programming,
8(2):195-199, March 1998.

Abstract: We illustrate the use of third-, fourth-, fifth-, and even
sixth-order functions with examples taken from a combinator parsing library.


Available at http://www.eecs.usma.edu/Personnel/okasaki/jfp98.ps
    
Jean-Baptiste Rouquier answered:
In my soon-to-be-released library to read and write configuration files, I have
one example of this. Basically, the function reading a file (actually a method)
has on optional argument that allows the user to override the default behaviour
in case there is an error.
The argument is itself a function that get all the available information as
arguments, including a value of type (out_channel -> unit) that pretty print
(with module Format) a part of the read AST to the given output channel.
So I have
    method read : ... -> ... ->
      ?on_type_error : (... -> ... -> (out_channel -> unit) -> ... -> unit) ->
      string -> unit

Out of curiosity, may I ask why you're looking for such functions ?
    
Jon Harrop answered and Marcin Kowalczyk added:
> I've just had a look through some real programs that I've written and the
> answer is definitely yes. I use them quite a lot. For >2 they are mainly 3,
> sometimes 4 and I haven't seen any >4.

http://citeseer.ist.psu.edu/okasaki99functional.html
    

Dumping the OCaml state

Archive: http://caml.inria.fr/archives/200409/msg00524.html

Bob Solovay asked and John Harrison answered:
> There used to be a command in Common Lisp "dump" which would store
> an executable image to a file that could then be restarted. My
> question is: is there something like this in OCaml.

As Carl Witty pointed out to me recently, there are quite a few
checkpointing programs that can dump an arbitrary process so that
it can be restarted later in the same state. I've recently been
using "ckpt" to save an OCaml toplevel session with HOL Light
preloaded, and it works very well. Maybe other OCaml users would
find the same thing useful. See:

http://www.cs.wisc.edu/~zandy/ckpt/

The only drawback is that this program is Linux-specific. There's
a long list of alternatives at http://www.checkpointing.org, but I
haven't found a suitable one for Windows. If anybody knows of one
(even if it only works under Cygwin) I'd be very interested.
    

GODIVA 0.9.4 - GODI packaging made easy

Archive: http://caml.inria.fr/archives/200410/msg00001.html

Owen Gunden announced:
GODIVA, the GODI Verpacken Assistant, is a tool for making GODI packages.
GODI is the holy grail solution to O'Caml's package management problems,
but the interface for creating packages, being based on NetBSD pkgsrc, is
frequently overly complex.  GODIVA provides a solution by accepting a
comparatively simple package specification and transforming it into a full
and proper GODI package.

Between version 0.9.0 and 0.9.4, several bugs have been fixed and
significant interface changes have been made.  Even better, there's a
man page!  For a detailed list of changes, consult the changelog[1].

To get GODIVA:
$ godi_console update
$ godi_console wish -build apps-godiva
$ godi_console perform -wishes

GODIVA webpage:
    http://projects.phauna.org/GODIVA/

Enjoy!
Owen Gunden
Will Lovas
GODIVA hackers

1: http://projects.phauna.org/GODIVA/docs/changelog.txt
    

New release 2.2 of camlimages

Archive: http://caml.inria.fr/archives/200410/msg00020.html

Pierre Weis announced:
I'm glad to announce the availability of the 2.2 version of the
CamlImages library, by Jun Furuse, François Pessaux, and Pierre Weis.

CamlImages is an image processing library, which provides to the
objective Caml programmer a lot of image processing functionality.

The version 2.2 is a stable development release:

- complete code review and rewriting of files (including auxilliaries such as
Makefiles and configuration files).

- better integration with the rest of the Objective Caml system by
renaming of the main module, originally named "Image", into the new
module name "Images". This solves a long standing problem of name
clashes with other module names provided by other libraries. However,
this is not backward compatible and you will have to modify your old
programs according to the new naming scheme: you must change
references to Image.x into references to Images.x (and similarly from
oImage.x to oImages.x). As usual, the Caml compiler will help a lot to
point out obsolete name occurrences.

- the whole set of compiled files are now installed in the library
installation directory (generally /usr/local/lib/ocaml/camlimages).

- a new export for the Ps module:
  get_bounding_box : string -> bounding_box
  returns he bounding box option of a postscript file image.

CamlImages provides to the objective Caml programmer:

  ** basic functions for image processing and loading/saving various image
  file formats (hence providing a translation facility from format to format),

  ** an interface with the Caml graphics library allows to display
  images in the Graphics module screen and to mix them with Caml
  drawings,

  ** a freetype interface, integrated into the library:
  you can draw texts into images using any truetype fonts,

  ** a set of example programs, including gif animation, slide show,
  and a postscript converter to print images.

Sources and documentation are available from:

http://pauillac.inria.fr/camlimages/eng.htm

ftp://ftp.inria.fr/INRIA/Projects/cristal/caml-light/bazar-ocaml/camlimages-2.2.tgz

Contributions and comments are welcome.
    

New release of advi

Archive: http://caml.inria.fr/archives/200410/msg00023.html

Pierre Weis announced:
                       Active-DVI


Active-DVI is a presenter and previewer for texts or slides written in LaTeX,
hence the presentation tool of choice for the discriminating hacker.

Version 1.6.0 is now available. As the release number shows, this is a
major improvement w.r.t version 1.4.0 of Active-DVI.

This new version has been developed by Jun Furuse, Didier Rémy and
Pierre Weis with also contributions by Roberto Di Cosmo.

In addition to the regular features of the Active-DVI previewer:

   * Encapsulated Postscript File inclusion
     (using the graphics LaTeX package)

   * Some effects for presentation (pause, delay, text color change)

   * Embedded applications

this release introduces a lot of new features

   * Improved API for embedded applications.

   * Support for X colors via an additional xwindows-colors.sty LaTeX package.

   * Thumbnails to see the entire presentation at a glance (press T to
     build the thumbnails, then t to toggle from thumbnails to your
     presentation).

   * Hyper references can now be made invisible.

   * Enhanced background possibilities.

   * A laser pointer.

   * Support for ``scripting'' from within the LaTeX source file via
     key bindings events generation.

   * Programmable save-slide feature.

   * An additional advi-slides.sty package facilitates easy
     presentations and is specially devoted to the impatient and/or
     the beginner. (Comments on this new package are warmly welcome.)

   * Additional examples, including simple ones for the slitex LaTeX package.

   * An improved manual.

Play advi on the demonstration presentation demo.dvi that is in the test
directory of the distribution. Look at source code of the various talks in
the directory ``examples''.

The source code and more information are available at

    http://pauillac.inria.fr/activedvi/

Once again, contributions and comments are warmly welcome.

Mailing list advi-list-request@pauillac.inria.fr
Bug reports to advi-bugs@pauillac.inria.fr
    

New release of WhizzyTeX

Archive: http://caml.inria.fr/archives/200410/msg00027.html

Didier Remy announced:
It is my pleasure to announce a new release of WhizzyTeX.

WhizzyTeX is an Emacs minor mode for incrementally viewing LaTeX documents
that you are editing. It works under Unix with gv and xdvi viewers, but the
Active-DVI viewer (see http://pauillac.inria.fr/activedvi/) will provide
much better visual effects and will offer more functionalities.

Version 1.2.0 is now available.

The source code, documentation, and information are available at

        http://pauillac.inria.fr/whizzytex/

Bug reports to whizzytex-bugs@pauillac.inria.fr


This release is compatible (and required) with the freshly released version
1.6.0 of Active DVI.  Conversely, version 1.6.0 of Active-DVI is required
for this release to benefit from some of the new WhizzyTeX features.  This
release also contains several bug fixes and improvements since version 1.1.
Significant and user-visible changes are:

 - Better support for debugging.

 - Duplex views: both the slice and the full document can now be viewed in
   the same Active DVI window. Switching between views can be done
   explicitly by typing 'w' or implicitly when clicking on cross-references
   that are outside of the current slice.

 - Support for whizzy-edition, which is especially usefull to seize
   scaling factors or dimensions by mouse.

For more details see the web site.

Enjoy,

        Didier Rémy


PS:

To keep informed of upgrades, check the WhizzyTeX WEB page occasionally, or
just watch the content of the file http://pauillac.inria.fr/whizzytex/VERSION .

----------------
WhizzyTeX does not uses Ocaml, but it calls Active-DVI, which uses Ocaml :-)

                                      Ocaml inside
                                          ||
                                          ||
                                          \/
               Emacs --> WhizzyTeX --> Active-DVI
                /\                          |
                 |                          |
                  \________________________/
    

Ocaml server pages?

Archive: http://caml.inria.fr/archives/200410/msg00026.html

Richard Jones said, Nicolas Cannasse asked, and Richard Jones answered:
Nicolas Cannasse wrote:
> Richard Jones wrote:
> > Note that there are at least 4 different ways to do web stuff with
> > OCaml, all with their own pros and cons.  At some point I intend to
> > write up a summary, but in the meantime, here are the three (other)
> > packages in no particular order.  You can go to their web pages and
> > read about them:
>
> Could you quickly sum up theses differences for this list readers ?
> I'm recently interested in high level server side languages.
> Any hint to show me what's "best" is apprecied.

I'm not going to claim that any of the four approaches is best, but I
will try to summarise them as far as my understanding goes.  Please
don't flame me too much for this; and do also note that I am the
author of mod_caml.

** mod_caml

mod_caml sits inside the Apache process, and its strengths and
limitations derive from this fact.  Because it's inside the process,
it has full access to the Apache API, which means that you can, for
example, make subrequests, or write an authentication handler, or
write a more sane URL mapping system than mod_rewrite, or [coming
soon, with Apache 2.0] use OCaml code to post-process the output of
some other CGI script written in another language.

It's completely tied to Apache.  You have no other webserver choice
once you've decided to use mod_caml.

Apache preforks itself, so there are actually several instances of
your code running, in separate processes, all working on separate HTTP
requests.

Because it uses Dynlink to load code, you can only use bytecode.  (I
would argue that most web applications are heavily IO bound, so this
isn't a problem.  But I can certainly imagine some compute-intensive
application, or part of an application, where the lack of native
compilation would be a serious shortcoming).

It doesn't use Gerd's Netcgi module, but instead uses its own which is
basically a reimplementation of Perl's Cgi.pm in OCaml.  This is good
news for ex-Perl refugees like me, of course.  mod_caml itself is
independent of ocamlnet, but I personally use quite a lot of ocamlnet
functions.  The 2.0 release of COCANWIKI will depend on ocamlnet for
URL parsing, generating and parsing MIME emails, and maybe other
stuff.

It comes with a template library to enforce correct separation of code
and HTML.  You can see this in action by grabbing the COCANWIKI 1.0
distribution from http://sandbox.merjis.com/ and comparing the
scripts/ and templates/ directories.

** ocamlnet & asxcaml

ocamlnet runs outside the web server, using either FastCGI or JSERV to
communicate with the web server.  (Or you can run your scripts as
ordinary CGI external programs, but I wouldn't recommend that for
serious use).  Your program is linked together into a single binary
which, when started, is a FastCGI or JSERV server, and processes
requests either sequentially or by forking a new process for each
request.  The webserver then acts as a proxy between the browser and
your program.

There are two important consequences of this: (1) You can use native
code. (2) Your whole program is compiled together a single unit.

There's no templating or database access, but you could easily add
these by using mod_caml's templating system or CamlTemplate, and
ocamldbi respectively.

AS/XCaml is built on top of ocamlnet, and I'm not going to claim to
fully understand it or even to have used it.  However the big feature
is the statically typed SQL implementation.  This is a big improvement
over ocamldbi (which can throw type errors at runtime if your database
returns a field with an unexpected type).  The reason I didn't do this
for ocamldbi was because it would involve fully parsing every variant
of SQL and/or limiting the complexity of SQL queries permitted.
AS/XCaml uses an XML file to describe your database schema, and from
this (I'm guessing) derives the schema and queries.  In concept this
is very similar to PDL
[http://www.redhat.com/docs/manuals/waf/rhea-dg-waf-en-6.1/s1-pers-pdl.html].

** mod_ocaml

This is another Apache module.  It's similar in concept to JSP or PHP.
You actually embed OCaml code into your webpage.  The webpage is then
compiled (with ocamlc) and run on the fly.  Your OCaml code prints
HTML.

Having worked in a professional web applications outfit for a few
years, I can't in all conscience recommend embedding code into web
pages which designers might try to edit.
    

Using folding to read the cwn in vim 6+

Here is a quick trick to help you read this CWN if you are viewing it using vim (version 6 or greater).

:set foldmethod=expr
:set foldexpr=getline(v:lnum)=~'^=\\{78}$'?'<1':1
zM

If you know of a better way, please let me know.


Old cwn

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.


Alan Schmitt