<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/screen.xsl" media="screen"?>
<lecture>

<meta>
  <maintitle>Jupyter</maintitle>
  <author>Jiří Znamenáček</author>
  <title>Úvod, instalace, spuštění</title>
  <date>2020-03-11</date>
  <link><!--a href="http://vyuka.ookami.cz" rel="external">http://vyuka.ookami.cz</a--></link>
  <!--
  <style>
    /* CSSka */
  </style>
  <use-math/>
  -->
</meta>
<!--
  „“–…
  ←→ ↑↓ ↔↕
  ↵ aneb &#x21B5; aneb \r aneb CR aneb CarriageReturn
-->


<slide title="Úvod">

    <p>
        <a href="https://www.nature.com/news/interactive-notebooks-sharing-the-code-1.16261" class="external">V roce 2011 řešili Fernando Pérez a Brian Granger</a>, jak co nejjednoduššeji a nejotevřeněji zpracovávat svá data a algoritmy a sdílet je s ostatními. V podstatě nějak tak, jako to dělá <em>Mathematica</em> se svými <em>notebooky</em>. A tak vznikl projekt <strong>IPython</strong>.
    </p>
    <p>
        Zpočátku byl zaměřený čistě na Python, paralelní zpracování a jednoduchý – ale velmi mocný! – webový „pracovní list“ (<em>notebook</em>). Jelikož se projekt – nepřekvapivě – velmi osvědčil, došlo v roce 2014 k oddělení jazykově nezávislých částí do nového projektu pod jménem <strong>Jupyter</strong> (jméno po jazycích <em>Julia</em>, <em>Python</em> a <em>R</em>), přičemž <em>IPython</em>-kernel slouží nadále k obsluze pythoních záležitostí a pro další jazyky a nástroje jsou k dispozici <a href="https://github.com/jupyter/jupyter/wiki/Jupyter-kernels" class="external">kernely další</a>.
    </p>
    <p>
    </p>

</slide>
<slide title="Webové rozhraní">

    <p>
        Dnes můžeme <em>Jupyter</em> používat ve dvou základních provedeních:
    </p>
    <ul>
        <li>
            <strong>Notebook</strong> – původní relativně jednoduché GUI s jedním pracovním listem;
        </li>
        <li>
            <strong>Lab</strong> – novější multitabové prostředí (vlastní <em>notebook</em>y jsou/můžou být v jeho některých tabech).
        </li>
    </ul>
    <p>
        Pro základní použití (zvlášť jako výukový list nebo přehled výsledků práce) asi stále bohatě stačí starý dobrý <em>Notebook</em>, pouze pro komplikovanější zpracování dat bude potřeba více tabů s různou funkcionalitou (a dokonce i kernely).
    </p>

</slide>
<slide title="Instalace">

    <p>
        Jelikož <em>Jupyter</em> (a obzvláště pak <em>Jupter Lab</em>) s sebou přitáhne OHROMNÉ množství balíčků závislostí, vřele doporučuji instalovat je do vlastního virtuálního prostředí:
    </p>
    <example lang="cmd">
           (base) $ conda create --name jupyter python
           (base) $ conda activate jupyter
        (jupyter) $ _
    </example>
    <note>
        A pokud budete potřebovat <em>Jupyter</em> s dalšími balíčky pro více projektů, nainstalujte si také radši každý projekt zvlášť do vlastního virtuálního prostředí a <a href="?slajd=6">Jupyter s ním jenom provažte</a>, ať se vám dohromady „motá“ co nejméně věcí.
    </note>
    <p>
        Pak už si můžete vybrat, co nainstalujete za variantu:
    </p>
    <ul>
        <li>
            <em>Jupyter Notebook</em>
            <example lang="cmd">
                (jupyter) $ conda install jupyter
            </example>
        </li>
        <li>
            <em>Jupyter Lab</em>
            <example lang="cmd">
                (jupyter) $ conda install jupyterlab
            </example>
        </li>
    </ul>
    <note>
        PS: <em>Jupyter Lab</em> v rámci sebe nainstaluje i <em>Jupyter Notebook</em>, takže o něj nepřijdete.
    </note>
    <p>
        V této základní instalaci bude <em>Jupyter</em> obsahovat pouze kernel <em>IPython</em>, čili podporu pro jazyk <em>Python</em>. Jiné kernely si musíte doinstalovat sami (řiďte se popisem u příslušného kernelu).
    </p>

</slide>
<slide title="Spuštění">

    <p>
        <em>Notebook</em> i <em>Lab</em> se například na Windows dají nainstalovat i tak, že na ně budete mít odkaz v menu (který zajistí jeho spuštění ve správném prostředí a rovnou otevře tab v prohlížeči na příslušnou stránku). Jinak se pouští z příkazové řádky (v příslušném virtuálním prostředí):
    </p>
    <ul>
        <li>
            <em>Notebook</em>
            <example lang="python">
                $ jupyter notebook
            </example>
        </li>
        <li>
            <em>Lab</em>
            <example lang="python">
                $ jupyter lab
            </example>
        </li>
    </ul>
    <p>
        Uvedený příkaz spustí <strong>jupiteří server</strong> (ve výchozím nastavení na adrese <code>http://localhost:8888</code>) a s trochou štěstí se vám rovnou otevře příslušná stránka i v prohlížeči. Pokud ne, stačí vypsanou adresu z konzole zkopírovat a otevřít ji v prohlížeči ručně.
    </p>
    <p>
        PS: <em>Notebook</em> se v prohlížeči otevře jako průzkumník nad souborovým systémem (v adresáři, kde jste ho ručně spustili, nebo v nějakém výchozím v jiném případě), <em>Lab</em> pak na stejném místě, jen v podstatě jako kompletní vícetabové IDE.
    </p>

</slide>
<slide title="Poznámky">

    <p>
        Spouštění z příkazové řádky můžete ovlivnit MNOHA přepínači. Pro začátek určitě postačí následující:
    </p>
    <ul>
        <li>
            <code>--port PORT</code> – spustí jupiteří server na uvedeném portu (výchozí je 8888);
        </li>
        <li>
            <code>--notebook-dir=ADRESÁŘ</code> – nasměruje prostředí na uvedený adresář (výchozí je <code>''</code>, tedy aktuální adresář spuštěné instance);
        </li>
        <li>
            <code>--help</code> – vypíše kompletní nápovědu k příkazové řádce <em>Jupyteru</em>.
        </li>
    </ul>

</slide>
<slide title="Jupyter s více projekty">

    <p>
        Jelikož instalace Jupyteru sama o sobě obsahuje doslova armádu balíčků, je vhodné více různých projektů spravovat z jednoho Jupyteru provázáním IPython'u s příslušnými virtuálními prostředími projektů. Tak se vám nebudou tolik motat balíčky projektů a balíčky Jupyteru samotného.
    </p>
    <p>
        Příklad v <em>Condě</em> pro virtuální prostředí <em>myenv</em>:
    </p>
    <example lang="bash">
        conda activate myenv
        python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
    </example>
    <note>
        Kernel bude viditelný v Jupyteru pod jménem <em>Python (myenv)</em>, vybrat si můžete samozřejmě úplně jiné jméno podle vlastní libosti.
    </note>
    <p>
        Problém je, že aby to fungovalo, musíte v příslušném prostředí mít nainstalovaný <em>ipykernel</em>, který s sebou bohužel i tak přitáhne další dvacítku závislostí :-(
    </p>
    <note>
        Ale aspoň část závislostí Jupyteru ušetříte…
    </note>
    <!--note>
        A je zajímavé, že ty závislosti jsou jiné, pokud instalujete <em>ipykernel</em> pomocí <em>Condy</em> a nebo pomocí <em>pip</em>u, i když je jich prakticky stejně.
    </note-->

</slide>
<slide title="Příklad – instalace kernelu „IJavascript“">

    <p>
        Zatímco samotný <em>Jupyter</em> se instaluje jako balíček <em>Condy</em>, takže od základu obsahuje Python se vším všudy, jiné kernely jsou pochopitelně závislé na jiných jazycích (případně i dalších programech) a často už nejsou k dispozici ani v rámci nějakého kondího kanálu. Jejich instalace tudíž vyžaduje více či méně dalších různě složitých kroků.
    </p>

    <p class="enumerate">
        Jako příklad si nainstalujeme kernel <a href="https://github.com/n-riesco/ijavascript" class="external"><em>IJavascript</em></a>, který do <em>Jupyteru</em> přidá podporu pro <em>JavaScript</em>. Jeho externí závislosti jsou poměrně jednoduché, stačí „pouze“ funkční instalace <a href="https://nodejs.org/en/" class="external"><em>Node.js</em></a> (a tím pádem i <a href="https://www.npmjs.com" class="external"><em>npm</em></a>).
    </p>
    <note>
        Pokud už nemáte <em>Node.js</em> nainstalovaný pro jiné potřeby nebo chcete radši použít verzi určenou pouze pro toto virtuální prostředí, můžete ho nainstalovat i přímo z <em>Condy</em>:
        <example lang="cmd">
            (jupyter) $ conda install nodejs
        </example>
        Efektivně tak zakryjete případnou globální verzi. Jen pozor na stáří verze, které je k dispozici v základním kanálu <em>Condy</em>!
    </note>

    <p class="enumerate">
        Jakmile máme – libovolným způsobem – nainstalovené a rozchozené <em>Node.js</em>, je instalace javascriptího kernelu triviální záležitost, protože ji za nás udělá balíčkovací systém <em>npm</em>:
    </p>
    <example lang="cmd">
        # instalace IJavascript do prostředí Node.js
        (jupyter) $ npm install -g ijavascript

        # registrace IJavascript jako (dalšího) kernelu do Jupyteru
        (jupyter) $ ijsinstall
    </example>
    <note>
        Pozor na to, že instalace prakticky čehokoliv v <em>Node.js</em> s sebou přivláčí takovou hromadu závislostí, že všichni ostatní jenom tiše blednou závistí. Tenhle balíček cestou přibral 64 dalších…
    </note>

    <p class="enumerate">
        Nyní už je javascriptí kernel k dispozici v <em>Jupyteru</em>. Stačí tudíž standardně pustit například notebook (<code>jupyter notebook</code>) a vybrat jako kernel místo <em>IPython</em> právě <em>IJavascript</em>.
    </p>

</slide>


</lecture>
