You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
706 lines
28 KiB
706 lines
28 KiB
<html> |
|
<head> |
|
<meta charset="utf-8" /> |
|
<title>Desculpe Python, Não Sou Eu, É Você</title> |
|
<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, minimal-ui"> |
|
|
|
<!-- <link rel="stylesheet" href="dist/reset.css"> --> |
|
<!-- <link rel="stylesheet" href="dist/reveal.css"> --> |
|
<!-- <link rel="stylesheet" href="dist/theme/night.css" id="theme"> --> |
|
|
|
<link rel="stylesheet" href="reveal.js/css/reveal.css"> |
|
<link rel="stylesheet" href="reveal.js/css/theme/night.css" id="theme"> |
|
|
|
<!-- Code syntax highlighting --> |
|
<link rel="stylesheet" href="dist/highlight/zenburn.css"> |
|
|
|
<!-- Printing and PDF exports --> |
|
<script> |
|
var link = document.createElement( 'link' ); |
|
link.rel = 'stylesheet'; |
|
link.type = 'text/css'; |
|
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css'; |
|
document.getElementsByTagName( 'head' )[0].appendChild( link ); |
|
</script> |
|
|
|
<!--[if lt IE 9]> |
|
<script src="lib/js/html5shiv.js"></script> |
|
<![endif]--> |
|
|
|
<style type="text/css" media="screen"> |
|
.happy { |
|
color: yellow; |
|
} |
|
|
|
.reveal section img { |
|
border: none; |
|
} |
|
|
|
.reveal ul.empty { |
|
list-style: none inside; |
|
} |
|
|
|
.revel ul.empty li { |
|
display: block; |
|
} |
|
|
|
.cursor { |
|
background-color: #666; |
|
color: white; |
|
} |
|
|
|
img { |
|
max-height: 90%; |
|
} |
|
|
|
td.seen { |
|
font-style: italic; |
|
font-weight: bold; |
|
} |
|
|
|
.semi-opaque { |
|
background-color: rgba(0, 0, 0, 0.7); |
|
} |
|
|
|
.sidebyside { |
|
display: flex; |
|
} |
|
|
|
.side { |
|
flex: 1; |
|
} |
|
</style> |
|
</head> |
|
|
|
<body> |
|
<div class="reveal"> |
|
<div class="slides"> |
|
<section data-background="_images/dear-john.jpg" data-header> |
|
<h2 class="semi-opaque"> |
|
Desculpe Python, Não Sou Eu, É Você |
|
</h2> |
|
</section> |
|
|
|
<section> |
|
<h2>Quem?</h2> |
|
</section> |
|
|
|
<section data-background="_images/me-background.png"> |
|
|
|
<div class="semi-opaque"> |
|
<h3>Júlio Biason</h3> |
|
|
|
<ul class="empty"> |
|
<li>Programador a 30 anos</li> |
|
<li>Programando em Python desde 1998</li> |
|
<li>Praticante de mototerapia</li> |
|
<li>Trekkie</li> |
|
</ul> |
|
</div> |
|
</section> |
|
|
|
<section> |
|
<h3>JulioBiason.me</h3> |
|
|
|
<ul> |
|
<li><a href="https://presentations.juliobiason.me/">Presentations</a></li> |
|
<li><a href="https://blog.juliobiason.me/">Blog</a></li> |
|
<li><a href="https://git.juliobiason.me/">Git</a></li> |
|
<li><a href="https://resume.juliobiason.me/">CV/Resumé</a></li> |
|
<li><a href="https://books.juliobiason.me/">Books</a></li> |
|
</ul> |
|
|
|
<p class="fragment">+ <a href="https://functional.cafe/@juliobiason">https://functional.cafe/@juliobiason</a></p> |
|
<p class="fragment">+ julio.biason@pm.me</p> |
|
</section> |
|
|
|
<section> |
|
<h3>O Flerte</h3> |
|
</section> |
|
|
|
<section> |
|
<!-- C para bolsa, ainda não num relacionamento abusivo --> |
|
<img src="_images/tng-selar.webp" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Então, tava eu lá na univerdade, fazendo minhas |
|
coisinha na bolsa de inicialização científica, vivendo |
|
com C, que apesar de não dar muito certo, e ter seus |
|
momentos meio abusivos, eu respeito pacas até hoje... |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src ="_images/tng-duras-sisters.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
... e teve momentos em que eu precisava de ajudar pra processar os |
|
resultados desses programas em C, e aí o pessoal me falou do AWK... |
|
|
|
... mas AWK era esquisitão, até fazia as coisas que eu |
|
precisava, mas não era uma conversa em que os dois |
|
falavam de forma simples e clara... |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/ds9-ishka.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Também me falaram de Perl, mas só pra ver como ele |
|
conversava, já dava pra ver a gente nunca ia se |
|
entender direito. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-marina.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
... até que alguém falou "Fala ali com Python". E, |
|
nossa, a conversa rolou solta. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<h3>O Início do Relacionamento</h3> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-deanna-troi-mosaic.jpg" class="stretch"> |
|
</section> |
|
|
|
<section> |
|
<h4>"Vamos fazer um browser em Python!"</h4> |
|
|
|
<small> |
|
- Bando de sem-noção na universidade, eu incluso. |
|
</small> |
|
</section> |
|
|
|
<section> |
|
<!-- simulador de hardware, pra entregar projeto antes do resto --> |
|
<img src="_images/graph.png" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Teve um projeto de hardware que eu tava trabalhando na |
|
parte de apresentação dos dados, a parte do hardware e |
|
inteface com a mesma não tava pronta, nós fizemos um |
|
"simulador" das respostas da interface e entregamos o |
|
projeto antes do hardware! |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<h3>Relacionamento Sério</h3> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/sydney.jpg" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Em 2007, por causa do nosso relacionamento, a gente foi |
|
parar na Austrália, em Sydney. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tilefile.jpg" class="stretch"> |
|
|
|
<aside class="notes"> |
|
A empresa era chamada Tilefile, e a gente trava |
|
trabalhando no backend, antes de Django, antes de |
|
Flask, e fazendo coisas malucas, como guardar os dados |
|
como pickle, e depois adicionando uma camada que lia de |
|
um banco de dados e retornava no mesmo formato do |
|
pickle. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/mitter.png" class="stretch"> |
|
|
|
<aside class="notes"> |
|
... e, depois de um dia juntos no trabalho, eu chegava |
|
em casa e ficava mais tempo com Python, trabalhando num |
|
cliente para o Twitter, antes de ser X, e mais antes |
|
ainda deles fecharem a API. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-deanna-ricker-bridge.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Assim, a gente tava o tempo todo junto no trabalho... |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-deanna-riker-off-bridge.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
... e em casa. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<h3>Separação Não Prevista</h3> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/snw-chapel.webp" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Aí eu tive que voltar pro Brasil, e a gente teve que se |
|
separar. |
|
|
|
O que eu consegui foi um trabalho em PHP, mas por baixo |
|
dos panos eu tentei fazer uma integração de uma |
|
biblioteca em C++ em Python, e aprendi da pior forma o |
|
quão horrível a biblioteca ctypes é. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<h3>A Volta da Paixão</h3> |
|
</section> |
|
|
|
<!-- surgiu a chance de trabalhar junto de novo --> |
|
<section> |
|
<img src="_images/tng-lavelle-promotion.webp" class="stretch"> |
|
</section> |
|
|
|
<!-- ... mas virou objective-c --> |
|
<section> |
|
<img src="_images/ent-tpol.webp" class="stretch"/> |
|
|
|
<aside class="notes"> |
|
Mas o projeto em Python acabou virando 1 ano de |
|
Objective-C. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-q-snap.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
E finalmente surgiu o projeto em Python, com Flask. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/consuela-lemon-pledge.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Quando eu finalmente consegui voltar a programar com Python, |
|
fizemos um framework em cima do Flask chamado "Consuela", que |
|
eu fiquei sabendo anos depois que a empresa para qual eu fiz |
|
ainda estava usando. |
|
</aside> |
|
</section> |
|
|
|
<!-- Django --> |
|
<section> |
|
<img src="_images/tng-troi-cowboy.webp" class="stretch"/> |
|
|
|
<aside class="notes"> |
|
E em Django. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<h3>Nova Separação</h3> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tos-kirk-sidelook.webp" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Mas aí eu resolvi mudar de empresa, acabei caindo num |
|
projeto Java. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<!-- <img src="_images/voy-janeway-congratulations.webp" class="stretch"> --> |
|
<img src="_images/ds9-dax-kick-ass.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Por fora, eu comecei a olhar para Rust, porque era o |
|
burburinho que tava se falando na época -- e eu tava |
|
entediado com Java, e queria aprender algo novo. |
|
|
|
"Uma linguagem que não muda a sua forma de pensar em |
|
programação, não vale a pena ser aprendida -- Alan Perlis" |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<h3>Mais do Mesmo</h3> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-troi-cowboy2.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Quando eu consegui voltar pro Python, eu voltei também |
|
com Django. E aí a situação já tava morna, era algo |
|
como "mais do mesmo", "caí na rotina"... |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<!-- <img src="_images/voy-janeway-correct.webp" class="stretch"> --> |
|
<img src="_images/ds9-dax-eyebrows.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Por algum motivo, eu continuei tentando aprender Rust. |
|
Várias coisas "clicaram" do jeito certo com a |
|
linguagem. |
|
|
|
Teve inclusive um pequeno projeto que eu fiz com |
|
websockets que precisava de performance (dados vindos |
|
com muita frequencia) e que entraria com outro projeto |
|
em C++, mas controle de dependências em C++ é um porre |
|
do inferno, e eu estava preocupado que Python não teria |
|
a performance necessária. No fim, até meu chefe (que |
|
fez a parte em C++) disse que o código ficou bonito. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<h3>O Começo das Brigas</h3> |
|
</section> |
|
|
|
<!-- Múltiplas versões, incluindo não-mantidas --> |
|
<section> |
|
<div class="sidebyside"> |
|
<div class="side"> |
|
<img src="_images/tng-deanna-riker-hug.gif" style="float:left;width=200px"> |
|
</div> |
|
|
|
<div class="side"> |
|
<img src="_images/tng-deanna-riker-hug-2.gif" style="float:right;width=200px"> |
|
</div> |
|
</div> |
|
|
|
<aside class="notes"> |
|
A máquina de testes usa Python 3.6. |
|
|
|
Usuários instalam as versões mais novas. |
|
|
|
Tem que funcionar em todas. |
|
|
|
("Vou usar o Walrus operator! Olha que lindo!" "Não tem |
|
Walrus no 3.6") |
|
|
|
Não só isso, mas cada desenvolvedor tem uma máquina |
|
diferente, tem alguns ainda usando OpenSUSE15 (que |
|
perdeu suporte em 2018!) e não querem mudar porque para |
|
o que eles precisam fazer, funciona. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-enterprise-explodes.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Tentar distribuir scripts nesse ambiente é sofrimento |
|
que não termina mais. É versão diferente de Python, é |
|
diferenças entre distribuições. |
|
|
|
Install no WSL quebrava pacotes por culpa da versão do |
|
Python no sistema. |
|
|
|
Gerado EXE (com Nuitka) começou a explodir o Git. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/ds9-dax-bathlet.jpg" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Adivinha quem veio me salvar desses problemas? |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<p><code> |
|
pip install <span class="fragment">--break-system-packages</span> |
|
</code></p> |
|
|
|
<aside class="notes"> |
|
A gota d'água veio quando eu fui tentar empacotar um |
|
script dentro de um docker pra rodar por dentro do |
|
sistema de CI (e evitar todos os problemas que eu tava |
|
tendo até o momento). Peguei a versão mais nova do |
|
Ubuntu, criei meu docker file com "run apt update", |
|
"run apt upgrade", "run apt install python", "run pip |
|
install [pacote]" e fui agraciado pela mensagem que eu |
|
tenho que ter um virtualenv. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tos-kirk-what.gif" class="stretch"> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-picard-slow-facepalm.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Quer dizer que não tem uma forma de isolar instalações |
|
de Python? |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tos-kirk-slap.gif" class="stretch"> |
|
|
|
<aside class="notes"> |
|
POR QUE DIABOS EU TENHO QUE USAR VIRTUALENV ENQUANTO |
|
QUE O DEBIAN NÃO PRECISA? |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<h3>Despedida</h3> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-data-goodbye.gif" class="stretch"> |
|
</section> |
|
|
|
<!-- rust tá resolvendo tudo de forma melhor, mesmo que mais trabalhoso --> |
|
<section> |
|
<img src="_images/friendship-py-ended.jpg" class="stretch"/> |
|
|
|
<aside class="notes"> |
|
Mesmo com o trabalho que é fazer, Rust tem resolvido as |
|
coisas de forma muito melhor. |
|
|
|
Perdi na sintaxe, ganhei em todos os demais aspectos: |
|
Eu consigo facilmente compilar para qualquer Linux (e |
|
até pra Windows a partir do Linux), eu posso atualizar |
|
a linguagem sem problemas. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/tng-picard-sigh.gif" class="stretch"> |
|
</section> |
|
|
|
<section> |
|
<h2>Falando sério...</h2> |
|
</section> |
|
|
|
<section> |
|
<h3>O Projeto</h3> |
|
|
|
<p>Não é o padrão de 90% das instalações do Python, em que |
|
ele pode ser completamente isolado (Docker) ou roda em |
|
uma máquina apenas (CD).</p> |
|
</section> |
|
|
|
<section> |
|
<p>... mesmo assim, quanto tempo se sabe que distribuição |
|
de pacotes é um porre e não se olha isso com seriedade?</p> |
|
|
|
<aside class="notes"> |
|
Outro problema que pode se ter com pacotes é que a |
|
lista de dependências pode forçar atualizar coisas que |
|
a gente não quer. |
|
|
|
Armin Ronacher -- Flask -- postou recentemente uma |
|
idéia de como ter múltiplas versões de um mesmo pacote |
|
num projeto. |
|
|
|
Aliás, cadê vendoring? |
|
|
|
Cadê PyPI privado? |
|
</aside> |
|
</section> |
|
|
|
<!-- <section> --> |
|
<!-- <h3>Problema de HTTP:</h3> --> |
|
<!-- <p> --> |
|
<!-- Anos de surras com wget/curl/etc me ensinaram como --> |
|
<!-- autenticar a requisição e como fazer pip sem --> |
|
<!-- precisar que usuário se autentique. --> |
|
<!-- </p> --> |
|
|
|
<!-- <aside class="notes"> --> |
|
<!-- Por sorte eu sei como URLs funcionam, e sei como fazer --> |
|
<!-- uma requisição HTTP autenticada que funciona em --> |
|
<!-- qualquer lugar. --> |
|
<!-- </aside> --> |
|
<!-- </section> --> |
|
|
|
<section> |
|
<!-- ferramentas pra python não estão mais sendo escritas em Python (ruff, uv, Pyright) --> |
|
<h3>Para Python, não Python:</h3> |
|
<ul> |
|
<li><code>ruff</code>: Rust</li> |
|
<li><code>uv</code>: Rust</li> |
|
<li><code>Pyright</code>: JavaScript</li> |
|
<li>(<code>ruff-ls</code>: Rust)</li> |
|
</ul> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/python-poetry.png" class="stretch"> |
|
|
|
<aside class="notes"> |
|
Só pra ter uma ideia: Poetry, que é o primeiro |
|
gerenciador de pacotes pra Python a suportar |
|
o pyproject, costuma entrar em loops e ficar |
|
30 minutos resolvendo dependencias. |
|
|
|
O npm é em JavaScript -- JavaScript! -- e resolve |
|
dependencias muitíssimo mais rápido (e olha que é |
|
JS e tudo tem 2000 dependências!) |
|
</aside> |
|
</section> |
|
|
|
<!-- parece estar indo pro lado certo, mas extremamente lento (falta de interesse?) --> |
|
<section> |
|
<h3>Algumas melhorias...</h3> |
|
<ul> |
|
<li>GIL-less Python</li> |
|
<li>JIT compilation</li> |
|
</ul> |
|
|
|
<aside class="notes"> |
|
GIL-less Python pode melhorar performance, |
|
mas a gente sabe que o que precisa de performance |
|
está em C, e eles mesmos tem os controles |
|
de threads do lado deles. GIL-less Python |
|
facilita pra integração desses usos |
|
(e não porque vai ser mais rápido em Python) |
|
|
|
JIT... De novo, performance vem de C, e |
|
considerando o eco-sistema, é bem difícil |
|
de conseguir alcançar algo parecido com o |
|
que é o Lua -- e muito menos Java, que tem |
|
40 anos de pesquisa em como fazer um JIT. |
|
</aside> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/disc-earth.jpg" class="stretch"> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/federation-blocks.jpeg" class="stretch"> |
|
</section> |
|
|
|
<section> |
|
<h3>Rust:</h3> |
|
<ul> |
|
<li class="fragment">... não me deixa cruzar a rua sem olhar pros dois lados<span class="fragment"> mesmo que a rua seja de mão única</span></li> |
|
<li class="fragment">... não me deixa sair de moto sem usar capacete e protetor<span class="fragment"> mesmo que seja pra tirar a moto da garagem</span></li> |
|
<li class="fragment">... não me deixa tomar banho se não tiver o tapetinho pra não escorregar no chuveiro</li> |
|
</ul> |
|
</section> |
|
|
|
<section> |
|
<strong>... mas é bom ver alguém que tá se preocupando comigo e não que |
|
me deixe ser "porra louca" e me deixe na mão na hora de lidar com |
|
os outros. |
|
</strong> |
|
</section> |
|
|
|
<!-- o que acontece quando C++/Java tiver uma interface bacana pra AI/ML/Data Science? --> |
|
<!-- |
|
<section> |
|
<p>Ferramentas de ML/AI são em C++.</p> |
|
<p class="fragment">C++ é complicado de programar.</p> |
|
<p class="fragment">Mas como Python é só uma cola...</p> |
|
<p class="fragment"><strong>o que vai acontecer quando |
|
alguém insano o suficiente escrever um Jupyter em C++? |
|
</strong></p> |
|
</section> |
|
--> |
|
|
|
<!-- <section> --> |
|
<!-- <img src="_images/py-so-2024.png" class="stretch"> --> |
|
<!-- </section> --> |
|
|
|
<!-- <section> --> |
|
<!-- <img src="_images/so-salary-2024.png" class="stretch"> --> |
|
<!-- </section> --> |
|
|
|
<section> |
|
<h2>Enfim...</h2> |
|
</section> |
|
|
|
<section> |
|
<ul> |
|
<li>Gerenciamento de dependências é um porre a anos -- |
|
e isso ninguém quer botar a mão.</li> |
|
<li>Para aplicações isoladas, "distribuição" é ok. Não |
|
é pro resto.</li> |
|
<li>A sintaxe é o que tá segurando Python no mercado.</li> |
|
</ul> |
|
</section> |
|
|
|
<section> |
|
<p>CodeShow: <a href="https://www.youtube.com/watch?v=tJYKrViTvJM"> |
|
O MAIOR PROBLEMA DO PYTHON FINALMENTE RESOLVIDO |
|
</a></p> |
|
|
|
<small> |
|
Várias soluções criadas, <strong>nenhuma oficial</strong>. |
|
</small> |
|
</section> |
|
|
|
<section> |
|
<img src="_images/federation-blocks.jpeg" class="stretch"> |
|
</section> |
|
|
|
<!-- <section> --> |
|
<!-- <img src="_images/tng-picard-paranoia.webp" class="stretch"> --> |
|
<!-- </section> --> |
|
|
|
<section data-background='_images/thats-all-folks.jpg'> |
|
</section> |
|
</div> |
|
</div> |
|
|
|
<script src="reveal.js/lib/js/head.min.js"></script> |
|
<script src="reveal.js/js/reveal.js"></script> |
|
<!-- <script src="dist/reveal.js"></script> --> |
|
<!-- <script src="plugin/highlight/highlight.js"></script> --> |
|
|
|
<script> |
|
Reveal.initialize({ |
|
controls: true, |
|
progress: true, |
|
history: true, |
|
center: true, |
|
// showNotes: true, |
|
|
|
transition: 'slide', // none/fade/slide/convex/concave/zoom |
|
|
|
// Optional reveal.js plugins |
|
dependencies: [ |
|
{ src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } }, |
|
{ src: 'reveal.js/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, |
|
{ src: 'reveal.js/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, |
|
{ src: 'reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, |
|
{ src: 'reveal.js/plugin/zoom-js/zoom.js', async: true }, |
|
{ src: 'reveal.js/plugin/notes/notes.js', async: true } |
|
] |
|
}); |
|
</script> |
|
|
|
</body> |
|
</html> |
|
|
|
<!-- |
|
vim:ts=4:sw=4:sts=4:et |
|
-->
|
|
|