documentator 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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