[cwn] Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt alan.schmitt at polytechnique.org
Tue Dec 4 02:02:29 PST 2018


Hello

Here is the latest OCaml Weekly News, for the week of November 27 to
December 04, 2018.

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

First release of `Curve_sampling'
A WebAssembly backend for OCaml
ANN: AWS Lambda Custom Runtime for OCaml
Build-/Installation-Tools - not enogh of them?
containers 2.4
Wanted: new maintainer for yojson
Interesting OCaml Articles
Next OUPS meetup December 11th 2018
Dune 1.6.0
Ocaml Github Pull Requests
Other OCaml News
Old CWN


First release of `Curve_sampling'
═════════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/ann-first-release-of-curve-sampling/2970/1]


Christophe announced
────────────────────

  It is my pleasure to announce the first r[elease of the package
  `curve-sampling'] which provides adaptive sampling of functions (and
  more generally parametric curves) so they can be represented
  graphically with a minimal number of evaluations.  [`Curve_sampling']
  takes the viewpoint that the evaluation function may be costly, so one
  specifies the number of evaluations one wants.  For example, a
  representation of x ↦ x sin(1/x) with 227 evaluations gives (rendered
  with Gnuplot but `Curve_sampling' is independent of a rendering
  engine):
  [https://discourse-cdn-sjc2.com/standard11/uploads/ocaml/original/2X/0/00b28c02e09b078c3f02189d2f91c96bb64094d7.png]

  The chosen evaluation points are displayed on the following graph:
  [https://discourse-cdn-sjc2.com/standard11/uploads/ocaml/original/2X/1/14d53bed52dd3e2d4b531d4a52f0069d0734a4bd.png]

  As a comparison, here is the graph produced by Mathematica for the
  same function (which uses a different procedure which does not allow
  to limit the number of evaluations, only the recursion depth, here 5,
  yielding to the evaluation at 227 points):
  [https://discourse-cdn-sjc2.com/standard11/uploads/ocaml/original/2X/5/591067fb2eb769c4b7a4970a46f80d4dcab94ddb.png]

  With 389 evaluations (recursion depth of 6 for Mathematica), the
  graphs become:
  [https://discourse-cdn-sjc2.com/standard11/uploads/ocaml/original/2X/8/844aa2b5bb58427c3fe65dae3e1b056999e49f35.png]
  [https://discourse-cdn-sjc2.com/standard11/uploads/ocaml/original/2X/9/9ed4e1ef0a5bcba81113ebfd8047b4999b241472.png]
  and
  [https://discourse-cdn-sjc2.com/standard11/uploads/ocaml/original/2X/f/f5a97020bf28240e50bf0a2b031a3c38cc613055.png]

  Enjoy the library and, if you have functions that are not sampled well
  with the current algorithm, do not hesitate to [fill an issue].


[elease of the package `curve-sampling']
https://github.com/ocaml/opam-repository/pull/13060

[`Curve_sampling'] https://github.com/Chris00/ocaml-curve-sampling

[fill an issue] https://github.com/Chris00/ocaml-curve-sampling/issues


n4323 asked and Christophe replied
──────────────────────────────────

        is there a way to feed the sampled points to matplotlib,
        for example?

  There is `Curve_sampling.to_file' that saves the data to a file as
  lines of `x y' with blank lines when the curve needs to be
  interrupted.  It can certainly be read from Python.  Another
  possibility would be to use [py] to import the data without using a
  file — there is `Curve_sampling.to_list' to get it from the sampling
  but additional exports may be added (a `Seq' export is available on
  OCaml ≥ 4.07).  If you try that latter route, let me know.


[py] https://github.com/zshipko/ocaml-py


A WebAssembly backend for OCaml
═══════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/a-webassembly-backend-for-ocaml/2898/4]


Continuing this thread, Sander announced
────────────────────────────────────────

  Second article is here:
  [https://medium.com/@sanderspies/the-road-to-webassembly-gc-for-ocaml-bd44dc7f9a9d]
  (slightly rushed).


ANN: AWS Lambda Custom Runtime for OCaml
════════════════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/ann-aws-lambda-custom-runtime-for-ocaml/2991/1]


Antonio Nuno Monteiro announced
───────────────────────────────

  Last Thursday at re:Invent, AWS announced the ability to run custom
  runtimes in AWS Lambda ([blog post]).

  Today I have the pleasure of announcing an OCaml custom runtime for
  AWS Lambda that, while in its early stages, already works quite well.

  I haven't made a release yet, but if you wanna try it out you can head
  over to the [GitHub repo] and ping me directly if you have any
  questions.


[blog post]
https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html

[GitHub repo] https://github.com/anmonteiro/aws-lambda-ocaml-runtime


Build-/Installation-Tools - not enogh of them?
══════════════════════════════════════════════

  Archive:
  [https://sympa.inria.fr/sympa/arc/caml-list/2018-11/msg00082.html]


Continuing this thread, Louis Gesbert said
──────────────────────────────────────────

  Thanks all for this input. While working on the intrinsics and details
  of the tools, it's easy to lose the big picture, and the very
  important point of view of the newcomers.

  So first, as the main developper of opam 2.0, I'd like to say that we
  have been putting a lot of work in it, and a large part of the effort
  was to improve for convenience, and the many use-cases that weren't
  supported before — including, but not limited to, reproducible build
  environments, and project-local sandboxes, a.k.a. switches.

  The documentation, however, is severly lacking at the moment on all
  these new features, and the preferred and simplest ways to accomplish
  all the basic tasks. For all asking about the detailed formats, we
  have a fairly complete manual [1], and the API should be fairly well
  documented [2], but indeed, it's way too detailed to be the first
  documentation you would get to.

  Let me assure you however that everything is slowly getting into place
  for an easier approach for everyone. I'll go below through the
  "typical workflow" you propose, checking what is here or not, but
  let's first focus on the users rather than the developers:

  • installing ocaml: indeed, if not easily available for your system,
    the easiest is to install opam, then just run `opam init'. (Yes, we
    should be explicit in the doc that _this_ is the command that will
    install the compiler)

  • installing a given package, and assuming opam is installed and
    initialised:

    • if in the repository, just one `opam install' command should be
      all you need

    • otherwise, if your source is available somewhere and contains an
      opam package definition file, `opam pin URL' is everything you
      need (URL pointing to an archive, or a git repository, etc.). We
      could merge this use-case into `opam install' for better
      discoverability.

    • if not and/or you want to build the project manually from a clone,
      the support has been much improved in opam 2, so that you can for
      example document specific pinned dependencies, or a "locked"
      development state (see opam-lock [3] to do that
      automatically). Then e.g. `opam switch create . --locked' will
      recreate a local switch with the exact same development
      configuration, and install the project in it. `opam install
      . --locked' also works, if you don't want the local sandbox.

  • it has been mentionned already in this thread, but the `opam bundle'
    plugin can make distribution easier by including the whole OCaml +
    opam + package environment in a single, self-building
    self-extracting archive. At the cost of rebuilding everything on
    installation. A new release is pending [4]. Yes, it's yet another
    tool, but with its straight-forward interface and everyting
    explained in its 100-lines, included manpage, I find the criticism
    uncalled for. Not a silver bullet by any means, but it fits some
    use-cases.

  As for using wrapping Makefiles, they are nice for simple build-system
  calls, and I like them if only to document the entry-point, but
  shouldn't IMHO mess with the packaging system. Note also that the main
  purpose of `opam' files is actually to document the building commands
  of any project, taking into account all OS specificities, and in an
  easily understandable format. I personally find that having clear and
  simple build instructions arout the top of the README is enough.

  Once properly documented from the opam side (huh), I expect project
  maintainers to be able to put simple setup + installation instructions
  at the top of their READMEs, so that users who don't care about OCaml
  or opam just need to copy-paste them to get the environment setup and
  the project compiled. As far as I understand it now, this is where the
  problem really stands. To avoid having to look anything up or learning
  about exotic build system, this is the best compromise IMHO.

  I'd also like to point out that this is not specific to OCaml, and I
  believe all language package managers / build systems suffer from
  these issues: I for one struggle every time I have to use something
  building with NPM, and they don't generally provide Makefiles. Of
  course, with a tool as popular as NPM, the problem is less visible
  because you have to go through it anyway. So we do need to improve
  documentation and simplify basic workflows as much as possible, but
  expecting people to work with OCaml without learning any of the
  tooling is unrealistic (unless they stick to an online IDE or
  e.g. Learn-OCaml, and even that is tooling in some form).


  Let me now go through your "typical workflow":

  > cd some-ocaml-proj
  > opam install # Switches compiler if necessary and installs and locally
  > caches package dependencies

  You can do this with `opam switch create .'  Since "if necessary" is
  pretty subjective, just run `opam install .' if you prefer to share
  the environment with other projects.

  > opam build

  `opam install .'

  > opam run # Automatically builds if necessary

  there is no package←→executable bijection, so I don't see how this
  would work? (same as for OS-level packages) see below, but this might
  be `dune exec <command>'

  > opam test # Ditto

  indeed here we enter the domain where the separation between build
  system and packaging system can hurt. You can run `opam install
  . --with-test', but probably want `dune runtest' instead.

  > opam package # Ditto; –upload option can immediately upload to opam

  at this point you must already have a package definition available ?
  Or do you mean creating a release archive ?  If your source is hosted
  on Github, you only need to push a tag and run `opam publish' (you
  otherwise need to provide an URL for the source archive and that's
  it).

  > opam doc # Builds documentation with ocamldoc or whatever
  > opam login -u user -p password

  I am not sure what you have in mind here. `opam publish' will go
  through Oauth authentification with Github for submitting your new
  package.



  As one last note, let me mention that we are right now discussing:
  • better integration of opam and dune
  • integration of system dependency handling ("depexts") into opam


  Hope this helps, feedback and questions welcome.

  Louis Gesbert — OCamlPro


  [1] [https://opam.ocaml.org/doc/Manual.html]
  [2] [https://opam.ocaml.org/doc/api/index.html]
  [3] [https://github.com/AltGr/opam-lock]
  [4] [https://github.com/ocaml/opam-repository/pull/13064]


John F Carr asked and Louis Gesbert replied
───────────────────────────────────────────

  > I have a related request.  I am not a trusting person.  I do not
  > like "curl | sudo sh" type installation methods.

  You're not the only one :) Some notes on opam's security model:

  • opam 2.0 uses, by default `bubblewrap' [1] on Linux and
    `sandbox-exec' on OSX to ensure that package scripts:
    • don't make any network access
    • don't interact with other processes
    • don't write outside of their build dir, /tmp, and (in the case of
      install) the switch prefix (excl. opam files)

  • this is done using simple wrapper scripts [2] and some default hooks
    configuration in ~/.opam/config, so if you know about built-in
    sandboxing engines for other OSes, it is fairly easy to experiment
    with them, and a contribution would be very welcome.

  • while I expect this to be reasonably secure, it's intended first and
    foremost to avoid dramatic errors, not to protect against malicious
    repositories

  • package scripts are protected but **not any use made by the users of
    the programs or libraries that were installed through opam**. In
    other words, building should be safe, but there is no guarantee
    about what the result of the build will do: that is not restrained
    by opam in any way

  • the effort to provide end-to-end package signatures in the
    repository [3] is still ongoing. Cheers to Hannes Mehnert for the
    awesome work he has already done here. Most of the work should be
    done, but then we need to integrate all that, and there is a lot of
    work on the tooling so that it won't add to much burden on users and
    repository maintainers (this commonly results in most disabling the
    security features, which is as good has having no security features
    to begin with).

  • we do advertise `curl | sh' on the installation page as the easiest
    entry point, but the script is quite trivial and only uses root to
    copy to your prefix; it's very easy to fetch the binary by hand from
    Github if you prefer not to run it, and of course, you can also
    build from source using the bootstrap scripts.

  > If a package has 'rm -rf $BUILD/', or equivalent ocaml code, are its
  > ill effects confined when BUILD is unset?

  yes, that's the whole point of the sandboxing that was introduced in
  2.0

  > Can the build process grab screenshots from the background?

  not sure. Probably not on Linux since we use a different process
  space, but maybe on OSX. In anycase, since network access is blocked
  in both cases, that wouldn't do much harm.

  > One reason I like make is, if the Makefile is simple you know what
    it's going to do.

  I would object that opam package definition files (`opam' or
  `foo.opam') should be at least as straightforward to read even if you
  have never seen the syntax, are less error-prone, and are generally
  much shorter. Just look for the "build:" and "install:" parts. But I
  agree you need to know first to look at them, and since they are
  generally an indirection to some build-system (`make', `dune',
  `topkg'…), you would just start digging…

  > Also, the xkcd on standards seems relevant: [https://xkcd.com/927/]

  We have _actually_ been converging as of late, though.


  Best, Louis Gesbert — OCamlPro



  [1] [https://github.com/projectatomic/bubblewrap]
  [2]
  [https://github.com/ocaml/opam/blob/master/src/state/shellscripts/bwrap.sh]
  and
  [https://github.com/ocaml/opam/blob/master/src/state/shellscripts/sandbox_exec.sh]
  [3] [https://github.com/hannesm/conex]


Louis Roché then said
─────────────────────

  Shameless plug, I tried to document basic opam usage for people who
  have experience with npm. It turns ok it can also be an introduction
  to total newcomers. Hope it can help some people.
  [https://khady.info/opam-npm.html]


containers 2.4
══════════════

  Archive: [https://discuss.ocaml.org/t/ann-containers-2-4/2985/1]


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

  I have the pleasure to announce that containers 2.4 was just released
  and has been merged into opam. Highlights include more labelled
  modules, migration to dune and opam2, a few new combinators, and some
  bugfixes. Thanks to all the contributors and issue reporters!

  Full release [here].


[here] https://github.com/c-cube/ocaml-containers/releases/tag/2.4


Wanted: new maintainer for yojson
═════════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/wanted-new-maintainer-for-yojson/2966/1]


Martin Jambon announced
───────────────────────

  We're looking for a new lead maintainer for [yojson], ideally with the
  support of their employer who can use the opportunity to give back to
  the community and attract talent. Yojson is a direct dependency of 89
  opam packages.

  I created yojson in 2010 to replace [json-wheel] as part of an effort
  to improve the performance of serialization code derived from type
  definitions. This was done at the time by [json-static], a
  camlp4-based syntax extension. Specifically, yojson exports efficient
  functions for parsing and printing json elements directly without
  going through an AST, unlike its predecessor. This allows a
  type-driven code generator like json-static's replacement [atdgen] to
  produce efficient parsing and printing code. In addition to this,
  yojson also provides a json AST like json-wheel used to. This AST can
  be manipulated directly and widely used by people who haven't found
  out about atdgen or haven't figured out how to set it up. It can also
  be genuinely useful as a last resort for [handling untypable json data
  where needed].

  Yojson is stable and requires light maintenance, typically less than
  one day per month. It's up to the new maintainers to decide where they
  want to take the project in terms of new features, documentation, and
  community involvement.


[yojson] https://github.com/ocaml-community/yojson

[json-wheel] https://mjambon.github.io/mjambon2016/json-wheel.html

[json-static] https://mjambon.github.io/mjambon2016/json-static.html

[atdgen] https://github.com/mjambon/atd

[handling untypable json data where needed]
https://atd.readthedocs.io/en/latest/atdgen.html#field-adapter-ocaml


Interesting OCaml Articles
══════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/interesting-ocaml-articles/1867/34]


Yotam Barnoy announced
──────────────────────

  Some ICFP 2018 OCaml videos are up:

  Winning on Windows: [https://www.youtube.com/watch?v=1DAuSSljLFI]
  Wall (vector graphics): [https://www.youtube.com/watch?v=bQB8kBkHxjk]
  Safely mixing OCaml and Rust:
  [https://www.youtube.com/watch?v=UXfcENNM_ts]
  Merlin: A language server for OCaml:
  [https://www.youtube.com/watch?v=VjLL9We1Fxc]


Next OUPS meetup December 11th 2018
═══════════════════════════════════

  Archive:
  [https://sympa.inria.fr/sympa/arc/caml-list/2018-12/msg00011.html]


Bruno Bernardo announced
────────────────────────

  The next OUPS meetup will take place on Tuesday, December 11, 7pm at
  IRILL on the Jussieu campus. As usual, we will have a few talks,
  followed by pizzas and drinks.

  The talks will be the following:

  • Pierre Chambart, FLambda,
    [https://caml.inria.fr/pub/docs/manual-ocaml/flambda.html]
  • Romain Calascibetta, OCaml-git,
    [https://github.com/dinosaure/ocaml-git].

  Please do note that we are always in demand of talk *proposals* for
  future meetups.

  To register, or for more information, go here:
  [https://www.meetup.com/ocaml-paris/events/256921398]

  *Registration is required! Access is not guaranteed after 7pm if
  you're not registered.* (It also helps us to order the right amount of
  food.)

  Access map:
  IRILL - Université Pierre et Marie Curie (Paris VI)
  Barre 15-16 1er étage
  4 Place Jussieu
  75005 Paris
  [https://www.irill.org/pages/access.html]


Dune 1.6.0
══════════

  Archive: [https://discuss.ocaml.org/t/ann-dune-1-6-0/3003/1]


Rudi Grinberg announced
───────────────────────

  The dune team is pleased to announce the release of Dune 1.6.0. This
  release does not contain any notable features or bug fixes that need
  to be specifically pointed out. Nevertheless, I expect that this will
  be a quality of life improvement to power users who have experienced
  dune's sharper corners.

  Happy hacking!


1.6.0 (29/11/2018)
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

  • Expand variables in `install' stanzas (#1354, @mseri)

  • Add predicate language support for specifying sub directories. This
    allows the use globs, set operations, and special values in
    specifying the sub directories used for the build. For example:
    `(dirs :standard \ lib*)' will use all directories except those that
    start with `lib'. (#1517, #1568, @rgrinberg)

  • Add `binaries' field to the `(env ..)' stanza. This field sets and
    overrides binaries for rules defined in a directory. (#1521,
    @rgrinberg)

  • Fix a crash caused by using an extension in a project without
    dune-project file (#1535, fix #1529, @diml)

  • Allow `%{bin:..}', `%{exe:..}', and other static expansions in the
    `deps' field. (#1155, fix #1531, @rgrinberg)

  • Fix bad interaction between on-demand ppx rewriters and using
    multiple build contexts (#1545, @diml)

  • Fix handling of installed .dune files when the backend is declared
    via a `dune' file (#1551, fixes #1549, @diml)

  • Add a `--stats' command line option to record resource usage (#1543,
    @diml)

  • Fix `dune build @doc' deleting `highlight.pack.js' on rebuilds,
    after the first build (#1557, @aantron).

  • Allow targets to be directories, which Dune will treat opaquely
    (#1547, @jordwalke)

  • Support for OCaml 4.08: `List.t' is now provided by OCaml (#1561,
    @ejgallego)

  • Exclude the local esy directory (`_esy') from the list of watched
    directories (#1578, @andreypopp)

  • Fix the output of `dune external-lib-deps' (#1594, @diml)

  • Introduce `data_only_dirs' to replace
    `ignored_subdirs'. `ignored_subdirs' is deprecated since
    1.6. (#1590, @rgrinberg)

  • Add `dune external-lib-deps --sexp --unstable-by-dir' so that the
    output can be easily processed by a machine (#1599, @diml)


Ocaml Github Pull Requests
══════════════════════════

Gabriel Scherer and the editor compiled this list
─────────────────────────────────────────────────

  Here is a sneak peek at some potential future features of the Ocaml
  compiler, discussed by their implementers in these Github Pull
  Requests.

  • [Use autoconf to generate the compiler's configuration script]
  • [Optimize some local functions]
  • [deprecate the mutability of Gc.control record fields]
  • [Decide unboxing of let-bound expressions based on their Cmm
    translation + unbox across static handlers]
  • [Avoid page table lookup in Hashtbl.hash with no-naked-pointers]
  • [Document ocaml.local attribute on functions]
  • [Provide let operators in the standard library]
  • [Windows - Stdlib: Format function always uses LF newlines]
  • [Add clz and popcnt intrinsics]


[Use autoconf to generate the compiler's configuration script]
https://github.com/ocaml/ocaml/pull/2139

[Optimize some local functions] https://github.com/ocaml/ocaml/pull/2143

[deprecate the mutability of Gc.control record fields]
https://github.com/ocaml/ocaml/pull/2145

[Decide unboxing of let-bound expressions based on their Cmm translation
+ unbox across static handlers] https://github.com/ocaml/ocaml/pull/2165

[Avoid page table lookup in Hashtbl.hash with no-naked-pointers]
https://github.com/ocaml/ocaml/pull/2168

[Document ocaml.local attribute on functions]
https://github.com/ocaml/ocaml/pull/2169

[Provide let operators in the standard library]
https://github.com/ocaml/ocaml/pull/2170

[Windows - Stdlib: Format function always uses LF newlines]
https://github.com/ocaml/ocaml/pull/2172

[Add clz and popcnt intrinsics] https://github.com/ocaml/ocaml/pull/2179


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

From the ocamlcore planet blog
──────────────────────────────

  Here are links from many OCaml blogs aggregated at [OCaml Planet].

  • [Site Reliability Engineer (SRE II)]
  • [Software Engineer II (Programming Languages)]
  • [Software Engineer (Front-End Engineer II)]
  • [Frama-C 18.0 (Argon) is out. Download ithere.]


[OCaml Planet] http://ocaml.org/community/planet/

[Site Reliability Engineer (SRE II)]
https://jobs.github.com/positions/8a0c59af-41c6-4294-99dd-96b1382ef29e

[Software Engineer II (Programming Languages)]
https://jobs.github.com/positions/b3273d35-2233-416a-a6ed-39dedae6147f

[Software Engineer (Front-End Engineer II)]
https://jobs.github.com/positions/62ce5832-2062-4fef-84f9-21dedb48b1ec

[Frama-C 18.0 (Argon) is out. Download ithere.]
http://frama-c.com/index.html


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 at polytechnique.org

[the archive] http://alan.petitepomme.net/cwn/

[RSS feed of the archives] http://alan.petitepomme.net/cwn/cwn.rss

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

[Alan Schmitt] http://alan.petitepomme.net/

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.idyll.org/pipermail/caml-news-weekly/attachments/20181204/0d72574b/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 487 bytes
Desc: not available
URL: <http://lists.idyll.org/pipermail/caml-news-weekly/attachments/20181204/0d72574b/attachment-0001.pgp>


More information about the caml-news-weekly mailing list