##// END OF EJS Templates
Adding moved content.
Brian E. Granger -
Show More
@@ -1,248 +1,389 b''
1 1 {
2 2 "metadata": {
3 3 "name": "",
4 "signature": "sha256:84fa8b285a29d021b31d7211c6452729fb042a5c74cee6bf31e74e06fdd26b97"
4 "signature": "sha256:ee4b22b4c949fe21b3e5cda24f0916ba59d8c09443f4a897d98b96d4a73ac335"
5 5 },
6 6 "nbformat": 3,
7 7 "nbformat_minor": 0,
8 8 "worksheets": [
9 9 {
10 10 "cells": [
11 11 {
12 12 "cell_type": "heading",
13 13 "level": 1,
14 14 "metadata": {},
15 15 "source": [
16 16 "Running the Notebook Server"
17 17 ]
18 18 },
19 19 {
20 20 "cell_type": "markdown",
21 21 "metadata": {},
22 22 "source": [
23 23 "The IPython notebook server is a custom web server that runs the notebook web application. Most of the time, users run the notebook server on their local computer using IPython's command line interface."
24 24 ]
25 25 },
26 26 {
27 27 "cell_type": "heading",
28 28 "level": 2,
29 29 "metadata": {},
30 30 "source": [
31 31 "Starting the notebook server using the command line"
32 32 ]
33 33 },
34 34 {
35 35 "cell_type": "markdown",
36 36 "metadata": {},
37 37 "source": [
38 38 "You can start the notebook server from the command line (Terminal on Mac/Linux, CMD prompt on Windows) by running the following command: \n",
39 39 "\n",
40 40 " ipython notebook\n",
41 41 "\n",
42 "This will print some information about the notebook server in your console, including the URL of the web application (by default, `http://127.0.0.1:8888`). It will then open your default web browser to this URL.\n",
42 "This will print some information about the notebook server in your terminal, including the URL of the web application (by default, `http://127.0.0.1:8888`). It will then open your default web browser to this URL.\n",
43 43 "\n",
44 44 "When the notebook opens, you will see the **notebook dashboard**, which will show a list of the notebooks and subdirectories in the directory where the notebook server was started. As of IPython 2.0, the dashboard allows you to navigate to different subdirectories. Because of this, it is no longer necessary to start a separate notebook server for each subdirectory. Most of the time, you will want to start a notebook server in the highest directory in your filesystem where notebooks can be found. Often this will be your home directory.\n",
45 45 "\n",
46 46 "You can start more than one notebook server at the same time. By default, the first notebook server starts on port 8888 and later notebook servers search for open ports near that one.\n",
47 47 "\n",
48 48 "You can also specify the port manually:\n",
49 49 "\n",
50 50 " ipython notebook --port 9999\n",
51 51 "\n",
52 52 "Or start notebook server without opening a web browser.\n",
53 53 "\n",
54 54 " ipython notebook --no-browser\n",
55 55 "\n",
56 56 "The notebook server has a number of other command line arguments that can be displayed with the `--help` flag: \n",
57 57 "\n",
58 58 " ipython notebook --help\n",
59 59 "\n",
60 60 "<div class=\"alert alert-failure\">\n",
61 61 "It used to be possible to specify kernel options, such as <code>--pylab inline</code> from the command line. This is deprecated in IPython 2.0 and will be removed in IPython 3.0. To enable matplotlib based plotting for the Python kernel use the <code>%matplotlib</code> magic command.\n",
62 62 "</div>\n",
63 63 "\n"
64 64 ]
65 65 },
66 66 {
67 67 "cell_type": "heading",
68 68 "level": 2,
69 69 "metadata": {},
70 70 "source": [
71 71 "Configuring the IPython Notebook"
72 72 ]
73 73 },
74 74 {
75 75 "cell_type": "markdown",
76 76 "metadata": {},
77 77 "source": [
78 78 "The notebook web server can also be configured using IPython profiles and configuration files. The Notebook web server configuration options are set in a file named `ipython_notebook_config.py` in your IPython *profile directory*. The profile directory is a subfolder of your IPython directory, which itself is usually `.ipython` in your home directory.\n",
79 79 "\n",
80 "You can display the location of your default profile directory by running the command:\n",
81 "\n",
82 " ipython locate\n",
83 "\n",
80 "You can display the location of your default profile directory by running the command:"
81 ]
82 },
83 {
84 "cell_type": "code",
85 "collapsed": false,
86 "input": [
87 "!ipython profile locate default"
88 ],
89 "language": "python",
90 "metadata": {},
91 "outputs": [
92 {
93 "output_type": "stream",
94 "stream": "stdout",
95 "text": [
96 "/Users/bgranger/.ipython/profile_default\r\n"
97 ]
98 }
99 ],
100 "prompt_number": 7
101 },
102 {
103 "cell_type": "markdown",
104 "metadata": {},
105 "source": [
84 106 "The default version of `ipython_notebook_config.py` lists all of the options available along with documentation for each. Changes made to that file will affect all notebook servers run under that profile. Command line options always override those set in configuration files.\n",
85 107 "\n",
108 "You can create a new profile:"
109 ]
110 },
111 {
112 "cell_type": "code",
113 "collapsed": false,
114 "input": [
115 "!ipython profile create my_profile"
116 ],
117 "language": "python",
118 "metadata": {},
119 "outputs": [
120 {
121 "output_type": "stream",
122 "stream": "stdout",
123 "text": [
124 "[ProfileCreate] Generating default config file: u'/Users/bgranger/.ipython/profile_my_profile/ipython_config.py'\r\n"
125 ]
126 },
127 {
128 "output_type": "stream",
129 "stream": "stdout",
130 "text": [
131 "[ProfileCreate] Generating default config file: u'/Users/bgranger/.ipython/profile_my_profile/ipython_qtconsole_config.py'\r\n"
132 ]
133 },
134 {
135 "output_type": "stream",
136 "stream": "stdout",
137 "text": [
138 "[ProfileCreate] Generating default config file: u'/Users/bgranger/.ipython/profile_my_profile/ipython_notebook_config.py'\r\n",
139 "[ProfileCreate] Generating default config file: u'/Users/bgranger/.ipython/profile_my_profile/ipython_nbconvert_config.py'\r\n"
140 ]
141 }
142 ],
143 "prompt_number": 3
144 },
145 {
146 "cell_type": "markdown",
147 "metadata": {},
148 "source": [
149 "And then view its location:"
150 ]
151 },
152 {
153 "cell_type": "code",
154 "collapsed": false,
155 "input": [
156 "!ipython profile locate my_profile"
157 ],
158 "language": "python",
159 "metadata": {},
160 "outputs": [
161 {
162 "output_type": "stream",
163 "stream": "stdout",
164 "text": [
165 "/Users/bgranger/.ipython/profile_my_profile\r\n"
166 ]
167 }
168 ],
169 "prompt_number": 5
170 },
171 {
172 "cell_type": "markdown",
173 "metadata": {},
174 "source": [
175 "To start the notebook server using a given profile, run the following:\n",
176 "\n",
177 " ipython notebook --profile=my_profile"
178 ]
179 },
180 {
181 "cell_type": "markdown",
182 "metadata": {},
183 "source": [
86 184 "More details about IPython configuration files and profiles can be found [here](http://ipython.org/ipython-doc/dev/config/intro.html)."
87 185 ]
88 186 },
89 187 {
90 188 "cell_type": "heading",
91 189 "level": 2,
92 190 "metadata": {},
93 191 "source": [
94 192 "Securing the notebook server"
95 193 ]
96 194 },
97 195 {
98 196 "cell_type": "markdown",
99 197 "metadata": {},
100 198 "source": [
101 199 "The IPython Notebook allows arbitrary code execution on the computer running it. Thus, the notebook web server should never be run on the open internet without first securing it. By default, the notebook server only listens on local network interface (`127.0.0.1`) There are two steps required to secure the notebook server:\n",
102 200 "\n",
103 201 "1. Setting a password\n",
104 "2. Encrypt network traffic using SSL\n",
105 "\n",
106 "\n",
107 "\n",
108 "You can protect your notebook server with a simple single password by setting the `NotebookApp.password` configurable. You can prepare a hashed password using the function `IPython.lib.security.passwd`:\n",
109 "\n",
110 "```python\n",
111 "In [1]: from IPython.lib import passwd\n",
112 "In [2]: passwd()\n",
113 "Enter password: \n",
114 "Verify password: \n",
115 "Out[2]: 'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed'\n",
116 "```\n",
117 "\n",
118 "<div class=\"alert alert-warn\">\n",
119 "`IPython.lib.security.passwd` can also take the password as a string argument. **Do not** pass it as an argument inside an IPython session, as it will be saved in your input history.\n",
120 "</div>\n",
121 "\n",
202 "2. Encrypt network traffic using SSL"
203 ]
204 },
205 {
206 "cell_type": "heading",
207 "level": 3,
208 "metadata": {},
209 "source": [
210 "Setting a password"
211 ]
212 },
213 {
214 "cell_type": "markdown",
215 "metadata": {},
216 "source": [
217 "You can protect your notebook server with a simple single password by setting the `NotebookApp.password` configurable. You can prepare a hashed password using the function `IPython.lib.passwd`:"
218 ]
219 },
220 {
221 "cell_type": "code",
222 "collapsed": false,
223 "input": [
224 "from IPython.lib import passwd\n",
225 "password = passwd(\"secret\")\n",
226 "password"
227 ],
228 "language": "python",
229 "metadata": {},
230 "outputs": [
231 {
232 "metadata": {},
233 "output_type": "pyout",
234 "prompt_number": 1,
235 "text": [
236 "'sha1:6c2164fc2b22:ed55ecf07fc0f985ab46561483c0e888e8964ae6'"
237 ]
238 }
239 ],
240 "prompt_number": 1
241 },
242 {
243 "cell_type": "markdown",
244 "metadata": {},
245 "source": [
122 246 "You can then add this to your `ipython_notebook_config.py`:\n",
123 247 "\n",
124 248 "```python\n",
125 249 "# Password to use for web authentication\n",
126 250 "c = get_config()\n",
127 251 "c.NotebookApp.password = \n",
128 "u'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed'\n",
129 "```\n",
130 "When using a password, it is a good idea to also use SSL, so that your \n",
131 "password is not sent unencrypted by your browser. You can start the notebook \n",
132 "to communicate via a secure protocol mode using a self-signed certificate with \n",
133 "the command::\n",
134 "\n",
135 " $ ipython notebook --certfile=mycert.pem\n",
136 "\n",
137 ".. note::\n",
138 "\n",
139 " A self-signed certificate can be generated with ``openssl``. For example, \n",
140 " the following command will create a certificate valid for 365 days with \n",
141 " both the key and certificate data written to the same file::\n",
142 "\n",
143 " $ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem\n",
144 "\n",
145 "Your browser will warn you of a dangerous certificate because it is\n",
146 "self-signed. If you want to have a fully compliant certificate that will not\n",
147 "raise warnings, it is possible (but rather involved) to obtain one,\n",
148 "as explained in detail in `this tutorial`__.\n",
149 "\n",
150 ".. __: http://arstechnica.com/security/news/2009/12/how-to-get-set-with-a-secure-sertificate-for-free.ars\n",
151 "\t\n",
152 "Keep in mind that when you enable SSL support, you will need to access the\n",
153 "notebook server over ``https://``, not over plain ``http://``. The startup\n",
154 "message from the server prints this, but it is easy to overlook and think the\n",
155 "server is for some reason non-responsive."
252 "u'sha1:6c2164fc2b22:ed55ecf07fc0f985ab46561483c0e888e8964ae6'\n",
253 "```"
254 ]
255 },
256 {
257 "cell_type": "heading",
258 "level": 3,
259 "metadata": {},
260 "source": [
261 "Using SSL/HTTPS"
156 262 ]
157 263 },
158 264 {
159 265 "cell_type": "markdown",
160 266 "metadata": {},
161 267 "source": [
162 "Running a public notebook server\n",
163 "--------------------------------\n",
268 "When using a password, it is a good idea to also use SSL, so that your \n",
269 "password is not sent unencrypted by your browser to the web server. When running the notebook on the public internet this is absolutely required.\n",
164 270 "\n",
165 "If you want to access your notebook server remotely via a web browser,\n",
166 "you can do the following. \n",
271 "The first step is to generate an SSL certificate. A self-signed certificate can be generated with ``openssl``. For example, the following command will create a certificate valid for 365 days with both the key and certificate data written to the same file:\n",
167 272 "\n",
168 "Start by creating a certificate file and a hashed password, as explained \n",
169 "above. Then create a custom profile for the notebook, with the following \n",
170 "command line, type::\n",
273 " openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem\n",
171 274 "\n",
172 " $ ipython profile create nbserver\n",
275 "In most cases, you should run this command in your profile directory, which will make it easy to use the generated key and certificate.\n",
173 276 "\n",
174 "In the profile directory just created, edit the file \n",
175 "``ipython_notebook_config.py``. By default, the file has all fields \n",
176 "commented; the minimum set you need to uncomment and edit is the following::\n",
277 "When you connect to a notebook server over HTTPS using a self-signed certificate, your browser will warn you of a dangerous certificate because it is self-signed. If you want to have a fully compliant certificate that will not raise warnings, it is possible (but rather involved) to obtain one,\n",
278 "as explained in detail in [this tutorial](http://arstechnica.com/security/news/2009/12/how-to-get-set-with-a-secure-sertificate-for-free.ars)\n",
279 "\t\n",
280 "When you enable SSL support, you will need to access the notebook server over ``https://``, rather than plain ``http://``. The startup message from the notebook server prints the correct URL, but it is easy to overlook and think the server is for some reason non-responsive.\n",
177 281 "\n",
178 " c = get_config()\n",
282 "Once you have generated the key and certificate, you can configure the notebook server to use them, by adding the following to `ipython_notebook_config.py`:\n",
179 283 "\n",
180 " # Kernel config\n",
181 " c.IPKernelApp.pylab = 'inline' # if you want plotting support always\n",
284 "```python\n",
285 "# The full path to an SSL/TLS certificate file.\n",
286 "c.NotebookApp.certfile = u'/Users/bgranger/.ipython/profile_my_profile/mycert.crt'\n",
182 287 "\n",
183 " # Notebook config\n",
184 " c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem'\n",
185 " c.NotebookApp.ip = '*'\n",
186 " c.NotebookApp.open_browser = False\n",
187 " c.NotebookApp.password = u'sha1:bcd259ccf...[your hashed password here]'\n",
188 " # It is a good idea to put it on a known, fixed port\n",
189 " c.NotebookApp.port = 9999\n",
288 "# The full path to a private key file for usage with SSL/TLS.\n",
289 "c.NotebookApp.keyfile = u'/Users/bgranger/.ipython/profile_my_profile/mycert.key'\n",
290 "```"
291 ]
292 },
293 {
294 "cell_type": "heading",
295 "level": 2,
296 "metadata": {},
297 "source": [
298 "Running a public notebook server"
299 ]
300 },
301 {
302 "cell_type": "markdown",
303 "metadata": {},
304 "source": [
305 "<div class=\"alert alert-error\">\n",
306 "Don't run a public notebook server unless you first secure it with a password and SSL/HTTPS as described above\n",
307 "</div>\n",
190 308 "\n",
191 "You can then start the notebook and access it later by pointing your browser \n",
192 "to ``https://your.host.com:9999`` with ``ipython notebook \n",
193 "--profile=nbserver``.\n",
309 "By default the notebook server only listens on the `localhost/127.0.0.1` network interface. If you want to connect to the notebook from another computers, or over the internet, you need to configure the notebook server to listen on all network interfaces and not open the browser. You will often also want to disable the automatic launching of the web browser.\n",
194 310 "\n",
195 "Running with a different URL prefix\n",
196 "-----------------------------------\n",
311 "This can be accomplished by passing a command line options.\n",
197 312 "\n",
198 "The notebook dashboard (the landing page with an overview\n",
199 "of the notebooks in your working directory) typically lives at the URL\n",
200 "``http://localhost:8888/``. If you prefer that it lives, together with the \n",
201 "rest of the notebook, under a sub-directory,\n",
202 "e.g. ``http://localhost:8888/ipython/``, you can do so with\n",
203 "configuration options like the following (see above for instructions about\n",
204 "modifying ``ipython_notebook_config.py``)::\n",
313 " ipython notebook --ip=* --no-browser\n",
205 314 "\n",
206 " c.NotebookApp.base_url = '/ipython/'\n",
207 " c.NotebookApp.webapp_settings = {'static_url_prefix':'/ipython/static/'}\n",
315 "You can also add the following to your`ipython_notebook_config.py` file:\n",
208 316 "\n",
209 "Using a different notebook store\n",
210 "--------------------------------\n",
317 "```python\n",
318 "c.NotebookApp.ip = '*'\n",
319 "c.NotebookApp.open_browser = False\n",
320 "```"
321 ]
322 },
323 {
324 "cell_type": "heading",
325 "level": 2,
326 "metadata": {},
327 "source": [
328 "Running with a different URL prefix"
329 ]
330 },
331 {
332 "cell_type": "markdown",
333 "metadata": {},
334 "source": [
335 "The notebook dashboard typically lives at the URL `http://localhost:8888/tree`. If you prefer that it lives, together with the \n",
336 "rest of the notebook web application, under a base URL prefix, such as `http://localhost:8888/ipython/tree`, you can do so by adding the following lines to your `ipython_notebook_config.py` file.\n",
211 337 "\n",
212 "By default, the notebook server stores the notebook documents that it saves as \n",
213 "files in the working directory of the notebook server, also known as the\n",
214 "``notebook_dir``. This logic is implemented in the \n",
215 ":class:`FileNotebookManager` class. However, the server can be configured to \n",
216 "use a different notebook manager class, which can \n",
217 "store the notebooks in a different format. \n",
338 "```python\n",
339 "c.NotebookApp.base_url = '/ipython/'\n",
340 "c.NotebookApp.webapp_settings = {'static_url_prefix':'/ipython/static/'}\n",
341 "```"
342 ]
343 },
344 {
345 "cell_type": "heading",
346 "level": 2,
347 "metadata": {},
348 "source": [
349 "Using a different notebook store"
350 ]
351 },
352 {
353 "cell_type": "markdown",
354 "metadata": {},
355 "source": [
356 "By default, the notebook server stores the notebook documents that it saves as files in the working directory of the notebook server, also known as the\n",
357 "`notebook_dir`. This logic is implemented in the `FileNotebookManager` class. However, the server can be configured to use a different notebook manager class, which can store the notebooks in a different format. \n",
218 358 "\n",
219 "The bookstore_ package currently allows users to store notebooks on Rackspace\n",
220 "CloudFiles or OpenStack Swift based object stores.\n",
359 "The [bookstore](https://github.com/rgbkrk/bookstore) package currently allows users to store notebooks on Rackspace CloudFiles or OpenStack Swift based object stores.\n",
221 360 "\n",
222 "Writing a notebook manager is as simple as extending the base class\n",
223 ":class:`NotebookManager`. The simple_notebook_manager_ provides a great example\n",
361 "Writing a notebook manager is as simple as extending the base class `NotebookManager`. The [simple_notebook_manager](https://github.com/khinsen/simple_notebook_manager) provides a great example\n",
224 362 "of an in memory notebook manager, created solely for the purpose of\n",
225 "illustrating the notebook manager API.\n",
226 "\n",
227 ".. _bookstore: https://github.com/rgbkrk/bookstore\n",
228 "\n",
229 ".. _simple_notebook_manager: https://github.com/khinsen/simple_notebook_manager\n",
230 "\n",
231 "Known issues\n",
232 "------------\n",
233 "\n",
234 "When behind a proxy, especially if your system or browser is set to autodetect\n",
235 "the proxy, the notebook web application might fail to connect to the server's\n",
236 "websockets, and present you with a warning at startup. In this case, you need\n",
237 "to configure your system not to use the proxy for the server's address.\n",
363 "illustrating the notebook manager API."
364 ]
365 },
366 {
367 "cell_type": "heading",
368 "level": 2,
369 "metadata": {},
370 "source": [
371 "Known issues"
372 ]
373 },
374 {
375 "cell_type": "markdown",
376 "metadata": {},
377 "source": [
378 "When behind a proxy, especially if your system or browser is set to autodetect the proxy, the notebook web application might fail to connect to the server's websockets, and present you with a warning at startup. In this case, you need to configure your system not to use the proxy for the server's address.\n",
238 379 "\n",
239 380 "For example, in Firefox, go to the Preferences panel, Advanced section,\n",
240 381 "Network tab, click 'Settings...', and add the address of the notebook server\n",
241 382 "to the 'No proxy for' field."
242 383 ]
243 384 }
244 385 ],
245 386 "metadata": {}
246 387 }
247 388 ]
248 389 } No newline at end of file
@@ -1,467 +1,171 b''
1 1 {
2 2 "metadata": {
3 3 "name": "",
4 "signature": "sha256:a52ac3735e5881fe8fe68f88d0113c3b1dca40cb809955db692fedb89b66a7fa"
4 "signature": "sha256:1cf51b66a39fb370f2fb3d08af95cfc79b8884f310509181b3b0586400e20b81"
5 5 },
6 6 "nbformat": 3,
7 7 "nbformat_minor": 0,
8 8 "worksheets": [
9 9 {
10 10 "cells": [
11 11 {
12 12 "cell_type": "heading",
13 13 "level": 1,
14 14 "metadata": {},
15 15 "source": [
16 16 "Running Code in the IPython Notebook"
17 17 ]
18 18 },
19 19 {
20 20 "cell_type": "markdown",
21 21 "metadata": {},
22 22 "source": [
23 "First and foremost, the IPython Notebook is an interactive environment for writing and running Python code."
23 "First and foremost, the IPython Notebook is an interactive environment for writing and running code. IPython is capable of running code in a wide range of languages. However, in IPython 2.0, the default kernel runs Python code."
24 24 ]
25 25 },
26 26 {
27 27 "cell_type": "heading",
28 28 "level": 2,
29 29 "metadata": {},
30 30 "source": [
31 31 "Code cells allow you to enter and run Python code"
32 32 ]
33 33 },
34 34 {
35 35 "cell_type": "markdown",
36 36 "metadata": {},
37 37 "source": [
38 "\n",
39 "<script type=\"text/javascript\">\n",
40 "var _toggle=false;\n",
41 "var hl = function (id, on){\n",
42 " $(id)[0].style.background = '';\n",
43 " if (on) {\n",
44 " $(id)[0].style.background = 'lightcyan';\n",
45 " }\n",
46 "};\n",
47 "</script>\n",
48 "\n",
49 "Run a code cell using `shift-enter` or pressing the <button class='btn btn-default btn-xs'><i class=\"icon-play fa fa-play\"></i></button> button in the <a href=\"#\" onMouseover=\"hl('#maintoolbar-container', 1)\" onMouseout=\"hl('#maintoolbar-container', 0)\">toolbar</a> above:"
38 "Run a code cell using `Shift-Enter` or pressing the <button><i class=\"icon-play fa fa-play\"></i></button> button in the toolbar above:"
50 39 ]
51 40 },
52 41 {
53 42 "cell_type": "code",
54 43 "collapsed": false,
55 44 "input": [
56 45 "a = 10"
57 46 ],
58 47 "language": "python",
59 48 "metadata": {},
60 49 "outputs": [],
61 50 "prompt_number": 1
62 51 },
63 52 {
64 53 "cell_type": "code",
65 54 "collapsed": false,
66 55 "input": [
67 56 "print(a)"
68 57 ],
69 58 "language": "python",
70 59 "metadata": {},
71 60 "outputs": [
72 61 {
73 62 "output_type": "stream",
74 63 "stream": "stdout",
75 64 "text": [
76 65 "10\n"
77 66 ]
78 67 }
79 68 ],
80 69 "prompt_number": 2
81 70 },
82 71 {
72 "cell_type": "markdown",
73 "metadata": {},
74 "source": [
75 "There are two other keyboard shortcuts for running code:\n",
76 "\n",
77 "* `Alt-Enter` runs the current cell and inserts a new one below.\n",
78 "* `Ctrl-Enter` run the current cell and enters command mode."
79 ]
80 },
81 {
83 82 "cell_type": "heading",
84 83 "level": 2,
85 84 "metadata": {},
86 85 "source": [
87 86 "Managing the IPython Kernel"
88 87 ]
89 88 },
90 89 {
91 90 "cell_type": "markdown",
92 91 "metadata": {},
93 92 "source": [
94 "Code is run in a separate process called the IPython Kernel. The Kernel can be interrupted or restarted. Try running the following cell and then hit the <button class='btn btn-default btn-xs'><i class='icon-stop fa fa-stop'></i></button> button in the <a href=\"#\" onMouseover=\"hl('#maintoolbar-container', 1)\" onMouseout=\"hl('#maintoolbar-container', 0)\">toolbar</a> above."
93 "Code is run in a separate process called the IPython Kernel. The Kernel can be interrupted or restarted. Try running the following cell and then hit the <button><i class='icon-stop fa fa-stop'></i></button> button in the toolbar above."
95 94 ]
96 95 },
97 96 {
98 97 "cell_type": "code",
99 98 "collapsed": false,
100 99 "input": [
101 100 "import time\n",
102 101 "time.sleep(10)"
103 102 ],
104 103 "language": "python",
105 104 "metadata": {},
106 105 "outputs": []
107 106 },
108 107 {
109 108 "cell_type": "markdown",
110 109 "metadata": {},
111 110 "source": [
112 111 "If the Kernel dies you will be prompted to restart it. Here we call the low-level system libc.time routine with the wrong argument via\n",
113 112 "ctypes to segfault the Python interpreter:"
114 113 ]
115 114 },
116 115 {
117 116 "cell_type": "code",
118 117 "collapsed": false,
119 118 "input": [
120 119 "import sys\n",
121 120 "from ctypes import CDLL\n",
122 "# This will crash a Linux or Mac system; equivalent calls can be made on Windows\n",
121 "# This will crash a Linux or Mac system\n",
122 "# equivalent calls can be made on Windows\n",
123 123 "dll = 'dylib' if sys.platform == 'darwin' else 'so.6'\n",
124 124 "libc = CDLL(\"libc.%s\" % dll) \n",
125 125 "libc.time(-1) # BOOM!!"
126 126 ],
127 127 "language": "python",
128 128 "metadata": {},
129 129 "outputs": []
130 130 },
131 131 {
132 132 "cell_type": "heading",
133 133 "level": 2,
134 134 "metadata": {},
135 135 "source": [
136 "All of the goodness of IPython works"
137 ]
138 },
139 {
140 "cell_type": "markdown",
141 "metadata": {},
142 "source": [
143 "Here are two system aliases:"
144 ]
145 },
146 {
147 "cell_type": "code",
148 "collapsed": false,
149 "input": [
150 "pwd"
151 ],
152 "language": "python",
153 "metadata": {},
154 "outputs": [
155 {
156 "metadata": {},
157 "output_type": "pyout",
158 "prompt_number": 1,
159 "text": [
160 "u'/Users/bgranger/Documents/Computing/IPython/code/ipython/examples/Notebook/Tutorials'"
161 ]
162 }
163 ],
164 "prompt_number": 1
165 },
166 {
167 "cell_type": "code",
168 "collapsed": false,
169 "input": [
170 "ls"
171 ],
172 "language": "python",
173 "metadata": {},
174 "outputs": [
175 {
176 "output_type": "stream",
177 "stream": "stdout",
178 "text": [
179 "Basic Output.ipynb Plotting with Matplotlib.ipynb data.csv\r\n",
180 "Custom Display Logic.ipynb Running Code.ipynb \u001b[34mimages\u001b[m\u001b[m/\r\n",
181 "Display System.ipynb Typesetting Math Using MathJax.ipynb\r\n",
182 "Markdown Cells.ipynb User Interface.ipynb\r\n"
183 ]
184 }
185 ],
186 "prompt_number": 2
187 },
188 {
189 "cell_type": "markdown",
190 "metadata": {},
191 "source": [
192 "Any command line program can be run using `!` with string interpolation from Python variables:"
193 ]
194 },
195 {
196 "cell_type": "code",
197 "collapsed": false,
198 "input": [
199 "message = 'The IPython notebook is great!'\n",
200 "# note: the echo command does not run on Windows, it's a unix command.\n",
201 "!echo $message"
202 ],
203 "language": "python",
204 "metadata": {},
205 "outputs": [
206 {
207 "output_type": "stream",
208 "stream": "stdout",
209 "text": [
210 "The IPython notebook is great!\r\n"
211 ]
212 }
213 ],
214 "prompt_number": 3
215 },
216 {
217 "cell_type": "markdown",
218 "metadata": {},
219 "source": [
220 "Tab completion works:"
136 "Cell menu"
221 137 ]
222 138 },
223 139 {
224 "cell_type": "code",
225 "collapsed": false,
226 "input": [
227 "import numpy"
228 ],
229 "language": "python",
230 "metadata": {},
231 "outputs": [],
232 "prompt_number": 5
233 },
234 {
235 "cell_type": "code",
236 "collapsed": false,
237 "input": [
238 "numpy.random."
239 ],
240 "language": "python",
241 "metadata": {},
242 "outputs": []
243 },
244 {
245 140 "cell_type": "markdown",
246 141 "metadata": {},
247 142 "source": [
248 "Shift-Tab on selection, or after `(` brings up a tooltip with the docstring:"
249 ]
250 },
251 {
252 "cell_type": "code",
253 "collapsed": false,
254 "input": [
255 "numpy.random.rand("
256 ],
257 "language": "python",
258 "metadata": {},
259 "outputs": []
260 },
261 {
262 "cell_type": "markdown",
263 "metadata": {},
264 "source": [
265 "Adding `?` opens the docstring in the pager below:"
266 ]
267 },
268 {
269 "cell_type": "code",
270 "collapsed": false,
271 "input": [
272 "magic?"
273 ],
274 "language": "python",
275 "metadata": {},
276 "outputs": [],
277 "prompt_number": 8
278 },
279 {
280 "cell_type": "markdown",
281 "metadata": {},
282 "source": [
283 "Exceptions are formatted nicely:"
143 "The \"Cell\" menu has a number of menu items for running code in different ways. These includes:\n",
144 "\n",
145 "* Run and Select Below\n",
146 "* Run and Insert Below\n",
147 "* Run All\n",
148 "* Run All Above\n",
149 "* Run All Below"
284 150 ]
285 151 },
286 152 {
287 "cell_type": "code",
288 "collapsed": false,
289 "input": [
290 "x = 1\n",
291 "y = 4\n",
292 "z = y/(1-x)"
293 ],
294 "language": "python",
295 "metadata": {},
296 "outputs": [
297 {
298 "ename": "ZeroDivisionError",
299 "evalue": "integer division or modulo by zero",
300 "output_type": "pyerr",
301 "traceback": [
302 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)",
303 "\u001b[0;32m<ipython-input-6-dc39888fd1d2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mz\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
304 "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero"
305 ]
306 }
307 ],
308 "prompt_number": 6
309 },
310 {
311 153 "cell_type": "heading",
312 154 "level": 2,
313 155 "metadata": {},
314 156 "source": [
315 "Working with external code"
157 "Restarting the kernels"
316 158 ]
317 159 },
318 160 {
319 161 "cell_type": "markdown",
320 162 "metadata": {},
321 163 "source": [
322 "There are a number of ways of getting external code into code cells."
323 ]
324 },
325 {
326 "cell_type": "markdown",
327 "metadata": {},
328 "source": [
329 "Pasting code with `>>>` prompts works as expected:"
330 ]
331 },
332 {
333 "cell_type": "code",
334 "collapsed": false,
335 "input": [
336 ">>> the_world_is_flat = 1\n",
337 ">>> if the_world_is_flat:\n",
338 "... print(\"Be careful not to fall off!\")"
339 ],
340 "language": "python",
341 "metadata": {},
342 "outputs": [
343 {
344 "output_type": "stream",
345 "stream": "stdout",
346 "text": [
347 "Be careful not to fall off!\n"
348 ]
349 }
350 ],
351 "prompt_number": 7
352 },
353 {
354 "cell_type": "markdown",
355 "metadata": {},
356 "source": [
357 "The `%load` magic lets you load code from URLs or local files:"
164 "The kernel maintains the state of a notebook's computations. You can reset this state by restarting the kernel. This is done by clicking on the <button><i class='icon-repeat'></i></button> in the toolbar above."
358 165 ]
359 },
360 {
361 "cell_type": "code",
362 "collapsed": false,
363 "input": [
364 "%load?"
365 ],
366 "language": "python",
367 "metadata": {},
368 "outputs": [],
369 "prompt_number": 8
370 },
371 {
372 "cell_type": "code",
373 "collapsed": false,
374 "input": [
375 "%matplotlib inline"
376 ],
377 "language": "python",
378 "metadata": {},
379 "outputs": [],
380 "prompt_number": 9
381 },
382 {
383 "cell_type": "code",
384 "collapsed": false,
385 "input": [
386 "%load http://matplotlib.org/mpl_examples/showcase/integral_demo.py"
387 ],
388 "language": "python",
389 "metadata": {},
390 "outputs": [],
391 "prompt_number": 10
392 },
393 {
394 "cell_type": "code",
395 "collapsed": false,
396 "input": [
397 "\"\"\"\n",
398 "Plot demonstrating the integral as the area under a curve.\n",
399 "\n",
400 "Although this is a simple example, it demonstrates some important tweaks:\n",
401 "\n",
402 " * A simple line plot with custom color and line width.\n",
403 " * A shaded region created using a Polygon patch.\n",
404 " * A text label with mathtext rendering.\n",
405 " * figtext calls to label the x- and y-axes.\n",
406 " * Use of axis spines to hide the top and right spines.\n",
407 " * Custom tick placement and labels.\n",
408 "\"\"\"\n",
409 "import numpy as np\n",
410 "import matplotlib.pyplot as plt\n",
411 "from matplotlib.patches import Polygon\n",
412 "\n",
413 "\n",
414 "def func(x):\n",
415 " return (x - 3) * (x - 5) * (x - 7) + 85\n",
416 "\n",
417 "\n",
418 "a, b = 2, 9 # integral limits\n",
419 "x = np.linspace(0, 10)\n",
420 "y = func(x)\n",
421 "\n",
422 "fig, ax = plt.subplots()\n",
423 "plt.plot(x, y, 'r', linewidth=2)\n",
424 "plt.ylim(ymin=0)\n",
425 "\n",
426 "# Make the shaded region\n",
427 "ix = np.linspace(a, b)\n",
428 "iy = func(ix)\n",
429 "verts = [(a, 0)] + list(zip(ix, iy)) + [(b, 0)]\n",
430 "poly = Polygon(verts, facecolor='0.9', edgecolor='0.5')\n",
431 "ax.add_patch(poly)\n",
432 "\n",
433 "plt.text(0.5 * (a + b), 30, r\"$\\int_a^b f(x)\\mathrm{d}x$\",\n",
434 " horizontalalignment='center', fontsize=20)\n",
435 "\n",
436 "plt.figtext(0.9, 0.05, '$x$')\n",
437 "plt.figtext(0.1, 0.9, '$y$')\n",
438 "\n",
439 "ax.spines['right'].set_visible(False)\n",
440 "ax.spines['top'].set_visible(False)\n",
441 "ax.xaxis.set_ticks_position('bottom')\n",
442 "\n",
443 "ax.set_xticks((a, b))\n",
444 "ax.set_xticklabels(('$a$', '$b$'))\n",
445 "ax.set_yticks([])\n",
446 "\n",
447 "plt.show()\n"
448 ],
449 "language": "python",
450 "metadata": {},
451 "outputs": [
452 {
453 "metadata": {},
454 "output_type": "display_data",
455 "png": "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\niISh/weZPyRnS1m/IAAAAABJRU5ErkJggg==\n",
456 "text": [
457 "<matplotlib.figure.Figure at 0x108604e50>"
458 ]
459 }
460 ],
461 "prompt_number": 11
462 166 }
463 167 ],
464 168 "metadata": {}
465 169 }
466 170 ]
467 171 } No newline at end of file
@@ -1,272 +1,319 b''
1 1 {
2 2 "metadata": {
3 3 "name": "",
4 "signature": "sha256:056f083d2453c83c77ea0a659e9185084426263c9e42b4c0ccbb91c773d9503b"
4 "signature": "sha256:3b7cae0c0936f25e6ccb7acafe310c08a4162a1a7fd66fa9874a52cffa0f64f9"
5 5 },
6 6 "nbformat": 3,
7 7 "nbformat_minor": 0,
8 8 "worksheets": [
9 9 {
10 10 "cells": [
11 11 {
12 12 "cell_type": "heading",
13 13 "level": 1,
14 14 "metadata": {},
15 15 "source": [
16 16 "Markdown Cells"
17 17 ]
18 18 },
19 19 {
20 20 "cell_type": "markdown",
21 21 "metadata": {},
22 22 "source": [
23 23 "Text can be added to IPython Notebooks using Markdown cells. Markdown is a popular markup language that is a superset of HTML. Its specification can be found here:\n",
24 24 "\n",
25 25 "<http://daringfireball.net/projects/markdown/>"
26 26 ]
27 27 },
28 28 {
29 29 "cell_type": "heading",
30 30 "level": 2,
31 31 "metadata": {},
32 32 "source": [
33 33 "Markdown basics"
34 34 ]
35 35 },
36 36 {
37 37 "cell_type": "markdown",
38 38 "metadata": {},
39 39 "source": [
40 40 "You can make text *italic* or **bold**."
41 41 ]
42 42 },
43 43 {
44 44 "cell_type": "markdown",
45 45 "metadata": {},
46 46 "source": [
47 47 "You can build nested itemized or enumerated lists:\n",
48 48 "\n",
49 49 "* One\n",
50 50 " - Sublist\n",
51 51 " - This\n",
52 52 " - Sublist\n",
53 53 " - That\n",
54 54 " - The other thing\n",
55 55 "* Two\n",
56 56 " - Sublist\n",
57 57 "* Three\n",
58 58 " - Sublist\n",
59 59 "\n",
60 60 "Now another list:\n",
61 61 "\n",
62 62 "1. Here we go\n",
63 63 " 1. Sublist\n",
64 64 " 2. Sublist\n",
65 65 "2. There we go\n",
66 66 "3. Now this"
67 67 ]
68 68 },
69 69 {
70 70 "cell_type": "markdown",
71 71 "metadata": {},
72 72 "source": [
73 73 "You can add horizontal rules:\n",
74 74 "\n",
75 75 "---"
76 76 ]
77 77 },
78 78 {
79 79 "cell_type": "markdown",
80 80 "metadata": {},
81 81 "source": [
82 82 "Here is a blockquote:\n",
83 83 "\n",
84 84 "> Beautiful is better than ugly.\n",
85 85 "> Explicit is better than implicit.\n",
86 86 "> Simple is better than complex.\n",
87 87 "> Complex is better than complicated.\n",
88 88 "> Flat is better than nested.\n",
89 89 "> Sparse is better than dense.\n",
90 90 "> Readability counts.\n",
91 91 "> Special cases aren't special enough to break the rules.\n",
92 92 "> Although practicality beats purity.\n",
93 93 "> Errors should never pass silently.\n",
94 94 "> Unless explicitly silenced.\n",
95 95 "> In the face of ambiguity, refuse the temptation to guess.\n",
96 96 "> There should be one-- and preferably only one --obvious way to do it.\n",
97 97 "> Although that way may not be obvious at first unless you're Dutch.\n",
98 98 "> Now is better than never.\n",
99 99 "> Although never is often better than *right* now.\n",
100 100 "> If the implementation is hard to explain, it's a bad idea.\n",
101 101 "> If the implementation is easy to explain, it may be a good idea.\n",
102 102 "> Namespaces are one honking great idea -- let's do more of those!"
103 103 ]
104 104 },
105 105 {
106 106 "cell_type": "markdown",
107 107 "metadata": {},
108 108 "source": [
109 109 "And shorthand for links:\n",
110 110 "\n",
111 111 "[IPython's website](http://ipython.org)"
112 112 ]
113 113 },
114 114 {
115 115 "cell_type": "heading",
116 116 "level": 2,
117 117 "metadata": {},
118 118 "source": [
119 119 "Headings"
120 120 ]
121 121 },
122 122 {
123 123 "cell_type": "markdown",
124 124 "metadata": {},
125 125 "source": [
126 126 "If you want, you can add headings using Markdown's syntax:\n",
127 127 "\n",
128 128 "# Heading 1\n",
129 129 "# Heading 2\n",
130 130 "## Heading 2.1\n",
131 131 "## Heading 2.2"
132 132 ]
133 133 },
134 134 {
135 135 "cell_type": "markdown",
136 136 "metadata": {},
137 137 "source": [
138 138 "**BUT most of the time you should use the Notebook's Heading Cells to organize your Notebook content**, as they provide meaningful structure that can be interpreted by other tools, not just large bold fonts."
139 139 ]
140 140 },
141 141 {
142 142 "cell_type": "heading",
143 143 "level": 2,
144 144 "metadata": {},
145 145 "source": [
146 146 "Embedded code"
147 147 ]
148 148 },
149 149 {
150 150 "cell_type": "markdown",
151 151 "metadata": {},
152 152 "source": [
153 153 "You can embed code meant for illustration instead of execution in Python:\n",
154 154 "\n",
155 155 " def f(x):\n",
156 156 " \"\"\"a docstring\"\"\"\n",
157 157 " return x**2\n",
158 158 "\n",
159 159 "or other languages:\n",
160 160 "\n",
161 161 " if (i=0; i<n; i++) {\n",
162 162 " printf(\"hello %d\\n\", i);\n",
163 163 " x += 4;\n",
164 164 " }"
165 165 ]
166 166 },
167 167 {
168 168 "cell_type": "heading",
169 169 "level": 2,
170 170 "metadata": {},
171 171 "source": [
172 172 "LaTeX equations"
173 173 ]
174 174 },
175 175 {
176 176 "cell_type": "markdown",
177 177 "metadata": {},
178 178 "source": [
179 179 "Courtesy of MathJax, you can include mathematical expressions both inline: \n",
180 180 "$e^{i\\pi} + 1 = 0$ and displayed:\n",
181 181 "\n",
182 182 "$$e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$$"
183 183 ]
184 184 },
185 185 {
186 186 "cell_type": "heading",
187 187 "level": 2,
188 188 "metadata": {},
189 189 "source": [
190 "Github flavored markdown (GFM)"
191 ]
192 },
193 {
194 "cell_type": "markdown",
195 "metadata": {},
196 "source": [
197 "The Notebook webapp support Github flavored markdown meaning that you can use triple backticks for code blocks \n",
198 "<pre>\n",
199 "```python\n",
200 "print \"Hello World\"\n",
201 "```\n",
202 "\n",
203 "```javascript\n",
204 "console.log(\"Hello World\")\n",
205 "```\n",
206 "</pre>\n",
207 "\n",
208 "Gives \n",
209 "```python\n",
210 "print \"Hello World\"\n",
211 "```\n",
212 "\n",
213 "```javascript\n",
214 "console.log(\"Hello World\")\n",
215 "```\n",
216 "\n",
217 "And a table like this : \n",
218 "\n",
219 "<pre>\n",
220 "| This | is |\n",
221 "|------|------|\n",
222 "| a | table| \n",
223 "</pre>\n",
224 "\n",
225 "A nice Html Table\n",
226 "\n",
227 "| This | is |\n",
228 "|------|------|\n",
229 "| a | table| "
230 ]
231 },
232 {
233 "cell_type": "heading",
234 "level": 2,
235 "metadata": {},
236 "source": [
190 237 "General HTML"
191 238 ]
192 239 },
193 240 {
194 241 "cell_type": "markdown",
195 242 "metadata": {},
196 243 "source": [
197 244 "Because Markdown is a superset of HTML you can even add things like HTML tables:\n",
198 245 "\n",
199 246 "<table>\n",
200 247 "<tr>\n",
201 248 "<th>Header 1</th>\n",
202 249 "<th>Header 2</th>\n",
203 250 "</tr>\n",
204 251 "<tr>\n",
205 252 "<td>row 1, cell 1</td>\n",
206 253 "<td>row 1, cell 2</td>\n",
207 254 "</tr>\n",
208 255 "<tr>\n",
209 256 "<td>row 2, cell 1</td>\n",
210 257 "<td>row 2, cell 2</td>\n",
211 258 "</tr>\n",
212 259 "</table>"
213 260 ]
214 261 },
215 262 {
216 263 "cell_type": "heading",
217 264 "level": 2,
218 265 "metadata": {},
219 266 "source": [
220 267 "Local files"
221 268 ]
222 269 },
223 270 {
224 271 "cell_type": "markdown",
225 272 "metadata": {},
226 273 "source": [
227 274 "If you have local files in your Notebook directory, you can refer to these files in Markdown cells directly:\n",
228 275 "\n",
229 276 " [subdirectory/]<filename>\n",
230 277 "\n",
231 278 "For example, in the images folder, we have the Python logo:\n",
232 279 "\n",
233 280 " <img src=\"images/python-logo.svg\" />\n",
234 281 "\n",
235 282 "<img src=\"images/python-logo.svg\" />\n",
236 283 "\n",
237 284 "and a video with the HTML5 video tag:\n",
238 285 "\n",
239 286 " <video controls src=\"images/animation.m4v\" />\n",
240 287 "\n",
241 288 "<video controls src=\"images/animation.m4v\" />\n",
242 289 "\n",
243 290 "These do not embed the data into the notebook file, and require that the files exist when you are viewing the notebook."
244 291 ]
245 292 },
246 293 {
247 294 "cell_type": "heading",
248 295 "level": 3,
249 296 "metadata": {},
250 297 "source": [
251 298 "Security of local files"
252 299 ]
253 300 },
254 301 {
255 302 "cell_type": "markdown",
256 303 "metadata": {},
257 304 "source": [
258 305 "Note that this means that the IPython notebook server also acts as a generic file server\n",
259 306 "for files inside the same tree as your notebooks. Access is not granted outside the\n",
260 307 "notebook folder so you have strict control over what files are visible, but for this\n",
261 308 "reason it is highly recommended that you do not run the notebook server with a notebook\n",
262 309 "directory at a high level in your filesystem (e.g. your home directory).\n",
263 310 "\n",
264 311 "When you run the notebook in a password-protected manner, local file access is restricted\n",
265 312 "to authenticated users unless read-only views are active."
266 313 ]
267 314 }
268 315 ],
269 316 "metadata": {}
270 317 }
271 318 ]
272 319 } No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now