Articles Labelled with “Digital life”

Installing OCaml Batteries

In this post I want to help OCaml newcomers to install Batteries. The task is trivial under Linux, while it's a bit tricky under Windows, because OCaml still lacks a self-contained Windows installer.

My assumption is that the reader is a coder, so I will not explain everything… Let's start with the easy part: Linux.

Linux

The installation of OCaml + Batteries under a Debian/Ubuntu system couldn't be easier, thanks the the hard work of the Debian OCaml Task Force. So open a terminal and type:

$ sudo aptitude install ocaml-batteries-included

That's all for Debian/Ubuntu. I don't know how Fedora works, but I think it's easy to install Batteries using YUM, something like:

$ yum install ocaml-batteries-included

If a RPM package for Batteries wasn't available, you could still install OCaml, Camomile (the Unicode library), and compile Batteries from sources, as described below for the Windows OS.

Windows

As said, this OS still lacks a self contained installer which is in progress, at least for installing OCaml. Since many OCaml versions are available for Windows, with different pros and cons, I had to decide which one to use, and I decided to follow the simplest path to reach the goal of installing all the stuff we need. The Cygwin port is by far the simplest way.

  1. Download Cygwin setup and double click the executable. In Windows Vista/7 (I made my test on a Windows 7 64bit box) you will be required to allow the program to be run a couple of times, as usual ;-) …
  2. when the list of available packages appears, select: each and every package containing "caml" (see the screenshot below), and also make, m4, libncurses-devel, git, wget and rlwrap;
    Necessary Cygwin packages
  3. open the Cygwin shell;
  4. download the Findlib library, version 1.2.6:
    $ wget https://download.camlcity.org/download/findlib-1.2.6.tar.gz
    
  5. unpack, compile and install Findlib:
    $ tar -xpzf findlib-1.2.6.tar.gz
    $ cd findlib-1.2.6/
    $ ./configure
    $ make
    $ make install
    
  6. download, unpack, compile and install Camomile 0.8.1:
    $ wget https://prdownloads.sourceforge.net/camomile/camomile-0.8.1.tar.bz2
    $ tar -xpjf camomile-0.8.1.tar.bz2
    $ cd camomile-0.8.1/
    $ ./configure
    $ make
    $ make install
    
  7. the last step is to download compile and install Batteries itself. I wasn't able to compile the latest stable release (1.2.2), for an obscure preprocessor error, but using the latest GIT branch everything went smoothly. So here are the steps:
    $ git clone git://github.com/ocaml-batteries-team/batteries-included.git
    $ cd batteries-included/
    $ make camomile82
    $ make all doc
    $ make install install-doc
    

Testing the installation

Before starting to play with the library and the toplevel (the OCaml REPL is called toplevel) let's put into action a couple of helpers.

  1. The OCaml toplevel doesn't support readline. To get this feature back we add an alias to .bashrc. This works in both Linux and Windows:
    alias ocaml='rlwrap -H /home/paolo/.ocaml_history -D 2 -i -s 10000 ocaml'
    
    restart the terminal or load another bash;
  2. we need to load Batteries in the toplevel. This is not strictly necessary, but it helps a lot and the Batteries ASCII logo is wonderful :-). All we need is to create a file named .ocamlinit in the home directory. Open your favorite editor and put this phrases in ~/.ocamlinit:
    let interactive = !Sys.interactive;;
    Sys.interactive := false;; (*Pretend to be in non-interactive mode*)
    #use "topfind";;
    Sys.interactive := interactive;; (*Return to regular interactive mode*)
    
    Toploop.use_silently 
                 Format.err_formatter (Filename.concat (Findlib.package_directory 
                 "batteries") "battop.ml");;
    

If everything went well you can now type ocaml and something like this should appear:

$ ocaml
        Objective Caml version 3.11.2

      _________________________
    [| +   | |   Batteries   - |
     |_____|_|_________________|
      _________________________
     | -  Type '#help;;' | | + |]
     |___________________|_|___|


Loading syntax extensions...
	Camlp4 Parsing version 3.11.2

Conclusions

This (rather boring) post has been devoted to the installation details of Batteries under Windows, where it presents some difficulties for newbies. Next time we will start on exploring the library with simple examples to exploit its strength.

Pearls of OCaml Batteries (1)

OCaml Batteries logo

OCaml is known to be a powerful functional programming language, but one of its presumed weakness is a relatively poor standard library.

By accident, I'm one of the few people on the planet considering this very clean and virtually bug free library a feature and not a bug, but this is only an opinion.

The standard library contains everything you need to build applications and other libraries, but it's essential, forget something like the Python standard library and things like “sending an email in one line of code”. Instead, think of the C standard library (plus some important data structures missing in the libc).

More than two years ago the OCaml community decided to start the development of a library containing all the conveniences that are missing in the standard library. The project is OCaml Batteries Included and I'd like to introduce the reader with a series of posts, aimed to cast a light on various aspects of the library, without pretending to be an exhaustive tutorial.

The posts will be targeted at novice OCaml programmers because I think that an experienced OCaml hacker already uses "Batteries" or, in any case, he understand the library API and doesn't need help from this blog.

Before starting with the (boring) installation details, I want to give you a taste of Batteries, to show how a simple task could be written in a more natural way using Batteries modules, in comparison with a vanilla implementation. Let's take this simple task: we want to read a file by lines and print on the terminal only those lines containing a particular substring.

A simple and actually working solution is proposed by the PLEAC-Objective CAML project, it's the very first example of the file access section. Here is the proposed code:

let () =
  let in_channel = open_in "/usr/local/widgets/data" in
  try
    while true do
      let line = input_line in_channel in
      try
        ignore (Str.search_forward (Str.regexp_string "blue") line 0);
        print_endline line
      with Not_found -> ()
    done
  with End_of_file ->
    close_in in_channel

Now let's rephrase using Batteries:

Enum.iter
  (fun l ->
    if BatString.exists l "blue"
    then print_endline l)
  (open_in "/usr/local/widgets/data" |> BatIO.lines_of)

The result is the same, but the code is much cleaner and far more idiomatic for a functional language.

Next time we will see how to install OCaml and Batteries, under Linux of course, but hopefully even under Windows.

Lyrics in Banshee

Screenshot of the glorious lyrics plugin of Banshee

Is it only me, or the lyrics plugin of Banshee (1.8.0) doesn't work at all?

How is it possible not to find the lyrics of “Gimme Some Lovin'” of the Blues Brothers?

Bravo!

Playing with the Google Buzz API I accidentally deleted all of my posts.

Bravo Paolo!

Smart programmers

Image with a forbidden Java logo

Do you remember the old article from Paul Graham about the comparison between Python and Java? It's entitled “Beating the averages” and despite the fact that it was written in 2003, it's still relevant.

Why? Try this, and you will be enlightened.

Thanks to Birdack for this link!

(Local copy here for posterity.)

(Bad) news from Last.fm

Last.fm logo

Some days ago Last.fm announced huge changes in the availability of thematic radios, in particular the cancellation of the “favorites” radio and the personal tag radio. At the end of this post you can find a copy of the original announce.

Since I'm a Last.fm subscriber and therefore I pay for the service, my first reaction has been of extreme disappointment. When I read the reason why the service has been suspended, the disappointment turned into outrage:

Licensing music is a complex and labour intensive process. By discontinuing a few stations, we're able to focus our energy on improving our most popular features, developing new and innovative stations, and offering the best music discovery service to our global audience.

Is managing the licenses so complex? And what happened to the money I pay for the service and the licenses?

The overall result is that I can not listen to “Jazz” or “Pop” radios anymore and, obviously, I will not renew my subscription.

Click here to read the Last.fm original announcement

Your browser doesn't support the "iframe" HTML element.

Sorpresa (brutta) da Last.fm

Last.fm logo

Qualche giorno fa Last.fm ha annunciato grossi cambiamenti nella disponibilità di radio tematiche, in particolare la cancellazione della radio con i propri “brani preferiti” e quelle con le tag personali. In fondo a questo post trovate una copia locale dell'annuncio originale.

Siccome sono abbonato a Last.fm e quindi pago per un servizio, la mia prima reazione è stata di estremo disappunto. Quando ho letto la motivazione per la quale il servizio è stato sospeso il disappunto si è trasformato in indignazione:

La gestione delle licenze musicali è un processo complesso che richiede molte risorse. Eliminando alcune stazioni, saremo in grado di concentrare le nostre energie nel migliorare le funzioni più rinomate del sito, sviluppare innovative stazioni e offrire al nostro pubblico globale un servizio di esplorazione musicale senza precedenti.

Gestire le licenze è così complesso? E i soldi che pago, proprio per gestire il servizio e le licenze, che fine hanno fatto?

Il risultato complessivo è che non posso più ascoltare una radio “Jazz” o “Pop” come facevo prima e, ovviamente, non rinnoverò l'abbonamento.

Fai clic qui per vedere l'annuncio originale di Last.fm

Il tuo browser non supporta l'elemento HTML "iframe".

Copyright © 2004–2019 by .
Creative Commons License Content on this site is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.5 Italy License.

RSS Feed. Valid XHTML 1.1. This blog is written in Objective Caml. Design based on the work of Rodrigo Galindez.