# Divers outils

Nous allons maintenant (re)voir divers outils utiles pour faire du développement.

## Contrôle de version

Il existe de nombreux outils permettant de
* mémoriser une version antérieure d'un fichier
* partager ce fichier
* revenir à une version antérieure

Pour certains fichiers, il existe un système de suivi de version intégré à l'outil permettant de l'éditer. Par exemple, le suivi de version de word.

Il existe maintenant des clients avec un serveur centralisé de sauveguarde utilisés par le grand public (NextCloud, Dropbox, etc) et des outils plutôt pour les développeurs (subversion, git, etc).

Nous allons nous pencher sur git que vous utilisez depuis quelques mois [diaporama Denis](git_tutorial.pdf).

En TP, nous allons voir git plus en détails, en particulier comment travailler à plusieurs (merge, rebase). 

## Mark down

Pour faire des readme, des rapports simples, le mark down fonctionne très bien.
C'est un fichier texte qui est interprété entre autre par le client web des serveurs git pour un rendu assez raisonnable.

Le format n'est pas complètement standardisé toutefois, donc veillez à rester sur des choses universelles pour faciliter le rendu.

## LaTeX

Pour des rapports plus conséquents (à partir de 4 ou 5 pages qu'on voudra imprimer), il vaut mieux utiliser un outil permettant de garantir un résultat typographiquement supérieur ce qui offira une lecture plus confortable.

Par exemple voici mon fichier pour une feuille de TD.
On peut aussi faire des lettres, des posters, des présentations.

```latex
\documentclass[a4paper,12pt]{article}

\usepackage[francais]{babel}  %%% ponctuation etc en français
\usepackage[utf8]{inputenc}   %%% saisir de l'utf8 dans le texte
\usepackage[T1]{fontenc}      %%% chargement d'une police décorée avec les accents
\usepackage{lmodern}          %%% je souhaite la police lmodern
\usepackage{graphics,graphicx}%%% pour importer des images
\usepackage{url}              %%% pour citer des urls, des adresses mails
\usepackage{hyperref}         %%% hyperliens dans le pdf
\usepackage[pdftex,usenames,dvipsnames]{xcolor} %%% gestion des couleurs
%%% decommenter si tikz necessaire
%\usepackage{tikz}            %%% dessiner programmatiquement.
%\usetikzlibrary[decorations.pathmorphing]
%\usetikzlibrary[decorations.pathreplacing]
%\usetikzlibrary{backgrounds}
%\usetikzlibrary{positioning}
%\usetikzlibrary{arrows}
%\usetikzlibrary{backgrounds}


\usepackage{tcolorbox}       %%% boîtes de couleurs
\tcbset{textmarker/.style={%
    % skin=enhancedmiddlejigsaw,breakable,
    parbox=false,
    boxrule=0mm,leftrule=5mm,rightrule=5mm,boxsep=0mm,arc=0mm,outer arc=0mm,
    left=3mm,right=3mm,top=1mm,bottom=1mm,toptitle=1mm,bottomtitle=1mm,oversize}}
\newtcolorbox{yellow}{textmarker,colback=yellow!5!white,colframe=yellow}
\newtcolorbox{orange}{textmarker,colback=DarkOrange!5!white,
  colframe=DarkOrange!75!yellow}
\newtcolorbox{red}{textmarker,colback=red!5!white,colframe=red}
\newtcolorbox{blue}{textmarker,colback=DeepSkyBlue!5!white,colframe=DeepSkyBlue}
\newtcolorbox{green}{textmarker,colback=Chartreuse!5!white,colframe=Chartreuse}
\newtcolorbox{rainbow}{textmarker,interior hidden,
  frame style={top color=blue,bottom color=red,middle color=green}}
%%%

\usepackage{framed} %%% boîtes permettant de gérer correctement le saut de page.
\usepackage{multicol} %%% plusieurs colonnes
\usepackage[subtle]{savetrees} %%% économiser du papier tout en restant lisible.
%\usepackage[a4paper,width=17cm,height=23cm]{geometry} %%% changer les marges
\usepackage{a4wide}   %%% version simple du précédent
\usepackage{paralist} %%% 
\usepackage{fancyhdr} %%% haut de page
\usepackage{colortbl} %%% tables de couleur
\usepackage{cancel}   %%% 
\usepackage{amssymb,amsmath,amsthm} %%% Maths symboles, théorèmes etc

%%% On charge le paquet ifthen pout faire des tests
\usepackage{ifthen}
%%% On définit un compteur numérique pour l'année
\newcounter{theyear} 
\setcounter{theyear}{\number\year}
%%% Une macro pour écrire l'année académique automatiquement en
%%% fonction du mois en cours
\newcommand{\academicyear}[0]{
  \ifthenelse{\number\month<8}
  {\addtocounter{theyear}{-1}\arabic{theyear}\addtocounter{theyear}{-1999}\,-\arabic{theyear}}%
  {\arabic{theyear}\addtocounter{theyear}{-1999}\,-\arabic{theyear}}%
}%

%%% mettre les macros à la racine du cours et ajuster en conséquence
%%% pour éviter d'avoir plus d'une copie des macros par cours.
%\input{MyMacros.tex}

%\input{SetColors.tex}

%%%%%%%%%%%%%%%%%%%%%%%% 
%%% Def d'environement de Math (Malika)
%%%%%%%%%%%%%%%%%%%%%%%%
\theoremstyle{plain}
\newtheorem*{theo}{Théorème}
\newtheorem*{cons}{Conséquence}
\newtheorem*{conss}{Conséquences}


\theoremstyle{definition}
\newtheorem{exo}{Exercice}
\newtheorem*{defi}{Définition}
\newtheorem*{probleme}{Problème}
\newtheorem*{reponse}{Réponse}


\theoremstyle{remark}
\newtheorem*{exemple}{Exemple}
\newtheorem*{remarque}{Remarque}
\newtheorem*{remarques}{Remarques}
\newtheorem*{prop}{Propriété}
\newtheorem*{props}{Propriétés}

%\pagestyle{fancy}
\fancyhf{}
\fancyhead{
\begin{minipage}{16cm}
\hspace{-2cm}
Nom : \fbox{\begin{minipage}{6cm}\hfill\vspace{.7cm}\end{minipage}}
\hfill
Pr\'enom : \fbox{\begin{minipage}{4cm}\hfill\vspace{.7cm}\end{minipage}}
\hfill
Groupe : \fbox{\begin{minipage}{.7cm}\hfill\vspace{.7cm}\end{minipage}}
\end{minipage}
}
\fancyfoot[C]{Page {\large\thepage}}


%%%%%%%%%%%%%%%%%%%%%%%% 
%%% Quelques paquets gérant la correction / espace pour la reponse
%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{comment}
%%% Pour afficher la correction et exclure les boites pour la reponse
% \includecomment{correction}
% \excludecomment{EspaceReponse}
%%% Pour version cachant la correction et incluant l'espace pour la reponse
\excludecomment{correction}  
\includecomment{EspaceReponse}


%%%
\begin{document}

\ 
\vspace{.2cm}

{\small
\noindent IUT Sénart-Fontainebleau, UPEC
\hfill
Florent Madelaine

\noindent DEV 2.3
\hfill 
Luc Dartois 

\noindent IUT Info 2A \hfill Luc Hernandez

\hfill\noindent\academicyear{}

}
\vspace{.7cm}

\hrule
\vspace{.3cm}

\begin{center}

{\textbf{\Large 
    Quelques outils
}}
\vspace{.1cm}

\end{center}
\vspace{.3cm}

\hrule
\vspace{.3cm}

\section*{Préambule}
Nous allons survoler certains outils qui sont particulièrement utiles
pour travailler sur un projet.

Je ne vais pas revenir sur les outils de \textbf{gestion de version}. Je
recommande très fortement l'utilisation de git (il y a le serveur
gitea à l'IUT \url{https://dwarves.iut-fbleau.fr/gitiut}).

Il y a des alternatives comme svn, voir pour des choses
simples lorsqu'on ne travaille pas avec des informaticiens, dropbox ou
autre service similaire de cloud.
De manière générale, l'excuse \og mon chat a mangé mon projet ce w.e.,
je ne peux donc pas vous le rendre\fg{} n'est pas acceptable.

Il y a de nombreux outils libres assez pratiques, par exemple framapad
\url{https://framapad.org/fr/} si vous souhaitez partager des idées à
distance sous forme d'un petit texte.

Vous le savez peut-être mais il y a de nombreuses alternatives libres
à des outils bien connus (et propriétaires) qui marchent aussi bien
voir mieux. Voir par exemple ce site:
\url{https://degooglisons-internet.org/fr/} et cette page pour une
liste de service en ligne
\url{https://degooglisons-internet.org/fr/list}.  

Aujourd'hui nous allons entrevoir deux outils :
\begin{enumerate}
\item le premier est un outil pour faire du suivi de projet (remplace
  le tableau physique du projet agile).
\item le second est un logiciel permettant de rédiger de jolis
  rapports, voir de faire des présentations. 
\end{enumerate}


\section*{Outil de suivi de projet}
Quand on travaille sur un projet à plusieurs (et même parfois seul),
il est important de pouvoir faire le point sur ce qu'on doit faire.
Il y a un outil non libre qui s'appelle trello que je vous recommande
dans l'immédiat.

Une bonne alternative libre est \url{https://kanboard.org/} mais je ne
trouve plus de serveur accessible gratuitement. En attendant que nous
l'offrons au département, je vous invite à utiliser trello.

L'avantage de kanvoard est qu'il permet de faire des diagrammes de
Gantt, fonctionalité a priori non disponible sur trello.

\section*{\LaTeX}

Il s'agit d'une alternative populaire chez les scientifiques pour
rédiger des documents (lettre, notes de cours, articles de recherche,
rapports, livres) voir même faire des présentations ou des posters.

Le projet initial, \TeX, est initié par Donald Knuth\footnotemark{}
\footnotetext{voir \url{https://en.wikipedia.org/wiki/Donald_Knuth}.}
un pionnier de l'informatique.

Pour l'instant le logiciel n'est pas installé à l'IUT mais vous pouvez
en attendant l'installez chez vous (voir
\url{https://www.tug.org/texlive/acquire-netinstall.html}) ou dans
l'immédiat pour aujourd'hui utiliser un serveur avec une interface web
qui permet même de collaborer sur un même document.

\begin{yellow}
  \begin{exo}
    \begin{enumerate}
    \item 
      Créez un compte sur \url{https://www.overleaf.com/about}.
    \item Créez un nouveau projet (en partant d'un exemple).
    \item Générez le pdf.
    \end{enumerate}
  \end{exo}
\end{yellow}

Dans l'esprit, le \LaTeX ressemble au html.
Le code est compilé pour produire un document (à l'origine du
postcript, maintenant avec pdfLatex, du pdf).

Si vous souhaitez vous former, vous pouvez par exemple regarder ce
wikibook : \url{https://en.wikibooks.org/wiki/LaTeX}.

Avec assez peu d'efforts, il est facile de faire un rapport avec des
sections, un index, quelques images et une bibliographie.

Vous pouvez même faire des présentations de très belle qualité avec
beamer. Le serveur overleaf contient de nombreux template.
Dans l'immédiat je vous invite quand même à utiliser des choses très
simples.

\begin{yellow}
  \begin{exo}
    Créez un squelette de rapport avec \LaTeX{} comportant un titre,
    un résumé, une table des matières, une figure.

    Dans un second temps, si ce n'est pas déjà fait, chargez les
    paquets avec les bonnes options permettant de rédiger un tete en
    Français avec une gestion des accents, de la ponctuation etc.

    Ensuite, ajoutez une table des figures et un index (glossaire)
    de termes techniques.

    Ensuite ajoutez une jolie formule de math (avec des fractions et
    des sommes ou des intégrales).
    
    Finalement, changez les fontes par défaut en allant voir le
    catalogue ici \url{https://tug.org/FontCatalogue/allfonts.html}.
  \end{exo}
\end{yellow}

De manière générale, il ne faut pas chercher à détourner \LaTeX{} de
ce qu'il souhaite faire. Le but de ce logiciel est de faire de la mise
en page automatiquement. Si vous souhaitez faire de la mise en page
très précise (comme dans un journal par exemple) alors \LaTeX{} n'est
pas adapté.
\end{document}

```

## Documenter votre code

Il existe des outils qui fonctionnent pour n'importe quel langage comme [doxygen](https://doxygen.nl/).

Pour java, en général on utilise [javadoc](https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html).

NB : certains éditeurs (par exemple sublimetext) génèrent à la volée une ébauche de documentation pour chaque méthode, chaque classe.

La commande `javadoc -d doc` permet de générer la documentation au format html dans le style de la documentation java que vous utilisez. En paramètre, vous pouvez donner des fichiers java.

## Organisation d'un projet

On va normalement avoir plusieur répertoires.
* `src` pour les sources (les `.java`)
* `doc` pour la documentation
* `test` pour les tests
* `build` pour les exécutables (les `.class`)

À la racine un `README` expliquant brièvement l'architecture du projet et comment déployer / utiliser le travail du projet.
On ajoute aussi normalement une licence, par exemple [creative commons](https://creativecommons.org/about/cclicenses/).

Quand on a beaucoup de fichiers java on va avoir plusieurs paquets.
On verra ça en détail en seconde année.

On propose normalement une méthode pour compiler les sources efficacement et générer un exécutable.
En java souvent on va générer un `jar` (c'est juste une archive zip spéciale contenant les exécutable)

On peut par exemple utiliser `make` ou encore un script en shell.

On verra ceci plus tard, mais il existe aussi des outils plus récents, souvent bien intégrés aux IDE permettant de faire du déploiement continu (maven, gradle).



