# Entwicklungsumgebungen

Für diesen Kurs werden wir die webbasierte Entwicklungsumgebung [Jupyterhub](https://de.wikipedia.org/wiki/Project_Jupyter) verwenden. Sie steht allen Teilnehmerïnnen für die Dauer des Kurses zur Verfügung. 

Für langfristiges Arbeiten empfiehlt sich eine eigene Installation. 


## Installation auf eigenem Rechner (Linux/MacOS/MS Windows)

1.  Julia mit dem Installations- und Update-Manager **juliaup** installieren:  <https://github.com/JuliaLang/juliaup/>
2.  als Editor/IDE **Visual Studio Code** installieren: <https://code.visualstudio.com/>
3.  im VS Code Editor die **Julia language extension** installieren: <https://www.julia-vscode.org/docs/stable/gettingstarted/>

Einstieg:

- In VS Code eine neue Datei mit der Endung `.jl` anlegen
- Julia-Code schreiben
- `Shift-Enter` oder `Ctrl-Enter` am Ende einer Anweisung oder eines Blocks startet  eine Julia-REPL, Code wird in die  REPL kopiert und ausgeführt 
- [Tastenbelegungen für VS Code](https://code.visualstudio.com/docs/getstarted/keybindings#_keyboard-shortcuts-reference)
und [für Julia in VS Code](https://www.julia-vscode.org/docs/stable/userguide/keybindings/)


### Die Julia-REPL

Wenn man Julia direkt startet, wird die [Julia-REPL](https://docs.julialang.org/en/v1/stdlib/REPL/) (*read-eval-print* Schleife) gestartet, in der man interaktiv mit Julia arbeiten kann. 


```default
$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.10.2 (2024-03-01)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia>
```

## Arbeiten auf dem  [Jupyterhub-Webserver](https://misun103.mathematik.uni-leipzig.de/)

### Jupyterhub & Jupyter

- [Jupyterhub](https://de.wikipedia.org/wiki/Project_Jupyter) ist ein Multi-User-Server für Jupyter.
- Jupyter ist eine web-basierte interaktive Programmierumgebung, die
- ursprünglich in und für Python geschrieben, inzwischen eine
    Vielzahl von Programmiersprachen nutzen kann.
- In Jupyter bearbeitet man sogenannte *notebooks*. Das sind strukturiere Textdateien (JSON), erkennbar an der Dateiendung 
    `*.ipynb`.

Unser Jupyterhub-Server: <https://misun103.mathematik.uni-leipzig.de/>

Nach dem Einloggen in Jupyterhub erscheint ein Dateimanager:

::: {.content-visible when-format="html"}
![](../images/notebook001.png)
:::

::: {.content-visible when-format="pdf"}
![Jupyterhub Dateimanager](../images/notebook001.png){width=50%}
:::


Mit diesem kann man:

-  vorhandene *notebooks* öffnen,
-  neue *notebooks* anlegen,
-  Dateien, z.B. *notebooks*, vom lokalen Rechner hochladen,
-  die Sitzung mit `Logout` beenden (bitte nicht vergessen!). 

### Jupyter notebooks


::: {.content-visible when-format="html"}
![](../images/notebook003.png)
:::

::: {.content-visible when-format="pdf"}
![Jupyter Notebook](../images/notebook003.png){width=50%}
:::


*Notebooks* bestehen aus Zellen. Zellen können 

- Code oder 
- Text/Dokumentation (Markdown) 

enthalten. In  Textzellen kann die Auszeichnungssprache [Markdown](https://de.wikipedia.org/wiki/Markdown) zur Formatierung und LaTeX für mathematische Gleichungen verwendet werden.  

::: {.callout-tip }
Bitte die Punkte `User Interface Tour` und `Keyboard Shortcuts` im `Help`-Menü anschauen! 
:::

Die Zelle, die man gerade bearbeitet, kann im `command mode` oder `edit mode` sein. 

:::{.narrow}

|        | *Command mode* | *Edit mode* |
|:-------|:---------------:|:-----------:|
| Mode aktivieren | `ESC`  | Doppelklick oder `Enter` in Zelle |
| neue Zelle | `b`    |  `Alt-Enter` |
| Zelle löschen | `dd` | |
| Notebook speichern | `s` | `Ctrl-s` |
| Notebook umbenennen | `Menu -> File -> Rename` | `Menu -> File -> Rename` |
|  Notebook schließen | `Menu -> File -> Close & Halt` | `Menu -> File -> Close & Halt` |
| *run cell* | `Ctrl-Enter` | `Ctrl-Enter` |
| *run cell, move to next cell* | `Shift-Enter` | `Shift-Enter` |
| *run cell, insert new cell below* | `Alt-Enter` | `Alt-Enter` |

:  {.striped}

:::

::: {.content-visible when-format="html"}
![](../images/notebook002.png)
:::

::: {.content-visible when-format="pdf"}
![Julia arbeitet...](../images/notebook002.png){width=50%}
:::



Wenn eine Zelle \"arbeitet\", wird ihre Zellen-Nummer zu einem `*` und
die `kernel busy`-Anzeige (Voller schwarzer Punkt oben rechts neben der
Julia-Version) erscheint. Falls das zu lange dauert (ein *infinite loop*
ist schnell programmiert), dann 

-   `Menu -> Kernel -> Interrupt` anklicken; falls das wirkungslos ist,
-   `Menu -> Kernel -> Restart` anklicken.


::: {.callout-important }
Nach einem `kernel restart` müssen alle Zellen, die weiterhin benötigte Definitionen,
`using`-Anweisungen etc enthalten, wieder ausgeführt werden.


**Am Ende der Arbeit bitte immer:**

-   `Menu -> File -> Save & Checkpoint`
-   `Menu -> File -> Close & Halt`
-   `Logout`
:::

