documentator 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1cb2b60a388b55a2ef800f92c0727205a2a87593
4
- data.tar.gz: 394c3267f4522ac5e9f3b46b8e29cac433d4dc12
3
+ metadata.gz: 904490606b2d529b0be6d6eae6dab86bc616135b
4
+ data.tar.gz: eb839473523c14b243ac521f109dcae44da0a2cf
5
5
  SHA512:
6
- metadata.gz: 2f04a465bf81908689d13b5c3492d0a0a007c8ddbf81e4eaa11ff57cb60c2208707e52c8c875f414ea68279319c292f9cba0b14d257c8a05003345d0807a084a
7
- data.tar.gz: ae4e8b7aa668ddc5b5239cc9d76007c19eb7310fc4511807a71ad3f2c71fc9f2d53e261b301fe62a2ecca14b7548295388aa8cdb4143ee14a1ea3075c9b087b1
6
+ metadata.gz: f37a2c94807676a41a8bba2af9961803ee116389f35cf522b3e7c8ec5934a43df62d111994160926e7e6938be2f44da0b530e82e42d5f70860703f6389711c91
7
+ data.tar.gz: 9a39379069e0ea1dc7de17bb58b8c31021b94ab37bb84c42b281409e0678dbe982821236c6b821bf93271bdce8025d6824ec777be13dc36eb9c3f511a117e05b
data/lib/documentator.rb CHANGED
@@ -16,15 +16,19 @@ module Documentator
16
16
  end
17
17
 
18
18
  desc "import a template to doc directory"
19
- def import(template)
20
- unless File.exists?(doc_path)
21
- puts "You should run `bootstrap` before trying to import documentation"
22
- exit 1
19
+ def import(*templates)
20
+ templates.each do |template|
21
+ begin
22
+ unless File.exists?(doc_path)
23
+ puts "You should run `bootstrap` before trying to import documentation"
24
+ exit 1
25
+ end
26
+ cp(templates_path.join("#{template}.md"), doc_path)
27
+ puts "✓ File #{template} copied."
28
+ rescue Errno::ENOENT
29
+ puts "x File #{template} not found."
30
+ end
23
31
  end
24
- cp(templates_path.join("#{template}.md"), doc_path)
25
- puts "✓ File #{template} copied."
26
- rescue Errno::ENOENT
27
- puts "x File #{template} not found."
28
32
  end
29
33
 
30
34
  desc "List all templates"
@@ -0,0 +1,239 @@
1
+ # Elasticsearch
2
+
3
+
4
+ [Elasticsearch](http://www.elasticsearch.org/) est un moteur de recherche
5
+ distribué basé sur Lucene qui offre une API JSON RESTful et une quantité assez
6
+ impressionnante d'options de recherches. Il est très simple à mettre en place
7
+ et s'est imposé chez nous comme la solution de référence dès que nous avons une
8
+ recherche un peu évoluée à mettre en place.
9
+
10
+ ## Installation
11
+
12
+
13
+ ### Pour une installation en local
14
+
15
+ Le plus simple pour une installation en local est d'utiliser [Desi](https://github.com/AF83/desi) :
16
+
17
+ ```shell
18
+ gem install desi && desi install
19
+ ```
20
+
21
+ Par défaut, Desi installera ES dans le répertoire `$HOME/elasticsearch`, mais
22
+ on peut facilement [changer ce paramètre](https://github.com/AF83/desi#change-settings).
23
+
24
+ Une fois ES installé par Desi, on peut très simplement à la fois le lancer et
25
+ afficher les logs en faisant `desi start --tail`. Pour arrêter le démon, faire
26
+ `desi stop`, tout simplement. Pour les autres options proposées par Desi,
27
+ référez-vous à [la page du projet](https://github.com/AF83/desi).
28
+
29
+ Par défaut, Elasticsearch tournera sur le port 9200 de _localhost_.
30
+
31
+ ### Installation sur un serveur
32
+
33
+ Le plus simple est de récupérer l'archive deb
34
+ [directement depuis la page _download_ du projet](http://www.elasticsearch.org/download/).
35
+
36
+ L'installation est là aussi très simple. On peut se référer à [la page
37
+ correspondante sur le site du projet](http://www.elasticsearch.org/guide/reference/setup/installation.html)
38
+ pour plus de détails.
39
+
40
+ ### Gotcha
41
+
42
+ Bien que des optimisations aient été apportées pour diminuer sa gourmandise en
43
+ la matière, ES fait une consommation importante de descripteurs de fichiers.
44
+ Les réglages par défaut du nombre maximum de descripteurs de fichiers autorisés
45
+ par utilisateur sur un système Linux sont généralement rapidement atteints,
46
+ avec comme conséquence le message d'erreur `Too many open files`.
47
+
48
+ Pour prévenir ce problème, il convient donc d'augmenter cette limite pour
49
+ l'utilisateur qui lancera le démon Elasticsearch. La documentation du projet
50
+ recommande de le hausser à 32 000, voir 64 000. Sur un système Linux, il
51
+ faudra modifier le fichier `/etc/security/limits.conf`. Cela donne par exemple
52
+ chez moi :
53
+
54
+ ```
55
+ drr soft nofile 8192
56
+ drr hard nofile 65536
57
+ ```
58
+
59
+ ## Plugins
60
+
61
+ Il existe [un grand nombre de plugins](http://www.elasticsearch.org/guide/reference/modules/plugins.html)
62
+ parmi lesquels quelques-uns peuvent être utiles pour l'administration au
63
+ quotidien :
64
+
65
+ * [elasticsearch-head](https://github.com/mobz/elasticsearch-head)
66
+ * [elasticsearch-inquisitor](https://github.com/polyfractal/elasticsearch-inquisitor)
67
+ * [bigdesk](https://github.com/lukas-vlcek/bigdesk)
68
+ * [paramedic](https://github.com/karmi/elasticsearch-paramedic)
69
+
70
+ Pour installer un plugin, il faut aller dans le répertoire où est installé ES
71
+ et lancer la commande `bin/plugin install github_user/github_repo`. Par
72
+ exemple, pour installer les plugins mentionnés ci-dessus avec une installation
73
+ typique faite par Desi, on peut faire :
74
+
75
+ ```shell
76
+ $ cd ~/elasticsearch/current
77
+ $ bin/plugin install mobz/elasticsearch-head
78
+ $ bin/plugin install polyfractal/elasticsearch-inquisitor
79
+ $ bin/plugin install lukas-vlcek/bigdesk
80
+ $ bin/plugin install karmi/elasticsearch-paramedic
81
+ ```
82
+
83
+ Ces plugins seront accessibles sur les URLs suivantes :
84
+
85
+ * http://localhost:9200/_plugin/head/
86
+ * http://localhost:9200/_plugin/inquisitor/
87
+ * http://localhost:9200/_plugin/bigdesk/
88
+ * http://localhost:9200/_plugin/paramedic/
89
+
90
+
91
+
92
+ ## Bonnes pratiques
93
+
94
+
95
+ ### Se méfier des erreurs de mapping
96
+
97
+ Les erreurs de
98
+ [mapping](http://www.elasticsearch.org/guide/reference/mapping/index.html) sont
99
+ particulièrement pernicieuses et constituent d'expérience la plus grosse source
100
+ de fragilité. Il s'agit d'ailleurs en premier lieu de problèmes posés par
101
+ Lucene et non par ES proprement dit.
102
+
103
+ Elles se manifestent par l'impossibilité d'indexer un document dont la
104
+ structure ne correspond pas à celle attendue par l'index où on veut le stocker.
105
+ Cela peut avoir des conséquences particulièrement gênantes en production car
106
+ la suppression/recréation de l'index suivie d'une réindexation sera fréquemment
107
+ la seule solution.
108
+
109
+ Pour s'en prémunir, il convient donc en premier lieu :
110
+
111
+ 1. de ne pas se fier uniquement au [mapping
112
+ dynamique](http://www.elasticsearch.org/guide/reference/mapping/dynamic-mapping.html)
113
+ d'Elasticsearch mais d'indiquer explicitement à ES les champs à indexer
114
+
115
+ 2. d'indexer le moins de champs possibles.
116
+
117
+ On n'est en effet pas obligé d'*indexer* un champ pour le stocker dans
118
+ Elasticsearch. On peut tout à fait le stocker dans la
119
+ [source](http://www.elasticsearch.org/guide/reference/mapping/source-field.html)
120
+ du document sans qu'il soit pris en compte dans la requête. Elasticsearch
121
+ — et plus précisément Lucene — le stockera sans chercher à procéder à quelque
122
+ analyse que ce soit et pourra le restituer tel qu'il lui a été fourni.
123
+
124
+ Le mieux est donc d'utiliser les [dynamic\_templates](http://www.elasticsearch.org/guide/reference/mapping/root-object-type.html) pour passer par défaut tous les champs en `"index": "no"`, pour
125
+ ensuite indexer explicitement les champs désirés au cas par cas.
126
+
127
+ Outre la fiabilité accrue, cela réduira également la taille des indexes
128
+ Lucene et donc la charge du système.
129
+
130
+
131
+ Au delà de cette première mesure, il faut également bien sûr mentionner deux
132
+ conseils de bon sens :
133
+
134
+ * Tâcher autant que faire se peut de déterminer le plus précisément
135
+ possible la structure du document et de s'y tenir
136
+ * Ne pas changer en cours de route la nature d'un champ en conservant son
137
+ nom à l'identique. On peut changer la cardinalité d'un élement sans
138
+ changer le mapping, mais son type doit demeurer identique.
139
+
140
+
141
+ ### Ne pas nommer à l'identique deux champs de natures différentes stockés dans un même index ES
142
+
143
+ On peut stocker dans un même [index](http://www.elasticsearch.org/guide/reference/glossary/#index)
144
+ Elasticsearch plusieurs [types](http://www.elasticsearch.org/guide/reference/glossary/#type)
145
+ de documents. Il faut cependant garder à l'esprit que tous les documents d'un
146
+ index ES, quel que soit leur type, seront stockés dans le même index Lucene.
147
+ Une des conséquences est qu'on ne peut avoir en parallèle de champs dont le
148
+ nom soit identique d'un type à l'autre mais dont la nature soit différente.
149
+
150
+
151
+ ### Utiliser les multi-fields pour préparer ses recherches
152
+
153
+ Les [multi fields](http://www.elasticsearch.org/guide/reference/mapping/multi-field-type.html)
154
+ permettent de spécifier à ES qu'on veut qu'un même champ soit indexé de
155
+ plusieurs façons à la fois. On pourra dès lors faire des requêtes dessus en
156
+ utilisant la syntaxe `nom_du_champ.nom_du_sous_champ`. On peut donc avoir
157
+ plusieurs sous-champs optimisés chacun pour des cas précis : recherche
158
+ _full-text_ normale, tri ou facette, auto-complétion, etc.
159
+
160
+
161
+ ### Utiliser un champ non "tokenisé" pour effectuer des tris ou des facettes
162
+
163
+ Afin d'effectuer une recherche _full-text_ sur un champ de type chaîne de
164
+ caractères, il est nécessaire de lui appliquer tout un certain nombre
165
+ d'opérations (typiquement : segmentation en mots, suppression des caractères diacritiques, des
166
+ accents, lemmatisation, etc.) Cependant, ces opérations empêcheront d'effectuer
167
+ certaines opérations qui n'ont de sens qu'appliquées sur le contenu exact du
168
+ champ d'origine, notamment :
169
+
170
+ * le tri (cela n'a pas de sens de faire un tri sur un champ texte segmenté en
171
+ plusieurs mots différents)
172
+ * les facettes
173
+
174
+ Pour ces deux cas, il conviendra donc donc soit de définir le _mapping_ du champ
175
+ comme `not_analyzed`, soit d'utiliser le _mapping_ `keyword`. Dans le deux cas,
176
+ il sera indexé tel quel sans segmentation ou modification d'aucune sorte.
177
+
178
+ Comme indiqué ci-dessus, on peut bien sûr utiliser un *multi-field* si on veut
179
+ indexer le même champ de plusieurs façons à la fois.
180
+
181
+ ### Utiliser l'endpoint `analyze` pour vérifier la façon dont un texte est segmenté
182
+
183
+ Pour plus de détails, se référer [à la documentation](http://www.elasticsearch.org/guide/reference/api/admin-indices-analyze.html)
184
+
185
+ ### Se méfier des limitations de Tire
186
+
187
+ [Tire](https://github.com/karmi/tire) est sans conteste la gem Ruby destinée
188
+ à faciliter l'utilisation d'Elasticsearch la plus évoluée. Son développeur
189
+ principal, karmi, a d'ailleurs rejoint récemment l'équipe
190
+ d'[Elasticsearch.com](http://www.elasticsearch.com/), la société qui est
191
+ derrière le projet. Elle est cependant loin d'être exempte de défauts. Elle
192
+ rend les choses simples triviales mais les cas de figure plus complexes peuvent
193
+ devenir rapidement compliqués à mettre en place.
194
+
195
+ Ses principales limitations :
196
+
197
+ * Son DSL de recherche entraîne assez rapidement des confusions entre sa
198
+ syntaxe propre et celle — foisonnante — d'Elasticsearch.
199
+
200
+ * Il est dans l'ensemble très orienté vers un pattern de type Active Record,
201
+ avec une classe de persistence couplée dans une relation 1-1 avec un index
202
+ ES. On peut cependant avoir facilement des besoins qui vont au-delà de ce
203
+ cas de figure
204
+
205
+ * une documentation mine de rien lacunaire quand on commence à vouloir avoir
206
+ des besoins un peu précis.
207
+
208
+ La gem [stretcher](https://github.com/PoseBiz/stretcher) est née récemment en
209
+ réaction à nombre de ces points. C'est une alternative récente à étudier.
210
+
211
+ Sinon, il peut être tout aussi intéressant de se faire soi-même un client
212
+ Elasticsearch. (Pour de meilleurs performances, ne pas oublier d'utiliser une
213
+ connexion HTTP persistante.)
214
+
215
+ ## Outils
216
+
217
+
218
+ ### Librairies
219
+
220
+ * Ruby: [desi](https://github.com/AF83/desi), [tire](https://github.com/karmi/tire),
221
+ [stretcher](https://github.com/PoseBiz/stretcher)
222
+
223
+ * Javascript : [elastic.js](https://github.com/fullscale/elastic.js)
224
+
225
+
226
+ ### Outils en ligne de commande
227
+
228
+ * [desi](https://github.com/AF83/desi)
229
+ * [elasticshell](https://github.com/javanna/elasticshell)
230
+
231
+
232
+ ### Plugins Elasticsearch
233
+
234
+ * [elasticsearch-head](https://github.com/mobz/elasticsearch-head)
235
+ * [elasticsearch-inquisitor](https://github.com/polyfractal/elasticsearch-inquisitor)
236
+ * [bigdesk](https://github.com/lukas-vlcek/bigdesk)
237
+ * [paramedic](https://github.com/karmi/elasticsearch-paramedic)
238
+
239
+ (Voir plus haut pour plus de détails.)
@@ -0,0 +1,74 @@
1
+ # MongoDB
2
+
3
+ [MongoDB (from "humongous") is a scalable, high-performance, open source NoSQL database.](http://www.mongodb.org/)
4
+
5
+ ## Installation
6
+
7
+ ### Debian
8
+
9
+ En tant que root:
10
+
11
+ ```
12
+ aptitude install mongodb
13
+ ```
14
+
15
+ Pour une version plus récente, on peut également utiliser [le dépôt de
16
+ 10gen](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian/).
17
+
18
+ ### Mac OS X
19
+
20
+ ```
21
+ brew install mongodb
22
+ ```
23
+
24
+ ## Configuration
25
+
26
+ Par défaut `mongod` active la journalisation à partir de la v2.0.
27
+ Cela prend beaucoup d'espace disque et est inutile dans un environnement
28
+ de développement. Pour la désactiver, ajouter `nojournal = true`
29
+ dans `/etc/mongod.conf` ou l'option ` --nojournal` en ligne de commande.
30
+
31
+ ```
32
+ # Disables write-ahead journaling
33
+ nojournal = true
34
+ ```
35
+
36
+ ## Utilisation
37
+
38
+ ### Shell mongo
39
+
40
+ Se connecter à la base `myproject_dev` :
41
+
42
+ ```
43
+ mongo --port 27017 --host localhost myproject_dev
44
+ ```
45
+
46
+ ### Commandes shell
47
+
48
+ Quelques exemples sur la collection `foo` :
49
+
50
+
51
+ db.help() Toutes les méthodes de mongodb
52
+ db.foo.help() Toutes les méthodes de la collection
53
+ db.foo.find().help() Toutes les méthodes de la méthode find()
54
+ db.foo.find() Liste des documents de la collection
55
+ db.foo.save({a: 1}) Enregistre un document dans la collection
56
+ db.foo.update({a: 1}, { $set:{a: 2} }) Update un document quand a == 1
57
+ db.foo.find({a: 1}) Liste des documents de la collection quand a == 1
58
+
59
+ ### Exporter une base
60
+
61
+ Exporter ma base de donnée `myproject_dev`.
62
+
63
+ ```
64
+ mongodump --db myproject_dev
65
+ ```
66
+
67
+ ### Restorer une base
68
+
69
+ Restorer ma base de donnée `myproject_dev` dans la base `myproject_staging`.
70
+
71
+ ```
72
+ mongorestore --db myproject_staging dump/myproject_dev/
73
+ ```
74
+
@@ -0,0 +1,35 @@
1
+ # Neo4j
2
+
3
+ [The Market Leader Property Graph Database](http://www.neo4j.org/)
4
+
5
+ Une base de données graphe est un système de stockage supportant
6
+ la persistance des données sous forme de graphe (noeuds, relations) nativement.
7
+
8
+ ## Installation
9
+
10
+ Version recommandé stable en édition 'community': 1.8.2
11
+
12
+ * Debian
13
+
14
+ ``` shell
15
+ # start root shell
16
+ sudo -s
17
+ # Import our signing key
18
+ wget -O - http://debian.neo4j.org/neotechnology.gpg.key | apt-key add -
19
+ # Create an Apt sources.list file
20
+ echo 'deb http://debian.neo4j.org/repo stable/' > /etc/apt/sources.list.d/neo4j.list
21
+ # Find out about the files in our repository
22
+ apt-get update
23
+ # Install Neo4j, community edition
24
+ apt-get install neo4j
25
+ # start neo4j server, available at http://localhost:7474 of the target machine
26
+ neo4j start
27
+ ```
28
+
29
+ * OSX
30
+ via Homebrew
31
+ ``` shell
32
+ brew update && brew install neo4j
33
+ neo4j start
34
+ ```
35
+
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  module Documentator
2
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
3
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: documentator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - chatgris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-14 00:00:00.000000000 Z
11
+ date: 2013-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: boson
@@ -38,15 +38,18 @@ files:
38
38
  - README.md
39
39
  - bin/documentator
40
40
  - lib/documentator.rb
41
- - lib/documentator/bootstrap/Archi.ditaa
42
- - lib/documentator/bootstrap/Archi.md
41
+ - lib/documentator/bootstrap/Architecture.ditaa
42
+ - lib/documentator/bootstrap/Architecture.md
43
43
  - lib/documentator/bootstrap/Dependencies.md
44
44
  - lib/documentator/bootstrap/Deploy.md
45
45
  - lib/documentator/bootstrap/Environments.md
46
46
  - lib/documentator/bootstrap/Gemfile
47
47
  - lib/documentator/templates/beanstalkd.md
48
48
  - lib/documentator/templates/capistrano.md
49
+ - lib/documentator/templates/elasticsearch.md
49
50
  - lib/documentator/templates/grunt.md
51
+ - lib/documentator/templates/mongodb.md
52
+ - lib/documentator/templates/neo4j.md
50
53
  - lib/documentator/templates/nginx.md
51
54
  - lib/documentator/templates/ruby.md
52
55
  - lib/documentator/version.rb