[Caml-list] Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt
2022-09-13T08:40:45Z

[-- Attachment #1: Type: text/plain, Size: 17186 bytes --]

Hello

Here is the latest OCaml Weekly News, for the week of September 06 to
13, 2022.

Table of Contents
─────────────────

Caqti 1.9.0 and Plans for 2.0.0
Outreachy summer ’22 closing commemoration session on 23rd Sept
MirageOS for B2B SaaS
Tuareg and Caml modes for Emacs: what are the differences?
Engineer position at Imandra (Austin TX/UK)
Acme plumbing rules for OCaml
Other OCaml News
Old CWN

Caqti 1.9.0 and Plans for 2.0.0
═══════════════════════════════

Archive:
<https://discuss.ocaml.org/t/ann-caqti-1-9-0-and-plans-for-2-0-0/10448/1>

Petter A. Urkedal announced
───────────────────────────

First I would like to announce the 1.9.0 minor release, see the
release notes below for details.

There is also ongoing work in the [caqti2 branch] targeted for the
next major release. If someone have an opinion on directions, we can
discuss it here, or in the issue tracker ([meta-issue]), see my brief
notes below.

I will attend parts of the ICFP 2022 virtually next week so there may
be time to discuss over audio.

[caqti2 branch] <https://github.com/paurkedal/ocaml-caqti/tree/caqti2>

[meta-issue] <https://github.com/paurkedal/ocaml-caqti/issues/90>

Release Notes for 1.9.0
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

New features:

• Allow unquoted semicolons in query strings in the new API. There are
corner cases where it is needed, as reported in issue #87, and a
parser which rejects semicolons are still available for loading
schema files statement by statement.

• Add support for MySQL and MariaDB configuration files, as a solution
to issue #86.

• Add a limit to the number of times a database connection is reused
when pooling connections (#94). Thanks to Peter Mondlock for
investigating resource usage server side motivating this addition.

• Provide access to the raw SQLite3 connection handle for the purpose
of defining custom functions (#56).

Fixes:

• Add missing dune dependency on unix (GPR#85 by David Allsopp).

• Documentation fixes (GPR#82, GPR#83, GPR#84 by Reynir Björnsson,
GPR#88 by Jonathan Duarte, and GPR#92 by Jim Tittsler).

Deprecations:

• `Caqti_type.field' was deprecated in favour of `Caqti_type.Field.t'.

Other:

• Replace deprecated core_kernel dependency with core.

Notes on 2.0.0 Development
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

The main addition is pgx and mirage support. It is already functional,
but not very useful for production, since it lacks TLS. The trick here
is that PostgreSQL uses STARTTLS, so we can’t use conduit-lwt as-is.

Another thing in progress, but unpublished, is [per-connection
configuration]. Up till now, configuration has only been possible
through the connection URL or behind-the-scene via C libraries (now
also for MariaDB). However, this will no longer be practical for
delivering CA certificates to pgx. Two design issues which you may
have an opinion about:

• Driver specific options can be defined in the `caqti' package or in
`caqti-driver-*' packages. In the former case, the configuration can
be manipulated without depending on specific drivers, but the
downside is that we will pull in dependencies on `x509',
`domain-name', `ipaddr' and possibly `tls' and `sexplib0'.
• My current sketch provides sexp-serialisation, a choice mainly
motivated by the availability of such serialization for client
configuration of `tls', but I hope to find a more generic solution
which allows easy embedding of Caqti configuration in application
configuration independent of which format is used.

An example of how an sexp-formatted configuration might look like:
┌────
│ (connection
│ (pool
│ (max-use-count 20)
│ (max-idle-size 10))
│ (driver postgresql)
│ (endpoints
│ (inet pg1.example.org)
│ (inet pg2.example.org))
│ (target-session-attrs read-write))
└────
where the `(pool ...)' clause is driver-indepnedent and the `(driver
...)' clause determines which DB-specific options are valid. In the
current draft, order does not matter despite this dependency.

(I could also mention plans of wrapping modules, but this will be done
first as a forward-compatible module in parallel to the current
modules preferably at the beginning of a major release cycle. The
reason I haven’t written that main `Caqti' module yet, is that I would
like to take the opportunity to tidy up the namespace to make it
easier for newcomers to discover the main entry points.)

[per-connection configuration]
<https://github.com/paurkedal/ocaml-caqti/issues/89>

Outreachy summer ’22 closing commemoration session on 23rd Sept
═══════════════════════════════════════════════════════════════

Archive:
<https://discuss.ocaml.org/t/outreachy-summer-22-closing-commemoration-session-on-23rd-sept/10450/1>

Moazzam Moriani announced
─────────────────────────

I, along with Jay, were the two [Outreachy] interns working with the
OCaml :camel: community this summer. I worked on [Multicore
Applications] and Jay on [TopoJSON]. Our internship, of course, was
only made possible because @sudha and @patricoferris generously chose
to volunteer to mentor us–as our respective mentors–throughout the
summer. We are grateful to the both of them :heart:.

Our three-month long Outreachy internship just ended relatively
recently and, personally, I have really enjoyed working on my project
and learning OCaml. So much so that Jay and I would like to share our
experiences with the rest of the community. :sparkles:

To carry forward a tradition established by the [previous Outreachy
cohort], we will host a virtual session that will consist of two short
presentations from the both of us followed by a Q&A. The session will
be on Friday 23rd September 2-3pm CET.

It is open to whoever wishes to join. A recording will be shared later
online as well.

We hope you will join us! :raised_hands:

[Outreachy] <https://www.outreachy.org/>

[Multicore Applications] <https://github.com/ocaml-bench/sandmark>

[TopoJSON] <https://github.com/geocaml/ocaml-topojson>

[previous Outreachy cohort]
<https://discuss.ocaml.org/t/friday-03-04-intern-presentations-open-attendance/9429>

Marcus Rohrmoser asked and Moazzam Moriani replied
──────────────────────────────────────────────────

I suppose you mean CEST i.e.
2022-09-23T14:00:00+02:00/PT1H

Yes I do. Thank you for pointing it out.

MirageOS for B2B SaaS
═════════════════════

Archive: <https://discuss.ocaml.org/t/mirageos-for-b2b-saas/10454/1>

Volodymyr Melnyk asked
──────────────────────

I have an idea to build a SaaS for corporate blogging (like Medium,
but for companies) and I want to try MirageOS as a total platform for
services. I have no production experience with OCaml (only Golang, JS,
Ruby) and have no experience with MirageOS and unikernels (only
Docker, Linux, and a little bit k8s), but I’m very interested in both.
Could you please help me to clarify possible issues with such an
approach?

Also I’m interested about a hosting for MirageOS services. I don’t
like containers and k8s stuff and I prefer dedicated and virtual
servers instead of cloud stuff because I have no resources to pay up
to 5x more for hosting.

Thank you for your help!

Calascibetta Romain replied
───────────────────────────

Thank you for your interest in MirageOS. MirageOS is first and
foremost a framework for creating an application (such as a blog) for
several targets. One of these targets is [Solo5] which allows to
create an entire system which includes everything necessary for OCaml
(its runtime). Thus, one can deploy a MirageOS application on:
• KVM (with the target `hvt')
• [Xen]
• or produce a simple executable taking advantage of [seccomp] (and
thus finely controlling access to the executable).
• we can also mention the experimental target for [Raspberry Pi 4]

The objective of MirageOS is to make the choice of targets transparent
to the application. This means that for a given application, deploying
for KVM or Xen should not be an upstream choice (which would govern
the development of the application) but the last of the choices which
can, of course, be left to third party users.

This reverses the development logic of an application thanks to
abstraction mechanisms (specific to OCaml) (the [functors]) that allow
to get rid of any specialisation to a given system (Solo5, Unix,
Raspberry Pi, etc.).

This is of course the theory and in practice, it works quite well :) .

To take the example of the blog, you can see [Hannes’ blog] or [mine]
which runs on MirageOS (KVM). The latter have a similar architecture:
a unikernel managing TLS certificates and redirecting HTTP connections
to unikernels on a local network ([tlstunnel] or [contruno]) and a
unikernel ([unipi]) that only transmits what appears in a Git
repository via the HTTP protocol (http/1.1 and h2).

Deployment depends of course on what you have. Regarding KVM, you can
follow the tutorials [here] (quite general) and [there]. You can
deploy your unikernels on Google Cloud with this (probably a bit old)
[tutorial]. Finally, a deployment with seccomp is possible, it is a
simple executable.

Of course, most of these unikernels are already available for download
[here] thanks to the excellent work of [robur.io]. It is ensured that
the generated image is reproducible regardless of the context.

There is of course a whole series of unikernels made by the community
that you can mainly find on GitHub. We can talk about several services
like [DNS] or [emails].

I would like to specify that all this is still experimental. We are
gradually reaching the stage where our unikernels are used in
production domains, but it still requires a lot of work and a lot of
skills for such a small team :) . Of course, we are open to everyone’s
participation and we are especially here to help newcomers.

[Solo5] <https://github.com/Solo5/solo5/>

[Xen] <https://xenproject.org/>

[seccomp]
<https://code.google.com/archive/p/seccompsandbox/wikis/overview.wiki>

[Raspberry Pi 4] <https://github.com/dinosaure/gilbraltar/>

[functors] <https://ocaml.org/docs/functors>

[Hannes’ blog] <https://hannes.nqsb.io/>

[mine] <https://blog.osau.re>

[tlstunnel] <https://github.com/roburio/tlstunnel>

[contruno] <https://github.com/dinosaure/contruno>

[unipi] <https://github.com/roburio/unipi>

[here] <https://robur.coop/Projects/Reproducible_builds>

[there] <https://blog.osau.re/articles/blog_requiem.html>

[tutorial]
<https://github.com/aantron/dream/tree/master/example/w-mirage>

[here] <https://builds.robur.coop/>

[robur.io] <https://robur.io/>

[DNS] <https://github.com/roburio/dns-primary-git>

[emails] <https://mirage.io/blog/2022-04-01-Mr-MIME>

Tuareg and Caml modes for Emacs: what are the differences?
══════════════════════════════════════════════════════════

Archive:
<https://discuss.ocaml.org/t/tuareg-and-caml-modes-for-emacs-what-are-the-differences/10285/12>

Deep in this thread, Tim McGilchrist announced
──────────────────────────────────────────────

I wrote up a longer form version of my setup at
<https://lambdafoo.com/posts/2022-09-07-ocaml-with-emacs-2022.html>
There are still some bits I am not happy with but I have been using it
daily. Also @bbatsov wrote his version at
<https://batsov.com/articles/2022/08/23/setting-up-emacs-for-ocaml-development/>

Engineer position at Imandra (Austin TX/UK)
═══════════════════════════════════════════

Archive:
<https://discuss.ocaml.org/t/engineer-position-at-imandra-austin-tx-uk/10465/1>

Simon Cruanes announced
───────────────────────

[Imandra] is looking for a full time engineer in the UK or in Austin,
Texas.

The job offers can be found [here].Imandra is an AI startup developing
a cloud-native automated reasoning engine for analysis of algorithms
and data. Whether you’re writing mission-critical code or need to
understand the countless complex decisions that a system may make, use
Imandra to ensure the algorithms you create are safe, explainable and
fair. OCaml is the main language used at Imandra.

[Imandra] <https://imandra.ai/>

[here] <https://apply.workable.com/imandra/>

Acme plumbing rules for OCaml
═════════════════════════════

Archive:
<https://discuss.ocaml.org/t/acme-plumbing-rules-for-ocaml/10467/1>

David A. Arroyo announced
─────────────────────────

I am sure that the intersection of OCaml users and [Acme] users is
small, but I have reason to believe it is a non-zero set :) . For
those of you using this spartan editor, here are some plumbing rules
that I use that allow me to right-click on error messages returned by
the OCaml compilers, and jump to the referenced location in acme:

┌────
│ # example: in file "foo/bar.ml", line 155, characters 30-62
│ type is text
│ data matches '.*[Ff]ile "([^"]+)", line ([0-9]+), characters ([0-9]+)-([0-9]+).*'$nl'?'
│ arg isfile $1
│ data set $file
│ attr add addr=$2-#0+#$3,$2-#0+#$4
│ plumb to edit
│ plumb client $editor
│
│ # example: File "tests/dune", line 2, characters 7-22:
│ type is text
│ data matches '.*[Ff]ile "([^"]+)", lines ([0-9]+)-([0-9]+).*'$nl'?'
│ arg isfile $1
│ data set $file
│ attr add addr=$2,$3
│ plumb to edit
│ plumb client $editor
└────

It could probably be extended to search `~/.opam' so you could plumb
errors in files outside of your project, but I do not use opam, so I
haven’t needed to do it.

Here is a short demo of its use: <https://youtu.be/Evl-N0oNNd0>

It’s not in OCaml, but I also wrote
<https://github.com/droyo/acme-autoformat> and put an `OcamlFmt'
script in acme’s $PATH like so:

┌────
│ #!/bin/sh
│ exec /usr/local/bin/acme-autoformat -r '\.mli?$' \
│ -- ocamlformat --name='{{.Basename}}' --enable-outside-detected-project -
└────

This calls `ocamlformat' whenever I Put an .ml[i] file. This is
probably obviated by combining acme-lsp and ocaml-lsp, but these two
bits work well enough that I haven’t felt a need to pursue it.

[Acme] <https://acme.cat-v.org/>

Other OCaml News
════════════════

>From the ocaml.org blog
───────────────────────

Here are links from many OCaml blogs aggregated at [the ocaml.org
blog].

• [Tarides Sponsors Girls Can Code]
• [Introducing the Jane Street Graduate Research Fellowship]

[the ocaml.org blog] <https://ocaml.org/blog/>

[Tarides Sponsors Girls Can Code]
<https://tarides.com/blog/2022-09-06-tarides-sponsors-girls-can-code>

[Introducing the Jane Street Graduate Research Fellowship]
<https://blog.janestreet.com/graduate-research-fellowship/>

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]

[send me a message] <mailto:alan.schmitt@polytechnique.org>

[the archive] <https://alan.petitepomme.net/cwn/>

[RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss>

[online] <http://lists.idyll.org/listinfo/caml-news-weekly/>

[Alan Schmitt] <https://alan.petitepomme.net/>

[-- Attachment #2: Type: text/html, Size: 27859 bytes --]