lundi 22 septembre 2008

Programmer en LaTeX/TeX

Vous connaissez certainement LaTeX... Si ce n'est pas le cas, tout ce que l'on peut dire, c'est que c'est un langage servant a produire des articles scientifiques, des rapports ou des documents imprimés en tout genre. Une courte introduction en 88 minutes vous est proposé a la fin de cet article.

Cet article vise à vous présenter la puissance de LaTeX. LaTeX permet d'écrire des documents, mais sa puissance vient du fait qu'il s'appuie sur un langage de programmation : TeX et est par conséquent entièrement programmable.

Les compteurs et les dimensions

LaTeX permet de définir des dimensions et des compteurs. Cela vous permet d'imaginer des usages divers : des figures qui peuvent changer d'échelle automatiquement, des listes numerotées un peu particulières, ... La syntaxe est la suivante (les compteurs manipulent des entiers):

[latex]
\newcounter{nom} % Pour creer un compteur "nom"
\setcounter{nom}{valeur} % Défini la valeur du compteur a valeur
\addtocounter{nom}{valeur} % Ajoute valeur a la valeur du compteur
\value{nom} % Lit la valeur du compteur nommé "nom"

La syntaxe pour les dimensions est la suivante.

[latex]
\newlength{nom} %Défini une nouvelle longueur
\setlength{nom}{valeur} %Défini la valeur d'une longueur
\addtolength{nom}{valeur} % Ajoute une valeur a une longueur

La valeur d'un compteur nommé nom de la longueur peut alors être utilisé, par exemple:

[latex]
\includegraphics[width=0.5\nomdelalongueur]{image}

Les unités les plus courantes pour les valeurs sont :

  • mm - millimètres
  • cm - centimètres
  • pt - points
  • em - la largeur d'un M dans la police courante
  • ex - la hauteur d'un x dans la police courante

Vous en saurez plus en consultant la documentation LaTeX sur les compteurs et les dimensions.



Les boites verticales et horizontales

TeX fonctionne en empilant des boites. Il les emboites soit verticalement, soit horizontalement pour former de nouvelles boites... Il y a quelques commandes qui sont ainsi utile pour mettre en page des éléments complexe. On peut utiliser: \vbox{CONTENU} qui crée une boite a l'intérieur de laquelle les éléments seront empilés verticalement \hbox{CONTENU} qui crée une boite a l'intérieur de laquelle les éléments seront empilés horizontalement \vspace{DIMENSION} qui insère un espace vertical de taille DIMENSION \vfill{} qui insère un espace pouvant être étendu pour "justifier" les boites \hspace{DIMENSION} qui insère un espace vertical de taille DIMENSION \hfill{} qui insère un espace pouvant être étendu pour "justifier" les boites

Cela s'utilise de la façon suivante:

[latex]
\vbox{
\vbox{\hbox{
\hbox{A Droite}
\hspace{5cm}
\hbox{Centre}
\hspace{5cm}
\hbox{A gauche}
}}
\vspace{1cm}
\vbox{Image}
\vspace{3cm}
\vbox{Le reste}
}

Effectivement, c'est moche, mais cela permet d'ajuster la présentation... Je vous laisse aussi regarder les commandes environnement mbox, fbox, minipage, ...



Les macros et les environnements

Il y a trois manières de définir des commandes en LaTeX. La première est d'utiliser la commande \def

[latex]
\def\macro{Le code de ma macro}

On l'utilise alors en écrivant \macro


La seconde est d'utiliser la commande \newcommand

[latex]
\newcommand{\commande}[nbArgument]{
Mon code
Mon 1er argument s'écrit: #1
Mon 2nd argument s'écrit: #2
...
}

On l'utilise alors en écrivant \commande{Argument1}{Argument2}.


La troisième est d'utiliser un environnement

[latex]
\newenvironment{environnement}[nbArgument]{
Code de début avec les arguments #1, #2, ...
}{
Code de fin
}

Il s'utilise comme cela:

[latex]
\begin{environnement}
CONTENU
\end{environnement}



Les conditonnelles.

Le package ifthen permet de créer des conditionnels en LaTeX. La syntaxe est la suivante

[latex]
\usepackage{ifthen}
\def\printDebug{true}% or false

\ifthenelse{\equal{\printDebug}{true}}{%
% Code if printDebug is true (create Todo command that display a warning
}{
% Code if printDebug is false (create Todo command that display nothing
}



Quelques packages

  • beamer Ce package permet de générer des présentations de type PowerPoint en utilisant un fichier LaTeX. La documentation est excellente.
  • algorithmicx Ce package permet de taper des algorithmes, et ce en définissant soit même les mots clés de son pseudo-code.
  • textpos Ce package est intéressant puisqu'il permet de placer librement des figures ou du texte sur une page et en particulier sur une diapo (en indiquant les coordonnées souhaitées).



Quelques idées pour programmer en LaTeX

Vous avez envie de faire un environnement affichant du texte si votre nom de fichier est rapport_insa mais n'en affichant si le nom du texte est rapport_tex ?

La réponse se trouve ici : http://groups.google.com/group/comp.text.tex/browse_thread/thread/49a5a8c268cbceb4/38f8a6bfb8ed7a42

[latex]
% La comparaison de Jobname avec autre chose est un poil compliquée...
\def\thisjob#1{..\fi\begingroup
\edef\jobA{\jobname}%
% Convert an arbitrary string to "other" characters:
% do \csname, \string, then \@gobble
\edef\jobB{\expandafter \expandafter \expandafter \@gobble
\expandafter \string \csname #1\endcsname}%
\expandafter \endgroup \ifx\jobA\jobB}

% On défini une commande plus simple
\newcommand{\ifinsa}[2]{
\if\thisjob{rapport_insa}%
#1%
\else%
#2%
\fi%
}

% On peut alors définir des environnement
\usepackage{verbatim}
% Environnement
\ifinsa{
% On affiche le contenu du block tel quel
\newenvironment{blockinsa}
{}
{}
}{
%% Sinon, on considère qu'il est commenté
\let\blockinsa=\comment
\let\endblockinsa=\endcomment
}

Il faudra faire attention si vous utilisez des liens pour avoir deux fichiers pointant vers un même fichier, les éditeurs de texte ont tendance à casser les liens. Ainsi, éditez toujours le fichier original et jamais le lien.



Un Makefile pour LaTeX

Vous en avez assez de vous emeler les doigts a taper les commandes de compilation LaTeX ? Vous souhaiteriez faire tout ce qu'il faut en 1 seule touche... Et ainsi avoir un Makefile qui vous recompile vos figures, vos fichiers pdf en fonctions des .tex et des .sty et qui vous fasse des pdf 2 pages en 1 pour imprimer ou d'autres choses amusantes.

Voici un exemple sur lequel vous appuyer:

STYLE=style/m2ri.sty \
style/myalgorithm.sty \
style/mybeamer.sty \
style/myfigures.sty \
style/myhocl.sty \
style/myschema.sty \
style/mytitlepages.sty \
style/mytodo.sty \
style/myconditionnal.sty \
style/rt-hocl.sty \
style/thesis-hocl.sty


view: all
xpdf document.pdf

viewdiapo: presentation_mars2007.pdf
xpdf presentation_mars2007.pdf

all: document.pdf annexe.pdf

document.dvi: document.tex $(STYLE)
latex document
bibtex document
latex document
latex document

rapport_m2ri.dvi: rapport_m2ri.tex $(STYLE)
latex rapport_m2ri
bibtex rapport_m2ri
latex rapport_m2ri
latex rapport_m2ri

rapport_insa.dvi: rapport_insa.tex $(STYLE)
latex rapport_insa
bibtex rapport_insa
latex rapport_insa
latex rapport_insa



presentation_%.pdf: presentation_%.tex
latex presentation_$*
latex presentation_$*
dvips -Ppdf -G0 presentation_$*.dvi
ps2pdf14 presentation_$*.ps
# ps2pdf presentation_mars2007.ps

#%.dvi: %.tex
# latex $<
%.ps: %.dvi
dvips -G0 -o $@ $<
%.pdf: %.ps
ps2pdf14 -dPDFSETTINGS=/prepress -dEmbedAllFonts=true $<

clean:
rm -f *.aux *.log *.toc *.bbl *.blg *.dvi *.ps

distclean: clean
rm -f *~ *.pdf

Une règle qui recompile automatiquement jusqu'a disparition du message "Rerun to get cross-reference right"

$(BASE).pdf: $(FICHIER) $(PAQUETS) $(FIGURES) $(MODULES) $(BIBLIO)
( \
\pdflatex $< && \bibtex $(<:.tex=) && \pdflatex $< && \
while \grep -q "Rerun to get cross-references right." $(<:.tex=.log); \
do \
\pdflatex $<; \
done \
)



Les outils indispensables pour LaTeX

  • la distribution TeTeX pour Linux ou Cygwin
  • la distribution TeXLive pour Windows ou Linux (au lieu de TeTeX)
  • un éditeur tel Emacs + Auctex



Et le dernier outil indispensable est une bonne documentation

Schopenhauer et les jeux-vidéos

Au début des années 1980, les premières consoles de jeux faisaient leur entrée dans les foyers... Les jeux étaient simples mais possédaient déja quelques caractéristiques intéressantes. Au final, ces jeux auront fait des ravages dans la génération des jeunes nés dans les années 1980. Certains d'entre eux n'arrivent plus à distinguer la réalité et la fiction comme en témoignent les vidéos qui suivent. Pacman ou Zelda font partis des nombreux exemples de jeux ayant contribués à l'effacement de la réalité. Vous noterez aussi l'omniprésence des jeux vidéos dans toutes les activités comme le crochet.

Plus sérieusement, qu'est-ce qui fait un bon jeu ?

La réponse est simple: ce ne sont ni les graphismes, ni le scénario... Il faut un bon système de récompense qui ne frustre pas le joueur. Et plus précisément qu'est-ce qu'un bon jeu : c'est un jeu qui donne envie d'y jouer. Le désir de jouer doit-être fort chez le joueur, sinon il n'éprouvera aucune motivation à aller s'étaler dans un canapé devant sa console. Ce doit aussi être un jeu qui dure, si possible indéfiniment. Cet enjeu est particulièrement important puisque le joueur sera plus enclin a payer 60 euros s'il ne finit pas le jeu en une semaine et cela est encore plus vrai dans le cas de jeux nécéssitant un abonnement.

Donc au final, un bon jeu doit rendre addicte et durer suffisament longtemps pour que le joueur ne puisse jamais sentir l'effet de manque et puisse continuer a tranquillement faire des virements sur le compte de la société éditrice de jeux.

Et pour ca, le principe est simple. Tout d'abord le joueur doit-être réceptif : il doit chercher à satisfaire ses désirs (ie ne pas trop suivre Kant et Schopenhauer). Ca commence bien puisque la plupart d'entre nous cherchons à satisfaire nos désirs. Le problème du désir, c'est que quand il est satisfait, après un court moment de plaisir, un nouveau désir nait. Celui-ci est plus dur à satisfaire. Schopenhauer l'explique très bien :

Tout vouloir procède d'un besoin, c'est-à-dire d'une privation, c'est-à-dire d'une souffrance. La satisfaction y met fin; mais pour un désir qui est satisfait, dix au moins sont contrariés; de plus, le désir est long, et ses exigences tendent à l'infini; la satisfaction est courte, et elle est parcimonieusement mesurée. Mais ce contentement suprême lui-même n'est qu'apparent: le désir satisfait fait place aussitôt à un nouveau désir; le premier est une déception reconnue, le second est une déception non encore reconnue. La satisfaction d'aucun souhait ne peut procurer de contentement durable et inaltérable. C'est comme l'aumône qu'on jette à un mendiant: elle lui sauve aujourd'hui la vie pour prolonger sa misère jusqu'à demain - Tant que notre conscience est remplie par notre volonté, tant que nous sommes asservis à l'impulsion du désir, aux espérances et aux craintes continuelles qu'il fait naître, tant que nous sommes sujets du vouloir, il n'y a pour nous ni bonheur durable, ni repos. Poursuivre ou fuir, craindre le malheur ou chercher la jouissance, c'est en réalité tout un: l'inquiétude d'une volonté toujours exigeante, sous quelque forme qu'elle se manifeste, emplit et trouble sans cesse la conscience; or sans repos le véritable bonheur est impossible. Ainsi le sujet du vouloir ressemble à Ixion attaché sur une roue qui ne cesse de tourner, aux Danaïdes qui puisent toujours pour emplir leur tonneau, à Tantale éternellement altéré.

Schopenhauer, le Monde comme volonté et comme représentation (1818), Éd. P.U.F., 1992, §38

Revenons en aux jeux. Le jeu doit satisfaire les désirs du joueur, celui-ci éprouvera alors du plaisir, puis un nouveau désir qu'il faudra satisfaire. Et ainsi, le joueur court derrière un plaisir qu'il arrive juste à gouter sans jamais le saisir... tel le fantome qui court derrière PacMan. C'est la qu'intervient le système de récompense. Si le joueur court après le plaisir sans jamais y gouter, il va se démotiver et ne jouera plus. Ainsi, le jeu doit apporter régulièrement une récompense au joueur. En général, c'est une progression dans le niveau qui vous rend plus fort, vous offre plus de possibilités et vous gratifie virtuellement¹. En effet, quoi de plus plaisant que de voir son avatar progresser (World Of Warcraft), sa civilisation écraser une autre (Age of Empires, Civilisation, ...), sa voiture être encore plus rapide (Need For Speed) ou encore son équipe de foot soigneusement montée gagner (ChampionShip Manager). La clé du succès, ou plutot du plaisir, ou plutot du désir perpétuel est dans la satisfaction permanente de ce dernier.

D'un autre coté, il faut a tout prix éviter la frustration : en effet, mourrir dans un jeu, c'est tellement démotivant, qu'on a pas envie de recommencer. C'est bien le cas : vous avez déja vu quelqu'un mourrir dans World of Warcraft ou quelqu'un casser sa voiture dans Need For Speed ? L'autre type de frustration à éviter est l'absence de progression. Si vous ne progressez plus, vous n'avez plus jamais de récompense, du coup plus jamais de plaisir, le désir ne devient plus que souffrance et alors... soit vous tombez dans la dépression et vous acharnez sur le jeu pour quand même progresser, soit vous comprenez enfin que le jeu est l'objet de la souffrance et vous arretez de jouer pendant un moment.

La difficulté est là : fournir une récompense souvent au début, jusqu'a ce que le désir devienne sufisament important pour que le joueur puisse fournir un effort un peu plus important pour obtenir des récompenses. Ensuite, il est possible de ralentir un peu la progression pour ne pas voir un monstre surpuissant apparaitre dans le jeu. Mais la progression ne doit jamais s'arrêter. Les récompenses doivent-être permanentes. Le joueur doit toujours avoir un objectif : avoir tel objet, battre tel monstre... Ainsi, afin de le garder indéfiniment, les récompenses doivent-être infinies... La difficulté réside alors dans la construction d'un scénario qui prenne en compte ce besoin de montrer au joueur qu'il progresse sans que le jeu devienne trop facile et sans pour autant arrêter sa progression.

On constate ainsi que les bons jeux sont faits pour rendre addicte, ca part à la fois d'une bonne volonté et à la fois d'un besoin économique:

  • faire un jeu qui contente le joueur
  • maximiser la durée des abonnements pour les jeux à abonnements.

L'effet pervers de ce points est une addiction psychologique importante chez des joueurs de plus en plus jeune, en particulier pour les MMORPG qui ne suivent pas un scénario qui se termine. De plus, ces jeux offrent une liberté relativement grande, ce qui permet au joueur de toujours progresser, de toujours trouver un intéret au jeu.

Malheureusement, l'addiction psychologique peut avoir des conséquence graves comme le déclenchement de phlébites ou d'embolies pulmonaires. Alors, même si vous jouez beaucoup, pensez a marcher un peu de temps en temps... Ca évitera des accidents. Et après, vous finirez bien par trouver des limites au jeu et ne plus pouvoir satisfaire votre désir. Vous trouverez alors un autre objet sur lequel reporter votre désir: copine, autre jeu, télévision, autre passion, ...

Vous pouvez aussi lire Daniel Haggard ou l'article suivant : Gaming fanatics show hallmarks of drug addiction

En tout cas, attention, l'addiction peut nuire à vos relations sociales, sauf si... votre copine vous aime beaucoup.

¹ Si l'on considère que le joueur se projette sur son avatar (cf la théorie de Freud sur la projection), alors dans ce cas, la gratification est pas uniquement virtuelle, elle est aussi réelle.

lundi 8 septembre 2008

Quelques conseils pour prendre de belles photos

En cette période estivale, propices aux vacances et aux sorties, vous allez tous vous ruer sur votre appareil et prendre des tonnes de photos. Peut-être pas autant que moi, mais quand même. Alors, nous allons voir comment faire en sorte que vos photos, a défaut d'être parfaites, soient bien.

Pour pouvoir prendre de belles photos, il faut comprendre les différents paramètres de l'appareil et leur influence. Le capteur de l'appareil photo est sensible à la lumière. Celle-ci entre par la lentille frontale, traverse l'objectif, puis le diaphragme avant d'arriver au capteur qui est masqué par un obturateur. L'obturateur s'ouvre pour laisser la lumière atteindre le capteur, la durée d'ouverture s'appelle le temps de pose. Le flux de lumière arrivant au capteur peut-être réduit en fermant le diaphragme, comme la pupille de l'oeil qui se resserre en plein soleil. L'appareil se charge généralement de trouver la meilleure combinaison pour avoir une photo réussie... mais parfois, il faut l'aider un peu. De plus, le cadrage de la photo est important, et il ne faut pas le rater, puisque l'appareil ne vas pas se déplacer tout seul : rien n'est automatisé à ce niveau...

Et maintenant comment faire des photos ?

La base : l'ouverture, la profondeur de champs et les flous : le reste ne sert a rien

L'ouverture permet de régler la pupille de l'appareil. L'interet est de diminuer plus ou moins la quantité de lumière entrant dans l'appareil. Plus le chiffre est petit, plus l'ouverture est grande (pupille dilatée), et plus le chiffre est grand plus l'ouverture est petite. Cela a deux effets : cela influe sur le temps d'exposition, et cela influe sur la profondeur de champs. La profondeur de champs va correspondre a la zone nette. Si la profondeur de champs est de 30cm, alors, si l'on fait la mise au point sur un objet a 1m, les objets a 90cm et les objets a 1m20 seront aussi à peu près net. Les objets situés a 30cm ou 3m seront completement flous.

Quelques exemples d'utilisation:

paysage : petite ouverture (f22)

Une petite ouverture permet de n'utiliser que le centre de la lentille et ainsi d'avoir une grande profondeur de champs. Dans le cas de prise de vue de paysage, cela permet d'accroitre l'impression de profondeur en ayant un avant plan net et un arrière plan tout aussi net. Attention a ne pas bouger lors de l'utilisation de petites ouvertures : le temps d'exposition augmente.


portrait : grand ouverture (f3)

Lorsque l'on réalise un portrait, on souhaite mettre en valeur le sujet et si possible avoir un arrière plan flou pour attirer l'oeil sur le sujet principal. Pour cela, il faut zoomer au maximum (et donc reculer) et utiliser une grande ouverture (f3). Il faut cependant s'assurer d'avoir une mise au point correct pour avoir le nez net, les yeux nets et les oreilles nettes.

macro : une ouverture moyenne soigneusement choisie (f6)
En macro, on est très proche du sujet photographié, ainsi, la profondeur de champs à grande ouverture devient très petite. Cela permet de bien isolé le papillon de l'arrière plan, en ayant un beau flou sur tout l'arrière plan, mais comme la profondeur de champ peut-être réduite à quelques millimètres, il faut s'assurer que la mise au point est parfaite et que la profondeur de champ permet de couvrir l'ensemble du sujet. On peut augementer la profondeur de champs en fermant un peu le diaphragme.

sport : grande ouverture pour avoir une grande vitesse d'obturation (f3)
Lors de la prise de vue de sportifs, il faut avoir une vitesse d'obturation grande pour capturer le mouvement. On peut, pour cela, utiliser un flash, mais avec la faible puissance des flashs intégrés, il vaut mieux utiliser une grande ouverture pour réduire le temps d'obturation. On peut aussi augmenter la sensibilité (ISO) (400 ISO par exemple).

flou artistique et autre choses nécéssitant des vitesses d'obturation lente : petite ouverture (f22)
Pour avoir un joli flou lorsque vous prenez une cascade, ou pour avoir des trainées de lumière lors que vous prenez un feu d'artifice ou des voitures, il faut augmenter le temps de pause. Le moyen le plus simple est de réduire la sensibilité (100 ISO) et de fermer le diaphragme. Il faut alors veiller a prendre appui sur un support ou a utiliser un pied pour ne pas bouger en prenant la photo.

La prise de vue et le cadrage

Faire une photo nette

Une belle photo doit-être nette, et en particulier, le sujet photographié doit-être nette. Pour cela, il fait faire attention quand vous photographiez deux personnes a ne pas faire la mise au point entre les deux personnes, mais a la faire sur l'une d'elles puis a décaller l'appareil ensuite. Pour cela, visez une des deux personnes, appuyez à moitié sur le déclencheur jusqu'a entre un petit bip ou voir un voyant vert s'allumer, puis décallez l'appareil. Les appareils les plus modernes détectent (ou essayent de le faire) les personnes afin de faire une mise au point correcte. D'autre part, éviter de bouger lors du déclenchement, en particulier avec les appareils compacts qui imposent un délai entre le déclenchement et la prise de vue.


Ligne d'horizon
Vous faites une belle photo d'un coucher de soleil, ou d'un bord de mer, et sans vous en rendre compte, vous ne faites pas attention a l'horizontalité (en particulier avec un appareil tenu a bout de bras...). La mer calme et appaisante ressemble alors à un torrent en furie avec 40° de pente, classe 5 en kayak... Ca n'étais pas forcement votre objectif. Ainsi, essayer de tenir l'appareil horizontalement ou verticalement...

Ne garder que l'essentiel : rendre le reste flou avec la profondeur de champs ou le placer hors cadre

Afin de mettre en valeur le sujet : le papillon, une personne,... il faut essayer d'effacer ce qui est sans rapport et qui pourrait attirer l'oeil. Pour cela, on peut cadrer de facon a sortir ces éléments du cadre, ou alors utiliser la profondeur de champ pour rendre ces éléments flous.

Ne pas couper des elements par accident

Si vous prenez quelqu'un qui pousse une pousette, évitez de couper la pousette en deux. D'une manière générale, regarder sur les bords de votre image si vous coupez un objet, et si cet objet à un interet et si l'on ne peut pas éviter la coupure en excluant completement l'objet.

Ne pas exclure des elements importants : ce que quelqu'un regarde

Si vous prenez une personne, laissez de la place vers l'endroit ou il regarde, et en particulier laissez ce qu'il regarde, sinon, cela laisse une impression bizarre, comme s'il manque quelque chose. La photo semble alors incomplete.

Pourquoi centrer ?

Si vous prenez un sujet, pourquoi le centrer ? Vous pouvez aussi le placer sur le tiers droit ou gauche, et laissez de la place vide vers l'endroit ou il se déplace ou l'endroit où il regarde....

Quelques astuces

Le flash ne sert a rien :-( malheureusement : sur un compact, il porte a 3m et sur un reflex, a 6metres

On peut donc s'en servir, mais en étant ni trop près du sujet, sinon, il aura la peau toute blanche, ni trop loin, sinon le flash n'aura aucun effet. 3m sur un compact et 3 a 9m sur un réflex semblent raisonnable. Essayez sur le votre, cela dépend de chaque appareil.

Fond sombre, sujet lumineux : flash

Le flash permet cependant d'isole le sujet en l'éclairant alors que le fond reste sombre. Cela permet de le mettre en valeur et de le détacher de l'arrière plan.

Photo de nuit : pas de flash

Inutile d'utiliser le flash pour illuminer la place Vendome de nuit. Desactivez le, prenez un appui stable et déclenchez.

Photo de mouvement

Dans le cas d'une photo en mouvement, le flash permet de figer le mouvement. Pour avoir une trainée derrière une personne qui court, il faut activer la synchro lente et le flash sur le second rideau. Ainsi, l'obturateur va s'ouvrir, prendre la personne en train de courir, et le flash ne va se déclencher que à la fin pour figer la fin du mouvement. Le comportement classique est de déclencher le flash quand l'obturateur s'ouvre et donc de figer le début du mouvement. La trainée sera devant le sujet : cela n'est pas souhaitable.

Cependant, l'utilisation principale du flash intégré reste, outre la photo d'anniversaire, la photo en extérieur vers midi en pleine canicule...

Vous allez passer pour un fou en mettant le flash a 14h sur la coté d'azur un jour de canicule, mais vos photo y gagneront. En plein soleil, les ombres sont marquées, l'utilisation du flash permet de les attenuer. Il peut ainsi être utile de forcer l'utilisation du flash, en particulier lors de photos à contre jour.

Comment prendre une photo nette

Avec un pied

C'est la meilleure solution, et la plus stable, mais le pied est encombrant.

Sans pied

Pour prendre une photo nette sans pied, il faut essayer de prendre appui, prendre une position stable, lacer les coudes resserés contre le torse, et l'appareil prêt de son visage et ensuite controler sa respiration et ne pas respirer au cours de la prise de vue. Vous pouvez aussi poser l'appareil sur un mur.

Sans déclencheur souple/infrarouge

Pour pallier a l'absence de déclencheur souple, on peut utiliser le retardateur qui permettra de réduire les flous de bouger du au déclenchement.

Comment faire des trucs étranges....

Effet de lumière

Vous pouvez dessiner sur une photo avec une lampe de poche. Dans le noir, choisissez une ouverture moyenne (f16) et un long temps de pose (30 secondes). Placez vous face a l'objectif, a une distance raisonnable et dessinez dans l'air, avec la lampe de poche pointée vers l'appareil.

Flou de l'eau

Pour avoir de jolis effet de flous sur des cascades ou des ruisseaux, choissisez un long temps de pose et un appui stable.

Quelques lectures intéressantes

Sur un Wikibook :

Par un très bon photographe israélien (Gilad Benari), pour aller plus loin et plus en détails:

D'autre part:

Quelques sites pour voir de belles photos et trouver de l'inspiration

Ma gallerie sur DeviantArt ou pour de belles images comme promis, celle de Gilad Benari.

Vous adorez prendre des photos et vous voulez un réflex ? Foncez sur le Kit Nikon D40 + 18-55mm => 490 euros - 90 euros remboursés par Nikon. Si vous voulez un modèle plus evolué, avec un viseur plus clair et plus grand, optez pour le petit frère du D200 : le D80 + 18-70mm. Maintenant, fin 2008, on ira soit vers le D40, soit vers le nouveau D90.

Pour un compact, les Canon IXUS 80IS, 860IS, ... sont vraiment bien.

Des variables sous Word

Avec LaTeX tout le monde sait faire : un petit \def et le tour est joué ! Par contre pour Word comment faire ?

Word est quand même un logiciel assez abouti il faut le dire... Cependant parfois tout n'est pas toujours simple. Si les fonctionnalités de bases sont évidentes (mettre en gras, centrer, etc.), quand on veut aller plus loin ça peut devenir un casse-tête. Par exemple pour insérer des variables j'ai mis deux bonnes heures pour trouver une solution qui me convienne !

Sans plus de blabla, voici quelques solutions pour mettre des variables dans votre document Word !

Exemple d'utilisation des variables

je veux mettre l'adresse de mon blog préféré, http://laurian.ovh.org/blog/, dans mon document. Le problème c'est que je risque de changer d'avis d'un jour à l'autre. Je vais donc utiliser une variable. Pourquoi ? Deux raisons :
  • ça va me permettre d'être sûr de ne jamais faire de faute lorsque j'écris l'url (j'ai juste à insérer la variable)

  • pour changer de blog préféré, j'ai juste à changer la définition de la variable (plutôt que de faire un rechercher / remplacer qui au passage ne fonctionnerait pas s'il y avait des fautes...)

Ma solution : champs et signets

C'est à mon avis la meilleure solution, du moins si vous n'avez pas beaucoup de variables et qu'elles ne sont pas organisées. Voici comment faire :

  1. définissez un signet (Insertion / Signet...) au début du document (ou du moins avant que vous ne commenciez à utiliser la variable). Donnez-lui le nom de votre variable, blog dans mon cas, et cliquez sur Ajouter ;

  2. au même endroit, définissez un champ associé au signet : allez dans Insertion / Champ..., choisissez le type de champ Définir, choisissez le signet blog (enfin le nom de votre variable quoi) et comme texte... http://laurian.ovh.org/blog/ bien sûr ;

  3. mettre des références où vous voulez insérer votre variable : faites Ctrl + F9, des accolades apparaitront sur fond gris. Entre les accolades, mettez le nom de votre variable : pour mon cas ça donne { blog }[1]. C'est tout !

Maintenant si vous voulez changer la valeur de la variable, revenez au début du document (enfin là où vous avez défini la variable), faites Ctrl + A puis Shift + F9. Des tas de formules bizarres vont apparaitre, du genre { SET blog http://laurian.ovh.org/blog/ \* MERGEFORMAT }... vous voyez où je veux en venir non ? La syntaxe est plutôt explicite (à part le \* MERGEFORMAT qui est une instruction de formatage dont on ne s'occupera pas). Pour changer votre variable, vous pouvez donc le faire directement en changeant http://laurian.ovh.org/blog/ par ce que vous voulez... Alternativement vous pouvez faire un clic droit dessus et choisir Modification du champ..., je vous fais comfiance pour le reste !

Solution de Nico : Le XML suit son chemin (XPath) dans les champs

C'est selon l'avis de Nico la meilleure solution, du moins si vous avez beaucoup de variables et qu'elles sont organisées. Je lui laisse la parole...

Nico, il dit que c'est la meilleure solution tout court. Pour cette solution, vous devrez créer un fichier XML qui va accompagner votre document Word. Vous pouvez alors y placer l'ensemble de vos variables et de vos données. Ce qui est intéressant, c'est que ce format est ouvert et permet d'exploiter les données depuis divers applications. Word permet notament d'exploiter ces données.

Cliquez sur Insertion / Champs .... Choississez Inclure Fichier dans la liste. Vous pouvez alors spécifier le nom de votre fichier XML (toto.xml). Choississez aussi une méthode de traitement des données. Vous pouvez si vous le désirer appliquer des transformations complexes via l'utilisation de XSL, mais le plus simple est d'utiliser une simple expression XPath. Ainsi, prenons le cas d'un fichier XML (toto.xml):

[xml]
<info adresse="http://laurian.ovh.org">
<nom>Le fameux blog</nom>
<evenement type="creation">
<date>2007</date>
</evenement>
<evenement type="miseajour">
<date>2008</date>
</evenement>
</info>

Vous pouvez alors entrer dans le champs correspondant une des expressions XPath suivantes:

  • Pour insérer l'adresse, vous utiliserez l'expression XPath : /info/@adresse.

  • Pour insérer le nom : /info/nom

  • Pour insérer la date de création /info/evenement[type='creation']/date

Vous aurez un aperçu plus complexe de la syntaxe sur Wikipedia.

Pour modifier la valeur d'une variable, modifiez le fichier XML en conséquence, selectionnez tout le document, cliquez avec le bouton droit et choisissez Mettre à jour les champs. Pensez aussi a diffuser le fichier XML avec le fichier DOC si les gens souhaitent modifier le document. Si vous souhaitez juste leur permettre de lire le document, le fichier XML n'est pas nécéssaire et vous pouvez, aussi, exporter le tout au format PDF.

Une idée maintenant : vous faire un CV sous Word avec les infos stockées dans un fichier XML.

Notes

[1] Vous pouvez aussi le mettre commee ceci : { REF blog }.

Ne pas ouvrir de fenêtre au clic sur un lien

Vous n'avez juré contre un site qui vous ouvrait une fenêtre lors d'un clic sur un lien ?

Moi oui... j'ai donc cherché la cause du problème. Il y a deux causes possibles (bon peut-être plus mais très peu utilisées) : utilisation de javascript et utilisation de target="_blank" ou target="_new"... C'est cette dernière possibilité qui est (de loin me semble-il) la plus courante. Bref, tout ce blabla pour vous annoncer que bien entendu j'ai trouvé une solution à ce fléau ! Du moins pour firefox... si vous avez le malheur d'utiliser un autre navigateur, débrouillez-vous tout seul ! :P. Bon si vous avez la solution, mettez-la en commentaire quand même : je suis pas intégriste non plus ;). Oui oui, la solution, j'y viens ! Deux possibilités :

  • pour firefox 1 il faut cocher l'option Forcer les liens qui s'ouvrent dans de nouvelles fenêtres à s'ouvrir dans dans options / avancé / onglets

  • pour Firefox 2 il existe une extention, TargetKiller qui permet de choisir quoi faire selon le diabolique target. Par défaut, le plugin nous supprime gentillement les _blank et _new qui nous embêtent ! Que demander de plus ? Hmmm que Firefox remette l'option... pourquoi l'ont-ils enlevé ?!?!

Petite info : l'attribut target n'existe plus dans html strict à partir de 4.0.1 (et dans aucune version de xhtml me semble-t-il). Pourquoi ? parce que ça casse la navigation de l'utilisateur, ça le perd, etc. Je suis on ne peu plus d'accord avec ça et j'ai longtemps maudit les webmasters qui mettaient cet horrible attribut (maintenant je me contente de les ignorer :D). Si vous ne me croyez pas, gogglez attribut target _blank. Ça fait même partie des 10 plus grosses erreurs de création de site web selon Jakob Nielsen (expert en la matière). Bon c'est vrai, des fois c'est utile d'ouvrir des nouvelles fenêtres mais c'est si souvent mal utilisé...

Gestionnaires d'évenements et droits Sharepoint

Comment changer le comportement des évenements : par exemple changer les droits d'une tâche lors de l'ajout de celle-ci.

J'ai récemment eu un problème dans mon projet : je voulais que seules les personnes assignées à une tâche puissent accéder à celle-ci. Ça paraît une fonctionnalité assez normale et simple mais elle n'est pas disponible directement dans Sharepoint, il va donc falloir coder. Heureusement, les gens du newsgroup de Sharepoint m'ont très vite lancé sur la bonne voie (merci à eux !). Ils m'ont renvoyé vers un howto qui était presque la solution à mon problème. Je vais bientôt expliquer ma solution, mais avant je vous propose un webcast sur la création des gestionnaires d'évenements Sharepoint qui m'a aussi aidé et qui est très simple et très clair !

Bon, l'introduction terminée, passons au vif du sujet. Pour gérer les évenements Sharepoint, il faut :
  1. créer une DLL avec une classe qui hérite d'une d'un Handler

  2. déployer la DLL

Création du gestionnaire d'évenements

Déploiement de la solution

Comme expliqué dans le webcast dont j'ai parlé au début, il y a deux façons de déployer notre DLL :

  • à l'aide d'une feature (création d'un fichier feature.xmlet déploiement avec stsadm)

  • avec du code

J'ai un penchant pour la première méthode car elle ne dépend que d'elle-même, c'est donc celle-là que je vais décrire (mais je vous invite encore une fois à regarder le webcast pour voir comment on fait la deuxième).




  1. mettre votre DLL dans le GAC[1] (ceci est commun aux deuc méthodes de déploiement) :

    1. trouvez votre DLL (elle est probablement dans votre projet dans bin\Debug)

    2. avec un autre explorateur Windows (pas dans le même sinon le point suivant ne marchera pas) allez dans C:\Windows\assembly

    3. faites un glisser-déposer de la DLL dans le dossier du 2e explorateur

Notes

[1] Global Assembly Cache

Langages ésotériques


++++++++++[>++++++++++<-]>+++++.-----.+.++++++++.

(Extrait de la conversation pour la création du présent blog)

Il y a beaucoup de langages de programmation, énormément... Tout le monde connait le C++, le Java, parfois même le B ;)

Mais qui connait le Brainfuck ? Le Ook! ? le C- ? 99 ? Le SARTRE ?!

Bon, si le premier est sérieux (si, si), les trois autres le sont un peu moins : le Ook! est identique au Brainfuck en combinant seulement trois lexèmes (Ook! Ook? et Ook.) pour le rendre plus illisible qu'il ne l'est déjà, le C- est un langage qui requiert généralement plus d'instruction que le langage machine pour un même programme, tout programme est valide 99 s'il rend les paroles de la chanson 99 beers, enfin le SARTRE, nommée comme vous vous en doutrez après le philosophe Jean-Paul Sartre... qui contient des type de données du genre en-soi et pour-soi, des instructions comme Life is meaningless... bref du n'importe quoi ! Un petit exemple de programme SARTRE ?

Nihilator SartreExample2;
Act
IF ;
again ;
No more ; .
Ce magnifique programme considère les implications de son existence. Qui a dit que les programmes ne sont pas intelligents ?!

Bon soyons plus sérieux maintenant... le Brainfuck ! Brainfuck a été créé à l'origine (sur les traces du langage FALSE) pour pouvoir être compilé avec un compilateur le plus petit possible... il y aurait des compilateurs Brainfuck de moins de 200 octets ! Le langage est donc composé de 8 instructions : > < + - . ,. À noter que ce langage est Turing-complet, c'est à dire qu'il peut calculer toute fonction calculable au sens de Turing (bon, on va pas rentrer dans les détails hein...). En gros, il sait faire autant que C++, Java...

Si ça parait illisible au premier coup d'oeuil (et même au 2e, 3e... bref !), en fait on finit par s'y faire... il suffit d'avoir une bonne vu des listes sur lesquelles on se balade (une qui contient les instructions et l'autre les données). Voyons maintenant l'exemple du résumé :

++++++++++ ajouter 10 dans la case actuelle
[ début de boucle : tant que non 0
>++++++++++< ajouter 10 dans la case suivante et revenir à la première case
-] décrementer la case actuelle et retourner au début de la boucle si la case actuelle n'est pas égale à 0
> aller sur la case suivante (qui contient 10*10 = 100)
+++++. ajouter 5 (on a donc 105) et afficher (105 en ASCII est le 'i')
-----. enlever 5 et afficher (100 : 'd')
+. ajouter 1 et afficher (101 : 'e')
++++++++. ajouter 8 et afficher (109 : 'm')

C'est simple en fait ! ;)

Bon, pour faire des programmes un peu plus poussés c'est plus compliqués... Un if then else par exemple...

if x then x = 0 else x = 1
(on est 3 cases avant x, sur une case non attribuée à une variable)
[-]+>>>[[-]<<<][+<<<]-
Explication en pseudo-code :
(ptr = *r// r : registre)
r = 0
r++
ptr += 3// = *x
while (*ptr != 0) do
x = 0
ptr -= 3// = *r
done
while (*ptr != 0) do
x++
ptr -= 3// = *r
done

Sur ce, bon cassage de tête !

Quelques liens :