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
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
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 : afficher la 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.1Sous 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> quitConnaitre 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 : afficher la 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 : afficher la 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 : afficher la 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 : afficher la 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 : afficher la 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 2012Chaque 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 : afficher la 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 :
Solution : afficher la 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 à la page principale de (gH)