{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "
\n", " \n", " \"QuantEcon\"\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Interacting with Julia" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Contents\n", "\n", "- [Interacting with Julia](#Interacting-with-Julia) \n", " - [Overview](#Overview) \n", " - [Using Jupyter](#Using-Jupyter) \n", " - [Using the REPL](#Using-the-REPL) \n", " - [(Optional) Adding Jupyter to the Path](#%28Optional%29-Adding-Jupyter-to-the-Path) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview\n", "\n", "In this lecture we’ll start examining different features of the Julia and Jupyter environments." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Jupyter\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Getting Started\n", "\n", "Recall that the easiest way to get started with these notebooks is to follow the [cloning instructions](getting_started.html#clone-lectures) earlier.\n", "\n", "To summarize, if on a desktop you should clone the notebooks repository , then in a Julia REPL type" ] }, { "cell_type": "markdown", "metadata": { "hide-output": false }, "source": [ "```julia\n", "using IJulia; jupyterlab()\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hint: Julia will remember the last commands in the REPL, so you can use up-arrow to restart JupyterLab.\n", "\n", "Alternatively, if you are using an online Jupyter, then you can directly open a new notebook.\n", "\n", "Finally, if you installed Jupyter separately or have added [added Jupyter to the Path](#add-jupyter-to-path) then `cd` to the folder location in a terminal, and run" ] }, { "cell_type": "markdown", "metadata": { "hide-output": false }, "source": [ "```text\n", "jupyter lab\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Regardless, your web browser should open to a page that looks something like this\n", "\n", "\n", "\n", " \n", "The page you are looking at is called the “dashboard”.\n", "\n", "If you click on “Julia 1.x.x” you should have the option to start a Julia notebook.\n", "\n", "Here’s what your Julia notebook should look like\n", "\n", "\n", "\n", " \n", "The notebook displays an *active cell*, into which you can type Julia commands." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Notebook Basics\n", "\n", "Notice that in the previous figure the cell is surrounded by a blue border.\n", "\n", "This means that the cell is selected, and double-clicking will place it in edit mode.\n", "\n", "As a result, you can type in Julia code and it will appear in the cell.\n", "\n", "When you’re ready to execute these commands, hit `Shift-Enter`\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Modal Editing\n", "\n", "The next thing to understand about the Jupyter notebook is that it uses a *modal* editing system.\n", "\n", "This means that the effect of typing at the keyboard **depends on which mode you are in**.\n", "\n", "The two modes are\n", "\n", "1. Edit mode \n", " \n", " - Indicated by a green border around one cell, as in the pictures above. \n", " - Whatever you type appears as is in that cell. \n", " \n", "1. Command mode \n", " \n", " - The green border is replaced by a blue border. \n", " - Key strokes are interpreted as commands — for example, typing b adds a new cell below the current one. \n", " \n", "\n", "\n", "(To learn about other commands available in command mode, go to “Keyboard Shortcuts” in the “Help” menu)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Switching modes\n", "\n", "- To switch to command mode from edit mode, hit the `Esc` key. \n", "- To switch to edit mode from command mode, hit `Enter` or click in a cell. \n", "\n", "\n", "The modal behavior of the Jupyter notebook is a little tricky at first but very efficient when you get used to it." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Working with Files\n", "\n", "To run an existing Julia file using the notebook you can copy and paste the contents into a cell in the notebook.\n", "\n", "If it’s a long file, however, you have the alternative of\n", "\n", "1. Saving the file in your **present working directory**. \n", "1. Executing `include(\"filename\")` in a cell. \n", "\n", "\n", "The present working directory can be found by executing the command `pwd()`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Plots\n", "\n", "Note that if you’re using a JupyterHub setup, you will need to first run" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "hide-output": true }, "outputs": [], "source": [ "using InstantiateFromURL\n", "# optionally add arguments to force installation: instantiate = true, precompile = true\n", "github_project(\"QuantEcon/quantecon-notebooks-julia\", version = \"0.8.0\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "in a new cell (i.e., `Shift + Enter`).\n", "\n", "This might take 15-20 minutes depending on your setup, as it installs a large set of packages for our use.\n", "\n", "Run the following cell" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "hide-output": false }, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using Plots\n", "gr(fmt=:png);\n", "plot(sin, -2π, 2π, label=\"sin(x)\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You’ll see something like this (although the style of plot depends on your\n", "installation)\n", "\n", "\n", "\n", " \n", "**Note**: The “time-to-first-plot” in Julia takes a while, since it needs to compile many functions - but is almost instantaneous the second time you run the cell." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Working with the Notebook\n", "\n", "Let’s go over some more Jupyter notebook features — enough so that we can press ahead with programming." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Tab Completion\n", "\n", "Tab completion in Jupyter makes it easy to find Julia commands and functions available.\n", "\n", "For example if you type `rep` and hit the tab key you’ll get a list of all\n", "commands that start with `rep`\n", "\n", "\n", "\n", " \n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Getting Help\n", "\n", "To get help on the Julia function such as `repeat`, enter `? repeat`.\n", "\n", "Documentation should now appear in the browser\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Other Content\n", "\n", "In addition to executing code, the Jupyter notebook allows you to embed text, equations, figures and even videos in the page.\n", "\n", "For example, here we enter a mixture of plain text and LaTeX instead of code\n", "\n", "\n", "\n", " \n", "Next we `Esc` to enter command mode and then type `m` to indicate that we\n", "are writing [Markdown](http://daringfireball.net/projects/markdown/), a mark-up language similar to (but simpler than) LaTeX.\n", "\n", "(You can also use your mouse to select `Markdown` from the `Code` drop-down box just below the list of menu items)\n", "\n", "Now we `Shift + Enter` to produce this\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Inserting unicode (e.g. Greek letters)\n", "\n", "Julia supports the use of [unicode characters](https://docs.julialang.org/en/v1/manual/unicode-input/)\n", "such as `α` and `β` in your code.\n", "\n", "Unicode characters can be typed quickly in Jupyter using the `tab` key.\n", "\n", "Try creating a new code cell and typing `\\alpha`, then hitting the `tab` key on your keyboard." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Shell Commands\n", "\n", "You can execute shell commands (system commands) in Jupyter by prepending a semicolon.\n", "\n", "For example, `; ls` will execute the UNIX style shell command `ls`,\n", "which — at least for UNIX style operating systems — lists the\n", "contents of the current working directory.\n", "\n", "These shell commands are handled by your default system shell and hence are platform specific." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Package Operations\n", "\n", "You can execute package operations in the notebook by prepending a `]`.\n", "\n", "For example, `] st` will give the status of installed packages in the current environment.\n", "\n", "**Note**: Cells where you use `;` and `]` must not have any other instructions in them (i.e., they should be one-liners)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sharing Notebooks\n", "\n", "Notebook files are just text files structured in [JSON](https://en.wikipedia.org/wiki/JSON) and typically end with `.ipynb`.\n", "\n", "A notebook can easily be saved and shared between users — you just need to\n", "pass around the `ipynb` file.\n", "\n", "To open an existing `ipynb` file, import it from the dashboard (the first\n", "browser page that opens when you start Jupyter notebook) and run the cells or edit as discussed above.\n", "\n", "The Jupyter organization has a site for sharing notebooks called [nbviewer](http://nbviewer.jupyter.org/)\n", "which provides a static HTML representations of notebooks.\n", "\n", "QuantEcon also hosts the [QuantEcon Notes](http://notes.quantecon.org/) website, where you can upload and share your notebooks with other economists and the QuantEcon community.\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using the REPL\n", "\n", "As we saw in the [desktop installation](getting_started.html#intro-repl), the REPL is a Julia specific terminal.\n", "\n", "It becomes increasingly important as you learn Julia, and you will find it to be a useful tool for interacting with Julia and installing packages.\n", "\n", "As a reminder, to open the REPL on your desktop, either\n", "\n", "1. Navigating to Julia through your menus or desktop icons (Windows, Mac), or \n", "1. Opening a terminal and typing `julia` (Linux) \n", "\n", "\n", "If you are using a JupyterHub installation, you can start the REPL in JupyterLab by choosing\n", "\n", "1. Choose “New Launcher” \n", "1. Choose a `Julia` Console \n", "\n", "\n", "We examine the REPL and its different modes in more detail in the [tools and editors](../more_julia/tools_editors.html#repl-main) lecture.\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## (Optional) Adding Jupyter to the Path\n", "\n", "If you [installed Jupyter using Julia](getting_started.html#jupyter-installation), then you may find it convenient to add it to your system path\n", "in order to launch JupyterLab without running a Julia terminal.\n", "\n", "The default location for the Jupyter binaries is relative to the `.julia` folder (e.g., `\"C:\\Users\\USERNAME\\.julia\\conda\\3\\Scripts` on Windows).\n", "\n", "You can find the directory in a Julia REPL using by executing" ] }, { "cell_type": "markdown", "metadata": { "hide-output": false }, "source": [ "```julia\n", "] add Conda\n", "using Conda\n", "Conda.SCRIPTDIR\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On Linux/OSX, you could add that path to your `.bashrc`.\n", "\n", "On Windows, to add directly to the path, type `;` to enter shell mode and then execute" ] }, { "cell_type": "markdown", "metadata": { "hide-output": false }, "source": [ "```julia\n", "setx PATH \"$(Conda.SCRIPTDIR);%PATH%\"\n", "```\n" ] } ], "metadata": { "date": 1591310621.1159823, "download_nb": 1, "download_nb_path": "https://julia.quantecon.org/", "filename": "julia_environment.rst", "filename_with_path": "getting_started_julia/julia_environment", "kernelspec": { "display_name": "Julia 1.4.2", "language": "julia", "name": "julia-1.4" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.4.2" }, "title": "Interacting with Julia" }, "nbformat": 4, "nbformat_minor": 2 }