{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c409aa58",
   "metadata": {},
   "source": [
    "# JupyterLabを使う（30分）\n",
    "\n",
    "この章では、以降の章でデータ分析等に利用するJupyterLabの使い方を説明します。\n",
    "まずJupyterLabを起動し、その後Notebook上でPythonのコードを実行します。\n",
    "\n",
    "## JupyterLabとNotebookとは\n",
    "\n",
    "**JupyterLab**はオープンソースで開発されているデータ分析、可視化、機械学習などに広く利用されているツールです。\n",
    "Webアプリケーションとして提供されており、Webブラウザ上で各種プログラムの実行と結果の参照、ドキュメント作成などが行えます。\n",
    "JupyterLabでは、Notebook（`.ipynb`ファイル）というファイルを作成し、その中でコードを実行します。\n",
    "\n",
    "**Notebook**は、コード、実行結果、説明の文章を1つのファイルにまとめたものです。\n",
    "コードは「セル」という単位に分けて書き、セルごとに実行して結果をすぐに確認できます。\n",
    "また、結果の表示は通常の文字列だけでなく、pandasのDataFrameが見やすい表形式で表示され、Matplotlibなどの可視化ツールを使用してグラフも表示できます。\n",
    "\n",
    "以下のNotebookの画面では簡単な計算を行うPythonのプログラムとその結果、Markdownのドキュメントが表示されています。\n",
    "\n",
    "```{figure} images/4_overview.png\n",
    ":alt: Notebookを開いたJupyterLabの画面\n",
    "\n",
    "Notebookを開いたJupyterLabの画面（左はファイルブラウザ、右はNotebook）\n",
    "```\n",
    "\n",
    "(jupyter-start)=\n",
    "## JupyterLabを起動する\n",
    "\n",
    "{ref}`setup-venv`で作成した作業フォルダと仮想環境を使って、JupyterLabを起動します。\n",
    "作業フォルダに移動し、仮想環境を有効化します。\n",
    "その後、仮想環境を有効化した状態でJupyterLabを起動します。\n",
    "\n",
    "`````{tab-set}\n",
    ":sync-group: os\n",
    "\n",
    "````{tab-item} Windows\n",
    ":sync: windows\n",
    "\n",
    "```{code-block} powershell\n",
    ":caption: JupyterLabを起動\n",
    "\n",
    "cd data-analysis\n",
    "env\\Scripts\\Activate.ps1\n",
    "jupyter lab\n",
    "```\n",
    "````\n",
    "\n",
    "````{tab-item} macOS\n",
    ":sync: macos\n",
    "\n",
    "```{code-block} zsh\n",
    ":caption: JupyterLabを起動\n",
    "\n",
    "cd data-analysis\n",
    "source env/bin/activate\n",
    "jupyter lab\n",
    "```\n",
    "````\n",
    "`````\n",
    "\n",
    "しばらくするとブラウザが開き、JupyterLabの画面が表示されます。\n",
    "ファイルブラウザには、作業フォルダの中のファイルが表示されます。\n",
    "なお、JupyterLabを使っている間は、起動したターミナルを閉じないでください。\n",
    "\n",
    "JupyterLabを終了するときは、メニューから「File」➔「Shut Down」を選びます。\n",
    "または、JupyterLabを起動したターミナルで{kbd}`Ctrl`+{kbd}`C`を2回押します。\n",
    "\n",
    "`jupyter`のコマンドが見つからない場合は、仮想環境を有効化しているか確認してください。\n",
    "詳しくは{ref}`setup-troubleshooting`を参照してください。\n",
    "\n",
    "### （オプション）uvで環境を作成した場合\n",
    "\n",
    "{ref}`setup-uv`の手順で環境を作成した場合も、仮想環境を有効化すれば同じ手順で起動できます。\n",
    "仮想環境を有効化せずに、作業フォルダで次のコマンドを実行して起動することもできます。\n",
    "\n",
    "```{code-block} text\n",
    ":caption: uvでJupyterLabを起動\n",
    "\n",
    "uv run --no-project --python env jupyter lab\n",
    "```\n",
    "\n",
    "`--python env`は、作業フォルダの`env`の仮想環境を使うオプションです。\n",
    "\n",
    "## 基本的な使い方\n",
    "\n",
    "ここでは、Notebookの作成やセルの操作など、JupyterLabとNotebookの基本的な使い方について説明します。\n",
    "\n",
    "### Notebookを作成する\n",
    "\n",
    "JupyterLabを起動すると、初期画面では左側にファイルブラウザ、右側の作業領域にはLauncherが表示されます。\n",
    "作業領域のNotebookの下にある「Python 3」をクリックすると、新しいNotebookが作成されて開きます。\n",
    "ファイル名はデフォルトで`Untitled.ipynb`となります。\n",
    "\n",
    "```{figure} images/4_launcher.png\n",
    ":alt: JupyterLabの画面\n",
    "\n",
    "JupyterLabの画面\n",
    "```\n",
    "\n",
    "### ファイル名を変更する\n",
    "\n",
    "Notebookのファイル名を変更するにはメニューから「File」➔「Rename Notebook…」を選びます。\n",
    "「New Name」に新しい名前（例: `4_jupyter.ipynb`）を入力し、「Rename」をクリックするとファイル名が変更されます。\n",
    "\n",
    "```{figure} images/4_rename.png\n",
    ":alt: Notebookのファイル名を変更するダイアログ\n",
    "\n",
    "Notebookのファイル名を変更する\n",
    "```\n",
    "\n",
    "### セルを操作する\n",
    "\n",
    "Notebookはセル（Cell）と呼ばれる領域にプログラムなどを記入します。\n",
    "Codeセルに次のコードを入力します。\n",
    "{kbd}`Shift`+{kbd}`Enter`を押すと実行されます。単に{kbd}`Enter`を押すと改行文字が入力されます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7eeb1839",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "360"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "price = 120\n",
    "quantity = 3\n",
    "price * quantity"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5177eb38",
   "metadata": {},
   "source": [
    "セルには、Pythonのコードを書く「Code」セルと、説明の文章を書く「Markdown」セルなどがあります。\n",
    "セルの操作には、Notebookの上のツールバーと、選択したセルの右上に表示されるボタンを使います。\n",
    "\n",
    "```{figure} images/4_toolbar.png\n",
    ":alt: Notebookのツールバーと、セルの右上のボタン\n",
    "\n",
    "Notebookのツールバー（上）と、選択したセルの右上のボタン（下）\n",
    "```\n",
    "\n",
    "| 操作 | 使うボタン |\n",
    "|---|---|\n",
    "| 下にセルを追加する | ツールバーの「+」 |\n",
    "| セルを実行する | ツールバーの「▶」 |\n",
    "| セルの種類を変更する | ツールバーのドロップダウン（「Code」または「Markdown」を選ぶ） |\n",
    "| セルを削除する | セルの右上のゴミ箱のボタン |\n",
    "\n",
    "セルを実行するときは、先ほど述べた{kbd}`Shift`+{kbd}`Enter`を使うと便利です。\n",
    "{kbd}`Shift`+{kbd}`Enter`を押すとセルが実行され、次のセルに移動します。\n",
    "最後のセルでこのキーを押した場合は、新しいセルが下に追加されます。\n",
    "\n",
    "### Notebookを保存する\n",
    "\n",
    "Notebookは自動的に保存されますが、ツールバーの左端の保存ボタンをクリックして保存もできます。\n",
    "\n",
    "### よく使うショートカット\n",
    "\n",
    "よく使うキーボードのショートカットは次のとおりです。\n",
    "{kbd}`Esc`を押すと、セルを選択して操作する「コマンドモード」になります。\n",
    "ショートカットにはコード入力時の編集モードで使用できるものと、{kbd}`Esc`を押したコマンドモードで使用できるものがあります。\n",
    "\n",
    "```{table} 編集モードのショートカット\n",
    "| 操作 | Windows | macOS |\n",
    "|---|---|---|\n",
    "| セルを実行して次のセルに移動 | {kbd}`Shift`+{kbd}`Enter` | {kbd}`Shift`+{kbd}`Enter` |\n",
    "| 入力を補完 | {kbd}`Tab` | {kbd}`Tab` |\n",
    "| コマンドモードに切り替え | {kbd}`Esc` | {kbd}`Esc` |\n",
    "| 保存 | {kbd}`Ctrl`+{kbd}`S` | {kbd}`Cmd`+{kbd}`S` |\n",
    "```\n",
    "\n",
    "```{table} コマンドモードのショートカット\n",
    "| 操作 | Windows | macOS |\n",
    "|---|---|---|\n",
    "| セルを実行して次のセルに移動 | {kbd}`Shift`+{kbd}`Enter` | {kbd}`Shift`+{kbd}`Enter` |\n",
    "| 編集モードに切り替え | {kbd}`Enter` | {kbd}`Enter` |\n",
    "| 上にセルを追加 | {kbd}`A` | {kbd}`A` |\n",
    "| 下にセルを追加 | {kbd}`B` | {kbd}`B` |\n",
    "| セルを削除 | {kbd}`D`を2回 | {kbd}`D`を2回 |\n",
    "| Markdownセルに変更 | {kbd}`M` | {kbd}`M` |\n",
    "| Codeセルに変更 | {kbd}`Y` | {kbd}`Y` |\n",
    "| 保存 | {kbd}`Ctrl`+{kbd}`S` | {kbd}`Cmd`+{kbd}`S` |\n",
    "```\n",
    "\n",
    "ほかのショートカットは、参考情報として[Jupyter TutorialのKeyboard shortcuts](https://jupyter-tutorial.readthedocs.io/en/latest/notebook/shortcuts.html)（英語）を参照してください。\n",
    "\n",
    "## コードを実行する\n",
    "\n",
    "「基本的な使い方」で作成したNotebookに続けて、この節のプログラムをセルに入力して実行してください。\n",
    "\n",
    "```{note}\n",
    "入力してもうまく動作しない場合などに、{nb-download}`この章のNotebook <4_jupyter.ipynb>`をダウンロードできます。ダウンロードしたファイルを作業フォルダに置き、JupyterLabのファイルブラウザでダブルクリックして開いてください。\n",
    "ダウンロードしたNotebookには、この章の説明の文章も入っています。タブや図などの一部の書き方は、JupyterLabでは記号のまま表示されます。\n",
    "\n",
    "自分で作った`4_jupyter.ipynb`と同じ名前のため、上書きしないように注意してください。\n",
    "```\n",
    "\n",
    "### Pythonのコードを実行する\n",
    "\n",
    "「セルを操作する」の例のように、セルの最後の行が式の場合は、式の結果がセルの下に表示されます。\n",
    "`print()`を使わなくても、変数の中身や計算の結果を確認できます。\n",
    "\n",
    "前のセルで記述した変数は、次のセルでも使えます。\n",
    "次のセルを実行すると、`print()`の出力と、最後の式の値の両方が表示されます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f2dd0d16",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "合計: 360\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "360"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total = price * quantity\n",
    "print(\"合計:\", total)\n",
    "total"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d1aa7f9",
   "metadata": {},
   "source": [
    "### 入力を補完する\n",
    "\n",
    "コードの入力中に{kbd}`Tab`キーを押すと、変数名や関数名の候補が表示され選択できます。\n",
    "次の図は、`pri`と入力して{kbd}`Tab`キーを押したところ、`price`変数と`print`関数が候補として表示されています。\n",
    "\n",
    "```{figure} images/4_completion.png\n",
    ":alt: Tabキーで補完の候補が表示された画面\n",
    "\n",
    "{kbd}`Tab`キーで表示された補完の候補（`price`と`print`）\n",
    "```\n",
    "\n",
    "### Markdownを書く\n",
    "\n",
    "Markdownセルには、見出し、箇条書き、リンクなどの書式を使って説明の文章を書けます。\n",
    "新しいセルを選択し、ツールバーのドロップダウンで「Markdown」に変更してから、次の内容を入力して{kbd}`Shift`+{kbd}`Enter`で実行します。\n",
    "\n",
    "```{code-block} markdown\n",
    ":caption: Markdownセルの例\n",
    "\n",
    "# 今日のメモ\n",
    "\n",
    "JupyterLabでは、コードと説明を1つのNotebookにまとめられます。\n",
    "\n",
    "## この章でやること\n",
    "\n",
    "- JupyterLabを起動する\n",
    "- Notebookでコードを実行する\n",
    "- Markdownでメモを書く\n",
    "\n",
    "詳しくは[JupyterLabのドキュメント](https://jupyterlab.readthedocs.io/)を参照してください。\n",
    "```\n",
    "\n",
    "- `#`で始まる行は見出しです。`#`の数が多いほど小さな見出しになります。\n",
    "- `-`で始まる行は箇条書きです。\n",
    "- `[文字](URL)`はリンクです。\n",
    "\n",
    "実行すると、次のように表示されます。\n",
    "表示されたMarkdownセルをダブルクリックすると、入力に戻れます。\n",
    "\n",
    "```{figure} images/4_markdown.png\n",
    ":alt: 表示されたMarkdownセル\n",
    "\n",
    "Markdownセルの表示例\n",
    "```\n",
    "\n",
    "## 便利な使い方\n",
    "\n",
    "ここではJupyterLabやNotebookファイルをより便利に使う方法を紹介します。\n",
    "\n",
    "### マジックコマンドを使う\n",
    "\n",
    "**マジックコマンド**は、`%`または`%%`で始まるJupyterLabの便利な命令です。\n",
    "\n",
    "ここでは、よく使われるマジックコマンドの`%timeit`を紹介します。\n",
    "`%timeit`はプログラムの実行時間を複数回試行して計測するコマンドです。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ef51d415",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "39.8 μs ± 2.18 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit sum(range(1000))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cfc94f65",
   "metadata": {},
   "source": [
    "処理時間は実行するPCによって変わるため、資料と値が違っていてもかまいません。\n",
    "\n",
    "### シェルコマンドを実行する\n",
    "\n",
    "セルに`!`を入力して、続けてOSのコマンドを指定すると**シェルコマンド**が実行できます。\n",
    "次の例ではインストールされているPythonとJupyterのバージョンを確認しています。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "92ad4b84",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python 3.14.3\n"
     ]
    }
   ],
   "source": [
    "!python --version"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "75259201",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Selected Jupyter core packages...\n",
      "IPython          : 9.17.1\n",
      "ipykernel        : 7.4.0\r\n",
      "ipywidgets       : not installed\r\n",
      "jupyter_client   : 8.10.0\r\n",
      "jupyter_core     : 5.9.1\r\n",
      "jupyter_server   : 2.21.1\n",
      "jupyterlab       : 4.6.4\r\n",
      "nbclient         : 0.11.0\n",
      "nbconvert        : 7.17.1\r\n",
      "nbformat         : 5.11.1\r\n",
      "notebook         : not installed\r\n",
      "qtconsole        : not installed\r\n",
      "traitlets        : 5.16.1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "IPython          : 9.17.1\r\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ipykernel        : 7.4.0\r\n",
      "ipywidgets       : not installed\r\n",
      "jupyter_client   : 8.10.0\r\n",
      "jupyter_core     : 5.9.1\r\n",
      "jupyter_server   : 2.21.1\r\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "jupyterlab       : 4.6.4\r\n",
      "nbclient         : 0.11.0\r\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "nbconvert        : 7.17.1\r\n",
      "nbformat         : 5.11.1\r\n",
      "notebook         : not installed\r\n",
      "qtconsole        : not installed\r\n",
      "traitlets        : 5.16.1\r\n"
     ]
    }
   ],
   "source": [
    "!jupyter --version"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dcfad036",
   "metadata": {},
   "source": [
    "この章では、JupyterLabを起動し、Notebookでコードを実行する方法を学びました。\n",
    "次の[](5_pandas.md)では、Notebook上でpandasを使って、表形式のデータの読み込みや加工、集計を行います。"
   ]
  }
 ],
 "metadata": {
  "file_format": "mystnb",
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.14.3"
  },
  "mystnb": {
   "merge_streams": true
  },
  "source_map": [
   8,
   124,
   128,
   203,
   207,
   265,
   267,
   276,
   280,
   282
  ]
 },
 "nbformat": 4,
 "nbformat_minor": 5
}