Bientôt une version alpha de WebPyVotons!

Après plusieurs mois d’inactivité, le projet PyVotons! a progressé rapidement ces dernières semaines. Une version alpha devrait être publiée rapidement sur ce site.

Cette version devrait permettre de créer un compte, créer un scrutin, inscrire des électeurs à ce scrutin, leur permettre de voter puis afficher les résultats.

Techniquement, PyVotons est composé d’une interface graphique qui s’exécutera dans le navigateur de la machine cliente (python traduit en javascript par Pyjamas) et d’un serveur HTTPS écrit en python qui utilise MySQL pour stocker les données utilisateur.

Il restera cependant beaucoup de travail à faire :

  • présentation avec CSS et nouvelles icônes
  • documentation et nettoyage du code
  • meilleure gestion des erreurs
  • support des traductions
  • support des groupes d’utilisateurs
  • sécurisation (en particulier contre les DOS)
  • envoie d’e-mail de confirmation d’inscription et d’appel aux votes
  • support d’autres bases de données que MySQL (sqllite par exemple), support de serveurs d’application python…).

 

Publié dans Development, news | Laisser un commentaire

Bibtex, latex, elsarticle et nodots : message d’erreur incompréhensible

Au cas où cela pourrait aider quelqu’un, voici la solution d’un problème que j’ai eu en utilisant latex et bibtex avec la classe d’article Elsevier et le style de bibliographie model4-names.bst…

Tout d’abord, utiliser seulement
\documentclass{elsarticle}
et
\bibliographystyle{model4-names}
\bibliography{myBiblio}
n’affiche pas le nom d’auteur et la date, mais juste un numéro [1].

Solution : \documentclass[authoryear]{elsarticle} (d’après le fichier exemple disponible sur http://support.river-valley.com/wiki/index.php?title=Model-wise_bibliographic_style_files)

Le problème de ce style, c’est que les noms d’auteurs sont affichés dans la bibliographie avec beaucoup de points (Smith, S.J., au lieu de Smith SJ).
La solution donnée est d’utiliser le package numcompress.sty de cette façon : \usepackage[nodots]{numcompress}

J’ai rencontré avec ceci une erreur incompréhensible, et je n’ai pas trouvé la solution sur le web (c’est pour cela que je la publie ici) :

(./MyBiblio.bbl [12]
Runaway argument?
467, 469\@nil \else \ifx \next \@@@au \bibauthor {467, 469}\else 467,\ETC.
! Paragraph ended before \@@bibpages was complete.
<to be read again>
\par
l.514

?

Dans le fichier MyBiblio.bib, quelques @article n’étaient pas définis correctement, en particulier la propriété « page ». J’ai dû remplacer pages = {185,190} par la version correcte pages = {185–190}, et supprimer pages={3} pour un autre article, parce que numcompress.py causait l’erreur ci-dessus.

 

Publié dans Notes Info | 4 commentaires

DroboFS : une page d’informations avec PHP

J’ai acheté récemment un disque réseau DroboFS pour le stockage de données de mon labo. C’est du bon matériel, mais j’ai été très surpris de voir que la seule façon de le configurer est le Drobo Dashboard, un logiciel Windows/Mac qui doit être lancé sur un ordinateur branché au même sous-réseau que le DroboFS (il envoie des paquets broadcast pour localiser le DroboFS, et il est impossible de lui préciser l’adresse IP du DroboFS). Dans mon cas, le DroboFS est branché sur un autre sous-réseau (et dans un autre bâtiment), donc l’autodétection ne fonctionne pas.

Pourquoi n’y a-t-il pas d’interface web, comme sur le Iomega StorCenter Ix2, un disque réseau beaucoup plus bas-de-gamme ? Cela permettrait de l’administrer à distance depuis n’importe quel système !

Un projet récent pour développer un webdashboard existe, mais c’est un projet d’un utilisateur qui à ce jour ne comporte que très peu de code fonctionnel.

En me basant sur ce code, j’ai écrit une page PHP (très mal codée, car je n’ai utilisé PHP qu’une fois ces 10 dernières années) qui affiche les données que j’ai pu récupérer (configuration des dossiers partagés et statut du DroboFS).

edit : captures d’écran anonymisées

Je ne peux toujours pas ajouter des utilisateurs, leur permettre de changer leur mot de passe, ajouter un dossier partager ou changer les droits d’accès, mais c’est un début !

Voici le code source, en espérant qu’il pourra servir à d’autres.

Bug connu : si vous n’avez pas défini d’utilisateur, le script plantera.

Instructions pour l’utiliser : activer les DroboApps sur votre DroboFS (avec Dashboard donc), installer la droboapp Apache, et placer le fichier ci-dessous, nommé droboStatus.php, dans le répertoire /DroboApps/apache/www de votre Drobo. Pour voir le résultat, il suffit de se connecter à http://droboIP:8080/droboStatus.php

 

 

<html>
 <head>
   <title>PHP Test</title>
 </head>
 <body>
  <?php
/*
 droboStatus;php : a simple php page to display the status of a DroboFS
 Copyright (C) 2011 Manik Bhattacharjee - manik-listes@altern.org 

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU Affero General Public License as
 published by the Free Software Foundation, either version 3 of the
 License, or (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 GNU Affero General Public License for more details.

 You should have received a copy of the GNU Affero General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

/***************************** A short (and incomplete) XML parsing function **********************************************/
  function parseBasicXML(&$sourcexml, $markOpen = "DRIShareConfig") {
    //echo "<br>Parsing...<br>";
    $root = array();
    $index = 0;
        // Searching for markups
      while (preg_match("/([^<]*)<([\s\w\/]+)>/", $sourcexml, $matches, PREG_OFFSET_CAPTURE) ) {
          //echo "WHILE ";
          $index = $index + 1;
          // For each markup
          $content = $matches[1][0];
          $markup = $matches[2][0];
          //echo strlen($sourcexml);
          //echo "$markup<br/>";
          // Remove this part from the string
          $sourcexml = substr($sourcexml, strlen($markup) + 1 +  $matches[2][1]);
          //echo "Match : $markup\n";

            // 3 Cases : <Username>, </Username>, and <Username />
            // Entering : call the function recursively, it will return a new node
            if (preg_match("/^\s*(\w+)\s*$/", $markup, $mark)){
              //echo "New mark ".$mark[1]." <br>\n";
              $root[$mark[1].$index] = parseBasicXML($sourcexml, $mark[1]);
            }
            // Open/Closed markup (e.g. <br /> : add it as a child with no value
            elseif (preg_match("/^\s*(\w+)\s*\/$/", $markup, $mark)){
                  $root[$mark[1].$index] = "novalue";
                  //echo "OpenClosed mark ".$mark[1]."<br>";
            }
            // Closed Markup : if it really is our markOpen markup, return ! Otherwise, there is something very wrong !
            elseif (preg_match("/^\s*\/\s*(\w+)\s*$/", $markup, $mark)){
              if ($mark[1] === $markOpen){
                //echo "Closing mark ".$mark[1]." with content $content<br>";
                $root["content"] = $content;
                return $root;
              }else{
                echo "Unexpected input $lt;/".$mark[1].", whereas $markOpen was expected.";
              }

          }else{
            echo "Unidentified markup : $markup";
          }
      //echo "<br>";
    }
    return $root;
  }
/********************************END XML Parsing function********************************************************************/

/***************************** Sub Functions for Drobo configuration Analysis****************************************************************/
  function yesOrNo($val){
    if($val == 0){ return "No";}else{return "Yes";}
  }

  function userRights($r){
    if ($r == 0){ return "<font color=\"orange\">Read only</font>";}elseif($r == 1){ return "<font color=\"green\">Read/Write</font>";}else{return "Unknown rights !";}
  }

  function displayPassword($val){ return '***';}

  function displayUser($us){
    echo "<tr><td><font color = \"blue\"><b>".$us['Username1']['content']."</b></font></td><td>".yesOrNo($us['ValidPassword3']['content'])."</td><td>".yesOrNo($us['EncryptedPassword4']['content'])."</td><td><font color=\"gray\">".displayPassword($us['Password2']['content'])."</font></td></tr>\n";
  }

  function displayShare($sh){
// echo '<table border="1"><tr><td><b>ShareName<b></td><td>UserName</td><td>Rights</td><td>ShareState</td><td>TimeMachineEnabled</td><td>ShareMaxTMSizeGB</td><td>OldShareName</td></tr>'."\n";
    echo "<tr bgcolor=\"#aaaaaa\"><td><font color = \"blue\"><b>".$sh['ShareName1']['content']."</b></font></td><td></td><td></td><td>".$sh['ShareState2']['content']."</td><td>".yesOrNo($sh['TimeMachineEnabled3']['content'])."</td><td>".$sh['ShareMaxTMSizeGB4']['content']."</td><td>".$sh['OldShareName6']."</td></tr>\n";
    $su = $sh['ShareUsers5'];
    $index = 1;
    while($su["ShareUser$index"]){
      echo '<tr><td></td><td><font color = "blue">'.$su["ShareUser$index"]['ShareUsername1']['content'].'</font></td><td>'.userRights($su["ShareUser$index"]['ShareUserAccess2']['content']).'</td><td></td><td></td><td></td><td></td></tr>'."\n";
      $index = $index+1;
    }
    //echo "</table>\n";
  }
/**************************************End of Sub Functions for Drobo configuration Analysis**************************************************************/

/********************************** Drobo Configuration Analysis and display ******************************************************************/
  function displayNASconf($nc){

    // USERS
    echo "<h2><center>Users</center></h2>\n";
    echo '<center><table border="1"><tr><td><b>UserName</b></td><td>Valid Password</td><td>Encrypted Password</td><td width = "50">Password</td></tr>'."\n";
    $users = $nc["DRIShareConfig1"]["UserList2"];
    $index = 1;
    while($users["User$index"]){
      displayUser($users["User$index"]);
      $index = $index+1;
    }
    echo "</table></center>\n<br/><br/><br/><br/>\n";

    // SHARES
    echo "<h2><center>Shares</center></h2>\n";
    $shares = $nc["DRIShareConfig1"]['Shares3'];
    $index = 1;
    echo '<center><table border="1"><tr><td><b>ShareName<b></td><td>UserName</td><td>Rights</td><td>ShareState</td><td>TimeMachineEnabled</td><td>ShareMaxTMSizeGB</td><td>OldShareName</td></tr>'."\n";
    while($shares["Share$index"]){
      displayShare($shares["Share$index"]);
      echo "\n";
      $index = $index+1;
    }
    echo "</table></center>\n<br/><br/><br/><br/>\n";
  }

/*********************************** End of Drobo Configuration Analysis and display ************************************************/

/******************************** Sub Functions for Drobo Status Analysis *******************************************************************/
  function getCurrentStatus(){
    //echo '<form><textarea cols="120" rows="40">';
    $cfgServer = "localhost";
    $cfgPort    = 5000;
    $cfgTimeOut = 10;

    $drobofs = fsockopen($cfgServer, $cfgPort, $errno, $errstr, $cfgTimeOut);
    $statusxml = "";
    if (!$drobofs) {
      echo "Connexion failed : $errstr\n";
    } else {
      // read lines until end of "</ESATMUpdate>" is seen
      while (!feof($drobofs)) {
        $line = fgets($drobofs, 128);
        $statusxml = $statusxml.$line; 
        if (strpos($line, "</ESATMUpdate>") === 0){ break;}
      }
    }
    if ($drobofs) {
      fclose($drobofs);
    }

    return parseBasicXML($statusxml);
  }

  function simpleString($val){
    if ($val === 'novalue'){ return "undefined";}else{return $val['content'];}
  }

  function simpleMask($val){
    return base_convert($val['content'], 10, 2).'b';
  }

  // From http://code.google.com/p/drobowebdashboard/wiki/ESATMUpdate#ESATMUpdate/mStatus : should analyze the bitmask...
  function mStatus($val){
    //$ret = $val['content'].' = '.base_convert($val['content'], 10, 2).'b -> ';
    $ret = '';
    switch ($val['content']){
      case 32768:
        return $ret.'<font style="BACKGROUND-COLOR: green" color="white">Everything ok, or undergoing relayout</font>';
      case 32772:
        return $ret.'<font style="BACKGROUND-COLOR: yellow" color="black">Yellow capacity warning, replace first drive</font>';
      case 32774:
        return $ret.'<font style="BACKGROUND-COLOR: red" color="white">Red capacity warning, replace first drive</font>';
      case 32784:
        return $ret.'<font style="BACKGROUND-COLOR: red" color="white">Bad drive in 3rd bay</font>';
      case 33344:
        return $ret.'<font style="BACKGROUND-COLOR: orange" color="black">Rebuilding</font>';
    }
    $ret = $val['content'].' = '.base_convert($val['content'], 10, 2).'b -> ';
    return $ret.'<font color="red">UNKNOWN STATUS - please see http://code.google.com/p/drobowebdashboard/wiki/ESATMUpdate#ESATMUpdate/mStatus</font>';
  }

  function capacity($val){
    // Cannot just divide by 1024*1024*1024 because drobo's php does not support large numbers (above 2 Gb) : just remove the last digits for display
    $gb = substr($val['content'],0,-9);
    $tb = substr($val['content'],0,-12);
    return $gb.' Gb / '.$tb.' Tb.';
    // return $val['content'].' bytes / '.$gb.' Gb / '.$tb.' Tb.';
  }

  function emailConfig($val){
    if ($val['content'] == 0){ return "Email alerts <b>not</b> enabled ";} elseif($val['content'] == 1) { return "Email alerts enabled ";} else {return 'Email alert : <b>unknown</b> status';}
  }

  function mFirmwareFeatureStates($val){
    if($val['content'] == 6){ return '<b>Single redundancy</b>'; } elseif($val['content'] == 7){return '<b>Double redundancy</b>';}else{return '<b>Redundancy status unknown !</b>';}
  }

  function slotmStatus($val){
    //$ret = $val['content'].' = '.base_convert($val['content'], 10, 2).'b -> ';
    $ret="";
    switch ($val['content']){
      case 1:
        return $ret.'<font color="white" style="BACKGROUND-COLOR: red">Solid red light (add/upgrade drive immediately)</font>';
      case 2:
        return $ret.'<font color="black" style="BACKGROUND-COLOR: yellow">Solid yellow light (add/upgrade drive soon)</font>';
      case 3:
        return $ret.'<font color="white" style="BACKGROUND-COLOR: green">Solid green light (everything ok)</font>';
      case 4:
        return $ret.'<font color="yellow" style="BACKGROUND-COLOR: green">Blinking green/yellow light (relayout)</font>';
      case 128:
        return $ret.'<font color="gray">No light (empty slot)</font>';
      case 134:
        return $ret.'<font color="black" style="BACKGROUND-COLOR: red">Blinking red light (defective drive, replace immediately)</font>';
    }
    return $ret.'<font color="red">UNKNOWN STATUS - please see http://code.google.com/p/drobowebdashboard/wiki/ESATMUpdate#ESATMUpdate/mSlotsExp/n/mStatus</font>';
  }

/****************************** End of sub Functions for Drobo Status Analysis *********************************************/

/*********************************** Drobo Status Analysis and display ************************************************/

  function displayCurrentStatus($cs, $fullOrNot = 1){
    $params = array('mESAUpdateSignature1' => array('?', 'simpleString'),
             'mESAUpdateVersion2' => array('?', 'simpleString'),
             'mESAUpdateSize3' => array('?', 'simpleString'),
             'mESAID4' => array('? - serial number', 'simpleString'),
             'mSerial5' => array('Serial number of the device ', 'simpleString'),
             'mName6' => array('Name of the device', 'simpleString'),
             'mVersion7' => array('Firmware version', 'simpleString'),
             'mReleaseDate8' => array('Release date of the firmware ', 'simpleString'),
             'mArch9' => array('Hardware architecture', 'simpleString'),
             'mFirmwareFeatures10' => array('?', 'simpleString'),
             'mFirmwareTestFeatures11' => array('?', 'simpleString'),
             'mFirmwareTestState12' => array('?', 'simpleString'),
             'mFirmwareTestValue13' => array('?', 'simpleString'),
             'mStatus14' => array('Overall status of the device', 'mStatus'),
             'mRelayoutCount15' => array('? (Speculation: number of relayouts in the device\'s history)', 'simpleString'),
             'mTotalCapacityProtected16' => array('Total capacity', 'capacity'),
             'mUsedCapacityProtected17' => array('Used capacity', 'capacity'),
             'mFreeCapacityProtected18' => array('Free capacity', 'capacity'),
             'mTotalCapacityUnprotected19' => array('?', 'capacity'),
             'mUsedCapacityOS20' => array('?', 'capacity'),
             'mYellowThreshold21' => array('Threshold of yellow warning about capacity, in 100th of a percent', 'simpleString'),
             'mRedThreshold22' => array('Threshold of red warning about capacity, in 100th of a percent', 'simpleString'),
             'mUseUnprotectedCapacity23' => array('?', 'capacity'),
             'mRealTimeIntegrityChecking24' => array('?', 'simpleString'),
             'mStoredFirmwareTestState25' => array('?', 'simpleString'),
             'mStoredFirmwareTestValue26' => array('?', 'simpleString'),
             'mDiskPackID27' => array('?', 'simpleString'),
             'mDroboName28' => array('?', 'simpleString'),
             'mConnectionType29' => array('?', 'simpleString'),
             'mSlotCountExp30' => array('Maximum number of drive bays (slots)', 'simpleString'), 
             'mSlotsExp31' => array('Container tag for slots status', 'simpleString'),  // SUBFUNCTION
             'mLUNUpdates32' => array('Container tag for?', 'simpleString'), //SUBFUNCTION
             'mFirmwareFeatureStates33' => array('?', 'mFirmwareFeatureStates'),
             'mLUNCount34' => array('?', 'simpleString'),
             'mMaxLUNs35' => array('?', 'simpleString'),
             'mSledName36' => array('?', 'simpleString'),
             'mSledVersion37' => array('?', 'simpleString'),
             'mShareCount38' => array('?', 'simpleString'),
             'mShareInfo39' => array('?', 'simpleString'),
             'mSledStatus40' => array('?', 'simpleString'),
             'mSledSerial41' => array('?', 'simpleString'),
             'mDiskPackStatus42' => array('?', 'simpleString'),
             'DNASStatus43' => array('?', 'simpleString'),
             'DNASConfigVersion44' => array('?', 'simpleString'),
             'DNASDroboAppsShared45' => array('? (Speculation: indicates whether DroboApps are enabled)', 'simpleString'),
             'DNASDiskPackId46' => array('? (Speculation: unique ID for the disk pack) ', 'simpleString'),
             'DNASFeatureTable47' => array('?', 'simpleString'),
             'DNASEmailConfigEnabled48' => array('Indicates the state of email alerts', 'emailConfig'),
             'content' => array('?', 'simpleString')
);
    $cs = $cs['ESATMUpdate1'];

    //Display slots
    $slots = $cs['mSlotsExp31'];
    $index = 0;
    if ($fullOrNot){
      echo "<center><table border = \"1\">\n<tr><td><b>Slot number</b></td><td><b>Status</b></td><td><b>Capacity</b></td><td>Make</td><td>Model</td><td>ESAID</td></tr>\n";
    }else{
      echo "<center><table border = \"1\">\n<tr><td><b>Slot number</b></td><td><b>Status</b></td><td><b>Capacity</b></td></tr>\n";
    }
    while($slots['n'.$index.($index+1)]){
      $slot = $slots['n'.$index.($index+1)];
      if ($fullOrNot){
        echo '<tr><td>'.simpleString($slot[mSlotNumber1]).'</td><td>'.slotmStatus($slot[mStatus2]).'</td><td>'.capacity($slot[mPhysicalCapacity6]).'</td><td>'.simpleString($slot[mMake4]).'</td><td>'.simpleString($slot[mModel5]).'</td><td>'.simpleString($slot[mESAID3])."</td></tr>\n";
      }else{
        echo '<tr><td>'.simpleString($slot[mSlotNumber1]).'</td><td>'.slotmStatus($slot[mStatus2]).'</td><td>'.capacity($slot[mPhysicalCapacity6])."</td></tr>\n";
      }
      $index = $index+1;
    }
    echo "</table></center>\n";

    if ($fullOrNot){
      // Display all parameters
      echo "<br><table border = \"1\">\n<tr><td>VarName</td><td>Comment</td><td>Value</td></tr>\n";
      foreach ($cs as $key => $val) {
        if (!$params[$key][1]){
          echo "<br><br><br>UNKNOWN param for $key !<br><br><br>";
        }
        echo '<tr>';
        echo "<td>$key</td><td>".$params[$key][0].'</td><td>'.$params[$key][1]($val).'</td>';
        echo "</tr>\n";
      }
      echo "</table>\n";

    }else{ // Just display the comment and value for the most usefull items

      echo "<br><center><table border = \"1\">\n";
      $keys = array('mName6', 'mStatus14', 'mTotalCapacityProtected16', 'mUsedCapacityProtected17', 'mFreeCapacityProtected18', 'mVersion7', 'DNASEmailConfigEnabled48');
      foreach ($keys as $key){
        echo '<tr><td>'.$params[$key][0].'</td><td>'.$params[$key][1]($cs[$key])."</td></tr>\n";
      }
      echo "</table></center>\n";
    }

  }

/*********************************** End of Drobo Status Analysis and display ************************************************/

/****************************** THE PAGE CONTENT **********************************************************************/

  // Parameter : full details or not ?
  if($_GET["full"]){ $full = 1;} else {$full = 0;}
  if ($full == 0){echo '<h3><a href="droboStatus.php?full=1">Display full details</a></h3>';}else{echo '<h3><a href="droboStatus.php">Display summary</a></h3>';}

  // Get the shares configuration
  exec("cat /mnt/DroboFS/System/DNAS/configs/shares.conf", $output);
  // Make one string from it
  $output = implode(" ", $output);
  // Parse and display it
  $nasconf = parseBasicXML($output);
  displayNASconf($nasconf);

  // Get the status from port 5000 and display it
  echo '<h2><center>Drobo Current Status</center></h2>';
  displayCurrentStatus(getCurrentStatus(),$full);

  ?> 
 </body>
</html>
Publié dans Notes Info | Laisser un commentaire

Le vacarme des bombes et le silence de la Gauche

Chers ami(e)s, chers camarades,

Je m’adresse exceptionnellement à vous pour transmettre toute mon indignation au regard de la position politique défendue par les principaux représentants de la Gauche française concernant la situation en Libye.

Je suis outré par l’attitude irresponsable de nos représentants politiques qui ont commis une grave erreur en cautionnant, au sein du parlement européen, une position commune pour la mise en place de la résolution 1973 du conseil de sécurité de l’ONU.

Il faut ici rétablir une vérité et dénoncer un mythe : cette résolution n’a jamais eu pour objectif de défendre « le peuple »  libyen. La résolution et les pays à l’origine de cette initiative (La France, l’Angleterre et les Etats-Unis) avaient pour unique objectif d’obtenir un passe-droit pour s’immiscer dans les affaires internes d’un pays souverain.

Je réfute donc totalement les arguments défendus par la majorité des partis de gauche. Ils auraient dû dénoncer l’hypocrisie sans nom que constituait cette résolution de l’ONU. Les partis de gauche auraient dû dénoncer la manipulation et la propagande visant à nous faire croire qu’il n’y avait pas d’autres solutions alternatives à une intervention militaire.

Depuis quand l’ONU protège-t-elle les peuples en créant des zones d’exclusion aérienne?

Quelle résolution de l’ONU a permis la création d’une zone d’exclusion aérienne pour empêcher les avions et hélicoptères de Tsahal de bombarder les populations civiles de Gaza ?

Entre 1959 et 1975, quelle résolution de l’ONU a permis la création d’une zone d’exclusion aérienne pour empêcher les avions états-uniens de lancer des bombes de napalm sur le peuple vietnamien?

Depuis quand l’ONU prend-il parti pour un camp plus qu’un autre dans le cadre d’une guerre civile?

Quelle résolution de l’ONU a permis de soutenir ouvertement la guérilla zapatiste au Mexique en 1994 ? Quelle résolution a protégé les populations indigènes du Chiapas des massacres perpétrés par l’armée mexicaine à cette époque ?

Quelle résolution de l’ONU a permis de soutenir ouvertement la guérilla sandiniste en lutte contre le dictateur Somoza au Nicaragua en 1978?

Quelle résolution de l’ONU a permis de soutenir la guérilla cubaine en lutte contre la dictature de Fulgencio Batista en 1958?

« Le capitalisme porte en lui la guerre comme la nuée porte l’orage. » Jaurès

Notre devoir de militant internationaliste n’est pas de défendre l’intervention de nos armées impérialistes (sous quelque mandat que ce soit) mais de défendre l’inaliénable droit des peuples à disposer d’eux-mêmes, le dialogue, la médiation et la paix. La lutte armée, la guerre ou toute intervention militaire est pour nous, citoyens internationalistes, depuis toujours le dernier des recours. Faudrait-il le rappeler?

Entre la passivité et une intervention militaire, il y avait plusieurs issues possibles et notamment la proposition de médiation proposée par les présidents Latino-Américains et ignorée par l’ONU,  le monde entier, à commencer par nos partis de gauche. Alors que près d’un mois avant que ne tombent les premières bombes, Fidel Castro (1), les présidents Chavez (Venezuela), Correa (Equateur), Morales (Bolivie), Ortega (Nicaragua) avaient prévenu le monde entier des menaces impérialistes qui planaient sur la Libye et le peuple libyen.

AUCUN PARTI POLITIQUE en France n’a relayé ces analyses. AUCUN PARTI POLITIQUE en France, n’a soutenu l’initiative de paix présentée par ces présidents d’Amérique du Sud. L’histoire aujourd’hui leur donne raison.

Quand bien même cette initiative aurait échoué, elle nous aurait permis d’être à l’origine de mobilisation pour la paix et pour la défense de la souveraineté du peuple libyen. Cette posture politique nous aurait donné, aujourd’hui, la possibilité de faire barrage aux motivations impérialistes de Nicolas Sarkozy et de l’UMP.  Maintenant que la Gauche française a cautionné l’intervention militaire, elle est dans une impasse.

Où est la cohérence, entre la position politique de la gauche aujourd’hui et nos actions d’hier, lorsque nous dénoncions l’entrée de la France dans le commandement intégré de l’OTAN, initiative de l’UMP qui annonçait clairement des prétentions impérialistes futures?

Je suis convaincu que nous aurions véritablement aidé le peuple libyen en tenant en laisse notre chien de guerre de président.

« La liberté de la presse s’arrête là où commence mon droit à une véritable information », VD

Ce qui me frappe, c’est l’illusion qu’arrive à créer nos adversaires politique, en nous faisant croire que nous connaissons tout et comprenons toute la complexité politique qui existe en Libye.

Qui est capable de situer la Libye sur une carte? Qui est capable de décrire les régions de ce pays? Qui connaît la date de l’indépendance de la Libye et les conditions historiques dans laquelle elle se réalisa? Qui est en mesure d’expliquer les projets politiques des deux camps qui s’affrontent aujourd’hui en Libye?

Il serait intéressant de demander au 60% de français qui soutienne l’intervention militaire en Libye de répondre aux questions précédentes pour savoir sur quels éléments ils fondent leur opinion.

Je suis étonné de la facilité avec laquelle le citoyen lambda est capable d’affirmer avec conviction que Kadhafi est le méchant et que les habitants de Benghazi sont les gentils (2). D’autant plus lorsque l’on sait que l’opinion publique est forgée à partir des informations fournies par le journal de 20h, 20 minutes ou direct matin.

Il convient de rappeler que 70% des dépêches qui circulent dans les rédactions du monde entier proviennent d’agences de presse situées aux Etats-Unis et en Europe.

Compte tenu des contraintes de temps imposées aux journalistes pour effectuer leur travail, il est humainement impossible de pouvoir vérifier la véracité de toutes ces dépêches. Par conséquent, il faut être vigilant sur les informations fournis par les mass-médias.

Quand on connait également le besoin pour les forces impérialistes de préparer le terrain de l’opinion publique pour donner une légitimité à une intervention militaire où que ce soit (par ex : Armes de destruction massive en Irak), il faut être doublement vigilant.

L’Impérialisme, stade suprême du capitalisme

Le soir des premiers bombardements en Libye, en l’espace de quelques heures, le pays qui a comme Président le prix Nobel de la paix, a envoyé 110 missiles Tomahawks (3). Sachant qu’un seul de ces missiles coûte 569 000 dollars.  Cela fait donc 62,59 millions de dollars qui sont partis en fumée pour détruire des vies humaines.

Alors que ces dernières années, la droite enterre petit à petit le programme du conseil national de la résistance sous prétexte que les caisses de l’Etat sont « vides » et que nous sommes en pleine crise (du capitalisme). Combien de millions d’euros qui ne seront donc pas investis dans le logement ou la santé, sont actuellement gaspillés pour assouvir les prétentions impérialistes de la droite française ???(4) Qui dénonce cela?

Un peuple a le droit et le devoir de s’insurger pour renverser un gouvernement qui viole ses droits fondamentaux. En revanche, une armée étrangère, l’ONU, le Pape ou la Gauche française ne peuvent pas se justifier,  se vanter d’user ou même de déléguer ce droit.

La position politique défendue par nos représentants de gauche cautionne le deux poids, deux mesures de l’ONU et de l’UMP. Ceci est intolérable.

Par respect et solidarité pour nos frères Libyens qui sont les seuls à pouvoir décider du futur politique de leur pays, je refuse de cautionner la position de nos représentants de gauche.

Mobilisons-nous camarades pour dénoncer l’hypocrisie de l’ONU et l’impérialisme « humanitaire » de la droite.

Défendons la souveraineté nationale et la paix en Libye.

Fraternellement,

Miguel

Sources:

(1): http://www.legrandsoir.info/Le-plan-de-l-OTAN-est-d-occuper-la-Libye.html

(2): http://www.legrandsoir.info/Bombarder-la-Libye-de-1986-a-2011-Countercurrents.html

(3) : http://www.google.com/hostednews/afp/article/ALeqM5j2l3a0BG7QXcmFeMeoXoG5zxLcVA?docId=CNG.27b1069401b8b574be3606496b0f4aa9.661

(4): http://lexpansion.lexpress.fr/economie/ce-que-coute-la-guerre-en-libye_251160.html

Publié dans Politique & société | Un commentaire

Télécharger une vidéo flash RTMP avec Linux

Pour regarder une vidéo flash en streaming depuis un site de télévision ou autre (streaming rtmp) sans utiliser le plugin flash, on peut télécharger la vidéo sur son ordinateur comme ceci :

  1. Ouvrir la page web avec Firefox. Clic droit puis Code source de la page.
  2. Rechercher l’insertion de la vidéo, en général « <embed> », par exemple <embed src= »http://site.tv/player.swf?admin=false&amp;autoPlay=true&amp;videorefFileUrl=http%3A%2F%2Fsite.tv%2Fvideos%2FmyFilm%2Cvideo.xml » […]>
  3. L’URL d’un fichier XML est transmise au player flash. C’est ce fichier qui contiend la véritable référence vers la vidéo. On copie donc cette URL dans la barre d’adresse du navigateur en remplaçant les codes de caractères spéciaux par les caractères eux-mêmes, ici : http://site.tv/videos/myFilm,video.xml
  4. Le fichier XML est affiché par Firefox. On recherche dedans l’URL directe du flux video (il peut y en avoir plusieurs, par exemple la vidéo normale ou haute définition). Par exemple rtmp://site.tv/365/2744?lg=en
  5. Installer flvstreamer (apt-get install flvstreamer pour Ubuntu, urpmi flvstreamer pour Mandriva, etc)
  6. Le lancer avec l’URL rtmp : flvstreamer -o outputFile.flv -r « rtmp://site.tv/365/2744?lg=en« 
  7. Si le téléchargement est incomplet et que le message suivant s’affiche : ERROR: ReadPacket, failed to read RTMP packet header
    Download may be incomplete (downloaded about 57.20%), try resuming
    Il suffit de poursuivre le téléchargement en relançant la commande avec l’option -e en plus :
    flvstreamer -e -o outputFile.flv -r « rtmp://site.tv/365/2744?lg=en »
  8. Tant que le fichier n’est pas complet, relancer cette même commande.
  9. Il ne reste plus qu’à lire le fichier outputFile.flv avec mplayer ou vlc !
Publié dans Notes Info | Laisser un commentaire

Synchronisation automatique entre deux disques NAS

Scenario

On a deux disques réseaux NAS (dans ce cas deux Iomega StorCenter ix2). On veut qu’un groupe d’utilisateurs (sous Windows/Mac OS X/Linux) puisse sauvegarder ses données vers un de ces disques et qu’il y ait une copie supplémentaire sur le deuxième disque (sauvegarde hors-site). La sécurité n’est pas un enjeu majeur ici, car tout se passe sur un réseau interne. Un mot de passe stocké en clair dans un serveur n’est pas dramatique.

Synchronisation quotidienne par un ordinateur linux

Configuration

Chaque utilisateur a un compte et un répertoire réservé sur le disque Disk1. Sur le disque Disk2, il y a un répertoire « Backups ». L’accès à ces répertoires est autorisé par le protocole de partage Windows/CIFS/SMB sur les deux disques.
Dans cet exemple, les deux disques ont un nom DNS défini (Disk1 et Disk2). On peut aussi utiliser l’adresse IP des disques à la place.
Un utilisateur backupUser est déclaré sur les deux disques. Sur Disk1, il a les droits de lecture sur tous les répertoires des utilisateurs. Sur Disk2 il a un accès complet (lecture-écriture) au répertoire Backups.
Sur l’ordinateur linux, il faut créer les répertoires /mnt/serv1 et /mnt/serv2.

Script de sauvegarde

Un script perl, backupNAS.pl effectue la copie du disque 1 sur le disque 2 :

#!/usr/bin/perl -w
#
# Il faut : - un utilisateur backupUser avec - les droits de lecture sur tous les répertoires du Disk1
#                                                                 - les droits d'écriture sur le répertoire Disk2/Backups
#           -  Le répertoire Disk2/Backups doit contenir un fichier nommé AutoBackup

# Monter le Disk2 dans le répertoire /mnt/serv2
`umount /mnt/serv2; mount -t cifs -o user=backupUser,password="MyBackupPassword",iocharset=utf8,file_mode=0777,dir_mode=0777 //Disk2/Backups /mnt/serv2/`;
$err1 = $?;

# On vérifie que le fichier "AutoBackup" est présent et qu'il n'y a pas eu d'erreur
if ((not -e '/mnt/serv2/AutoBackup') or $err1 != 0){
	die "ERROR : cannot mount Disk2 !\n";
}

# On liste les dossiers du disque 1
@shareList1 = `smbclient -N -L //Disk1`;

# On filtre pour n'avoir que les dossiers partagés. Les lignes ressemblent à : 
# "        nomDossier        Disk  "
@reps1 = ();
print "Disk 1\n";
foreach $share1(@shareList1){
	chomp $share1;
	if ($share1 =~ /^\s+(\S+)\s+Disk\s+/){
		($name,) = $share1 =~ /^\s+(\S+)\s+Disk\s+/;
		push (@reps1, $name);
	}
}

# Chaque répertoire du disque 1 est monté, copié puis démonté
foreach $rep1(@reps1){
	`umount /mnt/serv1`;
	`mount -t cifs -o user=backupUser,password="MyBackupPassword",ro,iocharset=utf8,file_mode=0444,dir_mode=0555,noperm //Disk1/$rep1 /mnt/serv1/`;
	if ($? != 0){
		print "ERROR : Directory //Disk1/$rep1 mount failed !\n";
		next;
	}
	print "SYNCHRO rsync /mnt/serv1/ /mnt/serv2/$rep1\n";
	print `rsync -rltpv --stats  /mnt/serv1/ /mnt/serv2/$rep1`; # --del if deleted files must be removed on Disk2 too
 }
`umount /mnt/serv1`;
print "SERVER 1 : backup to DISK 2 is done !\n";

Script Cron

Il manque un petit script pour appeler le script ci-dessus chaque jour et créer un log de la sauvegarde. On édite /etc/cron.daily/backupNAScall :

#!/bin/bash
echo >> /var/log/backupServers.log
echo >> /var/log/backupServers.log
echo "-------------------------------------------------" >> /var/log/backupServers.log
echo "Beginning BACKUP -> Launching backupNAS.pl" >> /var/log/backupServers.log
date -R >> /var/log/backupServers.log
perl /pathToScript/backupNAS.pl >> /var/log/backupServers.log

echo "BACKUP FINISHED" >> /var/log/backupServers.log
date -R >> /var/log/backupServers.log
echo "**************************************************" >> /var/log/backupServers.log

Chaque jour, la sauvegarde est lancée et des logs détaillés (y compris date, heure et liste des fichiers mis à jour) sont stockés dans le fichier /var/log/backupServers.log !

Depuis un des disques (en cours…)

Le prochaine étape sera de supprimer le PC Linux et d’exécuter le script de sauvegarde sur le système linux minimal d’un des disques. Ce qui suit est spécifique au modèle de disque réseau utilisé (des Iomega StorCenter ix2).
Un serveur ssh peut être activé sur le disque en allant sur la page https://adresseDisque/support.html et en cliquant sur la première icône. Une fois le disque redémarré (en suivant les instructions)on peut se connecter au disque avec ssh root@adresseDisque. Le mot de passe est « soho » suivi du mot de passe du compte administrateur configuré sur le disque (dans l’interface web). On a accès à un petit système Linux (sans perl ni bash, juste sh ou ash – donc le code précédent ne fonctionnera pas tel quel. Par contre rsync est présent).

Dans /etc/crontabs/root il y a un message pour signifier que pour créer des tâches répétées, il faut utiliser le fichier sohoProcs.xml :

# DO NOT SCHEDULE TASKS HERE (use sohoProcs.xml to schedule tasks)
Le fichier /usr/local/cfg/sohoProcs.xml semble correspondre. On y trouve des déclarations comme :

<Program Name= »reportquota » Path= »/bin/sh »>
<Args>/usr/bin/reportquota</Args>
<SysOption Days= »1″ Scheduled= »1″ StartTime= »01:00″/>
</Program>

Je n’ai pas encore essayé d’ajouter une déclaration pour mon script, mais ça doit être la bonne direction pour lancer un script chaque jour à 1h du matin…

Ce wiki pourrait être utile : http://ix2-200.wikidot.com/

Scenario

You have two NAS devices, for example two network hard drives (in my case Iomega StorCenter ix2). You want your users (Windows/Mac OS X/Linux) to be able to backup their data to one of them, and have a mirror of the backups on the second one (off-site backup). The setup does not need to be very secure, as this works on an internal network, so a password stored in cleartext in a script is not a big deal.

Daily Synchronization by a linux computer

Setup

Each user has an account and associated directory on Disk1. On Disk2, there is only one « Backups » directory. Windows share/CIFS/SMB is activated in both disks.
Here, both disks have DNS names « Disk1 » and « Disk2 ». You can use the IP adress of the disks instead.
A backupUser user is declared on both disks, with reading rights only on all Disk1 directories, and all rights on Disk2 Backups directory.
On the linux computer, the directories /mnt/serv1 and /mnt/serv2 must be created.

Backup script

First, let’s make a small perl script backupNAS.pl to perform the backup :

#!/usr/bin/perl -w
#
# You need : - a backupUser with - all reading rights on all Disk1 directories
#                                                   - writing rights in Disk2/Backups
#           - the  Disk2/Backups directory must contain a file named AutoBackup
#

# Mounting Disk2 in /mnt/serv2
`umount /mnt/serv2; mount -t cifs -o user=backupUser,password="MyBackupPassword",iocharset=utf8,file_mode=0777,dir_mode=0777 //Disk2/Backups /mnt/serv2/`;
$err1 = $?;

# Check : There must be an "AutoBackup" file in the directory if the disk in mounted correctly
if ((not -e '/mnt/serv2/AutoBackup') or $err1 != 0){
	die "ERROR : cannot mount Disk2 !\n";
}

# Get the list of user directories in Disk1
@shareList1 = `smbclient -N -L //Disk1`;

# Filtering the list to get only the shared directories. Lines should look like 
# "        username        Disk  "
@reps1 = ();
print "Disk 1\n";
foreach $share1(@shareList1){
	chomp $share1;
	if ($share1 =~ /^\s+(\S+)\s+Disk\s+/){
		($name,) = $share1 =~ /^\s+(\S+)\s+Disk\s+/;
		push (@reps1, $name);
	}
}

# Each directory will be mounted then unmounted
foreach $rep1(@reps1){
	`umount /mnt/serv1`;
	`mount -t cifs -o user=backupUser,password="MyBackupPassword",ro,iocharset=utf8,file_mode=0444,dir_mode=0555,noperm //Disk1/$rep1 /mnt/serv1/`;
	if ($? != 0){
		print "ERROR : Directory //Disk1/$rep1 mount failed !\n";
		next;
	}
	print "SYNCHRO rsync /mnt/serv1/ /mnt/serv2/$rep1\n";
	print `rsync -rltpv --stats  /mnt/serv1/ /mnt/serv2/$rep1`; # --del if deleted files must be removed on Disk2 too
 }
`umount /mnt/serv1`;
print "SERVER 1 : backup to DISK 2 is done !\n";

Cron script

Now, let’s create a small script that will call this one daily and log the results. Edit /etc/cron.daily/backupNAScall :

#!/bin/bash
echo >> /var/log/backupServers.log
echo >> /var/log/backupServers.log
echo "-------------------------------------------------" >> /var/log/backupServers.log
echo "Beginning BACKUP -> Launching backupNAS.pl" >> /var/log/backupServers.log
date -R >> /var/log/backupServers.log
perl /pathToScript/backupNAS.pl >> /var/log/backupServers.log

echo "BACKUP FINISHED" >> /var/log/backupServers.log
date -R >> /var/log/backupServers.log
echo "**************************************************" >> /var/log/backupServers.log

Now each day, the backup will start and detailled logs (including the date and time) will be stored in /var/log/backupServers.log !

From the NAS (in progress…)

Next step would be to remove the need for the linux computer entirely and execute this on the small linux system of the NAS disk. The following is specific to the NAS device (Iomega StorCenter ix2).
A ssh server can be activated on the NAS by going to the page https://myDiskAddress/support.html, then activating the access option.
When the disk has rebooted, you can connect to it with ssh root@myDiskAddress. The password is « soho » followed by the admin account password that was set up to access the web interface. With this, you have access to a small system (without perl or bash, just sh or ash – the previous code won’t work on this device « as is ». rsync is there, though).

In /etc/crontabs/root there is a warning :

# DO NOT SCHEDULE TASKS HERE (use sohoProcs.xml to schedule tasks)
The file /usr/local/cfg/sohoProcs.xml seems to be the right place for schheduled tasks. In it, we find commands like this :

<Program Name= »reportquota » Path= »/bin/sh »>
<Args>/usr/bin/reportquota</Args>
<SysOption Days= »1″ Scheduled= »1″ StartTime= »01:00″/>
</Program>

I did not try to add a custom command yet, but this should be the way to go…

This wiki might be helpful : http://ix2-200.wikidot.com/

Publié dans Notes Info | Laisser un commentaire

Origine de PyVotons!

Ce texte résume les idées principales qui ont mené au lancement de PyVotons!. Il date de février 2009, bien avant la première initiative concrète vers PyVotons.

Il s’agissait de proposer des outils logiciels pour faire fonctionner un groupe (dans ce cas un parti politique pour l’élaboration de son programme) avec des initiatives et des décisions collectives.

Logiciel DECISION

Les utilisateurs

  • Un identifiant type wiki PrenomNom et un mot de passe
  • quelques informations personnelles optionnelles
  • un contact e-mail/téléphone fixe/portable
  • Les disponibilités pour des réunions exprimées par jour de la semaine et horaires

Application Sondage

Cette application sert à choisir une date de réunion ou prendre rapidement une décision simple dans un petit groupe, avec un système de vote public.

  • dans le style du site internet doodle
  • Un utilisateur tape la question à poser à un groupe d’utilisateurs (Quelle date pour la réunion ?)
  • Il spécifie la liste des réponses possibles (12/02 à 17h, 12/02 à 18h, 17/02 à 20h)
  • Il envoie le lien vers la page du sondage qu’il a créé.
  • Le logiciel génère une page web affichant la question et au-dessous la liste des possibilités. Chaque utilisateur entre son nom puis coche les réponses qui lui conviennent.
  • A la fin du sondage il suffit de compter les cases cochées pour savoir quelle date est la plus populaire
  • Il est possible d’étendre ça à une plus grande variété de sondage (choisir parmi une liste de solutions, noter chaque réponse dans une liste…). Pour que ça reste simple à utiliser, il faut présenter à la personne qui veut créer un sondage un ensemble de sondages types parmi lesquelles elle va sélectionner le type de sondage qu’elle souhaite lancer.

Application Envoi de messages

  • L’application permet d’envoyer un e-mail selon les événements qui se déroulent sur le site (invitation à un sondage, nouvelle proposition, ouverture d’un vote, rappel d’une fin de vote proche, résultats d’un vote disponible).
  • Il serait utile de rajouter la possibilité d’envoyer des SMS aux gens qui n’ont pas d’e-mail sous la main pour les prévenir de ce qui se passe sur le site (y’a-t-il des services gratuits de ce type ?)
  • Il doit être possible de se désabonner selon le type de message ou de grouper les messages pour en recevoir un par jour ou un par semaine au maximum.

Application Vote

Soumettre une ou plusieurs questions/propositions/candidats au vote

On doit pouvoir expérimenter ici divers systèmes de vote (classement des candidats, note des propositions, un choix unique…) à un ou plusieurs tours, qui peuvent être anonymes ou non.

Au moment de la création d’une nouvelle élection/référendum, on doit pouvoir choisir un ou plusieurs systèmes de votes (cela permettrait avec des personnes bien motivées de comparer les résultats selon le système utilisé).

Application Foire aux idées

Le but ici est que chacun puisse lancer une proposition et que la sélection et les amendements de ces propositions se fassent par un processus collectif.

  • Proposer une proposition P
  • Commenter une P existante : critiquer ou au contraire aller dans le sens de la proposition
  • Noter une P (sur 20 par exemple)
  • Lier deux propositions (elles sont identiques, apparentées, l’une s’inspire de l’autre, ou c’est une nouvelle version de l’autre…)
  • Permettre la discussion (avec par exemple un forum lié à la P) pour faire évoluer une proposition et en créer une nouvelle intégrant le résultat de la discussion
  • Définir des thèmes et des mots-clés pour classer un peu les propositions
  • Pour chaque proposition, synthèse des arguments pour et contre
  • Moteur de recherche des propositions (éviter de proposer 10 fois la même, en trouver une apparentée). A ce niveau-là, ça devrait fonctionner un peu comme bugzilla
  • Amender ou fusionner des propositions : étiqueter comme anciennes les propositions obsolètes et en écrire une nouvelle liées aux anciennes
  • On peut éliminer les propositions anciennes (en les gardant dans un historique) quand elles sont remplacées par des propositions plus récentes
  • Une synthèse des propositions les mieux notées doit être générée périodiquement.
  • Les propositions qui sont remontées au-dessus d’un certain seuil (note + nombre de personnes ayant noté) doivent être soumises périodiquement au vote de tous avec l’application Vote
  • Les propositions soumises au vote seront étiquetées « rejetée » ou « acceptée » avec une référence au vote correspondant

Wiki de synthèse

Ce wiki doit être le lieu de synthèse de l’ensemble des propositions retenues. Elles doivent être listées et permettre d’élaborer des textes cohérents pour les articuler. (Inclusion de mediaWiki, ou MoinMoinWiki)

Base de connaissances Wiki

  • références à des livres, articles, réflexions
  • Le but est d’aider à comprendre le monde et d’avoir des arguments pour soutenir les discussions sur les propositions
  • (Inclusion de mediaWiki, ou MoinMoinWiki)

Forum et Discussion en ligne (« chat », IRC)

  • Le forum permet de discuter en ligne même quand les interlocuteurs n’ont pas de plages horaires communes disponibles : chacun écrit et lit quand il le souhaite, et les archives sont disponibles. (intégration de PhpBB par exemple…)
  • L’IRC permet de remplacer les réunions téléphoniques ou simplement de discuter en direct en mode texte. Les discussions peuvent être archivées. (serveur IRC quelconque).

Quelques remarques

Attention, tout ceci n’a pas pour but de supprimer les réunions et les contacts humains, mais de permettre au maximum de gens de proposer et de participer à la prise de décision, grâce aux technologies récentes. Pas de société des experts, autrement dit…

Les humains restant des humains il faudra trouver des méthodes de régulation pour éviter le spam, les guerres d’édition dans les wikis et le pouvoir trop important des modérateurs.

En gros, l’élaboration du programme devrait venir de propositions venues de tous, discutées sur les forums de discussion, par IRC et en réunion classique, notées, puis passées au vote, et enfin ajoutées dans le wiki de synthèse.

Publié dans Documentation | Laisser un commentaire

Le revenu inconditionnel – compte rendu de débat

Voici mes notes détaillées d’une présentation suivie d’un débat sur le revenu inconditionnel, organisée à Grenoble par les Alternatifs et la Fase le 13 octobre 2010. Continuer la lecture

Publié dans Politique & société | Laisser un commentaire

Sortie audio Asus EEE 1005PX

Après l’installation d’Ubuntu 10.04 sur mon netbook Asus EEE 1005PX, la sortie audio (prise jack) ne fonctionnait pas; quand un casque est branché, les haut-parleurs du portable se coupent, mais il n’y a pas de son dans le casque.

La solution a été l’ajout d’une ligne à la fin du fichier /etc/modprobe.d/alsa-base.conf :
options snd-hda-intel model=lifebook

Après un redémarrage, la prise casque fonctionne correctement.

Publié dans Notes Info | 4 commentaires

Etats généraux du renouveau : forum Libération à Grenoble

Ces trois derniers jours, j’ai assisté à une partie du forum organisé par le journal Libération à Grenoble, les Etats Généraux du Renouveau 2011. Un ensemble de conférences, de débats et de recontres entre associations, élus et politiques, journalistes, et le public.

J’ai suivi principalement les conférences et débats sur le thème de la démocratie. Les conférences étaient intéressantes, mais le nombre de questions de la salle étant limité, les thèmes ont souvent été traités de façon incomplète.

Par exemple, la conference « démocratie et internet » s’est résumé a une discussion d’une heure entre deux députés européens, un sociologue, un président d’agglomération et un coach formant les élus à la communication par internet. Je m »attendais à une présentation du rôle d’internet dans le renouvellement de l’idée démocratique dans les démocraties occidentales comme la nôtre.

En 2005 un grand débat autour du projet de constitution europénne a été ouvert par des citoyens largement en dehors du cadre traditionnel des partis politiques. Le rôle des blogs, des forums, des wikis pour résumer les arguments pour et contre le projet, tous ces nouveaux outils qui ont permis au citoyen de s’impliquer dans le débat, voilà un sujet que je pensais voir traiter.

La plus grande partie de la conférence s’est concentrée sur l’utilisation de Facebook et Twitter dans la communication des élus, comment ces outils leur permettent de ne pas perdre le contact avec leurs électeurs. Finalement, internet était presque résumé à une nouvelle façon de faire de la communication politique. Le sociologue a cependant cherché à aborder une thématique plus large et plus intéressante, avec un point de vue plus large que les élus pour qui démocratie se résume à démocratie représentative.

Le rôle d’internet dans les mouvements de contestation en Tunisie et en Egypte a été mentionné, étant donné l’actualité.

Les élus se sentent souvent menacés par (et donc bloquent souvent) l’implication directe des citoyens dans la prise de décision. Le terme de co-décision a été employé plusieurs fois au cours du débat, avec d’intéressantes expériences pratiques d’élus, au niveau d’une mairie avec un processus de co-construction des projets, mais aussi une expérience plus négative à Grenoble, lié au problème du « pas chez moi » lorsqu’il s’agit de construire des équipements nécessaires au niveau global mais comportant des nuisances locales.

La représentativité des assemblées locales des citoyens a aussi été discutée, car la plupart des participants sont des retraités ou des personnes personnellement concernées et opposées aux projets discutés sans vision globale des problématiques

La journée de débat (samedi 29) était de loin la partie la plus intéressante.

La conclusion du dernier jour était ironiquement inappropriée pour un forum de Renouveau ! Un groupe composé uniquement d’hommes, vieux et blancs, qui traînent dans le journalisme ou les cercles de pouvoir depuis plusieurs décennies viennent parler de nouveauté et de révolte contre la société qu’ils ont souvent contribué à créer… Et tous de se présenter par leurs titres de gloire, l’organisateur de se féliciter que tel ancien ministre ait accepté de nous honorer de sa présence…

Une fois de plus, on constate que les partis politiques et les grands médias ne sont pas à l’avant-garde, faisant progresser la démocratie, proposant des nouveautés dans le champ économique et social…

Cette avant-garde, elle vient de simples citoyens, d’associations, de chercheurs. Combien d’années avant un débouché politique ?

Publié dans Politique & société | Laisser un commentaire