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