From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 5F8A9E0038 for ; Tue, 13 Sep 2022 10:40:45 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: MDCfbrMc9Oqm4VIAVbGMDp4vu9hrmb+M4Kv4TQiFvICrrCWU+PJJCfZtnOnzqz8vBxmfKr6F4S 2PvuryEe9EbPylluaF2E8LwzgnSGylNcn/HCCoV4qFOfmfcvzxcBPfL882GjrX56rSzIlMR0nE XvTcobt/XkDNwSg1XaZtlgK+wS6AhZ1MA9Fdb+wo/OQ9iGEFmJSdOUNyyOqs8yq6jxiXnkwG+8 HJ1bCri44kuRZpXegfxHZNVJb7gL3FQwT3DnV4JmyL/KZ70Ny1mzOczfvR1y80FsCdvs9yYWup keHCa3OsUKQkux42U1U6x5Yj X-IPAS-Result: =?us-ascii?q?A0CRAQCnQCBjmCIeaIFaAR0BEgsBDIIEC4EhgQMZAWdWL?= =?us-ascii?q?gcIRYROiH6IFIEWiEiHCYwqFIERA08QAQMBDSwBDAYBAgQBAYQvVoRpAh4GA?= =?us-ascii?q?QUxBw4BAgQBAQEBAwIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQEBAQEUC?= =?us-ascii?q?RkFEA4FPGRkBIFLBIF0CwcGJw2CNQwZg3ABGAkKEwEBKwMEBhgUDwMUAQYDA?= =?us-ascii?q?hEBFwEeAxQBEhQGAYJiAYMgAwULi1SaTho1eoExgQGCCAEBBoFAAQMDCwICA?= =?us-ascii?q?wEOCSUBg3aBXAkkgRmHAm5VAYM2CYQdAicQgVVEgRWCDGcHboFQcAsXAQEBA?= =?us-ascii?q?QGBHhcGAQEIRYMpgmWSOIVgBzcDRR1BAwt3AxUDFAMFJAcDGQ8jDQ0EHQwDA?= =?us-ascii?q?wUlAwICGwcCAgMCBhMFAgIXNjgIBAgEKyQPBQIHLwUELwIeBAUGEQgCFgIGB?= =?us-ascii?q?AQEBBUCEAgCCCYXBxMzGQEFWRAJIRYGKA0FBhMDIEkmBUUPKDM1OSsdGwqBD?= =?us-ascii?q?ioJHxUDBAQDAgYTAwMiAhAqMRQEKRMSLQcrcwkCAyJqAwMEKCwDCSEfBygmP?= =?us-ascii?q?AdZEigFAwMQIj0GAwkDAiRbgQUsKAUDDRkmCAWVeoFPgUUOCi4XIgsPBw4GD?= =?us-ascii?q?QcTAQcDHwEBBRQHAgcvCSQLAQoEIxgOHS0FAwECDQQpA5IJEBInjgCKa4Jhk?= =?us-ascii?q?mk0B4NXgUEGDIg/gSONA4gqg3aBUIsAhmSRVCGWaSCJLYEYCYJLhHSDSIY4h?= =?us-ascii?q?U0rE4FCg2iBThoELzsNYgEdDAczGjBQGYINAQEBMQlFAQMCDQECAgMBAgECC?= =?us-ascii?q?QEBAoscgw0WgVhagR4QglSBPDk7WoRyPzQCAQE3AgYBCgEBAwmFYwEBBRMLA?= =?us-ascii?q?YMMgkcBAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 77s IronPort-HdrOrdr: A9a23:J8l7nKib5TtSiaU/+atiWa8HyHBQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.93,312,1654552800"; d="scan'208,217";a="23556978" X-MGA-submission: =?us-ascii?q?MDFbEvWWc2ff2fCc0EBNyixt0tlVcJ/zQaolng?= =?us-ascii?q?x772bFnAU9wtnuTX8lCOf3DU3wodOCeDJfj+rfqMZoG9P1m8zr9uRD5j?= =?us-ascii?q?8/LkUUDqOjAYluWbzPnZjyKJOlskKzmoAHUOCNgz8MVqrwD3MOfNSlM7?= =?us-ascii?q?mLlIe4usO9yp+pRYbMQREbHw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Sep 2022 10:40:43 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4F12F5605BC; Tue, 13 Sep 2022 10:40:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1663058442; bh=oWLA28S2ytnFnQjieulzH2ml8CMEfA/ItUcAof2y4us=; h=From:To:Subject:Date:Message-ID; b=P2w+Uf57TE1LxKsbJjuOsZ9YMWa67U7eBa57VeS1vGbBD+MyNdtQ38MuDyEPadRGf eW4bM2ly8v0LtfmIpejOiFqZNV3qqAFtl73uOdTAknEx6B2CyfW+2XVK6hZAviXol0 /YtmMiM2mxrX6gi69DoB0R6Do00r6Y8sqhYBh8Mg= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 13 Sep 2022 10:40:41 +0200 Message-ID: <87sfkv8y5y.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 13 10:40:42 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.484746, queueID=93CDD5605BD X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 06 to 13, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Caqti 1.9.0 and Plans for 2.0.0 Outreachy summer =E2=80=9922 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 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Petter A. Urkedal announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 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] [meta-issue] Release Notes for 1.9.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C New features: =E2=80=A2 Allow unquoted semicolons in query strings in the new API. Ther= e 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. =E2=80=A2 Add support for MySQL and MariaDB configuration files, as a sol= ution to issue #86. =E2=80=A2 Add a limit to the number of times a database connection is reu= sed when pooling connections (#94). Thanks to Peter Mondlock for investigating resource usage server side motivating this addition. =E2=80=A2 Provide access to the raw SQLite3 connection handle for the pur= pose of defining custom functions (#56). Fixes: =E2=80=A2 Add missing dune dependency on unix (GPR#85 by David Allsopp). =E2=80=A2 Documentation fixes (GPR#82, GPR#83, GPR#84 by Reynir Bj=C3=B6r= nsson, GPR#88 by Jonathan Duarte, and GPR#92 by Jim Tittsler). Deprecations: =E2=80=A2 `Caqti_type.field' was deprecated in favour of `Caqti_type.Fiel= d.t'. Other: =E2=80=A2 Replace deprecated core_kernel dependency with core. Notes on 2.0.0 Development =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C 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=E2=80=99t 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: =E2=80=A2 Driver specific options can be defined in the `caqti' package o= r 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'. =E2=80=A2 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: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (connection =E2=94=82 (pool =E2=94=82 (max-use-count 20) =E2=94=82 (max-idle-size 10)) =E2=94=82 (driver postgresql) =E2=94=82 (endpoints =E2=94=82 (inet pg1.example.org) =E2=94=82 (inet pg2.example.org)) =E2=94=82 (target-session-attrs read-write)) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 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=E2=80=99t 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] Outreachy summer =E2=80=9922 closing commemoration session on 23rd Sept =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Moazzam Moriani announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 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=E2=80=93as our respective mentors=E2=80=93throu= ghout 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] [Multicore Applications] [TopoJSON] [previous Outreachy cohort] Marcus Rohrmoser asked and Moazzam Moriani replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 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 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Volodymyr Melnyk asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 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=E2=80=99m very interested in = both. Could you please help me to clarify possible issues with such an approach? Also I=E2=80=99m interested about a hosting for MirageOS services. I don= =E2=80=99t 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 =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 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: =E2=80=A2 KVM (with the target `hvt') =E2=80=A2 [Xen] =E2=80=A2 or produce a simple executable taking advantage of [seccomp] (a= nd thus finely controlling access to the executable). =E2=80=A2 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=E2=80=99 blog] or [m= ine] 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=E2= =80=99s participation and we are especially here to help newcomers. [Solo5] [Xen] [seccomp] [Raspberry Pi 4] [functors] [Hannes=E2=80=99 blog] [mine] [tlstunnel] [contruno] [unipi] [here] [there] [tutorial] [here] [robur.io] [DNS] [emails] Tuareg and Caml modes for Emacs: what are the differences? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Deep in this thread, Tim McGilchrist announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I wrote up a longer form version of my setup at There are still some bits I am not happy with but I have been using it daily. Also @bbatsov wrote his version at Engineer position at Imandra (Austin TX/UK) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [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=E2=80=99re 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] [here] Acme plumbing rules for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: David A. Arroyo announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 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: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # example: in file "foo/bar.ml", line 155, characters 30-62 =E2=94=82 type is text =E2=94=82 data matches '.*[Ff]ile "([^"]+)", line ([0-9]+), characters ([= 0-9]+)-([0-9]+).*'$nl'?' =E2=94=82 arg isfile $1 =E2=94=82 data set $file =E2=94=82 attr add addr=3D$2-#0+#$3,$2-#0+#$4 =E2=94=82 plumb to edit =E2=94=82 plumb client $editor =E2=94=82=20 =E2=94=82 # example: File "tests/dune", line 2, characters 7-22: =E2=94=82 type is text =E2=94=82 data matches '.*[Ff]ile "([^"]+)", lines ([0-9]+)-([0-9]+).*'$n= l'?' =E2=94=82 arg isfile $1 =E2=94=82 data set $file =E2=94=82 attr add addr=3D$2,$3 =E2=94=82 plumb to edit =E2=94=82 plumb client $editor =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 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=E2=80=99t needed to do it. Here is a short demo of its use: It=E2=80=99s not in OCaml, but I also wrote and put an `OcamlFmt' script in acme=E2=80=99s $PATH like so: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #!/bin/sh =E2=94=82 exec /usr/local/bin/acme-autoformat -r '\.mli?$' \ =E2=94=82 -- ocamlformat --name=3D'{{.Basename}}' --enable-outside-detec= ted-project - =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 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=E2=80=99t felt a need to pursue it. [Acme] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Tarides Sponsors Girls Can Code] =E2=80=A2 [Introducing the Jane Street Graduate Research Fellowship] [the ocaml.org blog] [Tarides Sponsors Girls Can Code] [Introducing the Jane Street Graduate Research Fellowship] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I=E2=80=99ll= 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] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

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

Caqti 1.9.0 and Plans for 2.0.0

Petter A. Urkedal announced

First I would like to announce the 1.9.0 minor release, see the release not= es 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 d= iscuss it here, or in the issue tracker (meta-issue<= /a>), see my brief notes below.

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

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=C3=B6rnsson, GPR#88 by Jonathan Duarte, and GPR#92 by Jim Tittsler).

Deprecations:

  • Caqti_type.field was deprecated in favour of Caqti_t= ype.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&rsqu= o;t use conduit-lwt as-is.

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

  • Driver specific options can be defined in the caqti packag= e or in caqti-driver-* packages. In the former case, the confi= guration can be manipulated without depending on specific drivers, but the = downside is that we will pull in dependencies on x509, d= omain-name, ipaddr and possibly tls and sexplib0.
  • My current sketch provides sexp-serialisation, a choice mainly motivate= d 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 firs= t as a forward-compatible module in parallel to the current modules preferably at the beginning of a major rele= ase cycle. The reason I haven’t written that main Caqti module yet, is that I would like to take the o= pportunity to tidy up the namespace to make it easier for newcomers to discover the main entry points.)

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

Moazzam Moriani announced

I, along with Jay, were the two Outr= eachy interns working with the OCaml :camel: community this summer. I worked on Multicore Applications and Jay on TopoJSON. Our int= ernship, 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 an= d, personally, I have really enjoyed working on my project and learning OCaml. So much so that Jay and I would l= ike to share our experiences with the rest of the community. :sparkles:

To carry forward a tradition established by the previou= s Outreachy cohort, we will host a virtual session that will consist of two short presentations from the both of us fo= llowed 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 onli= ne as well.

We hope you will join us! :raised_hands:

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

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 b= it 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&rsqu= o;t like containers and k8s stuff and I prefer dedicated and virtual servers instead of cloud stuff because I have no reso= urces 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 f= ramework 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 (i= ts runtime). Thus, one can deploy a MirageOS application on:

  • KVM (with the target hvt)
  • Xen
  • or produce a simple executable taking advantage of seccomp (a= nd 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 t= he application. This means that for a given application, deploying for KVM or Xen should not be an upstream choic= e (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 uni= kernel managing TLS certificates and redirecting HTTP connections to unikernels on a local network (tlstunnel or contruno) and a unike= rnel (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 follo= w 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 ens= ured 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 gradual= ly reaching the stage where our unikernels are used in production domains, but it still requires a lot of w= ork and a lot of skills for such a small team :) . Of course, we are open to everyone’s participation and we a= re especially here to help newcomers.

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

Deep in this thread, Tim McGilchrist announced

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

Engineer position at Imandra (Austin TX/UK)

Simon Cruanes announced

Imandra is looking for a full time engi= neer 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 ma= y make, use Imandra to ensure the algorithms you create are safe, explainable and fair. OCaml is the main lan= guage used at Imandra.

Acme plumbing rules for OCaml

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 ed= itor, here are some plumbing rules that I use that allow me to right-click on error messages returned by the OCaml co= mpilers, 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=3D$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=3D$2,$3
plumb	to	edit
plumb	client	$editor

It could probably be extended to search ~/.opam so you could p= lumb 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: h= ttps://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=3D'{{.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.

Other OCaml News

From the ocaml.org blog

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 a= rchives.

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

--=-=-=--