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