From f28c970cb06401460c926e5296363eda9d388365 Mon Sep 17 00:00:00 2001 From: Thibaut Mattio Date: Fri, 28 May 2021 11:19:21 +0200 Subject: [PATCH 1/3] Add success stories --- Makefile | 55 +++++++++++++++++++++++++ data/media/astree-thumb.gif | Bin 0 -> 17034 bytes data/media/coq-thumb.jpg | Bin 0 -> 2243 bytes data/media/fftw-thumb.png | Bin 0 -> 8092 bytes data/media/jane-street-thumb.jpg | Bin 0 -> 10390 bytes data/media/lexifi-thumb.jpg | Bin 0 -> 6976 bytes data/media/mldonkey-thumb.jpg | Bin 0 -> 3647 bytes data/media/unison-thumb.jpg | Bin 0 -> 5740 bytes data/success_stories/en/astree.md | 12 ++++++ data/success_stories/en/coq.md | 8 ++++ data/success_stories/en/fftw.md | 8 ++++ data/success_stories/en/haxe.md | 5 +++ data/success_stories/en/jane_street.md | 10 +++++ data/success_stories/en/lexifi.md | 14 +++++++ data/success_stories/en/liquidsoap.md | 5 +++ data/success_stories/en/mkdonkey.md | 8 ++++ data/success_stories/en/slam.md | 7 ++++ data/success_stories/en/unison.md | 8 ++++ data/success_stories/fr/astree.md | 12 ++++++ data/success_stories/fr/coq.md | 8 ++++ data/success_stories/fr/ensemble.md | 5 +++ data/success_stories/fr/fftw.md | 8 ++++ data/success_stories/fr/haxe.md | 5 +++ data/success_stories/fr/jane_street.md | 10 +++++ data/success_stories/fr/lexifi.md | 14 +++++++ data/success_stories/fr/liquidsoap.md | 5 +++ data/success_stories/fr/mkdonkey.md | 8 ++++ data/success_stories/fr/slam.md | 7 ++++ data/success_stories/fr/unison.md | 8 ++++ lib/success_story.ml | 1 + src/lib/data.ml | 26 ++++++++++++ src/lib/data.mli | 6 +++ src/lib/lint.ml | 10 ++++- 33 files changed, 272 insertions(+), 1 deletion(-) create mode 100644 Makefile create mode 100644 data/media/astree-thumb.gif create mode 100644 data/media/coq-thumb.jpg create mode 100644 data/media/fftw-thumb.png create mode 100644 data/media/jane-street-thumb.jpg create mode 100644 data/media/lexifi-thumb.jpg create mode 100644 data/media/mldonkey-thumb.jpg create mode 100644 data/media/unison-thumb.jpg create mode 100644 data/success_stories/en/astree.md create mode 100644 data/success_stories/en/coq.md create mode 100644 data/success_stories/en/fftw.md create mode 100644 data/success_stories/en/haxe.md create mode 100644 data/success_stories/en/jane_street.md create mode 100644 data/success_stories/en/lexifi.md create mode 100644 data/success_stories/en/liquidsoap.md create mode 100644 data/success_stories/en/mkdonkey.md create mode 100644 data/success_stories/en/slam.md create mode 100644 data/success_stories/en/unison.md create mode 100644 data/success_stories/fr/astree.md create mode 100644 data/success_stories/fr/coq.md create mode 100644 data/success_stories/fr/ensemble.md create mode 100644 data/success_stories/fr/fftw.md create mode 100644 data/success_stories/fr/haxe.md create mode 100644 data/success_stories/fr/jane_street.md create mode 100644 data/success_stories/fr/lexifi.md create mode 100644 data/success_stories/fr/liquidsoap.md create mode 100644 data/success_stories/fr/mkdonkey.md create mode 100644 data/success_stories/fr/slam.md create mode 100644 data/success_stories/fr/unison.md create mode 100644 lib/success_story.ml diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2816e09 --- /dev/null +++ b/Makefile @@ -0,0 +1,55 @@ +.DEFAULT_GOAL := all + +ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) +$(eval $(ARGS):;@:) + +.PHONY: all +all: + opam exec -- dune build --root . @install + +.PHONY: dev +dev: ## Install development dependencies + opam switch create . --no-install -y + opam install -y dune-release ocamlformat utop ocaml-lsp-server + opam install --deps-only --with-test --with-doc -y . + +.PHONY: build +build: ## Build the project, including non installable libraries and executables + opam exec -- dune build --root . + +.PHONY: start +start: all ## Start the project + opam exec -- dune exec --root . src/bin/main.exe $(ARGS) + +.PHONY: install +install: all ## Install the packages on the system + opam exec -- dune install --root . + bash -c "cp $$(opam exec -- which spin) /usr/local/bin/spin" + +.PHONY: test +test: ## Run the unit tests + opam exec -- dune runtest --root . + +.PHONY: clean +clean: ## Clean build artifacts and other generated files + opam exec -- dune clean --root . + +.PHONY: doc +doc: ## Generate odoc documentation + opam exec -- dune build --root . @doc + +.PHONY: servedoc +servedoc: doc ## Open odoc documentation with default web browser + open _build/default/_doc/_html/index.html + +.PHONY: fmt +fmt: ## Format the codebase with ocamlformat + opam exec -- dune build --root . @fmt --auto-promote + +.PHONY: watch +watch: ## Watch for the filesystem and rebuild on every change + opam exec -- dune build --root . --watch + +.PHONY: utop +utop: ## Run a REPL and link with the project's libraries + opam exec -- dune utop --root . lib -- -implicit-bindings diff --git a/data/media/astree-thumb.gif b/data/media/astree-thumb.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b29c9d058d61ab6a268b4a87823b4a6a32d7df9 GIT binary patch literal 17034 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 UQK__|P*Q0BkORJ>TR;E+JDGVyFaQ7m literal 0 HcmV?d00001 diff --git a/data/media/coq-thumb.jpg b/data/media/coq-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48560d29cf1e6659f06f6c7e50b0c7babea63ea4 GIT binary patch literal 2243 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 literal 0 HcmV?d00001 diff --git a/data/media/lexifi-thumb.jpg b/data/media/lexifi-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..881227f2124167f1fb62474b293bf4691c5fb509 GIT binary patch literal 6976 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 1 From 1a0ecd15d4db084b2be468d7bda6fea82526df7b Mon Sep 17 00:00:00 2001 From: Thibaut Mattio Date: Fri, 28 May 2021 13:36:11 +0200 Subject: [PATCH 2/3] Remove unused command --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 2816e09..9a96851 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,6 @@ start: all ## Start the project .PHONY: install install: all ## Install the packages on the system opam exec -- dune install --root . - bash -c "cp $$(opam exec -- which spin) /usr/local/bin/spin" .PHONY: test test: ## Run the unit tests From 41ed945957d721776cdd1d6ce5e3428f39351d72 Mon Sep 17 00:00:00 2001 From: Thibaut Date: Fri, 28 May 2021 14:21:26 +0200 Subject: [PATCH 3/3] Update content and add `url` field --- data/success_stories/en/astree.md | 30 ++++++++++++++++++--- data/success_stories/en/coq.md | 19 +++++++++++-- data/success_stories/en/fftw.md | 16 +++++++++-- data/success_stories/en/haxe.md | 6 ++++- data/success_stories/en/jane_street.md | 23 +++++++++++++--- data/success_stories/en/lexifi.md | 31 +++++++++++++++++---- data/success_stories/en/liquidsoap.md | 7 ++++- data/success_stories/en/mkdonkey.md | 8 ------ data/success_stories/en/mldonkey.md | 25 +++++++++++++++++ data/success_stories/en/slam.md | 19 +++++++++++-- data/success_stories/en/unison.md | 26 ++++++++++++++++-- data/success_stories/fr/astree.md | 34 ++++++++++++++++++++--- data/success_stories/fr/coq.md | 19 +++++++++++-- data/success_stories/fr/ensemble.md | 19 ++++++++++++- data/success_stories/fr/fftw.md | 19 +++++++++++-- data/success_stories/fr/haxe.md | 7 ++++- data/success_stories/fr/jane_street.md | 23 +++++++++++++--- data/success_stories/fr/lexifi.md | 37 +++++++++++++++++++++----- data/success_stories/fr/liquidsoap.md | 7 ++++- data/success_stories/fr/mkdonkey.md | 8 ------ data/success_stories/fr/mldonkey.md | 26 ++++++++++++++++++ data/success_stories/fr/slam.md | 22 +++++++++++++-- data/success_stories/fr/unison.md | 33 ++++++++++++++++++++--- lib/success_story.ml | 2 +- src/lib/data.ml | 3 +++ 25 files changed, 405 insertions(+), 64 deletions(-) delete mode 100644 data/success_stories/en/mkdonkey.md create mode 100644 data/success_stories/en/mldonkey.md delete mode 100644 data/success_stories/fr/mkdonkey.md create mode 100644 data/success_stories/fr/mldonkey.md diff --git a/data/success_stories/en/astree.md b/data/success_stories/en/astree.md index af16e26..b07c283 100644 --- a/data/success_stories/en/astree.md +++ b/data/success_stories/en/astree.md @@ -1,12 +1,34 @@ --- title: The ASTRÉE Static Analyzer image: astree-thumb.gif +url: http://www.astree.ens.fr/ --- -*[David Monniaux](http://www-verimag.imag.fr/~monniaux/) (CNRS), member of the ASTRÉE project, says:* “[ASTRÉE](http://www.astree.ens.fr/) is a *static analyzer* based on *[abstract interpretation](http://www.di.ens.fr/~cousot/aiintro.shtml)* that aims at proving the absence of runtime errors in safety-critical software written in a subset of the C programming language.” +*[David Monniaux](http://www-verimag.imag.fr/~monniaux/) (CNRS), member +of the ASTRÉE project, says:* “[ASTRÉE](http://www.astree.ens.fr/) is a +*static analyzer* based on *[abstract +interpretation](http://www.di.ens.fr/%7Ecousot/aiintro.shtml)* that aims +at proving the absence of runtime errors in safety-critical software +written in a subset of the C programming language.” -“Automatically analyzing programs for exactly checking properties such as the absence of runtime errors is impossible in general, for mathematical reasons. Static analysis by abstract interpretation works around this impossibility and proves program properties by over-approximating the possible behaviors of the program: it is possible to design pessimistic approximations that, in practice, allow proving the desired property on a wide range of software.” +“Automatically analyzing programs for exactly checking properties such +as the absence of runtime errors is impossible in general, for +mathematical reasons. Static analysis by abstract interpretation works +around this impossibility and proves program properties by +over-approximating the possible behaviors of the program: it is possible +to design pessimistic approximations that, in practice, allow proving +the desired property on a wide range of software.” -“So far, ASTRÉE has proved the absence of runtime errors in the primary control software of the [Airbus A340 family](https://www.airbus.com/aircraft/previous-generation-aircraft/a340-family.html). This would be impossible by *software testing*, for testing only considers a limited *subset* of the test cases, while abstract interpretation considers a *superset* of all possible outcomes of the system.” +“So far, ASTRÉE has proved the absence of runtime errors in the primary +control software of the [Airbus A340 +family](https://www.airbus.com/aircraft/previous-generation-aircraft/a340-family.html). This +would be impossible by *software testing*, for testing only considers a +limited *subset* of the test cases, while abstract interpretation +considers a *superset* of all possible outcomes of the system.” -“[ASTRÉE](http://www.astree.ens.fr/) is written in OCaml and is about 44000 lines long (plus external libraries). We needed a language with good performance (speed and memory usage) on reasonable equipment, easy support for advanced data structures, and type and memory safety. OCaml also allows for modular, clear and compact source code and makes it easy to work with recursive structures such as syntax trees.” +“[ASTRÉE](http://www.astree.ens.fr/) is written in OCaml and is about +44000 lines long (plus external libraries). We needed a language with +good performance (speed and memory usage) on reasonable equipment, easy +support for advanced data structures, and type and memory safety. OCaml +also allows for modular, clear and compact source code and makes it easy +to work with recursive structures such as syntax trees.” diff --git a/data/success_stories/en/coq.md b/data/success_stories/en/coq.md index 9f2d4e8..cd61f22 100644 --- a/data/success_stories/en/coq.md +++ b/data/success_stories/en/coq.md @@ -1,8 +1,23 @@ --- title: Coq image: coq-thumb.jpg +url: http://coq.inria.fr/ --- -*[Jean-Christophe Filliâtre](https://www.lri.fr/~filliatr/) (CNRS), a [Coq](http://coq.inria.fr/) developer, says:* “The Coq tool is a system for manipulating formal mathematical proofs; a proof carried out in Coq is mechanically verified by the machine. In addition to its applications in mathematics, Coq also allows certifying the correctness of computer programs.” +*[Jean-Christophe Filliâtre](https://www.lri.fr/~filliatr/) (CNRS), a +Coq developer, says:* “The [Coq](http://coq.inria.fr/) tool is a system +for manipulating formal mathematical proofs; a proof carried out in Coq +is mechanically verified by the machine. In addition to its applications +in mathematics, Coq also allows certifying the correctness of computer +programs.” -“From the Coq standpoint, OCaml is attractive on multiple grounds. First, the OCaml language is perfectly suited for symbolic manipulations, which are of paramount importance in a proof assistant. Furthermore, OCaml's type system, and particularly its notion of abstract type, allow securely encapsulating Coq's critical code base, which guarantees the logical consistency of the whole system. Last, OCaml's strong type system de *facto* grants Coq's code a high level of quality: errors such as “segmentation faults” cannot occur during execution, which is indispensable for a tool whose primary goal is precisely rigor.” +“From the Coq standpoint, OCaml is attractive on multiple grounds. +First, the OCaml language is perfectly suited for symbolic +manipulations, which are of paramount importance in a proof assistant. +Furthermore, OCaml's type system, and particularly its notion of +abstract type, allow securely encapsulating Coq's critical code base, +which guarantees the logical consistency of the whole system. Last, +OCaml's strong type system *de facto* grants Coq's code a high level of +quality: errors such as “segmentation faults” cannot occur during +execution, which is indispensable for a tool whose primary goal is +precisely rigor.” diff --git a/data/success_stories/en/fftw.md b/data/success_stories/en/fftw.md index ac22558..25afe3b 100644 --- a/data/success_stories/en/fftw.md +++ b/data/success_stories/en/fftw.md @@ -1,8 +1,20 @@ --- title: FFTW image: fftw-thumb.png +url: http://www.fftw.org/ --- -[FFTW](http://www.fftw.org/) is a [very fast](http://www.fftw.org/benchfft/) C library for computing Discrete Fourier Transforms (DFT). It uses a powerful symbolic optimizer written in OCaml which, given an integer N, generates highly optimized C code to compute DFTs of size N. FFTW was awarded the 1999 [Wilkinson prize](https://en.wikipedia.org/wiki/J._H._Wilkinson_Prize_for_Numerical_Software) for numerical software. +[FFTW](http://www.fftw.org/) is a [very fast](http://www.fftw.org/benchfft/) C +library for computing Discrete Fourier Transforms (DFT). It uses a powerful +symbolic optimizer written in OCaml which, given an integer N, generates highly +optimized C code to compute DFTs of size N. FFTW was awarded the 1999 +[Wilkinson prize](https://en.wikipedia.org/wiki/J._H._Wilkinson_Prize_for_Numerical_Software) +for numerical software. -Benchmarks, performed on a variety of platforms, show that FFTW's performance is typically superior to that of other publicly available DFT software, and is even competitive with vendor-tuned codes. In contrast to vendor-tuned codes, however, FFTW's performance is portable: the same program will perform well on most architectures without modification. Hence the name, “FFTW,” which stands for the somewhat whimsical title of “Fastest Fourier Transform in the West.” +Benchmarks, performed on a variety of platforms, show that FFTW's +performance is typically superior to that of other publicly available +DFT software, and is even competitive with vendor-tuned codes. In +contrast to vendor-tuned codes, however, FFTW's performance is portable: +the same program will perform well on most architectures without +modification. Hence the name, “FFTW,” which stands for the somewhat +whimsical title of “Fastest Fourier Transform in the West.” diff --git a/data/success_stories/en/haxe.md b/data/success_stories/en/haxe.md index 938a85d..77e8664 100644 --- a/data/success_stories/en/haxe.md +++ b/data/success_stories/en/haxe.md @@ -1,5 +1,9 @@ --- title: Haxe +url: http://haxe.org/ --- -[Haxe](http://haxe.org/) is an open source toolkit based on a modern, high level, strictly typed programming language, a cross-compiler, a complete cross-platform standard library and ways to access each platform's native capabilities. The Haxe compiler was entirely written in OCaml. +[Haxe](http://haxe.org/) is an open source toolkit based on a modern, +high level, strictly typed programming language, a cross-compiler, +a complete cross-platform standard library and ways to access each +platform's native capabilities. The Haxe compiler was entirely written in OCaml. diff --git a/data/success_stories/en/jane_street.md b/data/success_stories/en/jane_street.md index d89bede..7cac024 100644 --- a/data/success_stories/en/jane_street.md +++ b/data/success_stories/en/jane_street.md @@ -1,10 +1,27 @@ --- title: Jane Street image: jane-street-thumb.jpg +url: http://janestreet.com/technology/ --- -Jane Street is a proprietary trading firm that uses OCaml as its primary development platform. Our operation runs at a large scale, generating billions of dollars of transactions every day from our offices in Hong Kong, London and New York, with strategies that span many asset classes, time-zones and regulatory regimes. +Jane Street is a proprietary trading firm that uses OCaml as its primary +development platform. Our operation runs at a large scale, +generating billions of dollars of transactions every day from our offices +in Hong Kong, London and New York, with strategies that span many asset classes, +time-zones and regulatory regimes. -Almost all of our software is written in OCaml, from statistical research code to systems-administration tools to our real-time trading infrastructure. OCaml’s type system acts as a rich and well-integrated set of static analysis tools that help improve the quality of our code, catching bugs at the earliest possible stage. Billions of dollars of transactions flow through our systems every day, so getting it right matters. At the same time, OCaml is highly productive, helping us quickly adapt to changing market conditions. +Almost all of our software is written in OCaml, from statistical +research code to systems-administration tools to our real-time trading +infrastructure. OCaml’s type system acts as a rich and +well-integrated set of static analysis tools that help improve the +quality of our code, catching bugs at the earliest possible stage. +Billions of dollars of transactions flow through our systems every day, +so getting it right matters. At the same time, OCaml is highly productive, +helping us quickly adapt to changing market conditions. -Jane Street has been contributing open-source libraries back to the wider community for many years, including Core, our alternative standard library, Async, a cooperative concurrency library, and several syntax extensions like binprot and sexplib. All of these can be found at [http://janestreet.github.io](http://janestreet.github.io). All in, we've open-sourced more than 200k lines of code. +Jane Street has been contributing open-source libraries back to the wider +community for many years, including Core, our alternative standard +library, Async, a cooperative concurrency library, +and several syntax extensions like binprot and sexplib. All of these can +be found at [http://janestreet.github.io](http://janestreet.github.io). All in, we've open-sourced +more than 200k lines of code. diff --git a/data/success_stories/en/lexifi.md b/data/success_stories/en/lexifi.md index 5128847..ae26b64 100644 --- a/data/success_stories/en/lexifi.md +++ b/data/success_stories/en/lexifi.md @@ -1,14 +1,35 @@ --- title: LexiFi's Modeling Language for Finance image: lexifi-thumb.jpg +url: http://www.lexifi.com/ --- -Developed by the company [LexiFi](http://www.lexifi.com/), the Modeling Language for Finance (MLFi) is the first formal language that accurately describes the most sophisticated capital market, credit, and investment products. MLFi is implemented as an extension of OCaml. +Developed by the company [LexiFi](http://www.lexifi.com/), the Modeling +Language for Finance (MLFi) is the first formal language that accurately +describes the most sophisticated capital market, credit, and investment +products. MLFi is implemented as an extension of OCaml. -MLFi users derive two important benefits from a functional programming approach. First, the declarative formalism of functional programming languages is well suited for specifying complex data structures and algorithms. Second, functional programming languages have strong list processing capabilities. Lists play a central role in finance where they are used extensively to define contract event and payment schedules. +MLFi users derive two important benefits from a functional programming +approach. First, the declarative formalism of functional programming +languages is well suited for *specifying* complex data structures and +algorithms. Second, functional programming languages have strong *list +processing* capabilities. Lists play a central role in finance where +they are used extensively to define contract event and payment +schedules. -In addition, MLFi provides crucial business integration capabilities inherited from OCaml and related tools and libraries. This enables users, for example, to interoperate with C and Java programs, manipulate XML schemas and documents, and interface with SQL databases. +In addition, MLFi provides crucial business integration capabilities +inherited from OCaml and related tools and libraries. This enables +users, for example, to interoperate with C and Java programs, manipulate +XML schemas and documents, and interface with SQL databases. -Data models and object models aiming to encapsulate the definitions and behavior of financial instruments were developed by the banking industry over the past two decades, but face inherent limitations that OCaml helped overcome. +Data models and object models aiming to encapsulate the definitions and +behavior of financial instruments were developed by the banking industry +over the past two decades, but face inherent limitations that OCaml +helped overcome. -LexiFi's approach to modeling complex financial contracts received an academic award in 2000, and the MLFi implementation was elected “Software Product of the Year 2001” by the magazine Risk, the leading financial trading and risk management publication. MLFi-based solutions are gaining growing acceptance throughout Europe and are contributing to spread the use of OCaml in the financial services industry. +LexiFi's approach to modeling complex financial contracts received an +academic award in 2000, and the MLFi implementation was elected +“Software Product of the Year 2001” by the magazine *Risk*, the leading +financial trading and risk management publication. MLFi-based solutions +are gaining growing acceptance throughout Europe and are contributing to +spread the use of OCaml in the financial services industry. diff --git a/data/success_stories/en/liquidsoap.md b/data/success_stories/en/liquidsoap.md index bd21cd1..4ca5f11 100644 --- a/data/success_stories/en/liquidsoap.md +++ b/data/success_stories/en/liquidsoap.md @@ -2,4 +2,9 @@ title: Liquidsoap --- -[Liquidsoap](https://www.liquidsoap.info/) is clearly well established in the (internet) radio industry. Liquidsoap is well known as a tool with unique abilities, and has lots of users including big commercial ones. It is not developed as a business, but companies develop services or software on top of it. For example, Sourcefabric develops and sells Airtime on top of Liquidsoap. +[Liquidsoap](https://www.liquidsoap.info/) is clearly well established in the +(internet) radio industry. Liquidsoap is well known as a tool with +unique abilities, and has lots of users including big commercial ones. +It is not developed as a business, but companies develop services or +software on top of it. For example, Sourcefabric develops and sells +Airtime on top of Liquidsoap. diff --git a/data/success_stories/en/mkdonkey.md b/data/success_stories/en/mkdonkey.md deleted file mode 100644 index f3c4e1a..0000000 --- a/data/success_stories/en/mkdonkey.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: The MLdonkey peer-to-peer client -image: mldonkey-thumb.jpg ---- - -[MLdonkey](http://mldonkey.sourceforge.net/Main_Page) is a multi-platform multi-networks peer-to-peer client. It was the first open-source client to access the eDonkey network. Today, MLdonkey supports several other large networks, among which Overnet, Bittorrent, Gnutella, Gnutella2, Fasttrack, Soulseek, Direct-Connect, and Opennap. Searches can be conducted over several networks concurrently; files are downloaded from and uploaded to multiple peers concurrently. - -*An MLdonkey developer says:* “Early in 2002, we decided to use OCaml to program a network application in the emerging world of peer-to-peer systems. The result of our work, MLdonkey, has surpassed our hopes: MLdonkey is currently the most popular peer-to-peer file-sharing client according to [free(code)](http://freecode.com/) (formerly “freshmeat.net”), with about 10,000 daily users. Moreover, MLdonkey is the only client able to connect to several peer-to-peer networks, to download and share files. It works as a daemon, running unattended on the computer, and can be controlled remotely using a choice of three different kinds of interfaces: GTK, web and telnet.” diff --git a/data/success_stories/en/mldonkey.md b/data/success_stories/en/mldonkey.md new file mode 100644 index 0000000..1455553 --- /dev/null +++ b/data/success_stories/en/mldonkey.md @@ -0,0 +1,25 @@ +--- +title: The MLdonkey peer-to-peer client +image: mldonkey-thumb.jpg +url: http://mldonkey.sourceforge.net/Main_Page +--- + +[MLdonkey](http://mldonkey.sourceforge.net/Main_Page) is a +multi-platform multi-networks peer-to-peer client. It was the first +open-source client to access the eDonkey network. Today, MLdonkey +supports several other large networks, among which Overnet, Bittorrent, +Gnutella, Gnutella2, Fasttrack, Soulseek, Direct-Connect, and Opennap. +Searches can be conducted over several networks concurrently; files are +downloaded from and uploaded to multiple peers concurrently. + +*An MLdonkey developer says:* “Early in 2002, we decided to use OCaml to +program a network application in the emerging world of peer-to-peer +systems. The result of our work, MLdonkey, has surpassed our hopes: +MLdonkey is currently the most popular peer-to-peer file-sharing client +according to [free(code)](http://freecode.com/) (formerly “freshmeat.net”), +with about 10,000 +daily users. Moreover, MLdonkey is the only client able to connect to +several peer-to-peer networks, to download and share files. It works as +a daemon, running unattended on the computer, and can be controlled +remotely using a choice of three different kinds of interfaces: GTK, web +and telnet.” diff --git a/data/success_stories/en/slam.md b/data/success_stories/en/slam.md index 4af560e..5d103e9 100644 --- a/data/success_stories/en/slam.md +++ b/data/success_stories/en/slam.md @@ -1,7 +1,22 @@ --- title: SLAM +url: http://research.microsoft.com/en-us/projects/slam/ --- -The [SLAM](http://research.microsoft.com/en-us/projects/slam/) project originated in Microsoft Research in early 2000. Its goal was to automatically check that a C program correctly uses the interface to an external library. The project used and extended ideas from symbolic model checking, program analysis and theorem proving in novel ways to address this problem. The SLAM analysis engine forms the core of a new tool called Static Driver Verifier (SDV) that systematically analyzes the source code of Windows device drivers against a set of rules that define what it means for a device driver to properly interact with the Windows operating system kernel. +The [SLAM](http://research.microsoft.com/en-us/projects/slam/) project +originated in Microsoft Research in early 2000. Its goal was to +automatically check that a C program correctly uses the interface to an +external library. The project used and extended ideas from symbolic +model checking, program analysis and theorem proving in novel ways to +address this problem. The SLAM analysis engine forms the core of a new +tool called Static Driver Verifier (SDV) that systematically analyzes +the source code of Windows device drivers against a set of rules that +define what it means for a device driver to properly interact with the +Windows operating system kernel. -*In technical report MSR-TR-2004-08, T.Ball, B.Cook, V.Levin and S.K.Rajamani, the SLAM developers, write:* “The Right Tools for the Job: We developed SLAM using Inria's OCaml functional programming language. The expressiveness of this language and robustness of its implementation provided a great productivity boost.” +*In technical report +[MSR-TR-2004-08](http://research.microsoft.com/apps/pubs/default.aspx?id=70038), +T.Ball, B.Cook, V.Levin and S.K.Rajamani, the SLAM developers, write:* +“The Right Tools for the Job: We developed SLAM using Inria's OCaml +functional programming language. The expressiveness of this language and +robustness of its implementation provided a great productivity boost.” diff --git a/data/success_stories/en/unison.md b/data/success_stories/en/unison.md index 98fc32a..62c835f 100644 --- a/data/success_stories/en/unison.md +++ b/data/success_stories/en/unison.md @@ -1,8 +1,30 @@ --- title: The Unison File Synchronizer image: unison-thumb.jpg +url: http://www.cis.upenn.edu/%7Ebcpierce/unison/ --- -[Unison](http://www.cis.upenn.edu/~bcpierce/unison/) is a popular file-synchronization tool for Windows and most flavors of Unix. It allows two replicas of a collection of files and directories to be stored on different hosts (or different disks on the same host), modified separately, and then brought up to date by propagating the changes in each replica to the other. Unlike simple mirroring or backup utilities, Unison can deal with updates to both replicas: updates that do not conflict are propagated automatically and conflicting updates are detected and displayed. Unison is also resilient to failure: it is careful to leave the replicas and its own private structures in a sensible state at all times, even in case of abnormal termination or communication failures. +[Unison](http://www.cis.upenn.edu/%7Ebcpierce/unison/) is a popular +file-synchronization tool for Windows and most flavors of Unix. It +allows two replicas of a collection of files and directories to be +stored on different hosts (or different disks on the same host), +modified separately, and then brought up to date by propagating the +changes in each replica to the other. Unlike simple mirroring or backup +utilities, Unison can deal with updates to both replicas: updates that +do not conflict are propagated automatically and conflicting updates are +detected and displayed. Unison is also resilient to failure: it is +careful to leave the replicas and its own private structures in a +sensible state at all times, even in case of abnormal termination or +communication failures. -*[Benjamin C. Pierce](http://www.cis.upenn.edu/~bcpierce/) (University of Pennsylvania), Unison project leader, says:* “I think Unison is a very clear success for OCaml – in particular, for the extreme portability and overall excellent engineering of the compiler and runtime system. OCaml's strong static typing, in combination with its powerful module system, helped us organize a large and intricate codebase with a high degree of encapsulation. This has allowed us to maintain a high level of robustness through years of work by many different programmers. In fact, Unison may be unique among large OCaml projects in having been *translated* from Java to OCaml midway through its development. Moving to OCaml was like a breath of fresh air.” +*[Benjamin C. Pierce](http://www.cis.upenn.edu/%7Ebcpierce/) (University +of Pennsylvania), Unison project leader, says:* “I think Unison is a +very clear success for OCaml – in particular, for the extreme +portability and overall excellent engineering of the compiler and +runtime system. OCaml's strong static typing, in combination with its +powerful module system, helped us organize a large and intricate +codebase with a high degree of encapsulation. This has allowed us to +maintain a high level of robustness through years of work by many +different programmers. In fact, Unison may be unique among large OCaml +projects in having been *translated* from Java to OCaml midway through +its development. Moving to OCaml was like a breath of fresh air.” diff --git a/data/success_stories/fr/astree.md b/data/success_stories/fr/astree.md index af715b6..d8a0032 100644 --- a/data/success_stories/fr/astree.md +++ b/data/success_stories/fr/astree.md @@ -1,12 +1,38 @@ --- title: L'analyseur statique ASTRÉE image: astree-thumb.gif +url: http://www.astree.ens.fr/ --- -*[David Monniaux](http://www-verimag.imag.fr/~monniaux/) (CNRS), membre du projet ASTRÉE :* « [ASTRÉE](http://www.astree.ens.fr/) est un analyseur statique basé sur [l'interprétation abstraite](http://www.di.ens.fr/~cousot/aiintro.shtml) et qui vise à établir l'absence d'erreurs d'exécution dans des logiciels critiques écrits dans un sous-ensemble du langage C. » +*[David Monniaux](http://www-verimag.imag.fr/~monniaux/) (CNRS), membre +du projet ASTRÉE :* « [ASTRÉE](http://www.astree.ens.fr/) est un +*analyseur statique* basé sur [l'interprétation +abstraite](http://www.di.ens.fr/%7Ecousot/aiintro.shtml) et qui vise à +établir l'absence d'erreurs d'exécution dans des logiciels critiques +écrits dans un sous-ensemble du langage C. » -« Une analyse automatique et exacte visant à vérifier des propriétés telles que l'absence d'erreurs d'exécution est impossible en général, pour des raisons mathématiques. L'analyse statique par interprétation abstraite contourne cette impossibilité, et permet de prouver des propriétés de programmes, en sur-estimant l'ensemble des comportements possibles d'un programme. Il est possible de concevoir des approximations pessimistes qui, en pratique, permettent d'établir la propriété souhaitée pour une large gamme de logiciels. » +« Une analyse automatique et exacte visant à vérifier des propriétés +telles que l'absence d'erreurs d'exécution est impossible en général, +pour des raisons mathématiques. L'analyse statique par interprétation +abstraite contourne cette impossibilité, et permet de prouver des +propriétés de programmes, en sur-estimant l'ensemble des comportements +possibles d'un programme. Il est possible de concevoir des +approximations pessimistes qui, en pratique, permettent d'établir la +propriété souhaitée pour une large gamme de logiciels. » -« À ce jour, ASTRÉE a prouvé l'absence d'erreurs d'exécution dans le logiciel de contrôle primaire de la [famille Airbus A340](http://www.airbus.com/product/a330_a340_backgrounder.asp). Cela serait impossible par de simples tests, car le test ne considère qu'un *sous-ensemble* limité des cas, tandis que l'interprétation abstraite considère un *sur-ensemble* de tous les comportements possibles du système. » +« À ce jour, ASTRÉE a prouvé l'absence d'erreurs d'exécution dans le +logiciel de contrôle primaire de la [famille Airbus +A340](http://www.airbus.com/product/a330_a340_backgrounder.asp). Cela +serait impossible par de simples *tests*, car le test ne considère qu'un +*sous-ensemble* limité des cas, tandis que l'interprétation abstraite +considère un *sur-ensemble* de tous les comportements possibles du +système. » -« [ASTRÉE](http://www.astree.ens.fr/) est écrit en OCaml et mesure environ 44000 lignes (plus des librairies externes). Nous avions besoin d'un langage doté d'une bonne performance (en termes de vitesse et d'occupation mémoire) sur un matériel raisonnable, favorisant l'emploi de structures de données avancées, et garantissant la sûreté mémoire. OCaml permet également d'organiser le code source de façon modulaire, claire et compacte, et facilite la gestion de structures de données récursives comme les arbres de syntaxe abstraite. » +« [ASTRÉE](http://www.astree.ens.fr/) est écrit en OCaml et mesure +environ 44000 lignes (plus des librairies externes). Nous avions besoin +d'un langage doté d'une bonne performance (en termes de vitesse et +d'occupation mémoire) sur un matériel raisonnable, favorisant l'emploi +de structures de données avancées, et garantissant la sûreté mémoire. +OCaml permet également d'organiser le code source de façon modulaire, +claire et compacte, et facilite la gestion de structures de données +récursives comme les arbres de syntaxe abstraite. » diff --git a/data/success_stories/fr/coq.md b/data/success_stories/fr/coq.md index 5a45e37..e70225d 100644 --- a/data/success_stories/fr/coq.md +++ b/data/success_stories/fr/coq.md @@ -1,8 +1,23 @@ --- title: Coq image: coq-thumb.jpg +url: http://coq.inria.fr/ --- -*[Jean-Christophe Filliâtre](http://www.lri.fr/~filliatr/) (CNRS), un des développeurs de Coq :* « L'outil [Coq](http://coq.inria.fr/) est un système de manipulation de preuves mathématiques formelles ; une preuve réalisée avec Coq est mécaniquement vérifiée par la machine. Outre ses applications en mathématiques, l'outil Coq permet également de certifier la correction de programmes informatiques. » +*[Jean-Christophe Filliâtre](http://www.lri.fr/%7Efilliatr/) (CNRS), un +des développeurs de Coq :* « L'outil [Coq](http://coq.inria.fr/) est un +système de manipulation de preuves mathématiques formelles ; une preuve +réalisée avec Coq est mécaniquement vérifiée par la machine. Outre ses +applications en mathématiques, l'outil Coq permet également de certifier +la correction de programmes informatiques. » -« L'intérêt de OCaml du point de vue de Coq est multiple. D'une part, le langage OCaml est parfaitement adapté aux manipulations symboliques, qui sont prépondérantes dans un assistant de preuve. D'autre part, le système de types de OCaml, et notamment sa notion de type abstrait, permet une réelle encapsulation de la partie critique du code de Coq, garantissant ainsi la cohérence logique de l'ensemble du système. Enfin, le typage fort de OCaml assure de fait une grande qualité au code de Coq (tel que l'absence d'erreurs à l'exécution du type « segmentation fault »), ce qui est indispensable à un outil dont le but premier est justement la rigueur. » +« L'intérêt de OCaml du point de vue de Coq est multiple. D'une part, le +langage OCaml est parfaitement adapté aux manipulations symboliques, qui +sont prépondérantes dans un assistant de preuve. D'autre part, le +système de types de OCaml, et notamment sa notion de type abstrait, +permet une réelle encapsulation de la partie critique du code de Coq, +garantissant ainsi la cohérence logique de l'ensemble du système. Enfin, +le typage fort de OCaml assure de fait une grande qualité au code de Coq +(tel que l'absence d'erreurs à l'exécution du type « segmentation +fault »), ce qui est indispensable à un outil dont le but premier est +justement la rigueur. » diff --git a/data/success_stories/fr/ensemble.md b/data/success_stories/fr/ensemble.md index 3823f9f..e133016 100644 --- a/data/success_stories/fr/ensemble.md +++ b/data/success_stories/fr/ensemble.md @@ -1,5 +1,22 @@ --- title: Le système de communication distribuée Ensemble +url: http://dsl.cs.technion.ac.il/projects/Ensemble/ --- -*Ohad Rodeh (IBM Haifa), un des développeurs d'Ensemble :* « [Ensemble](http://dsl.cs.technion.ac.il/projects/Ensemble/) est un système de communication de groupe écrit en OCaml, développé à Cornell et à Hebrew University. À l'auteur d'applications, Ensemble fournit une librairie de protocoles que l'on peut utiliser pour construire rapidement des applications distribuées complexes. Pour un chercheur en systèmes distribués, Ensemble est une boîte à outils hautement modulaire et reconfigurable : les protocoles de haut niveau fournis aux applications sont en réalité des piles de minuscules « couches » de protocoles, dont chacune peut être modifiée ou reconstruite à des fins d'expérimentation. OCaml a été choisi initialement pour que le code puisse être vérifié par un prouveur de théorèmes semi-automatique. Ce code a ensuite fait ses preuves sur le terrain, et nous avons continué à développer en OCaml. Le système de types fort, les types de données algébriques, la récupération automatique de la mémoire et l'environnement d'exécution sont les principales raisons de notre intérêt pour OCaml. » +*Ohad Rodeh (IBM Haifa), un des développeurs d'Ensemble :* +« [Ensemble](http://dsl.cs.technion.ac.il/projects/Ensemble/) est un +système de communication de groupe écrit en OCaml, développé à Cornell +et à Hebrew University. À l'auteur d'applications, Ensemble fournit une +librairie de protocoles que l'on peut utiliser pour construire +rapidement des applications distribuées complexes. Pour un chercheur en +systèmes distribués, Ensemble est une boîte à outils hautement modulaire +et reconfigurable : les protocoles de haut niveau fournis aux +applications sont en réalité des piles de minuscules « couches » de +protocoles, dont chacune peut être modifiée ou reconstruite à des fins +d'expérimentation. OCaml a été choisi initialement pour que le code +puisse être vérifié par un prouveur de théorèmes semi-automatique. Ce +code a ensuite fait ses preuves sur le terrain, et nous avons continué à +développer en OCaml. Le système de types fort, les types de données +algébriques, la récupération automatique de la mémoire et +l'environnement d'exécution sont les principales raisons de notre +intérêt pour OCaml. » diff --git a/data/success_stories/fr/fftw.md b/data/success_stories/fr/fftw.md index 8eba0f5..f6c9e0e 100644 --- a/data/success_stories/fr/fftw.md +++ b/data/success_stories/fr/fftw.md @@ -1,8 +1,23 @@ --- title: FFTW image: fftw-thumb.png +url: http://www.fftw.org/ --- -[FFTW](http://www.fftw.org/) est une librairie C [très rapide](http://www.fftw.org/benchfft/) permettant d'effectuer des Transformées de Fourier Discrètes (DFT). Elle emploie un puissant optimiseur symbolique écrit en OCaml qui, étant donné un entier N, produit du code C hautement optimisé pour effectuer des DFTs de taille N. FFTW a reçu en 1999 le [prix Wilkinson](https://en.wikipedia.org/wiki/J._H._Wilkinson_Prize_for_Numerical_Software) pour les logiciels de calcul numérique. +[FFTW](http://www.fftw.org/) est une librairie C [très +rapide](http://www.fftw.org/benchfft/) permettant d'effectuer des +Transformées de Fourier Discrètes (DFT). Elle emploie un puissant +optimiseur symbolique écrit en OCaml qui, étant donné un entier N, +produit du code C hautement optimisé pour effectuer des DFTs de taille +N. FFTW a reçu en 1999 le [prix +Wilkinson](https://en.wikipedia.org/wiki/J._H._Wilkinson_Prize_for_Numerical_Software) +pour les logiciels de calcul numérique. -Des mesures effectuées sur diverses plate-formes montrent que les performances de FFTW sont typiquement supérieures à celles des autres logiciels de DFT disponibles publiquement, et peuvent même concurrencer le code optimisé proposé par certains fabriquants de processeurs. À la différence de ce code propriétaire, cependant, les performances de FFTW sont portables : un même programme donnera de bons résultats sur la plupart des architectures sans modification. D'où le nom « FFTW, » qui signifie « Fastest Fourier Transform in the West. » +Des mesures effectuées sur diverses plate-formes montrent que les +performances de FFTW sont typiquement supérieures à celles des autres +logiciels de DFT disponibles publiquement, et peuvent même concurrencer +le code optimisé proposé par certains fabriquants de processeurs. À la +différence de ce code propriétaire, cependant, les performances de FFTW +sont portables : un même programme donnera de bons résultats sur la +plupart des architectures sans modification. D'où le nom « FFTW, » qui +signifie « Fastest Fourier Transform in the West. » diff --git a/data/success_stories/fr/haxe.md b/data/success_stories/fr/haxe.md index 96660d1..1424c46 100644 --- a/data/success_stories/fr/haxe.md +++ b/data/success_stories/fr/haxe.md @@ -1,5 +1,10 @@ --- title: Haxe +url: http://haxe.org/ --- -[Haxe](http://haxe.org/) est une boîte à outils open source basée sur un langage de programmation moderne, de haut niveau, strictement typé, un compilateur croisé, une bibliothèque standard multiplateforme complète et des moyens d’accéder aux capacités natives de chaque plate-forme.Le compilateur Haxe a été entièrement écrit dans OCaml. +[Haxe](http://haxe.org/) est une boîte à outils open source basée sur un +langage de programmation moderne, de haut niveau, strictement typé, un +compilateur croisé, une bibliothèque standard multiplateforme complète et +des moyens d’accéder aux capacités natives de chaque plate-forme.Le compilateur +Haxe a été entièrement écrit dans OCaml. diff --git a/data/success_stories/fr/jane_street.md b/data/success_stories/fr/jane_street.md index 1baf24e..9ff71fa 100644 --- a/data/success_stories/fr/jane_street.md +++ b/data/success_stories/fr/jane_street.md @@ -1,10 +1,27 @@ --- title: Jane Street image: jane-street-thumb.jpg +url: http://janestreet.com/technology/ --- -Jane Street est une société de négoce propriétaire qui utilise OCaml comme sa plate-forme de développement primaire. Notre exploitation fonctionne à grande échelle, générant des milliards de dollars de transactions chaque jour à partir de nos bureaux de Hong Kong,Londres et New York, avec des stratégies qui couvrent de nombreuses classes d’actifs, fuseaux horaires et régimes réglementaires. +Jane Street est une société de négoce propriétaire qui utilise OCaml comme sa +plate-forme de développement primaire. Notre exploitation fonctionne à grande +échelle, générant des milliards de dollars de transactions chaque jour à partir +de nos bureaux de Hong Kong,Londres et New York, avec des stratégies qui couvrent +de nombreuses classes d’actifs, fuseaux horaires et régimes réglementaires. -Presque tous nos logiciels sont écrits dans OCaml, du code de recherche statistique aux outils d’administration des systèmes en retour de notre infrastructure de trading en temps réel. Le système de type d’OCaml agit comme un ensemble riche et bien intégré d’outils d’analyse statique qui aident à améliorer la qualité de notre code, en attrapant les bogues le plus tôt possible. Chaque jour, des milliards de dollars de transactions passent par nos systèmes, ce qui fait en sorte que les choses se passent bien. Dans le même temps, OCaml est très productif, nous aidant à nous adapter rapidement à l’évolution des conditions du marché. +Presque tous nos logiciels sont écrits dans OCaml, du code de recherche statistique +aux outils d’administration des systèmes en retour de notre infrastructure de trading +en temps réel. Le système de type d’OCaml agit comme un ensemble riche et bien intégré +d’outils d’analyse statique qui aident à améliorer la qualité de notre code, en +attrapant les bogues le plus tôt possible. Chaque jour, des milliards de dollars de +transactions passent par nos systèmes, ce qui fait en sorte que les choses se passent +bien. Dans le même temps, OCaml est très productif, nous aidant à nous adapter rapidement +à l’évolution des conditions du marché. -Jane Street contribue aux bibliothèques open-source à l’ensemble de la communauté depuis de nombreuses années, y compris Core, notre bibliothèque standard alternative, Async, une bibliothèque coopérative de concurrence, et plusieurs extensions syntaxiques comme binprot et sexplib. Tous ces éléments peuvent être trouvés à [http://janestreet.github.io](http://janestreet.github.io). Au total, nous avons ouvert plus de 200k lignes de code. +Jane Street contribue aux bibliothèques open-source à l’ensemble de la communauté depuis +de nombreuses années, y compris Core, notre bibliothèque standard alternative, Async, une +bibliothèque coopérative de concurrence, et plusieurs extensions syntaxiques comme binprot +et sexplib.Tous ces éléments peuvent être trouvés à +[http://janestreet.github.io](http://janestreet.github.io). Au total, nous avons ouvert +plus de 200k lignes de code. diff --git a/data/success_stories/fr/lexifi.md b/data/success_stories/fr/lexifi.md index f37670a..7da0c35 100644 --- a/data/success_stories/fr/lexifi.md +++ b/data/success_stories/fr/lexifi.md @@ -1,14 +1,39 @@ --- -title: LexiFi's Modeling Language for Finance +title: Le Langage de Modélisation Financière de LexiFi image: lexifi-thumb.jpg +url: http://www.lexifi.com/ --- -Développé par la société [LexiFi](http://www.lexifi.com/), le Langage de Modélisation Financière (MLFi) est le premier langage formel capable de décrire les produits d'investissement, de crédit et de marché de capitaux les plus sophistiqués. MLFi est implanté comme une extension d'OCaml. +Développé par la société [LexiFi](http://www.lexifi.com/), le Langage de +Modélisation Financière (MLFi) est le premier langage formel capable de +décrire les produits d'investissement, de crédit et de marché de +capitaux les plus sophistiqués. MLFi est implanté comme une extension +d'OCaml. -Les utilisateurs de MLFi retirent deux importants bénéfices de l'approche par programmation fonctionnelle. D'abord, le formalisme déclaratif des langages de programmation fonctionnels est adapté à la spécification de structures de données et d'algorithmes complexes. Ensuite, ces langages offrent de nombreuses facilités pour la manipulation des listes. Or, les listes jouent un rôle central en finance, où elles sont utilisées de façon intensive pour définir des agendas d'événements de contrats et de paiements. +Les utilisateurs de MLFi retirent deux importants bénéfices de +l'approche par programmation fonctionnelle. D'abord, le formalisme +déclaratif des langages de programmation fonctionnels est adapté à la +*spécification* de structures de données et d'algorithmes complexes. +Ensuite, ces langages offrent de nombreuses facilités pour la +manipulation des listes. Or, les listes jouent un rôle central en +finance, où elles sont utilisées de façon intensive pour définir des +agendas d'événements de contrats et de paiements. -De plus, MLFi est doté de capacités d'intégration cruciales, héritées d'OCaml et des outils et librairies qui l'accompagnent, Cela permet aux utilisateurs, par exemple, d'interopérer avec des programmes C et Java, de manipuler des schémas et documents XML, et de s'interfacer avec des bases de données SQL. +De plus, MLFi est doté de capacités d'intégration cruciales, héritées +d'OCaml et des outils et librairies qui l'accompagnent, Cela permet aux +utilisateurs, par exemple, d'interopérer avec des programmes C et Java, +de manipuler des schémas et documents XML, et de s'interfacer avec des +bases de données SQL. -Des modèles de données et modèles objets visant à encapsuler les définitions et le comportement des instruments financiers ont été développés par l'industrie bancaire depuis deux décennies, mais font face à des limitations inhérentes qu'OCaml a aidé à surpasser. +Des modèles de données et modèles objets visant à encapsuler les +définitions et le comportement des instruments financiers ont été +développés par l'industrie bancaire depuis deux décennies, mais font +face à des limitations inhérentes qu'OCaml a aidé à surpasser. -L'approche de LexiFi pour la modélisation de contrats financiers complexes a reçu une récompense académique en 2000, et l'implantation de MLFi a été nommée « Produit Logiciel de l'Année 2001 » par le magazine Risk, la principale publication dans le domaine des échanges financiers et de la gestion des risques. Les solutions basées sur MLFi gagnent en reconnaissance à travers l'Europe et contribuent à répandre l'utilisation d'OCaml dans l'industrie des services financiers. +L'approche de LexiFi pour la modélisation de contrats financiers +complexes a reçu une récompense académique en 2000, et l'implantation de +MLFi a été nommée « Produit Logiciel de l'Année 2001 » par le magazine +*Risk*, la principale publication dans le domaine des échanges +financiers et de la gestion des risques. Les solutions basées sur MLFi +gagnent en reconnaissance à travers l'Europe et contribuent à répandre +l'utilisation d'OCaml dans l'industrie des services financiers. diff --git a/data/success_stories/fr/liquidsoap.md b/data/success_stories/fr/liquidsoap.md index 164053e..e3e23de 100644 --- a/data/success_stories/fr/liquidsoap.md +++ b/data/success_stories/fr/liquidsoap.md @@ -2,4 +2,9 @@ title: Liquidsoap --- -[Liquidsoap](https://www.liquidsoap.info/) est clairement bien établie dans l’industrie de la radio (internet).Liquidsoap est bien connu comme un outil avec des capacités uniques, et a beaucoup d’utilisateurs, y compris les grands commerciaux.Il n’est pas développé comme une entreprise, mais les entreprises développent des services ou des logiciels sur le dessus de celui-ci. Par exemple, Sourcefabric développe et vend du temps d’antenne au-dessus de Liquidsoap. +[Liquidsoap](https://www.liquidsoap.info/) est clairement bien établie dans +l’industrie de la radio (internet).Liquidsoap est bien connu comme un +outil avec des capacités uniques, et a beaucoup d’utilisateurs, y compris +les grands commerciaux.Il n’est pas développé comme une entreprise, mais les +entreprises développent des services ou des logiciels sur le dessus de celui-ci. +Par exemple, Sourcefabric développe et vend du temps d’antenne au-dessus de Liquidsoap. diff --git a/data/success_stories/fr/mkdonkey.md b/data/success_stories/fr/mkdonkey.md deleted file mode 100644 index ad98fef..0000000 --- a/data/success_stories/fr/mkdonkey.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: The MLdonkey peer-to-peer client -image: mldonkey-thumb.jpg ---- - -[MLdonkey](http://mldonkey.sourceforge.net/Main_Page) est un client pair-à-pair multi-plateformes et multi-réseaux. Il a été le premier client « open source » à permettre l'accès au réseau eDonkey. Aujourd'hui, MLdonkey autorise également l'accès à plusieurs autres réseaux importants, parmi lesquels Overnet, Bittorrent, Gnutella, Gnutella2, Fasttrack, Soulseek, Direct-Connect et Opennap. Il permet d'effectuer une recherche en parallèle sur plusieurs réseaux, et échange des fichiers avec de multiples pairs en parallèle. - -*Un des développeurs de MLdonkey :* « Début 2002, nous avons décidé d'utiliser OCaml pour programmer une application réseau dans le monde émergent des systèmes pair-à-pair. Le résultat de notre travail, MLdonkey, a surpassé nos espérances : MLdonkey est aujourd'hui le client de partage de fichiers pair-à-pair le plus populaire, d'après [freshmeat.net](http://freshmeat.net/), avec environ dix mille utilisateurs quotidiens. De plus, MLdonkey est le seul client capable de se connecter à plusieurs réseaux pair-à-pair pour télécharger et échanger des fichiers. Il fonctionne en tant que démon, c'est-à-dire en tâche de fond et sans surveillance humaine, et peut être contrôlé à l'aide d'une interface au choix parmi trois : GTK, web et telnet. » diff --git a/data/success_stories/fr/mldonkey.md b/data/success_stories/fr/mldonkey.md new file mode 100644 index 0000000..17f0482 --- /dev/null +++ b/data/success_stories/fr/mldonkey.md @@ -0,0 +1,26 @@ +--- +title: Le client pair-à-pair MLdonkey +image: mldonkey-thumb.jpg +url: http://mldonkey.sourceforge.net/Main_Page +--- + +[MLdonkey](http://mldonkey.sourceforge.net/Main_Page) est un client +pair-à-pair multi-plateformes et multi-réseaux. Il a été le premier +client « open source » à permettre l'accès au réseau eDonkey. +Aujourd'hui, MLdonkey autorise également l'accès à plusieurs autres +réseaux importants, parmi lesquels Overnet, Bittorrent, Gnutella, +Gnutella2, Fasttrack, Soulseek, Direct-Connect et Opennap. Il permet +d'effectuer une recherche en parallèle sur plusieurs réseaux, et échange +des fichiers avec de multiples pairs en parallèle. + +*Un des développeurs de MLdonkey :* « Début 2002, nous avons décidé +d'utiliser OCaml pour programmer une application réseau dans le monde +émergent des systèmes pair-à-pair. Le résultat de notre travail, +MLdonkey, a surpassé nos espérances : MLdonkey est aujourd'hui le client +de partage de fichiers pair-à-pair le plus populaire, d'après +[freshmeat.net](http://freshmeat.net/), avec environ dix mille +utilisateurs quotidiens. De plus, MLdonkey est le seul client capable de +se connecter à plusieurs réseaux pair-à-pair pour télécharger et +échanger des fichiers. Il fonctionne en tant que démon, c'est-à-dire en +tâche de fond et sans surveillance humaine, et peut être contrôlé à +l'aide d'une interface au choix parmi trois : GTK, web et telnet. » diff --git a/data/success_stories/fr/slam.md b/data/success_stories/fr/slam.md index e070873..58d6a53 100644 --- a/data/success_stories/fr/slam.md +++ b/data/success_stories/fr/slam.md @@ -1,7 +1,25 @@ --- title: SLAM +url: http://research.microsoft.com/en-us/projects/slam/ --- -Le projet [SLAM](http://research.microsoft.com/en-us/projects/slam/) a débuté à Microsoft Research début 2000. Son but était de vérifier automatiquement qu'un programme C utilise correctement l'interface d'une bibliothèque extérieure. Pour répondre à cette question, SLAM utilise de manière novatrice des idées provenant de la vérification symbolique de modèles, de l'analyse statique de programmes et de la démonstration automatique. Le moteur d'analyse SLAM est au coeur d'un nouvel outil appelé SDV (Vérification Statique de Drivers) qui analyse systématiquement le code source des drivers (pilotes de périphériques) Windows et vérifie leur conformité vis-à-vis d'un ensemble de règles qui caractérisent les interactions correctes entre un driver et le noyau du système d'exploitation Windows. +Le projet [SLAM](http://research.microsoft.com/en-us/projects/slam/) a +débuté à Microsoft Research début 2000. Son but était de vérifier +automatiquement qu'un programme C utilise correctement l'interface d'une +bibliothèque extérieure. Pour répondre à cette question, SLAM utilise de +manière novatrice des idées provenant de la vérification symbolique de +modèles, de l'analyse statique de programmes et de la démonstration +automatique. Le moteur d'analyse SLAM est au coeur d'un nouvel outil +appelé SDV (Vérification Statique de Drivers) qui analyse +systématiquement le code source des drivers (pilotes de périphériques) +Windows et vérifie leur conformité vis-à-vis d'un ensemble de règles qui +caractérisent les interactions correctes entre un driver et le noyau du +système d'exploitation Windows. -*Dans le rapport technique MSR-TR-2004-08, T.Ball, B.Cook, V.Levin and S.K.Rajamani, les auteurs de SLAM, écrivent:* “The Right Tools for the Job: We developed SLAM using Inria's OCaml functional programming language. The expressiveness of this language and robustness of its implementation provided a great productivity boost.” +*Dans le rapport technique +[MSR-TR-2004-08](http://research.microsoft.com/apps/pubs/default.aspx?id=70038), +T.Ball, B.Cook, V.Levin and S.K.Rajamani, les auteurs de SLAM, +écrivent:* “The Right Tools for the Job: We developed SLAM using Inria's +OCaml functional programming language. The expressiveness of this +language and robustness of its implementation provided a great +productivity boost.” diff --git a/data/success_stories/fr/unison.md b/data/success_stories/fr/unison.md index 1f18f61..f958dec 100644 --- a/data/success_stories/fr/unison.md +++ b/data/success_stories/fr/unison.md @@ -1,8 +1,35 @@ --- -title: The Unison File Synchronizer +title: Le synchroniseur de fichiers Unison image: unison-thumb.jpg +url: http://www.cis.upenn.edu/%7Ebcpierce/unison/ --- -[Unison](http://www.cis.upenn.edu/~bcpierce/unison/) est un outil de synchronisation de fichiers populaire, qui fonctionne sous Windows et sous la plupart des variantes d'Unix. Il permet de stocker deux répliques d'une collection de fichiers et de répertoires sur deux machines différentes, ou bien sur deux disques différents d'une même machine, et de les mettre à jour en propageant les changements de chacune des répliques vers l'autre. À la différence d'un simple outil de sauvegarde ou de maintien d'une image miroir, Unison est capable de gérer la situation où les deux répliques ont été modifiées : les changements qui n'entrent pas en conflit sont propagés automatiquement, tandis que les changements incompatibles sont détectés et signalés. Unison est également résistant aux échecs : il prend soin de laisser les deux répliques, ainsi que ses propres structures privées, dans un état cohérent à tout instant, même en cas d'arrêt abrupt ou de panne de communication. +[Unison](http://www.cis.upenn.edu/%7Ebcpierce/unison/) est un outil de +synchronisation de fichiers populaire, qui fonctionne sous Windows et +sous la plupart des variantes d'Unix. Il permet de stocker deux +répliques d'une collection de fichiers et de répertoires sur deux +machines différentes, ou bien sur deux disques différents d'une même +machine, et de les mettre à jour en propageant les changements de +chacune des répliques vers l'autre. À la différence d'un simple outil de +sauvegarde ou de maintien d'une image miroir, Unison est capable de +gérer la situation où les deux répliques ont été modifiées : les +changements qui n'entrent pas en conflit sont propagés automatiquement, +tandis que les changements incompatibles sont détectés et signalés. +Unison est également résistant aux échecs : il prend soin de laisser les +deux répliques, ainsi que ses propres structures privées, dans un état +cohérent à tout instant, même en cas d'arrêt abrupt ou de panne de +communication. -*[Benjamin C. Pierce](http://www.cis.upenn.edu/~bcpierce/) (University of Pennsylvania), chef du projet Unison :* « Je pense qu'Unison est un succès très clair pour OCaml – en particulier, grâce à l'extrême portabilité et l'excellente conception générale du compilateur et de l'environnement d'exécution. Le typage statique fort d'OCaml, ainsi que son puissant système de modules, nous ont aidés à organiser un logiciel complexe et de grande taille avec un haut degré d'encapsulation. Ceci nous a permis de préserver un haut niveau de robustesse, au cours de plusieurs années de travail, et avec la participation de nombreux programmeurs. En fait, Unison présente la caractéristique, peut-être unique parmi les projets de grande taille écrits en OCaml, d'avoir été *traduit* de Java vers OCaml à mi-chemin au cours de son développement. L'adoption d'OCaml a été comme une bouffée d'air pur. » +*[Benjamin C. Pierce](http://www.cis.upenn.edu/%7Ebcpierce/) (University +of Pennsylvania), chef du projet Unison :* « Je pense qu'Unison est un +succès très clair pour OCaml – en particulier, grâce à l'extrême +portabilité et l'excellente conception générale du compilateur et de +l'environnement d'exécution. Le typage statique fort d'OCaml, ainsi que +son puissant système de modules, nous ont aidés à organiser un logiciel +complexe et de grande taille avec un haut degré d'encapsulation. Ceci +nous a permis de préserver un haut niveau de robustesse, au cours de +plusieurs années de travail, et avec la participation de nombreux +programmeurs. En fait, Unison présente la caractéristique, peut-être +unique parmi les projets de grande taille écrits en OCaml, d'avoir été +*traduit* de Java vers OCaml à mi-chemin au cours de son développement. +L'adoption d'OCaml a été comme une bouffée d'air pur. » diff --git a/lib/success_story.ml b/lib/success_story.ml index 0a171c1..2152c15 100644 --- a/lib/success_story.ml +++ b/lib/success_story.ml @@ -1 +1 @@ -type t = { title : string; image : string option } +type t = { title : string; image : string option; url : string option } diff --git a/src/lib/data.ml b/src/lib/data.ml index ba982d8..4542d49 100644 --- a/src/lib/data.ml +++ b/src/lib/data.ml @@ -213,6 +213,9 @@ module Success_story = struct `Image (Image.make ~label:"Image" ~name:"image" ~required:false ~i18n:(`Boolean false) ()); + `String + (String.make ~label:"URL" ~name:"url" ~required:false + ~i18n:(`Boolean false) ()); `Markdown Markdown.(make ~label:"Body" ~name:"body" ~i18n:(`Boolean true) ()); ]