All posts by jordi

Reading log 2013

Littérature

  1. L’étranger (Camus)
  2. Ta carrière est fi-ni-e (Zoé Shepard)
  3. Black Box Beatles (Claro)
  4. Absolument dé-bor-dée (Zoé Shepard)
  5. Lonesome Dove Tome 1 (Larry McMurtry)
  6. Lonesome Dove Tome 2 (Larry McMurtry)
  7. Apache (Guillaume Guéraud)
  8. Destinées et autres nouvelles (Irène Némirovsky)
  9. La femme à modeler (Emilie de Turckheim)
  10. La vengeance du piano (Joël Schmidt)
  11. Un ciel assombri d’étoiles (Jabbar Yassin Hussin)
  12. Chroniques martiennes (Ray Bradbury)
  13. Tout ce que j’aimais (Siri Hustvedt)

BD

  1. L’homme sans rêve (Joseph Safieddine et Olivier Bonhomme)
  2. Irène et les clochards (Florent Ruppert, Jérôme Mulot)
  3. Courtney Crumrin et les Choses de la nuit (Ted Naifeh)
  4. Courtney Crumrin et l’Assemblée des sorciers (Ted Naifeh)
  5. Courtney Crumrin et le Royaume de l’ombre (Ted Naifeh)
  6. Courtney Crumrin : Portrait du sorcier en jeune homme (Ted Naifeh)
  7. L’orme du caucase (Taniguchi et Utsumi)
  8. Strangehaven vol 1 : Arcadia (Gary Spencer Millide)
  9. Strangehaven vol 2 : Confrérie (Gary Spencer Millide)
  10. Strangehaven vol 3 : Complots (Gary Spencer Millide)
  11. Un ciel radieux (Jiro Taniguchi)
  12. Silence (Didier Comès)
  13. L’archiviste (Schuiten & Peeters)
  14. L’écho des cités (Schuiten & Peeters)
  15. L’étrange cas du Dr. Abraham (Schuiten & Peeters)
  16. Pourquoi je déteste Saturne (Kyle Baker)
  17. Courtney Crumrin et les Effroyables Vacances (Ted Naifeh)
  18. Virages (Laurent Vicomte)
  19. Courtney Crumrin et l’Apprentie Sorcière (Ted Naifeh)
  20. Courtney Crumrin Hors Série, T2 : La Ligue des Gentlemen Ordinaires (Ted Naifeh)
  21. Torso: A True Crime Graphic Novel (Brian Michael Bendis, Marc Andreyko)
  22. Ainsi se tut Zarathoustra (Nicolas Wild)

Méta-lectures

  1. De Bibliotheca (Umberto Eco)
  2. Lettres à mon libraire (Plusieurs auters)
  3. Laissez-les lire (Geneviève Patte)

Essais

  1. La décroissance, une idée pour demain (Timothée Duverger)
  2. Une nouvelle conscience pour un monde en crise. Vers une civilisation de l’empathie (Jeremy Rifkin)
  3. Le potager fait de la résistance (Jean-Michel Groult)
  4. 15 bricolages écologiques et malins (Roland Dutrey)
  5. Comment faire des économies en préservant ma planète (Marlène Gerland, Guy Courtois)
  6. Les menteurs. Pourquoi ont-ils peur de la vérité? (Michel Fize)
  7. La richesse, la valeur et l’inestimable (Jean-Marie Harribey)
  8. Bon pour la casse. Les déraisons de l’obsolescence programmée (Serge Latouche)
  9. Je suis prof et je désobéis (Bastien Cazals)
  10. Propos d’un agitateur (Ricardo Flores Magon)
  11. J’affirme. Manifeste pour une insurrection du sens (Roland Castro)
  12. D’un nouveau complot contre les industriels (Stendhal)
  13. La paresse comme vérité effective de l’homme (Kazimir Melevitch)
  14. Le crépuscule du devoir – L’éthique indolore des nouveaux temps démocratiques (Gilles Lipovetsky)
  15. Makers. La nouvelle révolution industrielle (Chris Anderson)
  16. La neutralité de l’internet. Un enjeu de communication (Valérie Schafer et Hervé Le Crosnier)
  17. Les 10 commandements de l’ère numérique (Douglas Rushkoff)
  18. La bataille du logiciel libre (Perline, Thierry Noisette)
  19. Pour un humanisme numérique (Milad Doueihi)
  20. Une tête bien faite (Tony Buzan)
  21. La manipulation (que sais-je?) (Fabrice d’Almeida)
  22. La chimie des sentiments (Bernard Sablonnière)

Madeleine challenge 2014

2013 était l’année Marcel pour plusieurs raisons (au moins 21). J’en retiens une : cent ans sont passés depuis la publication du premier volume d’À la recherche du temps perdu.

J’ai dans ma bibliothèque depuis moins de cent ans les sept romans qui composent cette œuvre (en trois tomes) et je n’ai jamais réussi à dépasser la page 30 du premier.

Les raisons de cette procrastination sont nombreuses, notamment le manque de temps, car longtemps, je me suis couché de bonne heure.

Mais il y a des moments où un homme doit prendre ses responsabilités. Le moment est venu pour moi. Je me suis lancé le défi de lire les 7 romans en 2014.

J’en suis déjà à la page 60 du premier, ce qui est encourageant : 100% de plus que lors des tentatives précédentes.

La version dégradée du défi consiste à terminer Du côté de chez Swann avant 2019, année de la publication de la version modifiée de celui-ci et aussi de la publication d’À l’ombre des jeunes filles en fleurs.

Footnotes:

1

Peut-être 3 si on considère les 100 ans de l’obtention du baccalauréat par Pagnol comme un grand moment de l’histoire. Ou à défaut de ça, les 40 ans de l’Oscar de Marlon Brando pour Le parrain.

Comments welcome!

One of the many (for some definition of many) readers of this blog pointed me out that he tried to post a comment on a recent post and could not find how to do it.

Indeed, it seems that since I upgraded WordPress, comments were disabled by default.

This is now solved. Comments still go through moderation if you are posting for the first time, though.

OTB++11

Modern C++

I have just recently had a look at the last C++ ISO standard (known as C++11). I was not aware of all the fancy features that have been included in the language.

Some of the most interesting features are:

  • auto,
  • range-based for loops,
  • general constant expressions,
  • uniform initialisation,
  • type aliases,
  • decltype,
  • variadic templates,
  • type safe threading,
  • user-defined literals,
  • move semantics

There are also new containers and algorithms in the STL.

During the end of the year break, I spent some time reading and watching on line presentations about the new C++. I recommend watching Bjarne Stroustrup’s keynote at Going Native 2012 (link) and Scott Meyer’s talk at Going Native 2013 where he even anticipates some C++14 features (link).

Stroustrup introduces his talk by saying:

I use C++11 freely. Examples include auto, general constant expressions, uniform initialisation, type aliases, type safe threading, and user-defined literals. C++11 features are only just starting to appear in production compilers, so some of my suggestions are conjecture. Developing a “modern style,” however, is essential if we don’t want to maintain newly-written 1970s and 1980s style code in 2020.

After listening at him, I realised that the most easy to use features alone could make C++ programming much more fun and simple. Since I have spent some time in the last 2 years flirting with functional and dynamic typed (or at least with type inference) languages (Scheme, Clojure, Python, SML), I wanted to see how using C++11 affects the style of OTB code.

As usual, GCC has been the first compiler to make available these new features (closely followed by Clang). C++11 is available in recent versions of GCC using -std=c++11. So I recompiled OTB with this flag and started modifying some of the Software Guide examples using C++11 features.

All in all, I can say that these features make OTB code shorter, clearer and maybe safer. I report some examples here.

Examples

auto

The auto keyword allows to declare variables without explicitly stating their type and puts this burden on the compiler. This is not dynamic typing, this is type inference and nothing changes in terms of what the compiler generates. So you can write:

auto x = sqrt(2.0);

and the type of x will be deduced from the return value type of sqrt. You can also do this:

auto x=0;
auto y=0.0;

and x will be of type int and y will be of type double. If you want to force other types, you have to use the classical declarations.

How to benefit from auto when using OTB? A common pattern in OTB code is to instantiate a smart pointer using the New() class method. Sometimes, we just want to create one object of a given type and we do this:

typedef otb::ImageFileReader<ImageType> ReaderType;
ReaderType::Pointer reader = ReaderType::New();

typedef otb::ImageFileWriter<ImageType> WriterType;
WriterType::Pointer writer = WriterType::New();

in order to create a reader and a writer. That is, since type names are long we define a type using typedef and then we use it twice, once for Pointer and once for New.

Using auto, we can reduce the boilerplate like this:

auto reader = otb::ImageFileReader<ImageType>::New();
auto writer = otb::ImageFileWriter<ImageType>::New();

The same applies for filters, for which usually we only use one instance:

typedef itk::RescaleIntensityImageFilter<ImageType,
                                         OutputImageType> RescalerType;
RescalerType::Pointer rescaler = RescalerType::New();

becomes

auto rescaler = itk::RescaleIntensityImageFilter<ImageType,
                                                 OutputImageType>::New();

which is once again much shorter.

Another example in a for loop:

for (PolygonListType::Iterator it = polygonList->Begin();
     it != polygonList->End(); ++it)
  {
  DataNodeType::Pointer newPolygon = DataNodeType::New();
  newPolygon->SetPolygonExteriorRing(it.Get());
  tree->Add(newPolygon, multiPolygon);
  }

becomes

for (auto it = polygonList->Begin();
     it != polygonList->End(); ++it)
  {
  auto newPolygon = DataNodeType::New();
  newPolygon->SetPolygonExteriorRing(it.Get());
  tree->Add(newPolygon, multiPolygon);
  }

using

The using keyword allows to define template aliases. Whenever we write this:

typedef otb::Image<unsigned int, 2> ImageType;
typedef otb::VectorImage<unsigned int, 2> VectorImageType;
typedef otb::Image<double, 2> DoubleImageType;
typedef otb::VectorImage<double, 2> DoubleVectorImageType;

we could do this:

using ImageType = otb::Image<unsigned int, 2>;
using VectorImageType = otb::VectorImage<unsigned int, 2>;
using DoubleImageType = otb::Image<double, 2>;
using DoubleVectorImageType = otb::VectorImage<double, 2>;

For people like me who have always found counterintuitive the order of the types in a typedef, this is much clear. I know that the code is not shorter, but for a C++ beginner, this should be much clearer.

One cool thing that using allows and that typedef doesn’t is partial template specialisation1:

template<typename T> 
using Image2D = otb::Image<T, 2>;
auto im = Image2D<int>::New();

decltype

Sometimes, we don’t want to mentally track the type names, but we know that to objects should have the same type. decltype allows to declare the type of one object by using the name of another object:

ImageType::IndexType start = {0, 0};
decltype(start) start2 = {0, 0};

In OTB, at first, I didn’t see a way to use decltype on smart pointers and templates, since we usually manipulate ObjectType::Pointer, but the template parameters are simply ObjectType. Fortunately, ITK designers declared an ObjectType in the SmartPointer class which is an alias for the type of the pointed object.

I found an example where this is useful (the orthofusion example in the Tutorial chapter of the Software Guide).

The original code defines a type for a projection and creates an object:

typedef otb::GenericMapProjection<otb::TransformDirection::INVERSE>
        InverseProjectionType;

InverseProjectionType::Pointer utmMapProjection =
                               InverseProjectionType::New();

Later in the program, we can use the defined type as a template parameter for a filter:

typedef otb::OrthoRectificationFilter<ImageType, DoubleImageType,
                                      InverseProjectionType> 
             OrthoRectifFilterType;
OrthoRectifFilterType::Pointer orthoRectifPAN =
                               OrthoRectifFilterType::New();

If we created the projection without defining the type like this:

auto utmMapProjection =
     otb::GenericMapProjection<otb::TransformDirection::INVERSE>::New();

how can we then instantiate the filter with a type which has not been defined? Like this:

auto orthoRectifPAN =
      otb::OrthoRectificationFilter<ImageType,
                                    DoubleImageType,
                                    decltype(utmMapProjection)::ObjectType>::New();

I am not sure whether this is a good solution in production code which has to be maintained long time after it was written, but it is for sure an interesting solution when prototyping processing chains.

Lambdas

Lambdas, or anonymous functions, are one of the most exciting things in C++11 when one has used them in LISP-like languages or even in Python. They make fast prototyping much easier mainly when making a heavy use of the STL algorithms because they can replace functors or plain functions.

Usually, STL algorithms can be specialised by passing them functions as parameters. If one wants to store state, a functor or function object (a class which defines the () operator) is used.

The inconvenient of functions and functors is that they are defined away from where they are used, so they are not ideal when they are only used once. Functors are worse than functions since they need much boilerplate for only one useful method.

Lambdas are the ideal solution for this, since they are defined locally. They can store state by capturing local variables either by reference or by value.

OTB iterators are not fully compatible with the STL, so one can think that lambdas would not be very useful with OTB specific code. But actually, there are many filters which can be implemented by specialising one of the N-ary functor filters. These filters are useful when one wants to implement a filtering operation which can’t be obtained with the otb::BandMathFilter, as for instance when a local neighbourhood is needed.

One example of this is the change detection framework. A long time ago when I wrote this example I had to use a lot of code to achieve a simple thing like computing the mean difference around a pixel.

First of all, I needed a functor to implement the processing in the neighbourhood:

template<class TInput1, class TInput2, class TOutput>
class MyChangeDetector{
public:
  MyChangeDetector() {}
  ~MyChangeDetector() {}
  inline TOutput operator ()(const TInput1& itA,
                             const TInput2& itB)
  {
    TOutput result = 0.0;

    for (unsigned long pos = 0; pos < itA.Size(); ++pos)
      {

      result += static_cast<TOutput>(itA.GetPixel(pos) - itB.GetPixel(pos));

      }
    return static_cast<TOutput>(result / itA.Size());
  }
};

That is, a class definition with empty constructor and destructor. Then I needed to inherit from the binary functor which performs a neighbourhood filtering and specialise it using my functor.

template <class TInputImage1, class TInputImage2, class TOutputImage>
class ITK_EXPORT MyChangeDetectorImageFilter :
  public otb::BinaryFunctorNeighborhoodImageFilter<
      TInputImage1, TInputImage2, TOutputImage,
      MyChangeDetector<
          typename itk::ConstNeighborhoodIterator<TInputImage1>,
          typename itk::ConstNeighborhoodIterator<TInputImage2>,
          typename TOutputImage::PixelType> >
{
public:
  typedef MyChangeDetectorImageFilter Self;

  typedef typename otb::BinaryFunctorNeighborhoodImageFilter<
      TInputImage1, TInputImage2, TOutputImage,
      MyChangeDetector<
          typename itk::ConstNeighborhoodIterator<TInputImage1>,
          typename itk::ConstNeighborhoodIterator<TInputImage2>,
          typename TOutputImage::PixelType>
      >  Superclass;

  typedef itk::SmartPointer<Self>       Pointer;
  typedef itk::SmartPointer<const Self> ConstPointer;

  itkNewMacro(Self);

protected:
  MyChangeDetectorImageFilter() {}
  virtual ~MyChangeDetectorImageFilter() {}

private:
  MyChangeDetectorImageFilter(const Self &);
  void operator =(const Self&);

};

So again, a class definition for nothing. I could maybe just have defined a type, but the code using it would not have been as simple as this:

typedef MyChangeDetectorImageFilter<InputImageType1, InputImageType2,
    ChangeImageType>      FilterType;
FilterType::Pointer   filter = FilterType::New();

Even if I had defined a type alias for the filter in order to avoid to inherit from the existing filter, the functor definition is an overkill and it is located far from where it is used.

Using lambdas, the code becomes this:

using CPT = ChangeImageType::PixelType;
using CNIType1 = itk::ConstNeighborhoodIterator<InputImageType1>;
using CNIType2 = itk::ConstNeighborhoodIterator<InputImageType2>;

That is, 3 lines of type aliases for a simpler notation. Then the lambda:

std::function<CPT (CNIType1, CNIType2)>
  cdt = [](CNIType1 itA, CNIType2 itB){
  CPT result{0};
  for (auto pos = 0; pos < itA.Size(); ++pos)
    result += static_cast<CPT>(itA.GetPixel(pos) - itB.GetPixel(pos));
  return static_cast<CPT>(result / itA.Size());
};

And finally the filter instantiation:

auto filter = otb::BinaryFunctorNeighborhoodImageFilter<InputImageType1,
                                                        InputImageType2,
                                                        ChangeImageType,
                                                        decltype(cdt)>::New();

If we had wanted to have a function with state, objects in the scope where the lambda is defined can be captured by value or by reference within the [], so we are very close to what a functor may achieve with much less code.

The main advantage here is that all the code is in the same location thanks to the possibility of creating a function anywhere in the sources. If I understand it well, lambdas are inlined, which means that the code is faster than a function call.

Conclusion

I have only started to use this kind of code, but I think that once you start using auto and lambdas it must be very difficult to go back to C++98/03.

The only drawback with using C++11 is dropping compatibility with old compilers, but this is not an issue for most of the things I do. So I can start writing modern OTB code instead of poo (plain old OTB)!

Footnotes:

1

With GCC 4.7 this only seems to work out of a scoped block.

Aimer, travailler et aimer travailler

Entrelacement de deux lectures récentes.

Cependant, chez bon nombre d’espèces animales, cette attitude de cour dure souvent quelques minutes, jours ou semaines, alors que l’amour romantique et passionnel peut se prolonger plusieurs années chez l’homme (environ 3 ans). 1, p. 57-58.

Forcené au point d’en être légèrement inquiétant, l’optimisme de rigueur dans l’univers de la consommation se retrouve dans l’entreprise. On ne consomme pas pour assurer sa subsistance, mais pour communier dans le mythe d’un progrès incessant et providentiel, pour afficher les signes du bonheur et de la réussite ; on ne saisit pas une offre d’emploi par nécessité, mais pour prendre part à une «grande aventure », « se réaliser », « se dépasser ». 2

La vue du visage de la personne aimée désactive le cortex frontal et l’amygdale supprimant ainsi toute interprétation liée à un jugement volontaire et toute émotion négative ou peur. 1, p. 62.

Né des recherches d’Elton Mayo dans les années 1930, le management participatif, à travers les « boîtes à idées » et autres « cercles de qualité », cherche à enrôler jusqu’au tréfonds des individus au service du dessein patronal, et leur interdit de conserver la moindre distance critique vis-à-vis de leur gagne-pain – une mutation qui, lorsqu’elle se généralise, dans les années 1980, plonge les syndicats dans un désarroi durable.2

Tout est mis en place pour adapter le corps à note comportement. Ensuite, en quelques heures, le cerveau active l’hypophyse qui elle-même va stimuler la glande surrénale pour libérer l’hormone du stress : le cortisol. Le taux de cortisol sanguin peut donc augmenter 2 à 3 fois dans le sang dans les premières semaines d’une relation amoureuse alors qu’il redevient normal après une relation durable d’environ 12 mois. Les neurobiologistes peuvent démontrer que cette augmentation du cortisol permet de dépasser la crainte de l’autre et facilite en quelques jours le développement d’une relation, d’un rapprochement accompagné d’un sentiment de sécurité. 1, p. 75.

Alors même qu’ils peuvent être licenciés du jour au lendemain, les salariés sont donc invités à s’identifier totalement à l’entreprise. Plus les richesses créées désertent leurs poches, et plus la culture interne nie les intérêts divergents, voire antagonistes, du capital et du travail, pour mettre en scène la poursuite exaltante d’un but commun. Plus le travail se fait rare, précaire, pénible et mal payé, plus il est censé combler à lui seul toutes les aspirations existentielles des individus. 2

Après ce flot d’émotions, s’élève le désir, l’attente d’être aimé et l’anticipation du plaisir obtenu et de sa satisfaction. En renforçant cette passion amoureuse de l’autre, le désir sexuel est stimulé, car n’oublions pas qu’il faut inciter fortement l’espèce à se reproduire, donc l’évolution a tout prévu quitte à forcer notre cerveau à devenir le temps d’une soirée ou d’une nuit, un peu moins raisonnable. 1, p. 80.

Mais la peur du chômage – et, peut-être, l’absence d’idéal alternatif – limite les possibilités de rébellion. Elle dispense aussi les employeurs de précautions excessives : la surveillance – optimisée par les nouvelles technologies –, les entretiens inquisiteurs, les règlements tatillons, laissent souvent leurs cibles sans illusions sur leurs réelles possibilités d’« épanouissement » dans ce contexte. 2

Footnotes:

1

“La chimie des sentiments”, Bernard Sablonnière, JC Gawsewitch Editeur, ISBN-13: 978-2350133591.

2

Divertissement, consommation, management : comment captiver les masses, séduire le client et motiver le travailleur. « Manière de voir» n° 96 — Décembre 2007-Janvier 2008. Numéro coordonné par Mona Chollet. http://www.monde-diplomatique.fr/mav/96/

Chaos, hasard et libre arbitre

J’ai assisté hier à une conférence sur les fondements de la liberté pendant laquelle j’ai cru détecter une confusion – qui arrive souvent – entre chaos et non-déterminisme. Il a été malheureusement impossible de débattre du sujet, et je me suis senti frustré de ne pas pouvoir exposer clairement mes propos en quelques phrases, car je ne m’y étais pas préparé.

Comme ce n’est pas la première fois que j’échoue à expliquer pourquoi le chaos n’a rien d’aléatoire, j’ai décidé de rédiger un argumentaire auquel je pourrais me référer si la situation se présente à nouveau.

Je n’ai jamais vraiment manipulé le concept de chaos dans un cadre concret, mais cela m’a beaucoup intéressé à la suite de ma thèse ou j’ai travaillé sur la modélisation et l’inversion de systèmes non-linéaires. Les outils mathématiques développés dans l’étude des systèmes dynamiques non-linéaires permettent de modéliser le chaos.

Heureusement, on n’a pas besoin d’être un spécialiste de la physique et des mathématiques pour comprendre le chaos.

“La théorie du chaos – vers une nouvelle science” de James Gleick est une très bonne introduction pour les néophytes, mais un peu trop romancée à mon goût. Je préfère nettement “Dieu joue-t-il aux dés? – Les mathématiques du chaos” d’Ian Steward.

Comment définir le chaos simplement? Ian Steward dans la préface de la 2è édition de son livre le dit comme ceci :

On parle de chaos lorsqu’un système déterministe (c’est-à-dire non aléatoire) se comporte de manière apparemment aléatoire […].

Un système ou un phénomène chaotique est donc parfaitement déterministe, même s’il n’est pas prévisible. La non prévisibilité de son état futur vient de son extrême sensibilité aux changements, même minimes, sur son état présent. C’est ce que populairement on appelle “effet papillon” et qui rend extrêmement difficile la prévision météorologique, par exemple.

Il n’est donc pas étonnant que le vrai chaos dérange énormément ceux qui tiennent certaines positions philosophiques sur la liberté des individus. S’il n’y a pas de vrai phénomène aléatoire dans l’univers, et que tout est déterministe, les individus ne sont pas libres, mais parfaitement déterminés. La liberté ne serait qu’une illusion causée par la non prévisibilité du chaos. Ou comme le disait Spinoza, on se croit libres parce que l’on ignore les causes qui nous déterminent.

En effet, on peut raisonner comme cela au niveau macroscopique. En revanche, au niveau quantique, il pourrait ne pas en être ainsi. En effet, selon le principe de superposition, un système pourrait se trouver dans plusieurs états à la fois (le chat de Schrödinger). Et ceci n’est pas un état traduisant une ignorance vis-à-vis de l’état réel du système, mais bien une indétermination intrinsèque au système.

Cette interprétation a donnée lieu à beaucoup de polémiques, dont la plus connue est celle entre Einstein et Born, que Stewart rappelle dans le chapitre 16 intitulé “Le chaos et la mécanique quantique” :

Quand Einstein énonça sa remarque fameuse sur Dieu qui ne jouerait pas aux dés, il faisait allusion à la mécanique quantique. Celle-ci diffère par bien des points de la mécanique “classique” de Newton, Laplace et Poincaré sur laquelle la discussion a principalement porté jusque là. Einstein formula cette assertion devenue célèbre dans une lettre au physicien Max Born dont voici un plus ample extrait :

“Vous croyez en un Dieu qui joue aux dés et moi dans un ordre et des lois absolus régnant sur un monde qui existe objectivement et que j’essaie de saisir, même si c’est extrêmement spéculatif. J’y crois fermement, mais j’espère que quelqu’un le découvrira plus concrètement ou, au moins, d’une façon un peu plus tangible que tout ce à quoi j’ai abouti. Même les importants succès initiaux de la théorie quantique ne me font pas croire en un jeu de dés, fondamental, bien que je réalise parfaitement que vos collègues plus jeunes n’y voient là qu’un signe de sénilité”

On ne connaissait pas le chaos à l’époque d’Einstein, mais c’était là le genre de concept qu’il recherchait. Ironiquement, la représentation du hasard par un dé qui roule fait appel à la mécanique déterministe et classique, non quantique, et le chaos lui-même est un concept avant tout de mécanique classique.

Je ne soutiens pas que l’aléatoire n’existe pas, mais si je devais parier, je serais du côte d’Einstein.

Mais si nous supposons que le hasard quantique existe, le libre arbitre existe aussi. Ceci a été démontré par Conway et Kochen en 2006 à partir de l’hypothèse “spin”. C’est le théorème du libre arbitre dont le corollaire est très bien résumé dans l’article de Wikipédia :

Cela ne signifie pas que le déterminisme soit faux, en effet si l’univers est entièrement déterministe, alors il n’y a pas de libre arbitre chez les humains et le théorème ne s’applique pas. Mais s’il existe un indéterminisme (un libre arbitre) chez les humains, il en existe aussi un pour les particules élémentaires.

En conséquence, tant que l’hypothèse “spin” n’est pas confirmée ou infirmée, croire dans la possibilité de liberté des individus est seulement une position philosophique. Et de toute façon, cette explication permet de ne pas angoisser trop :

Dans une de ses conférences consacrée au thème du voyage temporel, l’astronome Sean Carroll explique que le concept de libre arbitre n’est qu’une approximation et qu’il est en théorie tout à fait compatible avec le déterminisme. […]

“Beaucoup de gens sont perturbés par l’idée de déterminisme : cette idée selon laquelle si on connaît l’état exact de l’univers à un instant donné, on peut prédire le futur.

Je voudrais vous dire: ne soyez pas perturbés. Le déterminisme, ce n’est pas un vieil homme sage qui dirait: « Voici ce qui va se produire dans le futur et tu n’y peux absolument rien ». Ce n’est pas cela du tout.

L’idée de déterminisme c’est plutôt un garnement qui dirait: «Je sais ce que tu vas faire dans un instant». Alors vous lui demandez: «Admettons. Alors, qu’est-ce que je vais faire ? » et il répond: «Ça je ne peux pas te le dire ». Puis vous faites quelque chose et le gamin s’exclame: « Je savais que tu ferais ça ».”

Selon Caroll, le déterminisme n’est donc pas incompatible avec le libre arbitre puisqu’aussi longtemps que nous ignorons ce que nous ferons dans le futur, l’éventail des possibles reste au moins théoriquement réalisable, de telle sorte qu’un futur non-déterministe nous parait tout à fait équivalent.

Enfin, grâce à Dieu, je suis athée, parce comme le dit Stewart dans l’épilogue de son livre :

Si Dieu jouait aux dés … il gagnerait!

Specialisation is for insects

During a talk about artificial general intelligence I came accross a quote from Robert Heinlein. I didn’t know anything about Heinlein before. Looking at Wikipedia, it seems that I should read some of his books:

Within the framework of his science fiction stories, Heinlein repeatedly addressed certain social themes: the importance of individual liberty and self-reliance, the obligation individuals owe to their societies, the influence of organized religion on culture and government, and the tendency of society to repress nonconformist thought. He also speculated on the influence of space travel on human cultural practices.

[…]

Heinlein believed that individualism was incompatible with ignorance. He believed that an appropriate level of adult competence was achieved through a wide-ranging education, whether this occurred in a classroom or not. In his juvenile novels, more than once a character looks with disdain at a student’s choice of classwork, saying, “Why didn’t you study something useful?” In Time Enough for Love, Lazarus Long gives a long list of capabilities that anyone should have, concluding, “Specialization is for insects.” The ability of the individual to create himself is explored in stories such as I Will Fear No Evil, “—All You Zombies—”, and By His Bootstraps.

And this is the quote I found so amazing:

A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects.

Le bien-être comme monde et comme représentation

Je suis à peu près à la moitié de la lecture de “Le crépuscule du devoir – L’éthique indolore des nouveaux temps démocratiques” 1 de Gilles Lipovetsky. C’est un essai de 1992, mais qui à beaucoup d’égards garde toute sa pertinence.

À partir du titre et du quatrième de couverture, on pourrait croire qu’il s’agit d’un texte presque inaccessible, mais je trouve le style de Lipovetsky (c’est mon premier livre de lui) très fluide rendant la lecture très aisée.

En voici le résumé de l’éditeur :

Bioéthique, charité médiatique, actions humanitaires, sauvegarde de l’environnement : partout la revitalisation des valeurs et l’esprit de responsabilité sont brandis comme l’impératif premier de l’époque. Pourtant, il n’y a aucun retour de la morale. L’âge du devoir rigoriste s’est éclipsé au bénéfice d’une culture qui métamorphose l’action morale en show récréatif.

Dans le chapitre 2, dans la section intitulée “Le bien-être comme monde et comme représentation”, en une phrase, on a la synthèse de ce que Lipovetsky appelle le post-moralisme :

A l’obligation s’est substituée la séduction, le bien-être est devenu Dieu et la publicité son prophète.

Tout le long du texte, l’auteur défend la thèse qu’il n’y a pas de retour de la morale, mais qu’il n’y a pas non plus une perte totale des limites qu’elle imposait auparavant.

Il nous livre aussi sa description du bonheur light :

L’éthique contemporaine du bonheur n’est pas seulement consommative, elle est d’essence activiste, constructiviste : non plus comme autrefois gouverner idéalement ses passions, mais optimiser nos potentiels; non plus l’acceptation résignée du temps, mais l’éternelle jeunesse du corps; non plus la sagesse, mais le travail performatif de soi sur soi; non plus l’unité du moi, mais la diversité high tech des exigences de protection, d’entretien, de valorisation du capital-corps. D’un côté, l’époque hors-devoir liquide la culture autoritaire et puritaine traditionnelle; de l’autre, elle engendre de nouveaux impératifs (jeunesse, santé, sveltesse, forme, loisirs, sexe) d’auto-construction de soi-même, sans doute personnalisés, mais créant un état d’hypermobilisation, de stress et de recyclage permanent. La culture du bonheur déculpabilise l’auto-absorption subjective, mais dans le même temps elle enclenche une dynamique anxiogène du fait même des normes du mieux-être et du mieux-paraître qui la constituent.

Et il complète avec :

L’hédonisme postmoderne n’est plus ni transgressif ni dilettant, il est “managé”, fonctionnalisé, sagement light.

De quoi être sceptique des doctrines onfrayennes et du nietzschéisme 2.0.

Materialisme sur un bout de papier

J’essaie d’être un peu discipliné dans la prise de notes quand je lis des essais, mais je n’y arrive pas toujours. Aujourd’hui j’ai retrouvé ça sur le verso d’une partition de piano de ma fille :

Parce qu’ils ne pensent qu’à eux mêmes, les matérialistes supposent que tout le monde ressent les choses à leur façon – après tout, “c’est la nature humaine”. Plus on est haut perché sur l’échelle des valeurs matérialistes, plus on se méfie des autres.

Je pense que c’est issu du livre de Jeremy Rifkin (2011) “Une nouvelle conscience pour un monde en crise. Vers une civilisation de l’empathie”, Éditions Les Liens qui libèrent, (ISBN 2918597279).

Sur le même bout de papier, j’ai trouvé une autre citation qui serait de Tim Kasser qui est cité à son tour par Rifkin :

Ceux qui aspirent fortement à faire fortune et à accumuler des biens s’attribuent un moindre degré de bien-être psychologique que ceux qui se soucient moins de cet objectif.

Malheureusement, l’auto-flagellation de ces matérialistes déborde souvent sur ceux qui ne peuvent pas se permettre de l’être et qui finissent par en subir des conséquences non seulement psychologiques, mais bien physiques et tangibles.

Watching YouTube without a browser

The other day I was curious about how many streaming video sites among those I usually visit had made the move from flash to HTML5.

The main reason is that my virtual Richard Stallman keeps telling me that I am evil, so I wanted to remove the flash plug-in from my machine.

An the fact is that many sites have not switched yet. As far as I understand, YouTube has, at least partially. Therefore, the title of this post is somewhat misleading.

I have been using youtube-dl for a while now in order to download videos from many sites as YouTube, Vimeo, etc. My first idea was therefore to pipe the output of youtube-dl to a video player supporting the appropriate format. Since I usually use vlc I just tried:

youtube-dl  -o - <url of the video> | vlc -

This works fine, but has the drawback of needing to manually type (or copy-paste) the URL of the video. So the command line on a terminal emulator is not what I find convenient.

Most of the video URLs I access come to me via e-mail, and I read e-mail with Gnus inside Emacs, I decided that an Emacs command would do the trick. So I put this inside my .emacs:

(defun play-youtube-video (url)  
  (interactive "sURL: ")  
  (shell-command
   (concat "youtube-dl  -o - " url " | vlc -")))

This way, M-x play-youtube-video, asks me for an URL and plays the video. So, when I have an URL for a video on an e-mail (or any other text document on Emacs) I just copy the URL with the appropriate Emacs key stroke and call this command. For convenience, I have mapped it to key binding:

(global-set-key (kbd "<f9> Y") 'play-youtube-video)

So this is good, though not yet frictionless.

Sometimes, the video URL will appear on an HTML buffer, either when I am browsing the web inside Emacs with w3m or when the e-mail I am reading is sent in HTML1. In this case, I don’t need to manually copy the URL and I just can ask w3m to do the work.

(defun w3m-play-youtube-video ()  
   (interactive)  
         (play-youtube-video
      (w3m-print-this-url (point))))
(global-set-key (kbd "<f9> y") 'w3m-play-youtube-video)

So far, this has been working fine for me and I don’t have the ugly non-free flash plug-in installed, and VRMS is happier than before.

Footnotes:

1

I use w3m as HTML renderer for Gnus with (setq mm-text-html-renderer 'w3m).