add EDminiV2 authors
[rmll_2011.git] / slides.html
1 <!DOCTYPE html>
2
3 <meta charset="utf-8">
4 <title>lacie-nas.org RMLL 2011</title>
5
6 <!-- Your Slides -->
7 <!-- One section is one slide -->
8
9 <section class=title>
10     <!-- This is the first slide -->
11     <h1>lacie-nas.org</h1>
12     <footer>by Simon and Thomas <a href="http://lacie-nas.org">@lacie-nas.org</a></footer>
13 </section>
14
15 <section class=chapter>
16     <h1>What is a NAS ?</h1>
17 </section>
18 <section>
19     <h1>What is a NAS ?</h1>
20     <h2>A kind of desktop</h2>
21     <ul>
22         <li>without monitor
23         <li>without keyboard
24         <li>like a server in a tiny package
25     </ul>
26 </section>
27 <section>
28     <h1>What is a NAS ?</h1>
29     <h2>A remote storage</h2>
30     <ul>
31         <li>available through network protocols
32             <p>(NFS, Samba, Netatalk, DLNA, etc)
33         <li>additional services more or less useful
34             <p>(BitTorrent, web hosting, etc)
35     </ul>
36 </section>
37 <section>
38     <h1>What is a NAS ?</h1>
39     <h2>Cool devices for hardware user interface</h2>
40     <h2>(instead of keyboard / monitor)</h2>
41     <ul>
42         <li>buttons
43         <li>LEDs
44         <li>LCD
45     </ul>
46 </section>
47 <section>
48     <h1>What is a NAS ?</h1>
49     <h2>Various architectures</h2>
50     <ul>
51         <li>ARM
52         <li>MIPS
53         <li>PPC
54         <li>x86 more recently
55     </ul>
56 </section>
57 <section>
58     <h1>What is a NAS ?</h1>
59     <h2>Low cost</h2>
60     <ul>
61         <li>cheap hardware
62         <li>low power consumption
63         <li>firmwares are largely based on free software
64     </ul>
65 </section>
66
67 <section class=chapter>
68     <h1>Project Overview</h1>
69 </section>
70
71 <section>
72     <h2>Origins</h2>
73     <ul>
74         <li>lacie.com: non free hardware
75         <li>until 2009, no mainline support
76         <li>except for EDmini v2 (2008 Linux patch)
77             <p>by hobbyists: Albert Aribaud and Christopher Moore
78             <p>signed off by Marvell guys: Lennert Buytenhek and Nicolas Pitre
79         <li>discussions patch authors
80         <li>a framework was needed...
81     </ul>
82 </section>
83
84 <section>
85     <h2>What is not lacie-nas.org ?</h2>
86     <ul>
87         <li>after sales service for LaCie
88         <li>hack host for LaCie firmwares
89     </ul>
90 </section>
91
92 <section class=chapter>
93     <h1>Projects and targets</h1>
94 </section>
95
96 <section>
97     <h2>Open/unlock hardware</h2>
98     <p>Provide boards specifications and pineout (JTAG, serial, GPIOS, etc...)</p>
99 </section>
100
101 <section>
102     <h2>Provide mainline support</h2>
103     <ul>
104         <li>openocd
105         <li>U-Boot
106         <li>Linux
107     </ul>
108 </section>
109
110 <section>
111     <h2>Provide NAS system tools</h2>
112     <p>Develop embedded generic modules for NASes:</p>
113     <ul>
114         <li>buttons: input_eventd
115         <li>GPIO LEDs: led_ctrl
116         <li>disk by slot: sd_alias
117         <li>GPIO debug: gpio_ctrl
118         <li>TODO: disk spin down utility
119         <li>TODO: FANs and hardware sensors (lm_sensor ?)
120         <li>TODO: provide a GNU/Debian package
121     </ul>
122 </section>
123
124 <section>
125     <h2>Provide development services</h2>
126     <ul>
127         <li><a href="http://lacie-nas.org">wiki</a>
128         <li><a href="http://git.lacie-nas.org">git repositories</a>
129         <li><a href="http://sequanux.org/cgi-bin/mailman/listinfo/lacie-nas">Mailing List</a>
130         <li>IRC channel <a href="irc://irc.freenode.net/lacie-nas">#lacie-nas</a> @freenode.net
131         <li><a href="ftp://lacie-nas.org/">ftp</a>
132     </ul>
133 </section>
134
135 <section>
136     <h2>Provide development/hacking tools</h2>
137     <ul>
138         <li><a href="http://lacie-nas.org/doku.php?id=clunc">clunc</a> (Client for LaCie U-Boot NetConsole)
139         <li><a href="http://git.lacie-nas.org/?p=miniroot.git;a=summary">miniroot</a>
140     </ul>
141 </section>
142
143 <section>
144     <h2>Roadmap</h2>
145     <q>No roadmap, no deadlines, but rather tasks and priorities</q>
146 </section>
147
148 <section class=chapter>
149     <h1>Free a NS2 demo !</h1>
150 </section>
151
152 <section>
153     <h2>Take board control with clunc</h2>
154 </section>
155
156 <section>
157     <h2>Install U-boot mainline</h2>
158 </section>
159
160 <section>
161     <h2>Startup an installation kernel+initramfs</h2>
162 </section>
163
164 <section>
165     <h2>Install GNU/Debian ARM</h2>
166 </section>
167
168 <section>
169     <h2>Use SSH and connect to the NS2 :)</h2>
170 </section>
171
172 <section class=chapter>
173     <h1>Perspectives</h1>
174 </section>
175
176 <section>
177     <h2>Network installation</h2>
178 </section>
179
180 <section>
181     <h2>Device Tree early adopter</h2>
182 </section>
183
184 <section>
185     <h2>Free distribution for NASes</h2>
186 </section>
187
188 <section class=chapter>
189     <h1>Questions ?</h1>
190 </section>
191
192 <section class=chapter>
193     <h1>Thanks</h1>
194 </section>
195
196 <!-- Your Style -->
197 <!-- Define the style of you presentation -->
198
199 <!-- Maybe a font from http://www.google.com/webfonts ? -->
200 <!-- link href='http://fonts.googleapis.com/css?family=Oswald' rel='stylesheet'-->
201 <style>
202   html { background-color: black; }
203   a { color: #FF0066; } a:hover {text-decoration: underline;}
204   footer { position: absolute; bottom: 50px; right: 50px; }
205   strong {color: #FF0066}
206   body {
207       font-family: 'Oswald', arial, serif;
208       background-color: white;
209       color: white;
210       font-size: 2em;
211       background: #1C1C1C;
212       background-image: -moz-radial-gradient(center 45deg, #333 0%, #1C1C1C 50%);
213       background-image: -moz-radial-gradient(center 45deg, #333 0%, #1C1C1C 50%);
214   }
215
216   note { display: none; }
217
218   /* Transition effect */
219   section {
220       -moz-transition: left 400ms linear 0s;
221       -webkit-transition: left 400ms linear 0s;
222       -o-transition: left 400ms linear 0s;
223       -ms-transition: left 400ms linear 0s;
224       transition: left 400ms linear 0s;
225   }
226   section { left: -150%; }
227   section[aria-selected] { left: 0; }
228   section[aria-selected] ~ section { left: +150% }
229
230   .title { background-color: black; }
231   .title h1 {
232       vertical-align: middle; margin: 0; text-align: center; display: block;
233       line-height: 400px;
234       font-size: 70px;
235   }
236
237   .chapter { background-color: black;}
238   .chapter h1 {
239       font-size: 50px;
240       line-height: 600px;
241       vertical-align: middle; margin: 0; text-align: center; display: block
242   }
243
244   h1 {
245       margin: 10px;
246       text-align: left;
247       font-size: 25px;
248       text-shadow: 0px -1px 0px #000;
249   }
250   h2 {
251       color: #FAE50B;
252       margin: 70px 0 0 0;
253       font-size: 40px;
254       text-align: center;
255   }
256   ul {
257       margin-top: 70px;
258       font-size: 35px;
259       text-align: left;
260       border-left: 4px solid white;
261       padding-left: 40px;
262       min-width: 310px;
263       margin-left: 50px;
264       display: inline-block;
265   }
266   li {
267       margin-top: 10px;
268   }
269   ul > li:first-child {
270       margin-top: 0;
271   }
272   q, p {
273       margin: 50px auto 0 auto;
274       text-align: left;
275       margin-left: 50px;
276   }
277   q:after {content: ""}
278   q:before {content: ""}
279   q {
280       display: block;
281       margin-top: 140px;
282   }
283   li p {
284       margin-top: 0;
285       font-size: 20px;
286       font-style: italic;
287   }
288   video {
289       position: absolute;
290       top: 210px;
291       width: 260px;
292       left: 445px;
293       box-shadow: 0 0 10px black;
294   }
295   #arrow {
296       position: absolute;
297       top: 165px;
298       left: 460px;
299       font-size: 100px;
300       color: white;
301
302   }
303   li {list-style-type: none}
304
305 </style>
306
307 <!-- {{{{ *****************  DZSlides CORE 2.0b1 *************************** -->
308 <!-- *********************************************************************** -->
309 <!-- *********************************************************************** -->
310 <!-- *********************************************************************** -->
311 <!-- *********************************************************************** -->
312
313 <!-- This block of code is not supposed to be edited, but if you want to change the behavior of the slides, feel free to hack it ;) -->
314
315 <!-- Default Style -->
316 <style>
317   * { margin: 0; padding: 0; }
318   details {display: none;}
319   body {
320     width: 800px; height: 600px;
321     margin-left: -400px; margin-top: -300px;
322     position: absolute; top: 50%; left: 50%;
323     overflow: hidden;
324   }
325   section {
326     position: absolute;
327     pointer-events: none;
328     width: 100%; height: 100%;
329   }
330   section[aria-selected] { pointer-events: auto;}
331   body {display: none}
332   body.loaded {display: block}
333 </style>
334
335 <script>
336   var friendWindows = [];
337   var idx = 1;
338   var slides;
339
340   /* main() */
341
342   window.onload = function() {
343     slides = document.querySelectorAll("body > section");
344     onhashchange();
345     setSlide();
346     document.body.className = "loaded";
347     onresize();
348   }
349
350   /* Handle keys */
351
352   window.onkeydown = function(e) {
353     // Don't intercept keyboard shortcuts
354     if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
355       return;
356     }
357     if ( e.keyCode == 37 // left arrow
358       || e.keyCode == 33 // page up
359     ) {
360       e.preventDefault();
361       back();
362     }
363     if ( e.keyCode == 39 // right arrow
364       || e.keyCode == 34 // page down
365     ) {
366       e.preventDefault();
367       forward();
368     }
369
370     if ( e.keyCode == 32) { // space
371         e.preventDefault();
372         toggleContent();
373     }
374   }
375
376   /* Adapt the size of the slides to the window */
377
378   window.onresize = function() {
379     var sx = document.body.clientWidth / window.innerWidth;
380     var sy = document.body.clientHeight / window.innerHeight;
381     var transform = "scale(" + (1/Math.max(sx, sy)) + ")";
382     document.body.style.MozTransform = transform;
383     document.body.style.WebkitTransform = transform;
384     document.body.style.OTransform = transform;
385     document.body.style.msTransform = transform;
386     document.body.style.transform = transform;
387   }
388   function getDetails(idx) {
389     var s = document.querySelector("section:nth-of-type("+ idx +")");
390     var d = s.querySelector("details");
391     return d?d.innerHTML:"";
392   }
393   window.onmessage = function(e) {
394     msg = e.data;
395     win = e.source;
396     if (msg === "register") {
397       friendWindows.push(win);
398       win.postMessage(JSON.stringify({method: "registered", title: document.title, count: slides.length}), document.location);
399       win.postMessage(JSON.stringify({method: "newslide", details: getDetails(idx), idx: idx}), document.location);
400       return;
401     }
402     if (msg === "back") back();
403     if (msg === "forward") forward();
404     if (msg === "toggleContent") toggleContent();
405     // setSlide(42)
406     var r = /setSlide\((\d+)\)/.exec(msg);
407     if (r) {
408         idx = r[1];
409         setSlide();
410     }
411   }
412
413   /* If a Video is present in this new slide, play it.
414      If a Video is present in the previous slide, stop it. */
415
416   function toggleContent() {
417     var s = document.querySelector("section[aria-selected]");
418     if (s) {
419         var video = s.querySelector("video");
420         if (video) {
421             if (video.ended || video.paused) {
422                 video.play();
423             } else {
424                 video.pause();
425             }
426         }
427     }
428   }
429
430   /* If the user change the slide number in the URL bar, jump
431      to this slide. */
432
433   window.onhashchange = function(e) {
434     var newidx = ~~window.location.hash.split("#")[1];
435     if (!newidx) newidx = 1;
436     if (newidx == idx) return;
437     idx = newidx;
438     setSlide();
439   }
440
441   /* Slide controls */
442
443   function back() {
444     if (idx == 1) return;
445     idx--;
446     setSlide();
447   }
448   function forward() {
449     if (idx >= slides.length) return;
450     idx++;
451     setSlide();
452   }
453   function setSlide() {
454     var old = document.querySelector("section[aria-selected]");
455     var next = document.querySelector("section:nth-of-type("+ idx +")");
456     if (old) {
457       old.removeAttribute("aria-selected");
458       var video = old.querySelector("video");
459       if (video) { video.pause(); }
460     }
461     if (next) {
462       next.setAttribute("aria-selected", "true");
463       var video = next.querySelector("video");
464       if (video) { video.play(); }
465     } else {
466       console.warn("No such slide: " + idx);
467       idx = 0;
468       for (var i = 0; i < slides.length; i++) {
469           if (slides[i].hasAttribute("aria-selected")) {
470               idx = i + 1;
471           }
472       }
473     }
474     window.location.hash = idx;
475     for (var i = 0; i < friendWindows.length; i++) {
476         friendWindows[i].postMessage(JSON.stringify({method: "newslide", details: getDetails(idx), idx: idx}), document.location);
477     }
478   }
479 </script>
480 <!-- vim: set fdm=marker: }}} -->