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