{ "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](https://lectures.quantecon.org/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": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32m\u001b[1mActivated\u001b[0m /home/qebuild/repos/lecture-source-jl/_build/website/jupyter/Project.toml\u001b[39m\n", "\u001b[36m\u001b[1mInfo\u001b[0m quantecon-notebooks-julia 0.1.0 activated, 0.2.0 requested\u001b[39m\n" ] } ], "source": [ "using InstantiateFromURL\n", "github_project(\"QuantEcon/quantecon-notebooks-julia\", version = \"0.2.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](https://lectures.quantecon.org/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](https://lectures.quantecon.org/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](https://lectures.quantecon.org/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": { "filename": "julia_environment.rst", "kernelspec": { "display_name": "Julia 1.2", "language": "julia", "name": "julia-1.2" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.2.0" }, "title": "Interacting with Julia" }, "nbformat": 4, "nbformat_minor": 2 }