第２回 はじめてのJupyter

### はじめに
PYNQ第二回は、はじめてのJupyterです。
Webベースでプロジェクト管理ができるなんて、いい時代。

第１回 [Setup PYNQ-Z1](https://qiita.com/0x20FE/items/9b5e8e7a51ac0d9eabbc)
第２回 [はじめてのJupyter](https://qiita.com/0x20FE/items/7fa2fa59c930c571f197)
第３回 [pythonとPYNQ PL資源へのアクセス](2019-08-15_FPGA_PYNQ_Python_zynq_2fbcf08ba9d29b2452be.md)
第４回 [PYNQ OVERLAY](2019-08-15_FPGA_PYNQ_Python_zynq_36755b7e5b60cfbfec87.md)
第５回 [PYNQのOverlayを作ってみた](https://qiita.com/0x20FE/private/81098851f8c8010ca2c8)
第６回 [カスタムIPを作ってPYNQ overlayに組み込む](2019-08-22_FPGA_PYNQ_zynq_ece9f0cc0340763dde61.md)
第７回 [PYNQのHDMI出力overlayを作る](2019-08-24_FPGA_PYNQ_zynq_820e68d300dd978ad21c.md)
番外編　[python ジャンプスタート](https://qiita.com/0x20FE/items/6f8b6d893b9c5c197c5b)


## 付属ドキュメントを読む
### つかみ
webでPYNQに接続して解説を読む(ながめる)
/notebooks/getting_started/1_jupyter_notebooks.ipynb

PYNQのDocs [Juptter Notebooks](https://pynq.readthedocs.io/en/v2.4/jupyter_notebooks.html)

ふむふむ。ドキュメントとコードと結果をWebpageにひとまとめになっているという理解でいいのかな。
１ページ<-->１プロジェクト(文書、コード、永続化したデータ）ということ？

### コンポーネント
説明文によれば、Jupiter Notebookは、「Notebook web アプリ」「カーネル」「Notebook ドキュメント」で構成されるとのこと。

- Notebookドキュメントが、各ページの（文書、コード、永続化されたデータ）に相当
- カーネルは処理系で、pythonやRuby,Rなどのプログラム言語のコードを実行する。PYNQ distributionのJupyter Notebookにインストールされているのはpythonだけ。（と書いてあるが、shellとか使える。あとで試す）
- Notebook Webアプリが、それらページデータをWebページに変換するとともに、ブラウザ操作によって発行されたリクエストを処理してページデータを更新したり、データとコードをカーネルに渡して処理を行わせる。

### NoteBookの基本
記述はcellと呼ばれるテキストフィールドに記入するようです。cellのタイプはページ上部のツールバーにて、cellやmarkdownなど選ぶことができます。

- markdownを選び、cellにマークダウン記法に基づくテキストを入力すると、reload時にそれが反映されます。
- codeを選び、そこにpythonのコード入力し、ツールバーの「|>RUN」をクリックすると、実行結果がセルの下に表示されます。

## 試してみよう
@taka4sato さんの[Jupyter事始め](https://qiita.com/taka4sato/items/2c3397ff34c440044978)が詳しいですね。PYNQではすでにJupyterが起動しているのでいきなり「Jupyterの使い方」から始められる。

でも、そもそもpythonわかっていなかった！

番外編　[python ジャンプスタート](https://qiita.com/0x20FE/items/6f8b6d893b9c5c197c5b)にすすむ

### ターミナル
macOSのsafariからだど、キー入力ができないのですが、Michitaro Koike@stackoverflow さん jupyter-notebookのターミナルで半角の文字が入力できませんへの回答[日本語入力の半角モードだとダメでABCならうまくいきました。](https://ja.stackoverflow.com/questions/44642/jupyter-notebookのターミナルで半角の文字が入力できません)に従って、「システム環境設定」/「キーボード」/「入力ソース」の画面の「＋」ボタンから「英語」の[A]ABCを追加し、メニューバーでABCを選んだところ、無事入力できるようになりました。

## advanced features
PYNQのJupyter notebookの高度な機能

### input文

```val = input('prompt')```で textboxが現れて入力できる

### Interactive input
引数の型に対応した入力領域が用意されて、値が変更されたところで自動的に関数を呼び出す。
interact(関数,引数1=値1,引数2=値2,...) booleanならチェックボックス、数値ならスライダーなどが現れる。

```
from ipywidgets import *
def ipdate(arg1,arg2,arg3):
  ...
arg1 = widgets.IntSlider(min=10,max=1000,step=1,value=10)
interact(update, arg1=arg1,arg2=False,arg3=True)
```

参考 Jupyter Widgets [widget list](https://ipywidgets.readthedocs.io/en/stable/examples/Widget%20List.html)

### plot
plotもできます。

```
%matplotlib inline
import matplotlib.pyplot as plt  # plot
import numpy as np               # numpy
from ipywidgets import *

def update(fm,amp):              # AM modulation
    t=np.arange(0,2,0.01)         # fc=10,t=[0.2]
    y=(1+amp*np.sin(t*6.28*fm))*np.sin(t*6.28*10)
    plt.plot(t,y)
    plt.show()
amp=widgets.FloatSlider(min=0,max=0.5,step=0.1,value=0.3)
fm=widgets.FloatSlider(min=0.1,max=2,step=0.1,value=1)

interact(update,fm=fm,amp=amp)
```

![plotの例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115334/1b6018b8-3f2f-a089-35f4-903a851f555f.png "plotの例")

グラフを２つ書く時はどうするのだろう？もうひとつセルをつくるのかな 3_jupyter_notebooks_advanced_featuresによればいろいろできそう。

## PYNQのJupyter notebook front endの拡張機能
3_jupyter_notebooks_advanced_featuresを試してみる
### shellの呼び出し

```python:shellの呼び出し
! ifconfig
```

```python:shellの結果をpythonにわたす
files = ! ls |head -3
print(files)
```

```python:pythonの値をshellに渡す
opt="-al"
!ls {opt}
```

###magicを使う
1行に有効なline magics,セルに有効なcell magicsがある。
line magicsは'%'ではじまり、cell magicsは'%%'で始まる。

```python:line_magicsの例_magic一覧の表示
%lsmagic
```

```python:cell_magicsの例_perlを呼び出す
%%perl
print "foo"
```