579 lines
20 KiB
HTML
579 lines
20 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="utf-8">
|
|
|
|
<title>Libre-Mesh</title>
|
|
|
|
<meta name="description" content="Ninux/Libre-Mesh presentation at Balccon 2017">
|
|
<meta name="author" content="Cristina Carnevali" >
|
|
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
|
|
|
<link rel="stylesheet" href="css/reveal.min.css">
|
|
<link rel="stylesheet" href="css/theme/cri.css" id="theme">
|
|
|
|
<!-- For syntax highlighting -->
|
|
<link rel="stylesheet" href="lib/css/zenburn.css">
|
|
|
|
<!-- If the query includes 'print-pdf', include the PDF print sheet -->
|
|
<script>
|
|
if( window.location.search.match( /print-pdf/gi ) ) {
|
|
var link = document.createElement( 'link' );
|
|
link.rel = 'stylesheet';
|
|
link.type = 'text/css';
|
|
link.href = 'css/print/pdf.css';
|
|
document.getElementsByTagName( 'head' )[0].appendChild( link );
|
|
}
|
|
</script>
|
|
<!--style>img{height:40vw !important;min-width:auto !important; width:auto !important;}</style-->
|
|
<!--[if lt IE 9]>
|
|
<script src="lib/js/html5shiv.js"></script>
|
|
<![endif]-->
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div class="reveal">
|
|
|
|
<!-- Any section element inside of this container is displayed as a slide -->
|
|
<div class="slides">
|
|
<section>
|
|
<h1>Ninux</h1>
|
|
<h3>Wireless Community Network</h3>
|
|
<p>
|
|
<small>Ignifugo (<a href="http://wiki.bologna.ninux.org">NinuxBO</a>).</small>
|
|
</p>
|
|
<p>
|
|
<small>Novi Sad 2017 - BalcCon</small>
|
|
</p>
|
|
<p>
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
|
|
<h2>Who I'm?</h2>
|
|
<p>Italian frontend developer envolved in Hackmeeting comunity and contributor of some projects...</p>
|
|
</section>
|
|
<section>
|
|
|
|
<h2>One of these is..</h2>
|
|
|
|
|
|
<p class="fragment">Farmers organization with the aim of alimentary indipendent</p>
|
|
<img src="img/campiaperti.jpg"/>
|
|
</section>
|
|
<section>
|
|
|
|
<p>So I went live in the countryside!</p>
|
|
|
|
<img src="img/zoom_bolognaNinux.png"/>
|
|
</section>
|
|
|
|
<section>
|
|
|
|
<p>So I went live in the countryside!</p>
|
|
|
|
<img src="img/casaportico.jpg"/>
|
|
</section>
|
|
<section>
|
|
|
|
<p>So I went live in the countryside!</p>
|
|
|
|
<img src="img/castello_da _cabat.jpg"/>
|
|
</section>
|
|
|
|
|
|
<section>
|
|
|
|
<h2>So I went live in <br/>the countryside!</h2>
|
|
|
|
<p class="fragment">waste more money calling by telephone</p>
|
|
<p class="fragment">internet is super slower because you are not commercial interesting for ISP</p>
|
|
<p class="fragment">comunication are super important because you are out of the city</p>
|
|
<p class="fragment">your comunications are a lots with the folks that lives near (+o-) you</p>
|
|
</section>
|
|
|
|
<section>
|
|
<!-- Nuova diapo --> <section data-background="img/network.jpg" style="background: rgba(255,255,255,0.9);">
|
|
<h2><span style="color:black;">Building a different net</span></h2>
|
|
</section>
|
|
<section >
|
|
<h2>The other way: </h2><p> build a grassroot network ourself</p>
|
|
<img style="border:0px" width="700" src="img/ninux.png" alt="ninux">
|
|
|
|
|
|
</section>
|
|
|
|
<!--section data-markdown>
|
|
<script type="text/template">
|
|
<h2>Storia di Ninux</h2>
|
|
<ol>
|
|
<li value="2002">Nino fonda Ninux a Roma: desiderio di sperimentare</li>
|
|
<li value="2005-2009">sperimentazione servizio internet per le famiglie e spazi sociali</li>
|
|
<li value="2010">La rete parte anche a Pisa e a cascata in [altre città](http://map.ninux.org)</li>
|
|
<li value="2013">NinuxRoma [entra davvero](http://www.namex.it/en/who/members) a far parte di internet
|
|
<li value="2014">Nasce pure Ninux Verona</li>
|
|
</ol>
|
|
</script>
|
|
</section-->
|
|
|
|
<section><img src="img/mappa_Italia.png"></section>
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>Why?</h2>
|
|
<ul>
|
|
|
|
<li style="margin: 3px 0;" class="fragment">Performances
|
|
<ul style="list-style-type: none;"><li style="font-size: smaller;">Fast connection with your friend!</li></ul></li>
|
|
<li style="margin: 3px 0;" class="fragment">Hacktivism
|
|
<ul style="list-style-type: none;"><li style="font-size: smaller; line-height: 1;">Censurless, network neutrality, decentralized services and infrastructure.</li></ul></li>
|
|
<li style="margin: 3px 0;" class="fragment">Privacy
|
|
<ul style="list-style-type: none;"><li style="font-size: smaller;">indipendent managment of infrastructure and services, software open-source... and soon hardware!</li></ul></li>
|
|
<li style="margin: 3px 0;" class="fragment">Resilient
|
|
<ul style="list-style-type: none;"><li style="font-size: smaller;">to have a network that can resist to catastrophes.</li></ul></li>
|
|
<li style="margin: 3px 0;" class="fragment">Again digital divide.
|
|
<ul style="list-style-type: none;"><li style="font-size: smaller;">bring the net where you want!</li></ul></li>
|
|
</ul>
|
|
</section>
|
|
<section >
|
|
<h2>Why? (2)</h2>
|
|
|
|
<ul>
|
|
<li style="margin: 3px 0;" class="fragment">More modular and flexible network</li>
|
|
<li style="margin: 3px 0;" class="fragment">Share competence/knowledge</li>
|
|
<li style="margin: 3px 0;" class="fragment">Less commercial, more comunity</li>
|
|
<li style="margin: 3px 0;" class="fragment">DIY
|
|
<li style="margin: 3px 0;" class="fragment">Tech indipendence</li>
|
|
</ul>
|
|
|
|
|
|
</section>
|
|
|
|
<section>
|
|
<h3> Pico Peering Agreement</h3>
|
|
<p style="font-size: smaller"> 1. Free Transit: </br>
|
|
|
|
The owner agrees to provide free transit accross their free network.
|
|
The owner agrees not to modify or interfere with data as it passes through their free network.
|
|
</br>
|
|
|
|
2. Open Communication:
|
|
</br>
|
|
|
|
The owner agrees to publish the information necessary for peering to take place
|
|
This information shall be published under a free licence
|
|
The owner agrees to be contactable and will provide at least an email adress
|
|
</br>
|
|
|
|
3. No Warranty:
|
|
</br>
|
|
|
|
There is no guaranteed level of service
|
|
The service is provided "as is", with no warranty or liability of whatsoever kind
|
|
The service can be scaled back or withdrawn at any time with no notice
|
|
</br>
|
|
|
|
4. Terms of Use:
|
|
</br>
|
|
|
|
The owner is entitled to formulate an 'acceptable use policy'
|
|
This may or may not contain information about additional services provided (apart from basic access)
|
|
The owner is free to formulate this policy as long as it does not contradict points 1 to 3 of this agreement (see point 5)
|
|
</br> 5. Local Amendments:
|
|
</br>(to be filled in ad-hoc by the node owner as this document is implemented)
|
|
|
|
|
|
</p>
|
|
</section>
|
|
</section>
|
|
|
|
|
|
<section>
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>Which services I find in Ninux?</h2>
|
|
<p class="fragment">Nothing!</p>
|
|
<div class="fragment"><p>The aim of the community is build the infrastructure, but person by person have to decide what share, what need and what want find there.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>Which services I find in Ninux?</h2>
|
|
<p>Example:</p>
|
|
<div class="fragment">
|
|
<ul>
|
|
<li>Cloud, files sharing, archives, backups;</li>
|
|
<li>Videogames servers;</li>
|
|
<li>Platform for swap things, vegetables or carsharing;</li>
|
|
<li>Local platform of cryptovalue;</li>
|
|
<li>Audio and video Streaming;</li>
|
|
<li>VoIP calls, email, chat, videoconference software;</li>
|
|
<li>Social network and tools for collaborative projects;</li>
|
|
<li>Internet connection (IF...);</li>
|
|
<li>...what you can think and build!</li>
|
|
</ul>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>So.. there is the <br/> internet connection or not?</h2>
|
|
<p>The aim of Ninux <b><u><i>ISN'T</i></u></b> give Internet access, but build a grassroot network, ANOTHER INTERNET, really decentralized in hardware, software and power. You can find internet connection only if:</p>
|
|
<ul><li style="margin: 5px 0;" class="fragment">IF someone share the ADSL,</li>
|
|
<li style="margin: 5px 0;" class="fragment">IF somebodies organize them self to buy bandwith,</li>
|
|
<li style="margin: 5px 0;" class="fragment">IF some organization become a peer provider, ex: Ninux Roma is a Neutral Access Point!</li>
|
|
<!--li style="margin: 5px 0;" class="fragment">se usiamo IPv6: ogni partecipante può gestire una sottorete di IPv6 pubblici</li--></ul>
|
|
|
|
</section>
|
|
|
|
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>And this is legal in Italy?</h2>
|
|
<p>Yes!</p><p>from the 2012, see: <a href="http://ninux.org/LeggiWireless">http://ninux.org/LawsAboutWireless</a></p>
|
|
<br /><br />
|
|
<h2>But these waves could be dangerous?</h2>
|
|
<p>It's really lesser and lesser power of cellular phones <br /> and stay in the roof, not in your pockets or near your head.</p>
|
|
</section>
|
|
</section>
|
|
|
|
|
|
<section>
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>Ok, how to do?</h2>
|
|
<div class="fragment"><p>There are groups of Ninux that help newbies teaching the fondamental...</p>
|
|
<img width="70%" src="img/ninuxday.jpg" alt="Formazione"></div>
|
|
</section>
|
|
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>yep, but how to do?</h2>
|
|
<p>... and hands on, help the people on the roof!</p>
|
|
<img height="100%" src="img/eigennet-montaggio-exfausto2.jpg" alt="Cooperazione">
|
|
</section>
|
|
</section>
|
|
|
|
<section>
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>Ok, ok, but the hardware?</h2>
|
|
<div class="fragment"><p>Wireless bridge on free frequencies.
|
|
We join far houses using router wireless for outdoor.</p>
|
|
<img width="1000" src="img/ap-laptop-community.jpg"></div>
|
|
</section>
|
|
<section>
|
|
<p>Less or more you need these things:</p>
|
|
<div class="fragment"><p>twice</p></div>
|
|
<img height="100%" src="img/things.jpg">
|
|
</section>
|
|
|
|
|
|
<!-- Nuova diapo --> <section>
|
|
<p>1.A)See the place:</p>
|
|
|
|
<img src="img/castello_samoggia_visto_da_cabat.jpg" alt="">
|
|
</section>
|
|
<section>
|
|
<p>1.A)See the place: zoom</p>
|
|
|
|
<img src="img/zoom_castello_samoggia.jpg" alt="Router wireless da esterni">
|
|
</section><section>
|
|
<p>1.B)See the place:</p>
|
|
|
|
<img src="img/cabat_vista_da_castello_samoggia.jpg" alt="Router wireless da esterni">
|
|
</section><section>
|
|
<p>1.B)See the place: zoom</p>
|
|
|
|
<img src="img/zoom_cabat.jpg" alt="Router wireless da esterni">
|
|
</section>
|
|
<section>
|
|
<p>2.A)See if is possible go in the roof A</p>
|
|
|
|
<img src="img/sottotetto_cabat.jpg" alt="">
|
|
</section>
|
|
<section>
|
|
<p>2.B)See if is possible go in the roof B</p>
|
|
|
|
<img width="50%" src="img/sottotetto_castello.jpg" alt="">
|
|
</section>
|
|
<!-- Nuova diapo --> <section>
|
|
<p>2)See the places on a map and discover the Fresnel zone</p>
|
|
<div class="fragment"><p>9m</p></div>
|
|
<img src="img/Antennine1vs.jpg" alt="Router wireless da interni">
|
|
</section>
|
|
<section>
|
|
<p>3)Testing</p>
|
|
|
|
<img src="img/primaprovacabat.jpg" alt="Router wireless da esterni">
|
|
</section>
|
|
<section>
|
|
<p>3.A)Antenna A </p>
|
|
<div class="fragment">
|
|
<img width="50%" src="img/cabat_1antenna.jpg" alt="Router wireless da interni"></div>
|
|
</section>
|
|
<section>
|
|
<p>3.A)Antenna B </p>
|
|
<div class="fragment">
|
|
<img width="50%" src="img/castello_1antenna.jpg" alt="Router wireless da interni"></div>
|
|
</section>
|
|
<section>
|
|
<p>4.A)Set the network A</p>
|
|
|
|
<img src="img/cabat_casa.jpg" alt="Router wireless da interni">
|
|
</section><section>
|
|
<p>4.B)Set the network B</p>
|
|
|
|
<img src="img/castello_sotto.jpg" alt="Router wireless da interni">
|
|
</section>
|
|
<section>
|
|
<h2>5)Go to the roof again!</h2>
|
|
|
|
<img width="50%" src="img/cabat_2antenna2.jpg" alt="Router wireless da interni">
|
|
</section>
|
|
<section>
|
|
<p>... never forget the friends</p>
|
|
|
|
<img src="img/friend.jpg" alt="Router wireless da interni">
|
|
</section>
|
|
|
|
</section>
|
|
|
|
<section>
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>And the software?</h2>
|
|
<p style="margin: 20px 0;" class="fragment">The routers are in the fact computers,<br /> and a lot of these have proprietary operative systems</p>
|
|
<div class="fragment"><p style="margin: 20px 0;">Let's go to install on them a specific Distro GNU/Linux!</p>
|
|
<img style="border:0px" src="img/openwrt-logo.png" alt="OpenWrt logo"></div>
|
|
<p class="fragment">It's easy</p>
|
|
</section>
|
|
<section>
|
|
<h2>What a firmware do?</h2>
|
|
<p>manages the dinamic routing,<br /> important in a mesh network.</p>
|
|
<img width="85%" src="img/MeshAnimation.gif" alt="Animazione rete mesh routing dinamico"/>
|
|
</section>
|
|
<section>
|
|
<h2>Whic softwares manage routing?</h2>
|
|
<div class="fragment"><p>Each Ninux "island" chooses how manage his internal routing.</p>
|
|
<p>The routing between islands (VPN or direct connections) is managed as in Internet does (BGP).</p>
|
|
<img width="60%" src="img/bgp-small.jpg" alt="Routing tra isole"></div>
|
|
</section>
|
|
<section>
|
|
<h2>and the configuration?</h2>
|
|
<p style="margin: 20px 0;" class="fragment">We don't need: the Ninux islands develop pre-config firmware (OpenWrt derivative)!</p>
|
|
<div class="fragment"><p style="margin: 20px 0;">At the moment the most used is Libre-Mesh, born between <br />Ninux (Italia), Guifi (Catalogna) and Altermesh (Argentina).</p>
|
|
<img width="50%" style="border:0px" src="img/libremesh-logo.png" alt="Libre-Mesh logo"></div>
|
|
<p style="margin: 20px 0;" class="fragment">So you can built your mesh network only setting the name!</p>
|
|
</section>
|
|
</section>
|
|
|
|
|
|
|
|
<!--section>
|
|
<h1>Libre-Mesh</h1>
|
|
<h3>Mesh networking made simple and modular.</h3>
|
|
<p>
|
|
<small>ignifugo</small>
|
|
</p>
|
|
<p>
|
|
<small>H.A.C.K. 2017 - Budapest</small>
|
|
</p>
|
|
</section-->
|
|
|
|
<section>
|
|
<section>
|
|
<h2>Many firmwares...</h2>
|
|
<ul>
|
|
<li>NinuxRoma ⇨ Sburratone</li>
|
|
<li>NinuxRoma ⇨ Scooreggione</li>
|
|
<li>eigenNet ⇨ eigenNet</li>
|
|
<li>Freifunk ⇨ various</li>
|
|
<li>AWMN ⇨ OpenMesh, Merdotik and various</li>
|
|
<li>GUIFI ⇨ AirMerdOS, Merdotik, qmp</li>
|
|
<li>Altermundi ⇨ Altermesh</li>
|
|
<li>Buenosaires Libre ⇨ APRouter, Byzantinum, Obelysk</li>
|
|
</ul>
|
|
<p><br/>
|
|
<h2 class="fragment">...few developers</h2>
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Let's make another one...</h2>
|
|
<h2 class="fragment">...but in a collaborative way!</h2>
|
|
<table class="fragment"><tr><td width="60%">
|
|
eigenNet + GUIFI + Altermundi + NinuxVerona + NinuxBO ...
|
|
</td><td style="text-align:center;vertical-align:middle">
|
|
⇨ Libre-Mesh
|
|
</td></tr></table>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>How is it possible?</h2>
|
|
<p>Every community has different needs...</p>
|
|
<p class="fragment">Let's make it modular!</p>
|
|
</section>
|
|
|
|
</section>
|
|
|
|
<section>
|
|
<section>
|
|
<h2>Modular Architecture</h2>
|
|
<img src="img/lime-modular.png">
|
|
</section>
|
|
</section>
|
|
<section>
|
|
<!--section>
|
|
<h2><a href="http://libremesh.org/" >Today's Network Architecture</a></h2>
|
|
</section-->
|
|
<section>
|
|
<h2>What use Libre-Mesh?</h2>
|
|
<p>Libre-Mesh use:
|
|
<ul><li>Batman-adv (layer 2) in local layer, at clients appear as a single switch, an only domain of broadcast.</li></ul></p>
|
|
<img width="60%" src="img/batman-adv-switch.jpg" alt="Switch virtuale">
|
|
</section>
|
|
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>What use Libre-Mesh?</h2>
|
|
<ul><li>BMX6 (layer 3, support IPv4 and IPv6) to join groups of nodes.</li></ul></p>
|
|
<img width="50%" src="img/batman-adv-bmx6.jpg" alt="Batman-adv BMX6">
|
|
<p class="fragment">This two protocols grow good.</p>
|
|
</section>
|
|
|
|
|
|
|
|
<!--section>
|
|
<h2>IPv6</h2>
|
|
<p>Libre-Mesh aims to bring IPv6 native support everywhere.</p>
|
|
<p class="fragment">But what if IPv6 is not available in my town?</p>
|
|
<p class="fragment">Libre-Mesh is not just a firmware it offers a mesh IPv6 tunnel broker too: librenet6 <p/>
|
|
<div class="fragment">
|
|
<p>Why is it better then tunnel broker X?</p>
|
|
<ul>
|
|
<li>Is from the community</li>
|
|
<li>It is mesh</li>
|
|
</ul>
|
|
</div>
|
|
</section-->
|
|
</section>
|
|
<section>
|
|
<h2>How to Get it ?</h2>
|
|
<h2>http://www.libremesh.org/</h2>
|
|
<p>
|
|
<b><a href="http://www.libremesh.org/">By LibreMesh website</a> in two flavours:</b> </p>
|
|
<ul><li>Manually</li>
|
|
|
|
<li>Compiled with your config!</li></ul>
|
|
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Chef web tool</h2>
|
|
<p>Ask the Chef server to compile a custom firmware image for your network.
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Flash in the antennas</h2>
|
|
<p>It's easy and you do it in a Graphic way.
|
|
</p>
|
|
</section>
|
|
<section>
|
|
<h2>Html interface to monitoring your antenna</h2>
|
|
<p>It's easy and you do it in a Graphic User Interface.
|
|
</p>
|
|
</section>
|
|
<section>
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>Nice project.. but is it possible?</h2>
|
|
<p>In Italia we have 300 active node, but thousands of potenzial nodes</p>
|
|
<img width="70%" src="img/potenziali.png" alt="Mapserver Bologna">
|
|
</section>
|
|
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>Freifunk a Berlino</h2>
|
|
<p>with more than 300 nodes</p>
|
|
<img width="80%" src="img/freifunk.png" alt="Mapserver Bologna">
|
|
</section>
|
|
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>AWMN ad Atene</h2>
|
|
<p>with thousands of nodes!</p>
|
|
<img width="80%" src="img/awmn.png" alt="Mapserver Bologna">
|
|
</section>
|
|
|
|
<!-- Nuova diapo --> <section>
|
|
<h2>GUIFI in Catalogna</h2>
|
|
<p>with more that 30'000 nodes</p>
|
|
<img width="80%" src="img/guifi.png" alt="Mapserver Bologna">
|
|
</section>
|
|
<section><h2>And near you?</h2>
|
|
<img src="img/wlan_s.png">
|
|
</section>
|
|
|
|
|
|
</section>
|
|
<section id="questions" class="slide level2 future" style="top: 350px; display: none;" aria-hidden="true" hidden="">
|
|
<h1>Questions?</h1>
|
|
<p><small></small></p><small>
|
|
<p>Email address:</p>
|
|
<p><strong>ignifugo@insicuri.net</strong></p>
|
|
<p>Slides URL:</p>
|
|
<p><strong>https://git.lattuga.net/</strong></p>
|
|
<p>Website URL:</p>
|
|
<p><strong>https://digitigrafo.it/</strong></p>
|
|
<p>OpenPGP fingerprint:</p>
|
|
<p><code>F93B DB56 B5E5 9798 C890 6588 180E BFCA 5FFB B6E3</code></p>
|
|
</small><p><small></small></p>
|
|
</section>
|
|
<section>
|
|
<p class="fragment"><b>thanks!</b></p>
|
|
</section>
|
|
<section>
|
|
<h2>Credits</h2>
|
|
<ul>
|
|
<li>Ilario NINUX Verona</li>
|
|
<li>G10h4ck NINUX Pisa - EigenLab</li>
|
|
<li>xtheGamerx NINUX Bologna - HacklabBO</li>
|
|
|
|
</ul>
|
|
</section>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script src="lib/js/head.min.js"></script>
|
|
<script src="js/reveal.min.js"></script>
|
|
|
|
<script>
|
|
|
|
// Full list of configuration options available here:
|
|
// https://github.com/hakimel/reveal.js#configuration
|
|
Reveal.initialize({
|
|
controls: true,
|
|
progress: true,
|
|
history: true,
|
|
center: true,
|
|
|
|
theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
|
|
transition: Reveal.getQueryHash().transition || 'default', // default/cube/page/concave/zoom/linear/fade/none
|
|
|
|
// Parallax scrolling
|
|
// parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg',
|
|
// parallaxBackgroundSize: '2100px 900px',
|
|
|
|
// Optional libraries used to extend on reveal.js
|
|
dependencies: [
|
|
{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
|
|
{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
|
{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
|
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
|
|
{ src: 'plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
|
|
{ src: 'plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
|
|
]
|
|
});
|
|
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|