Project

General

Profile

BORDEL » History » Version 2

Greg Burri, 01/11/2011 11:30 PM

1 1 Greg Burri
h1. TODO
2
3
* -Traiter tous les évènements du filesystem-
4
* -Gérer la priorité des demandes 'GetHashes' et plus généralement l'interruption du hashage non-explicite en cours-
5
* Penser à vérifer/filtrer tous les paths qui entrent
6
* -Renommer Tests en TestsLogManager et faire de même pour les autres tests. Mettre les tests dans le namespace du composant associé.-
7
* -Implémenter FileManager::GetEntriesResult-
8
* -Implémenter FileManager::getHashes et trouver une solution simple pour le callback-
9
* -Créer un maximum de tests les plus unitaires possibles en commençant d'abord par les plus simples puis en compliquant avec des accès concurrents, simuler des downloads et uploads. Finir par un test qui fait n'importe quoi de manière aléatoire. Éventuellement tester la monté en charge.-
10
* Add parameter to FileManager::Builder::newFileManager(..) to tell where are located the file cache.
11
* Réaliser un diagramme des appels à partir des threads, essayer au maximum de simplifier tout le bordel (regrouper des mutex, par exemple). Attention aux accès concurrents depuis les downloaders/uploader/main loop/fileupdate durant un scan/restoring/hashing, etc...
12
* Attention au restoring pendant la suppression (ou l'accès) d'un sharedirectory!
13
* Attention à la class Common::Hash qui n'est pas thread safe
14
* -Modification of the 'GetHashes' message : The result ('GetHashesResult') can be fragmented to send a subset of hashes...-
15
* -Add a 'Settings' directory to the core containing classes to get and set settings like _nick_, _logPath_, etc...-
16
* Take care about all error during IO operations in FileManager
17
* Add a periodic rescan for unwatchable directory, for example mounted netword cannot be watched
18
* -Permettre de lancer plusieurs core (chercher un port libre, le port est donnée dans le IMAlive)-
19
20
h2. Notes
21
22
* Regarder du coté de http://flattr.com/ pour la rémuneration
23
24
* Regarder du coté de qTorrent pour voir comment sont packagé les dll de Qt : http://qbittorrent.sourceforge.net/
25
26
27
* How a user can choose a shared directory when the core is remote ? The choose dialog must show the remote file structure !? See here : http://doc.trolltech.com/4.5/qfiledialog.html#setProxyModel
28
29
* Stocker les hashes dans plusieurs fichiers, un par volume. Cela permet de gérer le cas où une periphérique est déconnecté puis reconnecté, dans ce cas on ne supprime pas le fichier de hash.
30
** Plus simple encore : un fichier par partage, les fichiers ne sont jamais supprimés.
31
32
* Serveur d'intégration, tâches quotidiennes (dans l'ordre) :
33
* Création d'un dossier d nommé avec la date courante
34
* Pull du repo d'integration depuis le repo de reference
35
* Génération de la doc (doxygen)
36
* Compilation de tous les composants (+ tests) en debug et en release -> rapport 'compilation.log' dans d
37
* Execution des tests de chaque composants -> rapport 'tests.log' dans d
38
* Réalisation de versions d'installation : debug + release -> rapport 'install.log' + les installs (.deb, install.exe) dans d
39
* Pouvoir afficher les rapports dans redmine ?
40
41
42
* Pouvoir changer de langue à la volé dans les options. La langue par défaut est définit à l'installation.
43
44
45
* Prendre en compte le 64 bits ? Idéalement il faudrait que l'installeur inclut les deux versions et choisisse à l'installation en fonction de la plateforme courante.
46
47
48
* Mettre à jour protobuf et l'utiliser comme dll (comportement par défaut à partir de la 2.3
49
50
51
* Faire attention au erreur d'allocation throwé par new, les catcher (std::bad_alloc). Est-ce que cette exception peut être lancé depuis Qt ? (par exemple lors de l'insertion d'un élément dans un tableau). Est-ce vraiment utile ?
52
53
54
* Les dossiers de destination (read write) sont choisit dans l'ordre lors de l'écriture. Il faut que l'utilisateur puisse choisir cet ordre.
55
* Voir ici pour une solution qui permette de savoir l'espace restant sur le disque : http://lists.trolltech.com/qt-interest/2004-11/thread00873-0.html
56
* Faire attention aux dossiers qui se trouvent dans un dossier partagés et qui sont des volumes montés
57
58
59
* Utilisation de splice pour les transferts ? : 
60
61
Linux : http://www.kernel.org/doc/man-pages/online/pages/man2/splice.2.html
62
Windows : http://msdn.microsoft.com/en-us/library/ms740565%28VS.85%29.aspx
63
Déroulement :
64
1) peerManager ~> uploadManager.newUpload(socket)
65
2) upload -> fileManager.getChunk(hash).sendChunkToSocket(offset, socket)
66
67
    * Pour protéger le cache de fichier un QReadWriteLock pourrait être pas mal :
68
    * Lors de la mise à jour un lock de type write est posé
69
    * Lors d'une recherche c'est un lock de type read qui est utilsé.
70
71
Cela peut permettre de faire plusieurs recherches simultanéments.
72
73
* Il faut prévoir de pouvoir modifier dynamiquement le nombre de 'chunk downloader' (via des settings)
74
75
76
* Les chunk downloader ne trouvant rien à downloader doivent attendre de manière PASSIVE!
77
78
79
* Réflechir à l'utilisation de Powershell pour le pilotage d'ordis à distance lors des tests.
80
81
82
* Utilisation d'un QMainWindow avec le log et la liste des peers comme panel.
83
* Eventuellement utiliser le mode MDI
84
85
86
* Il n'y a actuellement aucune manière de déplacer les downloads via le client graphique (voir le protocol core<->gui), compléter le protocole et beaucoup réflechir ;)
87
88
89
* Afficher un splash screen pour la version beta publique du type : "Attention, Ceci est une version BETA, à n'utiliser qu'à des fin de tests!
90
91
ute anomalie peut être reporté ici : <redmine>"
92
93
* Voir le numéro du thread dans l'entrée d'un log
94
* Logger toutes les prises de lock, les attentes, la création et la descruction des threads, etc..
95
* Les logs vont dans un dossier définit dans les settings ou dans un repertoire temporaire si pas spécifié
96
97
98
* Se poser la question sur l'utilisation de QObject comme parent pour la plus part des objets. (arbre d'objets avec désallocation automatique).
99
100
101
* Le LogManager propose une interface 'ILoggable' permettant de logger des objets.
102
103
104
* Concernant l'i18n :
105
* Choisir à l'installation, présélectionner en fonction de la langue du système
106
* La langue est stocké dans un fichier de paramètre (dossier utilisateur ou base de registre)
107
* Tous les fichiers de langue compilés sont installé
108
* Un fois installé, dans les paramètres du logiciel il est possible de switcher dynamiquement de langue.
109
110
111
* Utiliser des Exceptions pour signaler si un objet (partagé entre plusieurs threads) a été supprimé. Par exemple un Fichier (IFile) peut avoir été supprimé par IFileManager alors que IDownloadManager possède toujours une référence dessus. Dans ce cas le prochain appel à IFile par IDownloadManager va lever une exception, celle-ci est attrapée et l'objet est enlevé de la liste. Comme l'on utilise des smart pointers, le dernier à enlever le fichier de la liste va effectivement le désallouer.
112
113
114
* La vitesse de hashage d'un ensemble de fichiers DOIT être plus rapide que celle de DC++ (pas forcément moins économe en CPU). Utilisation de plusieurs threads si plusieurs disques durs.
115
* ça va être difficile car on utilise sha-1 qui demande plus d'effort à calculé que Tiger-Hash
116
* Un thread par partage ?
117
118
119
* Bien penser la sécurité notamment au niveau d'attaque par flood ou d'usurpation d'id, réaliser un ban d'IP si nécessaire.
120
121
crire ici toutes les possibilités d'attaque : http://dev.euphorik.ch/wiki/pmp/Security
122
123
* Créer un système d'envoie de rapport d'erreur automatique incluant le log et le message d'erreur ainsi qu'un maximum d'autres infos (hardware, software?). Post sur HTTP ?
124
125
tention aux données personnelles)
126
127
* Passer en revu les bugs de DC++ pour éviter de refaire les mêmes erreurs :) : https://bugs.launchpad.net/dcplusplus/+bugs
128
* Ainsi que les problèmes décrits dans la FAQ : https://answers.launchpad.net/dcplusplus/+faqs
129
130
131
* Mettre en place une team de développement 'Ek dev Team'
132
133
134
* Utiliser les notifications de Win7 (pour le Core). Voir si Qt fournit une abstraction.
135
136
137
* Utilisation de gitorious : http://gitorious.org/ conjointement avec redmine
138
139
140
* Recherche de phrases tel que "I have a dog", utilisation de guillemets comme pour google :
141
142
1) chercher le noeud correspond à chaque mots "i", "have", "a", "dog"
143
2) prendre le noeud ayant le moins d'élément
144
3) tester la phrase avec chaque élément du noeud
145
146
* Voir cette page pour des algos de recherche dans des chaines : http://en.wikipedia.org/wiki/String_searching_algorithm
147
148
149
* Voir cette page pour de l'allocation par block (pool) : http://www.flipcode.com/archives/Fast_Allocation_Pool.shtml
150
151
-> A été essayé sans grande différence sur le word index
152
153
* Pourquoi ne pas identifier un chunk via le hash du fichier entier + un numéro ??? Cela permettrai de diminumer la quantité de mémoire dédier à stocker les hashes des chunks
154
* Avantages d'avoir plusieurs hash par fichier :
155
* Un download peut démarrer sans identifer tout le fichier
156
* Lors de la demande des hashes ('GetHashes') d'un fichier qui n'est pas hashé, les hashes peuvent être envoyés graduellement.
157
158
159
* Réaliser des tests de mise en veille de l'ordinateur
160
161
162
* Chat - Rooms
163
** La liste des rooms est listés en dessous de la liste des peers. Un textbox suivit d'un bouton 'join' se trouve just au dessus, il permet d'entrer le nom d'une room et de la rejoindre, si la room existe déjà on la rejoint sinon elle est créé. Il est possible de sélectionner une room existante, son nom s'inscrit alors dans la text box. En double cliquant sur une room existante on la rejoint automatiquement.
164
** Les rooms sont listées par ordre alphabétique et le nombre de participant est indiqué
165
** Lorsque que l'utilisateur joint une room un nouvelle fenêtre lui étant dédié s'affiche. Cette fenêtre montre sur le coté les personnes présente dans la room.
166
** Lors de la création d'une room, un hash généré aléatoirement lui est associé. La room est alors mise dans les rooms connues et l'utilisateur est définit comme faisant partie de la room.
167
** Les rooms dans lesquels on se trouve sont envoyées périodiquement via le message 'IMAlive'.
168
** Lorsqu'une room est vide, plus personne ne la liste dans le message 'IMAlive', elle disparait alors naturellement.
169
** Lorsqu'un message est envoyé dans une room, un datagrame UDP est envoyé à chaque personne de la room
170
171
* Chat - Private Rooms
172
** Les private rooms ne sont joignable que sur invitation
173
** Elles ne sont pas envoyé dans le message 'IMAlive'.
174
** L'envoie d'un message se fait de la même manière qu'une roome publique
175
** Pour inviter une personne on lui envoie simplement le nom de la room, son id et les participants, il peut décliner
176
** S'il accepte il le s'annonce auprès de tous les participants
177
** Une personne peut quitter une room, il le signale aux participants.
178
*** Une private room peut-être transformé en public room mais pas l'inverse
179
180
* Chat - privé entre deux personnes
181
** Une personne peut initier un dialogue privé avec une autre personne de la liste via le menu contextuel
182
** Dans ce cas une private room est créé entre les deux personnes
183
** D'autres personne peuvent être inviter à joindre la discussion
184
185
* Est-ce que Common::Hash doit être "thread-safe" ? (macro à activer)
186
187
* En même temps que la première release, publier une documentation sur le protocole utilisé dans redmine.
188
189
* Packaging
190
* Slogan : "For Great Justice!"
191
* Logo : un vaisseau spatial (remake du vaisseau dans Zero wings) suivit du texte AYBABTU écrit de manière futuristique (et penché^^)
192
* (mieux) Ou une tentacule stylisé en référence aux monstres du jeu. La tentacule pourrait encercler un fichier en rapport aux 'byte'
193
* Couleur : noir, rouge et bleu (voir le site 'coming soon')
194
* Style oldschool
195
* Features :
196
* No configuration needed, just launch and download
197
* Very low ressource usage : you can play a game and download in the same time
198
* Le site web : ultra minimaliste (utilisé si possible http://snapframework.com/ ) comprenant :
199
** Page 'Home'
200
** Une mini description
201
** Un gros bouton download
202
** Un screenshot
203
** Page 'In depth'
204
** Une liste de fonctionnalité
205
** Description détaillée des processus (cas utilisateur)
206
** Plusieurs screenshots
207
** Page 'FAQ'
208
** Page 'Development'
209
** Un lien vers le forum de Redmine
210
** Un lien vers la room Jabber
211
** Un lien vers la page pour soumettre un nouveau bug/demande
212
* Faut-il mettre des news ? On peut utiliser celles dans Redmine, voir même directement les afficher sur la page principale
213
* Statistiques importantes à connaitres :
214
* Le nombre d'ip différente visitant chaque page par tranche d'heure
215
* Un compteur du nombre de download par tranche d'heure (par ip et le download doit être complet)
216
* Une moyenne établie par tranche d'heure sur le débit du download, permet de savoir s'il faut augmenter la bande passante
217
* Mettre en place un tracker torrent et encourager son utilisation
218
* Utiliser un site spécialisé dans le streaming de fichiers : http://put.io
219
* Pour la beta, permettre de la télécharger depuis le site web à l'aide d'un code à entrer.
220
* Poster plusieurs codes différents sur plusieurs forums différents
221
* Aller crescendo dans la distrubution des codes, d'abord aux particuliers puis sur les forums, marquer à chaque fois la date et l'heure de la diffusion
222
* Mémoriser chaque download : {date+time, ip, code}
223
* La page de la beta contient simplement une petite description
224
* Avertir que ce n'est qu'une beta, qu'elle peut contenir des erreurs...
225
* Faire attention aux attaques par brute force
226
227
228
* Problème subtile au sujet des dossiers partagé en sortie (read/write) :
229
* Deux dossiers partagés a et b
230
* un ensemble de dossiers/sous-dossiers sont téléchargés et vont dans a
231
* a n'a plus de place
232
* b est donc choisit comme destination, les dossiers/sous-dossiers sont alors recréé à double, il appartiendra à l'utilisateur de merger ces deux dossiers
233
* Dans un cas très dégénéré un ensemble de dossiers/sous-dossiers peuvent être éclaté sur n partage
234
* Solution actuelle : l'utilisateur se démerde ;) 
235 2 Greg Burri
236
* Lors du lancement permettre au GUI de récupérer les n derniers message (chat) :
237
** Un datagramme multicast est envoyé, "GET_NB_CHAT_MESS_KNOWN"
238
** Un datagramme unicast est retourné : "NB_CHAT_MESS_KNOWN" avec le nombre de message connu
239
** Une connexion TCP est ouverte  vers le peer avec un nombre de messages connu suffisant et les derniers messages lui sont demandé.
240
** Chat message doit être tagé avec un ID pour éviter d'insérer des messages à double