Valid XHTML     Valid CSS2    

Langages de scripts, automatisation de commandes et

production de documents structurés :

1. Langages de script, développement rapide et développement Web

                     gilles.hunault "at" univ-angers.fr

 

Table des matières cliquable

  1. Installation des interpréteurs et numéros de version

  2. Le sigle (gH) RPPPR

  3. Mode one-liner en Python et Ruby et guides d'écriture

  4. Vérification et amélioration des programmes dictionnaires

  5. Interfaces ligne de commande et interfaces graphiques

  6. Installation de plusieurs versions, de packages et de modules

  7. Les versions Active State de Tcl, Perl et Python

  8. Installation de Ruby on Rails et Django

 

Il est possible d'afficher toutes les solutions via  ?solutions=1 .

 

1. Installation des interpréteurs et numéros de version

Vérifiez que vous disposez bien des langages Awk, Rexx/Regina, Perl (version 5), Rhino, Php (au moins 5.3), Python (version 3.1), Ruby (version 1.9) ; dans le cas contraire, installez les versions demandées. Pour chaque langage, afficher le numéro de version et pour tous les langages sauf Awk, calculer 2 puissance 8 en mode interactif.

Au passage, à quoi cela sert-il de connaitre (au moins) le nom de tous ces langages ?

Solution :  

L'installation des logiciels sous Linux se fait très simplement avec sudo apt-get.


     sudo apt-get install gawk
     sudo apt-get install regina-rexx
     sudo apt-get install perl
     sudo apt-get install php5-cli
     sudo apt-get install rhino
     sudo apt-get install tcl
     sudo apt-get install tk
     sudo apt-get install python3.1
     sudo apt-get install ruby1.9.1
     
     

Sous Windows, il faut recourir à des installeurs (.exe), par exemple sur le site d'Active State pour Perl, Tcl/Tk et Python. Voici les adresses officielles que nous conseillons pour Windows :

    Langage         Site (cliquer)    
   Awk       gnuwin32   
   Rexx       sourceforge   
   Perl       active state   
   Php       zmws   
   Javascript       mozilla.org   
   Tcl       active state   
   Python       active state    
   Ruby       ruby-lang    

Pour les numéros de version, le paramètre -v ou --version est souvent implémenté :


     $gh> gawk --version
     GNU Awk 3.1.6 Copyright © 1998, 1991-2007 Free Software Foundation, Inc.
     [...]
     
     $gh> regina --version
     Regina REXX-Regina_3.3(MT) 5.00 25 Apr 2004. All rights reserved.
     [...]
     
     $gh> perl --version
     This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi
     [...]
     
     $gh> php --version
     PHP 5.3.2-1ubuntu4.18 with Suhosin-Patch (cli) (built: Sep 12 2012 19:12:47)
     [...]
     
     $gh> rhino
     Rhino 1.7 release 2 2010 01 20
     js> quit()
     
     $gh> tclsh
     % puts "$tcl_platform(osVersion)\n"
     2.6.32-45-generic
     %exit
     
     $gh> wish
     % info patchlevel
     8.5.8
     %exit
     
     $gh> python --version
     Python 2.6.5
     
     $gh> python3.1 --version
     Python 3.1.2
     
     $gh> ruby --version
     ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]
     
     

Le calcul de 2 puissance 8 se fait soit par simple évaluation, soit par appel d'une fonction ou d'une méthode  :


     $gh> regina  rt.rex
     Rexx> say 2**8
     256
     Rexx> exit
     
     $gh> perl pt.pl
     perl> 2**8
     256
     perl> exit
     
     $gh> php -a
     Interactive shell
     php > echo pow(2,8) ;
     256
     php > exit
     
     $gh> rhino
     Rhino 1.7 release 2 2010 01 20
     js> Math.pow(2,8)
     256
     js> quit()
     
     $gh> tclsh
     % set a [expr pow(2,8)]
     256.0
     % exit
     
     $gh> python3
     Python 3.1.2 (r312:79147, Oct 23 2012, 20:07:42)
     [GCC 4.4.3] on linux2
     Type "help", "copyright", "credits" or "license" for more information.
     >>> 2**8
     256
     >>> quit()
     
     $gh> irb # ruby
     irb(main):001:0> 2**8
     => 256
     irb(main):002:0> quit
     
     

Connaitre plusieurs langages de programmation (et de description), même partiellement, c'est être cultivé(e) donc un peu intelligent(e). Dans la mesure où les langages évoluent avec les avancées technologiques, le grand mot en programmation, c'est de savoir s'adapter. En ce sens, la vision conceptuelle proposée ici des langages devrait permettre de «survivre» aux dix prochaines années (mais sans doute pas plus) dans le monde de la programmation...

 

2. Le sigle (gH) RPPPR

Que signifie le sigle (gH) RPPPR ?

Solution :  

Il s'agit des initiales des langages Rexx, Php, Perl, Python et Ruby. Implémenter en RPPPR signifie programmer une solution dans ces cinq langages.

 

3. Mode one-liner en Python et Ruby et guides d'écriture

Peut-on écrire des scripts Python et Ruby en mode one-liner ? Que signifie obfuscated ? Y a-t-il des «bonnes façons» d'écrire des scripts Ruby, des scripts Python ?

Solution :  

Bien sûr. Voir par exemple python impress one-liners, active state, pyp, python sys-admin pour Python et ruby-one-liners, ruby1line, gist.

Le mot anglais obfuscated signifie abscons en français. Voici un premier exemple en Python, un deuxième et un troisième en Ruby.

Il existe des recommandations d'écriture nommées respectivement PEP8 et ruby-style-guide.

 

4. Vérification et amélioration des programmes dictionnaires

Vérifier que les scripts pour la création de dictionnaires fonctionnent sur votre ordinateur si on les applique au fichier long.txt (texte en iso-8859) ou au fichier long.utf (texte en UTF). On ajoutera un "timing" de la durée d'exécution.

Solution :  

Voir la page des applications transversales.

 

5. Interfaces ligne de commande et interfaces graphiques

Ecrire en RPPPR un script testarg qui "comprend" aussi bien --nblig=5 --nomfic=test.xml que --nomfic=test.xml --nblig=5 et nomfic test.xml nblig 5. Modifier ensuite ces scripts pour qu'ils affichent une interface de saisie de ces deux paramètres.

Solution :  

Solution fournie en TP (pour ceux et celles qui viennent...).

 

6. Installation de plusieurs versions, de packages et de modules

Après réflexion, installer à la fois Python2.7 et Python3.3 et leur installeur de module respectif pip. On passera par virtualenv.

Après réflexion, installer à la fois Ruby1.8 et Ruby 1.9. On passera par rvm.

Installer le package Tk pour Perl puis lister tous les modules Perl installés. On installera aussi YAML::Perl et perldoc et les pmtools. Installer les modules easygui et pymysql pour Python puis et hirb pour Ruby. Est-ce un gemme  ? Comment fait-on pour lister les packages ou modules installés en Python et en Ruby ? Et pour gérer des versions différentes des langages Python, Perl ou Ruby sur un même ordinateur ?

Solution :  

Il n'y a en général aucune difficulté à installer des logiciels sous Linux. Il faut juste prendre des précautions avec les alias, les variables d'environnement. C'est pourquoi l'utilisation de curl se fait via \curl avec un antislash initial pour exécuter la commande et non pas son alias. Le site officiel pour curl est http://curl.haxx.se/ et nous avons mis dans curl_help.txt le rappel des commandes de curl mais on n'oubliera pas de lire le wiki anglais associé pour comprendre ce que signifie le C dans cURL et aussi pour savoir différentier curl de wget.

De la même façon, le site officiel de rvm est https://rvm.io/ et nous avons mis dans rvm_help.txt le rappel des commandes de rvm et dans gem_help.txt celles de gem. En particulier, gem list fournit la liste des "gemmes" (packages et modules) installées pour Ruby car il n'y a pas d'option pour cela via la commande ruby, ce qu'on vérifie avec ruby --help.

Pour Python, le tutorial sur les modules explique qu'il faut utiliser la fonction dir car il n'y a pas d'option pour lister les modules et packages cela via la commande python, ce qu'on vérifie avec python --help. On peut aussi utiliser, en ligne de commande python -vc "help('modules')" ou yolk -l si on a installé le module yolk et enfin pip freeze.

Pour Perl, il y a plusieurs façons de savoir quels modules sont installés. Par exemple on peut utiliser cpan -l ou pminst ou pmall, à condition d'avoir installé sous Linux les packages correspondants et en particulier perl-doc et les pmtools. Dans la longue liste des 23500 modules (début janvier 2013) du CPAN que nous reproduisons ici on trouve de quoi utiliser YAML, comme le montre un simple grep :


     grep -i yaml cpanmodules2013-01.txt > perl_yaml.txt
     
     Apache      MIYAGAWA  Apache-Session-Serialize-YAML-0.02.tar.gz  2k  18 Jul 2002
     App         HOLLY     App-CLI-Plugin-Config-YAML-Syck-1.2.tar.gz  40k  04 Jan 2010
     App         HOLLY     App-CLI-Plugin-Log-Dispatch-Configurator-YAML-1.1.tar.gz  38k  19 Sep 2011
     Bryar       RJBS      Bryar-Config-YAML-0.103.tar.gz       10k  16 Jan 2009
     Cache       NACHBAUR  Cache-YAMLCache-0.01.tar.gz           3k  27 Oct 2005
     Catalyst    BAUERB    Catalyst-Plugin-Config-YAML-0.04.tar.gz  3k  29 Dec 2005
     Catalyst    BOBTFISH  Catalyst-View-REST-YAML-0.01.tar.gz   1k  22 Jan 2010
     CGI         COSMICNET CGI-Application-Plugin-YAML-0.03.tar.gz  3k  02 Feb 2009
     CGI         MARKLE    CGI-FormBuilder-Source-YAML-1.0.8.tar.gz  5k  17 Nov 2007
     CGI         MSOULIER  CGI-Session-YAML-0.3.tar.gz           3k  08 May 2008
     CGI         NEKOKAK   CGI-Application-Plugin-Config-YAML-0.01.tar.gz  3k  28 Oct 2005
     CGI         RSAVAGE   CGI-Session-Serialize-yaml-4.26.tgz   5k  24 Aug 2010
     Config      MDXI      Config-YAML-1.42.tar.gz               6k  25 Sep 2005
     Config      MEETTYA   Config-YAML-Modern-0.36.tar.gz       12k  25 Aug 2011
     Config      TIMA      Config-YAML-Tiny-1.42.0.tar.gz        8k  04 Dec 2010
     CPAN        DAGOLDEN  CPAN-Meta-YAML-0.008.tar.gz          30k  14 Mar 2012
     Data        ANDYA     Data-YAML-0.0.6.tar.gz               12k  07 Mar 2009
     Data        BARBIE    Data-Phrasebook-Loader-YAML-0.12.tar.gz  10k  07 Oct 2012
     Data        JOHND     Data-Properties-YAML-0.04.tar.gz      4k  07 May 2012
     Data        RENEEB    Data-Validate-WithYAML-0.09.tar.gz   11k  29 Jan 2012
     Data        RENEEB    Data-Validate-WithYAML-Plugin-EMail-0.02.tar.gz  7k  05 Jan 2012
     Data        RENEEB    Data-Validate-WithYAML-Plugin-NoSpam-0.02.tar.gz  6k  05 Jan 2012
     Data        RENEEB    Data-Validate-WithYAML-Plugin-Phone-0.01.tar.gz  6k  04 Jan 2012
     Data        RENEEB    Data-Validate-WithYAML-Plugin-URL-0.01.tar.gz  6k  04 Jan 2012
     Data        SHARYANTO Data-Format-Pretty-YAML-0.04.tar.gz  11k  21 Nov 2012
     DBIx        MONTUORI  DBIx-Class-EasyConf-YAML-0.11.tar.gz  4k  18 Aug 2009
     FormValidatorHORIUCHI  FormValidator-Simple-ProfileManager-YAML-0.06.tar.gz  3k  09 Apr 2006
     Inline      INGY      Inline-YAML-0.11.tar.gz              20k  14 Nov 2010
     IO          NKUITSE   IO-YAML-0.08.tar.gz                  12k  03 Oct 2009
     JSON        TOBYINK   JSON-JOM-Plugins-YAML-0.002.tar.gz   44k  04 Dec 2011
     JSON        TODDR     YAML-Syck-1.22.tar.gz               163k  04 Dec 2012
     Log         FMERGES   Log-Dispatch-Configurator-YAML-0.03.tar.gz  12k  08 Sep 2007
     MLDBM       INGY      YAML-MLDBM-0.10.tar.gz                3k  02 Feb 2003
     Mojolicious DATA      Mojolicious-Plugin-YamlConfig-0.1.5.tar.gz  11k  15 May 2012
     MooseX      NUFFIN    MooseX-YAML-0.04.tar.gz               4k  07 Feb 2010
     MouseX      GFUJI     MouseX-YAML-0.001.tar.gz             16k  18 Dec 2009
     Padre       BOWTIE    Padre-Plugin-YAML-0.07.tar.gz        25k  13 May 2012
     Padre       ZENOG     Padre-Plugin-YAML-0.01.tar.gz        11k  24 Jun 2011
     RDF         AUTRIJUS  RDF-YAML-0.11.tar.gz                 10k  22 Oct 2003
     Sledge      MIKIHOSHI Sledge-Config-YAML-0.09.tar.gz       46k  10 Mar 2010
     Template    INGY      Template-Plugin-YAMLVal-0.10.tar.gz  21k  07 Jun 2011
     Template    RCLAMP    Template-Plugin-YAML-1.23.tar.gz      2k  15 Dec 2008
     Test        BARBIE    Test-CPAN-Meta-YAML-0.21.tar.gz      15k  12 Aug 2012
     Test        BARBIE    Test-YAML-Meta-0.19.tar.gz            6k  15 Feb 2011
     Test        INGY      YAML-0.81.tar.gz                    112k  19 Apr 2012
     Test        JROCKWAY  Test-YAML-Valid-0.04.tar.gz          25k  09 Jan 2010
     Test        MSTROUT   YAML-0.84.tar.gz                    118k  13 Jul 2012
     UNIVERSAL   GUGOD     UNIVERSAL-to_yaml-0.10.tar.gz        17k  18 Oct 2006
     YAML        ADAMK     YAML-Tiny-1.51.tar.gz                42k  11 Mar 2012
     YAML        ADAMK     YAML-Tiny-Stream-0.01.tar.gz         28k  12 Apr 2011
     YAML        ALEX      YAML-Accessor-0.44.tar.gz             7k  23 Feb 2012
     YAML        FAYLAND   YAML-LoadURI-0.01.tar.gz             20k  02 Feb 2009
     YAML        FLORIAN   YAML-LoadFileCached-0.21.tar.gz       3k  03 Feb 2003
     YAML        INGY      YAML-0.73.tar.gz                    115k  19 Apr 2011
     YAML        INGY      YAML-0.81.tar.gz                    112k  19 Apr 2012
     YAML        INGY      YAML-LibYAML-0.38.tar.gz            172k  04 Jan 2012
     YAML        INGY      YAML-Manual-0.10.tar.gz              14k  02 Dec 2008
     YAML        INGY      YAML-MLDBM-0.10.tar.gz                3k  02 Feb 2003
     YAML        INGY      YAML-Old-0.81.tar.gz                 94k  04 Dec 2008
     YAML        INGY      YAML-Parser-Syck-0.01.tar.gz          3k  01 Oct 2003
     YAML        INGY      YAML-Perl-0.02.tar.gz                77k  09 Mar 2009
     YAML        INGY      YAML-Shell-0.60.tar.gz               15k  01 Dec 2008
     YAML        INGY      YAML-Tests-0.06.tar.gz               19k  22 Jun 2007
     YAML        LEOCHARRE YAML-DBH-1.08.tar.gz                  5k  27 Aug 2009
     YAML        MARCEL    YAML-Active-1.100810.tar.gz          27k  22 Mar 2010
     YAML        MOCONNOR  YAML-AppConfig-0.16.tar.gz           12k  09 Jul 2006
     YAML        MSCHILLI  YAML-Logic-0.05.tar.gz               10k  06 Aug 2011
     YAML        MSTROUT   YAML-0.84.tar.gz                    118k  13 Jul 2012
     YAML        RJE       YAML-Yaml2Html-0.5.tar.gz             5k  25 Feb 2005
     YAML        ROKR      YAML-Tiny-LikeJSON-0.0011.tar.gz      2k  30 May 2010
     YAML        SHARYANTO YAML-Tiny-Color-0.03.tar.gz          12k  22 Nov 2012
     YAML        TODDR     YAML-Syck-1.22.tar.gz               163k  04 Dec 2012
     

Chaque langage a son propre système de gestion de version. Pour perl, python et ruby, ces gestionnaires se nomment respectivement perlbrew, pip et rvm.

 

7. Les versions Active State de Tcl, Perl et Python

Installer pour Linux ActiveTcl, ActivePerl et ActivePython (3.3) à partir du site activestate. Définir ensuite des commandes exécutables atclsh, awish, apython et aperl (avec les -I qu'il faut) de façon à pouvoir tester les programmes de l'archive tk4l.zip. Et pour Ruby, que faut-il faire ?

Que contiennent les scripts d'installation install.sh ?

Solution :  

Après avoir téléchargé les fichiers .tgz sur le site d'ActiveState, il suffit d'aller dans le répertoire principal de chaque archive décompressée et de taper sudo sh install.sh. Les versions Active* sont alors installées, mais en principe non accessibles par le PATH. On doit donc définir des commandes exécutables (chmod +x) pour y accéder.

Il faut donc sans doute écrire quelque chose comme sudo geany /usr/local/bin/atclsh & et y écrire /opt/ActiveTcl-8.6/bin/tclsh $* puis sudo chmod +x /usr/local/bin/atclsh avant de pouvoir tester ce qui est indiqué ci-dessous pour atclsh. Nous laissons la lectrice, le lecteur réaliser les mêmes manipulations pour les autres commandes.

Voici ce qu'on doit avoir :


     ## l'installation de ActiveTcl s'est faite dans /opt/ActiveTcl-8.6/
     
     # contenu du fichier atclsh
     > cat /usr/local/bin/atclsh
     
     /opt/ActiveTcl-8.6/bin/tclsh $*
     
     # contenu du fichier awish
     
     > cat /usr/local/bin/awish
     /opt/ActiveTcl-8.6/bin/wish $*
     
     ## l'installation de ActivePython s'est faite dans /opt/ActivePython-3.2/
     
     # contenu du fichier apython
     
     > cat /usr/local/bin/apython
     /opt/ActivePython-3.2/bin/python3.2 $*
     
     ## l'installation de ActivePerl s'est faite dans /opt/ActivePerl-5.16/
     
     # contenu du fichier aperl
     
     > cat /usr/local/bin/aperl
     /opt/ActivePerl-5.16/bin/perl -I /opt/ActivePerl-5.16/lib/ -I /opt/ActivePerl-5.16/bin -I /opt/ActivePerl-5.16/site $*
     
     

Les scripts d'installation install.sh contiennent le paramétrage des chemins d'accès puis l'exécution d'un script d'installation dans le langage considéré, soit install.pl pour Active Perl, install.tk pour Active Tcl/Tk et _install.py pour Active Python. On viendra lire les versions complètes de ces fichiers, soit install_atcltk.txt, install_aperl.txt, install_apython.txt dont voici les premières lignes :


     #########################################################################################################
     
     ## fichier install.sh pour ActiveTcl
     
     #########################################################################################################
     
     #!/bin/sh
     # Shell wrapper around the main installation script.  Will use the
     # wish or tclsh inside of the distribution to execute this
     # installer.
     #
     # Auto-detects the location of the distribution. Auto-detects
     # availability of X and chooses between gui and terminal based
     # installers using this information.
     
     dist=`dirname $0`
     
     # initialize the environment so that the distributed "wish" and
     # "tclsh" are able to find their libraries despite being crippled with
     # the special path value we will replace later during the installation
     # with the actual path to the installation.
     
     TCL_LIBRARY=$dist/payload/lib/tcl8.6
     TK_LIBRARY=$dist/payload/lib/tk8.6
     LD_LIBRARY_PATH=$dist/payload/lib
     DYLD_LIBRARY_PATH=$dist/payload/lib
     SHLIB_PATH=$dist/payload/lib
     LIBPATH=$dist/payload/lib
     
     export TCL_LIBRARY TK_LIBRARY LD_LIBRARY_PATH DYLD_LIBRARY_PATH SHLIB_PATH LIBPATH
     
     # Determine availability of X and choose an installer based on that
     # information.
     
     if tty -s; then                 # Do we have a terminal?
         if [ x"$DISPLAY" != x -a x"$xterm_loop" = x ]; then  # No, but do we have X?
     
        # Check for valid DISPLAY variable
     
        if [ `echo exit | $dist/payload/bin/wish8.6 2>&1 | grep fail | wc -l` -eq 0 ]
        then
            echo _____________________________________________
            echo Launching graphical installer on $DISPLAY
            echo ...
     
            $dist/payload/bin/wish8.6 $dist/install.tk "$@"
     
            # pwd = inside the unpacked distribution ...
            # go one level up and remove the directory
            #cd ..
            #rm -rf $dist
            exit
        fi
         fi
     fi
     
     # No X, use the terminal based installer
     
     $dist/payload/bin/tclsh8.6 $dist/install.tcl "$@"
     
     # pwd = inside the unpacked distribution ...
     # go one level up and remove the directory
     #cd ..
     #rm -rf $dist
     exit
     
     #########################################################################################################
     
     ## EXTRAIT DU fichier install.tk utilisé
     
     #########################################################################################################
     
     
     # -*- tcl -*-
     # Main installation script for ActiveTcl
     # --------------------------------------
     #
     # Copyright 2001-2008, ActiveState Software Inc.
     # All Rights Reserved.
     
     package require Tcl 8.4
     
     global argv argc
     set pargv $argv ; set argv {} ; set argc 0
     
     foreach d $auto_path {
         foreach a [glob -nocomplain -directory $d P-*] {
        lappend auto_path $a
         }
     }
     
     lappend auto_path [file join [file dirname [info script]] lib]
     
     # Uses labelframe and other 8.4+ widgets
     package require Tk 8.4
     wm withdraw .
     
     proc abortretryignore {msg} {
         set b [tk_messageBox \
               -parent . \
               -type abortretryignore \
               -icon question \
               -default no \
               -title "Abort, retry, ignore?" \
               -message "$msg"]
         return $b
     }
     
     set ::CONFIRM 1
     proc cancel {} {
         if {!$::CONFIRM ||
        [tk_messageBox -parent . -type yesno -icon question \
             -default no -title "Cancel Installation?" \
             -message "Are you sure you want to cancel installation?"] \
            == "yes"} {
        exit 0
         }
     }
     
     # Create something that says "we're working" ASAP if we are in a starkit
     # This provides something to distract folks while we load stuff
     # out of the base kit
     proc working {} {
         set t [toplevel .working]
         wm withdraw $t
         wm protocol $t WM_DELETE_WINDOW exit
         wm title $t "Loading installation ..."
     
         if {$::tcl_version > 8.4} {
        ttk::label $t.msg -text "Loading installation from archive ..." \
            -font {Helvetica 14}
        ttk::button $t.btn -text "Cancel" -command cancel
         } else {
        label $t.msg -text "Loading installation from archive ..." \
            -font {Helvetica 14}
        button $t.btn -width 8 -text "Cancel" -pady 2 -command cancel
         }
     
         grid $t.msg -sticky ew -padx 6 -pady 4
         # At the moment, it appears that loading from the starkit starves the
         # event loop, so showing the Cancel button is pointless
         #grid $t.btn -sticky e -padx 6 -pady 6
     
         wm resizable $t 0 0
         catch {tk::PlaceWindow $t center}
         wm deiconify $t
         raise $t
         update
     }
     if {[info exists starkit::topdir]} {
         working
     }
     
     package require BWidget
     if {$::tcl_version < 8.5} {
         package require tile
     }
     
     # Make BWidgets use tile themed widgets
     Widget::theme 1
     
     ## package require comm ; puts "COMM: [comm::comm self]"
     
     proc main {} {
         destroy .working
         wm protocol . WM_DELETE_WINDOW cancel
     
         if {$::AT(DEBUG)} {
        wm title . "$::AT(Company) $::AT(NAME) $::AT(VERSION) (Debug) Installer"
         } else {
        wm title . "$::AT(Company) $::AT(NAME) $::AT(VERSION) Installer"
         }
     
         # Set some defaults we want to use
         option add *Scrollbar.highlightthickness 1
         option add *Text.borderWidth 0
         option add *Text.highlightthickness 0
     
         # Read the logo and create an image from it.
     
     ...
     

     #########################################################################################################
     
     ## fichier install.sh pour ActivePerl
     
     #########################################################################################################
     
     #!/bin/sh
     
     lib_path=perl/lib/CORE
     
     env -i \
        PATH=/usr/bin:/bin \
        HOME=$HOME \
        LD_LIBRARY_PATH=$lib_path \
        DYLD_LIBRARY_PATH=$lib_path \
     
     perl/bin/perl -Isupport/lib support/install.pl "$@"
     
     #########################################################################################################
     
     ## EXTRAIT DU fichier install.pl utilisé
     
     #########################################################################################################
     
     #!/usr/bin/perl -w
     
     BEGIN {
         # fix up @INC path so we can run from the unpacked tarball
         s,^/tmp/perl----[^/]*,perl, for @INC;
     }
     
     use strict;
     
     use ActiveState::Prompt qw(prompt yes);
     use ActiveState::Run qw(run);
     use Getopt::Long qw(GetOptions);
     use Config qw(%Config);
     
     $| = 1;
     
     my $product = "ActivePerl";
     my $prefix;
     my $install_html = 1;
     my $license_accepted;
     my $manicheck = 1;
     
     GetOptions(
         'prefix=s' => \$prefix,
         'install-html!' => \$install_html,
         'license-accepted' => \$license_accepted,
         'manifest-check!' => \$manicheck,
     ) && !@ARGV || usage();
     
     
     ....
     

     #########################################################################################################
     
     ## fichier install.sh pour ActivePython
     
     #########################################################################################################
     
     
     #!/bin/sh
     # Copyright (c) 2003-2006 ActiveState Software Inc.
     
     #
     # ActivePython "AS package" simple install script
     #
     # To install ActivePython, run:
     #     ./install.sh
     # To see additional install options, run:
     #     ./install.sh -h
     #
     
     dname=`dirname $0`
     LD_LIBRARY_PATH=$dname/INSTALLDIR/lib
     export LD_LIBRARY_PATH
     $dname/INSTALLDIR/bin/python3.2 -E $dname/_install.py $*
     
     #########################################################################################################
     
     ## EXTRAIT DU fichier _install.py utilisé
     
     #########################################################################################################
     
     
     #!/usr/bin/env python
     # Copyright (c) 2003-2011 ActiveState Software Inc.
     
     #
     #********************************************************************
     # WARNING: Do not run this script directly. Run the main "./install.sh"
     #          which will launch this script properly.
     #********************************************************************
     
     """
         ./install.sh - ActivePython install script
     
         Usage:
             ./install.sh [options...]
     
         General Options:
             -h, --help          print this help and exit
             -v, --verbose       verbose output
     
             -I, --install-dir <dir>     specify install directory
     
         When called without arguments this script will interactively install
         ActivePython. If the install dir is specified then ActivePython will
         be installed without interaction.
     """
     
     
     import os
     import sys
     import getopt
     import re
     import stat
     import logging
     if sys.platform.startswith("win"):
         try:
             import winreg
         except ImportError:
             import _winreg as winreg # python2
     if sys.version_info[0] < 3:
         input = raw_input
     
     import sh2
     import activestate
     
     
     #---- exceptions
     
     class Error(Exception):
         pass
     
     
     
     #---- global data
     
     gDefaultInstallDir = r"/opt/ActivePython-3.2"
     
     _version_ = (0, 1, 0)
     log = logging.getLogger("install")
     
     
     
     #---- internal routines and classes
     
     if sys.platform.startswith("win"):
         def _getSystemDrive():
             try:
                 return os.environ["SystemDrive"]
             except KeyError:
                 raise Error("'SystemDrive' environment variable is not set")
     
     def _getDefaultInstallDir():
         default = gDefaultInstallDir
         if sys.platform.startswith("win") and\
            default.lower().find("%systemdrive%") != -1:
             default = re.compile("%SystemDrive%", re.I).sub(_getSystemDrive(),
                                                             default)
         return default
     
     def _askYesNo(question, default="yes"):
         """Ask the user the given question and their answer.
     
         "question" is a string that is presented to the user.
         "default" is the presumed answer if the user just hits <Enter>.
             It must be "yes" (the default), "no" or None (meaning
             an answer is required of the user).
     
         The "answer" return value is one of "yes" or "no".
         """
         valid = {"yes":"yes",   "y":"yes",  "ye":"yes",
                  "no":"no",     "n":"no"}
         if default == None:
             prompt = " [y/n] "
         elif default == "yes":
             prompt = " [Y/n] "
         elif default == "no":
             prompt = " [y/N] "
         else:
             raise Error("invalid default answer: '%s'" % default)
     
         while 1:
             sys.stdout.write(question + prompt)
             choice = input().lower()
             #sys.stdout.write('\n')
             if default is not None and choice == '':
                 return default
             elif choice in list(valid.keys()):
                 return valid[choice]
             else:
                 sys.stdout.write("Please repond with 'yes' or 'no' "\
                                  "(or 'y' or 'n').\n")
     
     ...
     

Si tout va bien, les commandes suivantes permettent de tester que les programmes de démonstration pour perl, tcl et python de l'archive tk4l.zip fonctionnent (et tant pis pour Ruby) 


      aperl --version
      aperl hello_tk.pl
      aperl tk_example.pl
      aperl tk_example_oo.pl
     
      echo puts "\"\$tcl_platform(osVersion)\n\"" > tcl_version.tcl
      atclsh tcl_version.tcl
      atclsh hello_tk.tcl
      awish tk_example.tcl
     
      apython --version
      apython hello_tk.py
      apython tk_example.py
     

 

8. Installation de Ruby on Rails et Django

Installer Ruby on Rails 4 (ou 5 ?) et réaliser le chapitre 1 du tutoriel french.railstutorial. Installer aussi rake, rspec, hirb, racc, ruby-xslt. On pourra ignorer tout ce qui concerne git et heroku. Donner la liste de toutes les options de ces commandes. Remarque  : on commencera par installer rvm.

Installer django 1.9 (ou 2.1 ?) pour python 2 (ou 3 ?) et réaliser les parties 1 et 2 du tutoriel first app ; on pourra lire (sans les réaliser) les autres parties du tutoriel pour avoir une idée de ce qu'on peut faire avec django. On écrira dans la base de données sqlite3 nommée mabase le texte Quoi de neuf, docteur  ? au lieu de What's up? avec le moteur sqlite3, on utilisera monsite au lieu de mysite et sondage au lieu de poll (donc au pluriel sondages au lieu de polls). Remplacer aussi Choice par choix, et mettre un maximum de champs et phrases en français.

Voilà à peu près ce qu'on doit obtenir  :

 

        djangofr1.png

 

        djangofr2.png

Solution :  

Les installations sont simples à effectuer... quand tout se passe bien. Ci-dessous la liste des commandes pour les deux tuteurs originaux...


     # pour installer ruby on rails avec rvm et curl
     
     sudo apt-get install libxslt-dev libxml2-dev libsqlite3-dev    # pour Linux
     
     sudo apt-get install curl
     sudo \curl -L https://get.rvm.io | bash -s stable --ruby       # long ~ 15 minutes
     
     source ~/.rvm/scripts/rvm
     
     rvm get head
     rvm reload
     rvm list known                 # donne des détails !
     rvm install 1.9.3              # sans sudo !
     rvm use 1.9.3 --default        # pour utiliser Ruby 1.9 par défaut
     rvm --create use 1.9.3@r3
     rvm --default 1.9.3@r3
     
     gem update --system
     gem install rails --version 3.0.5
     rails -v
     
     cd ~/pubic_html                # conseillé, mais non obligatoire
     mkdir rails
     cd rails
     
     ## commandes du chapitre 1 du tutorial
     
     cd ~/pubic_html/rails
     rails new first_app            # c'est parti !
     find . | wc -l                 # renvoie 83 fichiers
     
     
     
     go rails
     cd first_app/
     gedit Gemfile
     bundle install
     rails server                   # port 3000 soit l'URL http://localhost:3000/ à visiter
                                    # ^C pour l'arreter
     
     git config --global user.name "Gilles HUNAULT"
     git config --global user.email gilles.hunault@univ-angers.fr
     git config --global alias.co checkout
     git config --global core.editor "gedit -w"
     
     cd first_app/
     git   init
     gedit .gitignore               # comme indiqué
     git   add .
     git   status
     
     git   commit -m "Initial commit"
     git   log
     
     git   mv README README.markdown
     gedit README.markdown
     git   status
     git   commit -a -m "Amelioration du fichier README"
     
     ...
     
     

     # pour installer django (avec python2 seulement)
     
     sudo apt-get install python-django
     sudo apt-get install python-mysqldb # non obligatoire
     
     mkdir django-tutorial  # répertoire conseillé : ~/public_html
     cd    django-tutorial
     
     # tutorial part1 : il faut créer un super utilisateur pour la partie 2 !
     
     django-admin startproject mysite  # comme indiqué
     find  .                           # liste tous les fichiers
     
     cd mysite                         # changement de rep
     python manage.py runserver        # aller voir http://127.0.0.1:8000/ pour vérifier
     python manage.py runserver 8080   # idem avec http://127.0.0.1:8080/
     gedit settings.py                 # modifier comme proposé
     
     python manage.py syncdb
     python manage.py startapp polls
     cd polls/
     gedit models.py
     gedit settings.py
     python manage.py sql polls
     gedit settings.py
     
     python manage.py sql polls
     python manage.py validate
     python manage.py sqlcustom polls
     python manage.py sqlclear polls
     python manage.py sqlindexes polls
     python manage.py sqlall polls
     python manage.py syncdb
     python manage.py shell
     
     # tutorial part2
     
     gedit settings.py
     python manage.py syncdb
     gedit urls.py
     python manage.py runserver  # aler voir http://127.0.0.1:8000/admin/ pour vérifier
     cd polls
     gedit admin.py
     python manage.py runserver
     ...
     
     
     
     

 

 

Code-source php de cette page ; code javascript utilisé. Retour à la page principale du cours.

 

 

retour gH    Retour à la page principale de   (gH)