Chetan Mittal
Chetan Mittal Dev - Tech Blog

Follow

Chetan Mittal Dev - Tech Blog

Follow

Glad to be using Ruby since 2005

This article compares Ruby with OCaml by writing a small program to goto my this blog and print images on console .. Ruby is easy

Chetan Mittal's photo
Chetan Mittal
·Apr 13, 2023·

3 min read

Glad to be using Ruby since 2005
Play this article

I randomly reached OCaml while searching some stuff on Google. I had heard of this software programming language before during my Uni days, however, I never learned and used it.

Maybe I picked up a scripting language TCL more quickly than some typed functional language OCaml.

Anyways, I thought it would be a good idea if I pick up OCaml today and try writing a simple program in it that I had written using Ruby earlier.

The Ruby program is very simple. It just goes to my blog by using open-uri gem and then just accesses the DOM by using nokogiri gem, and then just iterates through all the img tags and prints their URLs with alt-text on the console. Here it is:-

require 'nokogiri'
require 'open-uri'

url = 'https://blog.chetanmittaldev.com/'

html = URI.open(url)
doc = Nokogiri::HTML(html)

image_count = 0

doc.css('img').each do |img|
  image_count += 1
  puts "#{img['alt']}: #{img['src']}"
end

puts "Total images: #{image_count}"

The above code just prints all the image links with their alt-texts from my blog as shown below:-

There are a total of 38 images as of before publishing this blog post.

The same code to write in OCaml; first it is pretty hard to find in its documentation which library does what; second, configuring a program's compile build with libraries is such a pain.

And, third, each time I installed a library using its package manager called opam, which doesn't even try to find, fetch, and install a package's dependencies if the package you are installing hasn't been updated for a long time, I had to run two commands $ opam user-setup install and $ eval 'opam config env' that configure and evaluate respectively the OCaml environment I guess.

Anyways, I asked ChatGPT to generate a program in OCaml from my Ruby code and it generated some non-working code below:-

open Nethttp_client.Convenience
open Tyxml.Xml

let url = "https://blog.chetanmittaldev.com/"

let () =
  let conn = new Nethttp_client.connection url in
  let html = http_get conn in
  let doc = parse_string html in

  let image_count = ref 0 in

  List.iter (fun img ->
    incr image_count;
    let name = attrib img "alt" in
    let url = attrib img "src" in
    Printf.printf "%s: %s\n" name url
  ) (children (List.hd (children doc)));

  Printf.printf "Total images: %d\n" !image_count

I used OCaml's build system called dune to generate a new project structure as below:-

Then I configured my dune build file with the required libraries, and wrote some code:-

(executable
 (public_name scrape)
 (name main)
 (libraries netclient curl lwt)
 (preprocess (pps lwt_ppx)))

Oh, I forgot to mention, I spent a few hours, finding "how to install OCaml", and then installing it on my EndeavourOS.

And, when I tried to build or compile my OCaml code by running $ dune build then I got these errors as below:-

Hmm, I tried installing the curl package for OCaml:-

$ opam install curl

The package was "NOT FOUND". Amazing, right? curl is not available.

What can I say, the whole ecosystem of OCaml is not right if it doesn't have the curl package and ChatGPT writes OCaml programs using it.

The Ruby software programming language is the best for me. Just 12 lines of code to scrape my blog. I am happy. Python and Javascript are equally good. Easy to read and write.

 
Share this