Catégories
Mots-Clés
Action ou vérité, ActionVérité, anti-spam, Appartement, blog, breakdance, cinéma, court-métrage, design, film amateur, Football Américain, Frosh, geek, INSA, insolite, inutile, iPhone, iPod, IX.g, Jeu, jeu de société, jointure SQL, Justine, LaTeX, liens, livres/BD, mac, MacOS X, McGill, Montréal, MP3, musique, Objective-C, Orange, Pacemakerz, perso, PHP/MySQL, portfolio, programmation, pub, Rouen, séries TV, spectacle, switch, tutoriel, video
S'abonner au fil RSS

Articles lié au mot-clé Tutoriel

Développer pour iPhone : comment démarrer, utiliser les outils et mettre en place un modèle MVC

aucun commentaire

Écrit le 07/08/2009 à 14:40 dans la catégorie Programmation
Article lié à : ActionVérité, INSA, iPhone, MacOS X, Objective-C, portfolio, programmation, tutoriel

Cet article a été rédigé dans le cadre du développement de l'application ActionVérité, à l'attention de M. Malandain, enseignant à l'INSA de Rouen dans le département ASI.

Ce document a pour but d'aider les personnes n'ayant jamais développé pour les plateformes Apple à se familiariser avec l'IDE Xcode, l'outil Interface Builder, le langage Objective-C et le framework Cocoa Touch. L'accent y est mis sur le développement pour iPhone bien que développer pour Mac OS X soit très similaire.

L'article est accessible depuis la page Portefolio, ou directement ici :
Développer pour iPhone : comment démarrer, utiliser les outils et mettre en place un modèle MVC.

séparation

Les jointures, les jointures ouvertes et quelques fonctions SQL

aucun commentaire

Écrit le 29/01/2008 à 21:49 dans la catégorie Programmation
Article lié à : jointure SQL, PHP/MySQL, programmation, tutoriel

Note au lecteur

 Cet article est en fait tiré d'un message que j'avais laissé sur le forum que nous utilisions avec mes collègues de l'INSA pour construire le site de notre BDE. J'avais à l'époque synthétisé les connaissances que je venais d'acquérir en fouillant le Web et en pratiquant de mon côté. Il se peut donc que certains termes ou certaines syntaxes ne soient pas forcément les plus appropriées, mais j'avais toutefois fait de mon mieux pour avoir des requêtes "propres".

Les jointures de base en MySQL

Le principe d'une jointure est simple, c'est récupérer des informations, en une seule requête, dans plusieurs tables. Le problème qui se pose immédiatement, est celui de lier ces deux tables sur un critère précis, pour pouvoir afficher une ligne d'informations de la première table liées à d'autres informations de la seconde.

Je m'explique : imaginons par exemple pour la gestion de news, que je veuille récupérer chaque article, avec en plus le nom de la catégorie dans laquelle il a été posté.

Je vais faire :

SELECT news_title,news_content,cat_title FROM news_content,news_cat

Mais dans un tel cas, je vais pour chaque article de news récupérer une ligne avec chaque catégorie, car je n'ai pas précisé comment organiser cette jointure, autrement dit je n'ai pas indiqué le lien logique qui lie ces deux tables. Il faut donc rajouter une clause WHERE spécifiant comment lier les deux tables. Il faut donc procéder ainsi :

SELECT news_title,news_content,cat_title FROM news_content,news_cat
WHERE news_content.cat_id=news_cat.cat_id

On aura ainsi tous les titres et contenus d'articles avec à chaque fois uniquement le titre de la catégorie correspondant au cat_id présent dans le tuple de l'article en question dans la table news_content.

NB : Il est parfois nécessaire, dans le case de jointures, de préfixer le nom des champs avec le nom de la table de laquelle il est tiré, par exemple news_content.news_title, afin d'éviter toute ambiguïté. En effet, si ma table news_cat avait également contenu un champ news_title, il n'aurait pas été possible de discerner les deux et de savoir lequel sélectionner. Par contre, en ce qui concerne le champ sur lequel porte la jointure, dans notre cas news_cat, cela n'est pas necessaire puisque par définition nous considérons qu'il s'agit du même champ.

Les requêtes "externes" ou "ouvertes"

Pour illustrer ce type de requête, il faut imaginer deux tables, avec dans la première des articles. Celle-ci serait donc composée des champs news_id et content_id. La seconde contiendrait quant à elle des commentaires et qui contiendrait donc également ce champ news_id. On sait ainsi à quel article ce commentaire se rapporte.

Si la requête formulée précédemment est transposée à ce schéma de base de données, et qu'il n'y a pour le moment aucun commentaire correspondant à un certain article, ce dernier ne sera pas retourné. Ce comportement est logique, puisque la jointure de base permet de créer un tuple à partir de deux tables qui sont directement liées et que l'on suppose complémentaires. Un article qui n'a pas de commentaires n'est donc pas considéré comme devant faire partie de cette jointure. Pour une requête récupérant chaque article et son nombre de commentaires, seuls les articles en ayant seront récupérés.

Le principe d'une requête ouverte est que l'on souhaite que l'une des deux tables concernées voit toutes ses entrées retournées, que l'on trouve une correspondance dans la seconde table ou non. On l'utilise ainsi :

SELECT news_content news_title comment_number 
FROM news LEFT JOIN comments ON news.news_id = comments.type_id

La table qui doit être intégralement retournée est celle à gauche du LEFT JOIN, ou évidemment à droite d'un RIGHT JOIN. Le ON situé ensuite est la clause de jointure, que l'on mettait précédemment dans le WHERE.

J'ai supposé ici que le champ de la table comments était différent de celui de la table news. Dans le cas ou par exemple les deux champs sont appelés news_id, on peut procéder comme suit : 

SELECT news_content news_title comment_number 
FROM news LEFT JOIN comments USING(news_id)

Les fonctions SQL COUNT() et SUM()

Je parlais tout à l'heure de compter le nombre de commentaires relatifs à un article. Il extiste pour cela diverses fonctions SQL qui évitent de devoir traiter les données récupérées de la base.

La fonction SUM()

SUM() permet de faire la somme des valeurs contenues dans des champs spécifiques. Supposons par exemple une table avec un champ nom et un champ dépenses, dans laquelle on trouve chaque dépense de chaque personne sur un tuple différent. On a par exemple un tuple avec Jean associé à la valeur 20, puis un second avec ce même prénom et la valeur 30. Si votre souhait est de savoir combien chaque personne a fait comme dépenses, c'est à dire avoir un tuple par nom de la base associé à la somme des dépenses présentes dans la table, vous pouvez utiliser SUM() au lieu de perdre du temps à traiter les données après une requête générale en PHP ou tout autre langage. Voici la requête dans notre exemple précis :

SELECT nom, SUM(depenses) as somme FROM table1 GROUP BY nom

Nous indiquons ici, par la clause GROUP BY, sur quel champ nous devons regrouper les résultats. Le as permet d'obtenir en nom de champ somme dans le résultat de la requête.

En second exemple, je prendrai les tables des sondages du site du BDE. J'ai créé une table poll_answers, qui contient les champs answer_id (clé de cette table), poll_id et answer_votes. Pour illustrer, dès que la réponse 42, qui correspond à un certain sondage, est choisie et votée, le tuple correspondant est modifié de la manière suivante :

UPDATE poll_answers SET answer_votes= answer_votes+1
WHERE answer_id = 42

Ainsi, pour savoir le nombre total de votes pour un sondage donné, disons le numéro 7, la requête est la suivante :

SELECT sum(answer_votes) as total_vote FROM poll_answers
WHERE poll_id = 7

La fonction COUNT()

Revenons maintenant à l'exemple des commentaires. J'ai envie de savoir combien j'ai de commentaires pour l'article ayant pour identifiant 21. Plutôt que de prendre tous les commentaires, puis de compter les lignes des résultats en PHP, je peux ici utiliser la fonction COUNT(). La différence avec SUM() est donc qu'ici on ne fait pas une somme de valeurs de la table, mais on compte le nombre de résultats.

SELECT count(comment_id) as total FROM comments
WHERE news_id = 21

 Il est évidemment préférable de compter sur la clé de la table, afin d'obtenir tous les éléments de celle-ci correspondant à notre clause WHERE. Dans notre résultat, nous obtenons ainsi une valeur entière correspondant au nombre exacte de commentaires portant sur l'article 21.

Pour finir en beauté, une petite combinaison de tout cela

Une fois que ces trois parties ont été bien assimilées, il est intéressant de voir où tout cela peut nous mener concrètement.

Il est donc temps d'expliquer en détail la plus grosse requête que j'ai eu à faire pour le système d'actualité du site, et qui m'a poussé à apprendre tout cela.

Dans un soucis de minimiser le nombre de requêtes, j'ai souhaité récupérer en une seule fois les informations suivante :

  • l'article avec son titre et sa date, à condition qu'il ait été validé par l'administrateur
  • le nom correspondant au rang de l'auteur, stocké dans une autre table
  • le nom correspondant à la catégorie de l'article, qui est stocké sous la forme d'un entier identifiant, permettant d'isoler les noms de catégorie et pouvoir les modifier plus rapidement si besoin
  • le nombre de commentaires relatifs à cet article

Il y a donc quatre tables concernées. Sans chercher à optimiser, il est évidemment possible de faire une requête sur les articles, et pour chaque ligne de résultat traité dans mon code PHP refaire une requête sur chacune des autres tables avec une clause du type WHERE news_id =. Ce qui m'aurait donné 3 requête de plus pour chaque article affiché. Autrement dit, une simple liste de 10 articles aurait conduit à un total de 31 requêtes.

J'ai donc cherché à tout réunir en une seule requête. Elle est sur plusieurs tables, regroupe deux tables par une jointure ouverte, et utilise la fonction COUNT(). Voici la bête :

SELECT news_id, news_title, news_content as content,
DATE_FORMAT(news_dt, '%d/%M/%Y') as date, news_cat.cat_title as category,
user_specialrank.special_rank_name as specialrank,
COUNT(comments.comment_id) as com_number

FROM news_cat,user_specialrank,news_content LEFT JOIN comments
ON news_content.news_id = comments.type_id

WHERE news_cat.cat_id = news_content.cat_id AND
user_specialrank.specialrank_id = news_content.author_specialrank_id
AND news_validated = 'y'

GROUP BY news_dt DESC limit 0,10

Paf. C'est gros, moche, bourrin, c'est de l'optimisation. Je ne sais pas s'il est toujours nécessaire d'optimiser à ce point les requêtes SQL, mais il m'a semblé vraiment indispensable d'éviter d'avoir une complexité cubique (i.e. qui demande n3 opérations quand on traite n données).

Voici quelques explications :

  • je ne pense pas que la partie SELECT soit compliquée. En ce qui concerne le FROM, j'y ai mis toutes les tables, en liant les deux dernières sur une jointure ouverte. J'ai ainsi tous les articles, mêmes si ils n'ont pas de commentaires.
  • grâce au COUNT(), je ne récupérère qu'une seule ligne, qu'un seul tuple par article, puis que les lignes des différents commentaires correspondant sont simplement comptées.
  • dans le WHERE, j'ai les deux conditions pour ma jointure avec les deux autres tables, c'est à dire pour la catégorie et le rang de l'utilisateur auteur (En réalité, il y a un nom d'auteur correspondant à un niveau précis, par exemple 0 : administrateur, ou 10 : secrétaire du BDE).
  • Enfin, le GROUP BY permet de spécifier sur quelle table on regroupe les COUNT(). En effet cette clause est indispensable dès que d'autres champs que le COUNT() sont récupérés dans la requête. J'en ai profité pour grouper par la date, supposant que nous n'aurons jamais deux articles postés à la même date (à la seconde près), et pour rajouter DESC. J'ai ainsi mes articles triés par date décroissantes. J'aurais également pu écrire GROUP BY news_id ORDER_BY news_dt DESC.

En espérant avoir été assez clair, j'espère que cet article éclaircira un peu ces aspects à ceux qui souhaitent  les connaître mais ne savent pas par où commencer !

séparation

Pourquoi et comment écrire ses documents avec LaTeX ?

aucun commentaire

Écrit le 26/01/2008 à 15:02 dans la catégorie Programmation
Article lié à : LaTeX, programmation, tutoriel

Qu'est-ce que LATEX ?

Le LATEX (prononcez "latec") est un ensemble de macro-commandes permettant une utilisation simplifiée du "processeur de texte" TeX. Autrement dit, pour faire plus simple, avec LATEX vous pouvez écrire des articles, dossiers, thèses et même livres ou présentations avec une relative simplicité. Quel est donc l'intérêt d'utiliser un langage de programmation pour éditer du texte ?

LATEX permet de produire des documents la plupart du temps de type scientifique en s'attachant uniquement au contenu et au sens du document. En effet, dans les logiciels de type WYSIWYG (What You See Is What You Get) tels que Microsoft Word ou OpenOffice Writer, vous éditez votre texte, placez vos alinéas, paragraphes, tabulations, listes, titres à votre guise, avec les couleurs de vos choix, les marges de votre choix, et cela vous prend parfois beaucoup de temps. Sans compter le temps passé à essayer d'uniformiser le tout... A l'inverse, le principe de l'écriture de documents LATEX est à peu près le même que celui de la création web en HTML couplé aux feuilles CSS : la séparation de la sémantique et de la forme, qui sont deux aspects différents qui peuvent (doivent) donc être traités séparément. Cette approche permet, après une courte période de prise en main, de générer des documents avec une mise en page standardisée, selon les normes du pays choisi, de manière très rapide et ce sans soucis de mise en page.

Enfin, l'atout de ce langage pour l'édition de document scientifique est un ensemble de packages, ou paquetages, qui permettent l'affichage d'équations mathématiques, de matrices, mais aussi l'insertion de code dans n'importe quel langage de programmation avec coloration syntaxique adaptée, l'affichage de molécules, et ainsi de suite.

Les environnements et commandes LATEX

Un document LATEX est à la base un simple document texte qui peut être écrit avec n'importe quel éditeur de texte. Les deux notions importantes en LATEX sont les environnements et les commandes qui sont des instructions commençant systématiquement par le signe backslash \. Un environnement est symbolisé par les balises \begin{environnement} et \end{environnement}. Tout le texte qui sera situé entre ces balises sera traité ou affiché selon les propriétés de cet environnement. L'exemple le plus simple est le suivant :

\begin{document}
Ici se trouve le contenu de votre document.
\end{document}

C'est entre les balises de l'environnement document que se trouvent les informations à afficher dans le document final. Les commandes placées en dehors seront les en-têtes habituelles telles que les inclusions de packages et la déclaration du nom, du type et de l'auteur du document.

C'est par les commandes LATEX que sont déclarés ces en-têtes. Mais les commandes permettent aussi l'affichage dans le document de certains caractères spéciaux, ou consacrés. Une commande est de la forme \commande{arguments}, et ne fait donc qu'une ligne. Il est possible que la commande ne prenne pas d'argument, comme la commande \maketitle, présent dans l'exemple ci-après, et qui permet d'insérer le titre du document à un endroit précis.

Exemple basique de document en LATEX

\documentclass[a4paper]{article}

\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}

\title{Exemple relativement simple de document \LaTeX{}}
\author{Antony Gardez}

\begin{document}
\maketitle

\section{Titre de premier niveau}
\subsection{Titre de deuxième niveau}
Pour écrire du texte, il suffit de le placer dans l'environnement document, 
comme cette phrase. La création d'un nouveau paragraphe s'effectue en passant 
deux lignes dans le texte.

Cette phrase se situe dans un nouveau paragraphe.

\begin{verbatim}
Le contenu de l'environnement verbatim est affiché tel       quel avec tous les
espaces
et retours      à la ligne.
Il s'agit d'un affichage de texte brut.
\end{verbatim}
\end{document}
			

Vous pouvez avoir le rendu de cette partie de code LATEX au format pdf ici.

De nombreux rapports scientifiques sont rédigés en LATEX. En cherchant rapidement sur internet des manuels de logiciels scientifiques, des livres en rapport avec les sciences ou l'informatique, ou encore des thèses, des rapports, vous reconnaîtrez assez rapidement le style particulier des documents LATEX. Cela vous permettra également d'avoir un aperçu des possibilités de ce langage.

Pour vous faciliter la vie je vous ai gentiment trouvé quelques exemples !

  • Exemple de thèse en mathématique, pour bien voir que le LATEX est utilisé pour des documents on ne peut plus sérieux,
  • Manuel d'une application pour certifier les programmes écrits en JAVA, qui n'a pas grand intérêt si ce n'est montrer l'introduction de code dans les documents LATEX,
  • Compte rendu que j'ai réalisé avec un ami de l'INSA sur un TP de Traitement du Signal. Ce document permet de voir une application concrète avec insertions d'images, de formules mathématiques, ainsi que de code Matlab avec coloration syntaxique.

Enfin, si vous avez l'occasion de passer près d'un rayon informatique dans une librairie, la plupart des livres de ce domaine sont écrit par ce biais, notamment certains livres des collections Eyrolles et O'Reilly.

Comment compile-t-on un document LATEX pour obtenir un fichier PDF ?

Compiler un document LATEX consiste à faire vérifier sa syntaxe, puis demander à un programme de créer le fichier dvi, ps ou PDF correspondant au code que vous avez écrit. Malheureusement il n'existe pas une unique méthode pour installer les outils de compilation. Cette méthode dépend du système d'exploitation sur lequel vous travaillez.

Sur les systèmes de type UNIX, comme Linux ou Mac OS, il faut installer les paquets nécessaires à la compilation. Par exemple sous la distribution Ubuntu, un petit tutoriel d'installation se trouve ici. Après avoir effectué cette simple commande, le logiciel Kile ainsi que les paquets nécessaires à la compilation seront installés. Pour MacOs, plusieurs options s'offre à vous : installer le paquets texLive par le biais de MacPorts ou Fink, qui sont des logiciels permettant d'accéder à des dépots de paquets de logiciels libre, à la manière d'apt-get sous linux, ou alors utiliser i-Installer.

Une fois tout cela installé, il existe deux manière de compiler : soit votre logiciel, comme par exemple Kile (linux) ou Textmate (MacOS), permet de lancer directement la compilation par un raccourci clavier ou un bouton sur lequel cliquer, et vous indique également les éventuelles erreurs, ou alors vous aurez à vous familiariser avec le terminal, et utiliser la commande pdflatex.

Enfin, sous Windows, il existe un package appelé MiKTeX qui contient tout ce qu'il faut pour créer des documents LATEX.

Mon but n'étant pas dans cet article d'expliquer en détail la compilation et la résolution des différents bugs engendrés, mais plutôt de donner une idée globale de ce langage, je n'irai pas plus loin.

Conclusion

Bien que plus adapté et accessible aux scientifiques et programmeurs, LATEX permet, après un temps d'adaptation, de créer assez rapidement des documents préformatés, pour des comptes rendus dans le cadre de mes études en ce qui me concerne. Mais il peut aussi s'agir d'un outil très pratique pour écrire un dossier à plusieurs et regrouper les différentes parties par le biais de la commande \input{fichier.tex}, et il existe beaucoup de commandes et d'astuce pour personnaliser ces documents.

Pour finir, je ne pouvais pas écrire un article sur LATEX sans donner le lien de la très très complète FAQ de l'équipe Grappa, qui répond probablement à toutes les questions qui trottent dans votre tête.

Afficher tous les articles