##// END OF EJS Templates
Miscellaneous doc fixes
Thomas Kluyver -
Show More
@@ -1,8 +1,9 b''
1 1 .. _extensions_storemagic:
2 2
3 3 ==========
4 4 storemagic
5 5 ==========
6 6
7 7 .. automodule:: IPython.extensions.storemagic
8 :members: store
8
9 .. automethod:: StoreMagics.store
@@ -1,495 +1,495 b''
1 1 .. _htmlnotebook:
2 2
3 3 The IPython Notebook
4 4 ====================
5 5
6 6 Introduction
7 7 ------------
8 8
9 9 The notebook extends the console-based approach to interactive computing in
10 10 a qualitatively new direction, providing a web-based application suitable for
11 11 capturing the whole computation process: developing, documenting, and
12 12 executing code, as well as communicating the results. The IPython notebook
13 13 combines two components:
14 14
15 15 **A web application**: a browser-based tool for interactive authoring of
16 16 documents which combine explanatory text, mathematics, computations and their
17 17 rich media output.
18 18
19 19 **Notebook documents**: a representation of all content visible in the web
20 20 application, including inputs and outputs of the computations, explanatory
21 21 text, mathematics, images, and rich media representations of objects.
22 22
23 23 .. seealso::
24 24
25 25 See the :ref:`installation documentation <installnotebook>` for directions
26 26 on how to install the notebook and its dependencies.
27 27
28 28
29 29 Main features of the web application
30 30 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
31 31
32 32 * In-browser editing for code, with automatic syntax highlighting,
33 33 indentation, and tab completion/introspection.
34 34
35 35 * The ability to execute code from the browser, with the results of
36 36 computations attached to the code which generated them.
37 37
38 38 * Displaying the result of computation using rich media representations, such
39 39 as HTML, LaTeX, PNG, SVG, etc. For example, publication-quality figures
40 40 rendered by the matplotlib_ library, can be included inline.
41 41
42 42 * In-browser editing for rich text using the Markdown_ markup language, which
43 43 can provide commentary for the code, is not limited to plain text.
44 44
45 45 * The ability to easily include mathematical notation within markdown cells
46 46 using LaTeX, and rendered natively by MathJax_.
47 47
48 48
49 49
50 50 .. _MathJax: http://www.mathjax.org/
51 51
52 52
53 53 Notebook documents
54 54 ~~~~~~~~~~~~~~~~~~
55 55 Notebook documents contains the inputs and outputs of a interactive session as
56 56 well as additional text that accompanies the code but is not meant for
57 57 execution. In this way, notebook files can serve as a complete computational
58 58 record of a session, interleaving executable code with explanatory text,
59 59 mathematics, and rich representations of resulting objects. These documents
60 60 are internally JSON_ files and are saved with the ``.ipynb`` extension. Since
61 61 JSON is a plain text format, they can be version-controlled and shared with
62 62 colleagues.
63 63
64 64 .. _JSON: http://en.wikipedia.org/wiki/JSON
65 65
66 66 Notebooks may be exported to a range of static formats, including HTML (for
67 67 example, for blog posts), reStructeredText, LaTeX, PDF, and slide shows, via
68 68 the new :ref:`nbconvert <nbconvert>` command.
69 69
70 70 Furthermore, any ``.ipynb`` notebook document available from a public
71 71 URL can be shared via the `IPython Notebook Viewer <nbviewer>`_ (nbviewer_).
72 72 This service loads the notebook document from the URL and renders it as a
73 73 static web page. The results may thus be shared with a colleague, or as a
74 74 public blog post, without other users needing to install IPython themselves.
75 75 In effect, nbviewer_ is simply :ref:`nbconvert <nbconvert>` as a web service,
76 76 so you can do your own static conversions with nbconvert, without relying on
77 77 nbviewer.
78 78
79 79
80 80
81 81 .. seealso::
82 82
83 83 :ref:`Details on the notebook JSON file format <notebook_format>`
84 84
85 85
86 86 Starting the notebook server
87 87 ----------------------------
88 88
89 89 You can start running a notebook server from the command line using the
90 90 following command::
91 91
92 92 ipython notebook
93 93
94 94 This will print some information about the notebook server in your console,
95 95 and open a web browser to the URL of the web application (by default,
96 96 ``http://127.0.0.1:8888``).
97 97
98 98 The landing page of the IPython notebook web application, the **dashboard**,
99 99 shows the notebooks currently available in the notebook directory (by default,
100 100 the directory from which the notebook server was started).
101 101
102 102 You can create new notebooks from the dashboard with the ``New Notebook``
103 103 button, or open existing ones by clicking on their name. You can also drag
104 104 and drop ``.ipynb`` notebooks and standard ``.py`` Python source code files
105 105 into the notebook list area.
106 106
107 107 When starting a notebook server from the command line, you can also open a
108 108 particular notebook directly, bypassing the dashboard, with ``ipython notebook
109 109 my_notebook.ipynb``. The ``.ipynb`` extension is assumed if no extension is
110 110 given.
111 111
112 112 When you are inside an open notebook, the `File | Open...` menu option will
113 113 open the dashboard in a new browser tab, to allow you to open another notebook
114 114 from the notebook directory or to create a new notebook.
115 115
116 116
117 117 .. note::
118 118
119 119 You can start more than one notebook server at the same time, if you want
120 120 to work on notebooks in different directories. By default the first
121 121 notebook server starts on port 8888, and later notebook servers search for
122 122 ports near that one. You can also manually specify the port with the
123 123 ``--port`` option.
124 124
125 125 Creating a new notebook document
126 126 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127 127
128 128 A new notebook may be created at any time, either from the dashboard, or using
129 129 the `File | New` menu option from within an active notebook. The new notebook
130 130 is created within the same directory and will open in a new browser tab. It
131 131 will also be reflected as a new entry in the notebook list on the dashboard.
132 132
133 133
134 134 Opening notebooks
135 135 ~~~~~~~~~~~~~~~~~
136 136 An open notebook has **exactly one** interactive session connected to an
137 137 :ref:`IPython kernel <ipythonzmq>`, which will execute code sent by the user
138 138 and communicate back results. This kernel remains active if the web browser
139 139 window is closed, and reopening the same notebook from the dashboard will
140 140 reconnect the web application to the same kernel. In the dashboard, notebooks
141 141 with an active kernel have a ``Shutdown`` button next to them, whereas
142 142 notebooks without an active kernel have a ``Delete`` button in its place.
143 143
144 144 Other clients may connect to the same underlying IPython kernel.
145 145 The notebook server always prints to the terminal the full details of
146 146 how to connect to each kernel, with messages such as the following::
147 147
148 148 [NotebookApp] Kernel started: 87f7d2c0-13e3-43df-8bb8-1bd37aaf3373
149 149
150 150 This long string is the kernel's ID which is sufficient for getting the
151 151 information necessary to connect to the kernel. You can also request this
152 152 connection data by running the ``%connect_info`` :ref:`magic
153 153 <magics_explained>`. This will print the same ID information as well as the
154 154 content of the JSON data structure it contains.
155 155
156 156 You can then, for example, manually start a Qt console connected to the *same*
157 157 kernel from the command line, by passing a portion of the ID::
158 158
159 159 $ ipython qtconsole --existing 87f7d2c0
160 160
161 161 Without an ID, ``--existing`` will connect to the most recently
162 162 started kernel. This can also be done by running the ``%qtconsole``
163 163 :ref:`magic <magics_explained>` in the notebook.
164 164
165 165 .. seealso::
166 166
167 167 :ref:`ipythonzmq`
168 168
169 169 Notebook user interface
170 170 -----------------------
171 171
172 172 When you create a new notebook document, you will be presented with the
173 173 **notebook name**, a **menu bar**, a **toolbar** and an empty **code
174 174 cell**.
175 175
176 176 **notebook name**: The name of the notebook document is displayed at the top
177 177 of the page, next to the ``IP[y]: Notebook`` logo. This name reflects the name
178 178 of the ``.ipynb`` notebook document file. Clicking on the notebook name
179 179 brings up a dialog which allows you to rename it. Thus, renaming a notebook
180 180 from "Untitled0" to "My first notebook" in the browser, renames the
181 181 ``Untitled0.ipynb`` file to ``My first notebook.ipynb``.
182 182
183 183 **menu bar**: The menu bar presents different options that may be used to
184 184 manipulate the way the notebook functions.
185 185
186 186 **toolbar**: The tool bar gives a quick way of performing the most-used
187 187 operations within the notebook, by clicking on an icon.
188 188
189 189 **code cell**: the default type of cell, read on for an explanation of cells
190 190
191 191
192 192 Structure of a notebook document
193 193 --------------------------------
194 194
195 195 The notebook consists of a sequence of cells. A cell is a multi-line
196 196 text input field, and its contents can be executed by using
197 197 :kbd:`Shift-Enter`, or by clicking either the "Play" button the toolbar, or
198 198 `Cell | Run` in the menu bar. The execution behavior of a cell is determined
199 199 the cell's type. There are four types of cells: **code cells**, **markdown
200 200 cells**, **raw cells** and **heading cells**. Every cell starts off
201 201 being a **code cell**, but its type can be changed by using a dropdown on the
202 202 toolbar (which will be "Code", initially), or via :ref:`keyboard shortcuts
203 203 <keyboard-shortcuts>`.
204 204
205 205 For more information on the different things you can do in a notebook,
206 206 see the `collection of examples
207 207 <https://github.com/ipython/ipython/tree/master/examples/notebooks#readme>`_.
208 208
209 209 Code cells
210 210 ~~~~~~~~~~
211 211 A *code cell* allows you to edit and write new code, with full syntax
212 212 highlighting and tab completion. By default, the language associated to a code
213 213 cell is Python, but other languages, such as ``Julia`` and ``R``, can be
214 214 handled using :ref:`cell magic commands <magics_explained>`.
215 215
216 216 When a code cell is executed, code that it contains is sent to the kernel
217 217 associated with the notebook. The results that are returned from this
218 218 computation are then displayed in the notebook as the cell's *output*. The
219 219 output is not limited to text, with many other possible forms of output are
220 220 also possible, including ``matplotlib`` figures and HTML tables (as used, for
221 221 example, in the ``pandas`` data analysis package). This is known as IPython's
222 222 *rich display* capability.
223 223
224 224 .. seealso::
225 225
226 226 `Basic Output`_ example notebook
227 227
228 228 `Rich Display System`_ example notebook
229 229
230 230 Markdown cells
231 231 ~~~~~~~~~~~~~~
232 232 You can document the computational process in a literate way, alternating
233 233 descriptive text with code, using *rich text*. In IPython this is accomplished
234 234 by marking up text with the Markdown language. The corresponding cells are
235 235 called *Markdown cells*. The Markdown language provides a simple way to
236 236 perform this text markup, that is, to specify which parts of the text should
237 237 be emphasized (italics), bold, form lists, etc.
238 238
239 239
240 240 When a Markdown cell is executed, the Markdown code is converted into
241 241 the corresponding formatted rich text. Markdown allows arbitrary HTML code for
242 242 formatting.
243 243
244 244 Within Markdown cells, you can also include *mathematics* in a straightforward
245 245 way, using standard LaTeX notation: ``$...$`` for inline mathematics and
246 246 ``$$...$$`` for displayed mathematics. When the Markdown cell is executed,
247 247 the LaTeX portions are automatically rendered in the HTML output as equations
248 248 with high quality typography. This is made possible by MathJax_, which
249 249 supports a `large subset <mathjax_tex>`_ of LaTeX functionality
250 250
251 251 .. _mathjax_tex: http://docs.mathjax.org/en/latest/tex.html
252 252
253 253 Standard mathematics environments defined by LaTeX and AMS-LaTeX (the
254 254 `amsmath` package) also work, such as
255 255 ``\begin{equation}...\end{equation}``, and ``\begin{align}...\end{align}``.
256 256 New LaTeX macros may be defined using standard methods,
257 257 such as ``\newcommand``, by placing them anywhere *between math delimiters* in
258 258 a Markdown cell. These definitions are then available throughout the rest of
259 259 the IPython session.
260 260
261 261 .. seealso::
262 262
263 263 `Markdown Cells`_ example notebook
264 264
265 265 Raw cells
266 266 ~~~~~~~~~
267 267
268 268 *Raw* cells provide a place in which you can write *output* directly.
269 269 Raw cells are not evaluated by the notebook.
270 270 When passed through :ref:`nbconvert <nbconvert>`, raw cells arrive in the
271 271 destination format unmodified. For example, this allows you to type full LaTeX
272 272 into a raw cell, which will only be rendered by LaTeX after conversion by
273 273 nbconvert.
274 274
275 275 Heading cells
276 276 ~~~~~~~~~~~~~
277 277
278 278 You can provide a conceptual structure for your computational document as a
279 279 whole using different levels of headings; there are 6 levels available, from
280 280 level 1 (top level) down to level 6 (paragraph). These can be used later for
281 281 constructing tables of contents, etc. As with Markdown cells, a heading
282 282 cell is replaced by a rich text rendering of the heading when the cell is
283 283 executed.
284 284
285 285
286 286 Basic workflow
287 287 --------------
288 288
289 289 The normal workflow in a notebook is, then, quite similar to a standard
290 290 IPython session, with the difference that you can edit cells in-place multiple
291 291 times until you obtain the desired results, rather than having to
292 292 rerun separate scripts with the ``%run`` magic command.
293 293
294 294
295 295 Typically, you will work on a computational problem in pieces, organizing
296 296 related ideas into cells and moving forward once previous parts work
297 297 correctly. This is much more convenient for interactive exploration than
298 298 breaking up a computation into scripts that must be executed together, as was
299 299 previously necessary, especially if parts of them take a long time to run.
300 300
301 301 At certain moments, it may be necessary to interrupt a calculation which is
302 302 taking too long to complete. This may be done with the `Kernel | Interrupt`
303 303 menu option, or the :kbd:`Ctrl-m i` keyboard shortcut.
304 304 Similarly, it may be necessary or desirable to restart the whole computational
305 305 process, with the `Kernel | Restart` menu option or :kbd:`Ctrl-m .`
306 306 shortcut.
307 307
308 308 A notebook may be downloaded in either a ``.ipynb`` or ``.py`` file from the
309 309 menu option `File | Download as`. Choosing the ``.py`` option downloads a
310 310 Python ``.py`` script, in which all rich output has been removed and the
311 311 content of markdown cells have been inserted as comments.
312 312
313 313 .. seealso::
314 314
315 315 `Running Code in the IPython Notebook`_ example notebook
316 316
317 317 `Basic Output`_ example notebook
318 318
319 319 :ref:`a warning about doing "roundtrip" conversions <note_about_roundtrip>`.
320 320
321 321 .. _keyboard-shortcuts:
322 322
323 323 Keyboard shortcuts
324 324 ~~~~~~~~~~~~~~~~~~
325 325 All actions in the notebook can be performed with the mouse, but keyboard
326 326 shortcuts are also available for the most common ones. The essential shortcuts
327 327 to remember are the following:
328 328
329 329 * :kbd:`Shift-Enter`: run cell
330 330 Execute the current cell, show output (if any), and jump to the next cell
331 331 below. If :kbd:`Shift-Enter` is invoked on the last cell, a new code
332 332 cell will also be created. Note that in the notebook, typing :kbd:`Enter`
333 333 on its own *never* forces execution, but rather just inserts a new line in
334 334 the current cell. :kbd:`Shift-Enter` is equivalent to clicking the
335 335 ``Cell | Run`` menu item.
336 336
337 337 * :kbd:`Ctrl-Enter`: run cell in-place
338 338 Execute the current cell as if it were in "terminal mode", where any
339 339 output is shown, but the cursor *remains* in the current cell. The cell's
340 340 entire contents are selected after execution, so you can just start typing
341 341 and only the new input will be in the cell. This is convenient for doing
342 342 quick experiments in place, or for querying things like filesystem
343 343 content, without needing to create additional cells that you may not want
344 344 to be saved in the notebook.
345 345
346 346 * :kbd:`Alt-Enter`: run cell, insert below
347 347 Executes the current cell, shows the output, and inserts a *new*
348 348 cell between the current cell and the cell below (if one exists). This
349 349 is thus a shortcut for the sequence :kbd:`Shift-Enter`, :kbd:`Ctrl-m a`.
350 350 (:kbd:`Ctrl-m a` adds a new cell above the current one.)
351 351
352 352 * :kbd:`Ctrl-m`:
353 353 This is the prefix for *all* other shortcuts, which consist of :kbd:`Ctrl-m`
354 354 followed by a single letter or character. For example, if you type
355 355 :kbd:`Ctrl-m h` (that is, the sole letter :kbd:`h` after :kbd:`Ctrl-m`),
356 356 IPython will show you all the available keyboard shortcuts.
357 357
358 358
359 359 ..
360 360 TODO: these live in IPython/html/static/notebook/js/quickhelp.js
361 361 They were last updated for IPython 1.0 release, so update them again for
362 362 future releases.
363 363
364 364 Here is the complete set of keyboard shortcuts available:
365 365
366 366 ============ ==========================
367 367 **Shortcut** **Action**
368 368 ------------ --------------------------
369 369 Shift-Enter run cell
370 370 Ctrl-Enter run cell in-place
371 371 Alt-Enter run cell, insert below
372 372 Ctrl-m x cut cell
373 373 Ctrl-m c copy cell
374 374 Ctrl-m v paste cell
375 375 Ctrl-m d delete cell
376 376 Ctrl-m z undo last cell deletion
377 377 Ctrl-m - split cell
378 378 Ctrl-m a insert cell above
379 379 Ctrl-m b insert cell below
380 380 Ctrl-m o toggle output
381 381 Ctrl-m O toggle output scroll
382 382 Ctrl-m l toggle line numbers
383 383 Ctrl-m s save notebook
384 384 Ctrl-m j move cell down
385 385 Ctrl-m k move cell up
386 386 Ctrl-m y code cell
387 387 Ctrl-m m markdown cell
388 388 Ctrl-m t raw cell
389 389 Ctrl-m 1-6 heading 1-6 cell
390 390 Ctrl-m p select previous
391 391 Ctrl-m n select next
392 392 Ctrl-m i interrupt kernel
393 393 Ctrl-m . restart kernel
394 394 Ctrl-m h show keyboard shortcuts
395 395 ============ ==========================
396 396
397 397
398 398
399 399
400 400
401 401 Plotting
402 402 --------
403 403 One major feature of the notebook is the ability to display plots that are the
404 404 output of running code cells. IPython is designed to work seamlessly with the
405 405 matplotlib_ plotting library to provide this functionality.
406 406
407 407 To set this up, before any plotting is performed you must execute the
408 408 ``%matplotlib`` :ref:`magic command <magics_explained>`. This performs the
409 409 necessary behind-the-scenes setup for IPython to work correctly hand in hand
410 410 with ``matplotlib``; it does *not*, however, actually execute any Python
411 411 ``import`` commands, that is, no names are added to the namespace.
412 412
413 413 If the ``%matplotlib`` magic is called without an argument, the
414 414 output of a plotting command is displayed using the default ``matplotlib``
415 415 backend in a separate window. Alternatively, the backend can be explicitly
416 416 requested using, for example::
417 417
418 418 %matplotlib gtk
419 419
420 420 A particularly interesting backend, provided by IPython, is the ``inline``
421 421 backend. This is available only for the IPython Notebook and the
422 422 :ref:`IPython QtConsole <qtconsole>`. It can be invoked as follows::
423 423
424 424 %matplotlib inline
425 425
426 426 With this backend, the output of plotting commands is displayed *inline*
427 427 within the notebook, directly below the code cell that produced it. The
428 428 resulting plots will then also be stored in the notebook document.
429 429
430 430 .. seealso::
431 431
432 432 `Plotting with Matplotlib`_ example notebook
433 433
434 434
435 435 Configuring the IPython Notebook
436 436 --------------------------------
437 437 The notebook server can be run with a variety of command line arguments.
438 438 To see a list of available options enter::
439 439
440 440 $ ipython notebook --help
441 441
442 442 Defaults for these options can also be set by creating a file named
443 443 ``ipython_notebook_config.py`` in your IPython *profile folder*. The profile
444 444 folder is a subfolder of your IPython directory; to find out where it is
445 445 located, run::
446 446
447 447 $ ipython locate
448 448
449 449 To create a new set of default configuration files, with lots of information
450 450 on available options, use::
451 451
452 452 $ ipython profile create
453 453
454 454 .. seealso::
455 455
456 456 :ref:`config_overview`, in particular :ref:`Profiles`.
457 457
458 458 :ref:`notebook_security`
459 459
460 460 :ref:`notebook_public_server`
461 461
462 462
463 463 Importing ``.py`` files
464 464 -----------------------
465 465
466 466 ``.py`` files will be imported as a notebook with
467 467 the same basename, but an ``.ipynb`` extension, located in the notebook
468 468 directory. The notebook created will have just one cell, which will contain
469 469 all the code in the ``.py`` file. You can later manually partition this into
470 470 individual cells using the ``Edit | Split Cell`` menu option, or the
471 471 :kbd:`Ctrl-m -` keyboard shortcut.
472 472
473 Note that ``.py`` scripts obtained from a notebook document using nbconvert_
473 Note that ``.py`` scripts obtained from a notebook document using :doc:`nbconvert <nbconvert>`
474 474 maintain the structure of the notebook in comments. Reimporting such a
475 475 script back into a notebook will preserve this structure.
476 476
477 477 .. _note_about_roundtrip:
478 478
479 479 .. warning::
480 480
481 481 While in simple cases you can "roundtrip" a notebook to Python, edit the
482 482 Python file, and then import it back without loss of main content, this is
483 483 in general *not guaranteed to work*. First, there is extra metadata
484 484 saved in the notebook that may not be saved to the ``.py`` format. And as
485 485 the notebook format evolves in complexity, there will be attributes of the
486 486 notebook that will not survive a roundtrip through the Python form. You
487 487 should think of the Python format as a way to output a script version of a
488 488 notebook and the import capabilities as a way to load existing code to get
489 489 a notebook started. But the Python version is *not* an alternate notebook
490 490 format.
491 491
492 492 .. seealso::
493 493 :ref:`notebook_format`
494 494
495 495 .. include:: ../links.txt
@@ -1,163 +1,163 b''
1 .. _working_remotely.txt
1 .. _working_remotely:
2 2
3 3 Running a notebook server
4 4 =========================
5 5
6 6
7 7 The :ref:`IPython notebook <htmlnotebook>` web-application is based on a
8 8 server-client structure. This server uses a :ref:`two-process kernel
9 9 architecture <ipythonzmq>` based on ZeroMQ_, as well as Tornado_ for serving
10 10 HTTP requests. By default, a notebook server runs on http://127.0.0.1:8888/
11 11 and is accessible only from `localhost`. This document describes how you can
12 12 :ref:`secure a notebook server <notebook_security>` and how to :ref:`run it on
13 13 a public interface <notebook_public_server>`.
14 14
15 15 .. _ZeroMQ: http://zeromq.org
16 16
17 17 .. _Tornado: http://www.tornadoweb.org
18 18
19 19
20 20 .. _notebook_security:
21 21
22 22 Notebook security
23 23 -----------------
24 24
25 25 You can protect your notebook server with a simple single password by
26 26 setting the :attr:`NotebookApp.password` configurable. You can prepare a
27 27 hashed password using the function :func:`IPython.lib.security.passwd`:
28 28
29 29 .. sourcecode:: ipython
30 30
31 31 In [1]: from IPython.lib import passwd
32 32 In [2]: passwd()
33 33 Enter password:
34 34 Verify password:
35 35 Out[2]: 'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed'
36 36
37 37 .. note::
38 38
39 39 :func:`~IPython.lib.security.passwd` can also take the password as a string
40 40 argument. **Do not** pass it as an argument inside an IPython session, as it
41 41 will be saved in your input history.
42 42
43 43 You can then add this to your :file:`ipython_notebook_config.py`, e.g.::
44 44
45 45 # Password to use for web authentication
46 46 c = get_config()
47 47 c.NotebookApp.password =
48 48 u'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed'
49 49
50 50 When using a password, it is a good idea to also use SSL, so that your
51 51 password is not sent unencrypted by your browser. You can start the notebook
52 52 to communicate via a secure protocol mode using a self-signed certificate with
53 53 the command::
54 54
55 55 $ ipython notebook --certfile=mycert.pem
56 56
57 57 .. note::
58 58
59 59 A self-signed certificate can be generated with ``openssl``. For example,
60 60 the following command will create a certificate valid for 365 days with
61 61 both the key and certificate data written to the same file::
62 62
63 63 $ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
64 64
65 65 Your browser will warn you of a dangerous certificate because it is
66 66 self-signed. If you want to have a fully compliant certificate that will not
67 67 raise warnings, it is possible (but rather involved) to obtain one,
68 68 as explained in detail in `this tutorial`__.
69 69
70 70 .. __: http://arstechnica.com/security/news/2009/12/how-to-get-set-with-a-secure-sertificate-for-free.ars
71 71
72 72 Keep in mind that when you enable SSL support, you will need to access the
73 73 notebook server over ``https://``, not over plain ``http://``. The startup
74 74 message from the server prints this, but it is easy to overlook and think the
75 75 server is for some reason non-responsive.
76 76
77 77
78 78 .. _notebook_public_server:
79 79
80 80 Running a public notebook server
81 81 --------------------------------
82 82
83 83 If you want to access your notebook server remotely via a web browser,
84 84 you can do the following.
85 85
86 86 Start by creating a certificate file and a hashed password, as explained
87 87 above. Then create a custom profile for the notebook, with the following
88 88 command line, type::
89 89
90 90 $ ipython profile create nbserver
91 91
92 92 In the profile directory just created, edit the file
93 93 ``ipython_notebook_config.py``. By default, the file has all fields
94 94 commented; the minimum set you need to uncomment and edit is the following::
95 95
96 96 c = get_config()
97 97
98 98 # Kernel config
99 99 c.IPKernelApp.pylab = 'inline' # if you want plotting support always
100 100
101 101 # Notebook config
102 102 c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem'
103 103 c.NotebookApp.ip = '*'
104 104 c.NotebookApp.open_browser = False
105 105 c.NotebookApp.password = u'sha1:bcd259ccf...[your hashed password here]'
106 106 # It is a good idea to put it on a known, fixed port
107 107 c.NotebookApp.port = 9999
108 108
109 109 You can then start the notebook and access it later by pointing your browser
110 110 to ``https://your.host.com:9999`` with ``ipython notebook
111 111 --profile=nbserver``.
112 112
113 113 Running with a different URL prefix
114 114 -----------------------------------
115 115
116 116 The notebook dashboard (the landing page with an overview
117 117 of the notebooks in your working directory) typically lives at the URL
118 118 ``http://localhost:8888/``. If you prefer that it lives, together with the
119 119 rest of the notebook, under a sub-directory,
120 120 e.g. ``http://localhost:8888/ipython/``, you can do so with
121 121 configuration options like the following (see above for instructions about
122 122 modifying ``ipython_notebook_config.py``)::
123 123
124 124 c.NotebookApp.base_project_url = '/ipython/'
125 125 c.NotebookApp.base_kernel_url = '/ipython/'
126 126 c.NotebookApp.webapp_settings = {'static_url_prefix':'/ipython/static/'}
127 127
128 128 Using a different notebook store
129 129 --------------------------------
130 130
131 131 By default, the notebook server stores the notebook documents that it saves as
132 132 files in the working directory of the notebook server, also known as the
133 133 ``notebook_dir``. This logic is implemented in the
134 134 :class:`FileNotebookManager` class. However, the server can be configured to
135 135 use a different notebook manager class, which can
136 136 store the notebooks in a different format.
137 137
138 138 Currently, we ship a :class:`AzureNotebookManager` class that stores notebooks
139 139 in Azure blob storage. This can be used by adding the following lines to your
140 140 ``ipython_notebook_config.py`` file::
141 141
142 142 c.NotebookApp.notebook_manager_class =
143 143 'IPython.html.services.notebooks.azurenbmanager.AzureNotebookManager'
144 144 c.AzureNotebookManager.account_name = u'paste_your_account_name_here'
145 145 c.AzureNotebookManager.account_key = u'paste_your_account_key_here'
146 146 c.AzureNotebookManager.container = u'notebooks'
147 147
148 148 In addition to providing your Azure Blob Storage account name and key, you
149 149 will have to provide a container name; you can use multiple containers to
150 150 organize your notebooks.
151 151
152 152
153 153 Known issues
154 154 ------------
155 155
156 156 When behind a proxy, especially if your system or browser is set to autodetect
157 157 the proxy, the notebook web application might fail to connect to the server's
158 158 websockets, and present you with a warning at startup. In this case, you need
159 159 to configure your system not to use the proxy for the server's address.
160 160
161 161 For example, in Firefox, go to the Preferences panel, Advanced section,
162 162 Network tab, click 'Settings...', and add the address of the notebook server
163 163 to the 'No proxy for' field.
@@ -1,610 +1,610 b''
1 1 .. _qtconsole:
2 2
3 3 =========================
4 4 A Qt Console for IPython
5 5 =========================
6 6
7 7 We now have a version of IPython, using the new two-process :ref:`ZeroMQ Kernel
8 8 <ipythonzmq>`, running in a PyQt_ GUI. This is a very lightweight widget that
9 9 largely feels like a terminal, but provides a number of enhancements only
10 10 possible in a GUI, such as inline figures, proper multiline editing with syntax
11 11 highlighting, graphical calltips, and much more.
12 12
13 .. figure:: ../../_images/qtconsole.png
13 .. figure:: ../_images/qtconsole.png
14 14 :width: 400px
15 15 :alt: IPython Qt console with embedded plots
16 16 :align: center
17 17 :target: ../_images/qtconsole.png
18 18
19 19 The Qt console for IPython, using inline matplotlib plots.
20 20
21 21 To get acquainted with the Qt console, type `%guiref` to see a quick
22 22 introduction of its main features.
23 23
24 24 The Qt frontend has hand-coded emacs-style bindings for text navigation. This
25 25 is not yet configurable.
26 26
27 27 .. tip::
28 28
29 29 Since the Qt console tries hard to behave like a terminal, by default it
30 30 immediately executes single lines of input that are complete. If you want
31 31 to force multiline input, hit :kbd:`Ctrl-Enter` at the end of the first line
32 32 instead of :kbd:`Enter`, and it will open a new line for input. At any
33 33 point in a multiline block, you can force its execution (without having to
34 34 go to the bottom) with :kbd:`Shift-Enter`.
35 35
36 36 ``%load``
37 37 =========
38 38
39 39 The new ``%load`` magic (previously ``%loadpy``) takes any script, and pastes
40 40 its contents as your next input, so you can edit it before executing. The
41 41 script may be on your machine, but you can also specify an history range, or a
42 42 url, and it will download the script from the web. This is particularly useful
43 43 for playing with examples from documentation, such as matplotlib.
44 44
45 45 .. sourcecode:: ipython
46 46
47 47 In [6]: %load http://matplotlib.org/plot_directive/mpl_examples/mplot3d/contour3d_demo.py
48 48
49 49 In [7]: from mpl_toolkits.mplot3d import axes3d
50 50 ...: import matplotlib.pyplot as plt
51 51 ...:
52 52 ...: fig = plt.figure()
53 53 ...: ax = fig.add_subplot(111, projection='3d')
54 54 ...: X, Y, Z = axes3d.get_test_data(0.05)
55 55 ...: cset = ax.contour(X, Y, Z)
56 56 ...: ax.clabel(cset, fontsize=9, inline=1)
57 57 ...:
58 58 ...: plt.show()
59 59
60 60 Inline Matplotlib
61 61 =================
62 62
63 63 One of the most exciting features of the QtConsole is embedded matplotlib
64 64 figures. You can use any standard matplotlib GUI backend
65 65 to draw the figures, and since there is now a two-process model, there is no
66 66 longer a conflict between user input and the drawing eventloop.
67 67
68 68 .. image:: figs/besselj.png
69 69 :width: 519px
70 70
71 71 .. _display:
72 72
73 73 :func:`display`
74 74 ***************
75 75
76 76 IPython provides a function :func:`display` for displaying rich representations
77 77 of objects if they are available. The IPython display
78 78 system provides a mechanism for specifying PNG or SVG (and more)
79 79 representations of objects for GUI frontends.
80 80 When you enable matplotlib integration via the ``%matplotlib`` magic, IPython registers
81 81 convenient PNG and SVG renderers for matplotlib figures, so you can embed them
82 82 in your document by calling :func:`display` on one or more of them. This is
83 83 especially useful for saving_ your work.
84 84
85 85 .. sourcecode:: ipython
86 86
87 87 In [4]: from IPython.display import display
88 88
89 89 In [5]: plt.plot(range(5)) # plots in the matplotlib window
90 90
91 91 In [6]: display(plt.gcf()) # embeds the current figure in the qtconsole
92 92
93 93 In [7]: display(*getfigs()) # embeds all active figures in the qtconsole
94 94
95 95 If you have a reference to a matplotlib figure object, you can always display
96 96 that specific figure:
97 97
98 98 .. sourcecode:: ipython
99 99
100 100 In [1]: f = plt.figure()
101 101
102 102 In [2]: plt.plot(np.rand(100))
103 103 Out[2]: [<matplotlib.lines.Line2D at 0x7fc6ac03dd90>]
104 104
105 105 In [3]: display(f)
106 106
107 107 # Plot is shown here
108 108
109 109 In [4]: plt.title('A title')
110 110 Out[4]: <matplotlib.text.Text at 0x7fc6ac023450>
111 111
112 112 In [5]: display(f)
113 113
114 114 # Updated plot with title is shown here.
115 115
116 116 .. _inline:
117 117
118 118 ``--matplotlib inline``
119 119 ***********************
120 120
121 121 If you want to have all of your figures embedded in your session, instead of
122 122 calling :func:`display`, you can specify ``--matplotlib inline`` when you start the
123 123 console, and each time you make a plot, it will show up in your document, as if
124 124 you had called :func:`display(fig)`.
125 125
126 126 The inline backend can use either SVG or PNG figures (PNG being the default).
127 127 It also supports the special key ``'retina'``, which is 2x PNG for high-DPI displays.
128 128 To switch between them, set the ``InlineBackend.figure_format`` configurable
129 129 in a config file, or via the ``%config`` magic:
130 130
131 131 .. sourcecode:: ipython
132 132
133 133 In [10]: %config InlineBackend.figure_format = 'svg'
134 134
135 135 .. note::
136 136
137 137 Changing the inline figure format also affects calls to :func:`display` above,
138 138 even if you are not using the inline backend for all figures.
139 139
140 140 By default, IPython closes all figures at the completion of each execution. This means you
141 141 don't have to manually close figures, which is less convenient when figures aren't attached
142 142 to windows with an obvious close button. It also means that the first matplotlib call in
143 143 each cell will always create a new figure:
144 144
145 145 .. sourcecode:: ipython
146 146
147 147 In [11]: plt.plot(range(100))
148 148 <single-line plot>
149 149
150 150 In [12]: plt.plot([1,3,2])
151 151 <another single-line plot>
152 152
153 153
154 154 However, it does prevent the list of active figures surviving from one input cell to the
155 155 next, so if you want to continue working with a figure, you must hold on to a reference to
156 156 it:
157 157
158 158 .. sourcecode:: ipython
159 159
160 160 In [11]: fig = gcf()
161 161 ....: fig.plot(rand(100))
162 162 <plot>
163 163 In [12]: fig.title('Random Title')
164 164 <redraw plot with title>
165 165
166 166 This behavior is controlled by the :attr:`InlineBackend.close_figures` configurable, and
167 167 if you set it to False, via %config or config file, then IPython will *not* close figures,
168 168 and tools like :func:`gcf`, :func:`gca`, :func:`getfigs` will behave the same as they
169 169 do with other backends. You will, however, have to manually close figures:
170 170
171 171 .. sourcecode:: ipython
172 172
173 173 # close all active figures:
174 174 In [13]: [ fig.close() for fig in getfigs() ]
175 175
176 176
177 177
178 178 .. _saving:
179 179
180 180 Saving and Printing
181 181 ===================
182 182
183 183 IPythonQt has the ability to save your current session, as either HTML or
184 184 XHTML. If you have been using :func:`display` or inline_ matplotlib, your figures
185 185 will be PNG in HTML, or inlined as SVG in XHTML. PNG images have the option to
186 186 be either in an external folder, as in many browsers' "Webpage, Complete"
187 187 option, or inlined as well, for a larger, but more portable file.
188 188
189 189 .. note::
190 190
191 191 Export to SVG+XHTML requires that you are using SVG figures, which is *not*
192 192 the default. To switch the inline figure format to use SVG during an active
193 193 session, do:
194 194
195 195 .. sourcecode:: ipython
196 196
197 197 In [10]: %config InlineBackend.figure_format = 'svg'
198 198
199 199 Or, you can add the same line (c.Inline... instead of %config Inline...) to
200 200 your config files.
201 201
202 202 This will only affect figures plotted after making this call
203 203
204 204
205 205 The widget also exposes the ability to print directly, via the default print
206 206 shortcut or context menu.
207 207
208 208
209 209 .. Note::
210 210
211 211 Saving is only available to richtext Qt widgets, which are used by default,
212 212 but if you pass the ``--plain`` flag, saving will not be available to you.
213 213
214 214
215 215 See these examples of :download:`png/html<figs/jn.html>` and
216 216 :download:`svg/xhtml <figs/jn.xhtml>` output. Note that syntax highlighting
217 217 does not survive export. This is a known issue, and is being investigated.
218 218
219 219
220 220 Colors and Highlighting
221 221 =======================
222 222
223 223 Terminal IPython has always had some coloring, but never syntax
224 224 highlighting. There are a few simple color choices, specified by the ``colors``
225 225 flag or ``%colors`` magic:
226 226
227 227 * LightBG for light backgrounds
228 228 * Linux for dark backgrounds
229 229 * NoColor for a simple colorless terminal
230 230
231 231 The Qt widget has full support for the ``colors`` flag used in the terminal shell.
232 232
233 233 The Qt widget, however, has full syntax highlighting as you type, handled by
234 234 the `pygments`_ library. The ``style`` argument exposes access to any style by
235 235 name that can be found by pygments, and there are several already
236 236 installed. The ``colors`` argument, if unspecified, will be guessed based on
237 237 the chosen style. Similarly, there are default styles associated with each
238 238 ``colors`` option.
239 239
240 240
241 241 Screenshot of ``ipython qtconsole --colors=linux``, which uses the 'monokai'
242 242 theme by default:
243 243
244 244 .. image:: figs/colors_dark.png
245 245 :width: 627px
246 246
247 247 .. Note::
248 248
249 249 Calling ``ipython qtconsole -h`` will show all the style names that
250 250 pygments can find on your system.
251 251
252 252 You can also pass the filename of a custom CSS stylesheet, if you want to do
253 253 your own coloring, via the ``stylesheet`` argument. The default LightBG
254 254 stylesheet:
255 255
256 256 .. sourcecode:: css
257 257
258 258 QPlainTextEdit, QTextEdit { background-color: white;
259 259 color: black ;
260 260 selection-background-color: #ccc}
261 261 .error { color: red; }
262 262 .in-prompt { color: navy; }
263 263 .in-prompt-number { font-weight: bold; }
264 264 .out-prompt { color: darkred; }
265 265 .out-prompt-number { font-weight: bold; }
266 266 /* .inverted is used to highlight selected completion */
267 267 .inverted { background-color: black ; color: white; }
268 268
269 269 Fonts
270 270 =====
271 271
272 272 The QtConsole has configurable via the ConsoleWidget. To change these, set the
273 273 ``font_family`` or ``font_size`` traits of the ConsoleWidget. For instance, to
274 274 use 9pt Anonymous Pro::
275 275
276 276 $> ipython qtconsole --ConsoleWidget.font_family="Anonymous Pro" --ConsoleWidget.font_size=9
277 277
278 278 Process Management
279 279 ==================
280 280
281 281 With the two-process ZMQ model, the frontend does not block input during
282 282 execution. This means that actions can be taken by the frontend while the
283 283 Kernel is executing, or even after it crashes. The most basic such command is
284 284 via 'Ctrl-.', which restarts the kernel. This can be done in the middle of a
285 285 blocking execution. The frontend can also know, via a heartbeat mechanism, that
286 286 the kernel has died. This means that the frontend can safely restart the
287 287 kernel.
288 288
289 289 .. _multiple_consoles:
290 290
291 291 Multiple Consoles
292 292 *****************
293 293
294 294 Since the Kernel listens on the network, multiple frontends can connect to it.
295 295 These do not have to all be qt frontends - any IPython frontend can connect and
296 296 run code. When you start ipython qtconsole, there will be an output line,
297 297 like::
298 298
299 299 [IPKernelApp] To connect another client to this kernel, use:
300 300 [IPKernelApp] --existing kernel-12345.json
301 301
302 302 Other frontends can connect to your kernel, and share in the execution. This is
303 303 great for collaboration. The ``--existing`` flag means connect to a kernel
304 304 that already exists. Starting other consoles
305 305 with that flag will not try to start their own kernel, but rather connect to
306 306 yours. :file:`kernel-12345.json` is a small JSON file with the ip, port, and
307 307 authentication information necessary to connect to your kernel. By default, this file
308 308 will be in your default profile's security directory. If it is somewhere else,
309 309 the output line will print the full path of the connection file, rather than
310 310 just its filename.
311 311
312 312 If you need to find the connection info to send, and don't know where your connection file
313 313 lives, there are a couple of ways to get it. If you are already running an IPython console
314 314 connected to the kernel, you can use the ``%connect_info`` magic to display the information
315 315 necessary to connect another frontend to the kernel.
316 316
317 317 .. sourcecode:: ipython
318 318
319 319 In [2]: %connect_info
320 320 {
321 321 "stdin_port":50255,
322 322 "ip":"127.0.0.1",
323 323 "hb_port":50256,
324 324 "key":"70be6f0f-1564-4218-8cda-31be40a4d6aa",
325 325 "shell_port":50253,
326 326 "iopub_port":50254
327 327 }
328 328
329 329 Paste the above JSON into a file, and connect with:
330 330 $> ipython <app> --existing <file>
331 331 or, if you are local, you can connect with just:
332 332 $> ipython <app> --existing kernel-12345.json
333 333 or even just:
334 334 $> ipython <app> --existing
335 335 if this is the most recent IPython session you have started.
336 336
337 337 Otherwise, you can find a connection file by name (and optionally profile) with
338 338 :func:`IPython.lib.kernel.find_connection_file`:
339 339
340 340 .. sourcecode:: bash
341 341
342 342 $> python -c "from IPython.lib.kernel import find_connection_file;\
343 343 print find_connection_file('kernel-12345.json')"
344 344 /home/you/.ipython/profile_default/security/kernel-12345.json
345 345
346 346 And if you are using a particular IPython profile:
347 347
348 348 .. sourcecode:: bash
349 349
350 350 $> python -c "from IPython.lib.kernel import find_connection_file;\
351 351 print find_connection_file('kernel-12345.json', profile='foo')"
352 352 /home/you/.ipython/profile_foo/security/kernel-12345.json
353 353
354 354 You can even launch a standalone kernel, and connect and disconnect Qt Consoles
355 355 from various machines. This lets you keep the same running IPython session
356 356 on your work machine (with matplotlib plots and everything), logging in from home,
357 357 cafΓ©s, etc.::
358 358
359 359 $> ipython kernel
360 360 [IPKernelApp] To connect another client to this kernel, use:
361 361 [IPKernelApp] --existing kernel-12345.json
362 362
363 363 This is actually exactly the same as the subprocess launched by the qtconsole, so
364 364 all the information about connecting to a standalone kernel is identical to that
365 365 of connecting to the kernel attached to a running console.
366 366
367 367 .. _kernel_security:
368 368
369 369 Security
370 370 --------
371 371
372 372 .. warning::
373 373
374 374 Since the ZMQ code currently has no encryption, listening on an
375 375 external-facing IP is dangerous. You are giving any computer that can see
376 376 you on the network the ability to connect to your kernel, and view your traffic.
377 377 Read the rest of this section before listening on external ports
378 378 or running an IPython kernel on a shared machine.
379 379
380 380 By default (for security reasons), the kernel only listens on localhost, so you
381 381 can only connect multiple frontends to the kernel from your local machine. You
382 382 can specify to listen on an external interface by specifying the ``ip``
383 383 argument::
384 384
385 385 $> ipython qtconsole --ip=192.168.1.123
386 386
387 387 If you specify the ip as 0.0.0.0 or '*', that means all interfaces, so any
388 388 computer that can see yours on the network can connect to the kernel.
389 389
390 390 Messages are not encrypted, so users with access to the ports your kernel is using will be
391 391 able to see any output of the kernel. They will **NOT** be able to issue shell commands as
392 392 you due to message signatures, which are enabled by default as of IPython 0.12.
393 393
394 394 .. warning::
395 395
396 396 If you disable message signatures, then any user with access to the ports your
397 397 kernel is listening on can issue arbitrary code as you. **DO NOT** disable message
398 398 signatures unless you have a lot of trust in your environment.
399 399
400 400 The one security feature IPython does provide is protection from unauthorized execution.
401 401 IPython's messaging system will sign messages with HMAC digests using a shared-key. The key
402 402 is never sent over the network, it is only used to generate a unique hash for each message,
403 403 based on its content. When IPython receives a message, it will check that the digest
404 404 matches, and discard the message. You can use any file that only you have access to to
405 405 generate this key, but the default is just to generate a new UUID. You can generate a random
406 406 private key with::
407 407
408 408 # generate 1024b of random data, and store in a file only you can read:
409 409 # (assumes IPYTHONDIR is defined, otherwise use your IPython directory)
410 410 $> python -c "import os; print os.urandom(128).encode('base64')" > $IPYTHONDIR/sessionkey
411 411 $> chmod 600 $IPYTHONDIR/sessionkey
412 412
413 413 The *contents* of this file will be stored in the JSON connection file, so that file
414 414 contains everything you need to connect to and use a kernel.
415 415
416 416 To use this generated key, simply specify the ``Session.keyfile`` configurable
417 417 in :file:`ipython_config.py` or at the command-line, as in::
418 418
419 419 # instruct IPython to sign messages with that key, instead of a new UUID
420 420 $> ipython qtconsole --Session.keyfile=$IPYTHONDIR/sessionkey
421 421
422 422 .. _ssh_tunnels:
423 423
424 424 SSH Tunnels
425 425 -----------
426 426
427 427 Sometimes you want to connect to machines across the internet, or just across
428 428 a LAN that either doesn't permit open ports or you don't trust the other
429 429 machines on the network. To do this, you can use SSH tunnels. SSH tunnels
430 430 are a way to securely forward ports on your local machine to ports on another
431 431 machine, to which you have SSH access.
432 432
433 433 In simple cases, IPython's tools can forward ports over ssh by simply adding the
434 434 ``--ssh=remote`` argument to the usual ``--existing...`` set of flags for connecting
435 435 to a running kernel, after copying the JSON connection file (or its contents) to
436 436 the second computer.
437 437
438 438 .. warning::
439 439
440 440 Using SSH tunnels does *not* increase localhost security. In fact, when
441 441 tunneling from one machine to another *both* machines have open
442 442 ports on localhost available for connections to the kernel.
443 443
444 444 There are two primary models for using SSH tunnels with IPython. The first
445 445 is to have the Kernel listen only on localhost, and connect to it from
446 446 another machine on the same LAN.
447 447
448 448 First, let's start a kernel on machine **worker**, listening only
449 449 on loopback::
450 450
451 451 user@worker $> ipython kernel
452 452 [IPKernelApp] To connect another client to this kernel, use:
453 453 [IPKernelApp] --existing kernel-12345.json
454 454
455 455 In this case, the IP that you would connect
456 456 to would still be 127.0.0.1, but you want to specify the additional ``--ssh`` argument
457 457 with the hostname of the kernel (in this example, it's 'worker')::
458 458
459 459 user@client $> ipython qtconsole --ssh=worker --existing /path/to/kernel-12345.json
460 460
461 461 Which will write a new connection file with the forwarded ports, so you can reuse them::
462 462
463 463 [IPythonQtConsoleApp] To connect another client via this tunnel, use:
464 464 [IPythonQtConsoleApp] --existing kernel-12345-ssh.json
465 465
466 466 Note again that this opens ports on the *client* machine that point to your kernel.
467 467
468 468 .. note::
469 469
470 470 the ssh argument is simply passed to openssh, so it can be fully specified ``user@host:port``
471 471 but it will also respect your aliases, etc. in :file:`.ssh/config` if you have any.
472 472
473 473 The second pattern is for connecting to a machine behind a firewall across the internet
474 474 (or otherwise wide network). This time, we have a machine **login** that you have ssh access
475 475 to, which can see **kernel**, but **client** is on another network. The important difference
476 476 now is that **client** can see **login**, but *not* **worker**. So we need to forward ports from
477 477 client to worker *via* login. This means that the kernel must be started listening
478 478 on external interfaces, so that its ports are visible to `login`::
479 479
480 480 user@worker $> ipython kernel --ip=0.0.0.0
481 481 [IPKernelApp] To connect another client to this kernel, use:
482 482 [IPKernelApp] --existing kernel-12345.json
483 483
484 484 Which we can connect to from the client with::
485 485
486 486 user@client $> ipython qtconsole --ssh=login --ip=192.168.1.123 --existing /path/to/kernel-12345.json
487 487
488 488 .. note::
489 489
490 490 The IP here is the address of worker as seen from *login*, and need only be specified if
491 491 the kernel used the ambiguous 0.0.0.0 (all interfaces) address. If it had used
492 492 192.168.1.123 to start with, it would not be needed.
493 493
494 494
495 495 Manual SSH tunnels
496 496 ------------------
497 497
498 498 It's possible that IPython's ssh helper functions won't work for you, for various
499 499 reasons. You can still connect to remote machines, as long as you set up the tunnels
500 500 yourself. The basic format of forwarding a local port to a remote one is::
501 501
502 502 [client] $> ssh <server> <localport>:<remoteip>:<remoteport> -f -N
503 503
504 504 This will forward local connections to **localport** on client to **remoteip:remoteport**
505 505 *via* **server**. Note that remoteip is interpreted relative to *server*, not the client.
506 506 So if you have direct ssh access to the machine to which you want to forward connections,
507 507 then the server *is* the remote machine, and remoteip should be server's IP as seen from the
508 508 server itself, i.e. 127.0.0.1. Thus, to forward local port 12345 to remote port 54321 on
509 509 a machine you can see, do::
510 510
511 511 [client] $> ssh machine 12345:127.0.0.1:54321 -f -N
512 512
513 513 But if your target is actually on a LAN at 192.168.1.123, behind another machine called **login**,
514 514 then you would do::
515 515
516 516 [client] $> ssh login 12345:192.168.1.16:54321 -f -N
517 517
518 518 The ``-f -N`` on the end are flags that tell ssh to run in the background,
519 519 and don't actually run any commands beyond creating the tunnel.
520 520
521 521 .. seealso::
522 522
523 523 A short discussion of ssh tunnels: http://www.revsys.com/writings/quicktips/ssh-tunnel.html
524 524
525 525
526 526
527 527 Stopping Kernels and Consoles
528 528 *****************************
529 529
530 530 Since there can be many consoles per kernel, the shutdown mechanism and dialog
531 531 are probably more complicated than you are used to. Since you don't always want
532 532 to shutdown a kernel when you close a window, you are given the option to just
533 533 close the console window or also close the Kernel and *all other windows*. Note
534 534 that this only refers to all other *local* windows, as remote Consoles are not
535 535 allowed to shutdown the kernel, and shutdowns do not close Remote consoles (to
536 536 allow for saving, etc.).
537 537
538 538 Rules:
539 539
540 540 * Restarting the kernel automatically clears all *local* Consoles, and prompts remote
541 541 Consoles about the reset.
542 542 * Shutdown closes all *local* Consoles, and notifies remotes that
543 543 the Kernel has been shutdown.
544 544 * Remote Consoles may not restart or shutdown the kernel.
545 545
546 546 Qt and the QtConsole
547 547 ====================
548 548
549 549 An important part of working with the QtConsole when you are writing your own
550 550 Qt code is to remember that user code (in the kernel) is *not* in the same
551 551 process as the frontend. This means that there is not necessarily any Qt code
552 552 running in the kernel, and under most normal circumstances there isn't. If,
553 553 however, you specify ``--matplotlib qt`` at the command-line, then there *will* be a
554 554 :class:`QCoreApplication` instance running in the kernel process along with
555 555 user-code. To get a reference to this application, do:
556 556
557 557 .. sourcecode:: python
558 558
559 559 from PyQt4 import QtCore
560 560 app = QtCore.QCoreApplication.instance()
561 561 # app will be None if there is no such instance
562 562
563 563 A common problem listed in the PyQt4 Gotchas_ is the fact that Python's garbage
564 564 collection will destroy Qt objects (Windows, etc.) once there is no longer a
565 565 Python reference to them, so you have to hold on to them. For instance, in:
566 566
567 567 .. sourcecode:: python
568 568
569 569 def make_window():
570 570 win = QtGui.QMainWindow()
571 571
572 572 def make_and_return_window():
573 573 win = QtGui.QMainWindow()
574 574 return win
575 575
576 576 :func:`make_window` will never draw a window, because garbage collection will
577 577 destroy it before it is drawn, whereas :func:`make_and_return_window` lets the
578 578 caller decide when the window object should be destroyed. If, as a developer,
579 579 you know that you always want your objects to last as long as the process, you
580 580 can attach them to the QApplication instance itself:
581 581
582 582 .. sourcecode:: python
583 583
584 584 # do this just once:
585 585 app = QtCore.QCoreApplication.instance()
586 586 app.references = set()
587 587 # then when you create Windows, add them to the set
588 588 def make_window():
589 589 win = QtGui.QMainWindow()
590 590 app.references.add(win)
591 591
592 592 Now the QApplication itself holds a reference to ``win``, so it will never be
593 593 garbage collected until the application itself is destroyed.
594 594
595 595 .. _Gotchas: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html#garbage-collection
596 596
597 597 Regressions
598 598 ===========
599 599
600 600 There are some features, where the qt console lags behind the Terminal
601 601 frontend:
602 602
603 603 * !cmd input: Due to our use of pexpect, we cannot pass input to subprocesses
604 604 launched using the '!' escape, so you should never call a command that
605 605 requires interactive input. For such cases, use the terminal IPython. This
606 606 will not be fixed, as abandoning pexpect would significantly degrade the
607 607 console experience.
608 608
609 609 .. _PyQt: http://www.riverbankcomputing.co.uk/software/pyqt/download
610 610 .. _pygments: http://pygments.org/
@@ -1,306 +1,307 b''
1 1 .. _parallel_overview:
2 2
3 3 ============================
4 4 Overview and getting started
5 5 ============================
6 6
7 7
8 8 Examples
9 9 ========
10 10
11 11 We have various example scripts and notebooks for using IPython.parallel in our
12 12 :file:`examples/parallel` directory, or they can be found `on GitHub`__.
13 13 Some of these are covered in more detail in the :ref:`examples
14 14 <parallel_examples>` section.
15 15
16 16 .. __: https://github.com/ipython/ipython/tree/master/examples/parallel
17 17
18 18 Introduction
19 19 ============
20 20
21 21 This section gives an overview of IPython's sophisticated and powerful
22 22 architecture for parallel and distributed computing. This architecture
23 23 abstracts out parallelism in a very general way, which enables IPython to
24 24 support many different styles of parallelism including:
25 25
26 26 * Single program, multiple data (SPMD) parallelism.
27 27 * Multiple program, multiple data (MPMD) parallelism.
28 28 * Message passing using MPI.
29 29 * Task farming.
30 30 * Data parallel.
31 31 * Combinations of these approaches.
32 32 * Custom user defined approaches.
33 33
34 34 Most importantly, IPython enables all types of parallel applications to
35 35 be developed, executed, debugged and monitored *interactively*. Hence,
36 36 the ``I`` in IPython. The following are some example usage cases for IPython:
37 37
38 38 * Quickly parallelize algorithms that are embarrassingly parallel
39 39 using a number of simple approaches. Many simple things can be
40 40 parallelized interactively in one or two lines of code.
41 41
42 42 * Steer traditional MPI applications on a supercomputer from an
43 43 IPython session on your laptop.
44 44
45 45 * Analyze and visualize large datasets (that could be remote and/or
46 46 distributed) interactively using IPython and tools like
47 47 matplotlib/TVTK.
48 48
49 49 * Develop, test and debug new parallel algorithms
50 50 (that may use MPI) interactively.
51 51
52 52 * Tie together multiple MPI jobs running on different systems into
53 53 one giant distributed and parallel system.
54 54
55 55 * Start a parallel job on your cluster and then have a remote
56 56 collaborator connect to it and pull back data into their
57 57 local IPython session for plotting and analysis.
58 58
59 59 * Run a set of tasks on a set of CPUs using dynamic load balancing.
60 60
61 61 .. tip::
62 62
63 63 At the SciPy 2011 conference in Austin, Min Ragan-Kelley presented a
64 64 complete 4-hour tutorial on the use of these features, and all the materials
65 65 for the tutorial are now `available online`__. That tutorial provides an
66 66 excellent, hands-on oriented complement to the reference documentation
67 67 presented here.
68 68
69 69 .. __: http://minrk.github.com/scipy-tutorial-2011
70 70
71 71 Architecture overview
72 72 =====================
73 73
74 74 .. figure:: figs/wideView.png
75 75 :width: 300px
76 76
77 77
78 78 The IPython architecture consists of four components:
79 79
80 80 * The IPython engine.
81 81 * The IPython hub.
82 82 * The IPython schedulers.
83 83 * The controller client.
84 84
85 85 These components live in the :mod:`IPython.parallel` package and are
86 86 installed with IPython. They do, however, have additional dependencies
87 87 that must be installed. For more information, see our
88 88 :ref:`installation documentation <install_index>`.
89 89
90 90 .. TODO: include zmq in install_index
91 91
92 92 IPython engine
93 93 ---------------
94 94
95 95 The IPython engine is a Python instance that takes Python commands over a
96 96 network connection. Eventually, the IPython engine will be a full IPython
97 97 interpreter, but for now, it is a regular Python interpreter. The engine
98 98 can also handle incoming and outgoing Python objects sent over a network
99 99 connection. When multiple engines are started, parallel and distributed
100 100 computing becomes possible. An important feature of an IPython engine is
101 101 that it blocks while user code is being executed. Read on for how the
102 102 IPython controller solves this problem to expose a clean asynchronous API
103 103 to the user.
104 104
105 105 IPython controller
106 106 ------------------
107 107
108 108 The IPython controller processes provide an interface for working with a set of engines.
109 109 At a general level, the controller is a collection of processes to which IPython engines
110 110 and clients can connect. The controller is composed of a :class:`Hub` and a collection of
111 111 :class:`Schedulers`. These Schedulers are typically run in separate processes but on the
112 112 same machine as the Hub, but can be run anywhere from local threads or on remote machines.
113 113
114 114 The controller also provides a single point of contact for users who wish to
115 115 utilize the engines connected to the controller. There are different ways of
116 116 working with a controller. In IPython, all of these models are implemented via
117 117 the :meth:`.View.apply` method, after
118 118 constructing :class:`.View` objects to represent subsets of engines. The two
119 119 primary models for interacting with engines are:
120 120
121 121 * A **Direct** interface, where engines are addressed explicitly.
122 122 * A **LoadBalanced** interface, where the Scheduler is trusted with assigning work to
123 123 appropriate engines.
124 124
125 125 Advanced users can readily extend the View models to enable other
126 126 styles of parallelism.
127 127
128 128 .. note::
129 129
130 130 A single controller and set of engines can be used with multiple models
131 131 simultaneously. This opens the door for lots of interesting things.
132 132
133 133
134 134 The Hub
135 135 *******
136 136
137 137 The center of an IPython cluster is the Hub. This is the process that keeps
138 138 track of engine connections, schedulers, clients, as well as all task requests and
139 139 results. The primary role of the Hub is to facilitate queries of the cluster state, and
140 140 minimize the necessary information required to establish the many connections involved in
141 141 connecting new clients and engines.
142 142
143 143
144 144 Schedulers
145 145 **********
146 146
147 147 All actions that can be performed on the engine go through a Scheduler. While the engines
148 148 themselves block when user code is run, the schedulers hide that from the user to provide
149 149 a fully asynchronous interface to a set of engines.
150 150
151 151
152 152 IPython client and views
153 153 ------------------------
154 154
155 155 There is one primary object, the :class:`~.parallel.Client`, for connecting to a cluster.
156 156 For each execution model, there is a corresponding :class:`~.parallel.View`. These views
157 157 allow users to interact with a set of engines through the interface. Here are the two default
158 158 views:
159 159
160 160 * The :class:`DirectView` class for explicit addressing.
161 161 * The :class:`LoadBalancedView` class for destination-agnostic scheduling.
162 162
163 163 Security
164 164 --------
165 165
166 166 IPython uses ZeroMQ for networking, which has provided many advantages, but
167 167 one of the setbacks is its utter lack of security [ZeroMQ]_. By default, no IPython
168 168 connections are encrypted, but open ports only listen on localhost. The only
169 169 source of security for IPython is via ssh-tunnel. IPython supports both shell
170 170 (`openssh`) and `paramiko` based tunnels for connections. There is a key necessary
171 171 to submit requests, but due to the lack of encryption, it does not provide
172 172 significant security if loopback traffic is compromised.
173 173
174 174 In our architecture, the controller is the only process that listens on
175 175 network ports, and is thus the main point of vulnerability. The standard model
176 176 for secure connections is to designate that the controller listen on
177 177 localhost, and use ssh-tunnels to connect clients and/or
178 178 engines.
179 179
180 180 To connect and authenticate to the controller an engine or client needs
181 181 some information that the controller has stored in a JSON file.
182 182 Thus, the JSON files need to be copied to a location where
183 183 the clients and engines can find them. Typically, this is the
184 184 :file:`~/.ipython/profile_default/security` directory on the host where the
185 185 client/engine is running (which could be a different host than the controller).
186 186 Once the JSON files are copied over, everything should work fine.
187 187
188 188 Currently, there are two JSON files that the controller creates:
189 189
190 190 ipcontroller-engine.json
191 191 This JSON file has the information necessary for an engine to connect
192 192 to a controller.
193 193
194 194 ipcontroller-client.json
195 195 The client's connection information. This may not differ from the engine's,
196 196 but since the controller may listen on different ports for clients and
197 197 engines, it is stored separately.
198 198
199 199 ipcontroller-client.json will look something like this, under default localhost
200 200 circumstances:
201 201
202 202 .. sourcecode:: python
203 203
204 204 {
205 205 "url":"tcp:\/\/127.0.0.1:54424",
206 206 "exec_key":"a361fe89-92fc-4762-9767-e2f0a05e3130",
207 207 "ssh":"",
208 208 "location":"10.19.1.135"
209 209 }
210 210
211 211 If, however, you are running the controller on a work node on a cluster, you will likely
212 212 need to use ssh tunnels to connect clients from your laptop to it. You will also
213 213 probably need to instruct the controller to listen for engines coming from other work nodes
214 214 on the cluster. An example of ipcontroller-client.json, as created by::
215 215
216 216 $> ipcontroller --ip=* --ssh=login.mycluster.com
217 217
218 218
219 219 .. sourcecode:: python
220 220
221 221 {
222 222 "url":"tcp:\/\/*:54424",
223 223 "exec_key":"a361fe89-92fc-4762-9767-e2f0a05e3130",
224 224 "ssh":"login.mycluster.com",
225 225 "location":"10.0.0.2"
226 226 }
227
227 228 More details of how these JSON files are used are given below.
228 229
229 230 A detailed description of the security model and its implementation in IPython
230 231 can be found :ref:`here <parallelsecurity>`.
231 232
232 233 .. warning::
233 234
234 235 Even at its most secure, the Controller listens on ports on localhost, and
235 236 every time you make a tunnel, you open a localhost port on the connecting
236 237 machine that points to the Controller. If localhost on the Controller's
237 238 machine, or the machine of any client or engine, is untrusted, then your
238 239 Controller is insecure. There is no way around this with ZeroMQ.
239 240
240 241
241 242
242 243 Getting Started
243 244 ===============
244 245
245 246 To use IPython for parallel computing, you need to start one instance of the
246 247 controller and one or more instances of the engine. Initially, it is best to
247 248 simply start a controller and engines on a single host using the
248 249 :command:`ipcluster` command. To start a controller and 4 engines on your
249 250 localhost, just do::
250 251
251 252 $ ipcluster start -n 4
252 253
253 254 More details about starting the IPython controller and engines can be found
254 255 :ref:`here <parallel_process>`
255 256
256 257 Once you have started the IPython controller and one or more engines, you
257 258 are ready to use the engines to do something useful. To make sure
258 259 everything is working correctly, try the following commands:
259 260
260 261 .. sourcecode:: ipython
261 262
262 263 In [1]: from IPython.parallel import Client
263 264
264 265 In [2]: c = Client()
265 266
266 267 In [4]: c.ids
267 268 Out[4]: set([0, 1, 2, 3])
268 269
269 270 In [5]: c[:].apply_sync(lambda : "Hello, World")
270 271 Out[5]: [ 'Hello, World', 'Hello, World', 'Hello, World', 'Hello, World' ]
271 272
272 273
273 274 When a client is created with no arguments, the client tries to find the corresponding JSON file
274 275 in the local `~/.ipython/profile_default/security` directory. Or if you specified a profile,
275 276 you can use that with the Client. This should cover most cases:
276 277
277 278 .. sourcecode:: ipython
278 279
279 280 In [2]: c = Client(profile='myprofile')
280 281
281 282 If you have put the JSON file in a different location or it has a different name, create the
282 283 client like this:
283 284
284 285 .. sourcecode:: ipython
285 286
286 287 In [2]: c = Client('/path/to/my/ipcontroller-client.json')
287 288
288 289 Remember, a client needs to be able to see the Hub's ports to connect. So if they are on a
289 290 different machine, you may need to use an ssh server to tunnel access to that machine,
290 291 then you would connect to it with:
291 292
292 293 .. sourcecode:: ipython
293 294
294 295 In [2]: c = Client('/path/to/my/ipcontroller-client.json', sshserver='me@myhub.example.com')
295 296
296 297 Where 'myhub.example.com' is the url or IP address of the machine on
297 298 which the Hub process is running (or another machine that has direct access to the Hub's ports).
298 299
299 300 The SSH server may already be specified in ipcontroller-client.json, if the controller was
300 301 instructed at its launch time.
301 302
302 303 You are now ready to learn more about the :ref:`Direct
303 304 <parallel_multiengine>` and :ref:`LoadBalanced <parallel_task>` interfaces to the
304 305 controller.
305 306
306 307 .. [ZeroMQ] ZeroMQ. http://www.zeromq.org
General Comments 0
You need to be logged in to leave comments. Login now