<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Céondo - Fluid Phase Equilibria, Chemical Properties &amp; Databases</title><link href="https://www.ceondo.com/" rel="alternate"/><link href="https://www.ceondo.com/feeds/all.atom.xml" rel="self"/><id>https://www.ceondo.com/</id><updated>2026-06-26T14:25:29+02:00</updated><entry><title>The Visitors of Cheméo Changed</title><link href="https://www.ceondo.com/ecte/2026/06/crawlers-changed-server-never-noticed/" rel="alternate"/><published>2026-06-25T20:10:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2026-06-25:/ecte/2026/06/crawlers-changed-server-never-noticed/</id><summary type="html">&lt;p&gt;... and the server never noticed&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last week I pulled just under six days of access logs off the &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt; server.
I only wanted to check if my handling of the bot spamming the subscription form was efficient.
I came away with something I did not expect: the audience of the site has almost entirely changed.&lt;/p&gt;
&lt;h3&gt;The boring part first&lt;/h3&gt;
&lt;p&gt;Cheméo runs on a single box.
&lt;a href="https://caddyserver.com/"&gt;Caddy&lt;/a&gt; terminates TLS and serves the static files.
Behind it are two &lt;a href="https://go.dev/"&gt;Go&lt;/a&gt; binaries: a boring web server that answers the requests, and a custom indexer that runs quietly in the background, coupled with a Python compute node running the property prediction code.
SQLite is the store underneath.
No Kubernetes, no autoscaling, nobody on call.
One server, in one rack.&lt;/p&gt;
&lt;p&gt;Over a full month that box serves about 10.6 million requests and nearly 1 TB of data.
That is roughly 5.6 million HTML pages and a steady 3 to 4 Mbps, day and night.
Uptime is close to 100%, and I have not had to log in and fix anything in a long time.&lt;/p&gt;
&lt;p&gt;And the box is doing real work the whole time.
The busiest path on the whole site is &lt;code&gt;/similar&lt;/code&gt;, the &lt;a href="https://www.chemeo.com/similar"&gt;chemical similarity search&lt;/a&gt;, with about 150,000 hits in the window.
Every one of those runs a fingerprint comparison against the full database, exercising the chemistry code I hand-rolled in assembly more than ten years ago.
&lt;code&gt;/predict&lt;/code&gt;, the &lt;a href="https://www.chemeo.com/predict"&gt;property prediction&lt;/a&gt;, takes another 66,000, this time exercising the Python compute backend.
The bots are driving the actual machinery, not grazing on static HTML, and it holds up.&lt;/p&gt;
&lt;p&gt;This is the part I am quietly happy about.
Every year there is a new way to deploy a web application, and every year I am glad I did not rewrite Cheméo to use it.
Boring technology, chosen with care, keeps running while you go and do something else.&lt;/p&gt;
&lt;h3&gt;Almost nobody out there is human&lt;/h3&gt;
&lt;p&gt;Now the logs themselves.
&lt;strong&gt;Roughly 99% of the traffic is automated.&lt;/strong&gt;
The real (or direct) human audience is small: somewhere between 50,000 and 100,000 page views a month, call it two to three thousand a day.&lt;/p&gt;
&lt;p&gt;You can read it straight off the assets.
The main stylesheet, the one a real browser loads once per page, was fetched about 110,000 times a month.
That is the generous ceiling on real page renders, because some rendering bots pull the CSS too.
About 98% of the so-called page views never asked for a single asset of the page they supposedly loaded.
They took the HTML and left.&lt;/p&gt;
&lt;p&gt;Some of the bots try to dress up to hide themselves.
The traffic carrying a normal browser user-agent averaged 0.67 asset requests per page, where a real browser pulls five to fifteen.
It was dominated by a handful of fixed user-agent strings, with 231,519 requests coming from one single Windows and Chrome string.
That is not a person.
That is a scraper wearing a browser costume, and a bad one!&lt;/p&gt;
&lt;p&gt;A few thousand real readers a day, sustained for years with no marketing and no newsletter, is more than fine by me.
The site does its job for the people who need a boiling point or a heat of formation.&lt;/p&gt;
&lt;h3&gt;The part that actually changed&lt;/h3&gt;
&lt;p&gt;Here is what I find interesting.
Split the bots by what they are for:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Share of requests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI crawlers&lt;/td&gt;
&lt;td style="text-align: right;"&gt;37%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-UA (mostly scrapers)&lt;/td&gt;
&lt;td style="text-align: right;"&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search engines&lt;/td&gt;
&lt;td style="text-align: right;"&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO and marketing bots&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everything else&lt;/td&gt;
&lt;td style="text-align: right;"&gt;5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The single biggest consumer of Cheméo, by requests and by bandwidth, is no longer a search engine.
It is AI training and retrieval crawlers.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AI crawler&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Requests in the window&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Amazonbot&lt;/td&gt;
&lt;td style="text-align: right;"&gt;257,925&lt;/td&gt;
&lt;td&gt;Amazon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT-User / OAI-SearchBot&lt;/td&gt;
&lt;td style="text-align: right;"&gt;174,846&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ClaudeBot&lt;/td&gt;
&lt;td style="text-align: right;"&gt;115,945&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPTBot&lt;/td&gt;
&lt;td style="text-align: right;"&gt;102,617&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bytespider&lt;/td&gt;
&lt;td style="text-align: right;"&gt;36,849&lt;/td&gt;
&lt;td&gt;ByteDance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For comparison, the classic search crawlers over the same window were Sogou, Bingbot, Googlebot, YandexBot and Baiduspider.
Together they came to about a fifth of the traffic.&lt;/p&gt;
&lt;p&gt;I have looked at these logs before, a few years back.
Back then the story was search, almost entirely.
Googlebot, Bingbot and the rest were something like 80% of the bot traffic, and the AI crawlers did not exist yet.&lt;/p&gt;
&lt;p&gt;Today they are the largest single category, and search is down to a fifth.
That is the pattern change, and it happened fast.
In a few years, the dominant reason a machine visits Cheméo went from "index this page for a search result" to "ingest this data for a model".&lt;/p&gt;
&lt;h3&gt;What it means for the data&lt;/h3&gt;
&lt;p&gt;This changes what being found means.
For fifteen years, being useful meant ranking in Google so an engineer could land on the right compound page.
More and more, the same engineer gets the number straight from a chatbot, and the chatbot got it by crawling Cheméo.
The data still comes from here.
&lt;strong&gt;The reader in the middle is now a model.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So I am doing the obvious thing.
I am writing a clear page on where Cheméo's data comes from, how it is collected and validated.
Not for SEO, but so the models pulling the data have the provenance right there and can represent and cite it correctly.
If the machines are going to read the site more than people do, they should at least get the story right.&lt;/p&gt;
&lt;p&gt;I built Cheméo for chemical engineers.
Most of its readers are now machines, and the little server in the rack handled the whole switch without me touching it.&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/><category term="Infrastructure"/><category term="AI"/></entry><entry><title>Still Faster, After 30 Years</title><link href="https://www.ceondo.com/ecte/2026/04/still-faster-after-30-years/" rel="alternate"/><published>2026-04-18T14:24:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2026-04-18:/ecte/2026/04/still-faster-after-30-years/</id><summary type="html">&lt;p&gt;A 1990s Fortran cubic root solver still beats a modern analytical Cardano in 2026.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Back in the thermodynamic code I keep writing lately, one tiny problem shows up in every single iteration of a &lt;a href="/ecte/2020/08/complex-flash-calculations/"&gt;flash calculation&lt;/a&gt;.
You need to solve a cubic equation in the compressibility factor Z, the heart of any cubic equation of state (Peng-Robinson, Soave-Redlich-Kwong, you name it).&lt;/p&gt;
&lt;p&gt;A cubic has three roots.
Depending on the conditions, you take one or another depending on your goal, if you are looking at the liquid, the vapor or the root minimizing the energy.
A simulator calls this solver millions of times per full plant simulation, even more in reservoir simulations.
Every nanosecond you save matters.&lt;/p&gt;
&lt;p&gt;So, this weekend, I got curious.
The thermolib code I have been using for years ships a tight little Newton solver for this cubic, written in Fortran in the 1990s.
Is it still the fastest thing in the room, or has an analytical approach caught up in thirty years of compilers and CPUs?&lt;/p&gt;
&lt;h3&gt;The problem&lt;/h3&gt;
&lt;p&gt;The cubic we need to solve has a known form:&lt;/p&gt;
&lt;p&gt;$Z³ - X₂·Z² + X₁·Z - X₀ = 0$&lt;/p&gt;
&lt;p&gt;where $X₀$, $X₁$, $X₂$ come from the reduced EOS parameters $A$, $B$ and the EOS-specific constants (different for PR and SRK, the same for both solvers in my comparison).
The physical root is always a bit above $B$ for the liquid phase, or a bit above $B + 1$ for the vapor phase.
That is the key domain fact.&lt;/p&gt;
&lt;h3&gt;Two approaches&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The old Fortran way&lt;/strong&gt;: Newton with &lt;a href="https://en.wikipedia.org/wiki/Halley%27s_method"&gt;Halley&lt;/a&gt; (cubic) corrections.&lt;/p&gt;
&lt;p&gt;Given the polynomial $f(Z) = Z^3 - X_2 Z^2 + X_1 Z - X_0$ and its first two derivatives $f'$ and $f''$, pick a starting value $Z_0$ by checking the sign of $f$ at the inflection point $Z = X_2 / 3$.
Take $Z_0 = B$ on the liquid side ($f &amp;gt; 0$), or $Z_0 = B + 1$ on the vapor side.&lt;/p&gt;
&lt;p&gt;Then iterate, with a third-order correction:&lt;/p&gt;
&lt;p&gt;$$\delta_n = \frac{f(Z_n)}{f'(Z_n)} \left(1 + \frac{f(Z_n) \, f''(Z_n)}{f'(Z_n)^2}\right), \qquad Z_{n+1} = Z_n - \delta_n$$&lt;/p&gt;
&lt;p&gt;Stop when $|\delta_n| &amp;lt; 10^{-7}$.&lt;/p&gt;
&lt;p&gt;Two or three iterations and it is done.
If a second root is needed, factor the first one out and apply one more Newton step on the remaining quadratic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The old Cardano/mathematical way&lt;/strong&gt;: closed form, no iteration. &lt;em&gt;The formula is from 1545&lt;/em&gt;, that is not a typo.
If you are interested with history, the &lt;a href="https://en.wikipedia.org/wiki/Cubic_equation"&gt;Wikipedia page about the cubic equation&lt;/a&gt; is a rabbit hole you can spent a couple of hours into and then come back here.&lt;/p&gt;
&lt;p&gt;Rewrite the cubic as $Z^3 + p Z^2 + q Z + r = 0$ with $p = -X_2$, $q = X_1$, $r = -X_0$, then substitute $Z = t - p/3$ to kill the quadratic term:&lt;/p&gt;
&lt;p&gt;$$t^3 + P\,t + Q = 0, \qquad P = q - \frac{p^2}{3}, \qquad Q = \frac{2 p^3}{27} - \frac{p q}{3} + r$$&lt;/p&gt;
&lt;p&gt;The discriminant decides which branch to take:&lt;/p&gt;
&lt;p&gt;$$\Delta = \left(\frac{Q}{2}\right)^2 + \left(\frac{P}{3}\right)^3$$&lt;/p&gt;
&lt;p&gt;If $\Delta &amp;gt; 0$, one real root, given by a sum of two real cube roots:&lt;/p&gt;
&lt;p&gt;$$t = \sqrt[3]{-\tfrac{Q}{2} + \sqrt{\Delta}} + \sqrt[3]{-\tfrac{Q}{2} - \sqrt{\Delta}}$$&lt;/p&gt;
&lt;p&gt;If $\Delta \leq 0$, three real roots, given by the trigonometric form:&lt;/p&gt;
&lt;p&gt;$$t_k = 2 \sqrt{-\tfrac{P}{3}} \, \cos!\left(\frac{1}{3} \arccos!\left(\frac{-Q/2}{\sqrt{-(P/3)^3}}\right) - \frac{2 \pi k}{3}\right), \qquad k = 0, 1, 2$$&lt;/p&gt;
&lt;p&gt;Recover $Z = t - p/3$ and pick the physical root.&lt;/p&gt;
&lt;p&gt;No loop and no tolerance, a single pass through a 480-year-old formula.
On paper, this should be hard to beat.&lt;/p&gt;
&lt;h3&gt;The benchmark&lt;/h3&gt;
&lt;p&gt;I reimplemented both solvers in Fortran, in a small standalone file, and tested five cases: single-root, two-phase and dense-liquid regimes.
Both agree to machine precision, max error around 2·10⁻¹⁶.&lt;/p&gt;
&lt;p&gt;Then I &lt;a href="/ecte/2020/10/timing-fortran-program-max-or-if-else/"&gt;timed them&lt;/a&gt; with my benchmarking tools:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Newton&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Cardano&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PR near-critical gas&lt;/td&gt;
&lt;td style="text-align: right;"&gt;37.6 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;45.9 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1.22×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PR two-phase region&lt;/td&gt;
&lt;td style="text-align: right;"&gt;19.5 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;46.8 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2.40×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PR dense liquid&lt;/td&gt;
&lt;td style="text-align: right;"&gt;25.4 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;45.7 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1.80×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRK low-density gas&lt;/td&gt;
&lt;td style="text-align: right;"&gt;22.5 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;46.5 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2.07×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRK two-phase region&lt;/td&gt;
&lt;td style="text-align: right;"&gt;14.5 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;45.9 ns&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3.16×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;em&gt;old&lt;/em&gt; Fortran Newton wins every case.
Between 1.22× and 3.16× faster.
Cardano stays flat at around 46 ns per call, Newton varies from 14 to 38 ns depending on how close the starting guess was.&lt;/p&gt;
&lt;h3&gt;Why the old code still wins&lt;/h3&gt;
&lt;p&gt;Cardano pays for a &lt;a href="https://community.intel.com/t5/Intel-Fortran-Compiler/Fast-cube-root/m-p/1171728"&gt;&lt;code&gt;cbrtf&lt;/code&gt;&lt;/a&gt;, a &lt;code&gt;sqrt&lt;/code&gt;, an &lt;code&gt;acos&lt;/code&gt; and a &lt;code&gt;cos&lt;/code&gt; on every call.
Those are not cheap on a modern CPU. Each takes tens of nanoseconds of hardware work, and the analytical formula needs all of them. There is no shortcut, because the formula is general and does not know anything about where the root should be.&lt;/p&gt;
&lt;p&gt;Newton pays for nothing exotic, just a handful of multiplies and adds per iteration.
And it converges in two or three iterations, because the starting guess is already close.
The author of the Fortran code knew that the physical root is always near $B$ or near $B + 1$.
That one piece of domain knowledge is worth a factor of three.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is the whole point. Cardano is general and cannot skip anything. The Fortran solver is specialised and skips a lot because the author knew where the root lives.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Not a coincidence&lt;/h3&gt;
&lt;p&gt;The author of that Fortran Newton solver is Michael L. Michelsen, the one from &lt;a href="https://tie-tech.com/vare/thermodynamic-models-fundamentals-computational-aspects-2nd-ed/"&gt;&lt;em&gt;Thermodynamic Models: Fundamentals &amp;amp; Computational Aspects&lt;/em&gt;&lt;/a&gt;, and the one whose department I was lucky to do my PhD in, in Denmark.&lt;/p&gt;
&lt;p&gt;Thirty years later, with a modern Fortran compiler and a modern 2025 (AMD) CPU, I would have expected the general and analytical code to have caught up (maybe through vectorization, &lt;a href="https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/ieee754/dbl-64/s_sin.c;hb=HEAD"&gt;better tables&lt;/a&gt;, whatever).&lt;/p&gt;
&lt;p&gt;It has not.
The old code still wins, because it embbeds the domain knowledge of the expert in it.&lt;/p&gt;
&lt;p&gt;PS: By the way, a good start Newton/Halley's method implementation can be found on the CD accompanying the book of Michelsen and Mollerup.&lt;/p&gt;</content><category term="misc"/><category term="Thermodynamics"/><category term="Cubic EOS"/><category term="Benchmark"/><category term="Fortran"/></entry><entry><title>The Reference Already on the Shelf</title><link href="https://www.ceondo.com/ecte/2026/04/gas-purification-kohl-nielsen/" rel="alternate"/><published>2026-04-11T10:25:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2026-04-11:/ecte/2026/04/gas-purification-kohl-nielsen/</id><summary type="html">&lt;p&gt;When the reference on gas treating is already three meters away.&lt;/p&gt;</summary><content type="html">&lt;p&gt;These last months, I have been deep amine gas treatement systems. 
Enjoying playing with eNRTL, the right Henry constants, with all the MEA, DEA, MDEA, piperazine blends, the whole family of solvents that industry uses to strip CO₂ and H₂S (and more) out of process gas.
And one reference kept coming back in every paper, every thesis, every validation dataset I was reading: &lt;strong&gt;Kohl &amp;amp; Nielsen&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Just "Kohl &amp;amp; Nielsen", like everyone in the field already knows what you mean, but of course, not me.&lt;/p&gt;
&lt;p&gt;So I dug a bit.
It turned out to be &lt;em&gt;Gas Purification&lt;/em&gt;, the 5th edition, by Arthur L. Kohl and Richard B. Nielsen, published nearly 30 years ago, in 1997.
The reference on the subject, like &lt;em&gt;Thermodynamic Models: Fundamentals &amp;amp; Computational Aspects&lt;/em&gt; by Michelsen and Mollerup for fluid phase equilibria.
In it, you get flow schemes, loading correlations, reaction mechanisms, degradation pathways, heats of absorption; all the numbers I need to check my simulations against real plants.
On the desk, not on the shelf.&lt;/p&gt;
&lt;p&gt;Off I went online looking to buy a used copy of it, I have a collection of &lt;em&gt;used reference books&lt;/em&gt;, I am still very old school, still prefer the dead tree version of reference books, because I always put post-its to mark the pages of interest to quickly find them again.
Prices looked reasonable, €80 to €150 depending on the seller.&lt;/p&gt;
&lt;p&gt;And then I looked at the cover.&lt;/p&gt;
&lt;p&gt;The dark blue cover, the "FIFTH EDITION" banner at the top, the not so good photograph of the gas treating plant at the bottom. I had seen this book before.
Many times. Too many times. Yes, on my wife's bookshelf, in the office next to mine.&lt;/p&gt;
&lt;p&gt;My wife is a chemical engineer and a specialist in gas treating processes.
Of course she has the reference work in her field.
Of course it is the 5th edition.
Of course it was already three meters away from my desk the whole time I was hunting for a copy online.&lt;/p&gt;
&lt;p&gt;I raided her bookshelf.
A bookmark is now sitting in the MDEA chapter.&lt;/p&gt;
&lt;p&gt;The lesson: before you buy the reference book for your domain, check if the domain expert you live with has not already bought it for you.&lt;/p&gt;</content><category term="misc"/><category term="Gas Treating"/><category term="Amine Systems"/><category term="Book"/></entry><entry><title>eIDAS PDF Signatures on Linux</title><link href="https://www.ceondo.com/ecte/2026/04/eidas-signature-linux/" rel="alternate"/><published>2026-04-05T18:00:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2026-04-05:/ecte/2026/04/eidas-signature-linux/</id><summary type="html">&lt;p&gt;Working eIDAS signatures on Ubuntu with a D-Trust Card 5.1&lt;/p&gt;</summary><content type="html">&lt;p&gt;Here in Germany, running a GmbH means signing more and more things electronically.
The Finanzamt wants e-invoices, contracts move to &lt;a href="https://en.wikipedia.org/wiki/PAdES"&gt;PAdES&lt;/a&gt;, and quite nicely the list of paper-only documents is shrinking.
Ok, some times to times, you still need to send a fax or fill a form electronically, which creates a PDF, that you need to sign manually and then post the good old way.
Still, the direction is clear: every year, a few more things that used to need a wet-ink signature now need a &lt;strong&gt;qualified electronic signature&lt;/strong&gt; (QES) under &lt;a href="https://en.wikipedia.org/wiki/EIDAS"&gt;eIDAS&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;So, I got a &lt;a href="https://www.d-trust.net/de/loesungen/d-trust-signaturkarte"&gt;D-Trust Card 5.1 Std. RSA 2cc&lt;/a&gt; and a &lt;a href="https://www.reiner-sct.com/en/produkt/cyberjack-rfid-standard/"&gt;REINER SCT cyberJack RFID standard&lt;/a&gt; reader, and I sat down to make it work with Ubuntu 24.04.
I must confess: I had no idea I was about to spend a few evenings reading &lt;a href="https://github.com/OpenSC/OpenSC/wiki"&gt;OpenSC&lt;/a&gt; source code.&lt;/p&gt;
&lt;h3&gt;The card that Linux did not want to talk to&lt;/h3&gt;
&lt;p&gt;The D-Trust Card 5.1 uses CardOS 6.0, and CardOS 6.0 requires a &lt;strong&gt;CAN (Card Access Number)&lt;/strong&gt; to open a PACE secure channel before the card will answer anything useful.
This is a nice security feature — the 6-digit CAN is printed on the card itself, so an attacker with stolen card data but no physical card cannot do much — but it needs support all the way down the stack.&lt;/p&gt;
&lt;p&gt;OpenSC did not support D-Trust 5.1 until version &lt;strong&gt;0.27.1&lt;/strong&gt;, released on 2026-03-31.
Before that, &lt;code&gt;pkcs15-tool -D&lt;/code&gt; would politely answer "Card is invalid or cannot be handled" and that was the end of the conversation.
The implementation landed in &lt;a href="https://github.com/OpenSC/OpenSC/pull/3137"&gt;OpenSC PR #3137&lt;/a&gt;, and the release tracking is in &lt;a href="https://github.com/OpenSC/OpenSC/issues/3526"&gt;issue #3526&lt;/a&gt;.
It looks simple, but I had to read the code of OpenSC a bit more than I wanted at first, it was segfaulting on me a bit too much.
At the end, I found the bug and &lt;a href="https://github.com/OpenSC/OpenSC/pull/3587"&gt;created my first PR for this project&lt;/a&gt;, happy day.&lt;/p&gt;
&lt;p&gt;The lesson is simple: if you are buying a qualified signature card today, check the OpenSC changelog &lt;em&gt;before&lt;/em&gt; you open the package.
And if you see that you are at the bleeding edge, be ready to spend a bit of time to help iron out the bugs.
Once OpenSC was able to talk with my card, the next step was to use it for something useful, that is, sign some PDFs.&lt;/p&gt;
&lt;h3&gt;What I tried that did not work&lt;/h3&gt;
&lt;p&gt;The obvious first candidate was &lt;code&gt;pdfsig&lt;/code&gt; from poppler-utils, driving the card through NSS.
On paper it looks clean: register the OpenSC PKCS#11 module in an NSS database, point &lt;code&gt;pdfsig&lt;/code&gt; at it, done.
In reality, poppler 24.02 cannot express "no database password, but let the reader collect the card PIN on its own pinpad".
Every combination of &lt;code&gt;-nss-pwd ''&lt;/code&gt;, &lt;code&gt;-nss-pwd 'something'&lt;/code&gt;, and no flag at all fails.
The cyberJack reader has a &lt;strong&gt;protected authentication path&lt;/strong&gt; — PINs must be typed on its physical keypad, not on the laptop — and NSS as used by poppler 24.02 does not forward that properly for this card.&lt;/p&gt;
&lt;p&gt;Next candidate: &lt;a href="https://docs.pyhanko.eu/en/latest/"&gt;pyHanko&lt;/a&gt; with &lt;code&gt;--skip-user-pin&lt;/code&gt;.
pyHanko has excellent PKCS#11 support, and &lt;code&gt;--skip-user-pin&lt;/code&gt; sounds exactly like what you want when the reader handles the PIN itself.
Except that &lt;code&gt;--skip-user-pin&lt;/code&gt; does not mean "let the token handle the PIN", it means "skip &lt;code&gt;C_Login&lt;/code&gt; entirely".
Without a successful &lt;code&gt;C_Login&lt;/code&gt;, the signing key is invisible (it has the &lt;code&gt;private&lt;/code&gt; flag), and pyHanko reports &lt;code&gt;Could not find private key with label 'Signaturzertifikat'&lt;/code&gt;.
Without the flag, pyHanko prompts for a PIN on the keyboard and pushes it into &lt;code&gt;C_Login&lt;/code&gt;, which the card rejects because it expects protected authentication path.
Heads you lose, tails you lose.&lt;/p&gt;
&lt;h3&gt;The working recipe&lt;/h3&gt;
&lt;p&gt;After a lot of reading of &lt;code&gt;pyhanko/sign/pkcs11.py&lt;/code&gt; and &lt;code&gt;python-pkcs11/_pkcs11.pyx&lt;/code&gt;, the fix turned out to be a single configuration line.&lt;/p&gt;
&lt;p&gt;pyHanko &lt;em&gt;does&lt;/em&gt; know how to issue &lt;code&gt;C_Login(CKU_USER, NULL, 0)&lt;/code&gt; — the call that tells the token "please handle the PIN yourself".
It is exposed through a pin-entry mode called &lt;code&gt;DEFER&lt;/code&gt;.
The catch: the CLI flags can only reach &lt;code&gt;SKIP&lt;/code&gt; or &lt;code&gt;PROMPT&lt;/code&gt;.
The only way to select &lt;code&gt;DEFER&lt;/code&gt; is through a YAML config file loaded with &lt;code&gt;--config&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here is the minimal &lt;code&gt;pyhanko.yml&lt;/code&gt; that makes the whole thing work:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;pkcs11-setups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;smartcard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;module-path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/usr/lib/opensc-pkcs11.so&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;slot-no&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1&lt;/span&gt;&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="c1"&gt;# Signature-PIN slot&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;cert-label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Signaturzertifikat&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;key-label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Signaturschluessel&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# private key label differs from cert label!&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;prompt-pin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;defer&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="c1"&gt;# the setting that changes everything&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;other-certs-to-pull&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;bulk-fetch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And the invocation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyhanko&lt;span class="w"&gt; &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;pyhanko.yml&lt;span class="w"&gt; &lt;/span&gt;sign&lt;span class="w"&gt; &lt;/span&gt;addsig&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--field&lt;span class="w"&gt; &lt;/span&gt;Sig1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;pkcs11&lt;span class="w"&gt; &lt;/span&gt;--p11-setup&lt;span class="w"&gt; &lt;/span&gt;smartcard&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;input.pdf&lt;span class="w"&gt; &lt;/span&gt;input-signed.pdf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The reader blinks, asks for the CAN on its pinpad, then asks for the Signature-PIN, and out comes a signed PDF.
&lt;code&gt;pdfsig input-signed.pdf&lt;/code&gt; happily reports &lt;em&gt;Signature is Valid. Total document signed.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Two small details that cost me time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The certificate label is &lt;code&gt;Signaturzertifikat&lt;/code&gt; but the private key label is &lt;code&gt;Signaturschluessel&lt;/code&gt;.
  pyHanko needs both, separately, via &lt;code&gt;cert-label&lt;/code&gt; and &lt;code&gt;key-label&lt;/code&gt;; using only one of them gives you a very confusing "key not found" error.&lt;/li&gt;
&lt;li&gt;The card allows only &lt;strong&gt;3 attempts&lt;/strong&gt; on the Signature-PIN before it locks.
  Before running the real &lt;code&gt;sign addsig&lt;/code&gt;, write a tiny read-only Python script that opens the token with &lt;code&gt;user_pin=PROTECTED_AUTH&lt;/code&gt; and lists the private key labels.
  A misconfigured run costs you a PIN retry, and you do not want to discover the YAML typo on attempt three.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Adding PAdES and a trusted timestamp&lt;/h3&gt;
&lt;p&gt;A bare signature is rarely enough for a real invoice.
What the EU (and every auditor) expects is a &lt;strong&gt;PAdES&lt;/strong&gt; signature with a trusted &lt;strong&gt;RFC 3161 timestamp&lt;/strong&gt; attached.
The good news: pyHanko adds both with two extra flags.
The even better news: Sectigo runs a public &lt;a href="https://www.sectigo.com/resource-library/time-stamping-server"&gt;qualified timestamping authority&lt;/a&gt; at &lt;code&gt;http://timestamp.sectigo.com/qualified&lt;/code&gt; — no registration, no account, nothing to configure, and it answers in under a second.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyhanko&lt;span class="w"&gt; &lt;/span&gt;--config&lt;span class="w"&gt; &lt;/span&gt;pyhanko.yml&lt;span class="w"&gt; &lt;/span&gt;sign&lt;span class="w"&gt; &lt;/span&gt;addsig&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--field&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1/350,40,560,120/Sig1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--style-name&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--use-pades&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--timestamp-url&lt;span class="w"&gt; &lt;/span&gt;http://timestamp.sectigo.com/qualified&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;pkcs11&lt;span class="w"&gt; &lt;/span&gt;--p11-setup&lt;span class="w"&gt; &lt;/span&gt;smartcard&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;input.pdf&lt;span class="w"&gt; &lt;/span&gt;input-signed.pdf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;--field&lt;/code&gt; syntax &lt;code&gt;PAGE/X1,Y1,X2,Y2/NAME&lt;/code&gt; places a visible signature box on the page.
A4 is 595×842 points, origin bottom-left, and &lt;code&gt;350,40,560,120&lt;/code&gt; drops a reasonably sized block in the bottom-right corner of the first page.
Use &lt;code&gt;-1&lt;/code&gt; for the last page.
And yes, the coordinates must be &lt;strong&gt;integers&lt;/strong&gt; — passing floats gives you a cryptic "Sig field parameters should be four integers" error.&lt;/p&gt;
&lt;p&gt;And once you have a signed PDF in your hand, you will want to double-check it against something more authoritative than &lt;code&gt;pdfsig&lt;/code&gt;.
The EU runs a free &lt;a href="https://ec.europa.eu/digital-building-blocks/DSS/webapp-demo/validation"&gt;signature validation webapp&lt;/a&gt; that understands PAdES, walks the whole trust chain, and verifies the timestamp against the EU List of Trusted Lists (LOTL).
All green there means a PDF that any auditor in Europe will accept.&lt;/p&gt;
&lt;h3&gt;What this is worth&lt;/h3&gt;
&lt;p&gt;At the end, I have a command-line tool that produces qualified, timestamped, PAdES-signed PDFs on Linux, using only open-source software, a €100 reader, and a €150/year card from D-Trust.
No virtual machine, no commercial Java signing suite, no "please use Windows", no dependency on a vendor that could decide to discontinue their Linux client next year.&lt;/p&gt;
&lt;p&gt;This matters because the list of things that &lt;em&gt;must&lt;/em&gt; be signed electronically is only going to grow.
Better to have a working, scriptable, reproducible setup on the platform I actually use every day, than to boot a Windows VM every time the Finanzamt invents a new form.&lt;/p&gt;
&lt;p&gt;The versions known to work together, as of today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu 24.04.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/OpenSC/OpenSC/wiki"&gt;OpenSC&lt;/a&gt; 0.27.1 (built from git, commit &lt;code&gt;c8157c3b6&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.pyhanko.eu/en/latest/"&gt;pyHanko&lt;/a&gt; 0.32.0.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/python-pkcs11/"&gt;python-pkcs11&lt;/a&gt; 0.9.3.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://poppler.freedesktop.org/"&gt;poppler-utils&lt;/a&gt; 24.02.0 (for &lt;code&gt;pdfsig&lt;/code&gt; — &lt;strong&gt;verification only&lt;/strong&gt;, do not try to sign with it).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.d-trust.net/de/loesungen/d-trust-signaturkarte"&gt;D-Trust Card 5.1 Std. RSA 2cc&lt;/a&gt; (CardOS 6.0 R1.2).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reiner-sct.com/en/produkt/cyberjack-rfid-standard/"&gt;REINER SCT cyberJack RFID standard&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</content><category term="misc"/><category term="eIDAS"/><category term="Linux"/><category term="PDF"/><category term="Signing"/><category term="D-Trust"/><category term="pyHanko"/><category term="OpenSC"/></entry><entry><title>A new Logo for Céondo</title><link href="https://www.ceondo.com/ecte/2026/03/new-logo/" rel="alternate"/><published>2026-03-05T22:11:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2026-03-05:/ecte/2026/03/new-logo/</id><summary type="html">&lt;p&gt;After nearly 20 years, a refresh&lt;/p&gt;</summary><content type="html">&lt;p&gt;After nearly 20 years of Céondo, time for a refresh, and the refresh started with the logo.
I updated the star, it still has the same orientation, but it is now a more conventional star with more structure and a nice 3D feeling using a polygonal shape.&lt;/p&gt;
&lt;p&gt;&lt;img alt="New logo" src="https://www.ceondo.com/images/2026/ceondo-logo-new.png"&gt;&lt;/p&gt;
&lt;p&gt;What I like is that it allowed me to have more saturated colors, it is not flat anymore, it kind of feels more &lt;em&gt;alive&lt;/em&gt;.
Also, because of the structure of the star, it now shows an orientation thanks to the shadow.
It was not that easy to get the shadow right to give the feeling that the star is well balanced with the Céondo name and also looking "top right" into the future.
At the end, I am pretty pleased.&lt;/p&gt;
&lt;p&gt;The next steps will be to update the website, making it ready to enter the 3rd decade of Céondo.&lt;/p&gt;
&lt;p&gt;And to remember, especially for me, the old logo:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Old logo" src="https://www.ceondo.com/images/2026/ceondo-logo-old.png"&gt;&lt;/p&gt;</content><category term="misc"/><category term="Identity"/><category term="Logo"/></entry><entry><title>Sucrosphere</title><link href="https://www.ceondo.com/ecte/2026/02/sucrosphere/" rel="alternate"/><published>2026-02-07T15:09:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2026-02-07:/ecte/2026/02/sucrosphere/</id><summary type="html">&lt;p&gt;Sugar exclusivity for Sucrosphere&lt;/p&gt;</summary><content type="html">&lt;p&gt;The work started in 2023 and developed so well that for the sugar business, I am now exclusively working for &lt;em&gt;Pfeifer &amp;amp; Langen IP GmbH&lt;/em&gt;, under the brand name &lt;a href="https://www.sucrosphere.com"&gt;Sucrosphere&lt;/a&gt;.
&lt;strong&gt;Sucrosphere&lt;/strong&gt; is a spinoff of the 3rd biggest sugar producer in Germany, the 150-year-old Pfeifer &amp;amp; Langen family business.
They decided early on, in 2019, to not let the digitalization of the industry overrun them and took a long view, thanks to their family business vision.
The long view, maybe a bit crazy at that time, was to develop a complete control system for the sugar industry, from sensors (Vision, NIRS) to model predictive control.
Of course, not forgetting scheduling, heat integration, and operator training through a digital twin.&lt;/p&gt;
&lt;p&gt;I am happily supporting them as lead modeling expert, bringing my 25 years of experience in the industry to a young and talented team of software developers and engineers backed by years of internal sugar expertise.
We have a lot of fun solving hard problems.&lt;/p&gt;
&lt;p&gt;For everything else, no exclusivity, so if you need some molecular property expertise, oil &amp;amp; gas, pharma, or fine chemicals modeling, I am there!&lt;/p&gt;</content><category term="misc"/><category term="Sugar"/><category term="Modeling"/><category term="Dynamic Simulation"/><category term="Control"/></entry><entry><title>TIL - Process Explorer</title><link href="https://www.ceondo.com/ecte/2023/06/til-dlls-loaded-by-a-process/" rel="alternate"/><published>2023-06-07T17:09:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2023-06-07:/ecte/2023/06/til-dlls-loaded-by-a-process/</id><summary type="html">&lt;p&gt;Quickly find the DLLs loaded by a process&lt;/p&gt;</summary><content type="html">&lt;h3&gt;TIL - Today I Learned (Again)&lt;/h3&gt;
&lt;p&gt;At present, I find myself tackling some rather complex issues related to an Amines gas treatment simulation. 
There's a certain pleasure in resolving both speciation (we're talking about chemical equilibria using equilibrium constants) and diffusion of the gas that we aim to purify into the fluid phase (this entails chemical reaction rates, discretisation over space and time). &lt;/p&gt;
&lt;p&gt;The real issue is that the software my customer provided doesn't quite meet their speed expectations.
Having previously built one of the fastest multi-phase, multi-model flashes, my customer requested that I optimize their code.&lt;/p&gt;
&lt;p&gt;For numerical work, my solution, as soon as the number of equations starts to be in the hundreds or more, is always to let the big players do the heavy work.
In this case, this involves using the &lt;a href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html"&gt;MKL&lt;/a&gt; for all linear algebra calculations. 
Having worked with the MKL for over a decade, I usually know exactly which DLLs to package with the application. 
However, with the introduction of OneAPI, it seems they've decided to play a game of musical chairs with their files - renaming and moving them around, leaving me with some nice &lt;code&gt;C06D007E&lt;/code&gt; exceptions.&lt;/p&gt;
&lt;p&gt;To identify the necessary DLLs, I built a small application to test all the routines I wanted to use, and then kept tabs on it with the &lt;a href="https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer"&gt;Process Explorer utility&lt;/a&gt;. 
This compact 2MB tool is incredibly useful, providing a host of insights about a running process, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Loaded DLLs&lt;/li&gt;
&lt;li&gt;Memory and CPU usage&lt;/li&gt;
&lt;li&gt;Number of active threads&lt;/li&gt;
&lt;li&gt;Open TCP/IP connections&lt;/li&gt;
&lt;li&gt;Level of coffee in your mug&lt;/li&gt;
&lt;li&gt;And much more!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the software running and monitored, I was able to compile the list of necessary DLLs in no time. 
It was an efficient and hassle-free solution.
In fact, it took me more time writing this small note than doing the analysis, so yes, highly recommended -- and you do not need to be administrator to run it!&lt;/p&gt;</content><category term="misc"/><category term="MKL"/><category term="Deployment"/><category term="Programming"/><category term="TIL"/></entry><entry><title>Cheméo April Updates</title><link href="https://www.ceondo.com/ecte/2023/05/april-2023-news-chemeo/" rel="alternate"/><published>2023-05-02T18:54:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2023-05-02:/ecte/2023/05/april-2023-news-chemeo/</id><summary type="html">&lt;p&gt;Highlights of the last weeks&lt;/p&gt;</summary><content type="html">&lt;p&gt;We improved the &lt;a href="https://www.chemeo.com/api/doc/"&gt;API&lt;/a&gt; of &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt; and added more data!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;On the data side, we were able to add 200 new mixtures, with a lot of equilibrium data from about 500 mixtures. 
  This was thanks to data collected and generously provided by &lt;a href="https://www.tuhh.de/v8/team/research-assistants/d-girardi"&gt;Davi Girardi&lt;/a&gt;, M.Sc., research assistant at the &lt;a href="https://github.com/TUHH-TVT"&gt;Technical University of Hamburg&lt;/a&gt;.&lt;br&gt;
  Davi is working on &lt;a href="https://www.sciencedirect.com/science/article/abs/pii/S0378381222000954"&gt;mixed-solvent electrolyte systems&lt;/a&gt; based on &lt;a href="https://github.com/TUHH-TVT"&gt;openCOSMO-RS&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the &lt;a href="https://www.chemeo.com/api/doc/"&gt;API side&lt;/a&gt;, we added a new end point &lt;code&gt;/api/v1/cid/{cid}&lt;/code&gt;.
  This allows you to directly retrieve the data of a given compound if you know its ID. 
  This is now for example used by &lt;a href="https://dwsim.org/"&gt;DWSIM&lt;/a&gt; to easily retrieve missing data for a simulation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Again, we welcome your feedback and ideas to improve the database and help you do your data work. Just contact us!
As a reminder, you can download the data as Excel, but you can also use the &lt;a href="https://www.chemeo.com/api/doc/"&gt;API&lt;/a&gt; to pull the data directly into your programs. &lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/></entry><entry><title>Cheméo February Updates</title><link href="https://www.ceondo.com/ecte/2023/02/february-2023-news-chemeo/" rel="alternate"/><published>2023-02-27T20:17:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2023-02-27:/ecte/2023/02/february-2023-news-chemeo/</id><summary type="html">&lt;p&gt;Highlights of the last weeks&lt;/p&gt;</summary><content type="html">&lt;p&gt;More data was what we promised, this is what you get!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On the data side, we were able to add more mixtures, we now have 
  &lt;strong&gt;16067 mixtures in the database&lt;/strong&gt;. We also improved our data pipeline 
  (the system parsing raw data from publications, performing 
  validation and reconciliation) and this unlocked a large number of
  pure and mixture datasets. &lt;/li&gt;
&lt;li&gt;Vapor pressure correlations are now available in the Excel and PDF
  exports.&lt;/li&gt;
&lt;li&gt;You can &lt;a href="https://www.chemeo.com/worklists"&gt;bookmarks compounds and mixtures to create a personal worklist&lt;/a&gt;. 
  This way, you can easily go back to compounds and mixtures
  of interest. You can see the attached screenshot of the worklist once
  a user added a couple mixtures and compounds.&lt;/li&gt;
&lt;li&gt;We added a small "ads" for Céondo on the left navigation bar. We 
  think it is not intrusive. If you have better ideas on how to do it,
  your ideas are welcome.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have any questions and remarks, they are welcome!
If you like Cheméo, do not hesitate to recommend it to your colleagues,
students, etc.&lt;/p&gt;
&lt;p&gt;We really want to make a website helping and respecting you, if at any
point something is annoying you, please let us know!&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/></entry><entry><title>Cheméo November Updates</title><link href="https://www.ceondo.com/ecte/2022/11/november-2022-news-chemeo/" rel="alternate"/><published>2022-11-30T20:17:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2022-11-30:/ecte/2022/11/november-2022-news-chemeo/</id><summary type="html">&lt;p&gt;Highlights of the last weeks&lt;/p&gt;</summary><content type="html">&lt;p&gt;Together with
Marcus we improved quite a lot the website in the past month. I must
say, we were also lucky to have some great feedback from you, end-
users. This helped and helps us a lot! Thank you!&lt;/p&gt;
&lt;p&gt;Here are the highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;again, on &lt;a href="https://www.chemeo.com/profile"&gt;your profile page&lt;/a&gt; you can 
  delete your account and we will forget everything we know about you.
  You will not receive any more news from us. We do not track you, we
  do not set any marketing cookies, etc. This is also why you do not 
  see any "cookie banner" on the website.&lt;/li&gt;
&lt;li&gt;we added more data! You have now vapor pressure data in the form
  of the Antoine and extended Antoine equations. These are coming from
  KDB and the Yaws Handbook of Vapor Pressure. You can see them if you
  scroll a bit on, for example, the &lt;a href="https://www.chemeo.com/cid/45-400-7/Octane"&gt;Octane page&lt;/a&gt;
  (We still need to provide the data in the API, Excel and PDF export)
  Many thanks to &lt;a href="https://www.tuhh.de/v8/team/group-leaders/dr-s-mueller.html"&gt;Simon Müller&lt;/a&gt;, research associate at the Technological
  University of Hamburg for providing us with some data, helping us 
  validate some other and providing a lot of feedback! If you need some
  help with equilibria of electrolyte solutions, I am sure he can help
  you.&lt;/li&gt;
&lt;li&gt;you get mixture data as Excel export.&lt;/li&gt;
&lt;li&gt;we improved a lot the navigation and look with a mobile device. The
  website is now "reactive". I do my research work on a desktop, but I 
  am old, it looks like the new generation is using the website a lot 
  with a mobile. This should make them happy.&lt;/li&gt;
&lt;li&gt;we improved the property prediction tool on a slow connection. I am 
  still not very happy with the weight of the molecular drawing tool,
  I hope to find a simpler one in the next months. 
  Many thanks to Terry Yang, researcher at The Industrial Technology 
  Research Institute in Taiwan for helping us solving this issue.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[fix]&lt;/code&gt;: some edge case in the property prediction of molecules with 
  triple bonds. The # was not correctly escaped by the backend and the
  molecule was "cut" before being sent to the calculation engine.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[fix]&lt;/code&gt;: some relationships errors in the database.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What do we have in the pipeline ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;more data, more data and more data.&lt;/li&gt;
&lt;li&gt;the ability for you to store private data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have any questions and remarks, they are welcome!
If you like Cheméo, do not hesitate to recommend it to your colleagues,
students, etc.&lt;/p&gt;
&lt;p&gt;We really want to make a website helping and respecting you, if at any
point something is annoying you, please let us know!&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/></entry><entry><title>Major Update of Cheméo</title><link href="https://www.ceondo.com/ecte/2022/10/new-release-chemeo/" rel="alternate"/><published>2022-10-11T21:17:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2022-10-11:/ecte/2022/10/new-release-chemeo/</id><summary type="html">&lt;p&gt;More data including on more than 9000 mixtures.&lt;/p&gt;</summary><content type="html">&lt;p&gt;It is a great pleasure to announce &lt;a href="https://www.chemeo.com"&gt;a major update of Cheméo&lt;/a&gt;.
The database contains now &lt;strong&gt;mixture data for 9016 binary and ternary mixtures&lt;/strong&gt;.
Pure compound data has been increased to 102319 compounds/molecules.&lt;/p&gt;
&lt;p&gt;This upgrade would have not been possible without the fantastic work of the &lt;a href="https://trc.nist.gov/ThermoML/"&gt;ThermoML Archive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you &lt;a href="https://www.chemeo.com/auth/register"&gt;register an account&lt;/a&gt;, you can get access to an API to query the database or simply download the data as Excel files.&lt;/p&gt;
&lt;p&gt;We spent a lot of time to optimize the website, this means that normally, within Europe, every page should load within 200ms (feeling instantaneous).
If you are on another side of the planet, the distance to the server is the limiting factor.&lt;/p&gt;
&lt;p&gt;Your feedback is welcome!&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/></entry><entry><title>Céondo and DOME 4.0 for Chemical Properties</title><link href="https://www.ceondo.com/ecte/2022/08/dome-40-collaboration/" rel="alternate"/><published>2022-08-10T09:02:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2022-08-10:/ecte/2022/08/dome-40-collaboration/</id><summary type="html">&lt;p&gt;Cheméo was selected in the development of the DOME 4.0 platform.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This is a pleasure to announce that &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt; is now used by the &lt;a href="https://dome40.eu/"&gt;DOME 4.0&lt;/a&gt; platform.
The inclusion of &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt; as data provider confirms the quality of our work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DOME 4.0&lt;/strong&gt; have released a nice video of the &lt;a href="https://dome40.eu/dome-40-1st-platform-demonstration"&gt;DOME 4.0 platform in action&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Digital Open Marketplace Ecosystem (DOME) 4.0 offers an industrial data marketplace ecosystem based on Open Science and Open Innovation principles to enable sharing of business-to-business (B2B) data and creation of new or enhanced products, processes and services.&lt;/p&gt;
&lt;p&gt;The multi-sided ecosystem DOME 4.0 will be open to all providers as well as users of data and aims to facilitate maximum knowledge extraction with the help of ontology-based semantic data interoperability and modern data processing technologies.&lt;/p&gt;
&lt;p&gt;If you think that your chemical property workflow can be improved, do not hesitate to contact us, we are specialized in creating and deploying chemical property databases and analysis tools.&lt;/p&gt;</content><category term="misc"/><category term="Science"/><category term="Cheméo"/></entry><entry><title>VMware Slow with Ubuntu</title><link href="https://www.ceondo.com/ecte/2022/01/vmware-slow/" rel="alternate"/><published>2022-01-30T13:42:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2022-01-30:/ecte/2022/01/vmware-slow/</id><summary type="html">&lt;p&gt;Improving the performance of VMWare WorkStation on an Ubuntu host.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For each customer requiring some work to be done on a Windows system, I am running a virtual machine.
This ensures that I am not &lt;em&gt;leaking&lt;/em&gt; information between my customers and allows me to have just the right software stack installed for each of them.&lt;/p&gt;
&lt;p&gt;Last year, I upgraded from Ubuntu 18.04 to 20.04. 
I am very conservative in my base operating system, this is my &lt;em&gt;work horse&lt;/em&gt;, I cannot allow myself to lose data or work with a broken system.
This is why I take my time before I upgrade.&lt;/p&gt;
&lt;p&gt;At the end, the upgrade was a good thing, except for one thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Even if I upgraded VMWare Workstation from 15 to 16, it was slow like hell&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To solve this issue, I had to try so many things that I cannot be sure which one &lt;em&gt;really&lt;/em&gt; helped or if this is a combination of all of them which at the end restored correct performance for the system.&lt;/p&gt;
&lt;h2&gt;3D Acceleration&lt;/h2&gt;
&lt;p&gt;It looks like VMWare Workstation 16 has issues with the 3D acceleration (I have an Intel integrated GPU on my laptop). 
I disabled it in the options of the VM. Note that the latest &lt;em&gt;point&lt;/em&gt; release of VMware Workstation solved this issue.&lt;/p&gt;
&lt;h2&gt;Removing Mitigations&lt;/h2&gt;
&lt;p&gt;At the end, I remembered that with the newer kernels, the mitigations against all the security issues in the Intel CPU were enabled by default.
I disabled them to regain a normally efficient laptop. 
My next laptop will not run with an Intel CPU.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to disable the mitigations?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Very simple, edit as administrator the file &lt;code&gt;/etc/default/grub&lt;/code&gt;. 
Find the line with: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and replace it with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash mitigations=off&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then run in the console/terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;update-grub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And reboot your system.&lt;/p&gt;
&lt;p&gt;You now have an &lt;strong&gt;unsecure&lt;/strong&gt; system with respect to the Spectre class of attacks (and some more), but in my case a bit more usable system.&lt;/p&gt;
&lt;p&gt;This is not recommended if you run untrusted code on your system.
In my case, the less trusted code is running in a virtual machine, it means the code could use side channel attacks to gain knowledge of the main host software, but this is acceptable for my workload.&lt;/p&gt;
&lt;h2&gt;Switching to Wayland&lt;/h2&gt;
&lt;p&gt;The last action was to start Gnome not with xorg but with Wayland.
Do not ask me to explain the details between Wayland and xorg, but using it (you select the one you want on the login screen) resulted in a generally very snappy desktop.
I wonder if &lt;em&gt;this change only&lt;/em&gt; could be the only one needed.
Once I have the time, I may experiment a bit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: After many trials, Wayland has too many disadvantages, like missing screensharing in MS Teams or special dialogs in some of my applications not showing correctly. I went back to Xorg. I am still not sure how what the best way is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latest update&lt;/strong&gt;: It looks like VMWare 16.2 has now a correct support of 3D acceleration on Intel GPU, this should solve the issues.&lt;/p&gt;
&lt;h2&gt;Asynchronous IO&lt;/h2&gt;
&lt;p&gt;As it did not really solved the issue, I started looking at the &lt;code&gt;vmware.log&lt;/code&gt; in more details. 
If found this line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2021&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;16&lt;/span&gt;&lt;span class="n"&gt;T09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;19.544&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Wa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;03&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vmx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Couldn&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;initialize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;aioKernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dlopen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;libaio&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;libaio&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cannot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;open&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;No&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;such&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I removed it by installing libaio:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libaio1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We will see if it improves the situation.&lt;/p&gt;
&lt;h2&gt;Type of Disk&lt;/h2&gt;
&lt;p&gt;The issue was still not solved. 
The last trial is to &lt;a href="https://communities.vmware.com/t5/VMware-Fusion-Discussions/Fusion-11-Switch-from-SCSI-to-NVMe-for-Win-10/td-p/1401042"&gt;change the type of disk&lt;/a&gt; from SCSI to NVMe.
For the moment, I am trying only on one VM. 
I had first to clone the full VM (not a linked clone, a full copy) and then create the custom VM with the source disk being the disk of the clone.
It does not create again another disk for the conversion, so you end up with 3 copies of the data, only two.&lt;/p&gt;
&lt;h2&gt;Kernel Memory Management&lt;/h2&gt;
&lt;p&gt;It looks like I was able to find something effectively improving the situation, by adding these two lines to my &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;vm.compaction_proactiveness=0
vm.swappiness = 5 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For reference, the kernel is a &lt;code&gt;5.13&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;uname&lt;span class="w"&gt; &lt;/span&gt;-a
Linux&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.13.0-28-generic
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="misc"/><category term="Sysadmin"/></entry><entry><title>Welcome Marcus!</title><link href="https://www.ceondo.com/ecte/2021/11/welcome-marcus/" rel="alternate"/><published>2021-11-29T21:29:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2021-11-29:/ecte/2021/11/welcome-marcus/</id><summary type="html">&lt;p&gt;Marcus joined and this is really nice.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since 2007, Céondo has been a one man show.&lt;/p&gt;
&lt;p&gt;I have been lucky to have only very nice customers, all great engineers and passionate about their work.
They allowed and allow me to not only provide them great services but also helped me to grow and improve.
I would not be here without them.&lt;/p&gt;
&lt;p&gt;And thanks to their repeated trust in my work, Céondo is growing from a one man show, to a tiny team of two.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Since this November, I am really thrilled to work together with Marcus&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Marcus has a Master’s degree in Chemical Engineering. 
He is passionate about processing engineering, numerical methods, software design and software development, having particular interest in developing well-thought and maintainable software and libraries.
He is from Minas Gerais, Brazil and has a good knowledge of many programming languages, especially Python and modern C++.&lt;/p&gt;
&lt;p&gt;Marcus has done and keeps doing great work for &lt;a href="https://www.colan.org/"&gt;CO-LaN&lt;/a&gt;. 
He will of course continue but will also be the driving force behind the new release of &lt;a href="https://www.chemeo.com/"&gt;Cheméo&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Timing a Fortran Program</title><link href="https://www.ceondo.com/ecte/2020/10/timing-fortran-program-max-or-if-else/" rel="alternate"/><published>2020-10-27T10:29:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2020-10-27:/ecte/2020/10/timing-fortran-program-max-or-if-else/</id><summary type="html">&lt;p&gt;Is it better to use MAX or IF/ELSE?&lt;/p&gt;</summary><content type="html">&lt;p&gt;This is a bit of Fortran you find in many simulations:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kr"&gt;DO&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;NVALS&lt;/span&gt;
    &lt;span class="kr"&gt;IF&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RNDVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;GT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CUT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;THEN&lt;/span&gt;
        &lt;span class="n"&gt;DTMP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RNDVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;ELSE&lt;/span&gt;
        &lt;span class="n"&gt;DTMP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CUT&lt;/span&gt;
    &lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;IF&lt;/span&gt;
    &lt;span class="n"&gt;LOGVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DTMP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;DO&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Or without the saving in the temporary &lt;code&gt;DTMP&lt;/code&gt; variable. 
This does not look very nice, you have basically 5 lines to control the value before proceeding with calculations.
An alternative is to push everything into the &lt;code&gt;MAX&lt;/code&gt; intrinsic function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kr"&gt;DO&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;NVALS&lt;/span&gt;
    &lt;span class="n"&gt;LOGVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RNDVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;CUT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;DO&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This make the code cleaner, but it costs a &lt;code&gt;MAX&lt;/code&gt; call at each iteration.
The first rule in programming is that if you want to go fast, you need to do less.
As I do not want to make my code significantly slower, I decided to benchmark the two different versions.
So, I simulated the two cases with this sample code with calls to &lt;code&gt;CPU_TIME&lt;/code&gt; to track the start/stop and a long enough run to gather reproducible values:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PROGRAM&lt;/span&gt; &lt;span class="n"&gt;TEST&lt;/span&gt;

&lt;span class="kt"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PARAMETER&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;NVALS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;
&lt;span class="n"&gt;DOUBLE&lt;/span&gt; &lt;span class="n"&gt;PRECISION&lt;/span&gt; &lt;span class="n"&gt;RNDVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NVALS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;DOUBLE&lt;/span&gt; &lt;span class="n"&gt;PRECISION&lt;/span&gt; &lt;span class="n"&gt;LOGVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NVALS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;INTEGER&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;J&lt;/span&gt;
&lt;span class="kt"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PARAMETER&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;NRUNS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;DOUBLE&lt;/span&gt; &lt;span class="n"&gt;PRECISION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PARAMETER&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;CUT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="n"&gt;D0&lt;/span&gt;
&lt;span class="n"&gt;DOUBLE&lt;/span&gt; &lt;span class="n"&gt;PRECISION&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;START_TA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;STOP_TA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;START_TB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;STOP_TB&lt;/span&gt;
&lt;span class="n"&gt;DOUBLE&lt;/span&gt; &lt;span class="n"&gt;PRECISION&lt;/span&gt; &lt;span class="n"&gt;DTMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;

&lt;span class="n"&gt;CALL&lt;/span&gt; &lt;span class="n"&gt;RANDOM_NUMBER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RNDVALS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;CALL&lt;/span&gt; &lt;span class="n"&gt;CPU_TIME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;START_TA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;DO&lt;/span&gt; &lt;span class="n"&gt;J&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NRUNS&lt;/span&gt;
    &lt;span class="kr"&gt;DO&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;NVALS&lt;/span&gt;
        &lt;span class="kr"&gt;IF&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RNDVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;GT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CUT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;THEN&lt;/span&gt;
           &lt;span class="n"&gt;LOGVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RNDVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="kr"&gt;ELSE&lt;/span&gt;
           &lt;span class="n"&gt;LOGVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CUT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;IF&lt;/span&gt;
    &lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;DO&lt;/span&gt;
&lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;DO&lt;/span&gt;
&lt;span class="n"&gt;CALL&lt;/span&gt; &lt;span class="n"&gt;CPU_TIME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;STOP_TA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;CALL&lt;/span&gt; &lt;span class="n"&gt;CPU_TIME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;START_TB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;DO&lt;/span&gt; &lt;span class="n"&gt;J&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NRUNS&lt;/span&gt;
    &lt;span class="kr"&gt;DO&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;NVALS&lt;/span&gt;
        &lt;span class="n"&gt;LOGVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RNDVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;CUT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;DO&lt;/span&gt;
&lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;DO&lt;/span&gt;
&lt;span class="n"&gt;CALL&lt;/span&gt; &lt;span class="n"&gt;CPU_TIME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;STOP_TB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;WRITE&lt;/span&gt;&lt;span class="cm"&gt;(*,*)&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;....&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOGVALS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;143&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;...&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;STOP_TA&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;START_TA&lt;/span&gt;
&lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;STOP_TB&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;START_TB&lt;/span&gt;
&lt;span class="n"&gt;WRITE&lt;/span&gt;&lt;span class="cm"&gt;(*,*)&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;IF ELSE&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;
&lt;span class="n"&gt;WRITE&lt;/span&gt;&lt;span class="cm"&gt;(*,*)&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;MAX    &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;
&lt;span class="n"&gt;WRITE&lt;/span&gt;&lt;span class="cm"&gt;(*,*)&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;DIFF % &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="n"&gt;D0&lt;/span&gt;

&lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="n"&gt;PROGRAM&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I compiled this test program with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;gfortran&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;Ofast&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;funroll&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;loops&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;test&lt;/span&gt;.&lt;span class="k"&gt;for&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I did some runs with the &lt;code&gt;IF/ELSE&lt;/code&gt; first and with the &lt;code&gt;MAX&lt;/code&gt; first and basically, the results are the same.
But a significant difference is coming from the &lt;code&gt;CUT&lt;/code&gt; parameter.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CUT&lt;/code&gt; is at &lt;code&gt;0.5D0&lt;/code&gt;, the &lt;code&gt;IF/ELSE&lt;/code&gt; approach is &lt;strong&gt;40% faster&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CUT&lt;/code&gt; is at &lt;code&gt;0.001D0&lt;/code&gt;, the &lt;code&gt;MAX&lt;/code&gt; approach is &lt;strong&gt;2% faster&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yes, the cut is the performance control. 
This is most likely because of the branch prediction.
&lt;code&gt;MAX&lt;/code&gt; is a function call and it costs most likely more to recover after a wrong prediction.
Because the array if just full of random values between 0 and 1, in 50% of the cases, the prediction is false if the cut is at 0.5.
If the cut is lower, that is the &lt;code&gt;MAX&lt;/code&gt; is nearly always returning the &lt;code&gt;MAX&lt;/code&gt; of one of the two values and always the same, it is faster.&lt;/p&gt;
&lt;p&gt;Because in my thermodynamic code, the control on the value is the exceptional case, that is, we normally never trigger the &lt;code&gt;CUT&lt;/code&gt;, it means that the branch prediction will be nearly always good and the &lt;code&gt;MAX&lt;/code&gt; approach is not only as fast as the &lt;code&gt;IF/ELSE&lt;/code&gt; case but nicer to read.&lt;/p&gt;
&lt;p&gt;I was expecting the &lt;code&gt;MAX&lt;/code&gt; call to always be slower.&lt;/p&gt;</content><category term="misc"/><category term="Fortran"/><category term="Programming"/><category term="Performance"/></entry><entry><title>Complex Flash Calculations</title><link href="https://www.ceondo.com/ecte/2020/08/complex-flash-calculations/" rel="alternate"/><published>2020-08-21T10:29:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2020-08-21:/ecte/2020/08/complex-flash-calculations/</id><summary type="html">&lt;p&gt;Beautifully hard 4 phase equilibrium&lt;/p&gt;</summary><content type="html">&lt;p&gt;In this simulation, we took special care not to harm any chemical compounds.
But, to protect their identities, we replaced their names. 
Ok, practically, &lt;code&gt;COMP1&lt;/code&gt; to &lt;code&gt;COMP13&lt;/code&gt; are the usual suspect from Methane to Nonane with some gases like maybe &lt;code&gt;CO2&lt;/code&gt; or others.
The &lt;code&gt;PETRO_1&lt;/code&gt; to &lt;code&gt;PETRO_11&lt;/code&gt; are petro cuts. &lt;code&gt;H20&lt;/code&gt; is left because it is really obvious. 
If you see &lt;code&gt;-&lt;/code&gt; as fraction for a phase, this is because the fraction is lower than 1.0E-35. 
The flash can find theoritical fractions way below that. 
This not that important for a standard flash, if your fraction is 1.0E-15 or 1.0E-45, you do not really care, but this is important when you are looking at phase boundaries.&lt;/p&gt;
&lt;p&gt;Anyway, this is a beautiful flash problem. 
If you look at the two liquid phases, they are nearly identical.
I am really proud that my flash code is able to solve such a hard problem and not lose the second liquid.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-------------------------------------------------------------------------- 
               P(Pa)  31455470.00      P(bar)      314.55
                T(K)       299.82      T(cel)       26.67
               MODEL         1         1         1         1 
                   Z  1.374942  1.262459  0.969510  0.300845 
               STATE   LIQUID    LIQUID    VAPOR     LIQUID  
              NATURE  HYDROCAR  HYDROCAR  HYDROCAR  AQUEOUS  
                BETA  0.017572  0.007757  0.469552  0.505119  FEED
-------------------------------------------------------------------------- 
PETRO_1a              0.088650  0.076813  0.020270     -      0.011672 
PETRO_2               0.002647  0.002358  0.000830  1.92E-35  0.000455 
PETRO_3               0.003136  0.002713  0.000731     -      0.000420 
PETRO_4               0.002137  0.001806  0.000393     -      0.000236 
PETRO_6               0.003024  0.002497  0.000441     -      0.000280 
PETRO_7               0.003148  0.002452  0.000270     -      0.000201 
PETRO_8               0.003845  0.002763  0.000164     -      0.000166 
PETRO_9               0.004654  0.002991  0.000074     -      0.000140 
PETRO_10              0.004411  0.002434  0.000018     -      0.000105 
PETRO_11              0.003687  0.001648  2.38E-06     -      0.000079 
COMP1                 0.002344  0.002528  0.003821  5.63E-09  0.001855 
COMP2                 0.004319  0.004378  0.004518  1.06E-06  0.002232 
COMP3                 0.594647  0.621946  0.761958  6.10E-07  0.373053 
COMP4                 0.064187  0.065363  0.065147  1.48E-10  0.032225 
COMP5                 0.057369  0.057435  0.049935  2.08E-13  0.024901 
COMP6                 0.033973  0.033108  0.024641  1.44E-16  0.012424 
COMP7                 0.013206  0.012940  0.009982  4.84E-17  0.005019 
COMP8                 0.010395  0.010115  0.007215  9.29E-20  0.003649 
COMP9                 0.015588  0.014942  0.009813  6.80E-20  0.004997 
COMP10                0.015740  0.014890  0.008625  2.60E-23  0.004442 
COMP11                0.026786  0.025126  0.013396  1.24E-26  0.006956 
COMP12                0.025084  0.023153  0.010866  1.95E-30  0.005723 
COMP13                0.016487  0.015099  0.006511  1.99E-34  0.003464 
H2O                   0.000537  0.000502  0.000377  0.999998  0.505309 
--------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As a small reminder of the flash algorithm, you basically solve the flash at a fixed number of phases starting from a good initialization and using the stability analysis, you check if you need to introduce a new phase or not.
The introduction of a new phase is done if we find a phase which introduced in a very small amount will reduce the Gibbs energy of the system.
Here we introduce not only a phase which reduces by a very small amount the Gibbs energy of the system (G/RT = 1x10^-18 where normally we are in the order of 1x10^-4 to 1) but which is also really close to an existing phase. 
Because it is really close to an existing phase, it is very easy for the solution to converge to the trivial solution of the existing phase.
And what you cannot see, is that after one of the stability calls, the convergence needs to overcome a local minima barrier to reach the good minimum and convergence.&lt;/p&gt;
&lt;p&gt;So, today I am happy. 
This is the kind of work I am really proud to do for my customers.&lt;/p&gt;</content><category term="misc"/><category term="Simulation"/><category term="Oil and Gas"/></entry><entry><title>Invalid Pointer in Fortran</title><link href="https://www.ceondo.com/ecte/2020/08/fortran-free-invalid-pointer/" rel="alternate"/><published>2020-08-14T16:29:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2020-08-14:/ecte/2020/08/fortran-free-invalid-pointer/</id><summary type="html">&lt;p&gt;Check your indices when you write on allocatable arrays&lt;/p&gt;</summary><content type="html">&lt;p&gt;First, I really enjoy working with Fortran as a language. 
The relative simplicity and close to the metal of this language makes it very easy to write insanely efficient code.
Fortran is old but also very modern thanks to regular updates of the standard and its very good support by Intel and GCC.
One beautiful thing is that you can keep coding like it was in the 90's, very performance oriented and use just a bit of the new features to manage more easily large amount of data. 
That is, you can create user defined data types to store stuff:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kr"&gt;TYPE&lt;/span&gt; &lt;span class="n"&gt;MySmallStuff&lt;/span&gt;
    &lt;span class="kt"&gt;INTEGER&lt;/span&gt;          &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;   &lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;ultimate&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
    &lt;span class="n"&gt;DOUBLE&lt;/span&gt; &lt;span class="n"&gt;PRECISION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ALLOCATABLE&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(:)&lt;/span&gt;      &lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Some&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; 
&lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;TYPE&lt;/span&gt;

&lt;span class="kr"&gt;TYPE&lt;/span&gt; &lt;span class="n"&gt;MyBigStuff&lt;/span&gt;
    &lt;span class="kt"&gt;INTEGER&lt;/span&gt;          &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;nsmalls&lt;/span&gt;
    &lt;span class="kr"&gt;TYPE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MySmallStuff&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;ALLOCATABLE&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;smalls&lt;/span&gt;&lt;span class="p"&gt;(:)&lt;/span&gt;   
&lt;span class="kr"&gt;END&lt;/span&gt; &lt;span class="kr"&gt;TYPE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What you have here, one base derived data type, &lt;code&gt;MyBigStuff&lt;/code&gt; storing a series of &lt;code&gt;MySmallStuff&lt;/code&gt;. 
In my case, it was the configuration of an optimizer storing a series of parameters to be optimized.
The &lt;code&gt;values&lt;/code&gt; for each parameter was the value at each iteration of each parameter.&lt;/p&gt;
&lt;p&gt;When using my code, I had sometimes the following error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;invalid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pointer&lt;/span&gt;

&lt;span class="n"&gt;Program&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;signal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SIGABRT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;abort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Backtrace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="c1"&gt;#0  0x7fa42a9ee2ed in ???&lt;/span&gt;
&lt;span class="c1"&gt;#1  0x7fa42a9ed503 in ???&lt;/span&gt;
&lt;span class="c1"&gt;#2  0x7fa42a282fcf in ???&lt;/span&gt;
&lt;span class="c1"&gt;#3  0x7fa42a282f47 in ???&lt;/span&gt;
&lt;span class="c1"&gt;#4  0x7fa42a2848b0 in ???&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What was interesting is that the error was when trying to deallocate (automatically or not) on of the elements in &lt;code&gt;smalls&lt;/code&gt;.
The reason was not at all what I expected: I started to write at indice &lt;code&gt;0&lt;/code&gt; in &lt;code&gt;values&lt;/code&gt; of &lt;code&gt;MySmallStuff&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After writing the historical &lt;code&gt;values&lt;/code&gt;, I was able to print them correctly, iterating on &lt;code&gt;values(1:nvalues)&lt;/code&gt; but freeing 
the same allocatable I was able to read values from was crashing with the invalid pointer. 
This was because I allocated &lt;code&gt;MyBigStuff%smalls(2)&lt;/code&gt;, then for each &lt;code&gt;smalls&lt;/code&gt;, I allocated the &lt;code&gt;values&lt;/code&gt;.
When writing for one of them at &lt;code&gt;values(0)&lt;/code&gt;, I destroyed part of the pointer information. 
This is what triggered the error.
Normally I run my code with boundary checks on the arrays, but not in this particular case. 
I suppose the boundary checks would have caught the off-by-one error...&lt;/p&gt;
&lt;p&gt;I was taken off guard because normally, errors in Fortran are pretty obvious, this one took me nearly one hour to pinpoint.&lt;/p&gt;</content><category term="misc"/><category term="Programming"/><category term="Fortran"/></entry><entry><title>Middle of the Year 2020</title><link href="https://www.ceondo.com/ecte/2020/07/middle-year-2020/" rel="alternate"/><published>2020-07-02T11:01:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2020-07-02:/ecte/2020/07/middle-year-2020/</id><summary type="html">&lt;p&gt;A strange beginning, but not that bad&lt;/p&gt;</summary><content type="html">&lt;p&gt;After a bit more than three months under this strange situation, I can only say that I am lucky.
The business is still running smoothly. 
I expect the turnover to be 10 to 15% below what was planned, but not because of lack of work.
This will be mostly the effects of the thee months with home schooling and work from home. 
In such conditions, it is harder to work as well as usual, this reduced the number of hours I could achieved for my customers.
The school is supposed to start again &lt;em&gt;normally&lt;/em&gt; in August, but I prefer to plan with again, another 5 months with reduced productivity.
We will see.&lt;/p&gt;
&lt;p&gt;Now, during my usual &lt;em&gt;look for interesting stuff in modelling&lt;/em&gt;, I found that ABB is using &lt;a href="https://openmodelica.org/"&gt;Modelica&lt;/a&gt; to
perform the &lt;a href="https://www.openmodelica.org/openmodelicaworld/related-products"&gt;optimisation of distributed energy production&lt;/a&gt;. 
This is really interesting, they can control biogas based power production, including wind and solar energy. 
The grid is getting &lt;em&gt;integrated&lt;/em&gt; to be more efficient. 
I wonder if they are going to coordinate with providers to link in the system all the home based solar production.
Now that batteries are really cheap, it would be interesting to allow a &lt;em&gt;quick release/store&lt;/em&gt; of about 1% of the capacity of the &lt;em&gt;at home&lt;/em&gt; deployed batteries to support the stability of the grid.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Distributed Systems"/><category term="Modelling"/></entry><entry><title>Corona Virus, Home Office</title><link href="https://www.ceondo.com/ecte/2020/03/corona-virus-no-travels/" rel="alternate"/><published>2020-03-14T11:05:00+01:00</published><updated>2020-06-12T18:40:00+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2020-03-14:/ecte/2020/03/corona-virus-no-travels/</id><summary type="html">&lt;p&gt;No travels until the 20. of April&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nothing particular with respect to the global situation.
Effective today, I am not going to travel anywhere until middle of April.
Next week will most likely see a drop in my efficiency which I expect to recover rapidly. 
This is because all the schools, all the external group activities are stopped. 
It is recommended for all the workers of &lt;a href="https://www.bp.com/de_de/germany/home/wo-wir-sind/raffinerie-gelsenkirchen.html"&gt;BP refinery offices&lt;/a&gt; to work from home.&lt;/p&gt;
&lt;p&gt;We will have to manage work and home schooling for the complete family for 5 weeks.
At the european scale, this is turning into an interesting social experiment. 
I suppose we are going to have a lot of papers in psychology journals 6 months down the line...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2020.03.21&lt;/strong&gt;: After a week, the family ist still together and it went better
than expected. Only two days (Monday and Friday) were below my work average. I am 
confident that with a bit more organisation and spreading my work also over the week-ends 
I will be able to keep the ball rolling.&lt;/p&gt;
&lt;p&gt;Meanwhile, I would like to thank you, my customers, for the very nice words and your support 
during these difficult times. This pandemic is going to &lt;a href="https://www.ecfr.eu/article/commentary_seven_early_lessons_from_the_coronavirus"&gt;reshape our societies&lt;/a&gt;, 
can we take the opportunity to rethink our economy, the place of the environment, the 
single point of failure of our global supply chain with China and simply our relationship 
with our neighbours, the way we live together within a city? These are going to be
interesting times.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2020.06.12&lt;/strong&gt;: Last week, I was able to have my first business trip again. 
It was in France, my usual hotel was not yet open, the restaurants are running mostly
on reduced offers, but the life is slowly going back to normality. I expect flying to
be a bit constrained for some months with less flights and more video conferences. For
the daily life, we will see the statistics after the reopening of the primary schools 
on Monday. The primary schools will be fully open for 2 weeks before the summer vacations, 
this impulse in the system will provide us some nice statistics down the line and if
this creates real issues, the 6 week long summer vacations closure will damp the effects. &lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Different MKL Version for a DLL in Fortran</title><link href="https://www.ceondo.com/ecte/2020/02/proii-mkl-fortran/" rel="alternate"/><published>2020-02-20T10:05:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2020-02-20:/ecte/2020/02/proii-mkl-fortran/</id><summary type="html">&lt;p&gt;How to get a specific Maths Kernel Library version for your plugin DLL&lt;/p&gt;</summary><content type="html">&lt;p&gt;A part of my job is programming special unit operations in &lt;a href="https://sw.aveva.com/engineer-procure-construct/process-engineering-and-simulation/pro-ii-process-engineering"&gt;PRO/II&lt;/a&gt;.
These unit operations are delivered as a DLL (&lt;code&gt;UASLB.dll&lt;/code&gt;) that is put in the folder of the PRO/II executables.
The interface with the PRO/II internals is very simple, it is simple Fortran with a series of functions, subroutines and old school &lt;code&gt;COMMON&lt;/code&gt; blocks.
The recommended compiler to create the DLL is the well known &lt;a href="https://software.intel.com/en-us/fortran-compilers"&gt;Intel Fortran&lt;/a&gt; compiler.
Under Windows, from there, everything is simple, you have some sample code that you can modify, you compile, put the DLL where it should be and launch PRO/II to test.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;But...&lt;/em&gt; if you want to use the &lt;a href="https://software.intel.com/en-us/mkl"&gt;Maths Kernel Library&lt;/a&gt;, then you have a problem. 
Why? Because &lt;a href="https://sw.aveva.com/engineer-procure-construct/process-engineering-and-simulation/pro-ii-process-engineering"&gt;PRO/II&lt;/a&gt; is itself using the MKL and as such, you need to build and deliver your code with the same version of the MKL.
This is pretty annoying because you are suddenly locked and cannot use another version of the MKL and sometimes you cannot get the exact same version, for example, depending on the &lt;em&gt;state&lt;/em&gt; of your Intel Fortran license.&lt;/p&gt;
&lt;p&gt;The solution is &lt;a href="https://stackoverflow.com/questions/24867020/can-multiple-versions-of-mkl-be-used-in-the-same-process"&gt;partially given in this question on StackOverflow&lt;/a&gt;.
This is the method for some C++ code, but we can achieve the same in Fortran.&lt;/p&gt;
&lt;p&gt;Create a text file, named &lt;code&gt;Intel.MKL.manifest&lt;/code&gt; (without the &lt;code&gt;.txt&lt;/code&gt; extension) with the following content:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;assembly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;manifestVersion=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;assemblyIdentity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Intel.MKL&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;processorArchitecture=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;amd64&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2019.0.5.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;win32&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mkl_core.dll&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mkl_sequential.dll&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/assembly&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The version string must match the version string of the &lt;code&gt;mkl_core.dll&lt;/code&gt; you find in your redistribution folder of the MKL. 
For my installation, the folder is: &lt;code&gt;C://Program Files (x86)/IntelSWTools/compilers_and_libraries_2019/windows/redist/intel64_win/mkl&lt;/code&gt;.
Please note that in my case, I am running everything as 64-Bit versions, but &lt;a href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.build.tasks.deployment.manifestutilities.assemblyidentity.processorarchitecture"&gt;you can have &lt;code&gt;x86&lt;/code&gt; instead of &lt;code&gt;amd64&lt;/code&gt;&lt;/a&gt;. In fact, the &lt;code&gt;processorArchitecture&lt;/code&gt; key is optional.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Given the &lt;code&gt;bin&lt;/code&gt; folder where your DLL, here &lt;code&gt;UASLB.dll&lt;/code&gt;, is, create the subfolder &lt;code&gt;Intel.MKL&lt;/code&gt; in it.&lt;/li&gt;
&lt;li&gt;In the &lt;code&gt;Intel.MKL&lt;/code&gt; folder, copy the content of the redistribution of the MKL in it. That is, you should have &lt;code&gt;mkl_core.dll&lt;/code&gt;, &lt;code&gt;mkl_sequential.dll&lt;/code&gt;, etc. in the &lt;code&gt;bin/Intel.MKL&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Put, like said in the &lt;a href="https://stackoverflow.com/questions/24867020/can-multiple-versions-of-mkl-be-used-in-the-same-process"&gt;SO question&lt;/a&gt;, the &lt;code&gt;Intel.MKL.manifest&lt;/code&gt; file &lt;strong&gt;inside&lt;/strong&gt; the &lt;code&gt;Intel.MKL&lt;/code&gt; folder.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The rest of the work has to be done at the creation of the DLL by embedding a manifest inside the DLL referencing the &lt;code&gt;Intel.MKL&lt;/code&gt; &lt;em&gt;assembly&lt;/em&gt; with its right version.
Fortran is not C++, so the best way to reference our special assembly is to do it in the options of the project.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enable the generation of the manifest.&lt;/li&gt;
&lt;li&gt;Add in the command line of the &lt;em&gt;linker&lt;/em&gt; the following argument: &lt;code&gt;/manifestDependency:"name='Intel.MKL' processorArchitecture='amd64' version='2019.0.5.1' type='win32'"&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;During compilation, it will create in the output folder an &lt;code&gt;.intermediate.manifest&lt;/code&gt; file which should have the following content:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#39;1.0&amp;#39; encoding=&amp;#39;UTF-8&amp;#39; standalone=&amp;#39;yes&amp;#39;?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;assembly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;urn:schemas-microsoft-com:asm.v1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;manifestVersion=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;trustInfo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;urn:schemas-microsoft-com:asm.v3&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;security&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;requestedPrivileges&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;requestedExecutionLevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;level=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;asInvoker&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;uiAccess=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;false&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/requestedPrivileges&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/security&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/trustInfo&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;dependentAssembly&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;assemblyIdentity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Intel.MKL&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;processorArchitecture=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;amd64&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;2019.0.5.1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;win32&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/dependentAssembly&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/assembly&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is what is then embedded in the DLL. The result is that the DLL will correctly load the your MKL version. You can see it with a dependency walker. Please note that all these &lt;code&gt;manifest&lt;/code&gt; stuff is the Windows way of loading the right library and this is working better than expected.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Correct Loading of a Specific MKL version" src="/images/2020/specific-intel-mkl-version-for-dll.png"&gt;&lt;/p&gt;
&lt;p&gt;Do not hesitate to contact me if you have Fortran questions.&lt;/p&gt;</content><category term="misc"/><category term="Programming"/><category term="PRO/II"/><category term="Fortran"/><category term="MKL"/></entry><entry><title>Visual Studio Code for Fortran</title><link href="https://www.ceondo.com/ecte/2018/09/vscode-visual-studio-code-fortran/" rel="alternate"/><published>2018-09-19T16:29:00+02:00</published><updated>2018-09-22T14:10:00+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2018-09-19:/ecte/2018/09/vscode-visual-studio-code-fortran/</id><summary type="html">&lt;p&gt;Beautiful cross-platform code editor.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Sometimes one needs to say things one never imagined one would say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Thank you Microsoft&lt;/strong&gt; for the code editor I am using under &lt;strong&gt;Linux&lt;/strong&gt;!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, all these words in the same sentence! Microsoft in the past years started and released
a wonderful code editor, the name is &lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt;.
The naming was a bit annoying at first because we have &lt;strong&gt;Visual Studio&lt;/strong&gt; which is a totally
different software, but I suppose that on the long run they want the name &lt;strong&gt;Visual Studio&lt;/strong&gt;
to be associated with everything they do for the developers more than a specific software.&lt;/p&gt;
&lt;p&gt;But what brought me to use some Microsoft software under Linux? Simple &lt;strong&gt;productivity&lt;/strong&gt;. 
My goal is to always be extremely productive and I am always, on a regular basis, evaluating
the different tools to assess if they can provide after the associated learning curve a net
benefit for me and my customers. I am paid by the hour in my work and I try to have such
highly efficient hours that my customers never complain about the bill (never had one
complain in 10 years, keep crossing my fingers).&lt;/p&gt;
&lt;p&gt;So, after a bit of wondering, I decided to test &lt;strong&gt;Visual Studio Code&lt;/strong&gt; even so it has
at first sight some issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It consumes a lot of resources, from 30MB for my Emacs session to more than 400MB for the
  same code.&lt;/li&gt;
&lt;li&gt;It is written in JavaScript and the graphical interface is basically done in HTML/CSS
  which is not the kind of stack one expect to be efficient for a text editor. &lt;/li&gt;
&lt;li&gt;It is written by Microsoft, which is not known to support Linux user very well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But productivity is more important than 500MB RAM on my system which anyway is equipped with
16GB, Microsoft is supposed to have solve the latency issue of the rendering of the text
editor to end-up with something nice and it is always better not to be dogmatic and look
what the other side is doing (and Visual Studio has long been a wonderful piece of software).&lt;/p&gt;
&lt;p&gt;All things said, &lt;strong&gt;I decided to try it&lt;/strong&gt; and after a bit of adjustment here is the view of
the beast when I am working on some Fortran code:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Visual Studio Code (vscode) editing Fortran" src="/images/2018/2018.09.19-vscode-fortran.png"&gt;&lt;/p&gt;
&lt;p&gt;You have basically everything you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nice syntax highlighting with the &lt;a href="https://marketplace.visualstudio.com/items?itemName=Gimly81.fortran"&gt;fortran&lt;/a&gt; extension;&lt;/li&gt;
&lt;li&gt;intellisense with the &lt;a href="https://marketplace.visualstudio.com/items?itemName=hansec.fortran-ls"&gt;fortran language server&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;git integration;&lt;/li&gt;
&lt;li&gt;debugger integration;&lt;/li&gt;
&lt;li&gt;and much more because you can easily have many different languages in the same workspace.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Ease of Extension&lt;/h2&gt;
&lt;p&gt;Microsoft is really showing its expertise at developing developer software with it and
also their fresh look at what others have been doing for a long time, that is, the
concept of extensions pioneered by &lt;a href="https://www.mozilla.com"&gt;Mozilla&lt;/a&gt; for &lt;em&gt;Firefox&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is because &lt;strong&gt;all the power&lt;/strong&gt; of &lt;em&gt;Visual Studio Code&lt;/em&gt; is coming from a &lt;strong&gt;very
well though system of extensions&lt;/strong&gt;. With a couple of key strokes, you can install
and use a &lt;a href="https://marketplace.visualstudio.com/vscode"&gt;large number of extensions&lt;/a&gt;. You an extension for everything 
you may need. &lt;/p&gt;
&lt;p&gt;They also pushed ahead the &lt;a href="https://github.com/Microsoft/language-server-protocol"&gt;Language Server Protocol&lt;/a&gt;
(LSP) to integrate all the IntelliSense functionalities of any kind of software into the 
editor. The LSP is an open standard and it is relatively easy to develop a server. 
Because the servers providing the language support are independent of the editor, they
can be used by any software (yes, Emacs/Vim too).&lt;/p&gt;
&lt;p&gt;For example, I was able to quickly improve the one for Fortran
&lt;a href="https://github.com/hansec/fortran-language-server/issues/49"&gt;here&lt;/a&gt; 
and &lt;a href="https://github.com/hansec/fortran-language-server/issues/48"&gt;there&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;The extension for the syntax highlighting is always pretty simple and I was able
to &lt;a href="https://github.com/Gimly/vscode-fortran/issues/10"&gt;fix the support of comments in fixed format&lt;/a&gt; mode.&lt;/p&gt;
&lt;p&gt;All that within a week of using the software...&lt;/p&gt;
&lt;h2&gt;But Still Place for Improvements&lt;/h2&gt;
&lt;h3&gt;Navigation Within a File&lt;/h3&gt;
&lt;p&gt;I am still missing some of the great navigation control of Emacs as VS code is using
a lot the arrow keys to navigate. I do prefer the &lt;code&gt;Ctrl + key&lt;/code&gt; approach from Emacs
and I have already added some custom keybindings to help me. This is still a work in
progress.&lt;/p&gt;
&lt;p&gt;The reason why prefer the navigation using &lt;code&gt;Ctrl + key&lt;/code&gt; is because I need to move my
hands to access the arrow keys on my &lt;a href="https://www.ceondo.com/ecte/2017/02/vmware-keyboard-mapping/"&gt;Typematrix 2030&lt;/a&gt;. 
I can already feel that I am using a bit too much the mouse because of the non 
intuitive navigation.&lt;/p&gt;
&lt;h3&gt;Fixed Format Fortran (Punchcard)&lt;/h3&gt;
&lt;p&gt;The good old fixed format Fortran is still a big part of my codebase, this is why I
need a good support. What I am missing from Emacs is the really good automatic indentation,
ease of line breaking with continuation character and automatic change of color of
the code after the column 72. I have a partial alternative with some user settings to
set a rulers at different columns and force tabs as 3 space characters:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ss"&gt;&amp;quot;[fortran]&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;editor.rulers&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="n"&gt;        6,&lt;/span&gt;
&lt;span class="n"&gt;        72,&lt;/span&gt;
&lt;span class="n"&gt;        80&lt;/span&gt;
&lt;span class="n"&gt;    &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;editor.tabSize&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;editor.insertSpaces&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;editor.detectIndentation&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="ss"&gt;&amp;quot;workbench.colorCustomizations&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;editorRuler.foreground&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;#ebebeb&amp;quot;&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The current Fortran extension working with &lt;a href="https://marketplace.visualstudio.com/items?itemName=hansec.fortran-ls"&gt;the language server&lt;/a&gt; is not
as good as the &lt;a href="https://marketplace.visualstudio.com/items?itemName=krvajalm.linter-gfortran"&gt;modern Fortran extension&lt;/a&gt;.
But the language server is a need to have all the great contextual help. So, I will
need to see if I can get the language server to be supported in this better 
extension.&lt;/p&gt;
&lt;h2&gt;Conclusion?&lt;/h2&gt;
&lt;p&gt;For the moment, my conclusion is simple: &lt;em&gt;I really like it and it is really improving my
efficiency at work&lt;/em&gt;, this is why &lt;a href="https://code.visualstudio.com/"&gt;I really recommend you to try it&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;Update&lt;/h2&gt;
&lt;p&gt;To solve the missing continuation line command, using the &lt;a href="https://marketplace.visualstudio.com/items?itemName=geddski.macros"&gt;macros&lt;/a&gt; extension, I created the following macro (defined in my &lt;code&gt;settings.json&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="s"&gt;&amp;quot;macros&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fortranContinuation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;deleteAllLeft&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;     $&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And then in my &lt;code&gt;keybindings.json&lt;/code&gt; I added:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{
    &amp;quot;key&amp;quot;: &amp;quot;ctrl+shift+j&amp;quot;,
    &amp;quot;command&amp;quot;: &amp;quot;macros.fortranContinuation&amp;quot;,
    &amp;quot;when&amp;quot;: &amp;quot;editorTextFocus &amp;amp;&amp;amp; editorLangId == &amp;#39;fortran_fixed-form&amp;#39;&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;this enables the binding only for the &lt;code&gt;fortran_fixed-form&lt;/code&gt; language. This is the
language id of the fixed format Fortran from the &lt;a href="https://marketplace.visualstudio.com/items?itemName=krvajalm.linter-gfortran"&gt;modern Fortran&lt;/a&gt; 
extension.&lt;/p&gt;
&lt;p&gt;To use the &lt;a href="https://marketplace.visualstudio.com/items?itemName=krvajalm.linter-gfortran"&gt;modern Fortran&lt;/a&gt; together with the &lt;a href="https://marketplace.visualstudio.com/items?itemName=hansec.fortran-ls"&gt;Fortran Language Server&lt;/a&gt;,
I had to patch the &lt;a href="https://github.com/hansec/vscode-fortran-ls/issues/3"&gt;LS glue extension&lt;/a&gt; and the 
&lt;a href="https://github.com/krvajal/vscode-fortran-support/pull/43#issuecomment-422933132"&gt;modern Fortran extension&lt;/a&gt;.
The two changes are basically just to ensure that the extensions are enabled at the same
time. In my &lt;code&gt;settings.json&lt;/code&gt; I changed the key &lt;code&gt;"[fortran]"&lt;/code&gt; with &lt;code&gt;"[fortran_fixed-form]"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For the navigation, the emacs key bindings extensions were not convincing. I will need
to explore a bit more the different options, especially the ability to have key bindings
enabled only within different contexts.&lt;/p&gt;
&lt;h2&gt;Update 2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Am currently trying an &lt;a href="https://marketplace.visualstudio.com/items?itemName=rkwan94.vscode-emacs-improved"&gt;improved Emacs extension&lt;/a&gt; which
  is working pretty well. We will see how it goes over the long run.&lt;/li&gt;
&lt;li&gt;I created a &lt;a href="https://github.com/ceondo/fortran-language-server"&gt;fork of the language server&lt;/a&gt; including a series of fixes, you can
  install the &lt;code&gt;master&lt;/code&gt; branch to have all the fixes already applied:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hansec/fortran-language-server/pull/50"&gt;Added parent scope related information&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hansec/fortran-language-server/pull/51"&gt;Correctly detect the visibility in fixed format case&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hansec/fortran-language-server/pull/54"&gt;Added simple workspace symbol search&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hansec/fortran-language-server/pull/55"&gt;Fixed issue #53 use only with spaces&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hansec/fortran-language-server/pull/56"&gt;Exclude files generated by Intel Fortran during compilation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hansec/fortran-language-server/pull/57"&gt;Try Windows-1252 encoding on failure to decode utf-8 at file load&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I still have to fork the corresponding VSCode extensions to nicely package the patches I made and allow integration.&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Productivity"/><category term="Organisation"/><category term="Infrastructure"/><category term="Programming"/><category term="Fortran"/></entry><entry><title>10 Years of Home Office, Lessons Learned</title><link href="https://www.ceondo.com/ecte/2018/02/10-years-home-office-learned-lessons/" rel="alternate"/><published>2018-02-15T15:29:00+01:00</published><updated>2018-03-19T15:26:00+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2018-02-15:/ecte/2018/02/10-years-home-office-learned-lessons/</id><summary type="html">&lt;p&gt;Simplicity and sustainability go a long way.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since 2005, I am mostly working from my home office, both as an
employee for about 2 years and as a consultant for 10 years.  The tips
are mostly from my work as a consultant but some of them are also very
useful as an employee.&lt;/p&gt;
&lt;h2&gt;Core Principles&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Simplicity and sustainability&lt;/strong&gt; are the principles at the core and
everything flow out of them.&lt;/p&gt;
&lt;h3&gt;Sustainable Work&lt;/h3&gt;
&lt;p&gt;Of course, your work must be sustainable from a business point of
view, but here I mean from a physical point of view.  It seems that in
the US, it is common practice to &lt;strong&gt;work 70h a week&lt;/strong&gt; and take 3 weeks of
vacations a year but reading your work emails 365 days a year.  If you
want to be a long term consultant, this &lt;strong&gt;is a very good recipe to be a
bad consultant&lt;/strong&gt;.  Above 40h a week of normal work, the quality of each
extra hour decreases rapidly to the point of doing negative work.
So, sleep well, do not work long hours and exercise enough.&lt;/p&gt;
&lt;p&gt;Bad sleep (in my case, I need 7 to 8h) results in bad work.
The worse is that in most of the cases, you feel a bit tired but you
are unable to see how your productivity is decreasing.  For me, I have
a simple way to know if I am tired without knowing it or not: do some
fluid phase equilibria and thermodynamics work in Fortran.  This is so
demanding that if tired I simply cannot do it correctly.  If you ask
me to code within the .NET or Python ecosystem, the editor and the
tools are all there to help you and the lack of "clear" mind is less
obvious.  &lt;strong&gt;Note that this is a vicious circle, because as soon as
you are tired you are losing your judgement to evaluate how much your
productivity is decreasing&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For the exercise I am guilty of not doing enough of it. About 10
minutes a day of push-ups etc. but I should really have 2h of cycling
a week on top of that.&lt;/p&gt;
&lt;h3&gt;Simplicity&lt;/h3&gt;
&lt;p&gt;Keep things simple.  Simplicity is hard to achieve because you can
only reach it when you know what you need and what is optional.  You
get to know that with your experience and experience is a nice word
used by older people to say: "I already made all the mistakes before
but you also need to go through to understand the stuff."&lt;/p&gt;
&lt;p&gt;You do not have to worry about the future, the natural entropy of your
&lt;em&gt;work&lt;/em&gt; system will lead to a natural increase in the complexity of it,
this is why you do not need to make it more complex that necessary to
start with.&lt;/p&gt;
&lt;h2&gt;Practical Tips&lt;/h2&gt;
&lt;h3&gt;Time Tracking&lt;/h3&gt;
&lt;p&gt;You simply cannot do without an easy to use time tracking application.
After the years I found that the only requirements are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;offline usage&lt;/strong&gt; (you do not want to track manually the time if you do
  not have internet connectivity like in a plane or somewhere far away
  from the civilization)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;easy export of the data&lt;/strong&gt; as CSV or XML to generate custom reports,
  like the ones you will have to generate to invoice your customers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tagging of the entries&lt;/strong&gt; to associate them to a project or a
  customer, a standard tag for a customer entry is the customer name
  and &lt;em&gt;"Invoiced"&lt;/em&gt; if this is invoiced time. This allows me to report
  at the end of the months all my invoiced hours or only the one for a
  given customer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For me a very efficient simple and flexible time tracking tool is the
&lt;a href="http://projecthamster.org/"&gt;Hamster application in Gnome&lt;/a&gt; with the Gnome Applet. At the
start, I was using a simple Excel sheet. But now, I can generate my
monthly run by day, my worklog per customer, simple and
efficient (it has a &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; API).&lt;/p&gt;
&lt;p&gt;Here is for example an example of a customer page. You can see that I
provide the full log, directly out of my time tracking
application. This is simple and very efficient. The page is built from
an XML export of my hamster time tracking.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Customer page" src="https://www.ceondo.com/images/2018/customer-page.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Get Used to Work like Athlete Train and Compete&lt;/h3&gt;
&lt;p&gt;If you ask an athlete how it feels when she trained to hard the day
before, the answer is very simple: bad. An athlete tries to be at peak
conditions all the time outside of the planned recovery periods.&lt;/p&gt;
&lt;p&gt;As an excellent consultant, you want to provide your best each time
you work for a customer, it means that overdoing one day automatically
implies the need to recover afterwards. After an event, athletes take
the time to recover. After a bit of crunch time, you need to recover.&lt;/p&gt;
&lt;p&gt;Contrary to the athletes who are doing a lot of
training/competition/recovery cycles in the year, &lt;strong&gt;as a consultant you
try to smooth as much as possible your workload to reduce the number
of crunch time/recovery cycles&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is a relaxed marathon, not a sprint, so ensure that if you need
to work 200h over 10 weeks for a customer, you are effectively working
4 to 5h a day. You must not work 70h a week the last 3 weeks!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Monthly work load tracking" src="https://www.ceondo.com/images/2018/effective-planned-work-tracking.png"&gt;&lt;/p&gt;
&lt;p&gt;As you can see on an example view of a monthly load tracking, if I am
pushing my limits for a customer on a given day, I ensure to recover
immediately thereafter. Of course, the default rule is not to work
during the weekend.&lt;/p&gt;
&lt;h3&gt;Low Working Hours per Customer and per Day&lt;/h3&gt;
&lt;p&gt;The corollary of running your marathon is that you can &lt;strong&gt;keep the
number of working hours per customer per day low&lt;/strong&gt;. I try to always be
below 5h of work per customer and per day. If I focus 4 to 5h on a
given subject for the day, I can switch to another for 2 to 3h or so
and keep 7h of good invoiceable work. My efficiency is lower if I do
7h for a customer a day and 7h for the other the next day. But more
than 2 customers/type of work during the day (basically, going to
small chunks of work instead of bigger ones) affects badly my
productivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My ideal run is 2x2h in the morning and 2.5h in the afternoon, split
over two customers&lt;/strong&gt;. This is also why if setup a project for a customer
for 10 weeks of work, I always schedule it on a period of 20 weeks. On
the long run, &lt;strong&gt;this provides extremely high quality hours for my
customers&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Simple Planning&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Very simple TODO list&lt;/strong&gt;. Working from home is hard because
everything in the house can bring you out of your work. A simple todo
list to just write down what needs to be done at home if it goes
through my mind frees me to keep working. I do not need to keep in
mind that I need to do X or Y after my work. It is on the list. The
list is a simple paper list, yes a simple A4 paper on my desk. I have
two of them, one for the at home stuff I do not want to pollute my
mind with while working and one for the work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rough weekly planning&lt;/strong&gt;. This is just to know when something needs
to be done, the hard deadlines of the week, etc. Again, just a piece
of paper for it to be simple and reduce the cognitive load of making
it. Some weeks, it is nearly empty and this is good so.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Todo lists and weekly planning" src="https://www.ceondo.com/images/2018/todo-weekly-view.jpg"&gt;&lt;/p&gt;
&lt;p&gt;This simple planning extends very well for your turnover. Suppose you
want to achieve a €100k turnover per year and you charge 100€/h of
work with 42 weeks of invoiceable time per year. This means 1000h of
work spread over 210 days or 4h45 minutes of invoiced work per day.&lt;/p&gt;
&lt;p&gt;So, if every single day you work, you put first these 5h of work for
your customers, you do not have to worry, at the end of the year, you
will break even and be happy.&lt;/p&gt;
&lt;h3&gt;Some Other Tips&lt;/h3&gt;
&lt;p&gt;Other things which helped me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Be sure to develop the habit of doing every single day some great
  work for your customers.&lt;/li&gt;
&lt;li&gt;Kill distractions during the working hours like a firewall
  preventing you to access social medias, news, etc.&lt;/li&gt;
&lt;li&gt;Keep your desk clean to keep your mind clutter free.&lt;/li&gt;
&lt;li&gt;Go to zero emails in your Inbox.&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Productivity"/><category term="Organisation"/><category term="Infrastructure"/></entry><entry><title>Bonne Année 2018</title><link href="https://www.ceondo.com/ecte/2018/01/bonne-annee-2018/" rel="alternate"/><published>2018-01-10T16:05:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2018-01-10:/ecte/2018/01/bonne-annee-2018/</id><summary type="html">&lt;p&gt;Wishing you all the best for 2018.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Now that you are all back at work, this is the perfect time to wish everybody
all the best for 2018.  You can read
&lt;a href="https://www.ceondo.com/2018/"&gt;my best wishes for 2018&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Christmas Holidays</title><link href="https://www.ceondo.com/ecte/2017/12/christmas-2017/" rel="alternate"/><published>2017-12-22T14:07:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2017-12-22:/ecte/2017/12/christmas-2017/</id><summary type="html">&lt;p&gt;Enjoy a well deserved break.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Thank you for the very nice year working with many people doing
great work. I am taking a break until the first week of January.
During the first week of January I will have only reduced availability
but you should be able to reach me per mail. &lt;/p&gt;
&lt;p&gt;Please note that I really need a break, it means that only urgent
matter will be handled. I will take care of everything none urgent
when back at the office full time.&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Glyphosate and Monsanto's Roundup</title><link href="https://www.ceondo.com/ecte/2017/08/monsanto-glyphosate/" rel="alternate"/><published>2017-08-30T15:34:00+02:00</published><updated>2017-09-26T14:32:00+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2017-08-30:/ecte/2017/08/monsanto-glyphosate/</id><summary type="html">&lt;p&gt;Is one of them safe?&lt;/p&gt;</summary><content type="html">&lt;p&gt;Today, the French Ministry of Environment announced that they will &lt;a href="http://www.lemonde.fr/planete/article/2017/08/30/paris-votera-contre-le-renouvellement-de-la-licence-du-glyphosate-dans-l-union-europeenne_5178557_3244.html" title="Paris votera contre le renouvellement de la licence du glyphosate dans l’Union européenne"&gt;vote against the renewal of the market authorization of the Glyphosate&lt;/a&gt; in the EU.
The &lt;a href="https://en.wikipedia.org/wiki/Glyphosate"&gt;Glyphosate&lt;/a&gt; is a very controversial molecule because, sold under the &lt;a href="https://www.roundup.com"&gt;Roundup&lt;/a&gt; it embeds everything the ecological mouvement despises:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the RoundUp is used in combination with GMOs.&lt;/li&gt;
&lt;li&gt;the RoundUp is sold and controled by a very powerful company.&lt;/li&gt;
&lt;li&gt;the RoundUp combined with the GMOs leads to an increased used of pesticides.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, basically, &lt;strong&gt;Glyphosate&lt;/strong&gt; is now in the mind of people totally associated with RoundUp and as RoundUp is extremely negatively charged in the public opinion, it starts to be hard to have a rational thinking about this particular molecule.&lt;/p&gt;
&lt;p&gt;And you know what? It could be that &lt;strong&gt;Glyphosate is a really safe molecule while RoundUp is the most toxic mixture you can buy&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And this is the problem we have right now. That is, Monsanto is maybe
totally right when telling that Glyphosate is by itself safe. The real
problem is that you never use Glyphosate alone on your field to take
out the weeds. If you want to hard kill everything with the RoundUp, you end up with a solution containing about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0.70%&lt;/code&gt;: Glyphosate&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0.70%&lt;/code&gt;: Other chemicals&lt;/li&gt;
&lt;li&gt;&lt;code&gt;98.60%&lt;/code&gt;: Water&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is what I read from the usage instructions of the &lt;em&gt;Roundup® Weed
&amp;amp; Grass Killer Super Concentrate&lt;/em&gt;. That you have so much water in the
solution you spray is normal, nowadays, a good active ingredient
(pesticide, fungicide) is spread at a rate of 12 to 25g per hectare
(10,000 square meters). But to achieve a good mixing you package these
minimal amounts in a formulation, this formulation will be then mixed with
water in a big tank and this will be spread.&lt;/p&gt;
&lt;p&gt;With a bit of simplification you follow the sequence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;10g of active ingredient,&lt;/li&gt;
&lt;li&gt;put into 1L of &lt;em&gt;formulation&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;mixed into a 1000L of Water solution ready to use.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The critical step is in fact the second one, you can have perfectly
good active ingredient and makes a totally toxic formulation. A big
part of the work done by the agrochemical companies developing new
pesticides/fungicides/herbicides is to ensure that they do not get a
toxic formulation.&lt;/p&gt;
&lt;p&gt;Because the active ingredient is just a part of what is effectively
used on the fields, the validation should not focus on the official
active ingredient but on the formulation. If one just focus on the
main active ingredient, it opens the door to creation of formulations
which are maybe way more effective to kill the weeds, but terrible for
our environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Some people asked me why mixing a safe compound into a
given formulation could make the whole stuff toxic. This is simply
because the other compounds in the formulation can act as a carrier
and help transport the relatively safe chemical in parts of the
organism where it can be toxic. This also why you should never mix
prescription drugs with other over-the-counter drugs you can freely
buy. Your doctor is providing you a given prescription considering you
do not take other things together, if you add some extra stuff, it
could have bad side effects. This resulted in medicine in the
empirical rule not to give more than 3 drugs to a patient.&lt;/p&gt;</content><category term="misc"/><category term="Environment"/><category term="HSE"/></entry><entry><title>Using Yubikeys for our System Security</title><link href="https://www.ceondo.com/ecte/2017/05/system-security-yubikey/" rel="alternate"/><published>2017-05-09T12:56:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2017-05-09:/ecte/2017/05/system-security-yubikey/</id><summary type="html">&lt;p&gt;Robust and practical security.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Security is a moving target. Just a couple of days ago, in the German newspaper, 
we read that &lt;a href="http://www.spiegel.de/netzwelt/web/online-banking-kriminelle-stehlen-geld-von-mtan-nutzern-a-1145843.html"&gt;the &lt;strong&gt;mTan&lt;/strong&gt; system to secure banking transaction was circumvent&lt;/a&gt; 
allowing attackers to transfer money without authorization. What was considered
as secured was not anymore.&lt;/p&gt;
&lt;p&gt;What is really interesting nowadays is that &lt;strong&gt;we moved away from a
local threat to a remote threat&lt;/strong&gt;. You are now more likely to suffer
data loss from a remote bad actor than from someone breaking into your
office or house.&lt;/p&gt;
&lt;p&gt;To model the threat for the security of Céondo's systems, we need a
trusted and secure root. For us, it is pretty simple, it is a safe at
the bank. The safe is only accessible with a physical key, a bank card
and a PIN associated to the bank card. The PIN is not the same as the
normal PIN of the card. &lt;strong&gt;The bank is the key and document backup root
location&lt;/strong&gt;, it also the place where we keep a
&lt;a href="https://www.ceondo.com/ecte/2016/09/simple-secure-backup/"&gt;rotation of encrypted backup hard drives&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At the office, the laptops are secured this way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;encrypted home directory (with Ubuntu OS);&lt;/li&gt;
&lt;li&gt;login password composed of 8 characters remembered by the user plus a 30+ long password stored as static password on a &lt;a href="https://www.yubico.com/products/yubikey-hardware/"&gt;Yubikey&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On each laptop, a &lt;a href="https://www.keepassx.org/"&gt;KeePassX&lt;/a&gt; vault is used
to store all the login/passwords of the different services. All the
passwords are unique per service and randomly generated with KeePassX.&lt;/p&gt;
&lt;p&gt;The vault itself is encrypted using the same approach as the login,
with passphrase composed of normal &lt;em&gt;remembered&lt;/em&gt; password and then a
long password stored on a Yubikey. Some have the same key for the
login and the vault, some have two different keys.&lt;/p&gt;
&lt;p&gt;The combination of a remembered password and a long password from the
keys for the &lt;em&gt;static&lt;/em&gt; passwords allows good resistance to the local
threat, that is, someone stealing a laptop with the key on it (as long
as the remembered password is not 1234 of course).&lt;/p&gt;
&lt;p&gt;For the highly critical accounts, a simple login/password, even
randomly generated is not enough. For them, we use another
authentication factor. This can be OTP with
&lt;a href="https://www.gandi.net"&gt;Gandi&lt;/a&gt; or &lt;a href="https://en.wikipedia.org/wiki/Universal_2nd_Factor"&gt;U2F&lt;/a&gt; for
&lt;a href="https://www.fastmail.com"&gt;FastMail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For each key, we keep a backup key at the bank. Only few services are
using OTP/U2F, so for the moment this is not a problem to go to the
bank and pull the backup key the time to register it. This may need to
be changed as U2F is more widely used.&lt;/p&gt;
&lt;p&gt;Using this approach, our systems are well secured and they are still
easy to use in the daily life which is really important.&lt;/p&gt;</content><category term="misc"/><category term="Security"/><category term="Sysadmin"/></entry><entry><title>Happy Birthday Céondo</title><link href="https://www.ceondo.com/ecte/2017/05/happy-birthday-ceondo/" rel="alternate"/><published>2017-05-08T12:19:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2017-05-08:/ecte/2017/05/happy-birthday-ceondo/</id><summary type="html">&lt;p&gt;This month Céondo is turning 10.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In Spring 2007, I decided to start Céondo, at that time I had some
ideas about the things I wanted to do, but was not totally sure about
them. A lot of unknowns, this is why the company name &lt;strong&gt;Céondo&lt;/strong&gt; was
generated using a simple algorithm to be &lt;em&gt;short&lt;/em&gt;, &lt;em&gt;without particular
meaning&lt;/em&gt;, &lt;em&gt;easy to pronounce even for English speakers&lt;/em&gt; and with the
corresponding &lt;em&gt;.com&lt;/em&gt; available.&lt;/p&gt;
&lt;p&gt;The company started as a UK limited and in 2014 jumped the channel and is now a German GmbH. 
Consultancy is a funny ride with highs and lows, but 2017 is a lucky nice year already scheduled to be the best year to date for Céondo. For a 10 year anniversary, this is great!&lt;/p&gt;
&lt;p&gt;Thank you to all my customers who made it possible for Céondo to be
here today and I am ready to another 10 years like that!&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>New RAM for a Lenovo X220</title><link href="https://www.ceondo.com/ecte/2017/02/new-ram-lenovo-x220/" rel="alternate"/><published>2017-02-16T13:29:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2017-02-16:/ecte/2017/02/new-ram-lenovo-x220/</id><summary type="html">&lt;p&gt;Forced to upgrade the RAM of my faithful Lenovo X220.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In the past few weeks, my laptop suffered from very annoying random
restarts. Randomly and to the point of preventing me to work
correctly. After a bit of dusting out etc. I solved my problem by
changing the 4GB memory module of my Lenovo X220 and putting a 2GB I
had from another Lenovo. It worked. Good and bad. Good, it works, really bad, I cannot run anymore my &lt;a href="https://www.ceondo.com/ecte/2017/02/vmware-keyboard-mapping/"&gt;virtual machine for my customers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, I had no choices but looking for RAM modules and I must say, I am not used to do it.
From the documentation, I had to find the very special &lt;strong&gt;1.5V CL=9 DDR3 1333MHz SODIMM&lt;/strong&gt; and if possible from a good company like &lt;a href="http://www.crucial.de/deu/de/upgrade-kompatibel-mit/Lenovo/thinkpad-x220"&gt;Crucial&lt;/a&gt;. On the website from Crucial, it offers the use of the low voltage 1.35V but on the website of &lt;a href="https://ark.intel.com/products/52229/Intel-Core-i5-2520M-Processor-3M-Cache-up-to-3_20-GHz"&gt;Intel&lt;/a&gt;, the only supported voltage is 1.5V.&lt;/p&gt;
&lt;p&gt;Anyway, I was lucky, on Amazon it was possible to order two &lt;em&gt;8GB 1.5V
CL=9 DDR3 1333MHz SODIMM&lt;/em&gt; from Crucial.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Happy modules I need" src="/images/2017/2017.02.14-Crucial8GBSingleDDR3L1600MT.png"&gt;&lt;/p&gt;
&lt;p&gt;Happy days until opening the box, the delivery was composed of two
&lt;em&gt;8GB 1600MHz 1.35V CL=11&lt;/em&gt; SODIMMs. So, I tried my luck, just putting
one SODIMM and restarting the laptop. &lt;strong&gt;It worked!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Basically every body is contradicting everybody, be it on a discussion
forum or any other place. The reason is simple, new low voltage RAM
modules can run both at 1.35V and 1.5V. For the CL or
&lt;a href="https://en.wikipedia.org/wiki/CAS_latency"&gt;CAS latency&lt;/a&gt; it looks like
the system can adapt itself. I have no idea how, but the Crucial
website tells me that I can use some CL=11 modules.&lt;/p&gt;
&lt;p&gt;Now, I went from 4GB to 16GB in my laptop for less than 100€, with my
first computer having 1MB of RAM, I am always surprised by the cost of
electronics.&lt;/p&gt;
&lt;p&gt;For the reference, the 8GB modules I bought are the &lt;strong&gt;&lt;a href="http://eu.crucial.com/eur/en/ct8g3s160bmceu"&gt;CT8G3S160BMCEU&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Of course the question now is: Was it really the memory module or a
simple bad contact or something like that which was solved when
opening/closing the case of the laptop? I do not have the time to
answer, but I will be able to test in the future by putting the 4GB
module in place of the 2GB in my old laptop.&lt;/p&gt;</content><category term="misc"/><category term="Sysadmin"/><category term="Laptop"/><category term="Infrastructure"/></entry><entry><title>VMWare and Your Keyboard Mapping</title><link href="https://www.ceondo.com/ecte/2017/02/vmware-keyboard-mapping/" rel="alternate"/><published>2017-02-01T13:00:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2017-02-01:/ecte/2017/02/vmware-keyboard-mapping/</id><summary type="html">&lt;p&gt;VMWare and Gnome 3.0 may render your keyboard mapping unusable.&lt;/p&gt;</summary><content type="html">&lt;p&gt;To be really productive for my customers I have, over the years,
adapted my work setup to my needs. One of the keys of my productivity
is the use of wonderful &lt;a href="http://www.typematrix.com/"&gt;TypeMatrix 2030&lt;/a&gt; keyboard with
the &lt;a href="https://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard"&gt;Dvorak layout&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;The other key is the use of &lt;a href="https://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; as text editor. One
peculiarity of &lt;em&gt;Emacs&lt;/em&gt; is the extensive use of the &lt;code&gt;Ctrl&lt;/code&gt; key to run
special commands. In a text editor you can save your work with
&lt;code&gt;Ctrl+S&lt;/code&gt;, copy with &lt;code&gt;Ctrl+C&lt;/code&gt; and paste with &lt;code&gt;Ctrl+V&lt;/code&gt;, in &lt;em&gt;Emacs&lt;/em&gt; can
do nearly everything with some &lt;code&gt;Ctrl+key&lt;/code&gt; combinations. This requires
an easy to access &lt;code&gt;Ctrl&lt;/code&gt; key and on the &lt;em&gt;TypeMatrix 2030&lt;/em&gt; keyboard,
this means swapping the left shift and the left control keys.&lt;/p&gt;
&lt;p&gt;On a modern Linux system with &lt;a href="https://en.wikipedia.org/wiki/Systemd"&gt;systemd&lt;/a&gt;, remapping keys of a
USB keyboard is pretty simple, you create a file which simply tell
which key code will match which key for which device.&lt;/p&gt;
&lt;p&gt;I created the file &lt;code&gt;/etc/udev/hwdb.d/80-typematrix-key.hwdb&lt;/code&gt; with the content:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;evdev&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;v1E54p2030&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;KEYBOARD_KEY_700e0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;leftshift&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;KEYBOARD_KEY_700e1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;leftctrl&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ctrl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and run the commands: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo udevadm hwdb --update
sudo udevadm trigger
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;now the two keys are swapped and the changes persist across
reboots. If you need, you can
&lt;a href="https://wiki.archlinux.org/index.php/Map_scancodes_to_keycodes"&gt;learn more about scan codes and key codes&lt;/a&gt;. Everything work, I
am happy and go back to work. This was just after an upgrade from
Ubuntu 14.04 to &lt;a href="https://www.ubuntu.com/"&gt;Ubuntu 16.04&lt;/a&gt; which went without a single
glitch. Happy day.&lt;/p&gt;
&lt;p&gt;The next day, I run an upgrade of &lt;a href="https://en.wikipedia.org/wiki/VMware_Workstation"&gt;VMWare Workstation&lt;/a&gt; as my
old version (9) was not compatible with the current Ubuntu
version. &lt;strong&gt;VMWare Workstation&lt;/strong&gt; belongs to the software I am happy
paying for. They make my work so nice. Because the last thing I want
to happen as I work for my customers is the leak of data out of my
system as most of the bits I move are covered with non disclosure
agreements. This results in a &lt;strong&gt;secure by default&lt;/strong&gt; approach with the
rule that I &lt;strong&gt;isolate the work for each customer in a dedicated
virtual machine&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So, I install the new &lt;em&gt;Workstation&lt;/em&gt;, launch a virtual machine, click
around and try to go back to work. End of the day for two days. My
keyboard went totally fubar, enable to use the &lt;code&gt;Ctrl&lt;/code&gt; keys anymore,
both on the left and the right. Of course, as the day before I moved
from &lt;a href="https://wiki.archlinux.org/index.php/Xmodmap"&gt;xmodmap&lt;/a&gt; to the new &lt;em&gt;udev/systemd&lt;/em&gt; approach, I first
tried to figure out what was going on on this side of the
system. Without any luck and success, I tried to get logs out of
&lt;code&gt;systemd&lt;/code&gt; and the system messages.&lt;/p&gt;
&lt;p&gt;Then by luck, after an afternoon of frustration and a good night, the
next day, I found the answer and the issue is coming from the
&lt;a href="http://askubuntu.com/questions/493404/ubuntu-14-04-vmware-6-left-ctrl-and-right-shift-not-functioning"&gt;Gnome handling of the capslock key remapping&lt;/a&gt;. The
solution is extremely simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In Gnome Tweak Tool, set "Ctrl key position" to "Caps Lock as Ctrl" and "Caps Lock key behavior" to "Caps Lock is disabled".&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nothing more, nothing less. It works.&lt;/p&gt;</content><category term="misc"/><category term="Productivity"/><category term="Programming"/><category term="Sysadmin"/></entry><entry><title>Bonne Année 2017</title><link href="https://www.ceondo.com/ecte/2017/01/bonne-annee-2017/" rel="alternate"/><published>2017-01-31T09:52:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2017-01-31:/ecte/2017/01/bonne-annee-2017/</id><summary type="html">&lt;p&gt;Wishing you all the best for 2017.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Already a month in, in France this is the last day to wish everybody
all the best for 2017.  You can read
&lt;a href="https://www.ceondo.com/2017/"&gt;my best wishes for 2017&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Christmas Holidays</title><link href="https://www.ceondo.com/ecte/2016/12/christmas-holidays-2016/" rel="alternate"/><published>2016-12-22T11:51:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-12-22:/ecte/2016/12/christmas-holidays-2016/</id><summary type="html">&lt;p&gt;Changed office hours for the Christmas holidays.&lt;/p&gt;</summary><content type="html">&lt;p&gt;After a long year, with a lot done and probably even more to be done
in 2017, we all need a good break for Christmas. The office will be
closed from tomorrow the 23rd of December until the 3rd of January
inclusive.&lt;/p&gt;
&lt;p&gt;Phone calls will not be taken but I am on duty in case of emergency. 
Please contact me per email if you really need my help.
Emergency email will be checked every day.&lt;/p&gt;
&lt;p&gt;Normal work and answers to your questions will resume on the 4th of
January 2017.&lt;/p&gt;
&lt;p&gt;Enjoy your break and rest well before starting in the new prime year
2017!&lt;br&gt;
Loïc&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Windows 7, Update from SP1</title><link href="https://www.ceondo.com/ecte/2016/10/windows7-update-sp1/" rel="alternate"/><published>2016-10-17T13:36:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-10-17:/ecte/2016/10/windows7-update-sp1/</id><summary type="html">&lt;p&gt;It just takes about 3 days.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For the last 3 days, I have been living within &lt;strong&gt;Windows Update&lt;/strong&gt;. I
am changing my machine from a 32bit version to 64bit version of
Windows 7. This is the professional version of Windows 7, nicely
installed from an original DVD exactly the way Microsoft want us to
do. It has been 3 days in the making, I cannot count the numbers of
restarts and it is still &lt;em&gt;to be completed&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you really have to do this, if your DVD contains Windows 7 SP1,
&lt;strong&gt;do not use Windows Update&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Go download the &lt;a href="https://support.microsoft.com/en-us/kb/3172605"&gt;July 2016 update rollup for Windows 7 SP1&lt;/a&gt;
and then start the update using &lt;em&gt;Windows Update&lt;/em&gt;. Note that this
rollup update is a nearly 600MB download.&lt;/p&gt;
&lt;p&gt;Why going through this pain? This is to be able to build the new
&lt;a href="https://www.ceondo.com/ecte/tags/chemeo-studio/"&gt;Cheméo Studio&lt;/a&gt; and deliver it for both 32 and 64 platforms.&lt;/p&gt;</content><category term="misc"/><category term="Sysadmin"/></entry><entry><title>I Like Fortran</title><link href="https://www.ceondo.com/ecte/2016/09/i-like-fortran/" rel="alternate"/><published>2016-09-27T18:34:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-09-27:/ecte/2016/09/i-like-fortran/</id><summary type="html">&lt;p&gt;It is my prefered language for science.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Fortran"&gt;Fortran&lt;/a&gt; is really a nice language when it comes to
scientific computations. So nice that I have some difficulties when
using a different one like &lt;a href="https://www.python.org"&gt;Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you do science with Python, you always end up with using
&lt;a href="http://www.numpy.org"&gt;numpy&lt;/a&gt;, a wonderful extension to work with arrays and matrices
efficiently. But... there is a but... it is not statically typed and
can create some funny results, like when you multiply a matrix by a
vector with a dot product.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;6.0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;17.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mf"&gt;39.&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;23.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mf"&gt;34.&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What is happening here is that when you run &lt;code&gt;np.dot(A, B)&lt;/code&gt;, as &lt;code&gt;B&lt;/code&gt; is
a simple array, it is replicated two times to match the size of &lt;code&gt;A&lt;/code&gt;,
so you effectively run: &lt;code&gt;5x1 + 6x2&lt;/code&gt; and again &lt;code&gt;5x3 + 6x4&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When you run &lt;code&gt;np.dot(B, A)&lt;/code&gt;, you run in columns: &lt;code&gt;5x1 + 6x3&lt;/code&gt; and
&lt;code&gt;5x2 + 6x4&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.numpy.org"&gt;Numpy&lt;/a&gt; is smart, but deep into your computational code, an
order swap or an error in dimensions can result in really hard to
track errors. Fortran will simply send you back to the drawing board
telling you that the dimensions do not match and that you should work
a bit more.&lt;/p&gt;</content><category term="misc"/><category term="Programming"/></entry><entry><title>Simple Secure Backup for a Consultancy</title><link href="https://www.ceondo.com/ecte/2016/09/simple-secure-backup/" rel="alternate"/><published>2016-09-15T15:03:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-09-15:/ecte/2016/09/simple-secure-backup/</id><summary type="html">&lt;p&gt;A simple solution for disaster recovery.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nowadays, with &lt;em&gt;the cloud&lt;/em&gt;, you have a large number of companies
offering backup solutions for your computers. The only problem for
most of these solutions is that they are &lt;em&gt;in the cloud&lt;/em&gt;, this results
in:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;low recovery speed as you need to download again GB of data over a
   relatively slow connection;&lt;/li&gt;
&lt;li&gt;dependency on a third party and companies are going bust;&lt;/li&gt;
&lt;li&gt;possibly absence of a cloud offer matching your country regulations
   (location of the data) at a reasonable price.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the cloud is not matching your requirements, here is a very simple
solution based on external USB hard drive. The goal &lt;strong&gt;is not to be
perfect but to be simple&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;What you need is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;an external hard drive, for example the &lt;a href="https://www.amazon.com/Elements-Portable-Hard-Drive-WDBU6Y0020BBK-EESN/dp/B00D0L5BH8/"&gt;WD Elements 2TB&lt;/a&gt; drive;&lt;/li&gt;
&lt;li&gt;a hardware token to store a long password, for example a &lt;a href="https://www.yubico.com/products/yubikey-hardware/"&gt;Yubikey&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;a labeling machine, like a &lt;a href="https://www.amazon.com/Brother-P-Touch-PT-D210-Label-Maker/dp/B013DG2FNW/"&gt;Brother P-touch&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;a safe at your bank;&lt;/li&gt;
&lt;li&gt;the ability to compute a bit in your head.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Everything is done on a &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt; based system using the
&lt;a href="https://www.gnome.org/"&gt;Gnome&lt;/a&gt; desktop. Read the full article before starting to
follow the instructions.&lt;/p&gt;
&lt;p&gt;First you need to store a
&lt;a href="https://www.yubico.com/products/services-software/personalization-tools/static-password/"&gt;long static password on your Yubikey&lt;/a&gt;. You should print a
copy of the password and put in the safe at your bank for backup
purpose.&lt;/p&gt;
&lt;p&gt;Then, simply plug your USB drive into your computer and open the disk
utility. Using the disk utility, stop the drive and remove the
existing partition.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Open the disk utility" src="https://www.ceondo.com/images/2016/2016.09.15-disk-utility.png"&gt;&lt;/p&gt;
&lt;p&gt;Then create a new encrypted partition.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Create an encrypted partition" src="https://www.ceondo.com/images/2016/2016.09.15-create-partition.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The passphrase is important&lt;/strong&gt;: in my case, I have a simple to
remember but hard to guess &lt;strong&gt;algorithm to generate the first part
of the passphrase from the serial number of the hard drive&lt;/strong&gt;. Think
something in the line of using every second character but not the
numbers and adding something in between. The &lt;strong&gt;second part is simply
the long password from the Yubikey&lt;/strong&gt;. Write down the algorithm on the
paper with your backup of the long password and &lt;em&gt;be sure to put the
paper in the safe at your bank&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="You have an encrypted partition" src="https://www.ceondo.com/images/2016/2016.09.15-disks-the-partition.png"&gt;&lt;/p&gt;
&lt;p&gt;Now, you have an encrypted external hard drive. Because of the
combination of an &lt;em&gt;algorithm&lt;/em&gt; to compute the first part of the
passphrase and the Yubikey (or any hardware token able to generate a
password), &lt;em&gt;it is easy for you to unlock the drive&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Now, every 2 to 4 weeks, just run a backup script to copy the full
content of your laptop on the hard drive. The best is to use 2 hard
drives and rotate them, keeping one in the safe at your bank. Once a
drive is full, just buy a new one, &lt;em&gt;never recycle the drives&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Do not forget to label your drives with your labeling machine. This is
a picture of my first drive, it was full after 5 backups, as I just do
a backup once a month, the costs stay at less than €200/year, which is
fine.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Now you have a backup" src="https://www.ceondo.com/images/2015/2015.03.14-backup.jpg"&gt;&lt;/p&gt;
&lt;p&gt;In my case, this is combined with an automatic encrypted backup on a
remote server performed using &lt;code&gt;rsync&lt;/code&gt;. The automatic backup does not
keep historical data like the backup on the USB drives but is
automatic.&lt;/p&gt;
&lt;p&gt;The backup script in use is this one. Note that I have special case to
backup VMWare virtual machines which are not stored in the user home
directory. This is for performance reason, the &lt;code&gt;/home/vmware&lt;/code&gt;
directory is not encrypted but the home directory is.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e
&lt;span class="nv"&gt;LOGIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;
&lt;span class="nv"&gt;YEAR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="s2"&gt;&amp;quot;%Y&amp;quot;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="s2"&gt;&amp;quot;%Y.%m.%d&amp;quot;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nv"&gt;DRIVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DRIVE&lt;/span&gt;&lt;span class="p"&gt;:?&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;You need to provide the path to the drive.&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Start&lt;span class="w"&gt; &lt;/span&gt;backup&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;.

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Missing backup folder: &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Make&lt;span class="w"&gt; &lt;/span&gt;base&lt;span class="w"&gt; &lt;/span&gt;directories&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;/&lt;span class="nv"&gt;$DATE&lt;/span&gt;.

mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;/&lt;span class="nv"&gt;$DATE&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;/&lt;span class="nv"&gt;$DATE&lt;/span&gt;/&lt;span class="nv"&gt;$LOGIN&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;/&lt;span class="nv"&gt;$DATE&lt;/span&gt;/vmware

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Get&lt;span class="w"&gt; &lt;/span&gt;software&lt;span class="w"&gt; &lt;/span&gt;selection.

apt-mark&lt;span class="w"&gt; &lt;/span&gt;showauto&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/home/&lt;span class="nv"&gt;$LOGIN&lt;/span&gt;/Library/installed-pkgs-auto.lst
apt-mark&lt;span class="w"&gt; &lt;/span&gt;showmanual&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/home/&lt;span class="nv"&gt;$LOGIN&lt;/span&gt;/Library/installed-pkgs-manual.lst

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Backup&lt;span class="w"&gt; &lt;/span&gt;/home/&lt;span class="nv"&gt;$LOGIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;/&lt;span class="nv"&gt;$DATE&lt;/span&gt;/&lt;span class="nv"&gt;$LOGIN&lt;/span&gt;.
sudo&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/time&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\t%E real,\t%U user,\t%S sys&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/rsync&lt;span class="w"&gt; &lt;/span&gt;-aH&lt;span class="w"&gt; &lt;/span&gt;--stats&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;/home/&lt;span class="nv"&gt;$LOGIN&lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;/&lt;span class="nv"&gt;$DATE&lt;/span&gt;/&lt;span class="nv"&gt;$LOGIN&lt;/span&gt;/

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Backup&lt;span class="w"&gt; &lt;/span&gt;/home/vmware&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;/&lt;span class="nv"&gt;$DATE&lt;/span&gt;/vmware.
sudo&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/time&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\t%E real,\t%U user,\t%S sys&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/rsync&lt;span class="w"&gt; &lt;/span&gt;-aH&lt;span class="w"&gt; &lt;/span&gt;--stats&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;/home/vmware/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DRIVE&lt;/span&gt;/&lt;span class="nv"&gt;$DATE&lt;/span&gt;/vmware/

&lt;span class="c1"&gt;## To restore:&lt;/span&gt;
&lt;span class="c1"&gt;## sudo apt-mark auto $(cat installed-pkgs-auto.lst)&lt;/span&gt;
&lt;span class="c1"&gt;## sudo apt-mark manual $(cat installed-pkgs-manual.lst)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Done
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At the end, a simple and worry free strategy. &lt;/p&gt;</content><category term="misc"/><category term="Sysadmin"/><category term="Business"/></entry><entry><title>Cheméo Studio Intuitive Prediction Check</title><link href="https://www.ceondo.com/ecte/2016/08/chemeo-studio-how-good-is-your-prediction/" rel="alternate"/><published>2016-08-18T15:30:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-08-18:/ecte/2016/08/chemeo-studio-how-good-is-your-prediction/</id><summary type="html">&lt;p&gt;Easy check the quality of the predictions.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The work on the desktop component of &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt;, &lt;strong&gt;Cheméo
Studio&lt;/strong&gt;, is continuing. The automatic check of the property
predictions based on similar molecules with both experimental and
predicted values is working wonderfully. The parity plots are now
interactive and three times faster to draw. This means, you can easily
analyse the prediction quality of 4 properties in real time.&lt;/p&gt;
&lt;p&gt;The added benefit of the new graph system is that the resulting
executable is smaller. Yes, smaller and faster, this is often the case
with computer code, the less you do, the faster you are.&lt;/p&gt;
&lt;p&gt;With the current state of development, I expect the first release of
&lt;strong&gt;Cheméo Studio&lt;/strong&gt; in September.&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/><category term="Cheméo Studio"/></entry><entry><title>Bayer and the Porsche Effect</title><link href="https://www.ceondo.com/ecte/2016/05/bayer-monsanto-gruene/" rel="alternate"/><published>2016-05-30T10:00:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-05-30:/ecte/2016/05/bayer-monsanto-gruene/</id><summary type="html">&lt;p&gt;Strategic move by Bayer to buy Monsanto.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Now, we know why &lt;a href="http://www.bayer.com"&gt;Bayer&lt;/a&gt; decided to sell the
material science part of the company to create
&lt;a href="http://www.covestro.com/"&gt;Covestro&lt;/a&gt;: they simply wanted to buy
&lt;a href="http://www.monsanto.com/"&gt;Monsanto&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The cat is out of the bag and billion dollars question is: &lt;em&gt;"Will it
work?"&lt;/em&gt;. For &lt;a href="http://www.bayer.com"&gt;Bayer&lt;/a&gt;, this would definitely be a
sucess if it works, but they are going to face two issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the regulatory issue, Bayer, Du Pont, Monsanto and Syngenta are the
  4 big players, if Bayer buys Monsanto, the anti-trust regulations
  can kick-in and prevent them to buy Monsanto. This is not sure
  because a lot of small companies are providing fertilizers, crops,
  pesticides, fungicides and herbicides, but the global market share
  of the resulting entity would be 25% for the &lt;em&gt;chemical&lt;/em&gt; part and 33%
  for the seed part. This at the global level, but it could be
  monopolistic in some regions of the world.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;the Porsche&lt;/strong&gt; effect. Porsche tried to buy Volkswagen in an
  under-cover all cash action, the resulting high-debt lead Volkswagen
  to buy-back Porsche for cheap. Bayer has a lot of debts, this could
  make it a nice target for yet another take-over.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last point is the image. &lt;strong&gt;Monsanto in Germany is basically the
devil&lt;/strong&gt; but &lt;strong&gt;Bayer is a very well respected company&lt;/strong&gt;. The green
party in Germany is relatively strong, but stronger is the general
&lt;em&gt;green&lt;/em&gt; way of thinking of the german population. How the new Bayer
will be able to overcome this image issue? Will Bayer be able to keep
attracting great engineers? The oil an gas industry has difficulties
in recruiting in Germany also because of the bad press it has, will
this have an effect on Bayer too?&lt;/p&gt;
&lt;p&gt;From a personal point of view, I do not think this will create better
value for the people on the long run. It will definitely create better
value for the shareholders, but for the farmers and the customers like
you and me taking care of our garden, this is unlikely to have any
real positive effects. Why? Because even if
Monsanto and Bayer Crop Science are criticized a lot for their
pesticides, they are already doing great research and development and
the merging will not bring more innovation to these already highly
innovative and active companies.&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Cheméo Studio Explore Molecules</title><link href="https://www.ceondo.com/ecte/2016/04/chemeo-studio-explore/" rel="alternate"/><published>2016-04-27T15:30:00+02:00</published><updated>2016-04-28T14:22:00+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-04-27:/ecte/2016/04/chemeo-studio-explore/</id><summary type="html">&lt;p&gt;Easy exploration of similar molecules.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The work on the desktop component of &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt;, &lt;strong&gt;Cheméo Studio&lt;/strong&gt;, is 
nicely going ahead. The robustness and ease of use is really one step
ahead of what is available at the moment. Maybe because the motto of
Cheméo Studio is: &lt;em&gt;"Do one thing and do it well"&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To illustrate how it works, here are two small videos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;view &lt;a href="https://dl.ceondo.com/old/ebd02483-5eaf-483a-82d7-831b2ffe7951/2016.04.07-similarity-by-property.avi"&gt;similar molecules by structure or properties&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dl.ceondo.com/old/e5d92a4b-7b54-42ba-acda-874377f46705/2016.04.27-explore-similar-molecules.avi"&gt;explore molecules by loading them from the similarity list&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The interface is simple and fast. It requires a bit of memory because
of the drawing of the similar molecules are precomputed and the
database has more than 20,000 molecules, but the speed is there. If
you want to have an early access to the software, just
&lt;a href="https://www.ceondo.com/about/"&gt;drop me an email&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; You can now easily load a SMILES, here I copy/pasted the
&lt;a href="http://sitem.herts.ac.uk/aeru/ppdb/en/Reports/204.htm"&gt;DDT&lt;/a&gt; SMILES
from the PPDB databank. To load a SMILES, simply click on the &lt;em&gt;File&lt;/em&gt;
menu and select &lt;em&gt;Load SMILES&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Load a SMILES in Cheméo Studio" src="/images/2016/2016.04.28-chemeo-studio-load-smiles.png"&gt;&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/><category term="Cheméo Studio"/></entry><entry><title>Easter Holidays</title><link href="https://www.ceondo.com/ecte/2016/03/easter/" rel="alternate"/><published>2016-03-23T14:30:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-03-23:/ecte/2016/03/easter/</id><summary type="html">&lt;p&gt;Changed office hours for the Easter holidays.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Short break for Easter, from Friday the 25th of March to the 3rd of
April, the phone calls will not be taken. In case of emergency, you
can simply send us an email at the normaly email address. Emergency
will be checked every day.&lt;/p&gt;
&lt;p&gt;Normal work and answers to your questions will resume on the 4th of
April 2016.&lt;/p&gt;
&lt;p&gt;Enjoy your Easter holidays!&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Easter Holidays</title><link href="https://www.ceondo.com/ecte/2016/03/easter/" rel="alternate"/><published>2016-03-23T14:30:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-03-23:/ecte/2016/03/easter/</id><summary type="html">&lt;p&gt;Changed office hours for the Easter holidays.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Short break for Easter, from Friday the 25th of March to the 3rd of
April, the phone calls will not be taken. In case of emergency, you
can simply send us an email at the normaly email address. Emergency
will be checked every day.&lt;/p&gt;
&lt;p&gt;Normal work and answers to your questions will resume on the 4th of
April 2016.&lt;/p&gt;
&lt;p&gt;Enjoy your Easter holidays!&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Cheméo Studio is Coming</title><link href="https://www.ceondo.com/ecte/2016/03/chemeo-studio/" rel="alternate"/><published>2016-03-17T22:00:00+01:00</published><updated>2016-03-21T15:00:00+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-03-17:/ecte/2016/03/chemeo-studio/</id><summary type="html">&lt;p&gt;Easy Desktop Property Prediction.&lt;/p&gt;</summary><content type="html">&lt;p&gt;If &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt; usage of the &lt;a href="https://www.chemeo.com/predict?smiles=CCCCC"&gt;chemical property prediction tool&lt;/a&gt;
is growing, some users would like to run the predictions on their own
desktop. This is really important for confidentiality reasons.&lt;/p&gt;
&lt;p&gt;I am happy to announce that &lt;strong&gt;Cheméo Studio&lt;/strong&gt; is coming!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cheméo Studio" src="https://www.ceondo.com/images/2016/2016.03.17-chemeo-studio.png"&gt;&lt;/p&gt;
&lt;p&gt;The 2D molecular drawing tool is extremely easy to use and the
prediction methods will include the good and well known Joback method
together with the Constantinou-Gani and Marrero-Gani methods.&lt;/p&gt;
&lt;p&gt;With 15 years of experience developing and maintaining the ICAS
software at &lt;a href="http://capec.kt.dtu.dk"&gt;CAPEC&lt;/a&gt; together with countless hours discussing
their needs with engineers from the most innovative companies, I can
tell you that this software will simply be the best in its class.&lt;/p&gt;
&lt;p&gt;If you are interested in testing the software before general
availability, just let me know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; A long requested feature is now available, the instant
similarity search in the database while drawing the molecule. The
similarity search takes about 70ms to run. As the "instant" feeling
for desktop application is 100ms, it means I do not even need to show
a kind of "loading similar compounds" overlay.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cheméo Studio with similarity search" src="https://www.ceondo.com/images/2016/2016.03.21-chemeo-studio-similarity.png"&gt;&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/><category term="Cheméo Studio"/></entry><entry><title>Keeping Cheméo Fast</title><link href="https://www.ceondo.com/ecte/2016/03/keeping-the-performance-chemeo/" rel="alternate"/><published>2016-03-02T10:00:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-03-02:/ecte/2016/03/keeping-the-performance-chemeo/</id><summary type="html">&lt;p&gt;Improved storage and index now running.&lt;/p&gt;</summary><content type="html">&lt;p&gt;With the time, the usage of &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt; is growing, this is nice,
but for the users to be happy, the speed of the system must stay the
same or improve.&lt;/p&gt;
&lt;p&gt;Early this year I have rewritten the backend storage of the data and
the indexing system. The results speak from themselves.&lt;/p&gt;
&lt;p&gt;On the graph, you can see the time it takes for the software to render
a page for you, the end user. The &lt;em&gt;page&lt;/em&gt; can either be a compound page
like the
&lt;a href="https://www.chemeo.com/cid/15-582-9/1-Propanol"&gt;chemical properties of Propanol&lt;/a&gt;
but also the corresponding drawing, Excel or PDF export. The percent
are in fact the percentiles, that is, if you follow the 95% line, you
know that 95% of the pages are generated in less than this time.&lt;/p&gt;
&lt;p&gt;What is very impressive is that even the 99% is nearly always below
100ms. 100ms is the "instant" reaction time. That is, it is the time
for the user to have the feeling &lt;strong&gt;the system is reacting
instantaneously&lt;/strong&gt;
(&lt;a href="https://www.nngroup.com/articles/response-times-3-important-limits/"&gt;See study&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Of course, this is just at the "server" level, the generated &lt;em&gt;page&lt;/em&gt;
must then be sent over the wire to the end user. This can take way
more time, especially if you are
&lt;a href="https://www.chemeo.com"&gt;looking for chemical properties&lt;/a&gt; from India or South Africa.
But the good thing is that &lt;strong&gt;the pages are also pretty small in size&lt;/strong&gt;,
with the chemical properties but no funny effects and scripts and thus
can be &lt;strong&gt;correctly delivered even if you have a low quality bandwidth&lt;/strong&gt;
like in Kazakhstan or French Polynesia!&lt;/p&gt;
&lt;p&gt;The last interesting point of the rewrite was that it can now be
installed easily within the Intranet of a company. But this is more a
business point of view.&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/></entry><entry><title>Cheméo Crawler is Crawling Again</title><link href="https://www.ceondo.com/ecte/2016/02/chemeo-crawler-acting-again/" rel="alternate"/><published>2016-02-18T10:00:00+01:00</published><updated>2016-02-23T21:00:00+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2016-02-18:/ecte/2016/02/chemeo-crawler-acting-again/</id><summary type="html">&lt;p&gt;Nicer and more robust for the targets.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Good feeling, the &lt;a href="https://www.chemeo.com"&gt;Cheméo crawler&lt;/a&gt; is now crawling again the
web. The crawls are still performed in batchs, that is, the crawler is
only launched every few months, not like Google which is accessing the
websites every day.&lt;/p&gt;
&lt;p&gt;This time, the crawler has been improved to discard non interesting
pages before crawling and rewriting the URL to avoid duplicating the
crawl. For example the two URLs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;http://my-website.com/index.php?foo=bar&amp;amp;bing=bong&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http://my-website.com/index.php?bing=bong&amp;amp;foo=bar&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;are the same, because the query string &lt;code&gt;bing=bong&amp;amp;foo=bar&lt;/code&gt; passes two
keys &lt;code&gt;bing&lt;/code&gt; and &lt;code&gt;foo&lt;/code&gt; with values &lt;code&gt;bong&lt;/code&gt; and &lt;code&gt;bar&lt;/code&gt;. By rewriting the
URLs before the crawl, the system avoids duplicate crawling. Both the
crawler and the targeted website are now doing less work.&lt;/p&gt;
&lt;p&gt;The crawler is alse using &lt;a href="https://en.wikipedia.org/wiki/Bloom_filter"&gt;bloom filters&lt;/a&gt; to efficiently
discard already crawled links and bad links and the best part of it is
the storage of the retrieved data in a &lt;a href="http://www.digitalpreservation.gov/formats/fdd/fdd000236.shtml"&gt;WARC file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;a href="http://www.digitalpreservation.gov/formats/fdd/fdd000236.shtml"&gt;WARC file&lt;/a&gt;, the &lt;em&gt;Web ARChive file format&lt;/em&gt;, is a standard to
preserve the content published online. It is a well though ISO
standard with a pretty large number of tools available to manipulate
them. The advantage for the crawler is that many versions of the same
page can be stored, it is compressed and can be efficiently
manipulated after the creation. This way, the parsing of the pages is
performed in total independence of the crawling.&lt;/p&gt;
&lt;p&gt;The current crawling session is expected to last approximately a month.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update, 23rd of February:&lt;/strong&gt; nearly 200,000 URLs crawled in 5 days,
with 1.2 millions to crawl, the one month crawl is on track.&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/></entry><entry><title>Christmas Holidays</title><link href="https://www.ceondo.com/ecte/2015/12/christmas/" rel="alternate"/><published>2015-12-21T14:23:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-12-21:/ecte/2015/12/christmas/</id><summary type="html">&lt;p&gt;Changed office hours for the Christmas holidays.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Winter is here but the weather feels way more like spring. We have
cherry blossom in the city just nearby, this is worrying.&lt;/p&gt;
&lt;p&gt;Anyway, from the 23rd to the 4th of January, the office will run
in emergency mode only. The phone calls will not be taken from the
23rd to the 27th of December inclusive and from the 31st to
3rd inclusive. In case of emergency, you can simply send us an email
at the normaly email address. Emergency will be checked every day.&lt;/p&gt;
&lt;p&gt;Normal work and answers to your questions will resume on the 4th of
January 2016.&lt;/p&gt;
&lt;p&gt;Enjoy your Christmas and new year break!&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Upgrade of our Internet Link</title><link href="https://www.ceondo.com/ecte/2015/12/upgrade-uplink-internet/" rel="alternate"/><published>2015-12-03T11:00:00+01:00</published><updated>2015-12-07T10:00:00+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-12-03:/ecte/2015/12/upgrade-uplink-internet/</id><summary type="html">&lt;p&gt;Faster 100Mbps connection at the office.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Tomorrow the 4th of December, &lt;a href="http://www.telekom.de/breitbandausbau-deutschland"&gt;Telekom&lt;/a&gt; is supposed to switch
us on the new 100Mbps connection powered with the so called
&lt;a href="https://en.wikipedia.org/wiki/Very-high-bit-rate_digital_subscriber_line_2#Vectoring"&gt;vectoring technology&lt;/a&gt;. I am not sure how well the transition
is going to work. In April we moved from a stable ISDN system to a
full IP connection, so normally, it should be just a switch, restart
the router and enjoy the new speed, but who knows?&lt;/p&gt;
&lt;p&gt;In short: tomorrow, the 4th of December, we me have no reliable
internet connection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: From the 4th of December 13h45 to right now, the 7th of
December 10h00, we had no internet connection and because the phone is
now running over the internet connection, no phone. Nearly 3 days. Not
good. We now have a 65Mbps downlink and a 35Mbps uplink.&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Cheméo API for Research</title><link href="https://www.ceondo.com/ecte/2015/11/chemeo-api-in-use/" rel="alternate"/><published>2015-11-20T14:00:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-11-20:/ecte/2015/11/chemeo-api-in-use/</id><summary type="html">&lt;p&gt;Easy access to data improves science.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since the &lt;a href="https://www.ceondo.com/ecte/2015/09/chemeo-api/"&gt;release of the Cheméo API&lt;/a&gt; the &lt;a href="https://www.chemeo.com/api/v1/#!/General"&gt;API&lt;/a&gt;
starts to be used.&lt;/p&gt;
&lt;p&gt;This was with a great pleasure that, few weeks ago, I received an
email complaining about a bug in the API. It is not everyday that one
is happy about a bug report!&lt;/p&gt;
&lt;p&gt;The report was from Daniel O'Neil, a researcher at the Georgia
Institute of Technology. He is using the &lt;a href="https://www.chemeo.com/api/v1/#!/General"&gt;Cheméo API&lt;/a&gt; to
experiment with machine learning algorithms to predict properties of
compounds. I was really pleased with this use of the API, as I was
doing my PhD, it was always a problem to access data in an easy to use
format. This is great to see that my work is making the life of
researchers easier.&lt;/p&gt;
&lt;p&gt;You too can use the &lt;a href="https://www.chemeo.com/api/v1/#!/General"&gt;Cheméo API&lt;/a&gt;, it is available for free.&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/></entry><entry><title>A New Molecular Drawing Tool</title><link href="https://www.ceondo.com/ecte/2015/09/molecular-drawing-tool/" rel="alternate"/><published>2015-09-28T10:00:00+02:00</published><updated>2015-10-02T15:00:00+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-09-28:/ecte/2015/09/molecular-drawing-tool/</id><summary type="html">&lt;p&gt;Simple and efficient 2D molecular drawing tool.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For the &lt;a href="https://www.chemeo.com/predict"&gt;prediction of chemical properties with Cheméo&lt;/a&gt;
I am using an open-source tool named &lt;a href="http://opensource.scitouch.net/services/ketcher-chemical-structure-editor"&gt;Ketcher&lt;/a&gt;. It is
working pretty well but has two inconvenients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it is big and can do a lot more than what we need now and in the
  future;&lt;/li&gt;
&lt;li&gt;it has a license preventing us to integrate it into a standalone
  close source software (AGPL).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last point, the license, is not really a problem as you can get a
special licensing agreement from the authors of Ketcher. The second
point can only be solved by shopping around for something different.&lt;/p&gt;
&lt;p&gt;After a while, I saddly found nothing matching my requirements, this
is why I started a new system. The picture above is a screenshot of
a drawing with this new tool. The tool is simpler, easy to maintain
and extend and plays well with the libraries I am using for the rest
of &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt;'s interface (&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The current software in testing weights 840kB and can be compacted in
two files (CSS + Javascript), Ketcher weights 3.1MB in 170 files (a
call to the prediction page issues 100 requests to load everything).&lt;/p&gt;
&lt;p&gt;I hope to be able to switch the component to allow you to draw faster
with a simpler interface during the month of October.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Now it works pretty well, of course the mandatory drawing
of the Trinitrotoluene with the new tool!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Drawing the TNT with the new tool" src="/images/2015/2015.10.02-molecular-drawing-tool-tnt.png"&gt;&lt;/p&gt;</content><category term="misc"/><category term="Modelling"/><category term="Cheméo"/></entry><entry><title>Cheméo API Available</title><link href="https://www.ceondo.com/ecte/2015/09/chemeo-api/" rel="alternate"/><published>2015-09-15T22:00:00+02:00</published><updated>2015-09-17T14:00:00+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-09-15:/ecte/2015/09/chemeo-api/</id><summary type="html">&lt;p&gt;Integrate Cheméo into your software easily.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The first version of the &lt;a href="https://www.chemeo.com/api/v1/#!/General"&gt;Cheméo API&lt;/a&gt; is available. This is a
REST &lt;a href="https://en.wikipedia.org/wiki/Application_programming_interface"&gt;API&lt;/a&gt; and it is very easy to use it. You basically issue a
specially crafted &lt;code&gt;GET&lt;/code&gt; request against the &lt;a href="https://www.chemeo.com/api/v1/#!/General"&gt;Cheméo API&lt;/a&gt; and you
get a JSON formatted message as response.&lt;/p&gt;
&lt;p&gt;At the moment, the available tools are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;conversion of from a name, SMILES, InChI, InChI key and Cheméo ID to
  another format.&lt;/li&gt;
&lt;li&gt;generation of the structure of molecule from its name using the
  IUPAC rules.&lt;/li&gt;
&lt;li&gt;property prediction using the Joback, Abraham and McGowan, and,
  Crippen methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The access to the API is free and the &lt;a href="https://www.chemeo.com/api/v1/#!/General"&gt;Cheméo API is fully documented&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: You can now run a search against the database, for
example, using the command line on a Linux/OSX system:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl -X GET &amp;quot;https://www.chemeo.com/api/v1/search?q=methane&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Learn more &lt;a href="https://www.chemeo.com/api/v1/#!/General/get_search"&gt;about the search API&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/></entry><entry><title>More than 350,000 Pure Compound Properties</title><link href="https://www.ceondo.com/ecte/2015/09/350000-pure-compound-properties/" rel="alternate"/><published>2015-09-02T13:23:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-09-02:/ecte/2015/09/350000-pure-compound-properties/</id><summary type="html">&lt;p&gt;New Data Coming into Cheméo&lt;/p&gt;</summary><content type="html">&lt;p&gt;At the moment, this is in fact 357,266 pure compound properties that
are evaluated. You can expect to have them in &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt; pretty
soon. This is really great news and this part of a work to ingest
about 1.5 millions pure and mixture property datapoints in the
database.&lt;/p&gt;
&lt;p&gt;These data are covering around 2000 compounds/substances. The work is
complicated by the lack of clear information about each compound, when
the data are covering Water, this is pretty easy to figure out which
corresponding compound si matching the database. But when we handle
&lt;em&gt;tetrabutylammonium dodecyl sulfate&lt;/em&gt; you need a bit of manual work to
be sure the match is correct.&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/></entry><entry><title>Bye Bye Céondo Ltd, Hallo Céondo GmbH</title><link href="https://www.ceondo.com/ecte/2015/09/bye-bye-ltd-hallo-gmbh/" rel="alternate"/><published>2015-09-01T15:23:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-09-01:/ecte/2015/09/bye-bye-ltd-hallo-gmbh/</id><summary type="html">&lt;p&gt;Céondo Ltd is stopping, Céondo GmbH is the future.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Short but important notice. &lt;strong&gt;Céondo Ltd&lt;/strong&gt; is going to be struck off
from the register at the Companies House within a couple of weeks.
This will not surprise anybody, but legally this is important. &lt;/p&gt;
&lt;p&gt;All the customers with some contracts under the &lt;strong&gt;Limited&lt;/strong&gt; company
have been informed, but maybe I missed somebody.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Céondo GmbH&lt;/strong&gt; will soon be the only existing structure as the
limited company is already a defacto &lt;em&gt;dormant&lt;/em&gt; company.&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Differences between C, C# and Fortran</title><link href="https://www.ceondo.com/ecte/2015/06/difference-between-c-csharp-and-fortran/" rel="alternate"/><published>2015-06-19T15:23:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-06-19:/ecte/2015/06/difference-between-c-csharp-and-fortran/</id><summary type="html">&lt;p&gt;Explaining the programming language differences to a psychologist.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Some days ago, I enjoyed a very nice discussion with a couple of
persons, the majority of them not having programming as their main
center of interest. But, we ended up comparing C, C# and Fortran.&lt;/p&gt;
&lt;p&gt;It was a lively discussion, so on the fly I tried to find a way to
understand the main differences for somebody having no ideas about
programming. I focused the difference on the memory management part.
Here is the way I tried to express the differences.&lt;/p&gt;
&lt;p&gt;Imagine your program is doing some work like you on a desk. You need
paper and pen. The paper is the memory used by the program.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In Fortran&lt;/strong&gt;, before you start to do the work, you grab sheets of paper,
you mark them to tell when and for what part of the work you are going
to use them. Once done, you start to work. When you start a part, the
sytem will give you the paper you need (because you marked them) and
will remove them at the end. If you need more paper at some point than
what you decided at the start, sorry you cannot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In C&lt;/strong&gt;, you do not anything at the start. When you start to work on
a part, you pick the paper you want. At the end of each part, it is up
to you to clean your desk or keep some paper for the next part. But if
you forget a sheet of paper during a part, you can start to accumulate
trash on your desk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In C#&lt;/strong&gt;, it is a bit like &lt;strong&gt;C&lt;/strong&gt;, you do nothing particular, but when
you need some paper, you ask your assistant, your assistant do not
know your needs, so he will give you a bit more or not enough, so you
may need to ask more or you may have a bit too much on the table. What
is nice is that your assistant is learning, it improves a bit with
time. At the end of a part, the assistant will also carefully inspect
your work and remove what he considers are the sheet of papers you do
not need anymore. This is nice, but it costs a bit of time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;At the end&lt;/strong&gt;, in &lt;strong&gt;Fortran&lt;/strong&gt; you need to define everything before,
but the results are a very fast system, in &lt;strong&gt;C&lt;/strong&gt; you can do some nice
optimisations but you need to manage a lot and this is error prone and
in &lt;strong&gt;C#&lt;/strong&gt; you enjoy the work of your assistant at the cost of some
inefficiencies here and there.&lt;/p&gt;</content><category term="misc"/><category term="Programming"/></entry><entry><title>ESCAPE25/PSE2015 Conference</title><link href="https://www.ceondo.com/ecte/2015/06/escape25-pse2015/" rel="alternate"/><published>2015-06-10T14:30:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-06-10:/ecte/2015/06/escape25-pse2015/</id><summary type="html">&lt;p&gt;Well received keynote during the conference in Denmark.&lt;/p&gt;</summary><content type="html">&lt;p&gt;It was with a great pleasure that I gave a talk on the uncertainties
in the prediction of chemical/physical properties using group
contribution methods at the combined
&lt;a href="http://www.pse2015escape25.dk/"&gt;PSE2015/ESCAPE25 conference&lt;/a&gt;. The conference was extremely
well organized by &lt;a href="http://www.capec.kt.dtu.dk/"&gt;Prof. Gani and his team&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The keynote was well received and generated a lot of interest by the
people in the room. You can already &lt;a href="/static/ceondo-escape25-pse2015-property-prediction-uncertainty.pdf"&gt;download the slides&lt;/a&gt;.
The main takeaway is that at the moment the prediction interval for
the group contribution methods (QSPR) is not fully reliable.&lt;/p&gt;
&lt;p&gt;A paper going more in depth is in writing at the moment, so you can
expect a publication within the next 3 months. The work in progress is
bringing solutions to this issue.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Science"/></entry><entry><title>Send Us Encrypted Emails</title><link href="https://www.ceondo.com/ecte/2015/05/encrypted-emails/" rel="alternate"/><published>2015-05-07T14:00:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-05-07:/ecte/2015/05/encrypted-emails/</id><summary type="html">&lt;p&gt;You can sign and encrypt your emails to us with PGP.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This is technical piece of information for the security and privacy
conscious people communicating with us.&lt;/p&gt;
&lt;p&gt;The GPG key associated with the email address &lt;code&gt;loic@ceondo.com&lt;/code&gt; has
been renewed. You can &lt;a href="https://www.ceondo.com/static/F89B0636.asc"&gt;download the public key from this server&lt;/a&gt;
or get it from your keyserver. The key ID is &lt;code&gt;F89B0636&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is part of our ongoing work to secure the communication with our
customers. The previous work was to only allow access to the company
website over SSL.&lt;/p&gt;
&lt;h2&gt;Small Tip if Using Enigmail on Ubuntu Linux&lt;/h2&gt;
&lt;p&gt;If you are getting the error &lt;code&gt;OpenPGP warning, bad passphrase&lt;/code&gt; but
everything is working correctly using the command line. You have most
likely the wrong &lt;code&gt;pinentry&lt;/code&gt; link, going to the &lt;code&gt;qt4&lt;/code&gt; version instead
of the &lt;code&gt;gtk-2&lt;/code&gt; version. You can easily change the link, just run as
root or with &lt;code&gt;sudo&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;alternatives&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pinentry&lt;/span&gt;
&lt;span class="nx"&gt;There&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;alternative&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pinentry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;providing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pinentry&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;Selection&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt;                     &lt;/span&gt;&lt;span class="nx"&gt;Priority&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------------------------------&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pinentry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;qt4&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;auto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pinentry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;manual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pinentry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;qt4&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;manual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;

&lt;span class="nx"&gt;Press&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;enter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;keep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;alternatives&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pinentry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;provide&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pinentry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pinentry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;manual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="misc"/><category term="News"/><category term="Security"/></entry><entry><title>Experimental Data when Predicting Properties</title><link href="https://www.ceondo.com/ecte/2015/04/simultaneous-experimental-data-prediction/" rel="alternate"/><published>2015-04-28T13:00:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-04-28:/ecte/2015/04/simultaneous-experimental-data-prediction/</id><summary type="html">&lt;p&gt;If available, get experimental data for the predicted molecule.&lt;/p&gt;</summary><content type="html">&lt;p&gt;When you are predicting properties on &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt;, the system is
automatically looking in the database for a matching molecule. If a
molecule is available, you directly get the known experimental
property ranges. For example, for the
&lt;a href="https://www.chemeo.com/cid/67-271-7/1-Butene%2C%202-methyl-"&gt;2-methyl-1-Butene&lt;/a&gt;
you get:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.chemeo.com/predict?smiles=C%3DC%28C%29CC" title="2-methyl-1-Butene property prediction"&gt;&lt;img alt="Prediction with experimental values of 2 methyl 1 butene" src="/images/2015/experimental-values-in-prediction-1-butene-2-methyl-joback-crippen.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can experiment yourself starting with &lt;a href="https://www.chemeo.com/predict?smiles=CCCCCO" title="1-Pentanol property prediction"&gt;the predictions of 1-Pentanol&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The next step will be to provide an easy access to the predictions for
similar molecules.&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/><category term="News"/></entry><entry><title>Predict logP and McGowan Volume</title><link href="https://www.ceondo.com/ecte/2015/04/prediction-mcgowan-volume-crippen-logp-chemeo/" rel="alternate"/><published>2015-04-21T17:30:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-04-21:/ecte/2015/04/prediction-mcgowan-volume-crippen-logp-chemeo/</id><summary type="html">&lt;p&gt;Added two new properties in the live prediction.&lt;/p&gt;</summary><content type="html">&lt;p&gt;It is now possible to predict the Octanol/Water partition coefficient
(logP) using the Crippen method and the McGowan volume on &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example, you can run the &lt;a href="https://www.chemeo.com/predict?smiles=CC%28%3DO%29Oc1ccccc1C%28%3DO%29O"&gt;predictions for Aspirin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The planned improvements for the next weeks are the automatic pull of
the experimental data for the molecule being drawn and a list of
similar molecules. The list of similar molecules will be relatively
easy, albeit the need to control the search timeout to keep instant
answers at the possible cost of not updating the list. We will see in
practice the response time effec to still get a &lt;em&gt;desktop&lt;/em&gt; feeling when
using the application.&lt;/p&gt;</content><category term="misc"/><category term="Cheméo"/><category term="News"/></entry><entry><title>10 Second Power Cut in a Refinery</title><link href="https://www.ceondo.com/ecte/2015/04/10-seconds-power-cut-refinery/" rel="alternate"/><published>2015-04-21T13:29:00+02:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-04-21:/ecte/2015/04/10-seconds-power-cut-refinery/</id><summary type="html">&lt;p&gt;What happens if you cut a refinery power supply.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Just around the corner of Céondo offices, we have a big refinery, in
fact, this one of the biggest in Germany, &lt;a href="http://www.bp.com/de_de/germany/ueber-bp/unsere-aktivitaeten/produktion/bp-gelsenkirchen.html"&gt;BP Gelsenkirchen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;End of March, the sky at night was of a beautiful red/orange color.
They suffered a 10 second power cut, this resulted in all the
processes stopping and putting themselves in security and wonderful
flaring. Ok, this is maybe not that great for the environment, but
this makes a nice show.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pure flaring" src="/images/2015/10-power-cut-effect-refinery-flairing.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Normally the refinery, which by the way has a power requirement
equivalent of 400,000 households (back of the envelope calculations,
400,000 x 2,500 kWh/year = 1GWh/year) gets its power from 2 independent
networks. A failure of a power substation of one of the network few
kilometers away from the refinery resulted in a cascade stopping the 2
networks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;After this 10 seconds interruption, it took more than a week to bring back the refinery to full production&lt;/strong&gt;.&lt;/p&gt;</content><category term="misc"/><category term="Oil and Gas"/></entry><entry><title>Easter Holidays</title><link href="https://www.ceondo.com/ecte/2015/04/easter/" rel="alternate"/><published>2015-04-02T15:29:00+02:00</published><updated>2015-04-15T09:49:00+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-04-02:/ecte/2015/04/easter/</id><summary type="html">&lt;p&gt;Changed office hours for Easter.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Spring is here and Easter too. The office will be closed from the 7th
to the 10th of April. It will also be exceptionally closed Monday the
13th of April.&lt;/p&gt;
&lt;p&gt;From the 3rd to the 12th of April, &lt;strong&gt;we will not be available over the
phone&lt;/strong&gt; but per email and it will take up to 72h for you to get an
answer to your non urgent questions. Urgent issues will be taken care
of within 24h as usual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exceptionally, Monday, the 13th of April, nothing will be done&lt;/strong&gt;. Ok,
maybe we will be able to work, but on Monday our office is getting an
upgrade of the phone and internet connection and I must say, I have no
ideas if it will work or not! This is a partial upgrade before getting
a 100Mbps connection later this year.&lt;/p&gt;
&lt;p&gt;So, enjoy a nice Easter break and do not break everything will we
sleep a bit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2015.04.03:&lt;/strong&gt; Nothing left in my inbox! This is nice before a
break. I will check my emails on a regular basis to avoid an overflow
when coming back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2015.04.15:&lt;/strong&gt; Finally back with an internet connection. If
our connection with &lt;a href="https://www.telekom.de"&gt;Telekom&lt;/a&gt; is changed from &lt;em&gt;Universal
ISDN&lt;/em&gt; to &lt;em&gt;IP based&lt;/em&gt; and you get the following errors with your ADSL
router (in my case a Fritz!Box 7270):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Anmeldung beim Internetanbieter ist fehlgeschlagen. 0001 STPR2AU
0000000000000 Zugriff verweigert.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;But you have a stable DSL connection, just request the technical
support to send you a complete new set of connection information
(Zugangsdaten) per email. It will solve the problem immediately.&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Easter Holidays</title><link href="https://www.ceondo.com/ecte/2015/04/easter/" rel="alternate"/><published>2015-04-02T15:29:00+02:00</published><updated>2015-04-15T09:49:00+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-04-02:/ecte/2015/04/easter/</id><summary type="html">&lt;p&gt;Changed office hours for Easter.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Spring is here and Easter too. The office will be closed from the 7th
to the 10th of April. It will also be exceptionally closed Monday the
13th of April.&lt;/p&gt;
&lt;p&gt;From the 3rd to the 12th of April, &lt;strong&gt;we will not be available over the
phone&lt;/strong&gt; but per email and it will take up to 72h for you to get an
answer to your non urgent questions. Urgent issues will be taken care
of within 24h as usual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exceptionally, Monday, the 13th of April, nothing will be done&lt;/strong&gt;. Ok,
maybe we will be able to work, but on Monday our office is getting an
upgrade of the phone and internet connection and I must say, I have no
ideas if it will work or not! This is a partial upgrade before getting
a 100Mbps connection later this year.&lt;/p&gt;
&lt;p&gt;So, enjoy a nice Easter break and do not break everything will we
sleep a bit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2015.04.03:&lt;/strong&gt; Nothing left in my inbox! This is nice before a
break. I will check my emails on a regular basis to avoid an overflow
when coming back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2015.04.15:&lt;/strong&gt; Finally back with an internet connection. If
our connection with &lt;a href="https://www.telekom.de"&gt;Telekom&lt;/a&gt; is changed from &lt;em&gt;Universal
ISDN&lt;/em&gt; to &lt;em&gt;IP based&lt;/em&gt; and you get the following errors with your ADSL
router (in my case a Fritz!Box 7270):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Anmeldung beim Internetanbieter ist fehlgeschlagen. 0001 STPR2AU
0000000000000 Zugriff verweigert.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;But you have a stable DSL connection, just request the technical
support to send you a complete new set of connection information
(Zugangsdaten) per email. It will solve the problem immediately.&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>More Molecules in Cheméo</title><link href="https://www.ceondo.com/ecte/2015/03/more-molecules/" rel="alternate"/><published>2015-03-27T10:15:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-03-27:/ecte/2015/03/more-molecules/</id><summary type="html">&lt;p&gt;We have now more than 70,000 molecules in the index.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt; crawler is working, working, working. It is a
slow crawler, pulling about a page out of the Internet every 3
seconds, respecting all the robots.txt rules not to saturate the
indexed databases. But when you do something slowly, regularily,
without interuptions over a long period of time, it works.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt; is now indexing &lt;strong&gt;more than 70,000 molecules&lt;/strong&gt; and
this will not stop.&lt;/p&gt;
&lt;p&gt;You can take a look at the latest
&lt;a href="https://www.chemeo.com/stats"&gt;index statistics about the chemical properties&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Cheméo"/></entry><entry><title>logP, Octanol/Water Partition Coefficient</title><link href="https://www.ceondo.com/ecte/2015/03/octanol-water-logp-partition-coefficient/" rel="alternate"/><published>2015-03-16T10:15:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-03-16:/ecte/2015/03/octanol-water-logp-partition-coefficient/</id><summary type="html">&lt;p&gt;The predicted logP is now available for nearly all the molecules on Cheméo.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The &lt;em&gt;logP&lt;/em&gt; or &lt;a href="http://en.wikipedia.org/wiki/Partition_coefficient"&gt;Octanol/Water partition coefficient&lt;/a&gt; is now
available for nearly all the molecules on &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;logP&lt;/em&gt; is predicted using the &lt;a href="http://pubs.acs.org/doi/abs/10.1021/ci990307l"&gt;Wildman and Crippen&lt;/a&gt;
method: "&lt;em&gt;Prediction of Physicochemical Parameters by Atomic
Contributions&lt;/em&gt;". You can &lt;a href="http://www.researchgate.net/profile/Gordon_Crippen/publication/220524632_Prediction_of_Physicochemical_Parameters_by_Atomic_Contributions/links/0fcfd4ff23a9f98359000000.pdf"&gt;download the full text as pdf&lt;/a&gt;,
if this is not available anymore, just ask me and I will send it to you.&lt;/p&gt;
&lt;p&gt;For the moment, this method is not available in the
&lt;a href="https://www.chemeo.com/predict?smiles=CCCC"&gt;online prediction too&lt;/a&gt; but it will be added in the future.&lt;/p&gt;
&lt;p&gt;Here is a &lt;a href="https://www.chemeo.com/search?q=logp%3A2.3%3B2.7"&gt;search for molecules with a logP between 2.3 and 2.7&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Cheméo"/></entry><entry><title>Cheméo is Fast</title><link href="https://www.ceondo.com/ecte/2015/02/chemeo-is-fast/" rel="alternate"/><published>2015-02-24T11:15:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-02-24:/ecte/2015/02/chemeo-is-fast/</id><summary type="html">&lt;p&gt;Cheméo, the chemical property database, is back and fast.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The main problem of the chemical database is that they are slow. When
you start to think abouting using a chemical database, you usually
start to think at the same time about pouring yourself a new cup of
coffee or tee.&lt;/p&gt;
&lt;p&gt;When developing &lt;a href="https://www.chemeo.com"&gt;Cheméo&lt;/a&gt;, the rule was simple: &lt;strong&gt;it must be
fast, very fast&lt;/strong&gt;. The end result can be seen on the graph, Google
takes on average of &lt;strong&gt;62ms to download a page&lt;/strong&gt;. This is faster than 99%
of the websites. To achieve this, I even wrote assembly language to
have the fastest similarity search with custom merge and sort
algorithms to bring the results together.&lt;/p&gt;
&lt;p&gt;So, if you need a fast access to a chemical database, just
&lt;a href="https://www.chemeo.com"&gt;try Cheméo&lt;/a&gt;! &lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Cheméo"/></entry><entry><title>Cheméo is Back Online</title><link href="https://www.ceondo.com/ecte/2015/02/chemeo-is-back/" rel="alternate"/><published>2015-02-20T21:15:00+01:00</published><updated>2015-02-24T09:10:00+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-02-20:/ecte/2015/02/chemeo-is-back/</id><summary type="html">&lt;p&gt;Finally, Cheméo is again available.&lt;/p&gt;</summary><content type="html">&lt;p&gt;It took a month longer than planned, but I must say, I am really happy
to have &lt;a href="https://www.chemeo.com"&gt;Cheméo back online&lt;/a&gt;! I am not totally sure about the
stability of the new system as I am experimenting a bit with a new
&lt;a href="https://www.docker.com"&gt;Docker&lt;/a&gt; based deployment system. For the moment, it runs
smoothly.&lt;/p&gt;
&lt;p&gt;A really nice thing for you is that you can run
&lt;a href="https://www.chemeo.com/predict?smiles=CCCC"&gt;physical/chemical property predictions using the Joback Method&lt;/a&gt;
directly in the browser. This is done in real time.&lt;/p&gt;
&lt;p&gt;You can also find &lt;a href="https://www.chemeo.com/similar?smiles=Oc1ccccc1O"&gt;similar molecules to a target&lt;/a&gt;. It is
easy because you simply provide the target as a SMILES. If you can't
remember the SMILES, you can draw the molecule with an easy to use
molecular drawing tool.&lt;/p&gt;
&lt;p&gt;The next things to come are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;adding a bit of copyrights and links to the software used;&lt;/li&gt;
&lt;li&gt;opening the user area to manage your list of molecules;&lt;/li&gt;
&lt;li&gt;opening the access to the regression tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But all in all, I am very happy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Working like a charm, the site is fast and very
responsive. I can now start to deploy the more advanced features.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Cheméo"/></entry><entry><title>Property Plots on Cheméo</title><link href="https://www.ceondo.com/ecte/2015/02/property-plots-chemeo/" rel="alternate"/><published>2015-02-18T14:20:00+01:00</published><updated>2026-06-26T14:25:29+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-02-18:/ecte/2015/02/property-plots-chemeo/</id><summary type="html">&lt;p&gt;Quick visualization with plots of the temperature and pressure dependent properties.&lt;/p&gt;</summary><content type="html">&lt;p&gt;As you can see on the attached screenshot the new &lt;a href="http://chemeo.com"&gt;Cheméo&lt;/a&gt;
will include property plot of the temperature and pressure dependent
properties.&lt;/p&gt;
&lt;p&gt;What is really nice is that you also get the incertainty on the value
on the plot. In this example, it is easy to spot that the ideal heat
capacity of the Propanol was reliably measured.&lt;/p&gt;
&lt;p&gt;Do not worry about the performance impact of such plots, they are
precomputed to keep a very responsive website. If you are still
wondering, the new &lt;a href="http://chemeo.com"&gt;Cheméo&lt;/a&gt; should be open for anonymous use
within the next few days. At the moment, I am mostly cleaning the
style and ensuring it looks nice. All the functionalities are
implemented and the database is ready.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Cheméo"/></entry><entry><title>Update on Cheméo</title><link href="https://www.ceondo.com/ecte/2015/02/update-chemeo-coming-back/" rel="alternate"/><published>2015-02-05T14:20:00+01:00</published><updated>2015-02-13T09:15:00+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-02-05:/ecte/2015/02/update-chemeo-coming-back/</id><summary type="html">&lt;p&gt;Quick update on the relaunch of Cheméo.&lt;/p&gt;</summary><content type="html">&lt;p&gt;If you are wondering, here is a quick log about the relaunch of
&lt;a href="http://chemeo.com"&gt;Cheméo&lt;/a&gt;. You can get the log on the homepage of &lt;strong&gt;Cheméo&lt;/strong&gt;
but some of you are following the news here. So, here you have:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;30 Jan&lt;/strong&gt;: Since the 28, the new crawler is performing pretty well.
We will soon have a fresh dataset to start againg &lt;strong&gt;Cheméo&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2 Feb&lt;/strong&gt;: I guess we have now 90% of the data, the last 10% will most
likely require as long as the first 90%. Not to wait too long, the
parsing will start tonight or tomorrow and the remaining data will be
integrated later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3 Feb&lt;/strong&gt;: The parsing is going well, the next step is merging the
data to build for each compound a record. From this record analysis
and computations are performed. The critical step will be the
refreshing of the record with the data from the crawler.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4 Feb&lt;/strong&gt;: Crawling, parsing and merging are operating very well
together. The pipeline is running smoothly. Next step is performing
the calculations and generating the indexing data. This is a bit
harder. I will most likely start it tomorrow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12 Feb&lt;/strong&gt;: Some quick stats, the parsing of the crawled data takes
about 5h, the merging of all the documents referring to a single
compound into a master document takes 1h something and the extension
and indexing of each master document to generate the &lt;em&gt;ready for
production&lt;/em&gt; document is not yet completed. It has a lot of control
cases and I am clearing them as they come.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;13 Feb&lt;/strong&gt;: The first batch of &lt;em&gt;ready for production&lt;/em&gt; document
completed... Now the fun part is coming, insertion in the index and
&lt;strong&gt;relauch!&lt;/strong&gt; Update: first insert was ok, I will start the validation
on the test server soon.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Cheméo"/></entry><entry><title>New Céondo Website</title><link href="https://www.ceondo.com/ecte/2015/01/new-website/" rel="alternate"/><published>2015-01-12T14:20:00+01:00</published><updated>2015-01-24T11:55:00+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2015-01-12:/ecte/2015/01/new-website/</id><summary type="html">&lt;p&gt;After 7 years, it was time to refresh the company website.&lt;/p&gt;</summary><content type="html">&lt;p&gt;7 years, it has been 7 years since I created this website and it did
not change for the last 7 years. This was really time to get a
redesign.&lt;/p&gt;
&lt;p&gt;Refreshing the identity of the company is not an easy task, because,
if the previous design was here for 7 years, I can expect the new
design to also last 7 years. This resulted in a couple of simple
questions to answer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How would I design a website for 7 years?&lt;/li&gt;
&lt;li&gt;What are the current trends which are going to flourish in the next
  years?&lt;/li&gt;
&lt;li&gt;What is the simplest system to ensure worry free operation for
  another 7 years?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;A New Design and Identity&lt;/h2&gt;
&lt;p&gt;The new design is basically a simpler version of the old design, the
main changes are on the motto of the company. After 7 years, I know
what I do: &lt;strong&gt;Fluid Phase Equilibria, Chemical Properties &amp;amp;
Databases&lt;/strong&gt; and as such, this motto is everywhere on the website. You
can see it at the bottom.&lt;/p&gt;
&lt;p&gt;This results in a simplification of the logo, I no longer have the
&lt;em&gt;Software for the Scientific World&lt;/em&gt; line at the bottom. I took the
opportunity to rotate the star of the logo to have the top edge
totally horizontal, this has a better rendering at small size as it is
possible to be pixel perfect.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Original Céondo Logo" src="https://www.ceondo.com/images/2015/v1.logo.png"&gt; &lt;img alt="New Céondo Logo" src="https://www.ceondo.com/images/2015/v2.logo.png"&gt;&lt;/p&gt;
&lt;p&gt;Basically, a bit simpler but still &lt;em&gt;the same&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;A New System to Design the Website&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Mobile first&lt;/strong&gt;, if you are building websites now, the trend is
definitely to provide a mobile optimized version of your website. I
must say, for the moment, &lt;em&gt;mobile browsing of ceondo.com is not my
priority&lt;/em&gt;, but it should be possible to provide it in the future
without problems.&lt;/p&gt;
&lt;p&gt;This why I am using &lt;a href="http://sass-lang.com/"&gt;SASS&lt;/a&gt;. This is basically a layer on top of
the traditional CSS and it allows me to have cleaner style sheets and
take into accounts the different browser versions easily. A simple
example is that you can have variables in your CSS files, for example,
for the color of a border and you can reuse the variable everywhere. &lt;/p&gt;
&lt;h2&gt;A New System to Publish the Website&lt;/h2&gt;
&lt;p&gt;No software on the server, just plain HTML files build from a
canonical source of content using the
&lt;a href="http://docs.getpelican.com/"&gt;Pelican&lt;/a&gt; software. Since my first
website in 1994, plain HTML pages work very well and never break. The
canonical source of content is a simple stack of utf-8 encoded simple
text files looking like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Céondo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Website&lt;/span&gt;
&lt;span class="n"&gt;Tags&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;News&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Design&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sr"&gt;/images/2015/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ceondo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;png&lt;/span&gt;
&lt;span class="n"&gt;Summary&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;After&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;was&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;website&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;been&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;website&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;did&lt;/span&gt;
&lt;span class="n"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;was&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;really&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;redesign&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Etc&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Very simple to manage and generate. It was very easy to import the old
website into this &lt;em&gt;format&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The added benefit is that the website is extremely secure. The website
is also now delivered over an encrypted connection (SSL).&lt;/p&gt;
&lt;h2&gt;Still Some Work&lt;/h2&gt;
&lt;p&gt;I still need to do a couple of things, this includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;automatically generate the work reports from my time tracker for my
  customers. They of course should be protected with a login/password.&lt;/li&gt;
&lt;li&gt;get a protected file download area for each customer.&lt;/li&gt;
&lt;li&gt;some old blog posts have lost some pictures.&lt;/li&gt;
&lt;li&gt;improve the home and services pages, I am not totally satisfied with
  them.&lt;/li&gt;
&lt;li&gt;pushing new content on a regular basis.&lt;/li&gt;
&lt;li&gt;get the new years card script to work again (not yet sure how I will
  do it).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The styling and the content will also need to be improved with the
time based on user feedback and my personal taste.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Design"/></entry><entry><title>Emails Up and Down</title><link href="https://www.ceondo.com/ecte/2014/08/issues-with-emails/" rel="alternate"/><published>2014-08-25T07:59:26+02:00</published><updated>2014-08-25T07:59:26+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2014-08-25:/ecte/2014/08/issues-with-emails/</id><summary type="html">&lt;p&gt;Just for your information, my emails have been bouncing a bit in the past few …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Just for your information, my emails have been bouncing a bit in the past few weeks. I am not sure why as I haven't changed my email provider nor my email settings. If you haven't received an answer for something important, I may have simply not received your email. Be kind enough to send it again. Thank you! Loïc&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>Back from being away with some work to do</title><link href="https://www.ceondo.com/ecte/2013/08/back-and-backup/" rel="alternate"/><published>2013-08-29T09:25:30+02:00</published><updated>2013-08-29T09:25:30+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2013-08-29:/ecte/2013/08/back-and-backup/</id><summary type="html">&lt;p&gt;Backup, backup, backup. During my stay away, one of the drives of one of the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Backup, backup, backup. During my stay away, one of the drives of one of the nodes in my cluster failed. The problem is that it was an half backed failure, with sporadic failures leading to corruption. So, I lost my ability to communicate by emails during the last 3 weeks. Not fun because from my point of view I was able to send the emails, but most of the emails ended up in a computer black hole. &lt;/p&gt;
&lt;p&gt;If you communicated with me during the last 3 weeks by email, please accept my sincere apologizes. If you do not get an answer to your inquiry within about 8 days, please send your email again, my emails are hosted by an independent provider, but the DNS server is hosted on the cluster, so the hard drive failure may have affected DNS resolution and thus email transfer.&lt;/p&gt;
&lt;p&gt;Everything should be back to normal by Friday the 6th of September. &lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Sysadmin"/></entry><entry><title>End of Life of Indefero Hosting</title><link href="https://www.ceondo.com/ecte/2013/07/end-of-life-indefero-hosting/" rel="alternate"/><published>2013-07-05T12:56:39+02:00</published><updated>2013-07-05T12:56:39+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2013-07-05:/ecte/2013/07/end-of-life-indefero-hosting/</id><summary type="html">&lt;p&gt;Reminder, the end of life of Indefero hosting was reached on the first of July …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Reminder, the end of life of Indefero hosting was reached on the first of July 2013. You had 1 year to adapt, so I hope you took the time to effectively adapt. &lt;strong&gt;The hosting will be effectively shut down the 15th of July 2013&lt;/strong&gt;. If you need a PostgreSQL backup of your forge data on top of the JSON backup you get from your account, please contact me as soon as possible.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Indefero downtime, routing issue</title><link href="https://www.ceondo.com/ecte/2013/05/indefero-routing-issue/" rel="alternate"/><published>2013-05-15T11:53:27+02:00</published><updated>2013-05-15T12:03:30+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2013-05-15:/ecte/2013/05/indefero-routing-issue/</id><summary type="html">&lt;p&gt;Wed May 15 11:53:09 UTC 2013: Hello, we have a routing issue between …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wed May 15 11:53:09 UTC 2013: Hello, we have a routing issue between the frontend and the backend database of Indefero. The database is safe, nothing to worry, this is just that the frontend cannot connect to the database server like if suddenly a firewall was cutting the connection. We are investigating.&lt;/p&gt;
&lt;p&gt;Wed May 15 13:54:26 CEST 2013: Our provider is having &lt;a href="http://travaux.ovh.com/?do=details&amp;amp;id=8634"&gt;an issue&lt;/a&gt;, we keep an eye on it.&lt;/p&gt;
&lt;p&gt;Wed May 15 13:55:39 CEST 2013: Ping between the machines went from 5 ms to back under 1 ms, it looks like our provider is doing something.&lt;/p&gt;
&lt;p&gt;Wed May 15 14:02:45 CEST 2013: Our provider changed some configuration of their routers and they are now observing the situation, Indefero is back online.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Reminder: Indefero Hosting End of Life June 30, 2013</title><link href="https://www.ceondo.com/ecte/2013/05/indefero-end-of-life-hosting/" rel="alternate"/><published>2013-05-06T08:04:13+02:00</published><updated>2013-05-06T08:04:13+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2013-05-06:/ecte/2013/05/indefero-end-of-life-hosting/</id><summary type="html">&lt;p&gt;&lt;strong&gt;Reminder:&lt;/strong&gt; The &lt;a href="http://www.indefero.net"&gt;Indefero hosting&lt;/a&gt; will stop June 30 this year, yes, 2013. You were informed …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Reminder:&lt;/strong&gt; The &lt;a href="http://www.indefero.net"&gt;Indefero hosting&lt;/a&gt; will stop June 30 this year, yes, 2013. You were informed about a year ago, so I hope you had time to migrate. &lt;/p&gt;
&lt;p&gt;If you are a Subversion user, &lt;a href="https://www.assembla.com/home"&gt;Assembla&lt;/a&gt; can import your dump of your repositories. The daily Subversion dumps are available in your &lt;a href="https://indefero.net/account/"&gt;account area&lt;/a&gt;. They also offer Git hosting. If you are using Git only, you have 1000's of offers.&lt;/p&gt;
&lt;p&gt;Of course you can install your own version of Indefero and go ahead with a self hosted solution as Indefero is a free software.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Update of the PostgreSQL server for Indefero</title><link href="https://www.ceondo.com/ecte/2013/04/indefero-postgresql-update/" rel="alternate"/><published>2013-04-11T07:27:08+02:00</published><updated>2013-04-11T07:34:41+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2013-04-11:/ecte/2013/04/indefero-postgresql-update/</id><summary type="html">&lt;p&gt;Thu Apr 11 07:27:29 UTC 2013: There is a pretty serious update of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Thu Apr 11 07:27:29 UTC 2013: There is a pretty serious update of PostgreSQL to be done for security reasons. &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; will be done for a couple of minutes the time to update the server. I am sorry this is an unplanned update.&lt;/p&gt;
&lt;p&gt;Thu Apr 11 07:30:54 UTC 2013: The slave has been updated and is correctly picking up the updates from master, now going to update the master. From the slave update sequence you can expect about 2 minutes downtime of Indefero.&lt;/p&gt;
&lt;p&gt;Thu Apr 11 07:33:36 UTC 2013: The master has been updated, the effective downtime was less than 20 seconds.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Electrical failure, Indefero down</title><link href="https://www.ceondo.com/ecte/2013/03/indefero-electrical-down/" rel="alternate"/><published>2013-03-06T16:23:25+01:00</published><updated>2013-03-06T16:23:25+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2013-03-06:/ecte/2013/03/indefero-electrical-down/</id><summary type="html">&lt;p&gt;Wed Mar  6 16:21:45 UTC 2013, we have an electrical issue, for the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wed Mar  6 16:21:45 UTC 2013, we have an electrical issue, for the moment Indefero is down, it will come up as soon as the electrical issue is resolved. More &lt;a href="http://travaux.ovh.com/?do=details&amp;amp;id=8191"&gt;details will soon be available from our provider&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Indefero down at the moment</title><link href="https://www.ceondo.com/ecte/2013/01/indefero-down-rbx4-issues/" rel="alternate"/><published>2013-01-21T14:23:26+01:00</published><updated>2013-01-21T14:35:52+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2013-01-21:/ecte/2013/01/indefero-down-rbx4-issues/</id><summary type="html">&lt;p&gt;&lt;strong&gt;Mon Jan 21 14:22:30 UTC 2013&lt;/strong&gt; A &lt;a href="http://travaux.ovh.com/vms/index_rbx4.html"&gt;large array of servers are down …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Mon Jan 21 14:22:30 UTC 2013&lt;/strong&gt; A &lt;a href="http://travaux.ovh.com/vms/index_rbx4.html"&gt;large array of servers are down in our datacenter&lt;/a&gt;. Saddly, the main database server of Indefero is down too. The backup server is running ok and is up-to-date. We are expecting feedback from &lt;a href="http://www.ovh.co.uk"&gt;OVH&lt;/a&gt; to assess if we need to switch over the slave or if we can expect the main server to come back fast enough.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mon Jan 21 14:24:25 UTC 2013&lt;/strong&gt; It was fast, &lt;a href="http://travaux.ovh.com/?do=details&amp;amp;id=7928"&gt;power supply issue for RBX4&lt;/a&gt;. Still waiting for more information. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mon Jan 21 14:35:20 UTC 2013&lt;/strong&gt; Everything is up again, sorry for the inconvenience.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Servers Down at the Moment</title><link href="https://www.ceondo.com/ecte/2012/10/server-down-vlan-issue/" rel="alternate"/><published>2012-10-15T09:22:48+02:00</published><updated>2012-10-15T10:47:19+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-10-15:/ecte/2012/10/server-down-vlan-issue/</id><summary type="html">&lt;p&gt;Our provider &lt;a href="http://travaux.ovh.com/?do=details&amp;amp;id=7463"&gt;has some issues&lt;/a&gt;. Not so fun, the servers are down and I hope …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Our provider &lt;a href="http://travaux.ovh.com/?do=details&amp;amp;id=7463"&gt;has some issues&lt;/a&gt;. Not so fun, the servers are down and I hope they will come up again as soon as possible. Basically, we have a split on the internal network, some servers can talk to each other, some cannot. Very annoying because it makes split brain situation. All the data are safe, but we have to wait until this is solved (and they are doing it manually). &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Everything up again, down-time of approximatively 30 minutes, I hope it was at the time of your coffee break.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="Sysadmin"/></entry><entry><title>Céondo Ltd, 5 Years of Activity</title><link href="https://www.ceondo.com/ecte/2012/10/ceondo-5-year/" rel="alternate"/><published>2012-10-02T09:21:08+02:00</published><updated>2012-10-02T09:21:08+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-10-02:/ecte/2012/10/ceondo-5-year/</id><summary type="html">&lt;p&gt;5 years, the time is flying. In May 2007, I created &lt;strong&gt;Céondo Ltd&lt;/strong&gt;, in September …&lt;/p&gt;</summary><content type="html">&lt;p&gt;5 years, the time is flying. In May 2007, I created &lt;strong&gt;Céondo Ltd&lt;/strong&gt;, in September 2007, active trading started and in August 2008, I started to pay myself a regular salary. Wonderful time and even better time to come, after 5 years of working hand in hand with the industry, I finally know where I can make a change, where I can really add value and make the work of the chemical and process engineers easier, safer and faster. &lt;/p&gt;
&lt;p&gt;Many thanks to all my customers up to now and of course, all the people I have been in contact with during these 5 years, you gave me a lot and I hope you have the feeling I gave you a lot too. The next 5 years are going to be fun!&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>CAPE-OPEN Meeting in Lyon</title><link href="https://www.ceondo.com/ecte/2012/09/cape-open-europe-conference/" rel="alternate"/><published>2012-09-24T11:57:25+02:00</published><updated>2012-09-24T11:57:25+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-09-24:/ecte/2012/09/cape-open-europe-conference/</id><summary type="html">&lt;p&gt;I happily participated at the &lt;a href="http://co-lan.org/News/Y12/news-1205.htm"&gt;CAPE-OPEN European Conference in Lyon&lt;/a&gt;. I sadly missed the special …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I happily participated at the &lt;a href="http://co-lan.org/News/Y12/news-1205.htm"&gt;CAPE-OPEN European Conference in Lyon&lt;/a&gt;. I sadly missed the special interest group meetings at the end of the conference as I kind of skipped them in my planning (I though one had to be part of the SIG to participate but they were open to everybody).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://co-lan.org/"&gt;CAPE-OPEN&lt;/a&gt; is a great set of standardized interfaces (API) — mostly COM but also CORBA in theory — to allow a unit operation model or a thermodynamic model to be used in nowadays a large array of simulation software. The API is slowly growing to cover nearly all the needs in the process and chemical engineering area. &lt;/p&gt;
&lt;p&gt;Some companies have shown how a single implementation of a model can then be used in several simulation software all used within the same company. In large chemical companies, for historical reasons and to avoid a dependency on a single vendor, they tend to run several simulation software to do basically &lt;em&gt;the same thing but not exactly&lt;/em&gt;. &lt;/p&gt;
&lt;p&gt;In some other cases, I am a bit more sceptical, for example, if you have only one simulation tool in house and the tool is providing a clear and simple interface (for example the Fortran UAS in PRO/II) using CAPE-OPEN would require both mastering Fortran and C++ to implement a COM wrapper. This may not be the best choice depending on the in-house know-how.&lt;/p&gt;
&lt;p&gt;As for any technology, you need to have a pragmatic approach but seeing an open standard used every day a bit more in the industry is always positive news. I am looking forward to do a bit more in the field while keeping a pragmatic approach, sometimes simple good old Fortran is better.&lt;/p&gt;</content><category term="misc"/><category term="PRO/II"/><category term="Programming"/><category term="Modelling"/><category term="Oil and Gas"/><category term="Chemicals"/><category term="Architecture"/><category term="Simulation"/></entry><entry><title>Indefero Hosting Will Keep Going</title><link href="https://www.ceondo.com/ecte/2012/09/indefero-hosting-keeps-going/" rel="alternate"/><published>2012-09-13T10:40:59+02:00</published><updated>2012-09-13T10:40:59+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-09-13:/ecte/2012/09/indefero-hosting-keeps-going/</id><summary type="html">&lt;p&gt;Very good news, after a lot of discussion (because I want to be sure of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Very good news, after a lot of discussion (because I want to be sure of the quality of the offer) the &lt;a href="http://indefero.net"&gt;Indefero&lt;/a&gt; hosting offer will continue as it will be taken over by a small companies already used to work with hosting data and user information under strict security rules. The transition will be totally transparent for the current customers and users. I will keep you informed.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Indefero Hosting Stopping Dec 2012 to June 2013</title><link href="https://www.ceondo.com/ecte/2012/08/indefero-hosting-stop/" rel="alternate"/><published>2012-08-02T09:56:32+02:00</published><updated>2012-08-02T10:02:59+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-08-02:/ecte/2012/08/indefero-hosting-stop/</id><summary type="html">&lt;p&gt;Front matters: This is the email I sent to all the current users of the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Front matters: This is the email I sent to all the current users of the hosting offer.&lt;/p&gt;
&lt;p&gt;Dear Indefero Users and Customers,&lt;/p&gt;
&lt;p&gt;today is not an easy email I am sending you, this email is to announce
you the wind down of the Indefero hosting platform. The Indefero
hosting will be stopped at the following dates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;free hosting, 31th of December 2012 (in 5 months);&lt;/li&gt;
&lt;li&gt;paid hosting, 30th of June 2013 (in 11 months). If your renewal date
  ends before the date, you will get free hosting until the end.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To help you in the changes, the period of transition is as long as
possible. Now that you know the meat of the subject, let me provide
you with the whys, how and details. But first, stopping a service is
not an easy task, it is especially hard because you, as customers,
trusted me to provide long term high quality service and by stopping
the service I am breaking this trust. For me, it is also hard because
it means that I failed to correctly predict the future.&lt;/p&gt;
&lt;p&gt;Thanks a lot for the trust you had in using Indefero and please accept
my sincere apologizes for not providing you continued services for
another couple of years.&lt;/p&gt;
&lt;p&gt;If you paid a renewal or a new forge in the past 45 days, I can issue
you a full refund. In this case I will ask you to migrate out before
the end of the year. 45 days is the limit of the banking system.&lt;/p&gt;
&lt;h1&gt;How to Save your Data&lt;/h1&gt;
&lt;p&gt;Simple, login here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.indefero.net/account/"&gt;https://www.indefero.net/account/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and download the backups (down the page). You get everything related
to your forge and the data are compatible with Indefero, that is, you
can install Indefero on your server and import the data.&lt;/p&gt;
&lt;h1&gt;How to Make a Successful Migration&lt;/h1&gt;
&lt;p&gt;Login in your account:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.indefero.net/account/"&gt;https://www.indefero.net/account/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click on the "configure your forge" link:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.indefero.net/account/bp/"&gt;https://www.indefero.net/account/bp/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and update the personal domain to use a domain you fully control. If
you are working for the foobar.com company, put something like
code.foobar.com and get a CNAME record in your DNS pointing
code.foobar.com to yourforge.indefero.net. Then, start asking people
to use code.foobar.com to access your forge. After a while, nobody
will use the indefero.net address and you will have full control over
your forge.&lt;/p&gt;
&lt;p&gt;The next step is to setup your own Indefero instance and import the
data from the hosted forge, then switch the DNS to point to your own
Indefero instance. &lt;/p&gt;
&lt;p&gt;The end result is a migration without downtime and without disturbing
your end users.&lt;/p&gt;
&lt;h1&gt;Tools to Make a Successful Migration&lt;/h1&gt;
&lt;p&gt;In October, you will get ready to use Amazon EC2 images which will
allow you to do nearly "One Click" migration of your data from the
hosted platform to your own Indefero instance. With an EC2 micro
instance, it will cost you about $15 per month to run your own
Indefero instance. I will also work with the current providers of
Debian packages to be sure you can easily setup and import your
Indefero forge on a fresh Debian system.&lt;/p&gt;
&lt;h1&gt;Why Stopping Indefero Hosting?&lt;/h1&gt;
&lt;p&gt;Because of focus, when I started Céondo Ltd, I had not really a clear
picture of where I wanted to go and how, now, I know and the key is
"Science", that is, I will fully focus on scientific software and
consulting. In the last months, I was able secure 2 to 3 years of
consulting pipeline in science, this is a clear indication that this
is the way to go, a specialization in an extremely technical area
where the barrier to entry is very high.&lt;/p&gt;
&lt;h1&gt;How Will It Affect the Indefero Software?&lt;/h1&gt;
&lt;p&gt;Surprisingly, I expect it to be positively affected. The last year I
have been slowing down my involvement in the software because changing
the software would also mean for me, applying the changes to 3000+
forges on a system not designed in the first place to accomodate so
many forges. I was afraid of the consequence of a bad upgrade at such
scale. &lt;/p&gt;
&lt;p&gt;The time used to manage the hosting will in part be redirected to
improve the software and the migration tools will also be used in
parallel to allow us to perform automated testing of Indefero. We will
be able to start an EC2 micro instance, test and stop.&lt;/p&gt;
&lt;p&gt;The Indefero community is very active with an increasing number of
users and packages for nearly all the current Linux distributions, the
current goal is to have the Indefero packages distributed officially
by all the main Linux distributions to ensure long term support. You
will soon get the distribution specific packaging scripts be part of
the source code of Indefero. This is critical for the long term
support of Indefero and will help testing on a larger scale.&lt;/p&gt;
&lt;h1&gt;Alternatives to Running your Own Forge&lt;/h1&gt;
&lt;p&gt;The code hosting space is crowded, so crowded that it is hard to
recommend someone. First, the real question is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;how critical is your code? Can you accept to have it hosted by a
  third party? Of course you currently have it hosted by a third party
  right now, but it may be a good time to rethink this question. I
  think it is critical enough to have full control over it, this is
  why I gave full control with CNAME, backup and OSS dump
  compatibility to you when providing Indefero hosting. I could not
  provide something I could not use personally.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;then of course, you need to define what you want in terms of
  functionalities, version management software (Git, Subversion,
  Mercurial, etc.) and the contractual constraints (hosting location
  within/outside the US, price, owned by a big/small company
  independent/partially owned by venture capitalists). This is not
  simple, I have seen an increase of the number of forge creations
  since GitHub took venture capital money on board. So, it looks like
  some of you do not like to be dependent on venture capitalist
  controlled companies. You have the time to think about it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I had only one service to recommend, I would recommend Pikacode
under the lead of Benjamin Jordan. They have been hosting code
repositories for a long time and have been active contributors to
Indefero. I trust them and they are real system administrators, used
to managed some of the biggest website in France, saturating Gbps of
bandwith during big events. They know their job very well.&lt;/p&gt;
&lt;p&gt;Here is the "inline" advertizing from Benjamin for you:&lt;/p&gt;
&lt;p&gt;Pikacode.com offers Git and Mercurial repositories hosting. Formerly
knows as Intuxication, thousands of repositories have been created by
our users since 2008. Pikacode goals are simple : easy, sleek and fast
code hosting.  We offer you 90 days of free trial for unlimited
private repositories and collaborators with the following voucher :
HELLO-PIKA. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://pikacode.com/"&gt;http://pikacode.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If some of you can recommend code hosting companies, just let me know. 
Note that Pikacode also offer free public repositories.&lt;/p&gt;
&lt;h1&gt;What is Next?&lt;/h1&gt;
&lt;p&gt;I will setup in September/October a migration website:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.indefero.net/migration/"&gt;http://www.indefero.net/migration/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;this will be your portal to have everything you need to get a
successful migration without disturbing your users and losing your
data. It will be updated with the latest information, tutorials,
possible alternative offers — basically, everything to help you.&lt;/p&gt;
&lt;h1&gt;Again Thank You&lt;/h1&gt;
&lt;p&gt;At the end, I can only thank you for your trust and the bit of travel
around the Sun we did together. I am proud of what was achieved with
Indefero and I am honored you trusted me, I am also sure you will find
a good way forward.&lt;/p&gt;
&lt;p&gt;Best regards,
loïc&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Update of Indefero SSL Certificate</title><link href="https://www.ceondo.com/ecte/2012/07/indefero-ssl-renew/" rel="alternate"/><published>2012-07-30T06:44:59+02:00</published><updated>2012-07-31T07:41:15+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-07-30:/ecte/2012/07/indefero-ssl-renew/</id><summary type="html">&lt;p&gt;The [Indefero|http://indefero.net] SSL certificate expires today, it will be renewed during the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The [Indefero|http://indefero.net] SSL certificate expires today, it will be renewed during the afternoon, normally the update is performed without downtime. If downtime, it should a couple of seconds the time to restart the web server.&lt;/p&gt;
&lt;p&gt;Update 2012.07.30 11:30 UTC: The renewal procedure is on the way, it should be finished in a couple of hours to have the real update at the server level done just afterwards. &lt;/p&gt;
&lt;p&gt;Update 2012.07.31 07:40 UTC: The certificates are now updated and valid for another year.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Creation of New Forges Suspended While Updating the Website</title><link href="https://www.ceondo.com/ecte/2012/06/creation-suspended/" rel="alternate"/><published>2012-06-25T12:12:50+02:00</published><updated>2012-06-25T12:12:50+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-06-25:/ecte/2012/06/creation-suspended/</id><summary type="html">&lt;p&gt;Please accept our sincere apologizes but the creation of new &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; forges will be suspended …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Please accept our sincere apologizes but the creation of new &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; forges will be suspended this week while the website will be updated. The website will be updated by the end of the week (30th of June 2012) but the exact dates when the website will be updated is not yet known. If you want to create a forge, please try doing it by Wednesday the 27th as the update will most likely take place Thursday/Friday.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Indefero Database Failover</title><link href="https://www.ceondo.com/ecte/2012/05/database-failover/" rel="alternate"/><published>2012-05-25T11:54:56+02:00</published><updated>2012-05-25T11:54:56+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-05-25:/ecte/2012/05/database-failover/</id><summary type="html">&lt;p&gt;I am sorry for the unscheduled downtime this morning, Friday 25th of May around 8 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I am sorry for the unscheduled downtime this morning, Friday 25th of May around 8 am UTC. A scheduled kernel upgrade of the server went not as expected. The kernel upgrade did went correctly on the slave, including reboot and resync, but the master failed to come up again. For data safety reasons, we performed a backup of the slave before promoting it as master and switching the application to use the new master. This backup is what took a bit more time than expected and resulted in the large downtime.&lt;/p&gt;
&lt;p&gt;What is next?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Need to promote a new slave and get the master to logship to it, this will again force a small downtime of the master database the time to pickup the new configuration.&lt;/li&gt;
&lt;li&gt;Need to be a bit more proactive in announcing the issues. I setup a small list for the very active users, but a know central place to publish updates would be better.&lt;/li&gt;
&lt;li&gt;Need a regular backup of the slave to not have to perform it under pressure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I will keep you informed. Sorry for the annoyance, sometimes issues happen and this one took me by surprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Reviewing the logs, the combination of a VM + Hardware node restart, including KVM upgrade is most likely the culprit. &lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="Deployment"/></entry><entry><title>They use Indefero: Elveos</title><link href="https://www.ceondo.com/ecte/2012/01/they-use-indefero-elveos/" rel="alternate"/><published>2012-01-31T13:17:10+01:00</published><updated>2012-01-31T13:17:10+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-01-31:/ecte/2012/01/they-use-indefero-elveos/</id><summary type="html">&lt;p&gt;A small notice to inform you that &lt;a href="https://elveos.org/"&gt;Elveos.org&lt;/a&gt; is using &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://elveos.org/"&gt;Elveos.org&lt;/a&gt; is …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;A small notice to inform you that &lt;a href="https://elveos.org/"&gt;Elveos.org&lt;/a&gt; is using &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://elveos.org/"&gt;Elveos.org&lt;/a&gt; is a crowdfunding website for open source software. You are a free software developer? Elveos gives you a way to get paid for your work. You are a free software user? Elveos let you fund the features you need.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It reminds me KickStarter but more open. It is very nice to see offers targeting the OSS community.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="News"/></entry><entry><title>Firefox is gone, Chrome is here, who is next?</title><link href="https://www.ceondo.com/ecte/2012/01/firefox-gone-chrome-here-whos-next/" rel="alternate"/><published>2012-01-31T09:44:47+01:00</published><updated>2012-01-31T09:44:47+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-01-31:/ecte/2012/01/firefox-gone-chrome-here-whos-next/</id><summary type="html">&lt;p&gt;Can you remember the old days? Life was simple, everything worth
something was simple &lt;a href="http://en.wikipedia.org/wiki/Netscape_Navigator"&gt;Netscape …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Can you remember the old days? Life was simple, everything worth
something was simple &lt;a href="http://en.wikipedia.org/wiki/Netscape_Navigator"&gt;Netscape Navigator&lt;/a&gt;. Then Microsoft decided
that the web was important and they took over the world and took a
nap. Reborn from the ashes of Netscape, Mozilla brought us
&lt;a href="http://www.mozilla.org/en-US/firefox/fx/"&gt;Firefox&lt;/a&gt;. But then, Google decided that the web was too important
not to have their own browser, here we are, Chrome is the new leader.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome: 50.92%&lt;/li&gt;
&lt;li&gt;Firefox/Geco: 22.60%&lt;/li&gt;
&lt;li&gt;Safari: 17.54%&lt;/li&gt;
&lt;li&gt;Android: 6.12%&lt;/li&gt;
&lt;li&gt;Opera: 1.64%&lt;/li&gt;
&lt;li&gt;Internet Explorer, less than 1%...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://cdn.ceondo.com/bloge/FirefoxIsGoneGoogleAnalyticsLarge.png"&gt;&lt;img alt="Chrome is the new leader" src="http://cdn.ceondo.com/bloge/FirefoxIsGoneGoogleAnalyticsSmall.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click on the image for a larger version. These are the results of a
nearly 100% traffic burst from &lt;a href="http://news.ycombinator.com/"&gt;Hacker News&lt;/a&gt; this WE. They are the
trend setters as early adopters. They are going to jump on the next
&lt;em&gt;Chrome&lt;/em&gt;, &lt;em&gt;Firefox&lt;/em&gt;, &lt;em&gt;IE&lt;/em&gt;, &lt;em&gt;Netscape Navigator&lt;/em&gt; when it will come. But
here, for the first time I wonder. Who could be the next? Can it be
that we reached the goal of the Mozilla Fondation of a competitive
field, where several players are taking the lead based on their
merits? Could it be that the fragmentation resulting of the different
form factors is the reason we will never see again a 80% market share
for a single vendor? I hope so!&lt;/p&gt;</content><category term="misc"/><category term="News"/></entry><entry><title>A router crashed, the websites have been slowing down</title><link href="https://www.ceondo.com/ecte/2012/01/router-crashed-card/" rel="alternate"/><published>2012-01-27T12:04:47+01:00</published><updated>2012-01-27T12:05:57+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-01-27:/ecte/2012/01/router-crashed-card/</id><summary type="html">&lt;p&gt;If you noticed a slow down in the past minutes, one of the routers of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;If you noticed a slow down in the past minutes, one of the routers of our provider had some issues. This slowed down the services for a short period of time. As you can see on the following graph, suddenly our GET requests to monitor the response time of the services went bong. 20 second response time, this is the equivalent of dead...&lt;/p&gt;
&lt;p&gt;&lt;img alt="Router down" src="http://cdn.ceondo.com/network/routeur-probleme.png"&gt;&lt;/p&gt;
&lt;p&gt;But I must say, this is where I am really pleased by our provider, &lt;a href="http://www.ovh.com"&gt;OVH&lt;/a&gt;. They immediately explained what was going on: &lt;a href="http://travaux.ovh.com/?do=details&amp;amp;id=6311"&gt;a card of the router crashed hard or died&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="News"/><category term="Cheméo"/><category term="Sysadmin"/></entry><entry><title>Instability of Cheméo</title><link href="https://www.ceondo.com/ecte/2012/01/instability-chemeo/" rel="alternate"/><published>2012-01-18T21:01:46+01:00</published><updated>2012-01-18T21:01:46+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-01-18:/ecte/2012/01/instability-chemeo/</id><summary type="html">&lt;p&gt;At the moment, we move a bit the VMs (Virtual Machines) powering up our PaaS …&lt;/p&gt;</summary><content type="html">&lt;p&gt;At the moment, we move a bit the VMs (Virtual Machines) powering up our PaaS (Platform as a Service). The platform has one virtual machine receiving the code updates and then the &lt;a href="http://www.chemeo.com"&gt;Cheméo&lt;/a&gt; application is updated from it. The application itself is running on another VM behind the web server. The work we do is to disconnect the web server from the application. So, at the end we get :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 VM with the web server answering your requests;&lt;/li&gt;
&lt;li&gt;2 VMs with the Cheméo application servers — they are doing the work like pulling the data out of the database;&lt;/li&gt;
&lt;li&gt;1 VM hosting the code and building the new application code which is then deployed on the previous 2 VMs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This seams a bit complicated but the advantage is that it is very easy to add new application server VM to handle more requests. &lt;/p&gt;
&lt;p&gt;Anyway, the split requires moving component here and there and synchronizing the data, this does not work always as expected and this why, one thing you can expect for sure is a bit of downtime during the next few days.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Cheméo"/><category term="Sysadmin"/><category term="Architecture"/></entry><entry><title>Migration of Indefero's Backup Server</title><link href="https://www.ceondo.com/ecte/2012/01/indefero-backup-server-migration/" rel="alternate"/><published>2012-01-13T09:33:31+01:00</published><updated>2012-01-13T17:03:04+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2012-01-13:/ecte/2012/01/indefero-backup-server-migration/</id><summary type="html">&lt;p&gt;For your information, we are in the process of migrating &lt;a href="http://www.indefero.net"&gt;Indefero's&lt;/a&gt; main backup server on …&lt;/p&gt;</summary><content type="html">&lt;p&gt;For your information, we are in the process of migrating &lt;a href="http://www.indefero.net"&gt;Indefero's&lt;/a&gt; main backup server on our new &lt;a href="http://notes.ceondo.com/ganeti/"&gt;infrastructure&lt;/a&gt;. The new infrastructure has been running for a while and we are satisfied with the stability. &lt;/p&gt;
&lt;p&gt;We are going to do at the same time a server upgrade, moving away from &lt;a href="http://www.ubuntu.com"&gt;Ubuntu&lt;/a&gt; and back to the roots, that is &lt;a href="http://www.debian.org"&gt;Debian&lt;/a&gt;. Once the backup server will be up and running smoothly, the main server will follow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Got a bit of instability at the same time... upgrading here and there an old server is difficult. Time to get the migration to a better system completed!&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="News"/></entry><entry><title>Cheméo Now on our PaaS</title><link href="https://www.ceondo.com/ecte/2011/12/chemeo-on-pass/" rel="alternate"/><published>2011-12-31T13:31:03+01:00</published><updated>2011-12-31T13:31:03+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-12-31:/ecte/2011/12/chemeo-on-pass/</id><summary type="html">&lt;p&gt;As a nice end of the year present, &lt;a href="http://www.chemeo.com"&gt;Cheméo&lt;/a&gt; is now running on &lt;a href="http://www.ceondo.com"&gt;Céondo&lt;/a&gt;'s …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As a nice end of the year present, &lt;a href="http://www.chemeo.com"&gt;Cheméo&lt;/a&gt; is now running on &lt;a href="http://www.ceondo.com"&gt;Céondo&lt;/a&gt;'s private Platform as a Service (PaaS). This is a huge change compared to the previous system. After the normal period of ironing out the system, the infrastructure will be more robust and flexible to allow fast iterative development. The goal is simple, &lt;a href="http://www.chemeo.com"&gt;Cheméo&lt;/a&gt; must become the reference for chemical engineering data. We are not targeting biological activity but only chemical and process engineers. 2012 is going to be fun.&lt;/p&gt;</content><category term="misc"/><category term="News"/><category term="Cheméo"/><category term="Sysadmin"/><category term="Chemicals"/><category term="Architecture"/></entry><entry><title>Launching Cheméo's Labs</title><link href="https://www.ceondo.com/ecte/2011/12/labs-chemeo/" rel="alternate"/><published>2011-12-21T08:21:50+01:00</published><updated>2011-12-21T08:21:50+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-12-21:/ecte/2011/12/labs-chemeo/</id><summary type="html">&lt;p&gt;Few days ago &lt;a href="http://labs.chemeo.com"&gt;Cheméo's laboratories&lt;/a&gt; went life. The labs are running software experiments in the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Few days ago &lt;a href="http://labs.chemeo.com"&gt;Cheméo's laboratories&lt;/a&gt; went life. The labs are running software experiments in the field of chemical and physical properties. They are kind of sandboxes where ideas can be tried without disturbing the main &lt;a href="http://www.chemeo.com"&gt;Cheméo website&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;The labs are running on top of &lt;a href="http://www.ceondo.com"&gt;Céondo's&lt;/a&gt; private Platform as a Service (PaaS). This platform will soon host all the services we deliver, from our products &lt;a href="http://www.chemeo.com"&gt;Cheméo&lt;/a&gt; and &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; to simpler websites like &lt;em&gt;ceondo.com&lt;/em&gt;. In case of, a status website will be kept independently using another technology with a different provider. I will soon write a bit more about this private PaaS.&lt;/p&gt;
&lt;p&gt;These are exciting times, the best to close 2011 and start 2012.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="Science"/><category term="Cheméo"/><category term="Deployment"/><category term="Operation"/><category term="Cloud"/></entry><entry><title>Use the DNS to Announce Your ZeroMQ Services</title><link href="https://www.ceondo.com/ecte/2011/12/dns-zeromq-services/" rel="alternate"/><published>2011-12-11T11:37:45+01:00</published><updated>2011-12-13T11:29:01+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-12-11:/ecte/2011/12/dns-zeromq-services/</id><summary type="html">&lt;p&gt;If you are building your private PaaS and use
&lt;a href="http://www.zeromq.org"&gt;ZeroMQ&lt;/a&gt; you will end up with …&lt;/p&gt;</summary><content type="html">&lt;p&gt;If you are building your private PaaS and use
&lt;a href="http://www.zeromq.org"&gt;ZeroMQ&lt;/a&gt; you will end up with the issue of
distributing the ZMQ end points of your services to your
application. You can use a broker approach, but then, what if the
broker is moved to another node? It means that you always end up with
a situation where at least a minimal set of service entries need to be
distributed to your applications and workers.&lt;/p&gt;
&lt;p&gt;The simplest approach is &lt;code&gt;rsync&lt;/code&gt; and a text file. Just put everything
in a text file and copy it to all the servers. But then you need to
manage the list of servers and be sure that each server get the latest
version — even if you started the new server at the time you
distributed the new version... This starts to be complicated, this is
why the simplest approch is simply using the DNS infrastructure with
the &lt;code&gt;TXT&lt;/code&gt; record.&lt;/p&gt;
&lt;p&gt;If you are using &lt;a href="http://cr.yp.to/djbdns.html"&gt;djbdns&lt;/a&gt;, you can simply
add lines like this in your data file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;myapp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;net&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;192&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;86400&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;myservice.s.myapp.net:192.168.1.123\0729976;192.168.1.124\0729976:3600&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;otherservice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;myapp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;net&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;192&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;123&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;0729976&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;192&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;124&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;0729976&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;3600&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now, the day you want to access the &lt;code&gt;myservice&lt;/code&gt; from your application,
you simply get the DNS &lt;code&gt;TXT&lt;/code&gt; record for the corresponding service. &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dns_get_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;myservice.s.myapp.net&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DNS_TXT&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;Array&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Array&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;myservice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;myapp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TXT&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;192.168.1.123&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9976&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;192.168.1.124&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9976&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Array&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;192.168.1.123&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9976&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;192.168.1.124&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9976&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;IN&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;86400&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It is simple, robust and allows you to benefit from all the work done
on the DNS — for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you can access it from any languages (PHP, Python, Java, etc.) and the libraries are usually very robust;&lt;/li&gt;
&lt;li&gt;you can announce a different end point depending of the source ip, for example I am using this to announce the testing end points for the services running on the testing subnet;&lt;/li&gt;
&lt;li&gt;your DNS server is nice, you can normally extract a lot of stats from it;&lt;/li&gt;
&lt;li&gt;with several DNS servers, your system is robust.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course this is not to be used as a high speed distributed database,
but to distribute service information, this is working perfectly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://news.ycombinator.com/item?id=3340077"&gt;Someone&lt;/a&gt; nicely pointed out that a &lt;code&gt;SRV&lt;/code&gt; record can be used too. Totally right, but in my particular case, I store a JSON string with more than just the end point definition, this is why I need the &lt;code&gt;TXT&lt;/code&gt; record flexibility. But if &lt;code&gt;SRV&lt;/code&gt; fits your requirements, you should jump for it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; For your information, this is effectively to power &lt;a href="http://www.chemeo.com" title="Chemical and Physical Properties of Molecules"&gt;Cheméo&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="Sysadmin"/><category term="Scaling"/><category term="Architecture"/><category term="Cloud"/><category term="Distributed Systems"/></entry><entry><title>Improving the Response Time of Indefero</title><link href="https://www.ceondo.com/ecte/2011/12/indefero-performance/" rel="alternate"/><published>2011-12-02T17:35:14+01:00</published><updated>2011-12-02T17:35:14+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-12-02:/ecte/2011/12/indefero-performance/</id><summary type="html">&lt;p&gt;Improving the speed of &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; is challenging as it requires managing a lot of moving …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Improving the speed of &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; is challenging as it requires managing a lot of moving parts, from the git/subversion backends to the database. This week, I have been working on setting up &lt;a href="http://graphite.wikidot.com"&gt;Graphite&lt;/a&gt; for the infrastructure. This is working pretty well and provides graph like the following one.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Current response time of Indefero" src="http://www.ceondo.com/media/files/img/indefero/indefero-response-time.png"&gt;&lt;/p&gt;
&lt;p&gt;This graph is extracted from a special Nginx log format which includes the time needed for Nginx to send the response back to the client. The only thing missing is that when I see a spike, I need a way to directly access the corresponding logs to figure out why. At the moment, there are no integrations between these metrics and the logs. &lt;/p&gt;
&lt;p&gt;To improve a system, one needs to know the current state. &lt;a href="http://graphite.wikidot.com"&gt;Graphite&lt;/a&gt; is a bit hard to setup, but afterwards, it is really easy to push data in. A really nice tool.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="Performance"/></entry><entry><title>The Problem with Performance Logging</title><link href="https://www.ceondo.com/ecte/2011/11/performance-logging-debugging/" rel="alternate"/><published>2011-11-30T08:32:02+01:00</published><updated>2011-11-30T08:32:02+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-11-30:/ecte/2011/11/performance-logging-debugging/</id><summary type="html">&lt;p&gt;To run a service like &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt;, you need to log a long list of metrics …&lt;/p&gt;</summary><content type="html">&lt;p&gt;To run a service like &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt;, you need to log a long list of metrics to follow the load on the system, find the bottlenecks and predict the future needed capacity. To do that, a very powerful system is &lt;a href="http://graphite.wikidot.com/start"&gt;Graphite&lt;/a&gt;, the only issue is that it is only storing and graphing numerical values. Of course, you cannot do different, but the problem is: &lt;strong&gt;correlation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Basically: &lt;strong&gt;Once I see that every now and then component is not performing well, how can I drill down in my data to find the reason?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://graphite.wikidot.com/start"&gt;Graphite&lt;/a&gt; tells you: this day from 14:05 to 14:07, the rendering of a git tree view was slow. Good to know, the following question is of course: why? If you store more metrics, you can maybe find that I/O was slow on the server X, you can graph together many metrics and visually correlate them. But then, why was I/O slow? &lt;/p&gt;
&lt;p&gt;At this point, you need to go one level deeper and take a look at the logs coming from server X from 14:05 to 14:07. This can bring you up to the application level where you figure out that a client repeatedly accessed a page which triggered a &lt;code&gt;git&lt;/code&gt; command with a large output, thus loading the server. &lt;strong&gt;But to do that you need to access the logs too&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So, &lt;a href="http://graphite.wikidot.com/start"&gt;Graphite&lt;/a&gt; is wonderful, but what I need is that after identifying the subsystem and time range where we have an issue, being able to simply scan through all the corresponding logs in the time range. This would be a kind of integration between Graphite and &lt;a href="http://graylog2.org/"&gt;Graylog2&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;My problem now is that Graylog2 is overkill. That is, it tries to provide full text search on the logs, the result is that it requires a very big machinery where I just need aggregation of the logs and the equivalent of a time base search range with a filtering by component, for example &lt;code&gt;webapp.backend.git&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This annoys me, I do not want to build a system by myself.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="Programming"/><category term="Sysadmin"/><category term="Scaling"/><category term="Architecture"/><category term="Performance"/><category term="Data Visualization"/><category term="Deployment"/><category term="Operation"/><category term="Data Mining"/><category term="Data Analysis"/></entry><entry><title>Small downtime of Indefero</title><link href="https://www.ceondo.com/ecte/2011/11/short-downtime-8-minutes/" rel="alternate"/><published>2011-11-16T12:06:14+01:00</published><updated>2011-11-16T12:06:14+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-11-16:/ecte/2011/11/short-downtime-8-minutes/</id><summary type="html">&lt;p&gt;Around 11:14 UTC today &lt;a href="http://travaux.ovh.com/?do=details&amp;amp;id=6062"&gt;one switch of the private network&lt;/a&gt; went down and required …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Around 11:14 UTC today &lt;a href="http://travaux.ovh.com/?do=details&amp;amp;id=6062"&gt;one switch of the private network&lt;/a&gt; went down and required a reboot. The problem has been solved but this resulted in a downtime of about 8 minutes. &lt;/p&gt;
&lt;p&gt;Note that this is the issue with the new database server, if the link between the application server and the database server goes down, then the service is down. I will contact the support staff of OVH as in my understanding, they had a kind of redundant system to not rely on a single router. &lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="Performance"/></entry><entry><title>Database Migration Starting &amp; Done</title><link href="https://www.ceondo.com/ecte/2011/11/database-migration/" rel="alternate"/><published>2011-11-11T09:35:05+01:00</published><updated>2011-11-11T11:34:56+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-11-11:/ecte/2011/11/database-migration/</id><summary type="html">&lt;p&gt;Hello, just to let you know that today November 11, the database migration is starting …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hello, just to let you know that today November 11, the database migration is starting. You can check this blog post for updates. Here are the steps I will be performing:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;test of the web application software upgrade. &lt;strong&gt;09:55 UTC - Done.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;shutdown of the PHP processes to prevent update of the database. &lt;strong&gt;09:56 UTC - Done.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;force the creation of a PostgreSQL WAL to have consistent backup.  &lt;strong&gt;09:57 UTC - Done.&lt;/strong&gt; Now waiting for the log to be shipped to the warm standby. &lt;strong&gt;10:00 UTC - Done.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;start of the warm standby as a new master. &lt;strong&gt;10:04 UTC - Done.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;check that the new master is consistent. &lt;strong&gt;10:21 UTC - Done.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;update the web application configuration to access the new master. &lt;strong&gt;10:23 UTC - Done.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;start the PHP processes again. &lt;strong&gt;10:25 UTC - Done.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;immediately clone the new master to have it log ship on another warm standby. &lt;strong&gt;10:37 UTC rsync in progress&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;10:52 UTC - Done&lt;/strong&gt;, with a warm standby in another datacenter nicely getting the updates from the master.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a bit of cascading but it will always keep several version of the database running and it will always be possible to revert to the original DB server in case of problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Last update:&lt;/strong&gt; The system is now insanely more responsive, pleasure to use is back! If you notice anything unusual, please let me know as soon as possible.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/></entry><entry><title>Welcome Decane a New SSD Powered Database Server</title><link href="https://www.ceondo.com/ecte/2011/11/welcome-decane-ssd-database-server/" rel="alternate"/><published>2011-11-08T07:28:52+01:00</published><updated>2011-11-10T19:21:44+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-11-08:/ecte/2011/11/welcome-decane-ssd-database-server/</id><summary type="html">&lt;p&gt;The &lt;a href="http://chemeo.com/cid/28-417-8"&gt;Decane&lt;/a&gt; is a simple molecule but also the name of our new database server …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The &lt;a href="http://chemeo.com/cid/28-417-8"&gt;Decane&lt;/a&gt; is a simple molecule but also the name of our new database server. It is a 24GB RAM/240GB SSD server with a lot of power to provide blazing fast data processing. In the next few days it will go through the standard &lt;a href="http://notes.ceondo.com/ganeti/"&gt;Ganeti setup&lt;/a&gt; and the &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; PostgreSQL database will be migrated over. Depending of the performance, we may migrate more database VMs on it.&lt;/p&gt;
&lt;p&gt;This is the first time I am putting a server with SSD drives in production. I have been an heavy user of SSD drives for my desktop/laptop systems in the past two years and I must say, I will never go back to traditional drives, but of course, the amount of data stored is not the same for desktop and for a server.&lt;/p&gt;
&lt;p&gt;So, yes, performance increase of Indefero is on the way!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Decane just joined the Ganeti cluster:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# gnt-node list
Node             DTotal  DFree MTotal MNode MFree Pinst Sinst
node1.ceondo.net   2.7T   2.2T  11.8G  4.0G  8.2G     4     0
node2.ceondo.net   2.7T   2.4T  11.8G  2.9G  9.2G     5     0
node3.ceondo.net 194.3G 194.3G  23.6G  147M 23.4G     0     0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Update 2011.11.09:&lt;/strong&gt; Base backup of the postgresql database is on the way, this is a huge rsync job and this is of course slowing down the system. Please be patient... thank you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2011.11.09 20:00 UTC:&lt;/strong&gt; Ok, the new server is now acting as a warm standby for the database, this will allow fast "failover" to the new database server after the testing period.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2011.11.10 10:28 UTC:&lt;/strong&gt; The main application server will be unavailable for a short amount of time the time to connect it to its virtual LAN to communicate directly with the warm standby over a private network. Done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2011.11.10 11:46 UTC:&lt;/strong&gt; Now that the connection at the switch level is supporting the VLAN, it needs to be configured at the host and vm level. This will again trigger short downtime here and there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2011.11.10 12:50 UTC:&lt;/strong&gt; Ok, now setting up a second warm standby which will take over the current one on the new SSD powered server once it will start to act as master. Done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2011.11.10 13:34 UTC:&lt;/strong&gt; Ok, things are running as expected, around 21:00 UTC today, Indefero will be stopped for about 15 minutes, this will ensure that we have the warm standby with the latest version. The warm standby will be brought online as master and then the web app will connect to the new master on the new server. Immediately, I will start to populate the new warm standby. Basically a bit of cascading. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2011.11.10 19:20 UTC:&lt;/strong&gt; Too tired to do the cascading, it is never good to do so when not really fresh. I will perform it tomorrow, ok it will be during the day, but it will be only about 15 minutes of downtime. So expect a downtime of maximum 30 minutes between 09:00 and 12:00 UTC on November 11.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="News"/><category term="Sysadmin"/><category term="Scaling"/><category term="Data"/><category term="Performance"/><category term="Deployment"/><category term="Operation"/></entry><entry><title>Major Upgrade of the Hosted Indefero Version</title><link href="https://www.ceondo.com/ecte/2011/10/major-indefero-upgrade/" rel="alternate"/><published>2011-10-11T08:42:16+02:00</published><updated>2011-10-11T08:42:16+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-10-11:/ecte/2011/10/major-indefero-upgrade/</id><summary type="html">&lt;p&gt;In the past 24h, I have been testing the latest developer version of &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; on …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In the past 24h, I have been testing the latest developer version of &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; on &lt;a href="http://projects.ceondo.com"&gt;projects.ceondo.com&lt;/a&gt; and I must say, I am pretty pleased by the stability of everything. Congratulations to all the developers involved in getting this done. The only problem is that it requires some heavy migrations and update of the database storage and I must say, I do not like that. &lt;/p&gt;
&lt;p&gt;So, some read only tests will be done tonight to check how this can be done without disturbing you too much and if things are going well, the upgrade will be performed. The upgrade can take a very long time. Yes, upgrading 3000 databases is a bit painful. &lt;/p&gt;
&lt;p&gt;Anyway, if you take at the new version on &lt;a href="http://projects.ceondo.com"&gt;projects.ceondo.com&lt;/a&gt;, I suppose you will accept this small annoyance as it will bring you a lot of goodies.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="News"/></entry><entry><title>Network Maintenance</title><link href="https://www.ceondo.com/ecte/2011/09/vlan-maintenance/" rel="alternate"/><published>2011-09-27T07:45:35+02:00</published><updated>2011-09-27T07:45:58+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-09-27:/ecte/2011/09/vlan-maintenance/</id><summary type="html">&lt;p&gt;Today, the 27 of September, around 23h00 Paris/Berlin time some of the background processes …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Today, the 27 of September, around 23h00 Paris/Berlin time some of the background processes of &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; will not run. &lt;a href="http://www.ovh.co.uk"&gt;Our provider&lt;/a&gt; is performing some &lt;a href="http://travaux.ovh.net/?do=details&amp;amp;id=5817"&gt;network maintenance&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Basically, they are rewiring our private network, which means that the background communication between the components will be cut. This also means that some website which have data routed over the private network will not function. &lt;strong&gt;The total maintenance time is expected to be about 15 minutes&lt;/strong&gt;. Thank you for your comprehension.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="News"/><category term="Architecture"/></entry><entry><title>Amazon is too Fast at Delivering Making Kindle Books too Expensive</title><link href="https://www.ceondo.com/ecte/2011/09/amazon-too-fast-for-the-kindle/" rel="alternate"/><published>2011-09-23T12:46:53+02:00</published><updated>2011-09-23T12:53:02+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-09-23:/ecte/2011/09/amazon-too-fast-for-the-kindle/</id><summary type="html">&lt;p&gt;Here in Germany, &lt;a href="http://www.amazon.de"&gt;Amazon&lt;/a&gt; is extremely fast at
delivering the books I order. In fact …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Here in Germany, &lt;a href="http://www.amazon.de"&gt;Amazon&lt;/a&gt; is extremely fast at
delivering the books I order. In fact, they are too fast to make Kindle
version of the books interesting.&lt;/p&gt;
&lt;p&gt;As a book customer, here is my experience with Amazon when I buy a
physical book, the ones I can store in my personal library:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tuesday evening, read something about an interesting book, go on &lt;strong&gt;amazon.de&lt;/strong&gt;, order the book.&lt;/li&gt;
&lt;li&gt;Wednesday morning, small email telling me the delivery is on the way.&lt;/li&gt;
&lt;li&gt;Thursday morning, the bell rings, the postman gives me the book.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Average elapsed time: less than 36h&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Now, the thing is, at home, we have hundreds of books, maybe in fact
thousands, but especially, &lt;strong&gt;I always have 3 to 4 books on the way&lt;/strong&gt;,
that is, I am usually never without a book to read. So, the incentive
to read right now something is pretty low, waiting 36h is not an issue
at all.&lt;/p&gt;
&lt;p&gt;Now, when looking at the options I have from Amazon when I want to buy
a fairly old but popular book:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cost of different versions" src="http://www.ceondo.com/media/files/img/kindle-too-expensive-against-paperback.png"&gt;&lt;/p&gt;
&lt;p&gt;Basically, the Kindle edition is at €7 and the paperback edition at
€10. So why buying a Kindle edition?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full content of the book.&lt;/li&gt;
&lt;li&gt;Start to read right now.&lt;/li&gt;
&lt;li&gt;Nicely virtually packed in digital form.&lt;/li&gt;
&lt;li&gt;I save €3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But do I lose doing so?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The content of the book is only licensed to me, I do not own it really.&lt;/li&gt;
&lt;li&gt;Not possible to share the book with some friends without a Kindle.&lt;/li&gt;
&lt;li&gt;Not possible to write in the book.&lt;/li&gt;
&lt;li&gt;Not the same satisfaction at the end of reading the book.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This last one is interesting, I have been reading a couple of books
with my Kindle and surprisingly, at the end, the feeling of
accomplishment and satisfaction is just not really there. It feels
awkward being at the end of the book. With a real book, I can feel the
end, close the book and looking at the physical item, reflects about
the reading experience. &lt;strong&gt;The physical item is embodying the reading experience, it is an anchor, I see it next to my bed and it triggers ideas, makes me automatically reconnect with the story without even opening it.&lt;/strong&gt; With the Kindle, I just see a Kindle, with so many memories as &lt;a href="http://ceondo.com/ecte/2010/09/productivity-conkeror-instapaper-kindle"&gt;I combine my Kindle with Instapaper&lt;/a&gt; that at the end, it is emotionless. But emotions are my triggers to remember things.&lt;/p&gt;
&lt;p&gt;So, at the moment, the delivery speed of Amazon combined with all the loss
of the Kindle edition are tilting the balance to buy the paperback
edition.&lt;/p&gt;
&lt;p&gt;And you, are you reading eBooks? Or do you still prefer the old paper
way delivered to you in a snap by the incredible Amazon
infrastructure? Also, do you have the same satisfaction, reading a
good eBook or the same as paperback?&lt;/p&gt;
&lt;p&gt;My request for Amazon: Give me the Kindle for 2€ on top of the paperback edition and cancel it once you receive the paperback delivery notification. Yes, I would pay more but I would have the best of both worlds, directly.&lt;/p&gt;</content><category term="misc"/><category term="Marketing"/><category term="Productivity"/><category term="Performance"/></entry><entry><title>The Git Survey 2011 is Open</title><link href="https://www.ceondo.com/ecte/2011/09/git-survey-2011/" rel="alternate"/><published>2011-09-19T18:48:34+02:00</published><updated>2011-09-19T18:48:34+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-09-19:/ecte/2011/09/git-survey-2011/</id><summary type="html">&lt;p&gt;&lt;strong&gt;The &lt;a href="https://www.survs.com/survey/VCAGZA8CT5"&gt;Git User's Survey 2011&lt;/a&gt;&lt;/strong&gt; is now up!&lt;/p&gt;
&lt;p&gt;Please devote a few minutes of your …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;The &lt;a href="https://www.survs.com/survey/VCAGZA8CT5"&gt;Git User's Survey 2011&lt;/a&gt;&lt;/strong&gt; is now up!&lt;/p&gt;
&lt;p&gt;Please devote a few minutes of your time to fill out the simple
questionnaire; it'll help the Git community understand your needs,
what you like about Git (and what you don't), and overall help us
improve it.&lt;/p&gt;
&lt;p&gt;The survey will be open from &lt;em&gt;5 September&lt;/em&gt; to &lt;em&gt;3 October 2011&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The results will be published at &lt;a href="http://git.wiki.kernel.org/index.php/GitSurvey2011"&gt;GitSurvey2011&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Thanks a lot for your help!&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="Programming"/></entry><entry><title>Busy in the Background</title><link href="https://www.ceondo.com/ecte/2011/09/busy/" rel="alternate"/><published>2011-09-19T07:54:25+02:00</published><updated>2011-09-19T07:54:25+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-09-19:/ecte/2011/09/busy/</id><summary type="html">&lt;p&gt;It may seems that we are relatively quiet at the moment and yes we
are …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It may seems that we are relatively quiet at the moment and yes we
are, in fact we are like little bees, working hard without making
noise.&lt;/p&gt;
&lt;p&gt;Maybe you are not aware, but the hosted &lt;a href="http://www.indefero.net"&gt;Indefero&lt;/a&gt; offer is
running a single Indefero installation for the 3000 forges we are
hosting. What is happening is that when you request a page of a forge,
the domain is matched against a list and automatically the
configuration is set to use the right repositories, the right
database, etc.&lt;/p&gt;
&lt;p&gt;When the system was setup, it was following the: "Do the simplest
thing which can possibly work." Nice, but now we are suffering the
pain of growth as the simplest way to go was te build everything in a
pretty monolithic system. Ouch.&lt;/p&gt;
&lt;p&gt;So, we are &lt;a href="http://notes.ceondo.com"&gt;hard at work&lt;/a&gt; on getting a new system setup to
break everything in more manageable components. This is a long haul
project, but this is needed to recover our agility in getting new
versions online several times a day.&lt;/p&gt;
&lt;p&gt;The idea is to do all the changes without changing anything, that is,
everything will be done without changing the system for you, then once
the migration to components will be completed, new features will be
rolled in. Small incremental changes are better on the long run.&lt;/p&gt;
&lt;p&gt;This year Fall and Winter are going to be very busy seasons.&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="Design"/></entry><entry><title>Thank You Barclays Wealth</title><link href="https://www.ceondo.com/ecte/2011/09/barclays-wealth/" rel="alternate"/><published>2011-09-02T11:33:11+02:00</published><updated>2011-09-02T11:33:11+02:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-09-02:/ecte/2011/09/barclays-wealth/</id><summary type="html">&lt;p&gt;It may seems a bit strange as a consulting company to openly say thank you …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It may seems a bit strange as a consulting company to openly say thank you to our bank, but after 4 years of banking with &lt;a href="http://www.barclayswealth.com/"&gt;Barclays Wealth&lt;/a&gt;, I will never go back to another bank for a UK business. &lt;strong&gt;Céondo Ltd&lt;/strong&gt;, even so it is based in UK, is managed a bit differently than the standard company. &lt;/p&gt;
&lt;p&gt;As I am French, moving from one country to another on a semi regular basis, I needed a way to have a company with a stable address. My choices were simple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;France as I am French;&lt;/li&gt;
&lt;li&gt;Germany as I was living in Germany at that time;&lt;/li&gt;
&lt;li&gt;UK because I already created a UK limited back in 2000.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;France was ruled out pretty fast, basically you need to travel every single day of the year to some kind of authorities to get some paper work done. Running a French company from outside France is a recipe for disaster. Germany, with the traditional GmbH was also ruled out, you need to live in Germany to setup one without too many problems, but the main problem is that if you are defacto sole manager of the company and if a patent troll hits you, your company is dead, but the state will hit you again in the civil court to prove that you made an error and all your personal belongings will be used to feed the troll. I suppose the idea behind that was to prevent abuse of the GmbH status, but for me, in the software business in some way or another, this is a no-no.&lt;/p&gt;
&lt;p&gt;So, the friendly UK was left. My accountant advised me to contact Barclays Wealth. It took me more than a week of hard work to get all the papers in order with recommendations from my bankers in France, Germany and Denmark, but at the end, Céondo Ltd got an account with them.&lt;/p&gt;
&lt;p&gt;Best decision ever. &lt;strong&gt;In 4 years, they were always available, nice, polite and efficient&lt;/strong&gt;. You never hit a call center, you always speak to UK people, they answer the phone within 30 seconds without the need to go through an insane dispatching process. Yes they are expensive, but you know, I would happily pay even more to keep them. &lt;/p&gt;
&lt;p&gt;So, I heavily recommend them, it is not easy to go in but it is worth it.&lt;/p&gt;</content><category term="misc"/><category term="Business"/></entry><entry><title>Welcoming Bayer As New Customer</title><link href="https://www.ceondo.com/ecte/2011/03/bayer/" rel="alternate"/><published>2011-03-15T13:47:54+01:00</published><updated>2011-03-15T13:47:54+01:00</updated><author><name>Loïc d'Anterroches</name></author><id>tag:www.ceondo.com,2011-03-15:/ecte/2011/03/bayer/</id><summary type="html">&lt;p&gt;This is a great pleasure to welcome &lt;a href="http://www.bayer.de"&gt;Bayer&lt;/a&gt; as a new customer. Bayer being big …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This is a great pleasure to welcome &lt;a href="http://www.bayer.de"&gt;Bayer&lt;/a&gt; as a new customer. Bayer being big, in this case, I am talking about &lt;em&gt;Bayer Technologies and Services&lt;/em&gt; also known as &lt;em&gt;BTS&lt;/em&gt;. &lt;/p&gt;
&lt;p&gt;&lt;img alt="Bayer" src="http://www.ceondo.com/media/files/img/bayer-kreuz.gif"&gt;&lt;/p&gt;</content><category term="misc"/><category term="InDefero"/><category term="News"/><category term="Science"/></entry></feed>