diff --git a/examples/Notebook/Animations Using clear_output.ipynb b/examples/IPython Kernel/Animations Using clear_output.ipynb similarity index 100% rename from examples/Notebook/Animations Using clear_output.ipynb rename to examples/IPython Kernel/Animations Using clear_output.ipynb diff --git a/examples/IPython Kernel/Background Jobs.ipynb b/examples/IPython Kernel/Background Jobs.ipynb index b0b561e..165f1cd 100644 --- a/examples/IPython Kernel/Background Jobs.ipynb +++ b/examples/IPython Kernel/Background Jobs.ipynb @@ -1,7 +1,6 @@ { "metadata": { - "name": "", - "signature": "sha256:481e128e553ec13e039f3e3f5e567cc3caffe391b78b9821ee883fb8770ebc82" + "name": "BackgroundJobs" }, "nbformat": 3, "nbformat_minor": 0, @@ -9,17 +8,11 @@ { "cells": [ { - "cell_type": "heading", - "level": 1, - "metadata": {}, - "source": [ - "Background Jobs" - ] - }, - { "cell_type": "markdown", "metadata": {}, "source": [ + "# Simple interactive bacgkround jobs with IPython\n", + "\n", "We start by loading the `backgroundjobs` library and defining a few trivial functions to illustrate things with." ] }, @@ -27,7 +20,6 @@ "cell_type": "code", "collapsed": false, "input": [ - "from __future__ import print_function\n", "from IPython.lib import backgroundjobs as bg\n", "\n", "import sys\n", @@ -47,9 +39,9 @@ "def printfunc(interval=1, reps=5):\n", " for n in range(reps):\n", " time.sleep(interval)\n", - " print('In the background...', n)\n", + " print 'In the background...', n\n", " sys.stdout.flush()\n", - " print('All done!')\n", + " print 'All done!'\n", " sys.stdout.flush()" ], "language": "python", @@ -62,8 +54,8 @@ "metadata": {}, "source": [ "Now, we can create a job manager (called simply `jobs`) and use it to submit new jobs.\n", - "
\n", - "Run the cell below and wait a few seconds for the whole thing to finish, until you see the \"All done!\" printout." + "\n", + "Run the cell below, it will show when the jobs start. Wait a few seconds until you see the 'all done' completion message:" ] }, { @@ -75,12 +67,7 @@ "# Start a few jobs, the first one will have ID # 0\n", "jobs.new(sleepfunc, 4)\n", "jobs.new(sleepfunc, kw={'reps':2})\n", - "jobs.new('printfunc(1,3)')\n", - "\n", - "# This makes a couple of jobs which will die. Let's keep a reference to\n", - "# them for easier traceback reporting later\n", - "diejob1 = jobs.new(diefunc, 1)\n", - "diejob2 = jobs.new(diefunc, 2)" + "jobs.new('printfunc(1,3)')" ], "language": "python", "metadata": {}, @@ -91,13 +78,46 @@ "text": [ "Starting job # 0 in a separate thread.\n", "Starting job # 2 in a separate thread.\n", - "Starting job # 3 in a separate thread.\n", - "Starting job # 4 in a separate thread.\n", - "Starting job # 5 in a separate thread.\n" + "Starting job # 3 in a separate thread.\n" + ] + }, + { + "output_type": "pyout", + "prompt_number": 10, + "text": [ + "" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "In the background... 0\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "In the background... 1\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "In the background... 2\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "All done!\n" ] } ], - "prompt_number": 2 + "prompt_number": 10 }, { "cell_type": "markdown", @@ -119,27 +139,15 @@ "output_type": "stream", "stream": "stdout", "text": [ - "In the background... 0\n", - "Running jobs:" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "0 : \n", - "2 : \n", + "Completed jobs:\n", + "0 : \n", + "2 : \n", "3 : printfunc(1,3)\n", - "5 : \n", - "\n", - "Dead jobs:\n", - "4 : \n", "\n" ] } ], - "prompt_number": 3 + "prompt_number": 11 }, { "cell_type": "markdown", @@ -152,14 +160,58 @@ "cell_type": "code", "collapsed": false, "input": [ - "jobs[0].result\n", - "j0 = jobs[0]\n", - "j0.join?" + "jobs[0].result" ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": 4 + "outputs": [ + { + "output_type": "pyout", + "prompt_number": 12, + "text": [ + "{'args': (), 'interval': 4, 'kwargs': {}}" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Errors and tracebacks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The jobs manager tries to help you with debugging:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# This makes a couple of jobs which will die. Let's keep a reference to\n", + "# them for easier traceback reporting later\n", + "diejob1 = jobs.new(diefunc, 1)\n", + "diejob2 = jobs.new(diefunc, 2)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Starting job # 4 in a separate thread.\n", + "Starting job # 5 in a separate thread.\n" + ] + } + ], + "prompt_number": 13 }, { "cell_type": "markdown", @@ -184,21 +236,26 @@ "output_type": "stream", "stream": "stdout", "text": [ - "In the background... 1\n", - "In the background... 2\n", - "All done!\n" - ] - }, - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 1)", - "output_type": "pyerr", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m print \"Status of diejob1:\", diejob1.status\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "Status of diejob1: Dead (Exception), call jobs.traceback() for details\n", + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[1;31mException\u001b[0m Traceback (most recent call last)\n", + "\u001b[1;32m/home/fperez/usr/opt/virtualenv/ipython-0.13.2/lib/python2.7/site-packages/IPython/lib/backgroundjobs.pyc\u001b[0m in \u001b[0;36mcall\u001b[1;34m(self)\u001b[0m\n", + "\u001b[0;32m 482\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0;32m 483\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mcall\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m--> 484\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mdiefunc\u001b[1;34m(interval, *a, **kw)\u001b[0m\n", + "\u001b[0;32m 13\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdiefunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0;32m 14\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m---> 15\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Dead job with interval %s\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0minterval\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m 16\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0;32m 17\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mprintfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreps\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\n", + "\u001b[1;31mException\u001b[0m: Dead job with interval 1\n" ] } ], - "prompt_number": 5 + "prompt_number": 14 }, { "cell_type": "markdown", @@ -220,44 +277,44 @@ "output_type": "stream", "stream": "stdout", "text": [ - "Traceback for: >\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mException\u001b[0m Traceback (most recent call last)\n", - "\u001b[0;32m/Users/bgranger/Documents/Computing/IPython/code/ipython/IPython/lib/backgroundjobs.pyc\u001b[0m in \u001b[0;36mcall\u001b[0;34m(self)\u001b[0m\n", - "\u001b[1;32m 489\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[1;32m 490\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m--> 491\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "Traceback for: >\n", + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[1;31mException\u001b[0m Traceback (most recent call last)\n", + "\u001b[1;32m/home/fperez/usr/opt/virtualenv/ipython-0.13.2/lib/python2.7/site-packages/IPython/lib/backgroundjobs.pyc\u001b[0m in \u001b[0;36mcall\u001b[1;34m(self)\u001b[0m\n", + "\u001b[0;32m 482\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0;32m 483\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mcall\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m--> 484\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mdiefunc\u001b[0;34m(interval, *a, **kw)\u001b[0m\n", - "\u001b[1;32m 14\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdiefunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[1;32m 15\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m---> 16\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Dead job with interval %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0minterval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[1;32m 18\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mprintfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mdiefunc\u001b[1;34m(interval, *a, **kw)\u001b[0m\n", + "\u001b[0;32m 13\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdiefunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0;32m 14\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m---> 15\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Dead job with interval %s\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0minterval\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m 16\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0;32m 17\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mprintfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreps\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\n", - "\u001b[0;31mException\u001b[0m: Dead job with interval 1\n", + "\u001b[1;31mException\u001b[0m: Dead job with interval 1\n", "\n", - "Traceback for: >\n", - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mException\u001b[0m Traceback (most recent call last)\n", - "\u001b[0;32m/Users/bgranger/Documents/Computing/IPython/code/ipython/IPython/lib/backgroundjobs.pyc\u001b[0m in \u001b[0;36mcall\u001b[0;34m(self)\u001b[0m\n", - "\u001b[1;32m 489\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[1;32m 490\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m--> 491\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "Traceback for: >\n", + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[1;31mException\u001b[0m Traceback (most recent call last)\n", + "\u001b[1;32m/home/fperez/usr/opt/virtualenv/ipython-0.13.2/lib/python2.7/site-packages/IPython/lib/backgroundjobs.pyc\u001b[0m in \u001b[0;36mcall\u001b[1;34m(self)\u001b[0m\n", + "\u001b[0;32m 482\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0;32m 483\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mcall\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m--> 484\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mdiefunc\u001b[0;34m(interval, *a, **kw)\u001b[0m\n", - "\u001b[1;32m 14\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdiefunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[1;32m 15\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m---> 16\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Dead job with interval %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0minterval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[1;32m 18\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mprintfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mdiefunc\u001b[1;34m(interval, *a, **kw)\u001b[0m\n", + "\u001b[0;32m 13\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdiefunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0;32m 14\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m---> 15\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Dead job with interval %s\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0minterval\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m 16\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[0;32m 17\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mprintfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterval\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreps\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\n", - "\u001b[0;31mException\u001b[0m: Dead job with interval 2\n", + "\u001b[1;31mException\u001b[0m: Dead job with interval 2\n", "\n" ] } ], - "prompt_number": 6 + "prompt_number": 15 }, { "cell_type": "markdown", @@ -284,7 +341,7 @@ ] } ], - "prompt_number": 7 + "prompt_number": 16 }, { "cell_type": "markdown", @@ -302,13 +359,13 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 8 + "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "It's easy to wait on a job:" + "Jobs have a `.join` method that lets you wait on their thread for completion:" ] }, { @@ -316,11 +373,7 @@ "collapsed": false, "input": [ "j = jobs.new(sleepfunc, 2)\n", - "print(\"Will wait for j now...\")\n", - "sys.stdout.flush()\n", - "j.join()\n", - "print(\"Result from j:\")\n", - "j.result" + "j.join?" ], "language": "python", "metadata": {}, @@ -329,27 +382,22 @@ "output_type": "stream", "stream": "stdout", "text": [ - "Starting job # 0 in a separate thread.\n", - "Will wait for j now...\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Result from j:\n" - ] - }, - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 9, - "text": [ - "{'args': (), 'interval': 2, 'kwargs': {}}" + "Starting job # 0 in a separate thread.\n" ] } ], - "prompt_number": 9 + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise\n", + "\n", + "1. Start a new job that calls `sleepfunc` with a 5-second wait\n", + "2. Print a short message that indicates you are waiting (note: you'll need to flush stdout to see that print output appear).\n", + "3. Wait on the job and then print its result." + ] } ], "metadata": {} diff --git a/examples/IPython Kernel/Beyond Plain Python.ipynb b/examples/IPython Kernel/Beyond Plain Python.ipynb new file mode 100644 index 0000000..de7126c --- /dev/null +++ b/examples/IPython Kernel/Beyond Plain Python.ipynb @@ -0,0 +1,1613 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:31071a05d0ecd75ed72fe3f0de0ad447a6f85cffe382c26efa5e68db1fee54ee" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 1, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "IPython: beyond plain Python" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When executing code in IPython, all valid Python syntax works as-is, but IPython provides a number of features designed to make the interactive experience more fluid and efficient." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "First things first: running code, getting help" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the notebook, to run a cell of code, hit `Shift-Enter`. This executes the cell and puts the cursor in the next cell below, or makes a new one if you are at the end. Alternately, you can use:\n", + " \n", + "- `Alt-Enter` to force the creation of a new cell unconditionally (useful when inserting new content in the middle of an existing notebook).\n", + "- `Control-Enter` executes the cell and keeps the cursor in the same cell, useful for quick experimentation of snippets that you don't need to keep permanently." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print \"Hi\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Hi\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Getting help:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Typing `object_name?` will print all sorts of details about any object, including docstrings, function definition lines (for call arguments) and constructor details for classes." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import collections\n", + "collections.namedtuple?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "collections.Counter??" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 4 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "*int*?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "An IPython quick reference card:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%quickref" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 6 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Tab completion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tab completion, especially for attributes, is a convenient way to explore the structure of any object you\u2019re dealing with. Simply type `object_name.` to view the object\u2019s attributes. Besides Python objects and keywords, tab completion also works on file and directory names." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "collections." + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 8 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "The interactive workflow: input, output, history" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "2+10" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 7, + "text": [ + "12" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "_+10" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 8, + "text": [ + "22" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "You can suppress the storage and rendering of output if you append `;` to the last cell (this comes in handy when plotting with matplotlib, for example):" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "10+20;" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 9 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "_" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 10, + "text": [ + "22" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "The output is stored in `_N` and `Out[N]` variables:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "_10 == Out[10]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 11, + "text": [ + "True" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "And the last three have shorthands for convenience:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 'last output:', _\n", + "print 'next one :', __\n", + "print 'and next :', ___" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "last output: True\n", + "next one : 22\n", + "and next : 22\n" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "In[11]" + ], + "language": "python", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 13, + "text": [ + "u'_10 == Out[10]'" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "_i" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 14, + "text": [ + "u'In[11]'" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "_ii" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 15, + "text": [ + "u'In[11]'" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print 'last input:', _i\n", + "print 'next one :', _ii\n", + "print 'and next :', _iii" + ], + "language": "python", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "last input: _ii\n", + "next one : _i\n", + "and next : In[11]\n" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%history -n 1-5" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " 1: print \"Hi\"\n", + " 2: ?\n", + " 3:\n", + "import collections\n", + "collections.namedtuple?\n", + " 4: collections.Counter??\n", + " 5: *int*?\n" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "**Exercise**\n", + "\n", + "Write the last 10 lines of history to a file named `log.py`." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Accessing the underlying operating system" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "!pwd" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/home/fperez/ipython/tutorial/notebooks\r\n" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "files = !ls\n", + "print \"My current directory's files:\"\n", + "print files" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "My current directory's files:\n", + "['BackgroundJobs.ipynb', 'Custom Display Logic.ipynb', 'Customizing IPython - Condensed.ipynb', 'Customizing IPython - Config.ipynb', 'Customizing IPython - Extensions.ipynb', 'Customizing IPython - Magics.ipynb', 'data', 'figs', 'flare.json', 'Index.ipynb', 'Interactive Widgets.ipynb', 'IPython - beyond plain Python.ipynb', 'kernel-embedding', 'Markdown Cells.ipynb', 'myscript.py', 'nbconvert_arch.png', 'NbConvert from command line.ipynb', 'NbConvert Python library.ipynb', 'Notebook and javascript extension.ipynb', 'Notebook Basics.ipynb', 'Overview of IPython.parallel.ipynb', 'parallel', 'Rich Display System.ipynb', 'Running a Secure Public Notebook.ipynb', 'Running Code.ipynb', 'Sample.ipynb', 'soln', 'Terminal usage.ipynb', 'text_analysis.py', 'Typesetting Math Using MathJax.ipynb']\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "!echo $files" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[BackgroundJobs.ipynb, Custom Display Logic.ipynb, Customizing IPython - Condensed.ipynb, Customizing IPython - Config.ipynb, Customizing IPython - Extensions.ipynb, Customizing IPython - Magics.ipynb, data, figs, flare.json, Index.ipynb, Interactive Widgets.ipynb, IPython - beyond plain Python.ipynb, kernel-embedding, Markdown Cells.ipynb, myscript.py, nbconvert_arch.png, NbConvert from command line.ipynb, NbConvert Python library.ipynb, Notebook and javascript extension.ipynb, Notebook Basics.ipynb, Overview of IPython.parallel.ipynb, parallel, Rich Display System.ipynb, Running a Secure Public Notebook.ipynb, Running Code.ipynb, Sample.ipynb, soln, Terminal usage.ipynb, text_analysis.py, Typesetting Math Using MathJax.ipynb]\r\n" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "!echo {files[0].upper()}" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "BACKGROUNDJOBS.IPYNB\r\n" + ] + } + ], + "prompt_number": 21 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that all this is available even in multiline blocks:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "for i,f in enumerate(files):\n", + " if f.endswith('ipynb'):\n", + " !echo {\"%02d\" % i} - \"{os.path.splitext(f)[0]}\"\n", + " else:\n", + " print '--'" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "00 - BackgroundJobs\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "01 - Custom Display Logic\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "02 - Customizing IPython - Condensed\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "03 - Customizing IPython - Config\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "04 - Customizing IPython - Extensions\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "05 - Customizing IPython - Magics\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "--\n", + "--\n", + "--\n", + "09 - Index\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "10 - Interactive Widgets\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "11 - IPython - beyond plain Python\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "--\n", + "13 - Markdown Cells\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "--\n", + "--\n", + "16 - NbConvert from command line\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "17 - NbConvert Python library\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "18 - Notebook and javascript extension\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "19 - Notebook Basics\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "20 - Overview of IPython.parallel\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "--\n", + "22 - Rich Display System\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "23 - Running a Secure Public Notebook\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "24 - Running Code\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "25 - Sample\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "--\n", + "27 - Terminal usage\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "--\n", + "29 - Typesetting Math Using MathJax\r\n" + ] + } + ], + "prompt_number": 27 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Beyond Python: magic functions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The IPyhton 'magic' functions are a set of commands, invoked by prepending one or two `%` signs to their name, that live in a namespace separate from your normal Python variables and provide a more command-like interface. They take flags with `--` and arguments without quotes, parentheses or commas. The motivation behind this system is two-fold:\n", + " \n", + "- To provide an orthogonal namespace for controlling IPython itself and exposing other system-oriented functionality.\n", + "\n", + "- To expose a calling mode that requires minimal verbosity and typing while working interactively. Thus the inspiration taken from the classic Unix shell style for commands." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%magic" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 28 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Line vs cell magics:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%timeit range(10)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "10000000 loops, best of 3: 190 ns per loop\n" + ] + } + ], + "prompt_number": 29 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%timeit\n", + "range(10)\n", + "range(100)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1000000 loops, best of 3: 888 ns per loop\n" + ] + } + ], + "prompt_number": 30 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Line magics can be used even inside code blocks:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for i in range(5):\n", + " size = i*100\n", + " print 'size:',size, \n", + " %timeit range(size)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "size: 010000000 loops, best of 3: 129 ns per loop" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " size: 1001000000 loops, best of 3: 649 ns per loop" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " size: 2001000000 loops, best of 3: 1.09 \u00b5s per loop" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " size: 3001000000 loops, best of 3: 1.74 \u00b5s per loop" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + " size: 400100000 loops, best of 3: 2.72 \u00b5s per loop" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "\n" + ] + } + ], + "prompt_number": 31 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Magics can do anything they want with their input, so it doesn't have to be valid Python:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%bash\n", + "echo \"My shell is:\" $SHELL\n", + "echo \"My memory status is:\"\n", + "free" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "My shell is: /bin/bash\n", + "My memory status is:\n", + " total used free shared buffers cached\n", + "Mem: 7870888 6389328 1481560 0 662860 2505172\n", + "-/+ buffers/cache: 3221296 4649592\n", + "Swap: 3905532 4852 3900680\n" + ] + } + ], + "prompt_number": 32 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another interesting cell magic: create any file you want locally from the notebook:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%writefile test.txt\n", + "This is a test file!\n", + "It can contain anything I want...\n", + "\n", + "And more..." + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Writing test.txt\n" + ] + } + ], + "prompt_number": 33 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "!cat test.txt" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "This is a test file!\r\n", + "It can contain anything I want...\r\n", + "\r\n", + "And more..." + ] + } + ], + "prompt_number": 34 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see what other magics are currently defined in the system:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%lsmagic" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "json": [ + "{\"cell\": {\"prun\": \"ExecutionMagics\", \"file\": \"Other\", \"!\": \"OSMagics\", \"capture\": \"ExecutionMagics\", \"timeit\": \"ExecutionMagics\", \"script\": \"ScriptMagics\", \"pypy\": \"Other\", \"system\": \"OSMagics\", \"perl\": \"Other\", \"HTML\": \"Other\", \"bash\": \"Other\", \"python\": \"Other\", \"SVG\": \"Other\", \"javascript\": \"DisplayMagics\", \"writefile\": \"OSMagics\", \"ruby\": \"Other\", \"python3\": \"Other\", \"python2\": \"Other\", \"latex\": \"DisplayMagics\", \"sx\": \"OSMagics\", \"svg\": \"DisplayMagics\", \"html\": \"DisplayMagics\", \"sh\": \"Other\", \"time\": \"ExecutionMagics\", \"debug\": \"ExecutionMagics\"}, \"line\": {\"psource\": \"NamespaceMagics\", \"logstart\": \"LoggingMagics\", \"popd\": \"OSMagics\", \"loadpy\": \"CodeMagics\", \"install_ext\": \"ExtensionMagics\", \"colors\": \"BasicMagics\", \"who_ls\": \"NamespaceMagics\", \"lf\": \"Other\", \"install_profiles\": \"DeprecatedMagics\", \"clk\": \"Other\", \"ll\": \"Other\", \"pprint\": \"BasicMagics\", \"lk\": \"Other\", \"ls\": \"Other\", \"save\": \"CodeMagics\", \"tb\": \"ExecutionMagics\", \"lx\": \"Other\", \"dl\": \"Other\", \"pylab\": \"PylabMagics\", \"dd\": \"Other\", \"quickref\": \"BasicMagics\", \"dx\": \"Other\", \"d\": \"Other\", \"magic\": \"BasicMagics\", \"dhist\": \"OSMagics\", \"edit\": \"KernelMagics\", \"logstop\": \"LoggingMagics\", \"gui\": \"BasicMagics\", \"alias_magic\": \"BasicMagics\", \"debug\": \"ExecutionMagics\", \"page\": \"BasicMagics\", \"logstate\": \"LoggingMagics\", \"ed\": \"Other\", \"pushd\": \"OSMagics\", \"timeit\": \"ExecutionMagics\", \"rehashx\": \"OSMagics\", \"hist\": \"Other\", \"qtconsole\": \"KernelMagics\", \"rm\": \"Other\", \"dirs\": \"OSMagics\", \"run\": \"ExecutionMagics\", \"reset_selective\": \"NamespaceMagics\", \"rep\": \"Other\", \"pinfo2\": \"NamespaceMagics\", \"matplotlib\": \"PylabMagics\", \"automagic\": \"AutoMagics\", \"doctest_mode\": \"KernelMagics\", \"logoff\": \"LoggingMagics\", \"reload_ext\": \"ExtensionMagics\", \"pdb\": \"ExecutionMagics\", \"load\": \"CodeMagics\", \"lsmagic\": \"BasicMagics\", \"cl\": \"Other\", \"autosave\": \"KernelMagics\", \"cd\": \"OSMagics\", \"pastebin\": \"CodeMagics\", \"prun\": \"ExecutionMagics\", \"cp\": \"Other\", \"autocall\": \"AutoMagics\", \"bookmark\": \"OSMagics\", \"connect_info\": \"KernelMagics\", \"mkdir\": \"Other\", \"system\": \"OSMagics\", \"whos\": \"NamespaceMagics\", \"rmdir\": \"Other\", \"unload_ext\": \"ExtensionMagics\", \"store\": \"StoreMagics\", \"more\": \"KernelMagics\", \"pdef\": \"NamespaceMagics\", \"precision\": \"BasicMagics\", \"pinfo\": \"NamespaceMagics\", \"pwd\": \"OSMagics\", \"psearch\": \"NamespaceMagics\", \"reset\": \"NamespaceMagics\", \"recall\": \"HistoryMagics\", \"xdel\": \"NamespaceMagics\", \"xmode\": \"BasicMagics\", \"cat\": \"Other\", \"mv\": \"Other\", \"rerun\": \"HistoryMagics\", \"logon\": \"LoggingMagics\", \"history\": \"HistoryMagics\", \"pycat\": \"OSMagics\", \"unalias\": \"OSMagics\", \"install_default_config\": \"DeprecatedMagics\", \"env\": \"OSMagics\", \"load_ext\": \"ExtensionMagics\", \"config\": \"ConfigMagics\", \"killbgscripts\": \"ScriptMagics\", \"profile\": \"BasicMagics\", \"pfile\": \"NamespaceMagics\", \"less\": \"KernelMagics\", \"who\": \"NamespaceMagics\", \"notebook\": \"BasicMagics\", \"man\": \"KernelMagics\", \"sx\": \"OSMagics\", \"macro\": \"ExecutionMagics\", \"clear\": \"KernelMagics\", \"alias\": \"OSMagics\", \"time\": \"ExecutionMagics\", \"sc\": \"OSMagics\", \"ldir\": \"Other\", \"pdoc\": \"NamespaceMagics\"}}" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 35, + "text": [ + "Available line magics:\n", + "%alias %alias_magic %autocall %automagic %autosave %bookmark %cat %cd %cl %clear %clk %colors %config %connect_info %cp %d %dd %debug %dhist %dirs %dl %doctest_mode %dx %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n", + "\n", + "Available cell magics:\n", + "%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%latex %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n", + "\n", + "Automagic is ON, % prefix IS NOT needed for line magics." + ] + } + ], + "prompt_number": 35 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Running normal Python code: execution and errors" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Not only can you input normal Python code, you can even paste straight from a Python or IPython shell session:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + ">>> # Fibonacci series:\n", + "... # the sum of two elements defines the next\n", + "... a, b = 0, 1\n", + ">>> while b < 10:\n", + "... print b\n", + "... a, b = b, a+b" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1\n", + "1\n", + "2\n", + "3\n", + "5\n", + "8\n" + ] + } + ], + "prompt_number": 36 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "In [1]: for i in range(10):\n", + " ...: print i,\n", + " ...: " + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0 1 2 3 4 5 6 7 8 9\n" + ] + } + ], + "prompt_number": 37 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And when your code produces errors, you can control how they are displayed with the `%xmode` magic:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%writefile mod.py\n", + "\n", + "def f(x):\n", + " return 1.0/(x-1)\n", + "\n", + "def g(y):\n", + " return f(y+1)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Writing mod.py\n" + ] + } + ], + "prompt_number": 38 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's call the function `g` with an argument that would produce an error:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import mod\n", + "mod.g(0)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "float division by zero", + "output_type": "pyerr", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmod\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mmod\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mg\u001b[1;34m(y)\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mf\u001b[1;34m(x)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[1;36m1.0\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mZeroDivisionError\u001b[0m: float division by zero" + ] + } + ], + "prompt_number": 39 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%xmode plain\n", + "mod.g(0)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Exception reporting mode: Plain\n" + ] + }, + { + "ename": "ZeroDivisionError", + "evalue": "float division by zero", + "output_type": "pyerr", + "traceback": [ + "Traceback \u001b[1;36m(most recent call last)\u001b[0m:\n", + " File \u001b[0;32m\"\"\u001b[0m, line \u001b[0;32m2\u001b[0m, in \u001b[0;35m\u001b[0m\n mod.g(0)\n", + " File \u001b[0;32m\"mod.py\"\u001b[0m, line \u001b[0;32m6\u001b[0m, in \u001b[0;35mg\u001b[0m\n return f(y+1)\n", + "\u001b[1;36m File \u001b[1;32m\"mod.py\"\u001b[1;36m, line \u001b[1;32m3\u001b[1;36m, in \u001b[1;35mf\u001b[1;36m\u001b[0m\n\u001b[1;33m return 1.0/(x-1)\u001b[0m\n", + "\u001b[1;31mZeroDivisionError\u001b[0m\u001b[1;31m:\u001b[0m float division by zero\n" + ] + } + ], + "prompt_number": 40 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%xmode verbose\n", + "mod.g(0)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Exception reporting mode: Verbose\n" + ] + }, + { + "ename": "ZeroDivisionError", + "evalue": "float division by zero", + "output_type": "pyerr", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmagic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mu'xmode verbose'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mmod\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m \u001b[1;36mglobal\u001b[0m \u001b[0;36mmod.g\u001b[0m \u001b[1;34m= \u001b[0m\n", + "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mg\u001b[1;34m(y=0)\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m \u001b[1;36mglobal\u001b[0m \u001b[0;36mf\u001b[0m \u001b[1;34m= \u001b[0m\u001b[1;34m\n \u001b[0m\u001b[0;36my\u001b[0m \u001b[1;34m= 0\u001b[0m\n", + "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mf\u001b[1;34m(x=1)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[1;36m1.0\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36mx\u001b[0m \u001b[1;34m= 1\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mZeroDivisionError\u001b[0m: float division by zero" + ] + } + ], + "prompt_number": 41 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The default `%xmode` is \"context\", which shows additional context but not all local variables. Let's restore that one for the rest of our session." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%xmode context" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Exception reporting mode: Context\n" + ] + } + ], + "prompt_number": 42 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Running code in other languages with special `%%` magics" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%perl\n", + "@months = (\"July\", \"August\", \"September\");\n", + "print $months[0];" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "July" + ] + } + ], + "prompt_number": 43 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%ruby\n", + "name = \"world\"\n", + "puts \"Hello #{name.capitalize}!\"" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Hello World!\n" + ] + } + ], + "prompt_number": 44 + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Exercise" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write a cell that executes in Bash and prints your current working directory as well as the date.\n", + "\n", + "Apologies to Windows users who may not have Bash available, not sure how to obtain the equivalent result with `cmd.exe` or Powershell." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%load soln/bash-script" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Raw Input in the notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since 1.0 the IPython notebook web application support `raw_input` which for example allow us to invoke the `%debug` magic in the notebook:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "mod.g(0)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "float division by zero", + "output_type": "pyerr", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mmod\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mg\u001b[1;34m(y)\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m/home/fperez/ipython/tutorial/notebooks/mod.py\u001b[0m in \u001b[0;36mf\u001b[1;34m(x)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[1;36m1.0\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mZeroDivisionError\u001b[0m: float division by zero" + ] + } + ], + "prompt_number": 45 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%debug" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "> \u001b[0;32m/Users/bussonniermatthias/ipython-in-depth/notebooks/mod.py\u001b[0m(3)\u001b[0;36mf\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m 2 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m----> 3 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m 4 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "ipdb> x\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "ipdb> up\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "> \u001b[0;32m/Users/bussonniermatthias/ipython-in-depth/notebooks/mod.py\u001b[0m(6)\u001b[0;36mg\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m 4 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m 5 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m----> 6 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "ipdb> y\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "ipdb> up\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "> \u001b[0;32m\u001b[0m(1)\u001b[0;36m\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m----> 1 \u001b[0;31m\u001b[0mmod\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "ipdb> exit\n" + ] + } + ], + "prompt_number": 38 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Don't foget to exit your debugging session. Raw input can of course be use to ask for user input:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "enjoy = raw_input('Are you enjoying this tutorial ?')\n", + "print 'enjoy is :', enjoy" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "Are you enjoying this tutorial ?Yes !\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "enjoy is : Yes !\n" + ] + } + ], + "prompt_number": 39 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Plotting in the notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This magic configures matplotlib to render its figures inline:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%matplotlib inline" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 46 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 47 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x = np.linspace(0, 2*np.pi, 300)\n", + "y = np.sin(x**2)\n", + "plt.plot(x, y)\n", + "plt.title(\"A little chirp\")\n", + "fig = plt.gcf() # let's keep the figure object around for later..." + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 48 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "The IPython kernel/client model" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%connect_info" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "{\n", + " \"stdin_port\": 50023, \n", + " \"ip\": \"127.0.0.1\", \n", + " \"control_port\": 50024, \n", + " \"hb_port\": 50025, \n", + " \"signature_scheme\": \"hmac-sha256\", \n", + " \"key\": \"b54b8859-d64d-48bb-814a-909f9beb3316\", \n", + " \"shell_port\": 50021, \n", + " \"transport\": \"tcp\", \n", + " \"iopub_port\": 50022\n", + "}\n", + "\n", + "Paste the above JSON into a file, and connect with:\n", + " $> ipython --existing \n", + "or, if you are local, you can connect with just:\n", + " $> ipython --existing kernel-30f00f4a-230c-4e64-bea5-0e5f6a52cb40.json \n", + "or even just:\n", + " $> ipython --existing \n", + "if this is the most recent IPython session you have started.\n" + ] + } + ], + "prompt_number": 43 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can connect automatically a Qt Console to the currently running kernel with the `%qtconsole` magic, or by typing `ipython console --existing ` in any terminal:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%qtconsole" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 83 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/examples/IPython Kernel/Capturing Output.ipynb b/examples/IPython Kernel/Capturing Output.ipynb new file mode 100644 index 0000000..6365a89 --- /dev/null +++ b/examples/IPython Kernel/Capturing Output.ipynb @@ -0,0 +1,332 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:df6354daf203e842bc040989d149760382d8ceec769160e4efe8cde9dfcb9107" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Capturing Output With %%capture" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IPython has a [cell magic](Cell Magics.ipynb), `%%capture`, which captures the stdout/stderr of a cell. With this magic you can discard these streams or store them in a variable." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from __future__ import print_function\n", + "import sys" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "By default, `%%capture` discards these streams. This is a simple way to suppress unwanted output." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%capture\n", + "print('hi, stdout')\n", + "print('hi, stderr', file=sys.stderr)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you specify a name, then stdout/stderr will be stored in an object in your namespace." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%capture captured\n", + "print('hi, stdout')\n", + "print('hi, stderr', file=sys.stderr)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 11 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "captured" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 12, + "text": [ + "" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Calling the object writes the output to stdout/stderr as appropriate." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "captured()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "hi, stdout\n" + ] + }, + { + "output_type": "stream", + "stream": "stderr", + "text": [ + "hi, stderr\n" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "captured.stdout" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 14, + "text": [ + "'hi, stdout\\n'" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "captured.stderr" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 15, + "text": [ + "'hi, stderr\\n'" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`%%capture` grabs all output types, not just stdout/stderr, so you can do plots and use IPython's display system inside `%%capture`" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 16 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%capture wontshutup\n", + "\n", + "print(\"setting up X\")\n", + "x = np.linspace(0,5,1000)\n", + "print(\"step 2: constructing y-data\")\n", + "y = np.sin(x)\n", + "print(\"step 3: display info about y\")\n", + "plt.plot(x,y)\n", + "print(\"okay, I'm done now\")" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 17 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "wontshutup()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "setting up X\n", + "step 2: constructing y-data\n", + "step 3: display info about y\n", + "okay, I'm done now\n" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nEfGbE9cVJiSYYxQ8HliyxByYdvCgafFceaW53aphQ3OoWlFOzNy7F/7v/8xr3TpYs8b8vm1bc2TD\no49CvXolz33OQt+lSxd27dp11j+fOHEiPXr0OO8XDwkJKXkyEREHu+giuPZa80pJgZwcU6AzMuCV\nV8yoPzcXqlUzxyzUqAEXXGA+1+uF/fvNaZp79ph/1qCBebVqZVb8tGwJF17oo7DeUkpMTPRu2LCh\nwD9bs2aNt2vXric/njhxonfSpEkFPluvXj0voJdeeumlVzFe9erVO2+d9knrxltIcyo+Pp5t27ax\nY8cOateuzdy5c0lNTS3w2e1OXL8kIuICJZ6MXbBgAZGRkWRkZNC9e3euu+46AL7//nu6d+8OQGho\nKCkpKXTt2pVGjRrRp08fYmNjfZNcRESKxDFHIIiIiH9Y3xmrDVWnDBo0iLCwMJoGyiEbfpKdnU2H\nDh1o3LgxTZo04aWXXrIdyZpff/2VNm3a0KJFCxo1asQjjzxiO5J1+fn5xMXFFWlBiJtFRUXRrFkz\n4uLiuPw8ay2tjujz8/Np2LAhK1asIDw8nNatW5Oamhq07Z1Vq1ZRuXJlbr/9djZu3Gg7jjW7du1i\n165dtGjRgl9++YVWrVqxcOHCoP3v4tChQ1SsWJFjx47Rrl07nnvuOdq1a2c7ljUvvPACGzZs4MCB\nAyxevNh2HGvq1q3Lhg0bqF69+nmftTqi14aq0yUkJFCtWjXbMayrWbMmLVq0AKBy5crExsbyfVlu\nQ3SYihUrAnDkyBHy8/OL9BfbrXJyckhLS+OOO+7QabcUvhDmTFYLfUEbqnJzcy0mEqfZsWMHWVlZ\ntGnTxnYUa44fP06LFi0ICwujQ4cONGrUyHYka+6//34mT55MuXLWu87WhYSE0LlzZ+Lj45k+ffo5\nn7X63dKGKjmXX375hZtvvpkpU6ZQuXJl23GsKVeuHJ9//jk5OTl88sknQXsUwpIlS7jsssuIi4vT\naB5IT08nKyuLpUuX8ve//51Vq1YV+qzVQh8eHk52dvbJj7Ozs4mIiLCYSJzi6NGj3HTTTdx66630\n7NnTdhxHqFKlCt27d2f9+vW2o1ixevVqFi9eTN26denXrx8fffQRt99+u+1Y1tSqVQuAP/3pT9x4\n441kZmYW+qzVQv/HDVVHjhxh7ty5JCUl2YwkDuD1ehk8eDCNGjVi5MiRtuNYtWfPHvbt2wfA4cOH\n+eCDD4iLi7Ocyo6JEyeSnZ3Nt99+y5w5c+jYsSOzZs2yHcuKQ4cOceDAAQAOHjzI8uXLz7laz2qh\n14aq0/VNJLb3AAAAlUlEQVTr14+2bduydetWIiMjmTFjhu1IVqSnpzN79mxWrlxJXFwccXFxLFu2\nzHYsK3bu3EnHjh1p0aIFbdq0oUePHnTq1Ml2LEcI5tZvXl4eCQkJJ/+7uP7667nmmmsKfV4bpkRE\nXE5T1yIiLqdCLyLicir0IiIup0IvIuJyKvQiIi6nQi8i4nIq9CIiLqdCLyLicv8PoaUAhzXYTeQA\nAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And you can selectively disable capturing stdout, stderr or rich display, by passing `--no-stdout`, `--no-stderr` and `--no-display`" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%capture cap --no-stderr\n", + "print('hi, stdout')\n", + "print(\"hello, stderr\", file=sys.stderr)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stderr", + "text": [ + "hello, stderr\n" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "cap.stdout" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 20, + "text": [ + "'hi, stdout\\n'" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "cap.stderr" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 21, + "text": [ + "''" + ] + } + ], + "prompt_number": 21 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "cap.outputs" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 22, + "text": [ + "[]" + ] + } + ], + "prompt_number": 22 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/examples/IPython Kernel/Custom Display Logic.ipynb b/examples/IPython Kernel/Custom Display Logic.ipynb new file mode 100644 index 0000000..2e23ac4 --- /dev/null +++ b/examples/IPython Kernel/Custom Display Logic.ipynb @@ -0,0 +1,787 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:86c779d5798c4a68bda7e71c8ef320cb7ba9d7e3d0f1bc4b828ee65f617a5ae3" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Custom Display Logic" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Overview" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As described in the [Rich Output](Rich Output.ipynb) tutorial, the IPython display system can display rich representations of objects in the following formats:\n", + "\n", + "* JavaScript\n", + "* HTML\n", + "* PNG\n", + "* JPEG\n", + "* SVG\n", + "* LaTeX\n", + "* PDF\n", + "\n", + "This Notebook shows how you can add custom display logic to your own classes, so that they can be displayed using these rich representations. There are two ways of accomplishing this:\n", + "\n", + "1. Implementing special display methods such as `_repr_html_` when you define your class.\n", + "2. Registering a display function for a particular existing class.\n", + "\n", + "This Notebook describes and illustrates both approaches." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Import the IPython display functions." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from IPython.display import (\n", + " display, display_html, display_png, display_svg\n", + ")" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Parts of this notebook need the matplotlib inline backend:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%matplotlib inline\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Special display methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The main idea of the first approach is that you have to implement special display methods when you define your class, one for each representation you want to use. Here is a list of the names of the special methods and the values they must return:\n", + "\n", + "* `_repr_html_`: return raw HTML as a string\n", + "* `_repr_json_`: return raw JSON as a string\n", + "* `_repr_jpeg_`: return raw JPEG data\n", + "* `_repr_png_`: return raw PNG data\n", + "* `_repr_svg_`: return raw SVG data as a string\n", + "* `_repr_latex_`: return LaTeX commands in a string surrounded by \"$\"." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As an illustration, we build a class that holds data generated by sampling a Gaussian distribution with given mean and standard deviation. Here is the definition of the `Gaussian` class, which has a custom PNG and LaTeX representation." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from IPython.core.pylabtools import print_figure\n", + "from IPython.display import Image, SVG, Math\n", + "\n", + "class Gaussian(object):\n", + " \"\"\"A simple object holding data sampled from a Gaussian distribution.\n", + " \"\"\"\n", + " def __init__(self, mean=0.0, std=1, size=1000):\n", + " self.data = np.random.normal(mean, std, size)\n", + " self.mean = mean\n", + " self.std = std\n", + " self.size = size\n", + " # For caching plots that may be expensive to compute\n", + " self._png_data = None\n", + " \n", + " def _figure_data(self, format):\n", + " fig, ax = plt.subplots()\n", + " ax.hist(self.data, bins=50)\n", + " ax.set_title(self._repr_latex_())\n", + " ax.set_xlim(-10.0,10.0)\n", + " data = print_figure(fig, format)\n", + " # We MUST close the figure, otherwise IPython's display machinery\n", + " # will pick it up and send it as output, resulting in a double display\n", + " plt.close(fig)\n", + " return data\n", + " \n", + " def _repr_png_(self):\n", + " if self._png_data is None:\n", + " self._png_data = self._figure_data('png')\n", + " return self._png_data\n", + " \n", + " def _repr_latex_(self):\n", + " return r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,\n", + " self.std, self.size)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create an instance of the Gaussian distribution and return it to display the default representation:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x = Gaussian(2.0, 1.0)\n", + "x" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "latex": [ + "$\\mathcal{N}(\\mu=2, \\sigma=1),\\ N=1000$" + ], + "metadata": {}, + "output_type": "pyout", + "png": "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\n", + "prompt_number": 4, + "text": [ + "<__main__.Gaussian at 0x106e7ae10>" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also pass the object to the `display` function to display the default representation:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display(x)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "latex": [ + "$\\mathcal{N}(\\mu=2, \\sigma=1),\\ N=1000$" + ], + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "<__main__.Gaussian at 0x106e7ae10>" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `display_png` to view the PNG representation:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display_png(x)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n" + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "It is important to note a subtle different between display and display_png. The former computes all representations of the object, and lets the notebook UI decide which to display. The later only computes the PNG representation.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a new Gaussian with different parameters:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x2 = Gaussian(0, 2, 2000)\n", + "x2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "latex": [ + "$\\mathcal{N}(\\mu=0, \\sigma=2),\\ N=2000$" + ], + "metadata": {}, + "output_type": "pyout", + "png": "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\nTkSuQmCC\n", + "prompt_number": 7, + "text": [ + "<__main__.Gaussian at 0x106e9ce90>" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can then compare the two Gaussians by displaying their histograms:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display_png(x)\n", + "display_png(x2)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n" + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nTkSuQmCC\n" + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that like `print`, you can call any of the `display` functions multiple times in a cell." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Adding IPython display support to existing objects" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you are directly writing your own classes, you can adapt them for display in IPython by following the above approach. But in practice, you often need to work with existing classes that you can't easily modify. We now illustrate how to add rich output capabilities to existing objects. We will use the NumPy polynomials and change their default representation to be a formatted LaTeX expression." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, consider how a NumPy polynomial object renders by default:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "p = np.polynomial.Polynomial([1,2,3], [-10, 10])\n", + "p" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 9, + "text": [ + "Polynomial([ 1., 2., 3.], [-10., 10.], [-1., 1.])" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, define a function that pretty-prints a polynomial as a LaTeX string:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def poly_to_latex(p):\n", + " terms = ['%.2g' % p.coef[0]]\n", + " if len(p) > 1:\n", + " term = 'x'\n", + " c = p.coef[1]\n", + " if c!=1:\n", + " term = ('%.2g ' % c) + term\n", + " terms.append(term)\n", + " if len(p) > 2:\n", + " for i in range(2, len(p)):\n", + " term = 'x^%d' % i\n", + " c = p.coef[i]\n", + " if c!=1:\n", + " term = ('%.2g ' % c) + term\n", + " terms.append(term)\n", + " px = '$P(x)=%s$' % '+'.join(terms)\n", + " dom = r', $x \\in [%.2g,\\ %.2g]$' % tuple(p.domain)\n", + " return px+dom" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This produces, on our polynomial ``p``, the following:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "poly_to_latex(p)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 11, + "text": [ + "'$P(x)=1+2 x+3 x^2$, $x \\\\in [-10,\\\\ 10]$'" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can render this string using the `Latex` class:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from IPython.display import Latex\n", + "Latex(poly_to_latex(p))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "latex": [ + "$P(x)=1+2 x+3 x^2$, $x \\in [-10,\\ 10]$" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 12, + "text": [ + "" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, you can configure IPython to do this automatically by registering the `Polynomial` class and the `plot_to_latex` function with an IPython display formatter. Let's look at the default formatters provided by IPython:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ip = get_ipython()\n", + "for mime, formatter in ip.display_formatter.formatters.items():\n", + " print '%24s : %s' % (mime, formatter.__class__.__name__)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " text/plain : PlainTextFormatter\n", + " image/jpeg : JPEGFormatter\n", + " text/html : HTMLFormatter\n", + " image/svg+xml : SVGFormatter\n", + " image/png : PNGFormatter\n", + " application/javascript : JavascriptFormatter\n", + " text/markdown : MarkdownFormatter\n", + " text/latex : LatexFormatter\n", + " application/json : JSONFormatter\n", + " application/pdf : PDFFormatter\n" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `formatters` attribute is a dictionary keyed by MIME types. To define a custom LaTeX display function, you want a handle on the `text/latex` formatter:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ip = get_ipython()\n", + "latex_f = ip.display_formatter.formatters['text/latex']" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The formatter object has a couple of methods for registering custom display functions for existing types." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "help(latex_f.for_type)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Help on method for_type in module IPython.core.formatters:\n", + "\n", + "for_type(self, typ, func=None) method of IPython.core.formatters.LatexFormatter instance\n", + " Add a format function for a given type.\n", + " \n", + " Parameters\n", + " -----------\n", + " typ : type or '__module__.__name__' string for a type\n", + " The class of the object that will be formatted using `func`.\n", + " func : callable\n", + " A callable for computing the format data.\n", + " `func` will be called with the object to be formatted,\n", + " and will return the raw data in this formatter's format.\n", + " Subclasses may use a different call signature for the\n", + " `func` argument.\n", + " \n", + " If `func` is None or not specified, there will be no change,\n", + " only returning the current value.\n", + " \n", + " Returns\n", + " -------\n", + " oldfunc : callable\n", + " The currently registered callable.\n", + " If you are registering a new formatter,\n", + " this will be the previous value (to enable restoring later).\n", + "\n" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "help(latex_f.for_type_by_name)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Help on method for_type_by_name in module IPython.core.formatters:\n", + "\n", + "for_type_by_name(self, type_module, type_name, func=None) method of IPython.core.formatters.LatexFormatter instance\n", + " Add a format function for a type specified by the full dotted\n", + " module and name of the type, rather than the type of the object.\n", + " \n", + " Parameters\n", + " ----------\n", + " type_module : str\n", + " The full dotted name of the module the type is defined in, like\n", + " ``numpy``.\n", + " type_name : str\n", + " The name of the type (the class name), like ``dtype``\n", + " func : callable\n", + " A callable for computing the format data.\n", + " `func` will be called with the object to be formatted,\n", + " and will return the raw data in this formatter's format.\n", + " Subclasses may use a different call signature for the\n", + " `func` argument.\n", + " \n", + " If `func` is None or unspecified, there will be no change,\n", + " only returning the current value.\n", + " \n", + " Returns\n", + " -------\n", + " oldfunc : callable\n", + " The currently registered callable.\n", + " If you are registering a new formatter,\n", + " this will be the previous value (to enable restoring later).\n", + "\n" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, we will use `for_type_by_name` to register `poly_to_latex` as the display function for the `Polynomial` type:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "latex_f.for_type_by_name('numpy.polynomial.polynomial',\n", + " 'Polynomial', poly_to_latex)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the custom display function has been registered, all NumPy `Polynomial` instances will be represented by their LaTeX form instead:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "p" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "latex": [ + "$P(x)=1+2 x+3 x^2$, $x \\in [-10,\\ 10]$" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 19, + "text": [ + "Polynomial([ 1., 2., 3.], [-10., 10.], [-1., 1.])" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "p2 = np.polynomial.Polynomial([-20, 71, -15, 1])\n", + "p2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "latex": [ + "$P(x)=-20+71 x+-15 x^2+x^3$, $x \\in [-1,\\ 1]$" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 20, + "text": [ + "Polynomial([-20., 71., -15., 1.], [-1., 1.], [-1., 1.])" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "More complex display with `_ipython_display_`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rich output special methods and functions can only display one object or MIME type at a time. Sometimes this is not enough if you want to display multiple objects or MIME types at once. An example of this would be to use an HTML representation to put some HTML elements in the DOM and then use a JavaScript representation to add events to those elements.\n", + "\n", + "**IPython 2.0** recognizes another display method, `_ipython_display_`, which allows your objects to take complete control of displaying themselves. If this method is defined, IPython will call it, and make no effort to display the object using the above described `_repr_*_` methods for custom display functions. It's a way for you to say \"Back off, IPython, I can display this myself.\" Most importantly, your `_ipython_display_` method can make multiple calls to the top-level `display` functions to accomplish its goals.\n", + "\n", + "Here is an object that uses `display_html` and `display_javascript` to make a plot using the [Flot](http://www.flotcharts.org/) JavaScript plotting library:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import json\n", + "import uuid\n", + "from IPython.display import display_javascript, display_html, display\n", + "\n", + "class FlotPlot(object):\n", + " def __init__(self, x, y):\n", + " self.x = x\n", + " self.y = y\n", + " self.uuid = str(uuid.uuid4())\n", + " \n", + " def _ipython_display_(self):\n", + " json_data = json.dumps(zip(self.x, self.y))\n", + " display_html('
'.format(self.uuid),\n", + " raw=True\n", + " )\n", + " display_javascript(\"\"\"\n", + " require([\"//cdnjs.cloudflare.com/ajax/libs/flot/0.8.2/jquery.flot.min.js\"], function() {\n", + " var line = JSON.parse(\"%s\");\n", + " console.log(line);\n", + " $.plot(\"#%s\", [line]);\n", + " });\n", + " \"\"\" % (json_data, self.uuid), raw=True)\n" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 21 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import numpy as np\n", + "x = np.linspace(0,10)\n", + "y = np.sin(x)\n", + "FlotPlot(x, np.sin(x))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "html": [ + "
" + ], + "metadata": {}, + "output_type": "display_data" + }, + { + "javascript": [ + "\n", + " require([\"//cdnjs.cloudflare.com/ajax/libs/flot/0.8.2/jquery.flot.min.js\"], function() {\n", + " var line = JSON.parse(\"[[0.0, 0.0], [0.20408163265306123, 0.20266793654820095], [0.40816326530612246, 0.39692414892492234], [0.61224489795918369, 0.57470604121617908], [0.81632653061224492, 0.72863478346935029], [1.0204081632653061, 0.85232156971961837], [1.2244897959183674, 0.94063278511248671], [1.4285714285714286, 0.98990307637212394], [1.6326530612244898, 0.99808748213471832], [1.8367346938775511, 0.96484630898376322], [2.0408163265306123, 0.89155923041100371], [2.2448979591836737, 0.7812680235262639], [2.4489795918367347, 0.63855032022660208], [2.6530612244897958, 0.46932961277720098], [2.8571428571428572, 0.28062939951435684], [3.0612244897959187, 0.080281674842813497], [3.2653061224489797, -0.12339813736217871], [3.4693877551020407, -0.32195631507261868], [3.6734693877551021, -0.50715170948451438], [3.8775510204081636, -0.67129779355193209], [4.0816326530612246, -0.80758169096833643], [4.2857142857142856, -0.91034694431078278], [4.4897959183673475, -0.97532828606704558], [4.6938775510204085, -0.99982866838408957], [4.8979591836734695, -0.98283120392563061], [5.1020408163265305, -0.92504137173820289], [5.3061224489795915, -0.82885773637304272], [5.5102040816326534, -0.69827239556539955], [5.7142857142857144, -0.53870528838615628], [5.9183673469387754, -0.35677924089893803], [6.1224489795918373, -0.16004508604325057], [6.3265306122448983, 0.043331733368683463], [6.5306122448979593, 0.24491007101197931], [6.7346938775510203, 0.43632342647181932], [6.9387755102040813, 0.6096271964908323], [7.1428571428571432, 0.75762841539272019], [7.3469387755102042, 0.87418429881973347], [7.5510204081632653, 0.95445719973875187], [7.7551020408163271, 0.99511539477766364], [7.9591836734693882, 0.99447136726361685], [8.1632653061224492, 0.95255184753146038], [8.3673469387755102, 0.87109670348232071], [8.5714285714285712, 0.75348672743963763], [8.7755102040816322, 0.60460331650615429], [8.979591836734695, 0.43062587038273736], [9.183673469387756, 0.23877531564403087], [9.387755102040817, 0.037014401485062368], [9.591836734693878, -0.16628279384875641], [9.795918367346939, -0.36267842882654883], [10.0, -0.54402111088936989]]\");\n", + " console.log(line);\n", + " $.plot(\"#e75b8189-92cb-4cbb-9996-bb8ad5ff1b4e\", [line]);\n", + " });\n", + " " + ], + "metadata": {}, + "output_type": "display_data" + } + ], + "prompt_number": 22 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/examples/IPython Kernel/Index.ipynb b/examples/IPython Kernel/Index.ipynb index 7ae884a..5627e30 100644 --- a/examples/IPython Kernel/Index.ipynb +++ b/examples/IPython Kernel/Index.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:b0cbc510e3a2cd2333bc169f96a4e2e29d892cef880222c00f53b067f2d4f257" + "signature": "sha256:ee769d05a7e195e4b8546ef9a866ef03e59bff2f0fcba499d168c06b516aa79a" }, "nbformat": 3, "nbformat_minor": 0, @@ -50,7 +50,11 @@ "metadata": {}, "source": [ "* [Cell Magics](Cell Magics.ipynb)\n", - "* [Script Magics](Script Magics.ipynb)" + "* [Script Magics](Script Magics.ipynb)\n", + "* [Rich Output](Rich Output.ipynb)\n", + "* [Custom Display Logic](Custom Display Logic.ipynb)\n", + "* [Plotting in the Notebook](Plotting in the Notebook.ipynb)\n", + "* [Capturing Output](Capturing Output.ipynb)" ] }, { @@ -65,7 +69,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "* [Background Jobs](Background Jobs.ipynb)" + "* [Background Jobs](Background Jobs.ipynb)\n", + "* [Trapezoid Rule](Trapezoid Rule.ipynb)\n", + "* [SymPy](SymPy.ipynb)\n", + "* [Raw Input in the Notebook](Raw Input in the Notebook.ipynb)" ] }, { diff --git a/examples/IPython Kernel/Old Custom Display Logic.ipynb b/examples/IPython Kernel/Old Custom Display Logic.ipynb new file mode 100644 index 0000000..051f1e4 --- /dev/null +++ b/examples/IPython Kernel/Old Custom Display Logic.ipynb @@ -0,0 +1,944 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Defining Custom Display Logic for Your Own Objects" + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Overview" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Python, objects can declare their textual representation using the `__repr__` method. IPython expands on this idea and allows objects to declare other, richer representations including:\n", + "\n", + "* HTML\n", + "* JSON\n", + "* PNG\n", + "* JPEG\n", + "* SVG\n", + "* LaTeX\n", + "\n", + "This Notebook shows how you can add custom display logic to your own classes, so that they can be displayed using these rich representations. There are two ways of accomplishing this:\n", + "\n", + "1. Implementing special display methods such as `_repr_html_`.\n", + "2. Registering a display function for a particular type.\n", + "\n", + "In this Notebook we show how both approaches work." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before we get started, we will import the various display functions for displaying the different formats we will create." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from IPython.display import display\n", + "from IPython.display import (\n", + " display_html, display_jpeg, display_png,\n", + " display_javascript, display_svg, display_latex\n", + ")" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Implementing special display methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The main idea of the first approach is that you have to implement special display methods, one for each representation you want to use. Here is a list of the names of the special methods and the values they must return:\n", + "\n", + "* `_repr_html_`: return raw HTML as a string\n", + "* `_repr_json_`: return raw JSON as a string\n", + "* `_repr_jpeg_`: return raw JPEG data\n", + "* `_repr_png_`: return raw PNG data\n", + "* `_repr_svg_`: return raw SVG data as a string\n", + "* `_repr_latex_`: return LaTeX commands in a string surrounded by \"$\"." + ] + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Model Citizen: pandas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A prominent example of a package that has IPython-aware rich representations of its objects is [pandas](http://pandas.pydata.org/).\n", + "\n", + "A pandas DataFrame has a rich HTML table representation,\n", + "using `_repr_html_`.\n" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import io\n", + "import pandas" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%%writefile data.csv\n", + "Date,Open,High,Low,Close,Volume,Adj Close\n", + "2012-06-01,569.16,590.00,548.50,584.00,14077000,581.50\n", + "2012-05-01,584.90,596.76,522.18,577.73,18827900,575.26\n", + "2012-04-02,601.83,644.00,555.00,583.98,28759100,581.48\n", + "2012-03-01,548.17,621.45,516.22,599.55,26486000,596.99\n", + "2012-02-01,458.41,547.61,453.98,542.44,22001000,540.12\n", + "2012-01-03,409.40,458.24,409.00,456.48,12949100,454.53\n" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Writing data.csv\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "df = pandas.read_csv(\"data.csv\")\n", + "pandas.set_option('display.notebook_repr_html', False)\n", + "df" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 4, + "text": [ + " Date Open High Low Close Volume Adj Close\n", + "0 2012-06-01 569.16 590.00 548.50 584.00 14077000 581.50\n", + "1 2012-05-01 584.90 596.76 522.18 577.73 18827900 575.26\n", + "2 2012-04-02 601.83 644.00 555.00 583.98 28759100 581.48\n", + "3 2012-03-01 548.17 621.45 516.22 599.55 26486000 596.99\n", + "4 2012-02-01 458.41 547.61 453.98 542.44 22001000 540.12\n", + "5 2012-01-03 409.40 458.24 409.00 456.48 12949100 454.53" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "rich HTML can be activated via `pandas.set_option`." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "pandas.set_option('display.notebook_repr_html', True)\n", + "df" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DateOpenHighLowCloseVolumeAdj Close
0 2012-06-01 569.16 590.00 548.50 584.00 14077000 581.50
1 2012-05-01 584.90 596.76 522.18 577.73 18827900 575.26
2 2012-04-02 601.83 644.00 555.00 583.98 28759100 581.48
3 2012-03-01 548.17 621.45 516.22 599.55 26486000 596.99
4 2012-02-01 458.41 547.61 453.98 542.44 22001000 540.12
5 2012-01-03 409.40 458.24 409.00 456.48 12949100 454.53
\n", + "
" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 5, + "text": [ + " Date Open High Low Close Volume Adj Close\n", + "0 2012-06-01 569.16 590.00 548.50 584.00 14077000 581.50\n", + "1 2012-05-01 584.90 596.76 522.18 577.73 18827900 575.26\n", + "2 2012-04-02 601.83 644.00 555.00 583.98 28759100 581.48\n", + "3 2012-03-01 548.17 621.45 516.22 599.55 26486000 596.99\n", + "4 2012-02-01 458.41 547.61 453.98 542.44 22001000 540.12\n", + "5 2012-01-03 409.40 458.24 409.00 456.48 12949100 454.53" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "lines = df._repr_html_().splitlines()\n", + "print \"\\n\".join(lines[:20])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Exercise" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write a simple `Circle` Python class. Don't even worry about properties such as radius, position, colors, etc. To help you out use the following representations (remember to wrap them in Python strings):\n", + "\n", + "For HTML:\n", + "\n", + " ○\n", + "\n", + "For SVG:\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "For LaTeX (wrap with `$` and use a raw Python string):\n", + "\n", + " \\bigcirc\n", + "\n", + "After you write the class, create an instance and then use `display_html`, `display_svg` and `display_latex` to display those representations.\n", + "\n", + "Tips : you can slightly tweek the representation to know from which `_repr_*_` method it came from. \n", + "For example in my solution the svg representation is blue, and the HTML one show \"`HTML`\" between brackets." + ] + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Solution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is my simple `MyCircle` class:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%load soln/mycircle.py" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now create an instance and use the display methods:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "c = MyCircle()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 11 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display_html(c)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "html": [ + "○ (html)" + ], + "metadata": {}, + "output_type": "display_data" + } + ], + "prompt_number": 12 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display_svg(c)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "svg": [ + "\n", + " \n", + " " + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display_latex(c)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "latex": [ + "$\\bigcirc \\LaTeX$" + ], + "metadata": {}, + "output_type": "display_data" + } + ], + "prompt_number": 14 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display_javascript(c)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "javascript": [ + "alert('I am a circle!');" + ], + "metadata": {}, + "output_type": "display_data" + } + ], + "prompt_number": 15 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Adding IPython display support to existing objects" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you are directly writing your own classes, you can adapt them for display in IPython by following the above example. But in practice, we often need to work with existing code we can't modify. We now illustrate how to add these kinds of extended display capabilities to existing objects. To continue with our example above, we will add a PNG representation to our `Circle` class using Matplotlib." + ] + }, + { + "cell_type": "heading", + "level": 3, + "metadata": {}, + "source": [ + "Model citizen: sympy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[SymPy](http://sympy.org) is another model citizen that defines rich representations of its object.\n", + "Unlike pandas above, sympy registers display formatters via IPython's display formatter API, rather than declaring `_repr_mime_` methods." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from sympy import Rational, pi, exp, I, symbols\n", + "x, y, z = symbols(\"x y z\")" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 16 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "r = Rational(3,2)*pi + exp(I*x) / (x**2 + y)\n", + "r" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 17, + "text": [ + "3*pi/2 + exp(I*x)/(x**2 + y)" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "SymPy provides an `init_printing` function that sets up advanced $\\LaTeX$\n", + "representations of its objects." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from sympy.interactive.printing import init_printing\n", + "init_printing()\n", + "r" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "latex": [ + "$$\\frac{3}{2} \\pi + \\frac{e^{\\mathbf{\\imath} x}}{x^{2} + y}$$" + ], + "metadata": {}, + "output_type": "pyout", + "png": "iVBORw0KGgoAAAANSUhEUgAAAFAAAAAlCAYAAADV/m7fAAAABHNCSVQICAgIfAhkiAAAA9xJREFU\naIHt2l2IVVUUwPHfzDQ4hc1UFpaVTvoiKNoHaTCmU/lQaERR9mGUZBSkUVEQvcR9CSKIoCgoom5F\nBX2T+RD6EBQVZI1BBoVSFA0JUkNiiX1MD+uc5szkOPfjnHvvyP3DwF4z96y1Zp+91l577Uubuuho\ntgMNYikG8TU+wwosxs9YjTvwWy2Kj8mMV2IeZiTGythem78txwjmYitOxHs4G7vwthonbyL7cHMy\nvga/4/g8FLcAx+FVnIVesXDeRScW1KM4uwIH8V0yHkV3PYpbjFnifzsDt2J3Il+Mg9hTq+LJcuAr\nYnk/VKviJtKJe3AIv2I2Hi3SWJZzcR8O4LGijBbM0yKynsCbOKkZTtyGzzGzAbaWGJ9K6mEh/hC5\nfD1uETmvcC7AXpFkU0dGcXUDbJfRn5Oua7EjJ10VkYbwXyLnDSfyfPyJnY10Jge+FZtCSofYNAqr\nd9PQ2YHnsBn/iEJzrditsvTiGVyBnkl0jmIVPszb2QoYEnnvLvyCY7El8akQqnkzHaLoHMKnuEpU\n9d/jbjwldr6D+Fi8iEooo5ToOaq5CZdl5NfRlYy31KG3LL8c2HCq2f1ezIxPSJ79W1T5p+Tp1HSi\n1vJhPT5JxgvFRE7FC+JQP5G5WCbCfyIbRTnV8oxO8TORnTg/Ga/BN3XYLqsshKfysSk/6QqsZjNJ\nuzZfJHKvWEU9xpcQeTOVj53YJHZeeKRAX8YZrZZ7sc1Y2A6LyVudl1M1sgbviIlbjvMaYTQ7gcvF\nIbwkJmjlJM8sxbMZeQg/qO1l5MkCXJ+M9+DMRhqfiYcz8jrRDzy9AbbL8iljZhjrX76POTnorJgl\novBNm4u9Ikmua4Dtx3FqjvouxAM56quIDhHCaaJeJCbwnEY7Uid9eLDZTsBLCmxCFsgm0UnvVt2m\ntjlPJzaKnWy63djdIC6H9olO9OIqni3l5cRaMYFEadKfl+KcGMAG0S2/EbfjLdF+q4fSJL/vElee\nz4vTEpwsczrKlh6rxP3BVpHUL8VpdTqWJ73i2FjGB7hTtO/3i4qhCK4UTZPsYroIP6YfSMN0Pr70\n/xZ+n5zuTHOgR1QKh0TJNWJ86VUps0X7LZuiVuCjjLxfXKj1JfJuMYEH8GQiT9c7I0QIpWfxviN9\nsEJKR/jbdXgjI+8Sl29o/umhGi4XJ6V+sUEMiVW0oWC7c4zdG/cn8n9XHV2HeaBVGRD16SxxXbBM\n1KmvidCqh0GRVw/HXvFNjW7xAofxcp32jjrur/Bz20St2aZCFuEnkSoG8JWxdhmmVwg3g04xefNw\nifjCwUhTPWrTpk2bFuJflVvSLV1580UAAAAASUVORK5CYII=\n", + "prompt_number": 18, + "text": [ + " \u2148\u22c5x \n", + "3\u22c5\u03c0 \u212f \n", + "\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\n", + " 2 2 \n", + " x + y" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To add a display method to an existing class, we must use IPython's display formatter API. Here we show all of the available formatters:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ip = get_ipython()\n", + "for mime, formatter in ip.display_formatter.formatters.items():\n", + " print '%24s : %s' % (mime, formatter.__class__.__name__)\n" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " text/html : HTMLFormatter\n", + " image/jpeg : JPEGFormatter\n", + " image/svg+xml : SVGFormatter\n", + " image/png : PNGFormatter\n", + " application/javascript : JavascriptFormatter\n", + " text/latex : LatexFormatter\n", + " application/json : JSONFormatter\n", + " text/plain : PlainTextFormatter\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's grab the PNG formatter:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "png_f = ip.display_formatter.formatters['image/png']" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 20 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will use the `for_type` method to register our display function." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "png_f.for_type?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 21 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As the docstring describes, we need to define a function the takes the object as a parameter and returns the raw PNG data." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 22 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "class AnotherCircle(object):\n", + " def __init__(self, radius=1, center=(0,0), color='r'):\n", + " self.radius = radius\n", + " self.center = center\n", + " self.color = color\n", + " \n", + " def __repr__(self):\n", + " return \"<%s Circle with r=%s at %s>\" % (\n", + " self.color,\n", + " self.radius,\n", + " self.center,\n", + " )\n", + " \n", + "c = AnotherCircle()\n", + "c" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 23, + "text": [ + "" + ] + } + ], + "prompt_number": 23 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from IPython.core.pylabtools import print_figure\n", + "\n", + "def png_circle(circle):\n", + " \"\"\"Render AnotherCircle to png data using matplotlib\"\"\"\n", + " fig, ax = plt.subplots()\n", + " patch = plt.Circle(circle.center,\n", + " radius=circle.radius,\n", + " fc=circle.color,\n", + " )\n", + " ax.add_patch(patch)\n", + " plt.axis('scaled')\n", + " data = print_figure(fig, 'png')\n", + " # We MUST close the figure, otherwise IPython's display machinery\n", + " # will pick it up and send it as output, resulting in a double display\n", + " plt.close(fig)\n", + " return data" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 24 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "c = AnotherCircle()\n", + "print repr(png_circle(c)[:10])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "'\\x89PNG\\r\\n\\x1a\\n\\x00\\x00'\n" + ] + } + ], + "prompt_number": 27 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we register the display function for the type:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "png_f.for_type(AnotherCircle, png_circle)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 28 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now all `Circle` instances have PNG representations!" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "c2 = AnotherCircle(radius=2, center=(1,0), color='g')\n", + "c2" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "png": "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\nTkSuQmCC\n", + "prompt_number": 29, + "text": [ + "" + ] + } + ], + "prompt_number": 29 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display_png(c2)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nTkSuQmCC\n" + } + ], + "prompt_number": 30 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "return the object" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# for demonstration purpose, I do the same with a circle that has no _repr_javascript method\n", + "class MyNoJSCircle(MyCircle):\n", + " \n", + " def _repr_javascript_(self):\n", + " return\n", + "\n", + "cNoJS = MyNoJSCircle()" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course you can now still return the object, and this will use compute all the representations, store them in the notebook and show you the appropriate one." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "cNoJS" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or just use `display(object)` if you are in a middle of a loop" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for i in range(3):\n", + " display(cNoJS)" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Advantage of using `display()` versus `display_*()` is that all representation will be stored in the notebook document and notebook file, they are then availlable for other frontends or post-processing tool like `nbconvert`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's compare `display()` vs `display_html()` for our circle in the Notebook Web-app and we'll see later the difference in nbconvert." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print \"I should see a nice html circle in web-app, but\"\n", + "print \"nothing if the format I'm viewing the notebook in\"\n", + "print \"does not support html\"\n", + "display_html(cNoJS)" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print \"Whatever the format I will see a representation\"\n", + "print \"of my circle\"\n", + "display(cNoJS)" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print \"Same if I return the object\"\n", + "cNoJS" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print \"But not if I print it\"\n", + "print cNoJS" + ], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/examples/Notebook/Plotting with Matplotlib.ipynb b/examples/IPython Kernel/Plotting in the Notebook.ipynb similarity index 100% rename from examples/Notebook/Plotting with Matplotlib.ipynb rename to examples/IPython Kernel/Plotting in the Notebook.ipynb diff --git a/examples/Notebook/Raw Input.ipynb b/examples/IPython Kernel/Raw Input in the Notebook.ipynb similarity index 100% rename from examples/Notebook/Raw Input.ipynb rename to examples/IPython Kernel/Raw Input in the Notebook.ipynb diff --git a/examples/Notebook/Display System.ipynb b/examples/IPython Kernel/Rich Output.ipynb similarity index 59% rename from examples/Notebook/Display System.ipynb rename to examples/IPython Kernel/Rich Output.ipynb index e05fbfa..83fff95 100644 --- a/examples/Notebook/Display System.ipynb +++ b/examples/IPython Kernel/Rich Output.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:ae010ef95e10f7b6ef5f0b51ab9e540112ad42edc1daf268de29fee0cff73085" + "signature": "sha256:cf83dc9e6288480ac94c44a5983b4ee421f0ade792a9fac64bc00719263386c0" }, "nbformat": 3, "nbformat_minor": 0, @@ -13,14 +13,14 @@ "level": 1, "metadata": {}, "source": [ - "IPython's Rich Display System" + "Rich Output" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "In Python, objects can declare their textual representation using the `__repr__` method. IPython expands on this idea and allows objects to declare other, richer representations including:\n", + "In Python, objects can declare their textual representation using the `__repr__` method. IPython expands on this idea and allows objects to declare other, rich representations including:\n", "\n", "* HTML\n", "* JSON\n", @@ -75,7 +75,10 @@ "cell_type": "code", "collapsed": false, "input": [ - "from IPython.display import display_pretty, display_html, display_jpeg, display_png, display_json, display_latex, display_svg" + "from IPython.display import (\n", + " display_pretty, display_html, display_jpeg,\n", + " display_png, display_json, display_latex, display_svg\n", + ")" ], "language": "python", "metadata": {}, @@ -117,7 +120,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 5 + "prompt_number": 4 }, { "cell_type": "markdown", @@ -139,19 +142,19 @@ "metadata": {}, "output_type": "pyout", "png": "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\n", - "prompt_number": 6, + "prompt_number": 5, "text": [ - "" + "" ] } ], - "prompt_number": 6 + "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Or you can pass it to `display`:" + "Or you can pass an object with a rich representation to `display`:" ] }, { @@ -168,17 +171,17 @@ "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAggAAABDCAYAAAD5/P3lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAH3AAAB9wBYvxo6AAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURB\nVHic7Z15uBxF1bjfugkJhCWBsCSAJGACNg4QCI3RT1lEAVE+UEBNOmwCDcjHT1wQgU+WD3dFxA1o\nCAikAZFFVlnCjizpsCUjHQjBIAkQlpCFJGS79fvjdGf69vTsc2fuza33eeaZmeqq6jM9vZw6dc4p\nBUwC+tE+fqW1fqmRDpRSHjCggS40sBxYDCxKvL8KzNBaL21EPoPB0DPIWVY/4NlE0ffzYfhgu+Qx\nGHoy/YFjaK+CcB3QkIIAHAWs3wRZsuhUSs0CXgQeBm7UWi/spn0Z+jA5yxpEfYruqnwYllRic5a1\nMaWv8U5gaT4M19Sx396IAnZLfB/SLkEMhp5O/3YL0AvoAHaKXl8HLlZK3QZcpbWe0lbJDOsaHuDU\n0e4u4JAy2wPk/C1JzrKWArOQ0fUtwH35MOysQxaDwbCO0NFuAXoh6wPjgQeUUvcqpUa0WyCDoQls\nCIwBjgfuAV7KWdY+7RWpmJxlXZezrEdylvXxdstiMKzrGAtCYxwI/EspdZbW+g/tFsbQ67kQuBHY\nFNgseh9FV6vCbUAeWBC9PgBeq2EfS6J2MQOBrRDTe5KdgAdzlvW1fBjeUUP/3UbOsoYBE6OvG7VT\nFoOhL9Af+BUwFLkZpV+DaY6V4UPkRpb1+ncT+m8nGwK/V0oN01qf025hDL2XfBi+DLycLMtZVo6u\nCsKfGnSq8/NheEpqHwOBEcDBwJnAsGhTP2ByzrJG5cPwnQb22Sy+0G4BDIa+RH+t9dmlNiqlFKIk\nJJWGi+jq5JPmq8BbJJQArfXqpkncczlbKbVQa/3rdgtiMNRCPgxXAK8Ar+Qs63LgXmDvaPPGwPeA\nH7VJvCRfbLcABkNfouwUg9ZaAwuj178BlFLvVejzgR4WFviM1npcuQpKqf6IyXIjxLS7GzAWuUnu\nXsO+fqWUellr3ZBJdq/jr9+BDn1uve07O9Rz0y6f8PtGZGgWe53oT6SBkZ/q1/nHZy47aloTRTKU\nIR+Gy3OWNR6Zxtg0Kv4KRkEwGPocxgcBiCwcsSI0F5iOhF+ilPok8C3gVGS+thK/VErdrbWuO2ys\ns/+aLZTuOKbe9krrIUCPUBB0B+PQ1P1bdKe6EzAKQgvJh+GbOct6gkJkxM45y+qXDIWMHBhjBWJe\nPgyDWvaRs6zPIVObAG/nw/DpEvUGAp8E9gGGJzbtl7Os7cvs4skqp0V0Yl8jgcOBjyMDhbmIZeWl\nfBg+UUVfReQsayhwELAnsAXi6/E28BxwTz4MP6iyn92RaSCA+/NhuCwqXx9R4MYhU0MfRTK/AjyW\nD8MFGd0ZDFVhFIQKaK3/BXxfKXUlklTq0xWafAI4Driyu2UzGLqRlygoCArYHJif2H4gcFb0+Z2c\nZW2bD8NV1XScs6yNgH8g/jsAPwCeTmzfFPgjYsnbiez71MUVdnMQcF8V4nyUs6whwB8QX4+0s2Ys\n0yPAt/NhGFbRZ/wbzgO+DaxXotqqnGX9GbigCkXhf5CBCsDngYdzljURGQhsWqLN+znL+iFwdT4M\ndYk6BkNJTJhjlWitQ2Bf4P4qqv848t8wGHor6Yd9+ruHJFkC2BI4rIa+D6egHKwmstYlGAxMQCwH\nrRjEPI5ER5S7ZvcFXsxZ1phKneUsawSi8HyH0soB0bbvAM9Ebaplt5xlnYkct1LKAYiFZhJwSQ19\nGwxrMRaEGtBar1RKfRX4JxIzXortou3PN1mE+YgJsSwaeoLHOQCqUy3QSr9eqZ6G/gq2aYVMhqrY\nOfF5FeJwvJZ8GM7JWdY/gC9HRS7wtyr7Pjrx+e6MqYC3KLbU7Qhck/h+FJIKvRRVjfSREXicU8EH\npgAvIIqLBZwGfC7avl5Uf29KkLOsTZCMq8npj9sQx89no37HIlaAODplNPBIzrJ2z4dhNVlaT0HC\nXwFmIkrAC4if2PaIz8/3KCgn385Z1pX5MJxeRd8Gw1qMglAjWutlSqnTgUcqVP0SzVYQtP5mcMXE\nSvvtUUy9YsK5QEWHy7EnTB6lOtSsFohkqEDOsgYAdqJoagkT9Z8pKAj75yzr4/kwnF2h748ho/GY\nq9J1oqiKLj4JOctKK8Yz8mH4Yrl9VcnHkXVYTsyHoZ8WJWdZNyPThbF5/3M5yzowH4alpi9+T0E5\nWA18Nx+Gf0zVeRG4KmdZ90R9bwCMRKwyX69C5h2j91uA4/JhuCSxbTYwJWdZtwNPIFbifsAFSISZ\nwVA1ZoqhDrTWjyIjjXIc3ApZDIZu4ELgY4nvt5Wody8wJ/qsgBOr6HsihfvOfCRrY7v5dYZyAECk\nGP0ISEZmZYZ55yxrB8SyEXNxhnKQ7Pt64H8TRUfmLGuXKmWeC4xPKQfJvp9CLCJlZTYYymEUhPq5\ntcL2XVsihcHQJHKWtU3Osi5GnAZj5iKWgiKitRouTxQdl7OscnPu0HV64dp8GLY7R8pyxEGxJPkw\nfBcZ9ceUSvN8IoV76upK/UZcgawcG3NKqYopfleFU+gDic/b5SzLWIwNNWFOmPqp5CG9sVJqPa11\nVZ7dBkOL2D1nWcmcBkOR8MFtgM/QdTXJZcCR+TBcXqa/SYj5egAFZ8VMX4ScZe2FRPnEXF2z9M3n\n3nwYVsrtAmK6/0z0uVR4ZXLtivvzYfhGpU7zYbgkZ1k3ACdHRQdWIQsUO3ZmkUzB3Q/xjaolLbeh\nj2MUhDrRWr+mlFpJ+eV5hyIxz4YWs98Fj/Rf8uZbozo0/ZYt7D8rf9ORK9stUw/hU9GrEnMAp1R+\ngph8GL4bzdNPiIpOorSzYtJ68FS1IYPdTLWp3hcnPm+Q3pizrA7E+TCmFn+aZN0dcpY1LB+G5e4b\ny6rM8bA49X39GmQyGMwUQ4NUGnkMrbDd0A3sdeLk4z6cN+89pTtDTWd+gyErF+7pTv5eu+XqJbyK\nTDHsmg/DJ6tsc2ni8+dzljUqXSGaevhmoqjIObFNVBzlV8kQug4W5tbQNl13WGatAv+poW+DoW6M\nBaExPgC2LrO9nHWhpSilDqI4NPMhrfXUJvS9M/DfqeJXtdY3N9p3rex50uQ9lFKT6BrTvoFCXbTX\nyZNfmnrZxHtbLVMP4xng74nvK5DzeD7wfIWRayb5MHwiZ1kzgF0oOCuemar2ZQoK8zLgr7Xup5t4\ns0n9DEl9b0RBSPeV5q0a+jYY6sYoCI1RacnZ91siRXUMAH6eKnsYicdulDOAY1NlpzWh35pRqG9R\nIuGN7uw4AfG878s8nw/DX3RDv5dScGY8NmdZP86HYXJaJzm9cHMp7/s2UHdK9BTpKaxBNbRN163k\nt9Rux05DH8FMMTTGZhW2v9sSKarjbopNk/sqpUY30qlSahCSGS/JCuD6RvqtF6UpMm/HaHTJbYaG\nmQzED/0umRVzlrUZhXwJ0HOmF5pJOlXyxzJrZbNt6rtZP8HQIzAKQp0opTZAlsItxTKtdTnv75YS\nLR7lpYqrjV0vx2EUH4fbtdZtucnpMqOrDjPy6jYii8DkRFHSYnAEhem22cBjrZKrVeTDcCldTf/p\nh345ksrEGprnF2EwNIRREOrnMxW2z2uJFLVxJcXmy2OVUo34ShydUda+EaIq7T2u0SZTY/eSdFY8\nMGdZm0efk86J6/LCQUnFp5pIkZjkcvQz8mH4YZPkMRgawigI9VNp7v7BlkhRA1rr+RQneNqC2hba\nWYtSajiS9z3JXLomaGktq/VllLIUdKqSWe0MjZMPwxlIel8Q/6Zv5CxrGIX8AJ10XU+hFtIRQ+UW\nKWoXyYyTu+Qsa79KDXKWNRpJyx5zZ9OlMhjqxCgIdaCU6g98o0K1npBCNotLM8rcOvuagCRgSXKN\n1rozq3IrCCZNfFkrfRjotWsCaJinUBODK51/tkuuPkTy/DoYOIDCfeb+fBjW4t2/lqhdcmRdbUri\nVnILXS2HZ1WRvfAcCk61K4A/dYdgBkM9GAWhPr5F6XSrIBf6Qy2SpSaidSReShV/XilV7veUIj29\noOkB2fGmXT7x7sCbOGpFf7VZx4A1m0/znG2nehMyc+0bms7NFJxzxwH7J7Y1OvWUPG9/mLOsLRvs\nr6lEaaOT0TtfBB5ITLWsJWdZg3KWdRNwTKL4wnwYzu9mMQ2GqjFhjjWilBqBpJYtx51a66UV6rST\nS+maJz52VvxRdvVilFK7UbzexGNa67Kr+bWS6X+ekPYs79HkLGt34JOI+Xyz6D2d1vfMnGUdini6\nL0C851/Oh2HD+SyaQT4MV+YsaxJyLm1Gwf9gAXBHg93/JNHHtsArOcuajCztPBDYCkkytBXg5sOw\n5QmF8mF4W86yLgK+HxXtC8zKWVaALMm8CslHsicS7RFzL8VhyAZDWzEKQg0opbYE7qd8prPVdF2h\nrSdyLfALYMNE2XFKqR/XsHbEURll62L4Wiv5PuBUqPPF6JXkLuCQbpGoPi4HfohYKGMHWD9axrlu\n8mF4Z7RuwfioaDBwaonqRemQW0U+DH+Qs6xFwHnIFNwQsv+3mMnA8dHiVwZDj8FMMVSJUuow4DkK\na7GX4gqt9cstEKlutNaL6boULMho5tBq2iul+lH8IFuCmJcNfZx8GM6hOCFVU5THfBhOQHxfylkH\n3gY+asb+6iUfhhcCewC3l5BlFbJk/P75MDwqlVTKYOgRKK1rizhSSk2h67ximo1abV5XSi2n9EIk\nz2itx5XYVqnfQcjI7DiqW2XtfeCTUbRA3ex50nWfUrqjeJEcrfcLrpj4SCN9xyilxgDPp4of0Fof\nUEXbg4B/pIqv1FrXnVNh7AmTR3V0qIwwRH1E4E28pd5+De0hZ1m/Bb4bfX0+H4Z7dMM+hgGjkDwC\nS5FpjFk9bR4/Z1mDkGmF4VHR20g4Y3oxJYOhR9EXphg6lFLlVjFbH0mZvDGwCTAayCFe0ntTOZ1y\nzDLgkEaVg1ahtX5BKfUU8OlE8ReUUjtorSstCduzch8YehSR5/6ERFG3nBvRuhE9frXUfBguA6pd\n+Mpg6DH0BQXBBro7o+Ea4Bta66e6eT/N5lK6KggKOAE4u1QDpdTGFOdNmNkLf7uh+zgYcRQEMa+3\nJe22wWBoDOOD0DhLgYla67vaLUgd3ETxglLHRXkeSnEExQ5gbQ9tNPQokis5TsqHoVlbwGDohRgF\noTECYHet9Y3tFqQetNYrKDb/DqN46eYk6emF1UhUhMFAzrImUEhDvgr4VRvFMRgMDWAUhPpYAvwf\n8Bmte31+/8uQBEdJMjMrKqW2o5A2N+YfWusePw9s6F5yltWRs6zxwKRE8RXtyEVgMBiaQ1/wQWgm\neWTe/jqtdU9Zz74htNavKaXuAw5KFB+glBqptZ6Tqj6RQlrYGDO90AfJWdY5wNeQFQwHIAmetk5U\neZFCsiCDwdALMQpCed5AphEC4NF12BHvUroqCAoJ7TwvVS+d++BdJEmPoe+xKRLnn0UeODwfhm3N\nRWAwGBqjLygIbwN/LbNdI1MGH6ReL/eWkMUmcDeSeGa7RNlRSqnzdZQoQym1C7Bzqt11NWReNKxb\nzEMU6GHAesBiYCaSLOviaF0Cg8HQi+kLCsLrWuvT2y1ET0ZrvUYp5SG57mO2Bz4LPB59/2ZRQ5P7\noM+SD8OLgYvbLYfBYOg+jJOiIeZKxOs8STJiIb28daC1/lf3imQwGAyGdmEUBAMA0XTKraniI5VS\nA6O0zOnloI31wGAwGNZhjIJgSHJp6vtgJBNlehW65cANLZHIYDAYDG3BKAiGtWitHwVeShV/muLF\nuW7VWi9qjVQGg8FgaAd9wUnRUBuXAn9IfN8f+FyqTo/OfbDnSX8brDpXnqEUe2ropzQvdtDx66ev\nGN9XolIMPQDb9T8LrBd4zsPtlsXQe7Bd/0BgQeA5QbtlMQqCIc21wC+ADaPv6WWu5wAPtVKgWtjt\n6Os2XG/9jhdQjIzTQ2rFF9bQecy4E2/I9UQlwXb9LYDDK1R7K/Cc21shj6FxbNcfDjwGKNv1Rwae\n83q7ZWo2tusPBb6ELGW9BbAICX99Gngs8Jx0hlZDBWzXHwvcC6ywXX9o4DlL2ymPURAMXdBaL1ZK\n+ZRItwz8Jc6N0BMZMFB9GxiZsWnzTjrPAH7QWomqYgTF/h9pngC6RUGwXf+XwC2B50ztjv57M7br\nXwJMCjxneo1NP0SWgAfJq7LOYLv+esAFwOkUL9wWM912/d0Dz+lsnWQ9A9v1BwEXAT8PPKfWVOML\nkPVt3kNWQm0rxgfBkEWph5UG/tJCOWqnQ40ttUkrvWcrRamWwHOmAZsguSfGAi9Hmy5AUhgPAz7f\nHfu2XX8k8ENgx+7ovzdju/4uwP9D/peaCDxnCbANsF3gOYubLVu7sF1/AHAHcBaiHDwI/C+ywNsE\n4KfA68BdfVE5iNgbOBmxqtRE4Dn/BoYDnwg8Z02zBasVY0EwFKG1fkEp9RTioJjkIa11zzaVarYq\nvVFt2TpBaiN6oCwB5tiu/2FUPCvwnLTTaLM5oJv77800dGwCz1kXHXkvRNKydwI/Cjzn1+kKtuuf\ni2TX7Ks0et681yxBGsUoCIZSBBQrCL0h98EbdW7rddiuPwoYFJu/bdffFNgL2BZ4DZgWKR5ZbRWS\n2+KIqGiE7fpjUtXmlrtZRdaHscBAYDowM/CckimWbdffFfgw8JzXou/9kfUccojV5MXAcz4s0XYw\nsCsymu8PzAVmBJ7zVqn9pdoPRVKF7wSsAN4EgqzRve36HcAoZDEqgO0zjs3rged8kGo3gOJ05ADT\ns0bTkan+k9HXGaVGjNFxykVf81nH2Hb9Ich/MRJJeT291H9fL7brj6CwANfPspQDgOi3rijRx/rI\nb8kB7wPPBZ4zL6Ne/JvfCDzn/WhufhvgvsBzVkR1dgN2AR4JPGduom38P7wXeM7c6FzfCfgU4iMR\nlFLebNfPIefXzMBzikz8tusPQyx676bljmTeCfhyVLST7frp//TV9Dluu/6GwOhUvTWB58zIkjFq\nsykyNfmfwHMW2K7fLzoWeyDTFPnAc14t1T7qYwNgT+Rc/wi5ZyT/N20UBEMRSqn+wNdTxQspTqTU\n41BaP6yVOipzGzzSYnG6m6uBz0YPv7OQm3dytc35tuuflHZutF3/BuArwEaJ4p/QNdU2wGnAH9M7\njRSTG5CbS5LQdv2joymTLKYBzwHjbNc/DomW2TCxfbXt+sMCz3k/sa8RwM+Qh/X6qf5W2q4/CTit\nzMN1OPB7CopQktW2658YeM5fEvXvRKZzBiXqZaWUPha4JlW2NfB8Rt0hiANfmjWIuf5jiLPfvVm/\nAfmvbgNmB54zKrkheuD+Bjg11Wap7fpnBJ5TybelFk4E+iE+Fb+ptbHt+scg//nGqfJbgeMDz1mY\nKN4UOZYX2q7fSWHhuNdt198ZOBc4MypbbLv+5wPPeTb6PiJqe5ft+ichx3WXRN8rbdc/OfCcrGis\nR4ChiHKSlSn2f4BzkOvitMRvCKJ9DEzU9TPafwGZlkkyBvExSrKUrtdnmoOBycA5tus/iCyat3li\nu7Zd/0rk2ihS1mzXPwT4E3LulaLTKAiGLL6EaMlJbtBat91pphIjFw289t9DVh4N7Jva9EKnWnpJ\nG0RqBXcjCa08YCqy/PJE4L8A33b9HQPPeTNR/0bgvujzGchoywPSq5U+nd6R7fp7IDfRjYDrEE99\nDeyHrPb5lO364xI36zTb2q4/AUnt/SSyLHQHMvJZklQOIhYChyCLid2FWBoGIQrDfwGnAP8Gskzd\nVvSbBgPvIMdpJjLHuxdikXgg1ewa4Jbo84+BHRAFI/3gT9/QQZa+/iIy9zwccVQrSeA5nbbrX4s8\ncI6htIIQK7xdFJLIAvEEYjmYBlyP/E4LeXj92Xb94YHnnFtOjhrYJ3q/vtbpE9v1fwqcjYxUL0GO\n51bI//g1YIzt+mNTSgJIivfNEIXgBOThfx0ySv8Nct7vgzgfj0+1HQf8E5iPKM/vI+vLHA9cZbs+\nJZSEevgDBZ++3yIKzgVI1FeSrCnD6ci0zebAJxCfjmoZjxzXPPBL5By0gW8jCt3sqHwtkYL1N0RB\n/R2ymOG2yHE5CLFAHAu8ahQEQxbfyijrDdML3HTTkWvUBRfsb88bPb6TzjEK+oHKL184YHL+Jmdl\nu+XrJsYBhwaec0dcYLu+hzw0dkcu/AvjbUmLgu36DqIgPB54zuQq9nURMgI8LjnyBibZrj8z2s/l\ntuvvVcJJbWvkXDoi8JzbKu0s8JxFtut/IqXgAPzOdv0/IiPnb5KhICAjpMGIEjAhPV1iu35HWsbA\nc25ObD8ZURAeqibENBqpTYnark8FBSHiakRBOMx2/cHpB29kSv4KooSlLRYnIcrBHcBXk7/Fdv0b\ngReAM23Xvz7wnJlVyFIJK3qfXUsj2/U/jiiiq4B9ktEytuv/Fhlpfx2xEnw31XxHYLfAc6bbrv8k\ncny/Bnwz8Jy/2q6/DTLd9F8Zu94ceXAeEHhOvM7MNbbrT0UU4vNs15+c2FY3gedcm/hNP0EUhDvL\nKMrJtkuIFPboWNWiIOSAO4HDE7/Dj67FSxEn21+m2pyOWDpuCDxn7fG2Xf8e4F1EIVsceE5oohgM\nXVBKjURuSEke11qXMhv3OPR553VO9Sb407yJZwTexO8FnnNV/qYj11XlAOCfSeUA1s4D/y36mp7f\nrAvb9fdGLDMzU8pBzMXIg2wsMhLKQiFhgxWVg5gM5SDm+uh9VHqD7fr7IlaNFcAJWb4UPcHLPvCc\n2YgVZn3gyIwq30AsQg8lQ+aiefUfR1/PzlB08sD9Udusfmsi2t+Q6GutjspnIE6L16dDaSN/irMR\np8dTbddPOxK/nwgxTZr8747e30SsEkNL7PvXGQrAVYgvwggK/gK9mXMyfuON0fvWkY9Dkp2i97uT\nhYHnLKNgURsDxknRUMz5FJ8XP22DHIbqSc9pxsSOW8ObtJ89ovdXbNcvpQC8j4zcdiTbnAoy4q2b\n6Ia3CYV5/Y0zqsXOf4/WEYveaq5GQuOOQaZekhydqJNkW2BLZF2UzhL/R+xE2XAIa+A52nb9lUho\nY63hd7GD5d1ZGwPPmW27/iuIUrkLXc/n9xP13rZd/yNgVezoF8n1NjAyyyKETGGl97fGdv1/IlaL\n3h7e+06WM2PgOQtt11+GTMcNo6vVJ1aWsyK+4nvFQjAKgiGBUmoshfnOmGe11vdl1Tf0GOaUKI9v\nlqrE9lqJb6b/Hb3KsU2Zba/VslPb9bdDfA0ORLz0N62iWWxVqMkc3iZuRuawP2u7/g6JKI9RSCTR\nYoodhOP/YgNKK2Ix2zZJzjnINMN2NbaL/4uiaIUE/0EUhB3pqiCkMwl2IscjXZZFJ/B2iW1xRtWR\nZWTqDcwps63U9f8Q0TSN7fp/iK0PtuvviPjmrCHyR1qrICilNkTmHjZDLsDke/JzOtwnzY1KqXcR\nR4cFiBab9XlRT87I19dQSo1GNPz0tJOxHvR8mhrOVobB0XuAOBiWo1zmwaqdXW3X3x+4BzGVv4SM\npN9AnPEg21McxMIArTs2dRN4zoe26/8NOA6xGJwfbYqV9b8GnrM81Sz+Lz5A0qOXo2y4Ww3MoT4F\nIY4+KTfNF58TaXN4VthstVNDitLKcdxvOjKmEj0tv0M953fs87E3Eul0B2JliBflOzfwnFcA+iul\n5iEmwQFNEBaK569L0amUWggcqrXO8gg2FKHG2CdW4Uem9XvBlUflu7RUaiByU3lPa92ZKN8cSav8\nfUQBTHKr1rrqueIsxp18/eg1azrLjSYB6NfRsY3G6Is9nDjDYxh4zundvbMotvtm5N50duA5P09t\nT0faJIkfirU+zNrF1YiC4FBQECZE73/JqB//F+u14r+ImIVEOB1iu/6ZNfhwzEamp7YuU2e7RN1m\noZBnW5YVIfZ1qNWfotw51yuIph++hET0bAkcikwpTAEuCjxnSly3PzIP0a8NcnYgD6SBlSoaIhQX\nV2UtVup24LBU6S7IyG+NUuodZP52awojrTSvIjeshlij9XdQKh2jXYRRDtpGfOCruQfEpmzbdn0V\ndP9iPLsgjnEryI67Lzd/PCt6/5Tt+v3LJXAqQ/z7ut2ZO/Ccx23XfxUYZbt+7D8xCngl8Jwsa80s\nZBS8ke36O7cg4ybA5UgegJ0QE/XN5auvZRaiIMQRF12wXX8TCv9ls6eERpOtIMR+EXNS5YsRh8dS\nTo/V+CzUck21i6uR5++4wHNeKFXJRDH0PfoR5fqmtHKwDDhCa73O5JA3lCSeF04v6Z3FPRTMzBO7\nS6AE8Q12PbomgYn5Xpm29yMPhu2RUK96iKMn9q6zfa38JXo/NHoly7oQeM5K4Iro60+jKINuJVJC\nYu/439uuX805A4VkWyfbrp+V/MdFnOmeCmpfFKsSRYMc2/U/DeyG3OfSjpOx5WmfVHmcuXFcFfus\n5ZpqObbrb45EtswqpxyAcVI0FDMbOFxrXeT9a+heopvnEArzolvashT0wmbEapdgGpIU5XDb9R9F\nYqrXQyyL8wPPeTeuGHjOMtv1T0VuqldH6W//jigNmyHOcAcBgwPPcZog20xkRLcJ8DPb9S9CRqM7\nI7kDvoDE1hfdxwLPWWy7/plI7oCLbNffHXm4zUQeRtsjGRP/EXhOKSfcABkpj49i5+9G/putgHmB\n5yxIN4iSF21C14V6Rtiu/yYSW15uHv4a4P8oKAedlPcvOAv4KmItfCTKKfAS8v8NR1ILHwnsl5GA\nqF7ORdYaGA48HGWyfBqYgViDRwCfQR72PkDgOU9E2TvHI4m0TgeeRczb30DyH2iKcyA0ymrgWNv1\nFyDK1NvIQ3tStN3LCH+9HUl29UPb9echFo8BUbtLEKfJtJ9EmgA59ifbrj8bCR3cGDlvZqdTLcPa\n9NCbUMhs2GFLKvPFSAKxZl7/CxEL8pgoA+QMxD+kE3HenAHcHnjOGmNB6Dt8iGjHWSFKK4HHkcQr\nOxvloLXYrr+77fqrEIejNyiE6P0WccZbabv+lFLtG+Ry5AY/BHkYfRDtR9M79QAAA3FJREFUcwYS\nNdCFwHPuQR6a7wHfAR5GMhk+i9xcT6G6KIOKBJ6zFBn9r0GUmBlIWN9ziHf/5yjO/phsfy2yqt4i\nxOJxF3INTI9k/Q7ZoV4xv0PC5LZCci4sQm6g08kYHdquvxy5lt4DwsSmF5EENCts1//Idv3M9LbR\negJTkEx4NvBA1joFifqLIjkeR6wcfwdeQfIFTEEcjHNU79RXkShvw95Ixs5+yOj/KuSh+ATiAHcq\nxb4fxwOXRfJMQc6zlxGF6B3g4MBznmmWnBFzEUfP0xDFcCGiAG+JHKushESXIdanjRBF4l3EInAj\n8vuOqWK/5yNRGaOQFNkfIhkOX6CQgwAA2/W3jkI3V0T7ejjatAFyXb2PXP/LbVnroWGi6bbzo697\nIlaWk5Br93wkk+jztusP7o94Lna7eaoMZU0cVXIAped7eqGZfP2ZqmPFl+ptrVf3n19UpvVMYLRS\nagBywxuEjLwWAe9qrTMXV2mUzs7OP/Xrp+6qt33Hmn5Zue3XNeZTOVoky5nqKiQkrNT883Qk3WvJ\nsMLAc1bbrv9Z5AH6KWRkOB+5wRWlWo7a3Ga7/mOIomAho/GFyI30YeDREru7ELlOq07TG3jONbbr\nT0Nu9KOQm+i/gFsDz3nTdv2fI2FbpdpfHnlpH4LcnHdAlIz5yLErqXgFnvOR7fo28lDYE7lu3kKO\nTdZ9K52xrhTl7knnUVB6SqVeTsr4apQU6lDEbG4hCsFbROsRBE1ebjrwnNB2/XGIGf5gRBkYhPyv\n7yDpjR9MtVkOnGK7/vWIgrFrVPcF4O8ZKbaXIuduWkH6KfL/JbkEsWClfWK2CDzHt10/jzhXjkGO\nyzNIZEiRD00ga3ocaLv+kUh2xo8hSuVURKmIUyiXVGYCWVzKQlJD7xrJNg85b9LX8RLgF6X6SpFU\n9Cpe28gaJgORqEEAbNffDLlvHIQoAndR8NEYilwjExD/nwuUiTQ0GAwGw7qC7fqjEUvKqsBzmhWd\nt05gu/5pyNoifw48J9N5PForxQeeNFMMBoPBYDD0DWL/llvK1In9jt4zCoLBYDAYDH2DePo5MwrJ\ndv0hFPwTnjBRDAaDwWAw9A3+hPgOHRPl25iK+FhsiuR4OARx0Lwf+J1REAwGg8Fg6AMEnvNklL78\nHMRRca/E5hVINNIVwI2B56z6/3ExLRI31pXNAAAAAElFTkSuQmCC\n", "text": [ - "" + "" ] } ], - "prompt_number": 7 + "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "An image can also be displayed from raw data or a url" + "An image can also be displayed from raw data or a URL." ] }, { @@ -196,19 +199,19 @@ ], "metadata": {}, "output_type": "pyout", - "prompt_number": 8, + "prompt_number": 7, "text": [ - "" + "" ] } ], - "prompt_number": 8 + "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "SVG images are also supported out of the box (since modern browsers do a good job of rendering them):" + "SVG images are also supported out of the box." ] }, { @@ -216,7 +219,7 @@ "collapsed": false, "input": [ "from IPython.display import SVG\n", - "SVG(filename='images/python_logo.svg')" + "SVG(filename='../images/python_logo.svg')" ], "language": "python", "metadata": {}, @@ -224,7 +227,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 9, + "prompt_number": 8, "svg": [ "\n", " \n", @@ -289,46 +292,71 @@ "" ], "text": [ - "" + "" ] } ], - "prompt_number": 9 + "prompt_number": 8 }, { "cell_type": "heading", - "level": 2, + "level": 3, "metadata": {}, "source": [ - "Links to local files" + "Embedded vs non-embedded Images" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "If we want to create a link to one of them, we can call use the `FileLink` object." + "By default, image data is embedded in the notebook document so that the images can be viewed offline. However it is also possible to tell the `Image` class to only store a *link* to the image. Let's see how this works using a webcam at Berkeley." ] }, { "cell_type": "code", "collapsed": false, "input": [ - "from IPython.display import FileLink, FileLinks\n", - "FileLink('Running Code.ipynb')" + "from IPython.display import Image\n", + "img_url = 'http://www.lawrencehallofscience.org/static/scienceview/scienceview.berkeley.edu/html/view/view_assets/images/newview.jpg'\n", + "\n", + "# by default Image data are embedded\n", + "Embed = Image(img_url)\n", + "\n", + "# if kwarg `url` is given, the embedding is assumed to be false\n", + "SoftLinked = Image(url=img_url)\n", + "\n", + "# In each case, embed can be specified explicitly with the `embed` kwarg\n", + "# ForceEmbed = Image(url=img_url, embed=True)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is the embedded version. Note that this image was pulled from the webcam when this code cell was originally run and stored in the Notebook. Unless we rerun this cell, this is not todays image." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "Embed" ], "language": "python", "metadata": {}, "outputs": [ { - "html": [ - "Running Code.ipynb
" - ], + "jpeg": "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\nAFT+//9fBAAAZgQAAGYEAAAJBAAABwQAAAoEAAAKBAAADAQAABAEAAAEBAAA//8AAAAAAADABQAA\nKAIAAFQBAACAAAAAbwQAAKkBAAAJAQAAYwAAAAAAAAAAAAAAAwAAAAMAAAACAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAANAAAACMlrWmAABAAJAAkAIAqY\nB2QAZAASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgDu/wAAEgDu/wAAEgDu/wAA\nEgDu/+7/7v8AAAAAAAASABIAEgAQAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAACAAAQAAAAIAAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAigABAAAABAAIAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAoAEAAAAAEAAIAAEAAQCAAuABAAAAAAAAAAAAAAgAgAEAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAoAAQAAAAAAAABF1Yvq/udUJVCJsJVgaq7+\nSUkqAN4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAEAAgAEAAAAUjk4\nAAIABwAEAAAAMDEwMAEQAwABAAAAIAoAAAIQAwABAAAAmAcAAAAAAAAAjScAJAEAAMCpHQDbAAAA\nQBEAAEARAAAGAAMBAwABAAAABgAAABoBBQABAAAAPA0AABsBBQABAAAARA0AACgBAwABAAAAAgAA\nAAECBAABAAAA9BMAAAICBAABAAAA2wkAAAAAAAC0AAAAAQAAALQAAAABAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9j/2wCEAAkGBggGBQkIBwgK\nCQkLDRYPDQwMDRwTFRAWIR0jIiEcIB8kKTQsJCcxJx4fLT0tMTY3Ojo6Iio/RD44QjM3OTYBCQkJ\nDAoMFAwMFA8KCgoPGhoKChoaTxoaGhoaT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09P\nT09PT//AABEIAHgAoAMBIQACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsB\nAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEG\nE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW\n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\n", "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ - "/Users/bgranger/Documents/Computing/IPython/code/ipython/examples/Notebook/Running Code.ipynb" + "" ] } ], @@ -338,118 +366,59 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Alternatively, if we want to link to all of the files in a directory, we can use the `FileLinks` object, passing `'.'` to indicate that we want links generated for the current working directory. Note that if there were other directories under the current directory, `FileLinks` would work in a recursive manner creating links to files in all sub-directories as well." + "Here is today's image from same webcam at Berkeley, (refreshed every minutes, if you reload the notebook), visible only with an active internet connection, that should be different from the previous one. Notebooks saved with this kind of image will be smaller and always reflect the current version of the source, but the image won't display offline." ] }, { "cell_type": "code", "collapsed": false, "input": [ - "FileLinks('.')" + "SoftLinked" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ - "./
\n", - "  Animations Using clear_output.ipynb
\n", - "  Basic Output.ipynb
\n", - "  Connecting with the Qt Console.ipynb
\n", - "  Custom Display Logic.ipynb
\n", - "  Display System.ipynb
\n", - "  Importing Notebooks.ipynb
\n", - "  Index.ipynb
\n", - "  Markdown Cells.ipynb
\n", - "  Plotting with Matplotlib.ipynb
\n", - "  Progress Bars.ipynb
\n", - "  Raw Input.ipynb
\n", - "  Running Code.ipynb
\n", - "  SymPy.ipynb
\n", - "  Trapezoid Rule.ipynb
\n", - "  Typesetting Math Using MathJax.ipynb
\n", - "  User Interface.ipynb
\n", - "./images/
\n", - "  animation.m4v
\n", - "  command_mode.png
\n", - "  edit_mode.png
\n", - "  menubar_toolbar.png
\n", - "  python_logo.svg
\n", - "./nbpackage/
\n", - "  __init__.py
\n", - "  mynotebook.ipynb
\n", - "./nbpackage/nbs/
\n", - "  __init__.py
\n", - "  other.ipynb
" + "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ - "./\n", - " Animations Using clear_output.ipynb\n", - " Basic Output.ipynb\n", - " Connecting with the Qt Console.ipynb\n", - " Custom Display Logic.ipynb\n", - " Display System.ipynb\n", - " Importing Notebooks.ipynb\n", - " Index.ipynb\n", - " Markdown Cells.ipynb\n", - " Plotting with Matplotlib.ipynb\n", - " Progress Bars.ipynb\n", - " Raw Input.ipynb\n", - " Running Code.ipynb\n", - " SymPy.ipynb\n", - " Trapezoid Rule.ipynb\n", - " Typesetting Math Using MathJax.ipynb\n", - " User Interface.ipynb\n", - "./images/\n", - " animation.m4v\n", - " command_mode.png\n", - " edit_mode.png\n", - " menubar_toolbar.png\n", - " python_logo.svg\n", - "./nbpackage/\n", - " __init__.py\n", - " mynotebook.ipynb\n", - "./nbpackage/nbs/\n", - " __init__.py\n", - " other.ipynb" + "" ] } ], "prompt_number": 11 }, { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course, if you re-run this Notebook, the two images will be the same again." + ] + }, + { "cell_type": "heading", - "level": 3, + "level": 2, "metadata": {}, "source": [ - "Embedded vs Non-embedded Images" + "HTML" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "By default, image data is embedded in the Notebook document so that the images can be viewed offline. However it is also possible to tell the `Image` class to only store a *link* to the image. Let's see how this works using a webcam at Berkeley." + "Python objects can declare HTML representations that will be displayed in the Notebook. If you have some HTML you want to display, simply use the `HTML` class." ] }, { "cell_type": "code", "collapsed": false, "input": [ - "from IPython.display import Image\n", - "img_url = 'http://www.lawrencehallofscience.org/static/scienceview/scienceview.berkeley.edu/html/view/view_assets/images/newview.jpg'\n", - "\n", - "# by default Image data are embedded\n", - "Embed = Image(img_url)\n", - "\n", - "# if kwarg `url` is given, the embedding is assumed to be false\n", - "SoftLinked = Image(url=img_url)\n", - "\n", - "# In each case, embed can be specified explicitly with the `embed` kwarg\n", - "# ForceEmbed = Image(url=img_url, embed=True)" + "from IPython.display import HTML" ], "language": "python", "metadata": {}, @@ -457,520 +426,718 @@ "prompt_number": 12 }, { - "cell_type": "markdown", + "cell_type": "code", + "collapsed": false, + "input": [ + "s = \"\"\"
DateOpenHighLowCloseVolumeAdj Close
0 2012-06-01 569.16 590.00
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
Header 1Header 2
row 1, cell 1row 1, cell 2
row 2, cell 1row 2, cell 2
\"\"\"" + ], + "language": "python", "metadata": {}, - "source": [ - "Here is the embedded version. Note that this image was pulled from the webcam when this code cell was originally run and stored in the Notebook. Unless we rerun this cell, this is not todays image." - ] + "outputs": [], + "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ - "Embed" + "h = HTML(s)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 14 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display(h)" ], "language": "python", "metadata": {}, "outputs": [ { - "jpeg": "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\nAFT+//9qBAAAfQQAAF8EAABLBAAA+wMAAA8EAAAOBAAADgQAAAwEAAAIBAAA//8AAAAAAADABQAA\nFAEAAFQBAABBAAAAbwQAANcAAAAJAQAAMgAAAAAAAAAAAAAAAwAAAAMAAAACAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAKAAAAf/EFeWAABAAJAAkAIAqY\nB2QAZAASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgDu/wAAEgDu/wAAEgDu/wAA\nEgDu/+7/7v8AAAAAAAASABIAEgAAAQAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAACAAAQAAAAIAAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAigABAAAABAAIAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAoAEAAAAAEAAIAAEAAQCAAuABAAAAAAAAAAAAAAgAgAEAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAoAAAAAAAAAAAAw+/PJ/OZUJVCJsJVgaq7+\nSUkqAN4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAEAAgAEAAAAUjk4\nAAIABwAEAAAAMDEwMAEQAwABAAAAIAoAAAIQAwABAAAAmAcAAAAAAAAAjScAJAEAAMCpHQDbAAAA\nQBEAAEARAAAGAAMBAwABAAAABgAAABoBBQABAAAAPA0AABsBBQABAAAARA0AACgBAwABAAAAAgAA\nAAECBAABAAAA9BMAAAICBAABAAAARwkAAAAAAAC0AAAAAQAAALQAAAABAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9j/2wCEAAkGBggGBQkIBwgK\nCQkLDRYPDQwMDRwTFRAWIR0jIiEcIB8kKTQsJCcxJx4fLT0tMTY3Ojo6Iio/RD44QjM3OTYBCQkJ\nDAoMFAwMFA8KCgoPGhoKChoaTxoaGhoaT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09P\nT09PT//AABEIAHgAoAMBIQACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsB\nAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEG\nE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW\n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\n", + "html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
Header 1Header 2
row 1, cell 1row 1, cell 2
row 2, cell 1row 2, cell 2
" + ], "metadata": {}, - "output_type": "pyout", - "prompt_number": 13, + "output_type": "display_data", "text": [ - "" + "" ] } ], - "prompt_number": 13 + "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Here is today's image from same webcam at Berkeley, (refreshed every minutes, if you reload the notebook), visible only with an active internet connection, that should be different from the previous one. Notebooks saved with this kind of image will be lighter and always reflect the current version of the source, but the image won't display offline." + "You can also use the `%%html` cell magic to accomplish the same thing." ] }, { "cell_type": "code", "collapsed": false, "input": [ - "SoftLinked" + "%%html\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
Header 1Header 2
row 1, cell 1row 1, cell 2
row 2, cell 1row 2, cell 2
" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ - "" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
Header 1Header 2
row 1, cell 1row 1, cell 2
row 2, cell 1row 2, cell 2
" ], "metadata": {}, - "output_type": "pyout", - "prompt_number": 14, + "output_type": "display_data", "text": [ - "" + "" ] } ], - "prompt_number": 14 + "prompt_number": 16 }, { - "cell_type": "markdown", + "cell_type": "heading", + "level": 2, "metadata": {}, "source": [ - "Of course, if you re-run this Notebook, the two images will be the same again." + "JavaScript" ] }, { - "cell_type": "heading", - "level": 2, + "cell_type": "markdown", "metadata": {}, "source": [ - "Audio" + "The Notebook also enables objects to declare a JavaScript representation. At first, this may seem odd as output is inherently visual and JavaScript is a programming language. However, this opens the door for rich output that leverages the full power of JavaScript and associated libraries such as [d3.js](http://d3js.org) for output." ] }, { + "cell_type": "code", + "collapsed": false, + "input": [ + "from IPython.display import Javascript" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 17 + }, + { "cell_type": "markdown", "metadata": {}, "source": [ - "IPython makes it easy to work with sounds interactively. The `Audio` display class allows you to create an audio control that is embedded in the Notebook. The interface is analogous to the interface of the `Image` display class. All audio formats supported by the browser can be used. Note that no single format is presently supported in all browsers." + "Pass a string of JavaScript source code to the `JavaScript` object and then display it." ] }, { "cell_type": "code", "collapsed": false, "input": [ - "from IPython.display import Audio\n", - "Audio(url=\"http://www.nch.com.au/acm/8k16bitpcm.wav\")" + "js = Javascript('alert(\"hi\")');" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "display(js)" ], "language": "python", "metadata": {}, "outputs": [ { - "html": [ - "\n", - " \n", - " " + "javascript": [ + "alert(\"hi\")" ], "metadata": {}, - "output_type": "pyout", - "prompt_number": 15, + "output_type": "display_data", "text": [ - "" + "" ] } ], - "prompt_number": 15 + "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "A Numpy array can be auralized automatically. The Audio class normalizes and encodes the data and embed the result in the Notebook.\n", - "\n", - "For instance, when two sine waves with almost the same frequency are superimposed a phenomena known as [beats](https://en.wikipedia.org/wiki/Beat_%28acoustics%29) occur. This can be auralised as follows" + "The same thing can be accomplished using the `%%javascript` cell magic:" ] }, { "cell_type": "code", "collapsed": false, "input": [ - "import numpy as np\n", - "max_time = 3\n", - "f1 = 220.0\n", - "f2 = 224.0\n", - "rate = 8000.0\n", - "L = 3\n", - "times = np.linspace(0,L,rate*L)\n", - "signal = np.sin(2*np.pi*f1*times) + np.sin(2*np.pi*f2*times)\n", + "%%javascript\n", "\n", - "Audio(data=signal, rate=rate)" + "alert(\"hi\");" ], "language": "python", "metadata": {}, "outputs": [ { - "html": [ + "javascript": [ "\n", - " \n", - " " + "alert(\"hi\");" ], "metadata": {}, - "output_type": "pyout", - "prompt_number": 16, + "output_type": "display_data", "text": [ - "" + "" ] } ], - "prompt_number": 16 - }, - { - "cell_type": "heading", - "level": 2, - "metadata": {}, - "source": [ - "Video" - ] + "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "More exotic objects can also be displayed, as long as their representation supports the IPython display protocol. For example, videos hosted externally on YouTube are easy to load (and writing a similar wrapper for other hosted content is trivial):" + "Here is a more complicated example that loads `d3.js` from a CDN, uses the `%%html` magic to load CSS styles onto the page and then runs ones of the `d3.js` examples." ] }, { "cell_type": "code", "collapsed": false, "input": [ - "from IPython.display import YouTubeVideo\n", - "# a talk about IPython at Sage Days at U. Washington, Seattle.\n", - "# Video credit: William Stein.\n", - "YouTubeVideo('1j_HxD4iLn8')" + "Javascript(\n", + " \"\"\"$.getScript('//cdnjs.cloudflare.com/ajax/libs/d3/3.2.2/d3.v3.min.js')\"\"\"\n", + ")" ], "language": "python", "metadata": {}, "outputs": [ { - "html": [ - "\n", - " \n", - " " + "javascript": [ + "$.getScript('//cdnjs.cloudflare.com/ajax/libs/d3/3.2.2/d3.v3.min.js')" ], "metadata": {}, "output_type": "pyout", - "prompt_number": 17, + "prompt_number": 21, "text": [ - "" + "" ] } ], - "prompt_number": 17 + "prompt_number": 21 }, { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the nascent video capabilities of modern browsers, you may also be able to display local\n", - "videos. At the moment this doesn't work very well in all browsers, so it may or may not work for you;\n", - "we will continue testing this and looking for ways to make it more robust. \n", + "cell_type": "code", + "collapsed": false, + "input": [ + "%%html\n", + "" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "html": [ + "" + ], + "metadata": {}, + "output_type": "display_data", + "text": [ + "" + ] + } + ], + "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ - "from IPython.display import HTML\n", - "from base64 import b64encode\n", - "video = open(\"images/animation.m4v\", \"rb\").read()\n", - "video_encoded = b64encode(video).decode('ascii')\n", - "video_tag = '