##// END OF EJS Templates
remove references to loadpy...
Matthias BUSSONNIER -
Show More
@@ -1,275 +1,275 b''
1 """A notebook manager that uses the local file system for storage.
1 """A notebook manager that uses the local file system for storage.
2
2
3 Authors:
3 Authors:
4
4
5 * Brian Granger
5 * Brian Granger
6 """
6 """
7
7
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9 # Copyright (C) 2008-2011 The IPython Development Team
9 # Copyright (C) 2008-2011 The IPython Development Team
10 #
10 #
11 # Distributed under the terms of the BSD License. The full license is in
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
12 # the file COPYING, distributed as part of this software.
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
14
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16 # Imports
16 # Imports
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 import datetime
19 import datetime
20 import io
20 import io
21 import os
21 import os
22 import uuid
22 import uuid
23 import glob
23 import glob
24
24
25 from tornado import web
25 from tornado import web
26
26
27 from IPython.config.configurable import LoggingConfigurable
27 from IPython.config.configurable import LoggingConfigurable
28 from IPython.nbformat import current
28 from IPython.nbformat import current
29 from IPython.utils.traitlets import Unicode, List, Dict, Bool
29 from IPython.utils.traitlets import Unicode, List, Dict, Bool
30
30
31 #-----------------------------------------------------------------------------
31 #-----------------------------------------------------------------------------
32 # Classes
32 # Classes
33 #-----------------------------------------------------------------------------
33 #-----------------------------------------------------------------------------
34
34
35 class NotebookManager(LoggingConfigurable):
35 class NotebookManager(LoggingConfigurable):
36
36
37 notebook_dir = Unicode(os.getcwdu(), config=True, help="""
37 notebook_dir = Unicode(os.getcwdu(), config=True, help="""
38 The directory to use for notebooks.
38 The directory to use for notebooks.
39 """)
39 """)
40
40
41 save_script = Bool(False, config=True,
41 save_script = Bool(False, config=True,
42 help="""Automatically create a Python script when saving the notebook.
42 help="""Automatically create a Python script when saving the notebook.
43
43
44 For easier use of import, %run and %loadpy across notebooks, a
44 For easier use of import, %run and %load across notebooks, a
45 <notebook-name>.py script will be created next to any
45 <notebook-name>.py script will be created next to any
46 <notebook-name>.ipynb on each save. This can also be set with the
46 <notebook-name>.ipynb on each save. This can also be set with the
47 short `--script` flag.
47 short `--script` flag.
48 """
48 """
49 )
49 )
50
50
51 filename_ext = Unicode(u'.ipynb')
51 filename_ext = Unicode(u'.ipynb')
52 allowed_formats = List([u'json',u'py'])
52 allowed_formats = List([u'json',u'py'])
53
53
54 # Map notebook_ids to notebook names
54 # Map notebook_ids to notebook names
55 mapping = Dict()
55 mapping = Dict()
56 # Map notebook names to notebook_ids
56 # Map notebook names to notebook_ids
57 rev_mapping = Dict()
57 rev_mapping = Dict()
58
58
59 def list_notebooks(self):
59 def list_notebooks(self):
60 """List all notebooks in the notebook dir.
60 """List all notebooks in the notebook dir.
61
61
62 This returns a list of dicts of the form::
62 This returns a list of dicts of the form::
63
63
64 dict(notebook_id=notebook,name=name)
64 dict(notebook_id=notebook,name=name)
65 """
65 """
66 names = glob.glob(os.path.join(self.notebook_dir,
66 names = glob.glob(os.path.join(self.notebook_dir,
67 '*' + self.filename_ext))
67 '*' + self.filename_ext))
68 names = [os.path.splitext(os.path.basename(name))[0]
68 names = [os.path.splitext(os.path.basename(name))[0]
69 for name in names]
69 for name in names]
70
70
71 data = []
71 data = []
72 for name in names:
72 for name in names:
73 if name not in self.rev_mapping:
73 if name not in self.rev_mapping:
74 notebook_id = self.new_notebook_id(name)
74 notebook_id = self.new_notebook_id(name)
75 else:
75 else:
76 notebook_id = self.rev_mapping[name]
76 notebook_id = self.rev_mapping[name]
77 data.append(dict(notebook_id=notebook_id,name=name))
77 data.append(dict(notebook_id=notebook_id,name=name))
78 data = sorted(data, key=lambda item: item['name'])
78 data = sorted(data, key=lambda item: item['name'])
79 return data
79 return data
80
80
81 def new_notebook_id(self, name):
81 def new_notebook_id(self, name):
82 """Generate a new notebook_id for a name and store its mappings."""
82 """Generate a new notebook_id for a name and store its mappings."""
83 # TODO: the following will give stable urls for notebooks, but unless
83 # TODO: the following will give stable urls for notebooks, but unless
84 # the notebooks are immediately redirected to their new urls when their
84 # the notebooks are immediately redirected to their new urls when their
85 # filemname changes, nasty inconsistencies result. So for now it's
85 # filemname changes, nasty inconsistencies result. So for now it's
86 # disabled and instead we use a random uuid4() call. But we leave the
86 # disabled and instead we use a random uuid4() call. But we leave the
87 # logic here so that we can later reactivate it, whhen the necessary
87 # logic here so that we can later reactivate it, whhen the necessary
88 # url redirection code is written.
88 # url redirection code is written.
89 #notebook_id = unicode(uuid.uuid5(uuid.NAMESPACE_URL,
89 #notebook_id = unicode(uuid.uuid5(uuid.NAMESPACE_URL,
90 # 'file://'+self.get_path_by_name(name).encode('utf-8')))
90 # 'file://'+self.get_path_by_name(name).encode('utf-8')))
91
91
92 notebook_id = unicode(uuid.uuid4())
92 notebook_id = unicode(uuid.uuid4())
93
93
94 self.mapping[notebook_id] = name
94 self.mapping[notebook_id] = name
95 self.rev_mapping[name] = notebook_id
95 self.rev_mapping[name] = notebook_id
96 return notebook_id
96 return notebook_id
97
97
98 def delete_notebook_id(self, notebook_id):
98 def delete_notebook_id(self, notebook_id):
99 """Delete a notebook's id only. This doesn't delete the actual notebook."""
99 """Delete a notebook's id only. This doesn't delete the actual notebook."""
100 name = self.mapping[notebook_id]
100 name = self.mapping[notebook_id]
101 del self.mapping[notebook_id]
101 del self.mapping[notebook_id]
102 del self.rev_mapping[name]
102 del self.rev_mapping[name]
103
103
104 def notebook_exists(self, notebook_id):
104 def notebook_exists(self, notebook_id):
105 """Does a notebook exist?"""
105 """Does a notebook exist?"""
106 if notebook_id not in self.mapping:
106 if notebook_id not in self.mapping:
107 return False
107 return False
108 path = self.get_path_by_name(self.mapping[notebook_id])
108 path = self.get_path_by_name(self.mapping[notebook_id])
109 return os.path.isfile(path)
109 return os.path.isfile(path)
110
110
111 def find_path(self, notebook_id):
111 def find_path(self, notebook_id):
112 """Return a full path to a notebook given its notebook_id."""
112 """Return a full path to a notebook given its notebook_id."""
113 try:
113 try:
114 name = self.mapping[notebook_id]
114 name = self.mapping[notebook_id]
115 except KeyError:
115 except KeyError:
116 raise web.HTTPError(404, u'Notebook does not exist: %s' % notebook_id)
116 raise web.HTTPError(404, u'Notebook does not exist: %s' % notebook_id)
117 return self.get_path_by_name(name)
117 return self.get_path_by_name(name)
118
118
119 def get_path_by_name(self, name):
119 def get_path_by_name(self, name):
120 """Return a full path to a notebook given its name."""
120 """Return a full path to a notebook given its name."""
121 filename = name + self.filename_ext
121 filename = name + self.filename_ext
122 path = os.path.join(self.notebook_dir, filename)
122 path = os.path.join(self.notebook_dir, filename)
123 return path
123 return path
124
124
125 def get_notebook(self, notebook_id, format=u'json'):
125 def get_notebook(self, notebook_id, format=u'json'):
126 """Get the representation of a notebook in format by notebook_id."""
126 """Get the representation of a notebook in format by notebook_id."""
127 format = unicode(format)
127 format = unicode(format)
128 if format not in self.allowed_formats:
128 if format not in self.allowed_formats:
129 raise web.HTTPError(415, u'Invalid notebook format: %s' % format)
129 raise web.HTTPError(415, u'Invalid notebook format: %s' % format)
130 last_modified, nb = self.get_notebook_object(notebook_id)
130 last_modified, nb = self.get_notebook_object(notebook_id)
131 kwargs = {}
131 kwargs = {}
132 if format == 'json':
132 if format == 'json':
133 # don't split lines for sending over the wire, because it
133 # don't split lines for sending over the wire, because it
134 # should match the Python in-memory format.
134 # should match the Python in-memory format.
135 kwargs['split_lines'] = False
135 kwargs['split_lines'] = False
136 data = current.writes(nb, format, **kwargs)
136 data = current.writes(nb, format, **kwargs)
137 name = nb.get('name','notebook')
137 name = nb.get('name','notebook')
138 return last_modified, name, data
138 return last_modified, name, data
139
139
140 def get_notebook_object(self, notebook_id):
140 def get_notebook_object(self, notebook_id):
141 """Get the NotebookNode representation of a notebook by notebook_id."""
141 """Get the NotebookNode representation of a notebook by notebook_id."""
142 path = self.find_path(notebook_id)
142 path = self.find_path(notebook_id)
143 if not os.path.isfile(path):
143 if not os.path.isfile(path):
144 raise web.HTTPError(404, u'Notebook does not exist: %s' % notebook_id)
144 raise web.HTTPError(404, u'Notebook does not exist: %s' % notebook_id)
145 info = os.stat(path)
145 info = os.stat(path)
146 last_modified = datetime.datetime.utcfromtimestamp(info.st_mtime)
146 last_modified = datetime.datetime.utcfromtimestamp(info.st_mtime)
147 with open(path,'r') as f:
147 with open(path,'r') as f:
148 s = f.read()
148 s = f.read()
149 try:
149 try:
150 # v1 and v2 and json in the .ipynb files.
150 # v1 and v2 and json in the .ipynb files.
151 nb = current.reads(s, u'json')
151 nb = current.reads(s, u'json')
152 except:
152 except:
153 raise web.HTTPError(500, u'Unreadable JSON notebook.')
153 raise web.HTTPError(500, u'Unreadable JSON notebook.')
154 if 'name' not in nb:
154 if 'name' not in nb:
155 nb.name = os.path.split(path)[-1].split(u'.')[0]
155 nb.name = os.path.split(path)[-1].split(u'.')[0]
156 return last_modified, nb
156 return last_modified, nb
157
157
158 def save_new_notebook(self, data, name=None, format=u'json'):
158 def save_new_notebook(self, data, name=None, format=u'json'):
159 """Save a new notebook and return its notebook_id.
159 """Save a new notebook and return its notebook_id.
160
160
161 If a name is passed in, it overrides any values in the notebook data
161 If a name is passed in, it overrides any values in the notebook data
162 and the value in the data is updated to use that value.
162 and the value in the data is updated to use that value.
163 """
163 """
164 if format not in self.allowed_formats:
164 if format not in self.allowed_formats:
165 raise web.HTTPError(415, u'Invalid notebook format: %s' % format)
165 raise web.HTTPError(415, u'Invalid notebook format: %s' % format)
166
166
167 try:
167 try:
168 nb = current.reads(data.decode('utf-8'), format)
168 nb = current.reads(data.decode('utf-8'), format)
169 except:
169 except:
170 raise web.HTTPError(400, u'Invalid JSON data')
170 raise web.HTTPError(400, u'Invalid JSON data')
171
171
172 if name is None:
172 if name is None:
173 try:
173 try:
174 name = nb.metadata.name
174 name = nb.metadata.name
175 except AttributeError:
175 except AttributeError:
176 raise web.HTTPError(400, u'Missing notebook name')
176 raise web.HTTPError(400, u'Missing notebook name')
177 nb.metadata.name = name
177 nb.metadata.name = name
178
178
179 notebook_id = self.new_notebook_id(name)
179 notebook_id = self.new_notebook_id(name)
180 self.save_notebook_object(notebook_id, nb)
180 self.save_notebook_object(notebook_id, nb)
181 return notebook_id
181 return notebook_id
182
182
183 def save_notebook(self, notebook_id, data, name=None, format=u'json'):
183 def save_notebook(self, notebook_id, data, name=None, format=u'json'):
184 """Save an existing notebook by notebook_id."""
184 """Save an existing notebook by notebook_id."""
185 if format not in self.allowed_formats:
185 if format not in self.allowed_formats:
186 raise web.HTTPError(415, u'Invalid notebook format: %s' % format)
186 raise web.HTTPError(415, u'Invalid notebook format: %s' % format)
187
187
188 try:
188 try:
189 nb = current.reads(data.decode('utf-8'), format)
189 nb = current.reads(data.decode('utf-8'), format)
190 except:
190 except:
191 raise web.HTTPError(400, u'Invalid JSON data')
191 raise web.HTTPError(400, u'Invalid JSON data')
192
192
193 if name is not None:
193 if name is not None:
194 nb.metadata.name = name
194 nb.metadata.name = name
195 self.save_notebook_object(notebook_id, nb)
195 self.save_notebook_object(notebook_id, nb)
196
196
197 def save_notebook_object(self, notebook_id, nb):
197 def save_notebook_object(self, notebook_id, nb):
198 """Save an existing notebook object by notebook_id."""
198 """Save an existing notebook object by notebook_id."""
199 if notebook_id not in self.mapping:
199 if notebook_id not in self.mapping:
200 raise web.HTTPError(404, u'Notebook does not exist: %s' % notebook_id)
200 raise web.HTTPError(404, u'Notebook does not exist: %s' % notebook_id)
201 old_name = self.mapping[notebook_id]
201 old_name = self.mapping[notebook_id]
202 try:
202 try:
203 new_name = nb.metadata.name
203 new_name = nb.metadata.name
204 except AttributeError:
204 except AttributeError:
205 raise web.HTTPError(400, u'Missing notebook name')
205 raise web.HTTPError(400, u'Missing notebook name')
206 path = self.get_path_by_name(new_name)
206 path = self.get_path_by_name(new_name)
207 try:
207 try:
208 with open(path,'w') as f:
208 with open(path,'w') as f:
209 current.write(nb, f, u'json')
209 current.write(nb, f, u'json')
210 except Exception as e:
210 except Exception as e:
211 raise web.HTTPError(400, u'Unexpected error while saving notebook: %s' % e)
211 raise web.HTTPError(400, u'Unexpected error while saving notebook: %s' % e)
212 # save .py script as well
212 # save .py script as well
213 if self.save_script:
213 if self.save_script:
214 pypath = os.path.splitext(path)[0] + '.py'
214 pypath = os.path.splitext(path)[0] + '.py'
215 try:
215 try:
216 with io.open(pypath,'w', encoding='utf-8') as f:
216 with io.open(pypath,'w', encoding='utf-8') as f:
217 current.write(nb, f, u'py')
217 current.write(nb, f, u'py')
218 except Exception as e:
218 except Exception as e:
219 raise web.HTTPError(400, u'Unexpected error while saving notebook as script: %s' % e)
219 raise web.HTTPError(400, u'Unexpected error while saving notebook as script: %s' % e)
220
220
221 if old_name != new_name:
221 if old_name != new_name:
222 old_path = self.get_path_by_name(old_name)
222 old_path = self.get_path_by_name(old_name)
223 if os.path.isfile(old_path):
223 if os.path.isfile(old_path):
224 os.unlink(old_path)
224 os.unlink(old_path)
225 if self.save_script:
225 if self.save_script:
226 old_pypath = os.path.splitext(old_path)[0] + '.py'
226 old_pypath = os.path.splitext(old_path)[0] + '.py'
227 if os.path.isfile(old_pypath):
227 if os.path.isfile(old_pypath):
228 os.unlink(old_pypath)
228 os.unlink(old_pypath)
229 self.mapping[notebook_id] = new_name
229 self.mapping[notebook_id] = new_name
230 self.rev_mapping[new_name] = notebook_id
230 self.rev_mapping[new_name] = notebook_id
231
231
232 def delete_notebook(self, notebook_id):
232 def delete_notebook(self, notebook_id):
233 """Delete notebook by notebook_id."""
233 """Delete notebook by notebook_id."""
234 path = self.find_path(notebook_id)
234 path = self.find_path(notebook_id)
235 if not os.path.isfile(path):
235 if not os.path.isfile(path):
236 raise web.HTTPError(404, u'Notebook does not exist: %s' % notebook_id)
236 raise web.HTTPError(404, u'Notebook does not exist: %s' % notebook_id)
237 os.unlink(path)
237 os.unlink(path)
238 self.delete_notebook_id(notebook_id)
238 self.delete_notebook_id(notebook_id)
239
239
240 def increment_filename(self, basename):
240 def increment_filename(self, basename):
241 """Return a non-used filename of the form basename<int>.
241 """Return a non-used filename of the form basename<int>.
242
242
243 This searches through the filenames (basename0, basename1, ...)
243 This searches through the filenames (basename0, basename1, ...)
244 until is find one that is not already being used. It is used to
244 until is find one that is not already being used. It is used to
245 create Untitled and Copy names that are unique.
245 create Untitled and Copy names that are unique.
246 """
246 """
247 i = 0
247 i = 0
248 while True:
248 while True:
249 name = u'%s%i' % (basename,i)
249 name = u'%s%i' % (basename,i)
250 path = self.get_path_by_name(name)
250 path = self.get_path_by_name(name)
251 if not os.path.isfile(path):
251 if not os.path.isfile(path):
252 break
252 break
253 else:
253 else:
254 i = i+1
254 i = i+1
255 return path, name
255 return path, name
256
256
257 def new_notebook(self):
257 def new_notebook(self):
258 """Create a new notebook and return its notebook_id."""
258 """Create a new notebook and return its notebook_id."""
259 path, name = self.increment_filename('Untitled')
259 path, name = self.increment_filename('Untitled')
260 notebook_id = self.new_notebook_id(name)
260 notebook_id = self.new_notebook_id(name)
261 metadata = current.new_metadata(name=name)
261 metadata = current.new_metadata(name=name)
262 nb = current.new_notebook(metadata=metadata)
262 nb = current.new_notebook(metadata=metadata)
263 with open(path,'w') as f:
263 with open(path,'w') as f:
264 current.write(nb, f, u'json')
264 current.write(nb, f, u'json')
265 return notebook_id
265 return notebook_id
266
266
267 def copy_notebook(self, notebook_id):
267 def copy_notebook(self, notebook_id):
268 """Copy an existing notebook and return its notebook_id."""
268 """Copy an existing notebook and return its notebook_id."""
269 last_mod, nb = self.get_notebook_object(notebook_id)
269 last_mod, nb = self.get_notebook_object(notebook_id)
270 name = nb.metadata.name + '-Copy'
270 name = nb.metadata.name + '-Copy'
271 path, name = self.increment_filename(name)
271 path, name = self.increment_filename(name)
272 nb.metadata.name = name
272 nb.metadata.name = name
273 notebook_id = self.new_notebook_id(name)
273 notebook_id = self.new_notebook_id(name)
274 self.save_notebook_object(notebook_id, nb)
274 self.save_notebook_object(notebook_id, nb)
275 return notebook_id
275 return notebook_id
@@ -1,910 +1,910 b''
1 """The Qt MainWindow for the QtConsole
1 """The Qt MainWindow for the QtConsole
2
2
3 This is a tabbed pseudo-terminal of IPython sessions, with a menu bar for
3 This is a tabbed pseudo-terminal of IPython sessions, with a menu bar for
4 common actions.
4 common actions.
5
5
6 Authors:
6 Authors:
7
7
8 * Evan Patterson
8 * Evan Patterson
9 * Min RK
9 * Min RK
10 * Erik Tollerud
10 * Erik Tollerud
11 * Fernando Perez
11 * Fernando Perez
12 * Bussonnier Matthias
12 * Bussonnier Matthias
13 * Thomas Kluyver
13 * Thomas Kluyver
14
14
15 """
15 """
16
16
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18 # Imports
18 # Imports
19 #-----------------------------------------------------------------------------
19 #-----------------------------------------------------------------------------
20
20
21 # stdlib imports
21 # stdlib imports
22 import sys
22 import sys
23 import re
23 import re
24 import webbrowser
24 import webbrowser
25 from threading import Thread
25 from threading import Thread
26
26
27 # System library imports
27 # System library imports
28 from IPython.external.qt import QtGui,QtCore
28 from IPython.external.qt import QtGui,QtCore
29
29
30 def background(f):
30 def background(f):
31 """call a function in a simple thread, to prevent blocking"""
31 """call a function in a simple thread, to prevent blocking"""
32 t = Thread(target=f)
32 t = Thread(target=f)
33 t.start()
33 t.start()
34 return t
34 return t
35
35
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37 # Classes
37 # Classes
38 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
39
39
40 class MainWindow(QtGui.QMainWindow):
40 class MainWindow(QtGui.QMainWindow):
41
41
42 #---------------------------------------------------------------------------
42 #---------------------------------------------------------------------------
43 # 'object' interface
43 # 'object' interface
44 #---------------------------------------------------------------------------
44 #---------------------------------------------------------------------------
45
45
46 def __init__(self, app,
46 def __init__(self, app,
47 confirm_exit=True,
47 confirm_exit=True,
48 new_frontend_factory=None, slave_frontend_factory=None,
48 new_frontend_factory=None, slave_frontend_factory=None,
49 ):
49 ):
50 """ Create a tabbed MainWindow for managing IPython FrontendWidgets
50 """ Create a tabbed MainWindow for managing IPython FrontendWidgets
51
51
52 Parameters
52 Parameters
53 ----------
53 ----------
54
54
55 app : reference to QApplication parent
55 app : reference to QApplication parent
56 confirm_exit : bool, optional
56 confirm_exit : bool, optional
57 Whether we should prompt on close of tabs
57 Whether we should prompt on close of tabs
58 new_frontend_factory : callable
58 new_frontend_factory : callable
59 A callable that returns a new IPythonWidget instance, attached to
59 A callable that returns a new IPythonWidget instance, attached to
60 its own running kernel.
60 its own running kernel.
61 slave_frontend_factory : callable
61 slave_frontend_factory : callable
62 A callable that takes an existing IPythonWidget, and returns a new
62 A callable that takes an existing IPythonWidget, and returns a new
63 IPythonWidget instance, attached to the same kernel.
63 IPythonWidget instance, attached to the same kernel.
64 """
64 """
65
65
66 super(MainWindow, self).__init__()
66 super(MainWindow, self).__init__()
67 self._kernel_counter = 0
67 self._kernel_counter = 0
68 self._app = app
68 self._app = app
69 self.confirm_exit = confirm_exit
69 self.confirm_exit = confirm_exit
70 self.new_frontend_factory = new_frontend_factory
70 self.new_frontend_factory = new_frontend_factory
71 self.slave_frontend_factory = slave_frontend_factory
71 self.slave_frontend_factory = slave_frontend_factory
72
72
73 self.tab_widget = QtGui.QTabWidget(self)
73 self.tab_widget = QtGui.QTabWidget(self)
74 self.tab_widget.setDocumentMode(True)
74 self.tab_widget.setDocumentMode(True)
75 self.tab_widget.setTabsClosable(True)
75 self.tab_widget.setTabsClosable(True)
76 self.tab_widget.tabCloseRequested[int].connect(self.close_tab)
76 self.tab_widget.tabCloseRequested[int].connect(self.close_tab)
77
77
78 self.setCentralWidget(self.tab_widget)
78 self.setCentralWidget(self.tab_widget)
79 # hide tab bar at first, since we have no tabs:
79 # hide tab bar at first, since we have no tabs:
80 self.tab_widget.tabBar().setVisible(False)
80 self.tab_widget.tabBar().setVisible(False)
81 # prevent focus in tab bar
81 # prevent focus in tab bar
82 self.tab_widget.setFocusPolicy(QtCore.Qt.NoFocus)
82 self.tab_widget.setFocusPolicy(QtCore.Qt.NoFocus)
83
83
84 def update_tab_bar_visibility(self):
84 def update_tab_bar_visibility(self):
85 """ update visibility of the tabBar depending of the number of tab
85 """ update visibility of the tabBar depending of the number of tab
86
86
87 0 or 1 tab, tabBar hidden
87 0 or 1 tab, tabBar hidden
88 2+ tabs, tabBar visible
88 2+ tabs, tabBar visible
89
89
90 send a self.close if number of tab ==0
90 send a self.close if number of tab ==0
91
91
92 need to be called explicitely, or be connected to tabInserted/tabRemoved
92 need to be called explicitely, or be connected to tabInserted/tabRemoved
93 """
93 """
94 if self.tab_widget.count() <= 1:
94 if self.tab_widget.count() <= 1:
95 self.tab_widget.tabBar().setVisible(False)
95 self.tab_widget.tabBar().setVisible(False)
96 else:
96 else:
97 self.tab_widget.tabBar().setVisible(True)
97 self.tab_widget.tabBar().setVisible(True)
98 if self.tab_widget.count()==0 :
98 if self.tab_widget.count()==0 :
99 self.close()
99 self.close()
100
100
101 @property
101 @property
102 def next_kernel_id(self):
102 def next_kernel_id(self):
103 """constantly increasing counter for kernel IDs"""
103 """constantly increasing counter for kernel IDs"""
104 c = self._kernel_counter
104 c = self._kernel_counter
105 self._kernel_counter += 1
105 self._kernel_counter += 1
106 return c
106 return c
107
107
108 @property
108 @property
109 def active_frontend(self):
109 def active_frontend(self):
110 return self.tab_widget.currentWidget()
110 return self.tab_widget.currentWidget()
111
111
112 def create_tab_with_new_frontend(self):
112 def create_tab_with_new_frontend(self):
113 """create a new frontend and attach it to a new tab"""
113 """create a new frontend and attach it to a new tab"""
114 widget = self.new_frontend_factory()
114 widget = self.new_frontend_factory()
115 self.add_tab_with_frontend(widget)
115 self.add_tab_with_frontend(widget)
116
116
117 def create_tab_with_current_kernel(self):
117 def create_tab_with_current_kernel(self):
118 """create a new frontend attached to the same kernel as the current tab"""
118 """create a new frontend attached to the same kernel as the current tab"""
119 current_widget = self.tab_widget.currentWidget()
119 current_widget = self.tab_widget.currentWidget()
120 current_widget_index = self.tab_widget.indexOf(current_widget)
120 current_widget_index = self.tab_widget.indexOf(current_widget)
121 current_widget_name = self.tab_widget.tabText(current_widget_index)
121 current_widget_name = self.tab_widget.tabText(current_widget_index)
122 widget = self.slave_frontend_factory(current_widget)
122 widget = self.slave_frontend_factory(current_widget)
123 if 'slave' in current_widget_name:
123 if 'slave' in current_widget_name:
124 # don't keep stacking slaves
124 # don't keep stacking slaves
125 name = current_widget_name
125 name = current_widget_name
126 else:
126 else:
127 name = '(%s) slave' % current_widget_name
127 name = '(%s) slave' % current_widget_name
128 self.add_tab_with_frontend(widget,name=name)
128 self.add_tab_with_frontend(widget,name=name)
129
129
130 def close_tab(self,current_tab):
130 def close_tab(self,current_tab):
131 """ Called when you need to try to close a tab.
131 """ Called when you need to try to close a tab.
132
132
133 It takes the number of the tab to be closed as argument, or a referece
133 It takes the number of the tab to be closed as argument, or a referece
134 to the wiget insite this tab
134 to the wiget insite this tab
135 """
135 """
136
136
137 # let's be sure "tab" and "closing widget are respectivey the index of the tab to close
137 # let's be sure "tab" and "closing widget are respectivey the index of the tab to close
138 # and a reference to the trontend to close
138 # and a reference to the trontend to close
139 if type(current_tab) is not int :
139 if type(current_tab) is not int :
140 current_tab = self.tab_widget.indexOf(current_tab)
140 current_tab = self.tab_widget.indexOf(current_tab)
141 closing_widget=self.tab_widget.widget(current_tab)
141 closing_widget=self.tab_widget.widget(current_tab)
142
142
143
143
144 # when trying to be closed, widget might re-send a request to be closed again, but will
144 # when trying to be closed, widget might re-send a request to be closed again, but will
145 # be deleted when event will be processed. So need to check that widget still exist and
145 # be deleted when event will be processed. So need to check that widget still exist and
146 # skip if not. One example of this is when 'exit' is send in a slave tab. 'exit' will be
146 # skip if not. One example of this is when 'exit' is send in a slave tab. 'exit' will be
147 # re-send by this fonction on the master widget, which ask all slaves widget to exit
147 # re-send by this fonction on the master widget, which ask all slaves widget to exit
148 if closing_widget==None:
148 if closing_widget==None:
149 return
149 return
150
150
151 #get a list of all slave widgets on the same kernel.
151 #get a list of all slave widgets on the same kernel.
152 slave_tabs = self.find_slave_widgets(closing_widget)
152 slave_tabs = self.find_slave_widgets(closing_widget)
153
153
154 keepkernel = None #Use the prompt by default
154 keepkernel = None #Use the prompt by default
155 if hasattr(closing_widget,'_keep_kernel_on_exit'): #set by exit magic
155 if hasattr(closing_widget,'_keep_kernel_on_exit'): #set by exit magic
156 keepkernel = closing_widget._keep_kernel_on_exit
156 keepkernel = closing_widget._keep_kernel_on_exit
157 # If signal sent by exit magic (_keep_kernel_on_exit, exist and not None)
157 # If signal sent by exit magic (_keep_kernel_on_exit, exist and not None)
158 # we set local slave tabs._hidden to True to avoid prompting for kernel
158 # we set local slave tabs._hidden to True to avoid prompting for kernel
159 # restart when they get the signal. and then "forward" the 'exit'
159 # restart when they get the signal. and then "forward" the 'exit'
160 # to the main window
160 # to the main window
161 if keepkernel is not None:
161 if keepkernel is not None:
162 for tab in slave_tabs:
162 for tab in slave_tabs:
163 tab._hidden = True
163 tab._hidden = True
164 if closing_widget in slave_tabs:
164 if closing_widget in slave_tabs:
165 try :
165 try :
166 self.find_master_tab(closing_widget).execute('exit')
166 self.find_master_tab(closing_widget).execute('exit')
167 except AttributeError:
167 except AttributeError:
168 self.log.info("Master already closed or not local, closing only current tab")
168 self.log.info("Master already closed or not local, closing only current tab")
169 self.tab_widget.removeTab(current_tab)
169 self.tab_widget.removeTab(current_tab)
170 self.update_tab_bar_visibility()
170 self.update_tab_bar_visibility()
171 return
171 return
172
172
173 kernel_manager = closing_widget.kernel_manager
173 kernel_manager = closing_widget.kernel_manager
174
174
175 if keepkernel is None and not closing_widget._confirm_exit:
175 if keepkernel is None and not closing_widget._confirm_exit:
176 # don't prompt, just terminate the kernel if we own it
176 # don't prompt, just terminate the kernel if we own it
177 # or leave it alone if we don't
177 # or leave it alone if we don't
178 keepkernel = closing_widget._existing
178 keepkernel = closing_widget._existing
179 if keepkernel is None: #show prompt
179 if keepkernel is None: #show prompt
180 if kernel_manager and kernel_manager.channels_running:
180 if kernel_manager and kernel_manager.channels_running:
181 title = self.window().windowTitle()
181 title = self.window().windowTitle()
182 cancel = QtGui.QMessageBox.Cancel
182 cancel = QtGui.QMessageBox.Cancel
183 okay = QtGui.QMessageBox.Ok
183 okay = QtGui.QMessageBox.Ok
184 if closing_widget._may_close:
184 if closing_widget._may_close:
185 msg = "You are closing the tab : "+'"'+self.tab_widget.tabText(current_tab)+'"'
185 msg = "You are closing the tab : "+'"'+self.tab_widget.tabText(current_tab)+'"'
186 info = "Would you like to quit the Kernel and close all attached Consoles as well?"
186 info = "Would you like to quit the Kernel and close all attached Consoles as well?"
187 justthis = QtGui.QPushButton("&No, just this Tab", self)
187 justthis = QtGui.QPushButton("&No, just this Tab", self)
188 justthis.setShortcut('N')
188 justthis.setShortcut('N')
189 closeall = QtGui.QPushButton("&Yes, close all", self)
189 closeall = QtGui.QPushButton("&Yes, close all", self)
190 closeall.setShortcut('Y')
190 closeall.setShortcut('Y')
191 # allow ctrl-d ctrl-d exit, like in terminal
191 # allow ctrl-d ctrl-d exit, like in terminal
192 closeall.setShortcut('Ctrl+D')
192 closeall.setShortcut('Ctrl+D')
193 box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
193 box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
194 title, msg)
194 title, msg)
195 box.setInformativeText(info)
195 box.setInformativeText(info)
196 box.addButton(cancel)
196 box.addButton(cancel)
197 box.addButton(justthis, QtGui.QMessageBox.NoRole)
197 box.addButton(justthis, QtGui.QMessageBox.NoRole)
198 box.addButton(closeall, QtGui.QMessageBox.YesRole)
198 box.addButton(closeall, QtGui.QMessageBox.YesRole)
199 box.setDefaultButton(closeall)
199 box.setDefaultButton(closeall)
200 box.setEscapeButton(cancel)
200 box.setEscapeButton(cancel)
201 pixmap = QtGui.QPixmap(self._app.icon.pixmap(QtCore.QSize(64,64)))
201 pixmap = QtGui.QPixmap(self._app.icon.pixmap(QtCore.QSize(64,64)))
202 box.setIconPixmap(pixmap)
202 box.setIconPixmap(pixmap)
203 reply = box.exec_()
203 reply = box.exec_()
204 if reply == 1: # close All
204 if reply == 1: # close All
205 for slave in slave_tabs:
205 for slave in slave_tabs:
206 background(slave.kernel_manager.stop_channels)
206 background(slave.kernel_manager.stop_channels)
207 self.tab_widget.removeTab(self.tab_widget.indexOf(slave))
207 self.tab_widget.removeTab(self.tab_widget.indexOf(slave))
208 closing_widget.execute("exit")
208 closing_widget.execute("exit")
209 self.tab_widget.removeTab(current_tab)
209 self.tab_widget.removeTab(current_tab)
210 background(kernel_manager.stop_channels)
210 background(kernel_manager.stop_channels)
211 elif reply == 0: # close Console
211 elif reply == 0: # close Console
212 if not closing_widget._existing:
212 if not closing_widget._existing:
213 # Have kernel: don't quit, just close the tab
213 # Have kernel: don't quit, just close the tab
214 closing_widget.execute("exit True")
214 closing_widget.execute("exit True")
215 self.tab_widget.removeTab(current_tab)
215 self.tab_widget.removeTab(current_tab)
216 background(kernel_manager.stop_channels)
216 background(kernel_manager.stop_channels)
217 else:
217 else:
218 reply = QtGui.QMessageBox.question(self, title,
218 reply = QtGui.QMessageBox.question(self, title,
219 "Are you sure you want to close this Console?"+
219 "Are you sure you want to close this Console?"+
220 "\nThe Kernel and other Consoles will remain active.",
220 "\nThe Kernel and other Consoles will remain active.",
221 okay|cancel,
221 okay|cancel,
222 defaultButton=okay
222 defaultButton=okay
223 )
223 )
224 if reply == okay:
224 if reply == okay:
225 self.tab_widget.removeTab(current_tab)
225 self.tab_widget.removeTab(current_tab)
226 elif keepkernel: #close console but leave kernel running (no prompt)
226 elif keepkernel: #close console but leave kernel running (no prompt)
227 self.tab_widget.removeTab(current_tab)
227 self.tab_widget.removeTab(current_tab)
228 background(kernel_manager.stop_channels)
228 background(kernel_manager.stop_channels)
229 else: #close console and kernel (no prompt)
229 else: #close console and kernel (no prompt)
230 self.tab_widget.removeTab(current_tab)
230 self.tab_widget.removeTab(current_tab)
231 if kernel_manager and kernel_manager.channels_running:
231 if kernel_manager and kernel_manager.channels_running:
232 for slave in slave_tabs:
232 for slave in slave_tabs:
233 background(slave.kernel_manager.stop_channels)
233 background(slave.kernel_manager.stop_channels)
234 self.tab_widget.removeTab(self.tab_widget.indexOf(slave))
234 self.tab_widget.removeTab(self.tab_widget.indexOf(slave))
235 kernel_manager.shutdown_kernel()
235 kernel_manager.shutdown_kernel()
236 background(kernel_manager.stop_channels)
236 background(kernel_manager.stop_channels)
237
237
238 self.update_tab_bar_visibility()
238 self.update_tab_bar_visibility()
239
239
240 def add_tab_with_frontend(self,frontend,name=None):
240 def add_tab_with_frontend(self,frontend,name=None):
241 """ insert a tab with a given frontend in the tab bar, and give it a name
241 """ insert a tab with a given frontend in the tab bar, and give it a name
242
242
243 """
243 """
244 if not name:
244 if not name:
245 name = 'kernel %i' % self.next_kernel_id
245 name = 'kernel %i' % self.next_kernel_id
246 self.tab_widget.addTab(frontend,name)
246 self.tab_widget.addTab(frontend,name)
247 self.update_tab_bar_visibility()
247 self.update_tab_bar_visibility()
248 self.make_frontend_visible(frontend)
248 self.make_frontend_visible(frontend)
249 frontend.exit_requested.connect(self.close_tab)
249 frontend.exit_requested.connect(self.close_tab)
250
250
251 def next_tab(self):
251 def next_tab(self):
252 self.tab_widget.setCurrentIndex((self.tab_widget.currentIndex()+1))
252 self.tab_widget.setCurrentIndex((self.tab_widget.currentIndex()+1))
253
253
254 def prev_tab(self):
254 def prev_tab(self):
255 self.tab_widget.setCurrentIndex((self.tab_widget.currentIndex()-1))
255 self.tab_widget.setCurrentIndex((self.tab_widget.currentIndex()-1))
256
256
257 def make_frontend_visible(self,frontend):
257 def make_frontend_visible(self,frontend):
258 widget_index=self.tab_widget.indexOf(frontend)
258 widget_index=self.tab_widget.indexOf(frontend)
259 if widget_index > 0 :
259 if widget_index > 0 :
260 self.tab_widget.setCurrentIndex(widget_index)
260 self.tab_widget.setCurrentIndex(widget_index)
261
261
262 def find_master_tab(self,tab,as_list=False):
262 def find_master_tab(self,tab,as_list=False):
263 """
263 """
264 Try to return the frontend that own the kernel attached to the given widget/tab.
264 Try to return the frontend that own the kernel attached to the given widget/tab.
265
265
266 Only find frontend owed by the current application. Selection
266 Only find frontend owed by the current application. Selection
267 based on port of the kernel, might be inacurate if several kernel
267 based on port of the kernel, might be inacurate if several kernel
268 on different ip use same port number.
268 on different ip use same port number.
269
269
270 This fonction does the conversion tabNumber/widget if needed.
270 This fonction does the conversion tabNumber/widget if needed.
271 Might return None if no master widget (non local kernel)
271 Might return None if no master widget (non local kernel)
272 Will crash IPython if more than 1 masterWidget
272 Will crash IPython if more than 1 masterWidget
273
273
274 When asList set to True, always return a list of widget(s) owning
274 When asList set to True, always return a list of widget(s) owning
275 the kernel. The list might be empty or containing several Widget.
275 the kernel. The list might be empty or containing several Widget.
276 """
276 """
277
277
278 #convert from/to int/richIpythonWidget if needed
278 #convert from/to int/richIpythonWidget if needed
279 if isinstance(tab, int):
279 if isinstance(tab, int):
280 tab = self.tab_widget.widget(tab)
280 tab = self.tab_widget.widget(tab)
281 km=tab.kernel_manager
281 km=tab.kernel_manager
282
282
283 #build list of all widgets
283 #build list of all widgets
284 widget_list = [self.tab_widget.widget(i) for i in range(self.tab_widget.count())]
284 widget_list = [self.tab_widget.widget(i) for i in range(self.tab_widget.count())]
285
285
286 # widget that are candidate to be the owner of the kernel does have all the same port of the curent widget
286 # widget that are candidate to be the owner of the kernel does have all the same port of the curent widget
287 # And should have a _may_close attribute
287 # And should have a _may_close attribute
288 filtered_widget_list = [ widget for widget in widget_list if
288 filtered_widget_list = [ widget for widget in widget_list if
289 widget.kernel_manager.connection_file == km.connection_file and
289 widget.kernel_manager.connection_file == km.connection_file and
290 hasattr(widget,'_may_close') ]
290 hasattr(widget,'_may_close') ]
291 # the master widget is the one that may close the kernel
291 # the master widget is the one that may close the kernel
292 master_widget= [ widget for widget in filtered_widget_list if widget._may_close]
292 master_widget= [ widget for widget in filtered_widget_list if widget._may_close]
293 if as_list:
293 if as_list:
294 return master_widget
294 return master_widget
295 assert(len(master_widget)<=1 )
295 assert(len(master_widget)<=1 )
296 if len(master_widget)==0:
296 if len(master_widget)==0:
297 return None
297 return None
298
298
299 return master_widget[0]
299 return master_widget[0]
300
300
301 def find_slave_widgets(self,tab):
301 def find_slave_widgets(self,tab):
302 """return all the frontends that do not own the kernel attached to the given widget/tab.
302 """return all the frontends that do not own the kernel attached to the given widget/tab.
303
303
304 Only find frontends owned by the current application. Selection
304 Only find frontends owned by the current application. Selection
305 based on connection file of the kernel.
305 based on connection file of the kernel.
306
306
307 This function does the conversion tabNumber/widget if needed.
307 This function does the conversion tabNumber/widget if needed.
308 """
308 """
309 #convert from/to int/richIpythonWidget if needed
309 #convert from/to int/richIpythonWidget if needed
310 if isinstance(tab, int):
310 if isinstance(tab, int):
311 tab = self.tab_widget.widget(tab)
311 tab = self.tab_widget.widget(tab)
312 km=tab.kernel_manager
312 km=tab.kernel_manager
313
313
314 #build list of all widgets
314 #build list of all widgets
315 widget_list = [self.tab_widget.widget(i) for i in range(self.tab_widget.count())]
315 widget_list = [self.tab_widget.widget(i) for i in range(self.tab_widget.count())]
316
316
317 # widget that are candidate not to be the owner of the kernel does have all the same port of the curent widget
317 # widget that are candidate not to be the owner of the kernel does have all the same port of the curent widget
318 filtered_widget_list = ( widget for widget in widget_list if
318 filtered_widget_list = ( widget for widget in widget_list if
319 widget.kernel_manager.connection_file == km.connection_file)
319 widget.kernel_manager.connection_file == km.connection_file)
320 # Get a list of all widget owning the same kernel and removed it from
320 # Get a list of all widget owning the same kernel and removed it from
321 # the previous cadidate. (better using sets ?)
321 # the previous cadidate. (better using sets ?)
322 master_widget_list = self.find_master_tab(tab, as_list=True)
322 master_widget_list = self.find_master_tab(tab, as_list=True)
323 slave_list = [widget for widget in filtered_widget_list if widget not in master_widget_list]
323 slave_list = [widget for widget in filtered_widget_list if widget not in master_widget_list]
324
324
325 return slave_list
325 return slave_list
326
326
327 # Populate the menu bar with common actions and shortcuts
327 # Populate the menu bar with common actions and shortcuts
328 def add_menu_action(self, menu, action, defer_shortcut=False):
328 def add_menu_action(self, menu, action, defer_shortcut=False):
329 """Add action to menu as well as self
329 """Add action to menu as well as self
330
330
331 So that when the menu bar is invisible, its actions are still available.
331 So that when the menu bar is invisible, its actions are still available.
332
332
333 If defer_shortcut is True, set the shortcut context to widget-only,
333 If defer_shortcut is True, set the shortcut context to widget-only,
334 where it will avoid conflict with shortcuts already bound to the
334 where it will avoid conflict with shortcuts already bound to the
335 widgets themselves.
335 widgets themselves.
336 """
336 """
337 menu.addAction(action)
337 menu.addAction(action)
338 self.addAction(action)
338 self.addAction(action)
339
339
340 if defer_shortcut:
340 if defer_shortcut:
341 action.setShortcutContext(QtCore.Qt.WidgetShortcut)
341 action.setShortcutContext(QtCore.Qt.WidgetShortcut)
342
342
343 def init_menu_bar(self):
343 def init_menu_bar(self):
344 #create menu in the order they should appear in the menu bar
344 #create menu in the order they should appear in the menu bar
345 self.init_file_menu()
345 self.init_file_menu()
346 self.init_edit_menu()
346 self.init_edit_menu()
347 self.init_view_menu()
347 self.init_view_menu()
348 self.init_kernel_menu()
348 self.init_kernel_menu()
349 self.init_magic_menu()
349 self.init_magic_menu()
350 self.init_window_menu()
350 self.init_window_menu()
351 self.init_help_menu()
351 self.init_help_menu()
352
352
353 def init_file_menu(self):
353 def init_file_menu(self):
354 self.file_menu = self.menuBar().addMenu("&File")
354 self.file_menu = self.menuBar().addMenu("&File")
355
355
356 self.new_kernel_tab_act = QtGui.QAction("New Tab with &New kernel",
356 self.new_kernel_tab_act = QtGui.QAction("New Tab with &New kernel",
357 self,
357 self,
358 shortcut="Ctrl+T",
358 shortcut="Ctrl+T",
359 triggered=self.create_tab_with_new_frontend)
359 triggered=self.create_tab_with_new_frontend)
360 self.add_menu_action(self.file_menu, self.new_kernel_tab_act)
360 self.add_menu_action(self.file_menu, self.new_kernel_tab_act)
361
361
362 self.slave_kernel_tab_act = QtGui.QAction("New Tab with Sa&me kernel",
362 self.slave_kernel_tab_act = QtGui.QAction("New Tab with Sa&me kernel",
363 self,
363 self,
364 shortcut="Ctrl+Shift+T",
364 shortcut="Ctrl+Shift+T",
365 triggered=self.create_tab_with_current_kernel)
365 triggered=self.create_tab_with_current_kernel)
366 self.add_menu_action(self.file_menu, self.slave_kernel_tab_act)
366 self.add_menu_action(self.file_menu, self.slave_kernel_tab_act)
367
367
368 self.file_menu.addSeparator()
368 self.file_menu.addSeparator()
369
369
370 self.close_action=QtGui.QAction("&Close Tab",
370 self.close_action=QtGui.QAction("&Close Tab",
371 self,
371 self,
372 shortcut=QtGui.QKeySequence.Close,
372 shortcut=QtGui.QKeySequence.Close,
373 triggered=self.close_active_frontend
373 triggered=self.close_active_frontend
374 )
374 )
375 self.add_menu_action(self.file_menu, self.close_action)
375 self.add_menu_action(self.file_menu, self.close_action)
376
376
377 self.export_action=QtGui.QAction("&Save to HTML/XHTML",
377 self.export_action=QtGui.QAction("&Save to HTML/XHTML",
378 self,
378 self,
379 shortcut=QtGui.QKeySequence.Save,
379 shortcut=QtGui.QKeySequence.Save,
380 triggered=self.export_action_active_frontend
380 triggered=self.export_action_active_frontend
381 )
381 )
382 self.add_menu_action(self.file_menu, self.export_action, True)
382 self.add_menu_action(self.file_menu, self.export_action, True)
383
383
384 self.file_menu.addSeparator()
384 self.file_menu.addSeparator()
385
385
386 printkey = QtGui.QKeySequence(QtGui.QKeySequence.Print)
386 printkey = QtGui.QKeySequence(QtGui.QKeySequence.Print)
387 if printkey.matches("Ctrl+P") and sys.platform != 'darwin':
387 if printkey.matches("Ctrl+P") and sys.platform != 'darwin':
388 # Only override the default if there is a collision.
388 # Only override the default if there is a collision.
389 # Qt ctrl = cmd on OSX, so the match gets a false positive on OSX.
389 # Qt ctrl = cmd on OSX, so the match gets a false positive on OSX.
390 printkey = "Ctrl+Shift+P"
390 printkey = "Ctrl+Shift+P"
391 self.print_action = QtGui.QAction("&Print",
391 self.print_action = QtGui.QAction("&Print",
392 self,
392 self,
393 shortcut=printkey,
393 shortcut=printkey,
394 triggered=self.print_action_active_frontend)
394 triggered=self.print_action_active_frontend)
395 self.add_menu_action(self.file_menu, self.print_action, True)
395 self.add_menu_action(self.file_menu, self.print_action, True)
396
396
397 if sys.platform != 'darwin':
397 if sys.platform != 'darwin':
398 # OSX always has Quit in the Application menu, only add it
398 # OSX always has Quit in the Application menu, only add it
399 # to the File menu elsewhere.
399 # to the File menu elsewhere.
400
400
401 self.file_menu.addSeparator()
401 self.file_menu.addSeparator()
402
402
403 self.quit_action = QtGui.QAction("&Quit",
403 self.quit_action = QtGui.QAction("&Quit",
404 self,
404 self,
405 shortcut=QtGui.QKeySequence.Quit,
405 shortcut=QtGui.QKeySequence.Quit,
406 triggered=self.close,
406 triggered=self.close,
407 )
407 )
408 self.add_menu_action(self.file_menu, self.quit_action)
408 self.add_menu_action(self.file_menu, self.quit_action)
409
409
410
410
411 def init_edit_menu(self):
411 def init_edit_menu(self):
412 self.edit_menu = self.menuBar().addMenu("&Edit")
412 self.edit_menu = self.menuBar().addMenu("&Edit")
413
413
414 self.undo_action = QtGui.QAction("&Undo",
414 self.undo_action = QtGui.QAction("&Undo",
415 self,
415 self,
416 shortcut=QtGui.QKeySequence.Undo,
416 shortcut=QtGui.QKeySequence.Undo,
417 statusTip="Undo last action if possible",
417 statusTip="Undo last action if possible",
418 triggered=self.undo_active_frontend
418 triggered=self.undo_active_frontend
419 )
419 )
420 self.add_menu_action(self.edit_menu, self.undo_action)
420 self.add_menu_action(self.edit_menu, self.undo_action)
421
421
422 self.redo_action = QtGui.QAction("&Redo",
422 self.redo_action = QtGui.QAction("&Redo",
423 self,
423 self,
424 shortcut=QtGui.QKeySequence.Redo,
424 shortcut=QtGui.QKeySequence.Redo,
425 statusTip="Redo last action if possible",
425 statusTip="Redo last action if possible",
426 triggered=self.redo_active_frontend)
426 triggered=self.redo_active_frontend)
427 self.add_menu_action(self.edit_menu, self.redo_action)
427 self.add_menu_action(self.edit_menu, self.redo_action)
428
428
429 self.edit_menu.addSeparator()
429 self.edit_menu.addSeparator()
430
430
431 self.cut_action = QtGui.QAction("&Cut",
431 self.cut_action = QtGui.QAction("&Cut",
432 self,
432 self,
433 shortcut=QtGui.QKeySequence.Cut,
433 shortcut=QtGui.QKeySequence.Cut,
434 triggered=self.cut_active_frontend
434 triggered=self.cut_active_frontend
435 )
435 )
436 self.add_menu_action(self.edit_menu, self.cut_action, True)
436 self.add_menu_action(self.edit_menu, self.cut_action, True)
437
437
438 self.copy_action = QtGui.QAction("&Copy",
438 self.copy_action = QtGui.QAction("&Copy",
439 self,
439 self,
440 shortcut=QtGui.QKeySequence.Copy,
440 shortcut=QtGui.QKeySequence.Copy,
441 triggered=self.copy_active_frontend
441 triggered=self.copy_active_frontend
442 )
442 )
443 self.add_menu_action(self.edit_menu, self.copy_action, True)
443 self.add_menu_action(self.edit_menu, self.copy_action, True)
444
444
445 self.copy_raw_action = QtGui.QAction("Copy (&Raw Text)",
445 self.copy_raw_action = QtGui.QAction("Copy (&Raw Text)",
446 self,
446 self,
447 shortcut="Ctrl+Shift+C",
447 shortcut="Ctrl+Shift+C",
448 triggered=self.copy_raw_active_frontend
448 triggered=self.copy_raw_active_frontend
449 )
449 )
450 self.add_menu_action(self.edit_menu, self.copy_raw_action, True)
450 self.add_menu_action(self.edit_menu, self.copy_raw_action, True)
451
451
452 self.paste_action = QtGui.QAction("&Paste",
452 self.paste_action = QtGui.QAction("&Paste",
453 self,
453 self,
454 shortcut=QtGui.QKeySequence.Paste,
454 shortcut=QtGui.QKeySequence.Paste,
455 triggered=self.paste_active_frontend
455 triggered=self.paste_active_frontend
456 )
456 )
457 self.add_menu_action(self.edit_menu, self.paste_action, True)
457 self.add_menu_action(self.edit_menu, self.paste_action, True)
458
458
459 self.edit_menu.addSeparator()
459 self.edit_menu.addSeparator()
460
460
461 selectall = QtGui.QKeySequence(QtGui.QKeySequence.SelectAll)
461 selectall = QtGui.QKeySequence(QtGui.QKeySequence.SelectAll)
462 if selectall.matches("Ctrl+A") and sys.platform != 'darwin':
462 if selectall.matches("Ctrl+A") and sys.platform != 'darwin':
463 # Only override the default if there is a collision.
463 # Only override the default if there is a collision.
464 # Qt ctrl = cmd on OSX, so the match gets a false positive on OSX.
464 # Qt ctrl = cmd on OSX, so the match gets a false positive on OSX.
465 selectall = "Ctrl+Shift+A"
465 selectall = "Ctrl+Shift+A"
466 self.select_all_action = QtGui.QAction("Select &All",
466 self.select_all_action = QtGui.QAction("Select &All",
467 self,
467 self,
468 shortcut=selectall,
468 shortcut=selectall,
469 triggered=self.select_all_active_frontend
469 triggered=self.select_all_active_frontend
470 )
470 )
471 self.add_menu_action(self.edit_menu, self.select_all_action, True)
471 self.add_menu_action(self.edit_menu, self.select_all_action, True)
472
472
473
473
474 def init_view_menu(self):
474 def init_view_menu(self):
475 self.view_menu = self.menuBar().addMenu("&View")
475 self.view_menu = self.menuBar().addMenu("&View")
476
476
477 if sys.platform != 'darwin':
477 if sys.platform != 'darwin':
478 # disable on OSX, where there is always a menu bar
478 # disable on OSX, where there is always a menu bar
479 self.toggle_menu_bar_act = QtGui.QAction("Toggle &Menu Bar",
479 self.toggle_menu_bar_act = QtGui.QAction("Toggle &Menu Bar",
480 self,
480 self,
481 shortcut="Ctrl+Shift+M",
481 shortcut="Ctrl+Shift+M",
482 statusTip="Toggle visibility of menubar",
482 statusTip="Toggle visibility of menubar",
483 triggered=self.toggle_menu_bar)
483 triggered=self.toggle_menu_bar)
484 self.add_menu_action(self.view_menu, self.toggle_menu_bar_act)
484 self.add_menu_action(self.view_menu, self.toggle_menu_bar_act)
485
485
486 fs_key = "Ctrl+Meta+F" if sys.platform == 'darwin' else "F11"
486 fs_key = "Ctrl+Meta+F" if sys.platform == 'darwin' else "F11"
487 self.full_screen_act = QtGui.QAction("&Full Screen",
487 self.full_screen_act = QtGui.QAction("&Full Screen",
488 self,
488 self,
489 shortcut=fs_key,
489 shortcut=fs_key,
490 statusTip="Toggle between Fullscreen and Normal Size",
490 statusTip="Toggle between Fullscreen and Normal Size",
491 triggered=self.toggleFullScreen)
491 triggered=self.toggleFullScreen)
492 self.add_menu_action(self.view_menu, self.full_screen_act)
492 self.add_menu_action(self.view_menu, self.full_screen_act)
493
493
494 self.view_menu.addSeparator()
494 self.view_menu.addSeparator()
495
495
496 self.increase_font_size = QtGui.QAction("Zoom &In",
496 self.increase_font_size = QtGui.QAction("Zoom &In",
497 self,
497 self,
498 shortcut=QtGui.QKeySequence.ZoomIn,
498 shortcut=QtGui.QKeySequence.ZoomIn,
499 triggered=self.increase_font_size_active_frontend
499 triggered=self.increase_font_size_active_frontend
500 )
500 )
501 self.add_menu_action(self.view_menu, self.increase_font_size, True)
501 self.add_menu_action(self.view_menu, self.increase_font_size, True)
502
502
503 self.decrease_font_size = QtGui.QAction("Zoom &Out",
503 self.decrease_font_size = QtGui.QAction("Zoom &Out",
504 self,
504 self,
505 shortcut=QtGui.QKeySequence.ZoomOut,
505 shortcut=QtGui.QKeySequence.ZoomOut,
506 triggered=self.decrease_font_size_active_frontend
506 triggered=self.decrease_font_size_active_frontend
507 )
507 )
508 self.add_menu_action(self.view_menu, self.decrease_font_size, True)
508 self.add_menu_action(self.view_menu, self.decrease_font_size, True)
509
509
510 self.reset_font_size = QtGui.QAction("Zoom &Reset",
510 self.reset_font_size = QtGui.QAction("Zoom &Reset",
511 self,
511 self,
512 shortcut="Ctrl+0",
512 shortcut="Ctrl+0",
513 triggered=self.reset_font_size_active_frontend
513 triggered=self.reset_font_size_active_frontend
514 )
514 )
515 self.add_menu_action(self.view_menu, self.reset_font_size, True)
515 self.add_menu_action(self.view_menu, self.reset_font_size, True)
516
516
517 self.view_menu.addSeparator()
517 self.view_menu.addSeparator()
518
518
519 self.clear_action = QtGui.QAction("&Clear Screen",
519 self.clear_action = QtGui.QAction("&Clear Screen",
520 self,
520 self,
521 shortcut='Ctrl+L',
521 shortcut='Ctrl+L',
522 statusTip="Clear the console",
522 statusTip="Clear the console",
523 triggered=self.clear_magic_active_frontend)
523 triggered=self.clear_magic_active_frontend)
524 self.add_menu_action(self.view_menu, self.clear_action)
524 self.add_menu_action(self.view_menu, self.clear_action)
525
525
526 def init_kernel_menu(self):
526 def init_kernel_menu(self):
527 self.kernel_menu = self.menuBar().addMenu("&Kernel")
527 self.kernel_menu = self.menuBar().addMenu("&Kernel")
528 # Qt on OSX maps Ctrl to Cmd, and Meta to Ctrl
528 # Qt on OSX maps Ctrl to Cmd, and Meta to Ctrl
529 # keep the signal shortcuts to ctrl, rather than
529 # keep the signal shortcuts to ctrl, rather than
530 # platform-default like we do elsewhere.
530 # platform-default like we do elsewhere.
531
531
532 ctrl = "Meta" if sys.platform == 'darwin' else "Ctrl"
532 ctrl = "Meta" if sys.platform == 'darwin' else "Ctrl"
533
533
534 self.interrupt_kernel_action = QtGui.QAction("Interrupt current Kernel",
534 self.interrupt_kernel_action = QtGui.QAction("Interrupt current Kernel",
535 self,
535 self,
536 triggered=self.interrupt_kernel_active_frontend,
536 triggered=self.interrupt_kernel_active_frontend,
537 shortcut=ctrl+"+C",
537 shortcut=ctrl+"+C",
538 )
538 )
539 self.add_menu_action(self.kernel_menu, self.interrupt_kernel_action)
539 self.add_menu_action(self.kernel_menu, self.interrupt_kernel_action)
540
540
541 self.restart_kernel_action = QtGui.QAction("Restart current Kernel",
541 self.restart_kernel_action = QtGui.QAction("Restart current Kernel",
542 self,
542 self,
543 triggered=self.restart_kernel_active_frontend,
543 triggered=self.restart_kernel_active_frontend,
544 shortcut=ctrl+"+.",
544 shortcut=ctrl+"+.",
545 )
545 )
546 self.add_menu_action(self.kernel_menu, self.restart_kernel_action)
546 self.add_menu_action(self.kernel_menu, self.restart_kernel_action)
547
547
548 self.kernel_menu.addSeparator()
548 self.kernel_menu.addSeparator()
549
549
550 def _make_dynamic_magic(self,magic):
550 def _make_dynamic_magic(self,magic):
551 """Return a function `fun` that will execute `magic` on active frontend.
551 """Return a function `fun` that will execute `magic` on active frontend.
552
552
553 Parameters
553 Parameters
554 ----------
554 ----------
555 magic : string
555 magic : string
556 string that will be executed as is when the returned function is called
556 string that will be executed as is when the returned function is called
557
557
558 Returns
558 Returns
559 -------
559 -------
560 fun : function
560 fun : function
561 function with no parameters, when called will execute `magic` on the
561 function with no parameters, when called will execute `magic` on the
562 current active frontend at call time
562 current active frontend at call time
563
563
564 See Also
564 See Also
565 --------
565 --------
566 populate_all_magic_menu : generate the "All Magics..." menu
566 populate_all_magic_menu : generate the "All Magics..." menu
567
567
568 Notes
568 Notes
569 -----
569 -----
570 `fun` execute `magic` an active frontend at the moment it is triggerd,
570 `fun` execute `magic` an active frontend at the moment it is triggerd,
571 not the active frontend at the moment it has been created.
571 not the active frontend at the moment it has been created.
572
572
573 This function is mostly used to create the "All Magics..." Menu at run time.
573 This function is mostly used to create the "All Magics..." Menu at run time.
574 """
574 """
575 # need to level nested function to be sure to past magic
575 # need to level nested function to be sure to past magic
576 # on active frontend **at run time**.
576 # on active frontend **at run time**.
577 def inner_dynamic_magic():
577 def inner_dynamic_magic():
578 self.active_frontend.execute(magic)
578 self.active_frontend.execute(magic)
579 inner_dynamic_magic.__name__ = "dynamics_magic_s"
579 inner_dynamic_magic.__name__ = "dynamics_magic_s"
580 return inner_dynamic_magic
580 return inner_dynamic_magic
581
581
582 def populate_all_magic_menu(self, listofmagic=None):
582 def populate_all_magic_menu(self, listofmagic=None):
583 """Clean "All Magics..." menu and repopulate it with `listofmagic`
583 """Clean "All Magics..." menu and repopulate it with `listofmagic`
584
584
585 Parameters
585 Parameters
586 ----------
586 ----------
587 listofmagic : string,
587 listofmagic : string,
588 repr() of a list of strings, send back by the kernel
588 repr() of a list of strings, send back by the kernel
589
589
590 Notes
590 Notes
591 -----
591 -----
592 `listofmagic`is a repr() of list because it is fed with the result of
592 `listofmagic`is a repr() of list because it is fed with the result of
593 a 'user_expression'
593 a 'user_expression'
594 """
594 """
595 alm_magic_menu = self.all_magic_menu
595 alm_magic_menu = self.all_magic_menu
596 alm_magic_menu.clear()
596 alm_magic_menu.clear()
597
597
598 # list of protected magic that don't like to be called without argument
598 # list of protected magic that don't like to be called without argument
599 # append '?' to the end to print the docstring when called from the menu
599 # append '?' to the end to print the docstring when called from the menu
600 protected_magic = set(["more","less","load_ext","pycat","loadpy","save"])
600 protected_magic = set(["more","less","load_ext","pycat","loadpy","load","save"])
601 magics=re.findall('\w+', listofmagic)
601 magics=re.findall('\w+', listofmagic)
602 for magic in magics:
602 for magic in magics:
603 if magic in protected_magic:
603 if magic in protected_magic:
604 pmagic = '%s%s%s'%('%',magic,'?')
604 pmagic = '%s%s%s'%('%',magic,'?')
605 else:
605 else:
606 pmagic = '%s%s'%('%',magic)
606 pmagic = '%s%s'%('%',magic)
607 xaction = QtGui.QAction(pmagic,
607 xaction = QtGui.QAction(pmagic,
608 self,
608 self,
609 triggered=self._make_dynamic_magic(pmagic)
609 triggered=self._make_dynamic_magic(pmagic)
610 )
610 )
611 alm_magic_menu.addAction(xaction)
611 alm_magic_menu.addAction(xaction)
612
612
613 def update_all_magic_menu(self):
613 def update_all_magic_menu(self):
614 """ Update the list on magic in the "All Magics..." Menu
614 """ Update the list on magic in the "All Magics..." Menu
615
615
616 Request the kernel with the list of availlable magic and populate the
616 Request the kernel with the list of availlable magic and populate the
617 menu with the list received back
617 menu with the list received back
618
618
619 """
619 """
620 # first define a callback which will get the list of all magic and put it in the menu.
620 # first define a callback which will get the list of all magic and put it in the menu.
621 self.active_frontend._silent_exec_callback('get_ipython().lsmagic()', self.populate_all_magic_menu)
621 self.active_frontend._silent_exec_callback('get_ipython().lsmagic()', self.populate_all_magic_menu)
622
622
623 def init_magic_menu(self):
623 def init_magic_menu(self):
624 self.magic_menu = self.menuBar().addMenu("&Magic")
624 self.magic_menu = self.menuBar().addMenu("&Magic")
625 self.all_magic_menu = self.magic_menu.addMenu("&All Magics")
625 self.all_magic_menu = self.magic_menu.addMenu("&All Magics")
626
626
627 # This action should usually not appear as it will be cleared when menu
627 # This action should usually not appear as it will be cleared when menu
628 # is updated at first kernel response. Though, it is necessary when
628 # is updated at first kernel response. Though, it is necessary when
629 # connecting through X-forwarding, as in this case, the menu is not
629 # connecting through X-forwarding, as in this case, the menu is not
630 # auto updated, SO DO NOT DELETE.
630 # auto updated, SO DO NOT DELETE.
631 self.pop = QtGui.QAction("&Update All Magic Menu ",
631 self.pop = QtGui.QAction("&Update All Magic Menu ",
632 self, triggered=self.update_all_magic_menu)
632 self, triggered=self.update_all_magic_menu)
633 self.add_menu_action(self.all_magic_menu, self.pop)
633 self.add_menu_action(self.all_magic_menu, self.pop)
634 # we need to populate the 'Magic Menu' once the kernel has answer at
634 # we need to populate the 'Magic Menu' once the kernel has answer at
635 # least once let's do it immedialy, but it's assured to works
635 # least once let's do it immedialy, but it's assured to works
636 self.pop.trigger()
636 self.pop.trigger()
637
637
638 self.reset_action = QtGui.QAction("&Reset",
638 self.reset_action = QtGui.QAction("&Reset",
639 self,
639 self,
640 statusTip="Clear all varible from workspace",
640 statusTip="Clear all varible from workspace",
641 triggered=self.reset_magic_active_frontend)
641 triggered=self.reset_magic_active_frontend)
642 self.add_menu_action(self.magic_menu, self.reset_action)
642 self.add_menu_action(self.magic_menu, self.reset_action)
643
643
644 self.history_action = QtGui.QAction("&History",
644 self.history_action = QtGui.QAction("&History",
645 self,
645 self,
646 statusTip="show command history",
646 statusTip="show command history",
647 triggered=self.history_magic_active_frontend)
647 triggered=self.history_magic_active_frontend)
648 self.add_menu_action(self.magic_menu, self.history_action)
648 self.add_menu_action(self.magic_menu, self.history_action)
649
649
650 self.save_action = QtGui.QAction("E&xport History ",
650 self.save_action = QtGui.QAction("E&xport History ",
651 self,
651 self,
652 statusTip="Export History as Python File",
652 statusTip="Export History as Python File",
653 triggered=self.save_magic_active_frontend)
653 triggered=self.save_magic_active_frontend)
654 self.add_menu_action(self.magic_menu, self.save_action)
654 self.add_menu_action(self.magic_menu, self.save_action)
655
655
656 self.who_action = QtGui.QAction("&Who",
656 self.who_action = QtGui.QAction("&Who",
657 self,
657 self,
658 statusTip="List interactive variable",
658 statusTip="List interactive variable",
659 triggered=self.who_magic_active_frontend)
659 triggered=self.who_magic_active_frontend)
660 self.add_menu_action(self.magic_menu, self.who_action)
660 self.add_menu_action(self.magic_menu, self.who_action)
661
661
662 self.who_ls_action = QtGui.QAction("Wh&o ls",
662 self.who_ls_action = QtGui.QAction("Wh&o ls",
663 self,
663 self,
664 statusTip="Return a list of interactive variable",
664 statusTip="Return a list of interactive variable",
665 triggered=self.who_ls_magic_active_frontend)
665 triggered=self.who_ls_magic_active_frontend)
666 self.add_menu_action(self.magic_menu, self.who_ls_action)
666 self.add_menu_action(self.magic_menu, self.who_ls_action)
667
667
668 self.whos_action = QtGui.QAction("Who&s",
668 self.whos_action = QtGui.QAction("Who&s",
669 self,
669 self,
670 statusTip="List interactive variable with detail",
670 statusTip="List interactive variable with detail",
671 triggered=self.whos_magic_active_frontend)
671 triggered=self.whos_magic_active_frontend)
672 self.add_menu_action(self.magic_menu, self.whos_action)
672 self.add_menu_action(self.magic_menu, self.whos_action)
673
673
674 def init_window_menu(self):
674 def init_window_menu(self):
675 self.window_menu = self.menuBar().addMenu("&Window")
675 self.window_menu = self.menuBar().addMenu("&Window")
676 if sys.platform == 'darwin':
676 if sys.platform == 'darwin':
677 # add min/maximize actions to OSX, which lacks default bindings.
677 # add min/maximize actions to OSX, which lacks default bindings.
678 self.minimizeAct = QtGui.QAction("Mini&mize",
678 self.minimizeAct = QtGui.QAction("Mini&mize",
679 self,
679 self,
680 shortcut="Ctrl+m",
680 shortcut="Ctrl+m",
681 statusTip="Minimize the window/Restore Normal Size",
681 statusTip="Minimize the window/Restore Normal Size",
682 triggered=self.toggleMinimized)
682 triggered=self.toggleMinimized)
683 # maximize is called 'Zoom' on OSX for some reason
683 # maximize is called 'Zoom' on OSX for some reason
684 self.maximizeAct = QtGui.QAction("&Zoom",
684 self.maximizeAct = QtGui.QAction("&Zoom",
685 self,
685 self,
686 shortcut="Ctrl+Shift+M",
686 shortcut="Ctrl+Shift+M",
687 statusTip="Maximize the window/Restore Normal Size",
687 statusTip="Maximize the window/Restore Normal Size",
688 triggered=self.toggleMaximized)
688 triggered=self.toggleMaximized)
689
689
690 self.add_menu_action(self.window_menu, self.minimizeAct)
690 self.add_menu_action(self.window_menu, self.minimizeAct)
691 self.add_menu_action(self.window_menu, self.maximizeAct)
691 self.add_menu_action(self.window_menu, self.maximizeAct)
692 self.window_menu.addSeparator()
692 self.window_menu.addSeparator()
693
693
694 prev_key = "Ctrl+Shift+Left" if sys.platform == 'darwin' else "Ctrl+PgUp"
694 prev_key = "Ctrl+Shift+Left" if sys.platform == 'darwin' else "Ctrl+PgUp"
695 self.prev_tab_act = QtGui.QAction("Pre&vious Tab",
695 self.prev_tab_act = QtGui.QAction("Pre&vious Tab",
696 self,
696 self,
697 shortcut=prev_key,
697 shortcut=prev_key,
698 statusTip="Select previous tab",
698 statusTip="Select previous tab",
699 triggered=self.prev_tab)
699 triggered=self.prev_tab)
700 self.add_menu_action(self.window_menu, self.prev_tab_act)
700 self.add_menu_action(self.window_menu, self.prev_tab_act)
701
701
702 next_key = "Ctrl+Shift+Right" if sys.platform == 'darwin' else "Ctrl+PgDown"
702 next_key = "Ctrl+Shift+Right" if sys.platform == 'darwin' else "Ctrl+PgDown"
703 self.next_tab_act = QtGui.QAction("Ne&xt Tab",
703 self.next_tab_act = QtGui.QAction("Ne&xt Tab",
704 self,
704 self,
705 shortcut=next_key,
705 shortcut=next_key,
706 statusTip="Select next tab",
706 statusTip="Select next tab",
707 triggered=self.next_tab)
707 triggered=self.next_tab)
708 self.add_menu_action(self.window_menu, self.next_tab_act)
708 self.add_menu_action(self.window_menu, self.next_tab_act)
709
709
710 def init_help_menu(self):
710 def init_help_menu(self):
711 # please keep the Help menu in Mac Os even if empty. It will
711 # please keep the Help menu in Mac Os even if empty. It will
712 # automatically contain a search field to search inside menus and
712 # automatically contain a search field to search inside menus and
713 # please keep it spelled in English, as long as Qt Doesn't support
713 # please keep it spelled in English, as long as Qt Doesn't support
714 # a QAction.MenuRole like HelpMenuRole otherwise it will loose
714 # a QAction.MenuRole like HelpMenuRole otherwise it will loose
715 # this search field fonctionality
715 # this search field fonctionality
716
716
717 self.help_menu = self.menuBar().addMenu("&Help")
717 self.help_menu = self.menuBar().addMenu("&Help")
718
718
719
719
720 # Help Menu
720 # Help Menu
721
721
722 self.intro_active_frontend_action = QtGui.QAction("&Intro to IPython",
722 self.intro_active_frontend_action = QtGui.QAction("&Intro to IPython",
723 self,
723 self,
724 triggered=self.intro_active_frontend
724 triggered=self.intro_active_frontend
725 )
725 )
726 self.add_menu_action(self.help_menu, self.intro_active_frontend_action)
726 self.add_menu_action(self.help_menu, self.intro_active_frontend_action)
727
727
728 self.quickref_active_frontend_action = QtGui.QAction("IPython &Cheat Sheet",
728 self.quickref_active_frontend_action = QtGui.QAction("IPython &Cheat Sheet",
729 self,
729 self,
730 triggered=self.quickref_active_frontend
730 triggered=self.quickref_active_frontend
731 )
731 )
732 self.add_menu_action(self.help_menu, self.quickref_active_frontend_action)
732 self.add_menu_action(self.help_menu, self.quickref_active_frontend_action)
733
733
734 self.guiref_active_frontend_action = QtGui.QAction("&Qt Console",
734 self.guiref_active_frontend_action = QtGui.QAction("&Qt Console",
735 self,
735 self,
736 triggered=self.guiref_active_frontend
736 triggered=self.guiref_active_frontend
737 )
737 )
738 self.add_menu_action(self.help_menu, self.guiref_active_frontend_action)
738 self.add_menu_action(self.help_menu, self.guiref_active_frontend_action)
739
739
740 self.onlineHelpAct = QtGui.QAction("Open Online &Help",
740 self.onlineHelpAct = QtGui.QAction("Open Online &Help",
741 self,
741 self,
742 triggered=self._open_online_help)
742 triggered=self._open_online_help)
743 self.add_menu_action(self.help_menu, self.onlineHelpAct)
743 self.add_menu_action(self.help_menu, self.onlineHelpAct)
744
744
745 # minimize/maximize/fullscreen actions:
745 # minimize/maximize/fullscreen actions:
746
746
747 def toggle_menu_bar(self):
747 def toggle_menu_bar(self):
748 menu_bar = self.menuBar()
748 menu_bar = self.menuBar()
749 if menu_bar.isVisible():
749 if menu_bar.isVisible():
750 menu_bar.setVisible(False)
750 menu_bar.setVisible(False)
751 else:
751 else:
752 menu_bar.setVisible(True)
752 menu_bar.setVisible(True)
753
753
754 def toggleMinimized(self):
754 def toggleMinimized(self):
755 if not self.isMinimized():
755 if not self.isMinimized():
756 self.showMinimized()
756 self.showMinimized()
757 else:
757 else:
758 self.showNormal()
758 self.showNormal()
759
759
760 def _open_online_help(self):
760 def _open_online_help(self):
761 filename="http://ipython.org/ipython-doc/stable/index.html"
761 filename="http://ipython.org/ipython-doc/stable/index.html"
762 webbrowser.open(filename, new=1, autoraise=True)
762 webbrowser.open(filename, new=1, autoraise=True)
763
763
764 def toggleMaximized(self):
764 def toggleMaximized(self):
765 if not self.isMaximized():
765 if not self.isMaximized():
766 self.showMaximized()
766 self.showMaximized()
767 else:
767 else:
768 self.showNormal()
768 self.showNormal()
769
769
770 # Min/Max imizing while in full screen give a bug
770 # Min/Max imizing while in full screen give a bug
771 # when going out of full screen, at least on OSX
771 # when going out of full screen, at least on OSX
772 def toggleFullScreen(self):
772 def toggleFullScreen(self):
773 if not self.isFullScreen():
773 if not self.isFullScreen():
774 self.showFullScreen()
774 self.showFullScreen()
775 if sys.platform == 'darwin':
775 if sys.platform == 'darwin':
776 self.maximizeAct.setEnabled(False)
776 self.maximizeAct.setEnabled(False)
777 self.minimizeAct.setEnabled(False)
777 self.minimizeAct.setEnabled(False)
778 else:
778 else:
779 self.showNormal()
779 self.showNormal()
780 if sys.platform == 'darwin':
780 if sys.platform == 'darwin':
781 self.maximizeAct.setEnabled(True)
781 self.maximizeAct.setEnabled(True)
782 self.minimizeAct.setEnabled(True)
782 self.minimizeAct.setEnabled(True)
783
783
784 def close_active_frontend(self):
784 def close_active_frontend(self):
785 self.close_tab(self.active_frontend)
785 self.close_tab(self.active_frontend)
786
786
787 def restart_kernel_active_frontend(self):
787 def restart_kernel_active_frontend(self):
788 self.active_frontend.request_restart_kernel()
788 self.active_frontend.request_restart_kernel()
789
789
790 def interrupt_kernel_active_frontend(self):
790 def interrupt_kernel_active_frontend(self):
791 self.active_frontend.request_interrupt_kernel()
791 self.active_frontend.request_interrupt_kernel()
792
792
793 def cut_active_frontend(self):
793 def cut_active_frontend(self):
794 widget = self.active_frontend
794 widget = self.active_frontend
795 if widget.can_cut():
795 if widget.can_cut():
796 widget.cut()
796 widget.cut()
797
797
798 def copy_active_frontend(self):
798 def copy_active_frontend(self):
799 widget = self.active_frontend
799 widget = self.active_frontend
800 widget.copy()
800 widget.copy()
801
801
802 def copy_raw_active_frontend(self):
802 def copy_raw_active_frontend(self):
803 self.active_frontend._copy_raw_action.trigger()
803 self.active_frontend._copy_raw_action.trigger()
804
804
805 def paste_active_frontend(self):
805 def paste_active_frontend(self):
806 widget = self.active_frontend
806 widget = self.active_frontend
807 if widget.can_paste():
807 if widget.can_paste():
808 widget.paste()
808 widget.paste()
809
809
810 def undo_active_frontend(self):
810 def undo_active_frontend(self):
811 self.active_frontend.undo()
811 self.active_frontend.undo()
812
812
813 def redo_active_frontend(self):
813 def redo_active_frontend(self):
814 self.active_frontend.redo()
814 self.active_frontend.redo()
815
815
816 def reset_magic_active_frontend(self):
816 def reset_magic_active_frontend(self):
817 self.active_frontend.execute("%reset")
817 self.active_frontend.execute("%reset")
818
818
819 def history_magic_active_frontend(self):
819 def history_magic_active_frontend(self):
820 self.active_frontend.execute("%history")
820 self.active_frontend.execute("%history")
821
821
822 def save_magic_active_frontend(self):
822 def save_magic_active_frontend(self):
823 self.active_frontend.save_magic()
823 self.active_frontend.save_magic()
824
824
825 def clear_magic_active_frontend(self):
825 def clear_magic_active_frontend(self):
826 self.active_frontend.execute("%clear")
826 self.active_frontend.execute("%clear")
827
827
828 def who_magic_active_frontend(self):
828 def who_magic_active_frontend(self):
829 self.active_frontend.execute("%who")
829 self.active_frontend.execute("%who")
830
830
831 def who_ls_magic_active_frontend(self):
831 def who_ls_magic_active_frontend(self):
832 self.active_frontend.execute("%who_ls")
832 self.active_frontend.execute("%who_ls")
833
833
834 def whos_magic_active_frontend(self):
834 def whos_magic_active_frontend(self):
835 self.active_frontend.execute("%whos")
835 self.active_frontend.execute("%whos")
836
836
837 def print_action_active_frontend(self):
837 def print_action_active_frontend(self):
838 self.active_frontend.print_action.trigger()
838 self.active_frontend.print_action.trigger()
839
839
840 def export_action_active_frontend(self):
840 def export_action_active_frontend(self):
841 self.active_frontend.export_action.trigger()
841 self.active_frontend.export_action.trigger()
842
842
843 def select_all_active_frontend(self):
843 def select_all_active_frontend(self):
844 self.active_frontend.select_all_action.trigger()
844 self.active_frontend.select_all_action.trigger()
845
845
846 def increase_font_size_active_frontend(self):
846 def increase_font_size_active_frontend(self):
847 self.active_frontend.increase_font_size.trigger()
847 self.active_frontend.increase_font_size.trigger()
848
848
849 def decrease_font_size_active_frontend(self):
849 def decrease_font_size_active_frontend(self):
850 self.active_frontend.decrease_font_size.trigger()
850 self.active_frontend.decrease_font_size.trigger()
851
851
852 def reset_font_size_active_frontend(self):
852 def reset_font_size_active_frontend(self):
853 self.active_frontend.reset_font_size.trigger()
853 self.active_frontend.reset_font_size.trigger()
854
854
855 def guiref_active_frontend(self):
855 def guiref_active_frontend(self):
856 self.active_frontend.execute("%guiref")
856 self.active_frontend.execute("%guiref")
857
857
858 def intro_active_frontend(self):
858 def intro_active_frontend(self):
859 self.active_frontend.execute("?")
859 self.active_frontend.execute("?")
860
860
861 def quickref_active_frontend(self):
861 def quickref_active_frontend(self):
862 self.active_frontend.execute("%quickref")
862 self.active_frontend.execute("%quickref")
863 #---------------------------------------------------------------------------
863 #---------------------------------------------------------------------------
864 # QWidget interface
864 # QWidget interface
865 #---------------------------------------------------------------------------
865 #---------------------------------------------------------------------------
866
866
867 def closeEvent(self, event):
867 def closeEvent(self, event):
868 """ Forward the close event to every tabs contained by the windows
868 """ Forward the close event to every tabs contained by the windows
869 """
869 """
870 if self.tab_widget.count() == 0:
870 if self.tab_widget.count() == 0:
871 # no tabs, just close
871 # no tabs, just close
872 event.accept()
872 event.accept()
873 return
873 return
874 # Do Not loop on the widget count as it change while closing
874 # Do Not loop on the widget count as it change while closing
875 title = self.window().windowTitle()
875 title = self.window().windowTitle()
876 cancel = QtGui.QMessageBox.Cancel
876 cancel = QtGui.QMessageBox.Cancel
877 okay = QtGui.QMessageBox.Ok
877 okay = QtGui.QMessageBox.Ok
878
878
879 if self.confirm_exit:
879 if self.confirm_exit:
880 if self.tab_widget.count() > 1:
880 if self.tab_widget.count() > 1:
881 msg = "Close all tabs, stop all kernels, and Quit?"
881 msg = "Close all tabs, stop all kernels, and Quit?"
882 else:
882 else:
883 msg = "Close console, stop kernel, and Quit?"
883 msg = "Close console, stop kernel, and Quit?"
884 info = "Kernels not started here (e.g. notebooks) will be left alone."
884 info = "Kernels not started here (e.g. notebooks) will be left alone."
885 closeall = QtGui.QPushButton("&Quit", self)
885 closeall = QtGui.QPushButton("&Quit", self)
886 closeall.setShortcut('Q')
886 closeall.setShortcut('Q')
887 box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
887 box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
888 title, msg)
888 title, msg)
889 box.setInformativeText(info)
889 box.setInformativeText(info)
890 box.addButton(cancel)
890 box.addButton(cancel)
891 box.addButton(closeall, QtGui.QMessageBox.YesRole)
891 box.addButton(closeall, QtGui.QMessageBox.YesRole)
892 box.setDefaultButton(closeall)
892 box.setDefaultButton(closeall)
893 box.setEscapeButton(cancel)
893 box.setEscapeButton(cancel)
894 pixmap = QtGui.QPixmap(self._app.icon.pixmap(QtCore.QSize(64,64)))
894 pixmap = QtGui.QPixmap(self._app.icon.pixmap(QtCore.QSize(64,64)))
895 box.setIconPixmap(pixmap)
895 box.setIconPixmap(pixmap)
896 reply = box.exec_()
896 reply = box.exec_()
897 else:
897 else:
898 reply = okay
898 reply = okay
899
899
900 if reply == cancel:
900 if reply == cancel:
901 event.ignore()
901 event.ignore()
902 return
902 return
903 if reply == okay:
903 if reply == okay:
904 while self.tab_widget.count() >= 1:
904 while self.tab_widget.count() >= 1:
905 # prevent further confirmations:
905 # prevent further confirmations:
906 widget = self.active_frontend
906 widget = self.active_frontend
907 widget._confirm_exit = False
907 widget._confirm_exit = False
908 self.close_tab(widget)
908 self.close_tab(widget)
909 event.accept()
909 event.accept()
910
910
@@ -1,1093 +1,1093 b''
1 {
1 {
2 "metadata": {
2 "metadata": {
3 "name": "00_notebook_tour"
3 "name": "00_notebook_tour"
4 },
4 },
5 "nbformat": 3,
5 "nbformat": 3,
6 "worksheets": [
6 "worksheets": [
7 {
7 {
8 "cells": [
8 "cells": [
9 {
9 {
10 "cell_type": "markdown",
10 "cell_type": "markdown",
11 "source": [
11 "source": [
12 "# A brief tour of the IPython notebook",
12 "# A brief tour of the IPython notebook",
13 "",
13 "",
14 "This document will give you a brief tour of the capabilities of the IPython notebook. ",
14 "This document will give you a brief tour of the capabilities of the IPython notebook. ",
15 "You can view its contents by scrolling around, or execute each cell by typing `Shift-Enter`.",
15 "You can view its contents by scrolling around, or execute each cell by typing `Shift-Enter`.",
16 "After you conclude this brief high-level tour, you should read the accompanying notebook ",
16 "After you conclude this brief high-level tour, you should read the accompanying notebook ",
17 "titled `01_notebook_introduction`, which takes a more step-by-step approach to the features of the",
17 "titled `01_notebook_introduction`, which takes a more step-by-step approach to the features of the",
18 "system. ",
18 "system. ",
19 "",
19 "",
20 "The rest of the notebooks in this directory illustrate various other aspects and ",
20 "The rest of the notebooks in this directory illustrate various other aspects and ",
21 "capabilities of the IPython notebook; some of them may require additional libraries to be executed.",
21 "capabilities of the IPython notebook; some of them may require additional libraries to be executed.",
22 "",
22 "",
23 "**NOTE:** This notebook *must* be run from its own directory, so you must ``cd``",
23 "**NOTE:** This notebook *must* be run from its own directory, so you must ``cd``",
24 "to this directory and then start the notebook, but do *not* use the ``--notebook-dir``",
24 "to this directory and then start the notebook, but do *not* use the ``--notebook-dir``",
25 "option to run it from another location.",
25 "option to run it from another location.",
26 "",
26 "",
27 "The first thing you need to know is that you are still controlling the same old IPython you're used to,",
27 "The first thing you need to know is that you are still controlling the same old IPython you're used to,",
28 "so things like shell aliases and magic commands still work:"
28 "so things like shell aliases and magic commands still work:"
29 ]
29 ]
30 },
30 },
31 {
31 {
32 "cell_type": "code",
32 "cell_type": "code",
33 "collapsed": false,
33 "collapsed": false,
34 "input": [
34 "input": [
35 "pwd"
35 "pwd"
36 ],
36 ],
37 "language": "python",
37 "language": "python",
38 "outputs": [
38 "outputs": [
39 {
39 {
40 "output_type": "pyout",
40 "output_type": "pyout",
41 "prompt_number": 1,
41 "prompt_number": 1,
42 "text": [
42 "text": [
43 "u'/home/fperez/ipython/ipython/docs/examples/notebooks'"
43 "u'/home/fperez/ipython/ipython/docs/examples/notebooks'"
44 ]
44 ]
45 }
45 }
46 ],
46 ],
47 "prompt_number": 1
47 "prompt_number": 1
48 },
48 },
49 {
49 {
50 "cell_type": "code",
50 "cell_type": "code",
51 "collapsed": false,
51 "collapsed": false,
52 "input": [
52 "input": [
53 "ls"
53 "ls"
54 ],
54 ],
55 "language": "python",
55 "language": "python",
56 "outputs": [
56 "outputs": [
57 {
57 {
58 "output_type": "stream",
58 "output_type": "stream",
59 "stream": "stdout",
59 "stream": "stdout",
60 "text": [
60 "text": [
61 "00_notebook_tour.ipynb python-logo.svg",
61 "00_notebook_tour.ipynb python-logo.svg",
62 "01_notebook_introduction.ipynb sympy.ipynb",
62 "01_notebook_introduction.ipynb sympy.ipynb",
63 "animation.m4v sympy_quantum_computing.ipynb",
63 "animation.m4v sympy_quantum_computing.ipynb",
64 "display_protocol.ipynb trapezoid_rule.ipynb",
64 "display_protocol.ipynb trapezoid_rule.ipynb",
65 "formatting.ipynb"
65 "formatting.ipynb"
66 ]
66 ]
67 }
67 }
68 ],
68 ],
69 "prompt_number": 2
69 "prompt_number": 2
70 },
70 },
71 {
71 {
72 "cell_type": "code",
72 "cell_type": "code",
73 "collapsed": false,
73 "collapsed": false,
74 "input": [
74 "input": [
75 "message = 'The IPython notebook is great!'",
75 "message = 'The IPython notebook is great!'",
76 "# note: the echo command does not run on Windows, it's a unix command.",
76 "# note: the echo command does not run on Windows, it's a unix command.",
77 "!echo $message"
77 "!echo $message"
78 ],
78 ],
79 "language": "python",
79 "language": "python",
80 "outputs": [
80 "outputs": [
81 {
81 {
82 "output_type": "stream",
82 "output_type": "stream",
83 "stream": "stdout",
83 "stream": "stdout",
84 "text": [
84 "text": [
85 "The IPython notebook is great!"
85 "The IPython notebook is great!"
86 ]
86 ]
87 }
87 }
88 ],
88 ],
89 "prompt_number": 3
89 "prompt_number": 3
90 },
90 },
91 {
91 {
92 "cell_type": "markdown",
92 "cell_type": "markdown",
93 "source": [
93 "source": [
94 "Plots with matplotlib: do *not* execute the next below if you do not have matplotlib installed or didn't start up ",
94 "Plots with matplotlib: do *not* execute the next below if you do not have matplotlib installed or didn't start up ",
95 "this notebook with the `--pylab` option, as the code will not work."
95 "this notebook with the `--pylab` option, as the code will not work."
96 ]
96 ]
97 },
97 },
98 {
98 {
99 "cell_type": "code",
99 "cell_type": "code",
100 "collapsed": false,
100 "collapsed": false,
101 "input": [
101 "input": [
102 "x = linspace(0, 3*pi, 500)",
102 "x = linspace(0, 3*pi, 500)",
103 "plot(x, sin(x**2))",
103 "plot(x, sin(x**2))",
104 "title('A simple chirp');"
104 "title('A simple chirp');"
105 ],
105 ],
106 "language": "python",
106 "language": "python",
107 "outputs": [
107 "outputs": [
108 {
108 {
109 "output_type": "display_data",
109 "output_type": "display_data",
110 "png": "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\n"
110 "png": "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\n"
111 }
111 }
112 ],
112 ],
113 "prompt_number": 4
113 "prompt_number": 4
114 },
114 },
115 {
115 {
116 "cell_type": "markdown",
116 "cell_type": "markdown",
117 "source": [
117 "source": [
118 "You can paste blocks of input with prompt markers, such as those from",
118 "You can paste blocks of input with prompt markers, such as those from",
119 "[the official Python tutorial](http://docs.python.org/tutorial/interpreter.html#interactive-mode)"
119 "[the official Python tutorial](http://docs.python.org/tutorial/interpreter.html#interactive-mode)"
120 ]
120 ]
121 },
121 },
122 {
122 {
123 "cell_type": "code",
123 "cell_type": "code",
124 "collapsed": false,
124 "collapsed": false,
125 "input": [
125 "input": [
126 ">>> the_world_is_flat = 1",
126 ">>> the_world_is_flat = 1",
127 ">>> if the_world_is_flat:",
127 ">>> if the_world_is_flat:",
128 "... print \"Be careful not to fall off!\""
128 "... print \"Be careful not to fall off!\""
129 ],
129 ],
130 "language": "python",
130 "language": "python",
131 "outputs": [
131 "outputs": [
132 {
132 {
133 "output_type": "stream",
133 "output_type": "stream",
134 "stream": "stdout",
134 "stream": "stdout",
135 "text": [
135 "text": [
136 "Be careful not to fall off!"
136 "Be careful not to fall off!"
137 ]
137 ]
138 }
138 }
139 ],
139 ],
140 "prompt_number": 5
140 "prompt_number": 5
141 },
141 },
142 {
142 {
143 "cell_type": "markdown",
143 "cell_type": "markdown",
144 "source": [
144 "source": [
145 "Errors are shown in informative ways:"
145 "Errors are shown in informative ways:"
146 ]
146 ]
147 },
147 },
148 {
148 {
149 "cell_type": "code",
149 "cell_type": "code",
150 "collapsed": false,
150 "collapsed": false,
151 "input": [
151 "input": [
152 "%run non_existent_file"
152 "%run non_existent_file"
153 ],
153 ],
154 "language": "python",
154 "language": "python",
155 "outputs": [
155 "outputs": [
156 {
156 {
157 "output_type": "stream",
157 "output_type": "stream",
158 "stream": "stderr",
158 "stream": "stderr",
159 "text": [
159 "text": [
160 "ERROR: File `non_existent_file.py` not found."
160 "ERROR: File `non_existent_file.py` not found."
161 ]
161 ]
162 }
162 }
163 ],
163 ],
164 "prompt_number": 6
164 "prompt_number": 6
165 },
165 },
166 {
166 {
167 "cell_type": "code",
167 "cell_type": "code",
168 "collapsed": false,
168 "collapsed": false,
169 "input": [
169 "input": [
170 "x = 1",
170 "x = 1",
171 "y = 4",
171 "y = 4",
172 "z = y/(1-x)"
172 "z = y/(1-x)"
173 ],
173 ],
174 "language": "python",
174 "language": "python",
175 "outputs": [
175 "outputs": [
176 {
176 {
177 "ename": "ZeroDivisionError",
177 "ename": "ZeroDivisionError",
178 "evalue": "integer division or modulo by zero",
178 "evalue": "integer division or modulo by zero",
179 "output_type": "pyerr",
179 "output_type": "pyerr",
180 "traceback": [
180 "traceback": [
181 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)",
181 "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)",
182 "\u001b[0;32m/home/fperez/ipython/ipython/docs/examples/notebooks/<ipython-input-7-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",
182 "\u001b[0;32m/home/fperez/ipython/ipython/docs/examples/notebooks/<ipython-input-7-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",
183 "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero"
183 "\u001b[0;31mZeroDivisionError\u001b[0m: integer division or modulo by zero"
184 ]
184 ]
185 }
185 }
186 ],
186 ],
187 "prompt_number": 7
187 "prompt_number": 7
188 },
188 },
189 {
189 {
190 "cell_type": "markdown",
190 "cell_type": "markdown",
191 "source": [
191 "source": [
192 "When IPython needs to display additional information (such as providing details on an object via `x?`",
192 "When IPython needs to display additional information (such as providing details on an object via `x?`",
193 "it will automatically invoke a pager at the bottom of the screen:"
193 "it will automatically invoke a pager at the bottom of the screen:"
194 ]
194 ]
195 },
195 },
196 {
196 {
197 "cell_type": "code",
197 "cell_type": "code",
198 "collapsed": true,
198 "collapsed": true,
199 "input": [
199 "input": [
200 "magic"
200 "magic"
201 ],
201 ],
202 "language": "python",
202 "language": "python",
203 "outputs": [],
203 "outputs": [],
204 "prompt_number": 8
204 "prompt_number": 8
205 },
205 },
206 {
206 {
207 "cell_type": "markdown",
207 "cell_type": "markdown",
208 "source": [
208 "source": [
209 "## Non-blocking output of kernel",
209 "## Non-blocking output of kernel",
210 "",
210 "",
211 "If you execute the next cell, you will see the output arriving as it is generated, not all at the end."
211 "If you execute the next cell, you will see the output arriving as it is generated, not all at the end."
212 ]
212 ]
213 },
213 },
214 {
214 {
215 "cell_type": "code",
215 "cell_type": "code",
216 "collapsed": false,
216 "collapsed": false,
217 "input": [
217 "input": [
218 "import time, sys",
218 "import time, sys",
219 "for i in range(8):",
219 "for i in range(8):",
220 " print i,",
220 " print i,",
221 " time.sleep(0.5)"
221 " time.sleep(0.5)"
222 ],
222 ],
223 "language": "python",
223 "language": "python",
224 "outputs": [
224 "outputs": [
225 {
225 {
226 "output_type": "stream",
226 "output_type": "stream",
227 "stream": "stdout",
227 "stream": "stdout",
228 "text": [
228 "text": [
229 "0 "
229 "0 "
230 ]
230 ]
231 },
231 },
232 {
232 {
233 "output_type": "stream",
233 "output_type": "stream",
234 "stream": "stdout",
234 "stream": "stdout",
235 "text": [
235 "text": [
236 "1 "
236 "1 "
237 ]
237 ]
238 },
238 },
239 {
239 {
240 "output_type": "stream",
240 "output_type": "stream",
241 "stream": "stdout",
241 "stream": "stdout",
242 "text": [
242 "text": [
243 "2 "
243 "2 "
244 ]
244 ]
245 },
245 },
246 {
246 {
247 "output_type": "stream",
247 "output_type": "stream",
248 "stream": "stdout",
248 "stream": "stdout",
249 "text": [
249 "text": [
250 "3 "
250 "3 "
251 ]
251 ]
252 },
252 },
253 {
253 {
254 "output_type": "stream",
254 "output_type": "stream",
255 "stream": "stdout",
255 "stream": "stdout",
256 "text": [
256 "text": [
257 "4 "
257 "4 "
258 ]
258 ]
259 },
259 },
260 {
260 {
261 "output_type": "stream",
261 "output_type": "stream",
262 "stream": "stdout",
262 "stream": "stdout",
263 "text": [
263 "text": [
264 "5 "
264 "5 "
265 ]
265 ]
266 },
266 },
267 {
267 {
268 "output_type": "stream",
268 "output_type": "stream",
269 "stream": "stdout",
269 "stream": "stdout",
270 "text": [
270 "text": [
271 "6 "
271 "6 "
272 ]
272 ]
273 },
273 },
274 {
274 {
275 "output_type": "stream",
275 "output_type": "stream",
276 "stream": "stdout",
276 "stream": "stdout",
277 "text": [
277 "text": [
278 "7"
278 "7"
279 ]
279 ]
280 }
280 }
281 ],
281 ],
282 "prompt_number": 9
282 "prompt_number": 9
283 },
283 },
284 {
284 {
285 "cell_type": "markdown",
285 "cell_type": "markdown",
286 "source": [
286 "source": [
287 "## Clean crash and restart",
287 "## Clean crash and restart",
288 "",
288 "",
289 "We call the low-level system libc.time routine with the wrong argument via",
289 "We call the low-level system libc.time routine with the wrong argument via",
290 "ctypes to segfault the Python interpreter:"
290 "ctypes to segfault the Python interpreter:"
291 ]
291 ]
292 },
292 },
293 {
293 {
294 "cell_type": "code",
294 "cell_type": "code",
295 "collapsed": true,
295 "collapsed": true,
296 "input": [
296 "input": [
297 "from ctypes import CDLL",
297 "from ctypes import CDLL",
298 "# This will crash a linux system; equivalent calls can be made on Windows or Mac",
298 "# This will crash a linux system; equivalent calls can be made on Windows or Mac",
299 "libc = CDLL(\"libc.so.6\") ",
299 "libc = CDLL(\"libc.so.6\") ",
300 "libc.time(-1) # BOOM!!"
300 "libc.time(-1) # BOOM!!"
301 ],
301 ],
302 "language": "python",
302 "language": "python",
303 "outputs": [],
303 "outputs": [],
304 "prompt_number": "*"
304 "prompt_number": "*"
305 },
305 },
306 {
306 {
307 "cell_type": "markdown",
307 "cell_type": "markdown",
308 "source": [
308 "source": [
309 "## Markdown cells can contain formatted text and code",
309 "## Markdown cells can contain formatted text and code",
310 "",
310 "",
311 "You can *italicize*, **boldface**",
311 "You can *italicize*, **boldface**",
312 "",
312 "",
313 "* build",
313 "* build",
314 "* lists",
314 "* lists",
315 "",
315 "",
316 "and embed code meant for illustration instead of execution in Python:",
316 "and embed code meant for illustration instead of execution in Python:",
317 "",
317 "",
318 " def f(x):",
318 " def f(x):",
319 " \"\"\"a docstring\"\"\"",
319 " \"\"\"a docstring\"\"\"",
320 " return x**2",
320 " return x**2",
321 "",
321 "",
322 "or other languages:",
322 "or other languages:",
323 "",
323 "",
324 " if (i=0; i<n; i++) {",
324 " if (i=0; i<n; i++) {",
325 " printf(\"hello %d\\n\", i);",
325 " printf(\"hello %d\\n\", i);",
326 " x += 4;",
326 " x += 4;",
327 " }"
327 " }"
328 ]
328 ]
329 },
329 },
330 {
330 {
331 "cell_type": "markdown",
331 "cell_type": "markdown",
332 "source": [
332 "source": [
333 "Courtesy of MathJax, you can include mathematical expressions both inline: ",
333 "Courtesy of MathJax, you can include mathematical expressions both inline: ",
334 "$e^{i\\pi} + 1 = 0$ and displayed:",
334 "$e^{i\\pi} + 1 = 0$ and displayed:",
335 "",
335 "",
336 "$$e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$$"
336 "$$e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$$"
337 ]
337 ]
338 },
338 },
339 {
339 {
340 "cell_type": "markdown",
340 "cell_type": "markdown",
341 "source": [
341 "source": [
342 "## Rich displays: include anyting a browser can show",
342 "## Rich displays: include anyting a browser can show",
343 "",
343 "",
344 "Note that we have an actual protocol for this, see the `display_protocol` notebook for further details.",
344 "Note that we have an actual protocol for this, see the `display_protocol` notebook for further details.",
345 "",
345 "",
346 "### Images"
346 "### Images"
347 ]
347 ]
348 },
348 },
349 {
349 {
350 "cell_type": "code",
350 "cell_type": "code",
351 "collapsed": false,
351 "collapsed": false,
352 "input": [
352 "input": [
353 "from IPython.core.display import Image",
353 "from IPython.core.display import Image",
354 "Image(filename='../../source/_static/logo.png')"
354 "Image(filename='../../source/_static/logo.png')"
355 ],
355 ],
356 "language": "python",
356 "language": "python",
357 "outputs": [
357 "outputs": [
358 {
358 {
359 "output_type": "pyout",
359 "output_type": "pyout",
360 "png": "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\n",
360 "png": "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\n",
361 "prompt_number": 1,
361 "prompt_number": 1,
362 "text": [
362 "text": [
363 "&lt;IPython.core.display.Image at 0x41d4690&gt;"
363 "&lt;IPython.core.display.Image at 0x41d4690&gt;"
364 ]
364 ]
365 }
365 }
366 ],
366 ],
367 "prompt_number": 1
367 "prompt_number": 1
368 },
368 },
369 {
369 {
370 "cell_type": "markdown",
370 "cell_type": "markdown",
371 "source": [
371 "source": [
372 "An image can also be displayed from raw data or a url"
372 "An image can also be displayed from raw data or a url"
373 ]
373 ]
374 },
374 },
375 {
375 {
376 "cell_type": "code",
376 "cell_type": "code",
377 "collapsed": false,
377 "collapsed": false,
378 "input": [
378 "input": [
379 "Image('http://python.org/images/python-logo.gif')"
379 "Image('http://python.org/images/python-logo.gif')"
380 ],
380 ],
381 "language": "python",
381 "language": "python",
382 "outputs": [
382 "outputs": [
383 {
383 {
384 "html": [
384 "html": [
385 "<img src=\"http://python.org/images/python-logo.gif\" />"
385 "<img src=\"http://python.org/images/python-logo.gif\" />"
386 ],
386 ],
387 "output_type": "pyout",
387 "output_type": "pyout",
388 "prompt_number": 2,
388 "prompt_number": 2,
389 "text": [
389 "text": [
390 "&lt;IPython.core.display.Image at 0x41d4550&gt;"
390 "&lt;IPython.core.display.Image at 0x41d4550&gt;"
391 ]
391 ]
392 }
392 }
393 ],
393 ],
394 "prompt_number": 2
394 "prompt_number": 2
395 },
395 },
396 {
396 {
397 "cell_type": "markdown",
397 "cell_type": "markdown",
398 "source": [
398 "source": [
399 "SVG images are also supported out of the box (since modern browsers do a good job of rendering them):"
399 "SVG images are also supported out of the box (since modern browsers do a good job of rendering them):"
400 ]
400 ]
401 },
401 },
402 {
402 {
403 "cell_type": "code",
403 "cell_type": "code",
404 "collapsed": false,
404 "collapsed": false,
405 "input": [
405 "input": [
406 "from IPython.core.display import SVG",
406 "from IPython.core.display import SVG",
407 "SVG(filename='python-logo.svg')"
407 "SVG(filename='python-logo.svg')"
408 ],
408 ],
409 "language": "python",
409 "language": "python",
410 "outputs": [
410 "outputs": [
411 {
411 {
412 "output_type": "pyout",
412 "output_type": "pyout",
413 "prompt_number": 3,
413 "prompt_number": 3,
414 "svg": [
414 "svg": [
415 "<svg height=\"115.02pt\" id=\"svg2\" inkscape:version=\"0.43\" sodipodi:docbase=\"/home/sdeibel\" sodipodi:docname=\"logo-python-generic.svg\" sodipodi:version=\"0.32\" version=\"1.0\" width=\"388.84pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://web.resource.org/cc/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:sodipodi=\"http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">",
415 "<svg height=\"115.02pt\" id=\"svg2\" inkscape:version=\"0.43\" sodipodi:docbase=\"/home/sdeibel\" sodipodi:docname=\"logo-python-generic.svg\" sodipodi:version=\"0.32\" version=\"1.0\" width=\"388.84pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://web.resource.org/cc/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:sodipodi=\"http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">",
416 " <metadata id=\"metadata2193\">",
416 " <metadata id=\"metadata2193\">",
417 " <rdf:RDF>",
417 " <rdf:RDF>",
418 " <cc:Work rdf:about=\"\">",
418 " <cc:Work rdf:about=\"\">",
419 " <dc:format>image/svg+xml</dc:format>",
419 " <dc:format>image/svg+xml</dc:format>",
420 " <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>",
420 " <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>",
421 " </cc:Work>",
421 " </cc:Work>",
422 " </rdf:RDF>",
422 " </rdf:RDF>",
423 " </metadata>",
423 " </metadata>",
424 " <sodipodi:namedview bordercolor=\"#666666\" borderopacity=\"1.0\" id=\"base\" inkscape:current-layer=\"svg2\" inkscape:cx=\"243.02499\" inkscape:cy=\"71.887497\" inkscape:pageopacity=\"0.0\" inkscape:pageshadow=\"2\" inkscape:window-height=\"543\" inkscape:window-width=\"791\" inkscape:window-x=\"0\" inkscape:window-y=\"0\" inkscape:zoom=\"1.4340089\" pagecolor=\"#ffffff\"/>",
424 " <sodipodi:namedview bordercolor=\"#666666\" borderopacity=\"1.0\" id=\"base\" inkscape:current-layer=\"svg2\" inkscape:cx=\"243.02499\" inkscape:cy=\"71.887497\" inkscape:pageopacity=\"0.0\" inkscape:pageshadow=\"2\" inkscape:window-height=\"543\" inkscape:window-width=\"791\" inkscape:window-x=\"0\" inkscape:window-y=\"0\" inkscape:zoom=\"1.4340089\" pagecolor=\"#ffffff\"/>",
425 " <defs id=\"defs4\">",
425 " <defs id=\"defs4\">",
426 " <linearGradient id=\"linearGradient2795\">",
426 " <linearGradient id=\"linearGradient2795\">",
427 " <stop id=\"stop2797\" offset=\"0\" style=\"stop-color:#b8b8b8;stop-opacity:0.49803922\"/>",
427 " <stop id=\"stop2797\" offset=\"0\" style=\"stop-color:#b8b8b8;stop-opacity:0.49803922\"/>",
428 " <stop id=\"stop2799\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>",
428 " <stop id=\"stop2799\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>",
429 " </linearGradient>",
429 " </linearGradient>",
430 " <linearGradient id=\"linearGradient2787\">",
430 " <linearGradient id=\"linearGradient2787\">",
431 " <stop id=\"stop2789\" offset=\"0\" style=\"stop-color:#7f7f7f;stop-opacity:0.5\"/>",
431 " <stop id=\"stop2789\" offset=\"0\" style=\"stop-color:#7f7f7f;stop-opacity:0.5\"/>",
432 " <stop id=\"stop2791\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>",
432 " <stop id=\"stop2791\" offset=\"1\" style=\"stop-color:#7f7f7f;stop-opacity:0\"/>",
433 " </linearGradient>",
433 " </linearGradient>",
434 " <linearGradient id=\"linearGradient3676\">",
434 " <linearGradient id=\"linearGradient3676\">",
435 " <stop id=\"stop3678\" offset=\"0\" style=\"stop-color:#b2b2b2;stop-opacity:0.5\"/>",
435 " <stop id=\"stop3678\" offset=\"0\" style=\"stop-color:#b2b2b2;stop-opacity:0.5\"/>",
436 " <stop id=\"stop3680\" offset=\"1\" style=\"stop-color:#b3b3b3;stop-opacity:0\"/>",
436 " <stop id=\"stop3680\" offset=\"1\" style=\"stop-color:#b3b3b3;stop-opacity:0\"/>",
437 " </linearGradient>",
437 " </linearGradient>",
438 " <linearGradient id=\"linearGradient3236\">",
438 " <linearGradient id=\"linearGradient3236\">",
439 " <stop id=\"stop3244\" offset=\"0\" style=\"stop-color:#f4f4f4;stop-opacity:1\"/>",
439 " <stop id=\"stop3244\" offset=\"0\" style=\"stop-color:#f4f4f4;stop-opacity:1\"/>",
440 " <stop id=\"stop3240\" offset=\"1\" style=\"stop-color:#ffffff;stop-opacity:1\"/>",
440 " <stop id=\"stop3240\" offset=\"1\" style=\"stop-color:#ffffff;stop-opacity:1\"/>",
441 " </linearGradient>",
441 " </linearGradient>",
442 " <linearGradient id=\"linearGradient4671\">",
442 " <linearGradient id=\"linearGradient4671\">",
443 " <stop id=\"stop4673\" offset=\"0\" style=\"stop-color:#ffd43b;stop-opacity:1\"/>",
443 " <stop id=\"stop4673\" offset=\"0\" style=\"stop-color:#ffd43b;stop-opacity:1\"/>",
444 " <stop id=\"stop4675\" offset=\"1\" style=\"stop-color:#ffe873;stop-opacity:1\"/>",
444 " <stop id=\"stop4675\" offset=\"1\" style=\"stop-color:#ffe873;stop-opacity:1\"/>",
445 " </linearGradient>",
445 " </linearGradient>",
446 " <linearGradient id=\"linearGradient4689\">",
446 " <linearGradient id=\"linearGradient4689\">",
447 " <stop id=\"stop4691\" offset=\"0\" style=\"stop-color:#5a9fd4;stop-opacity:1\"/>",
447 " <stop id=\"stop4691\" offset=\"0\" style=\"stop-color:#5a9fd4;stop-opacity:1\"/>",
448 " <stop id=\"stop4693\" offset=\"1\" style=\"stop-color:#306998;stop-opacity:1\"/>",
448 " <stop id=\"stop4693\" offset=\"1\" style=\"stop-color:#306998;stop-opacity:1\"/>",
449 " </linearGradient>",
449 " </linearGradient>",
450 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2987\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
450 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2987\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
451 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2990\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
451 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2990\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
452 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2587\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
452 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2587\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
453 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2589\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
453 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2589\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
454 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2248\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
454 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2248\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"77.475983\" y2=\"76.313133\"/>",
455 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2250\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
455 " <linearGradient gradientTransform=\"translate(100.2702,99.61116)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2250\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
456 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2255\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
456 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2255\" x1=\"224.23996\" x2=\"-65.308502\" xlink:href=\"#linearGradient4671\" y1=\"144.75717\" y2=\"144.75717\"/>",
457 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2258\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"76.176224\" y2=\"76.313133\"/>",
457 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient2258\" x1=\"172.94208\" x2=\"26.670298\" xlink:href=\"#linearGradient4689\" y1=\"76.176224\" y2=\"76.313133\"/>",
458 " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(1,0,0,0.177966,0,108.7434)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient2801\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>",
458 " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(1,0,0,0.177966,0,108.7434)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient2801\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>",
459 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1475\" x1=\"150.96111\" x2=\"112.03144\" xlink:href=\"#linearGradient4671\" y1=\"192.35176\" y2=\"137.27299\"/>",
459 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1475\" x1=\"150.96111\" x2=\"112.03144\" xlink:href=\"#linearGradient4671\" y1=\"192.35176\" y2=\"137.27299\"/>",
460 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1478\" x1=\"26.648937\" x2=\"135.66525\" xlink:href=\"#linearGradient4689\" y1=\"20.603781\" y2=\"114.39767\"/>",
460 " <linearGradient gradientTransform=\"matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)\" gradientUnits=\"userSpaceOnUse\" id=\"linearGradient1478\" x1=\"26.648937\" x2=\"135.66525\" xlink:href=\"#linearGradient4689\" y1=\"20.603781\" y2=\"114.39767\"/>",
461 " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient1480\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>",
461 " <radialGradient cx=\"61.518883\" cy=\"132.28575\" fx=\"61.518883\" fy=\"132.28575\" gradientTransform=\"matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)\" gradientUnits=\"userSpaceOnUse\" id=\"radialGradient1480\" r=\"29.036913\" xlink:href=\"#linearGradient2795\"/>",
462 " </defs>",
462 " </defs>",
463 " <g id=\"g2303\">",
463 " <g id=\"g2303\">",
464 " <path d=\"M 184.61344,61.929363 C 184.61344,47.367213 180.46118,39.891193 172.15666,39.481813 C 168.85239,39.325863 165.62611,39.852203 162.48754,41.070593 C 159.98254,41.967323 158.2963,42.854313 157.40931,43.751043 L 157.40931,78.509163 C 162.72147,81.842673 167.43907,83.392453 171.55234,83.148783 C 180.25649,82.573703 184.61344,75.507063 184.61344,61.929363 z M 194.85763,62.533683 C 194.85763,69.931723 193.12265,76.072393 189.63319,80.955683 C 185.7441,86.482283 180.35396,89.328433 173.46277,89.484393 C 168.26757,89.650093 162.91642,88.022323 157.40931,84.610843 L 157.40931,116.20116 L 148.50047,113.02361 L 148.50047,42.903043 C 149.96253,41.109583 151.84372,39.569543 154.12454,38.263433 C 159.42696,35.173603 165.86978,33.584823 173.45302,33.506853 L 173.57973,33.633563 C 180.50991,33.545833 185.85132,36.391993 189.60395,42.162263 C 193.10315,47.454933 194.85763,54.238913 194.85763,62.533683 z \" id=\"path46\" style=\"fill:#646464;fill-opacity:1\"/>",
464 " <path d=\"M 184.61344,61.929363 C 184.61344,47.367213 180.46118,39.891193 172.15666,39.481813 C 168.85239,39.325863 165.62611,39.852203 162.48754,41.070593 C 159.98254,41.967323 158.2963,42.854313 157.40931,43.751043 L 157.40931,78.509163 C 162.72147,81.842673 167.43907,83.392453 171.55234,83.148783 C 180.25649,82.573703 184.61344,75.507063 184.61344,61.929363 z M 194.85763,62.533683 C 194.85763,69.931723 193.12265,76.072393 189.63319,80.955683 C 185.7441,86.482283 180.35396,89.328433 173.46277,89.484393 C 168.26757,89.650093 162.91642,88.022323 157.40931,84.610843 L 157.40931,116.20116 L 148.50047,113.02361 L 148.50047,42.903043 C 149.96253,41.109583 151.84372,39.569543 154.12454,38.263433 C 159.42696,35.173603 165.86978,33.584823 173.45302,33.506853 L 173.57973,33.633563 C 180.50991,33.545833 185.85132,36.391993 189.60395,42.162263 C 193.10315,47.454933 194.85763,54.238913 194.85763,62.533683 z \" id=\"path46\" style=\"fill:#646464;fill-opacity:1\"/>",
465 " <path d=\"M 249.30487,83.265743 C 249.30487,93.188283 248.31067,100.05998 246.32227,103.88084 C 244.32411,107.7017 240.52275,110.75254 234.90842,113.02361 C 230.35653,114.81707 225.43425,115.79178 220.15133,115.95748 L 218.67952,110.34316 C 224.05016,109.61213 227.83204,108.88109 230.02513,108.15006 C 234.34309,106.688 237.30621,104.44617 238.93397,101.44406 C 240.24008,98.997543 240.88339,94.328693 240.88339,87.418003 L 240.88339,85.098203 C 234.79146,87.866373 228.40711,89.240713 221.73036,89.240713 C 217.34417,89.240713 213.47457,87.866373 210.14107,85.098203 C 206.39818,82.086343 204.52674,78.265483 204.52674,73.635623 L 204.52674,36.557693 L 213.43558,33.506853 L 213.43558,70.828453 C 213.43558,74.815013 214.7222,77.885353 217.29543,80.039463 C 219.86866,82.193563 223.20217,83.226753 227.2862,83.148783 C 231.37023,83.061053 235.74667,81.482023 240.39603,78.392203 L 240.39603,34.851953 L 249.30487,34.851953 L 249.30487,83.265743 z \" id=\"path48\" style=\"fill:#646464;fill-opacity:1\"/>",
465 " <path d=\"M 249.30487,83.265743 C 249.30487,93.188283 248.31067,100.05998 246.32227,103.88084 C 244.32411,107.7017 240.52275,110.75254 234.90842,113.02361 C 230.35653,114.81707 225.43425,115.79178 220.15133,115.95748 L 218.67952,110.34316 C 224.05016,109.61213 227.83204,108.88109 230.02513,108.15006 C 234.34309,106.688 237.30621,104.44617 238.93397,101.44406 C 240.24008,98.997543 240.88339,94.328693 240.88339,87.418003 L 240.88339,85.098203 C 234.79146,87.866373 228.40711,89.240713 221.73036,89.240713 C 217.34417,89.240713 213.47457,87.866373 210.14107,85.098203 C 206.39818,82.086343 204.52674,78.265483 204.52674,73.635623 L 204.52674,36.557693 L 213.43558,33.506853 L 213.43558,70.828453 C 213.43558,74.815013 214.7222,77.885353 217.29543,80.039463 C 219.86866,82.193563 223.20217,83.226753 227.2862,83.148783 C 231.37023,83.061053 235.74667,81.482023 240.39603,78.392203 L 240.39603,34.851953 L 249.30487,34.851953 L 249.30487,83.265743 z \" id=\"path48\" style=\"fill:#646464;fill-opacity:1\"/>",
466 " <path d=\"M 284.08249,88.997033 C 283.02006,89.084753 282.04535,89.123743 281.14862,89.123743 C 276.10937,89.123743 272.18129,87.924853 269.37413,85.517323 C 266.57671,83.109793 265.17314,79.786033 265.17314,75.546053 L 265.17314,40.456523 L 259.07146,40.456523 L 259.07146,34.851953 L 265.17314,34.851953 L 265.17314,19.968143 L 274.07223,16.800333 L 274.07223,34.851953 L 284.08249,34.851953 L 284.08249,40.456523 L 274.07223,40.456523 L 274.07223,75.302373 C 274.07223,78.645623 274.96896,81.014163 276.76243,82.398253 C 278.30247,83.538663 280.74899,84.191723 284.08249,84.357423 L 284.08249,88.997033 z \" id=\"path50\" style=\"fill:#646464;fill-opacity:1\"/>",
466 " <path d=\"M 284.08249,88.997033 C 283.02006,89.084753 282.04535,89.123743 281.14862,89.123743 C 276.10937,89.123743 272.18129,87.924853 269.37413,85.517323 C 266.57671,83.109793 265.17314,79.786033 265.17314,75.546053 L 265.17314,40.456523 L 259.07146,40.456523 L 259.07146,34.851953 L 265.17314,34.851953 L 265.17314,19.968143 L 274.07223,16.800333 L 274.07223,34.851953 L 284.08249,34.851953 L 284.08249,40.456523 L 274.07223,40.456523 L 274.07223,75.302373 C 274.07223,78.645623 274.96896,81.014163 276.76243,82.398253 C 278.30247,83.538663 280.74899,84.191723 284.08249,84.357423 L 284.08249,88.997033 z \" id=\"path50\" style=\"fill:#646464;fill-opacity:1\"/>",
467 " <path d=\"M 338.02288,88.266003 L 329.11404,88.266003 L 329.11404,53.878273 C 329.11404,50.379063 328.29528,47.367213 326.66753,44.852463 C 324.78634,42.006313 322.17411,40.583233 318.82112,40.583233 C 314.73708,40.583233 309.6296,42.737343 303.4987,47.045563 L 303.4987,88.266003 L 294.58985,88.266003 L 294.58985,6.0687929 L 303.4987,3.2616329 L 303.4987,40.700203 C 309.191,36.557693 315.40963,34.481563 322.16436,34.481563 C 326.88196,34.481563 330.70282,36.070333 333.62694,39.238143 C 336.56082,42.405943 338.02288,46.353513 338.02288,51.071103 L 338.02288,88.266003 L 338.02288,88.266003 z \" id=\"path52\" style=\"fill:#646464;fill-opacity:1\"/>",
467 " <path d=\"M 338.02288,88.266003 L 329.11404,88.266003 L 329.11404,53.878273 C 329.11404,50.379063 328.29528,47.367213 326.66753,44.852463 C 324.78634,42.006313 322.17411,40.583233 318.82112,40.583233 C 314.73708,40.583233 309.6296,42.737343 303.4987,47.045563 L 303.4987,88.266003 L 294.58985,88.266003 L 294.58985,6.0687929 L 303.4987,3.2616329 L 303.4987,40.700203 C 309.191,36.557693 315.40963,34.481563 322.16436,34.481563 C 326.88196,34.481563 330.70282,36.070333 333.62694,39.238143 C 336.56082,42.405943 338.02288,46.353513 338.02288,51.071103 L 338.02288,88.266003 L 338.02288,88.266003 z \" id=\"path52\" style=\"fill:#646464;fill-opacity:1\"/>",
468 " <path d=\"M 385.37424,60.525783 C 385.37424,54.930953 384.31182,50.310833 382.19669,46.655673 C 379.68195,42.201253 375.77337,39.852203 370.49044,39.608523 C 360.72386,40.173863 355.85032,47.172273 355.85032,60.584263 C 355.85032,66.734683 356.86401,71.871393 358.91089,75.994413 C 361.52312,81.248093 365.44145,83.840823 370.66589,83.753103 C 380.47146,83.675123 385.37424,75.935933 385.37424,60.525783 z M 395.13109,60.584263 C 395.13109,68.547643 393.09395,75.175663 389.02941,80.468333 C 384.5555,86.394563 378.37584,89.367423 370.49044,89.367423 C 362.67328,89.367423 356.58135,86.394563 352.18541,80.468333 C 348.19885,75.175663 346.21044,68.547643 346.21044,60.584263 C 346.21044,53.098503 348.36455,46.801883 352.67276,41.674913 C 357.22466,36.236033 363.20937,33.506853 370.6074,33.506853 C 378.00545,33.506853 384.02914,36.236033 388.66877,41.674913 C 392.97697,46.801883 395.13109,53.098503 395.13109,60.584263 z \" id=\"path54\" style=\"fill:#646464;fill-opacity:1\"/>",
468 " <path d=\"M 385.37424,60.525783 C 385.37424,54.930953 384.31182,50.310833 382.19669,46.655673 C 379.68195,42.201253 375.77337,39.852203 370.49044,39.608523 C 360.72386,40.173863 355.85032,47.172273 355.85032,60.584263 C 355.85032,66.734683 356.86401,71.871393 358.91089,75.994413 C 361.52312,81.248093 365.44145,83.840823 370.66589,83.753103 C 380.47146,83.675123 385.37424,75.935933 385.37424,60.525783 z M 395.13109,60.584263 C 395.13109,68.547643 393.09395,75.175663 389.02941,80.468333 C 384.5555,86.394563 378.37584,89.367423 370.49044,89.367423 C 362.67328,89.367423 356.58135,86.394563 352.18541,80.468333 C 348.19885,75.175663 346.21044,68.547643 346.21044,60.584263 C 346.21044,53.098503 348.36455,46.801883 352.67276,41.674913 C 357.22466,36.236033 363.20937,33.506853 370.6074,33.506853 C 378.00545,33.506853 384.02914,36.236033 388.66877,41.674913 C 392.97697,46.801883 395.13109,53.098503 395.13109,60.584263 z \" id=\"path54\" style=\"fill:#646464;fill-opacity:1\"/>",
469 " <path d=\"M 446.20583,88.266003 L 437.29699,88.266003 L 437.29699,51.928853 C 437.29699,47.942293 436.0981,44.832973 433.70032,42.591133 C 431.30253,40.359053 428.10549,39.277123 424.11893,39.364853 C 419.8887,39.442833 415.86314,40.826913 412.04229,43.507363 L 412.04229,88.266003 L 403.13345,88.266003 L 403.13345,42.405943 C 408.26042,38.672813 412.97801,36.236033 417.28621,35.095623 C 421.35076,34.033193 424.93769,33.506853 428.02752,33.506853 C 430.14264,33.506853 432.13104,33.711543 434.00248,34.120913 C 437.50169,34.929923 440.34783,36.430973 442.54093,38.633823 C 444.98744,41.070593 446.20583,43.994723 446.20583,47.415943 L 446.20583,88.266003 z \" id=\"path56\" style=\"fill:#646464;fill-opacity:1\"/>",
469 " <path d=\"M 446.20583,88.266003 L 437.29699,88.266003 L 437.29699,51.928853 C 437.29699,47.942293 436.0981,44.832973 433.70032,42.591133 C 431.30253,40.359053 428.10549,39.277123 424.11893,39.364853 C 419.8887,39.442833 415.86314,40.826913 412.04229,43.507363 L 412.04229,88.266003 L 403.13345,88.266003 L 403.13345,42.405943 C 408.26042,38.672813 412.97801,36.236033 417.28621,35.095623 C 421.35076,34.033193 424.93769,33.506853 428.02752,33.506853 C 430.14264,33.506853 432.13104,33.711543 434.00248,34.120913 C 437.50169,34.929923 440.34783,36.430973 442.54093,38.633823 C 444.98744,41.070593 446.20583,43.994723 446.20583,47.415943 L 446.20583,88.266003 z \" id=\"path56\" style=\"fill:#646464;fill-opacity:1\"/>",
470 " <path d=\"M 60.510156,6.3979729 C 55.926503,6.4192712 51.549217,6.8101906 47.697656,7.4917229 C 36.35144,9.4962267 34.291407,13.691825 34.291406,21.429223 L 34.291406,31.647973 L 61.103906,31.647973 L 61.103906,35.054223 L 34.291406,35.054223 L 24.228906,35.054223 C 16.436447,35.054223 9.6131468,39.73794 7.4789058,48.647973 C 5.0170858,58.860939 4.9078907,65.233996 7.4789058,75.897973 C 9.3848341,83.835825 13.936449,89.491721 21.728906,89.491723 L 30.947656,89.491723 L 30.947656,77.241723 C 30.947656,68.391821 38.6048,60.585475 47.697656,60.585473 L 74.478906,60.585473 C 81.933857,60.585473 87.885159,54.447309 87.885156,46.960473 L 87.885156,21.429223 C 87.885156,14.162884 81.755176,8.7044455 74.478906,7.4917229 C 69.872919,6.7249976 65.093809,6.3766746 60.510156,6.3979729 z M 46.010156,14.616723 C 48.779703,14.616723 51.041406,16.915369 51.041406,19.741723 C 51.041404,22.558059 48.779703,24.835473 46.010156,24.835473 C 43.23068,24.835472 40.978906,22.558058 40.978906,19.741723 C 40.978905,16.91537 43.23068,14.616723 46.010156,14.616723 z \" id=\"path1948\" style=\"fill:url(#linearGradient1478);fill-opacity:1\"/>",
470 " <path d=\"M 60.510156,6.3979729 C 55.926503,6.4192712 51.549217,6.8101906 47.697656,7.4917229 C 36.35144,9.4962267 34.291407,13.691825 34.291406,21.429223 L 34.291406,31.647973 L 61.103906,31.647973 L 61.103906,35.054223 L 34.291406,35.054223 L 24.228906,35.054223 C 16.436447,35.054223 9.6131468,39.73794 7.4789058,48.647973 C 5.0170858,58.860939 4.9078907,65.233996 7.4789058,75.897973 C 9.3848341,83.835825 13.936449,89.491721 21.728906,89.491723 L 30.947656,89.491723 L 30.947656,77.241723 C 30.947656,68.391821 38.6048,60.585475 47.697656,60.585473 L 74.478906,60.585473 C 81.933857,60.585473 87.885159,54.447309 87.885156,46.960473 L 87.885156,21.429223 C 87.885156,14.162884 81.755176,8.7044455 74.478906,7.4917229 C 69.872919,6.7249976 65.093809,6.3766746 60.510156,6.3979729 z M 46.010156,14.616723 C 48.779703,14.616723 51.041406,16.915369 51.041406,19.741723 C 51.041404,22.558059 48.779703,24.835473 46.010156,24.835473 C 43.23068,24.835472 40.978906,22.558058 40.978906,19.741723 C 40.978905,16.91537 43.23068,14.616723 46.010156,14.616723 z \" id=\"path1948\" style=\"fill:url(#linearGradient1478);fill-opacity:1\"/>",
471 " <path d=\"M 91.228906,35.054223 L 91.228906,46.960473 C 91.228906,56.191228 83.403011,63.960472 74.478906,63.960473 L 47.697656,63.960473 C 40.361823,63.960473 34.291407,70.238956 34.291406,77.585473 L 34.291406,103.11672 C 34.291406,110.38306 40.609994,114.65704 47.697656,116.74172 C 56.184987,119.23733 64.323893,119.68835 74.478906,116.74172 C 81.229061,114.78733 87.885159,110.85411 87.885156,103.11672 L 87.885156,92.897973 L 61.103906,92.897973 L 61.103906,89.491723 L 87.885156,89.491723 L 101.29141,89.491723 C 109.08387,89.491723 111.98766,84.056315 114.69765,75.897973 C 117.49698,67.499087 117.37787,59.422197 114.69765,48.647973 C 112.77187,40.890532 109.09378,35.054223 101.29141,35.054223 L 91.228906,35.054223 z M 76.166406,99.710473 C 78.945884,99.710476 81.197656,101.98789 81.197656,104.80422 C 81.197654,107.63057 78.945881,109.92922 76.166406,109.92922 C 73.396856,109.92922 71.135156,107.63057 71.135156,104.80422 C 71.135158,101.98789 73.396853,99.710473 76.166406,99.710473 z \" id=\"path1950\" style=\"fill:url(#linearGradient1475);fill-opacity:1\"/>",
471 " <path d=\"M 91.228906,35.054223 L 91.228906,46.960473 C 91.228906,56.191228 83.403011,63.960472 74.478906,63.960473 L 47.697656,63.960473 C 40.361823,63.960473 34.291407,70.238956 34.291406,77.585473 L 34.291406,103.11672 C 34.291406,110.38306 40.609994,114.65704 47.697656,116.74172 C 56.184987,119.23733 64.323893,119.68835 74.478906,116.74172 C 81.229061,114.78733 87.885159,110.85411 87.885156,103.11672 L 87.885156,92.897973 L 61.103906,92.897973 L 61.103906,89.491723 L 87.885156,89.491723 L 101.29141,89.491723 C 109.08387,89.491723 111.98766,84.056315 114.69765,75.897973 C 117.49698,67.499087 117.37787,59.422197 114.69765,48.647973 C 112.77187,40.890532 109.09378,35.054223 101.29141,35.054223 L 91.228906,35.054223 z M 76.166406,99.710473 C 78.945884,99.710476 81.197656,101.98789 81.197656,104.80422 C 81.197654,107.63057 78.945881,109.92922 76.166406,109.92922 C 73.396856,109.92922 71.135156,107.63057 71.135156,104.80422 C 71.135158,101.98789 73.396853,99.710473 76.166406,99.710473 z \" id=\"path1950\" style=\"fill:url(#linearGradient1475);fill-opacity:1\"/>",
472 " <path d=\"M 463.5544,26.909383 L 465.11635,26.909383 L 465.11635,17.113143 L 468.81648,17.113143 L 468.81648,15.945483 L 459.85427,15.945483 L 459.85427,17.113143 L 463.5544,17.113143 L 463.5544,26.909383 M 470.20142,26.909383 L 471.53589,26.909383 L 471.53589,17.962353 L 474.4323,26.908259 L 475.91799,26.908259 L 478.93615,17.992683 L 478.93615,26.909383 L 480.39194,26.909383 L 480.39194,15.945483 L 478.46605,15.945483 L 475.16774,25.33834 L 472.35477,15.945483 L 470.20142,15.945483 L 470.20142,26.909383\" id=\"text3004\" style=\"font-size:15.16445827px;font-style:normal;font-weight:normal;line-height:125%;fill:#646464;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans\"/>",
472 " <path d=\"M 463.5544,26.909383 L 465.11635,26.909383 L 465.11635,17.113143 L 468.81648,17.113143 L 468.81648,15.945483 L 459.85427,15.945483 L 459.85427,17.113143 L 463.5544,17.113143 L 463.5544,26.909383 M 470.20142,26.909383 L 471.53589,26.909383 L 471.53589,17.962353 L 474.4323,26.908259 L 475.91799,26.908259 L 478.93615,17.992683 L 478.93615,26.909383 L 480.39194,26.909383 L 480.39194,15.945483 L 478.46605,15.945483 L 475.16774,25.33834 L 472.35477,15.945483 L 470.20142,15.945483 L 470.20142,26.909383\" id=\"text3004\" style=\"font-size:15.16445827px;font-style:normal;font-weight:normal;line-height:125%;fill:#646464;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans\"/>",
473 " <path d=\"M 110.46717 132.28575 A 48.948284 8.6066771 0 1 1 12.570599,132.28575 A 48.948284 8.6066771 0 1 1 110.46717 132.28575 z\" id=\"path1894\" style=\"opacity:0.44382019;fill:url(#radialGradient1480);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" transform=\"matrix(0.73406,0,0,0.809524,16.24958,27.00935)\"/>",
473 " <path d=\"M 110.46717 132.28575 A 48.948284 8.6066771 0 1 1 12.570599,132.28575 A 48.948284 8.6066771 0 1 1 110.46717 132.28575 z\" id=\"path1894\" style=\"opacity:0.44382019;fill:url(#radialGradient1480);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" transform=\"matrix(0.73406,0,0,0.809524,16.24958,27.00935)\"/>",
474 " </g>",
474 " </g>",
475 "</svg>"
475 "</svg>"
476 ],
476 ],
477 "text": [
477 "text": [
478 "&lt;IPython.core.display.SVG at 0x41d4910&gt;"
478 "&lt;IPython.core.display.SVG at 0x41d4910&gt;"
479 ]
479 ]
480 }
480 }
481 ],
481 ],
482 "prompt_number": 3
482 "prompt_number": 3
483 },
483 },
484 {
484 {
485 "cell_type": "markdown",
485 "cell_type": "markdown",
486 "source": [
486 "source": [
487 "#### Embedded vs Non-embedded Images"
487 "#### Embedded vs Non-embedded Images"
488 ]
488 ]
489 },
489 },
490 {
490 {
491 "cell_type": "markdown",
491 "cell_type": "markdown",
492 "source": [
492 "source": [
493 "As of IPython 0.13, images are embedded by default for compatibility with QtConsole, and the ability to still be displayed offline.",
493 "As of IPython 0.13, images are embedded by default for compatibility with QtConsole, and the ability to still be displayed offline.",
494 "",
494 "",
495 "Let's look at the differences:"
495 "Let's look at the differences:"
496 ]
496 ]
497 },
497 },
498 {
498 {
499 "cell_type": "code",
499 "cell_type": "code",
500 "collapsed": false,
500 "collapsed": false,
501 "input": [
501 "input": [
502 "# by default Image data are embedded",
502 "# by default Image data are embedded",
503 "Embed = Image( 'http://www.google.fr/images/srpr/logo3w.png')",
503 "Embed = Image( 'http://www.google.fr/images/srpr/logo3w.png')",
504 "",
504 "",
505 "# if kwarg `url` is given, the embedding is assumed to be false",
505 "# if kwarg `url` is given, the embedding is assumed to be false",
506 "SoftLinked = Image(url='http://www.google.fr/images/srpr/logo3w.png')",
506 "SoftLinked = Image(url='http://www.google.fr/images/srpr/logo3w.png')",
507 "",
507 "",
508 "# In each case, embed can be specified explicitly with the `embed` kwarg",
508 "# In each case, embed can be specified explicitly with the `embed` kwarg",
509 "# ForceEmbed = Image(url='http://www.google.fr/images/srpr/logo3w.png', embed=True)"
509 "# ForceEmbed = Image(url='http://www.google.fr/images/srpr/logo3w.png', embed=True)"
510 ],
510 ],
511 "language": "python",
511 "language": "python",
512 "outputs": [],
512 "outputs": [],
513 "prompt_number": 6
513 "prompt_number": 6
514 },
514 },
515 {
515 {
516 "cell_type": "markdown",
516 "cell_type": "markdown",
517 "source": [
517 "source": [
518 "Today's Google doodle, (at the time I created this notebook). This should also work in the Qtconsole.",
518 "Today's Google doodle, (at the time I created this notebook). This should also work in the Qtconsole.",
519 "Drawback is that the saved notebook will be larger, but the image will still be present offline."
519 "Drawback is that the saved notebook will be larger, but the image will still be present offline."
520 ]
520 ]
521 },
521 },
522 {
522 {
523 "cell_type": "code",
523 "cell_type": "code",
524 "collapsed": false,
524 "collapsed": false,
525 "input": [
525 "input": [
526 "Embed"
526 "Embed"
527 ],
527 ],
528 "language": "python",
528 "language": "python",
529 "outputs": [
529 "outputs": [
530 {
530 {
531 "jpeg": "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\nBoDQGgNAaA0H/9k=\n",
531 "jpeg": "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\nBoDQGgNAaA0H/9k=\n",
532 "output_type": "pyout",
532 "output_type": "pyout",
533 "prompt_number": 7,
533 "prompt_number": 7,
534 "text": [
534 "text": [
535 "<IPython.core.display.Image at 0x107deaad0>"
535 "<IPython.core.display.Image at 0x107deaad0>"
536 ]
536 ]
537 }
537 }
538 ],
538 ],
539 "prompt_number": 7
539 "prompt_number": 7
540 },
540 },
541 {
541 {
542 "cell_type": "markdown",
542 "cell_type": "markdown",
543 "source": [
543 "source": [
544 "Today's Google doodle, visible only with an active internet connexion, that should be different from the previous one. This will not work on Qtconsole.",
544 "Today's Google doodle, visible only with an active internet connexion, that should be different from the previous one. This will not work on Qtconsole.",
545 "Notebook saved with this kind of image will be lighter and always reflect the current version of the source, but the image won't display offline."
545 "Notebook saved with this kind of image will be lighter and always reflect the current version of the source, but the image won't display offline."
546 ]
546 ]
547 },
547 },
548 {
548 {
549 "cell_type": "code",
549 "cell_type": "code",
550 "collapsed": false,
550 "collapsed": false,
551 "input": [
551 "input": [
552 "SoftLinked"
552 "SoftLinked"
553 ],
553 ],
554 "language": "python",
554 "language": "python",
555 "outputs": [
555 "outputs": [
556 {
556 {
557 "html": [
557 "html": [
558 "<img src=\"http://www.google.fr/images/srpr/logo3w.png\" />"
558 "<img src=\"http://www.google.fr/images/srpr/logo3w.png\" />"
559 ],
559 ],
560 "output_type": "pyout",
560 "output_type": "pyout",
561 "prompt_number": 5,
561 "prompt_number": 5,
562 "text": [
562 "text": [
563 "<IPython.core.display.Image at 0x107dea890>"
563 "<IPython.core.display.Image at 0x107dea890>"
564 ]
564 ]
565 }
565 }
566 ],
566 ],
567 "prompt_number": 5
567 "prompt_number": 5
568 },
568 },
569 {
569 {
570 "cell_type": "markdown",
570 "cell_type": "markdown",
571 "source": [
571 "source": [
572 "Of course, if you re-run this notebook, the two doodles will be the same again.",
572 "Of course, if you re-run this notebook, the two doodles will be the same again.",
573 "<!-- well actually I cheated a little, by setting Embed Url to http://www.google.com/logos/2012/doisneau12-hp.jpg then editing the ipynb myself and replacing it by the other url -->"
573 "<!-- well actually I cheated a little, by setting Embed Url to http://www.google.com/logos/2012/doisneau12-hp.jpg then editing the ipynb myself and replacing it by the other url -->"
574 ]
574 ]
575 },
575 },
576 {
576 {
577 "cell_type": "markdown",
577 "cell_type": "markdown",
578 "source": [
578 "source": [
579 "### Video"
579 "### Video"
580 ]
580 ]
581 },
581 },
582 {
582 {
583 "cell_type": "markdown",
583 "cell_type": "markdown",
584 "source": [
584 "source": [
585 "And more exotic objects can also be displayed, as long as their representation supports ",
585 "And more exotic objects can also be displayed, as long as their representation supports ",
586 "the IPython display protocol.",
586 "the IPython display protocol.",
587 "",
587 "",
588 "For example, videos hosted externally on YouTube are easy to load (and writing a similar wrapper for other",
588 "For example, videos hosted externally on YouTube are easy to load (and writing a similar wrapper for other",
589 "hosted content is trivial):"
589 "hosted content is trivial):"
590 ]
590 ]
591 },
591 },
592 {
592 {
593 "cell_type": "code",
593 "cell_type": "code",
594 "collapsed": false,
594 "collapsed": false,
595 "input": [
595 "input": [
596 "from IPython.lib.display import YouTubeVideo",
596 "from IPython.lib.display import YouTubeVideo",
597 "# a talk about IPython at Sage Days at U. Washington, Seattle.",
597 "# a talk about IPython at Sage Days at U. Washington, Seattle.",
598 "# Video credit: William Stein.",
598 "# Video credit: William Stein.",
599 "YouTubeVideo('1j_HxD4iLn8')"
599 "YouTubeVideo('1j_HxD4iLn8')"
600 ],
600 ],
601 "language": "python",
601 "language": "python",
602 "outputs": [
602 "outputs": [
603 {
603 {
604 "html": [
604 "html": [
605 "",
605 "",
606 " <iframe",
606 " <iframe",
607 " width=\"400\"",
607 " width=\"400\"",
608 " height=\"300\"",
608 " height=\"300\"",
609 " src=\"http://www.youtube.com/embed/1j_HxD4iLn8\"",
609 " src=\"http://www.youtube.com/embed/1j_HxD4iLn8\"",
610 " frameborder=\"0\"",
610 " frameborder=\"0\"",
611 " allowfullscreen",
611 " allowfullscreen",
612 " ></iframe>",
612 " ></iframe>",
613 " "
613 " "
614 ],
614 ],
615 "output_type": "pyout",
615 "output_type": "pyout",
616 "prompt_number": 4,
616 "prompt_number": 4,
617 "text": [
617 "text": [
618 "&lt;IPython.lib.display.YouTubeVideo at 0x41d4310&gt;"
618 "&lt;IPython.lib.display.YouTubeVideo at 0x41d4310&gt;"
619 ]
619 ]
620 }
620 }
621 ],
621 ],
622 "prompt_number": 4
622 "prompt_number": 4
623 },
623 },
624 {
624 {
625 "cell_type": "markdown",
625 "cell_type": "markdown",
626 "source": [
626 "source": [
627 "Using the nascent video capabilities of modern browsers, you may also be able to display local",
627 "Using the nascent video capabilities of modern browsers, you may also be able to display local",
628 "videos. At the moment this doesn't work very well in all browsers, so it may or may not work for you;",
628 "videos. At the moment this doesn't work very well in all browsers, so it may or may not work for you;",
629 "we will continue testing this and looking for ways to make it more robust. ",
629 "we will continue testing this and looking for ways to make it more robust. ",
630 "",
630 "",
631 "The following cell loads a local file called `animation.m4v`, encodes the raw video as base64 for http",
631 "The following cell loads a local file called `animation.m4v`, encodes the raw video as base64 for http",
632 "transport, and uses the HTML5 video tag to load it. On Chrome 15 it works correctly, displaying a control",
632 "transport, and uses the HTML5 video tag to load it. On Chrome 15 it works correctly, displaying a control",
633 "bar at the bottom with a play/pause button and a location slider."
633 "bar at the bottom with a play/pause button and a location slider."
634 ]
634 ]
635 },
635 },
636 {
636 {
637 "cell_type": "code",
637 "cell_type": "code",
638 "collapsed": false,
638 "collapsed": false,
639 "input": [
639 "input": [
640 "from IPython.core.display import HTML",
640 "from IPython.core.display import HTML",
641 "video = open(\"animation.m4v\", \"rb\").read()",
641 "video = open(\"animation.m4v\", \"rb\").read()",
642 "video_encoded = video.encode(\"base64\")",
642 "video_encoded = video.encode(\"base64\")",
643 "video_tag = '<video controls alt=\"test\" src=\"data:video/x-m4v;base64,{0}\">'.format(video_encoded)",
643 "video_tag = '<video controls alt=\"test\" src=\"data:video/x-m4v;base64,{0}\">'.format(video_encoded)",
644 "HTML(data=video_tag)"
644 "HTML(data=video_tag)"
645 ],
645 ],
646 "language": "python",
646 "language": "python",
647 "outputs": [
647 "outputs": [
648 {
648 {
649 "html": [
649 "html": [
650 "<video controls alt=\"test\" src=\"data:video/x-m4v;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAqiW1kYXQAAAKMBgX//4jcRem9",
650 "<video controls alt=\"test\" src=\"data:video/x-m4v;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAqiW1kYXQAAAKMBgX//4jcRem9",
651 "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTE4IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv",
651 "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTE4IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv",
652 "cHlsZWZ0IDIwMDMtMjAxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w",
652 "cHlsZWZ0IDIwMDMtMjAxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w",
653 "dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o",
653 "dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o",
654 "ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2",
654 "ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2",
655 "IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0",
655 "IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0",
656 "X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBu",
656 "X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBu",
657 "cj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9p",
657 "cj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9p",
658 "bnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEg",
658 "bnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEg",
659 "d2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBz",
659 "d2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNSBz",
660 "Y2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9",
660 "Y2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9",
661 "MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89",
661 "MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89",
662 "MS40MCBhcT0xOjEuMDAAgAAACqVliIQAV/0TAAI/3gU2tIW7KawwaCmQGTGHKmuYAAADACBcshU+",
662 "MS40MCBhcT0xOjEuMDAAgAAACqVliIQAV/0TAAI/3gU2tIW7KawwaCmQGTGHKmuYAAADACBcshU+",
663 "yICkgAA14AHowiEeT6ei7v7h3Hu0i2fpUBLGBIkbCMP3Vfz+9BVGCDXnw9Uv5o3iN030tb7eq6rs",
663 "yICkgAA14AHowiEeT6ei7v7h3Hu0i2fpUBLGBIkbCMP3Vfz+9BVGCDXnw9Uv5o3iN030tb7eq6rs",
664 "EEhHs2azbdTiE9Csz5Zm6SiUWRdmB43hbD5i6syATuODUJd7LM3d9cbFpc7zFlu5y3vUmNGd6urp",
664 "EEhHs2azbdTiE9Csz5Zm6SiUWRdmB43hbD5i6syATuODUJd7LM3d9cbFpc7zFlu5y3vUmNGd6urp",
665 "vKKT9iyleIyTuR1sVS431DhevGfkUllVeIznYUe2USoMW1tufETjyRdmGldN6eNlhAOsGAH4z+Hk",
665 "vKKT9iyleIyTuR1sVS431DhevGfkUllVeIznYUe2USoMW1tufETjyRdmGldN6eNlhAOsGAH4z+Hk",
666 "rwKecPPU7Q5T4gDAIxj9hW84jVExMTSTHxkPTq1I4OotgUxURCGTsw60k/ezPNmNg38j1bqaGmPc",
666 "rwKecPPU7Q5T4gDAIxj9hW84jVExMTSTHxkPTq1I4OotgUxURCGTsw60k/ezPNmNg38j1bqaGmPc",
667 "ruDKEIBDsK5qEytFB90Q68s0h2wmlf2KXd5bleBefiK+/p47ZsyUO4IdlW25rRy+HLjt6wQXfYee",
667 "ruDKEIBDsK5qEytFB90Q68s0h2wmlf2KXd5bleBefiK+/p47ZsyUO4IdlW25rRy+HLjt6wQXfYee",
668 "3IkiQOoOK+U7u/lxcl78zfxwIoEMjUUSKNZjkp8clnmecDDJ3Kz+viF7bPklk7N6QRyizAKPIIpn",
668 "3IkiQOoOK+U7u/lxcl78zfxwIoEMjUUSKNZjkp8clnmecDDJ3Kz+viF7bPklk7N6QRyizAKPIIpn",
669 "NJUuMWQmqeL2Or6cr4D0/0tOym+4tficxmhuEONKUtO2pPn3hRjMllkd12tXp70fLTfxy0dwB70M",
669 "NJUuMWQmqeL2Or6cr4D0/0tOym+4tficxmhuEONKUtO2pPn3hRjMllkd12tXp70fLTfxy0dwB70M",
670 "L9iLEcItHb7zVupHlP5RxdvecpREw+OsIPr9KWilIesNE19jgIbT+TkiRBjOoKvUuwcQnKg7fOTH",
670 "L9iLEcItHb7zVupHlP5RxdvecpREw+OsIPr9KWilIesNE19jgIbT+TkiRBjOoKvUuwcQnKg7fOTH",
671 "VoLvnKuAfea+oujEdm1Rwd2tEOnkF+ZC11WaNQsiNR/eJ9EnUXjXDYGfhB+Oe7qj8nYTT+eOXg1c",
671 "VoLvnKuAfea+oujEdm1Rwd2tEOnkF+ZC11WaNQsiNR/eJ9EnUXjXDYGfhB+Oe7qj8nYTT+eOXg1c",
672 "uJNgLXEs4vOheWEjQOqfIWMQc3DmTof5s0ksBmUQ3PQ+UHPxZSnmOEZB+j6xT3wbm7HGzDjWtSg1",
672 "uJNgLXEs4vOheWEjQOqfIWMQc3DmTof5s0ksBmUQ3PQ+UHPxZSnmOEZB+j6xT3wbm7HGzDjWtSg1",
673 "SjTxd1EiJ8xA4SIxxR8WIKLg+TwFxJNS7Laxq7Uglu3AkXe82P1JCdJX5PsbFbxuDbuJgakzRcTw",
673 "SjTxd1EiJ8xA4SIxxR8WIKLg+TwFxJNS7Laxq7Uglu3AkXe82P1JCdJX5PsbFbxuDbuJgakzRcTw",
674 "MLLSKCiizS/eCW0uJed/lev9yb80kKlVET4S219cn/zhkpeDV83cHYOr+sJQKDRk/Wh2c7fsuxfx",
674 "MLLSKCiizS/eCW0uJed/lev9yb80kKlVET4S219cn/zhkpeDV83cHYOr+sJQKDRk/Wh2c7fsuxfx",
675 "aEH/6reSmvFDsAnXAyPXliJ3G4VG3OkEM5K5WyGGrBizZbTrdGsBnzj5VSGGOJdCKuRrUluw/8es",
675 "aEH/6reSmvFDsAnXAyPXliJ3G4VG3OkEM5K5WyGGrBizZbTrdGsBnzj5VSGGOJdCKuRrUluw/8es",
676 "2vYRPs9BcTqAqvHk9M52SSIf+1T6L53EZP8VbtXB+G29CMW4xVCK/B/YDjaNmqMwJ61dapugjnWJ",
676 "2vYRPs9BcTqAqvHk9M52SSIf+1T6L53EZP8VbtXB+G29CMW4xVCK/B/YDjaNmqMwJ61dapugjnWJ",
677 "fqeXlGGa3Ch3aA7gi30T8PucNRBjLK3lF67ZDDvkWXRQXd+VMnKWHkBbCkQ/F/fMuNpHO3C00Y2p",
677 "fqeXlGGa3Ch3aA7gi30T8PucNRBjLK3lF67ZDDvkWXRQXd+VMnKWHkBbCkQ/F/fMuNpHO3C00Y2p",
678 "ljna1qImBhVMvPe0F7Qx7G/YyxLRzhyUU8e23HGzp0agtNJRbydbrPV+TqJMSifJMNcZIf8wkdnC",
678 "ljna1qImBhVMvPe0F7Qx7G/YyxLRzhyUU8e23HGzp0agtNJRbydbrPV+TqJMSifJMNcZIf8wkdnC",
679 "3/xdpcXnLf2Ye3Kbd0o7utciTG+q5h6WTEk+PaNbXLLA0YyZ2VnLTcyV1QTS76aNCbV9Q1/OQ7QU",
679 "3/xdpcXnLf2Ye3Kbd0o7utciTG+q5h6WTEk+PaNbXLLA0YyZ2VnLTcyV1QTS76aNCbV9Q1/OQ7QU",
680 "81Gg0hPa9aSiscGary6jLVwDQaik4zLsi7jPqgPVdup7pwx7uJDqRCVcVi5QoZFp/GHdex5sJTF6",
680 "81Gg0hPa9aSiscGary6jLVwDQaik4zLsi7jPqgPVdup7pwx7uJDqRCVcVi5QoZFp/GHdex5sJTF6",
681 "9A6sja69/NLkFIWNSIeRcuGahXpF+wZeYIrqJv975s1TKYKAvp1WtzgtgWNkcbzCtROqf8rPtlAI",
681 "9A6sja69/NLkFIWNSIeRcuGahXpF+wZeYIrqJv975s1TKYKAvp1WtzgtgWNkcbzCtROqf8rPtlAI",
682 "xkX8GLcEo9zfExyfimeXQ64qfFxEy0IMy2Hsxau9fSMqUnIjntuVVjCQtBL+94gx1RZLndE6wROV",
682 "xkX8GLcEo9zfExyfimeXQ64qfFxEy0IMy2Hsxau9fSMqUnIjntuVVjCQtBL+94gx1RZLndE6wROV",
683 "Tq/wHwHrQzo9QL9cpPqPFJjiZ/NGZIFuudS+wsBFe6Hu8Oitf5zToLqLdtU4Smwh4ne3JsiT9lOz",
683 "Tq/wHwHrQzo9QL9cpPqPFJjiZ/NGZIFuudS+wsBFe6Hu8Oitf5zToLqLdtU4Smwh4ne3JsiT9lOz",
684 "N+4PPw3VSx9l5FppVwdKUWELw1dYpCOppyVWlJ3YQ8H4FQQM8EcYMG9N3Bxu79y1J1ikuvuhMmLQ",
684 "N+4PPw3VSx9l5FppVwdKUWELw1dYpCOppyVWlJ3YQ8H4FQQM8EcYMG9N3Bxu79y1J1ikuvuhMmLQ",
685 "lehLTbguhbix74hd1VIQC8EjHmOZSSWbssulYwPbr6FF49tifk6PymJvulR9/u+2585HkRfbxveG",
685 "lehLTbguhbix74hd1VIQC8EjHmOZSSWbssulYwPbr6FF49tifk6PymJvulR9/u+2585HkRfbxveG",
686 "eWCz0ix1pIVfaNpESKmtLy/0mcbMg9hYDz2werz9oe0lT2BiMV6uAin6RaQcT8Vk9MPctfwae+gk",
686 "eWCz0ix1pIVfaNpESKmtLy/0mcbMg9hYDz2werz9oe0lT2BiMV6uAin6RaQcT8Vk9MPctfwae+gk",
687 "vtnZA/sOBk8MbpylaHqc0KIVHhhLFMNnkOFiucjtGo/JWTa/F6g8wWeow5ZuIJUORaYHWqegZbTg",
687 "vtnZA/sOBk8MbpylaHqc0KIVHhhLFMNnkOFiucjtGo/JWTa/F6g8wWeow5ZuIJUORaYHWqegZbTg",
688 "M9dCsYYsfZGjjVMuSlDIvpYvIvFFooGPC7Ye2Jfawmq4Ut7EL/nv/dyAd2HRc5msmUhzeu/XpX3r",
688 "M9dCsYYsfZGjjVMuSlDIvpYvIvFFooGPC7Ye2Jfawmq4Ut7EL/nv/dyAd2HRc5msmUhzeu/XpX3r",
689 "VlzRmf9/Qan8Dbve3QfW1Ym0o5J/KAc3z1VBho7JBr5PgCL68RiD9jZHN0VvsT4gzsEjNlW3D91U",
689 "VlzRmf9/Qan8Dbve3QfW1Ym0o5J/KAc3z1VBho7JBr5PgCL68RiD9jZHN0VvsT4gzsEjNlW3D91U",
690 "y4RduaodBFoNTzXwlfUYULBzdiTbH75l/UmVMC4TKeTWhNzw2UezaqeGd8at3WSY7W/VR3+hvZHD",
690 "y4RduaodBFoNTzXwlfUYULBzdiTbH75l/UmVMC4TKeTWhNzw2UezaqeGd8at3WSY7W/VR3+hvZHD",
691 "pkIjgKuNNH0DsCRa/Kk56XQoHIyvvUH/eNekNvziReqS4qgLnXUT4BRGt2BOtCifI6+X/DGHUOmW",
691 "pkIjgKuNNH0DsCRa/Kk56XQoHIyvvUH/eNekNvziReqS4qgLnXUT4BRGt2BOtCifI6+X/DGHUOmW",
692 "lX7TN5b4pw5U7jwfwshtbhGZM49T8JMk15Mzrc7tM6J11TYxb5R3mQhZ8TZumJ0bMJXPM69HFyih",
692 "lX7TN5b4pw5U7jwfwshtbhGZM49T8JMk15Mzrc7tM6J11TYxb5R3mQhZ8TZumJ0bMJXPM69HFyih",
693 "r5dJSEJMycxJVUh6NTQALUOoRTHIOwE+FpWI6feTv1SiZ0YpYe5DbkYJJbN7zAHbAKw25XvqR2mA",
693 "r5dJSEJMycxJVUh6NTQALUOoRTHIOwE+FpWI6feTv1SiZ0YpYe5DbkYJJbN7zAHbAKw25XvqR2mA",
694 "jQmOlsfX/tK8DPjP/8h5/xgAF4EUbj1tOnQCBQL8jk9vHtfsXncsprww4Z+P/Z/UrKifuFyEpBWN",
694 "jQmOlsfX/tK8DPjP/8h5/xgAF4EUbj1tOnQCBQL8jk9vHtfsXncsprww4Z+P/Z/UrKifuFyEpBWN",
695 "8kLpF7yywE2iYdDruV9+/qKR8rC9ozNKyqQNIwtxrzYkWpE5t8K7gG4JFnrHona/Rp8dOX6VW41+",
695 "8kLpF7yywE2iYdDruV9+/qKR8rC9ozNKyqQNIwtxrzYkWpE5t8K7gG4JFnrHona/Rp8dOX6VW41+",
696 "jb5LB1LEtE8MwjLp3RCUOq/+6yLzaOEgBTqzvEjDeFpg/u9DMHMr4/2TOchfjg7dl+uQ6Gsx+4Ia",
696 "jb5LB1LEtE8MwjLp3RCUOq/+6yLzaOEgBTqzvEjDeFpg/u9DMHMr4/2TOchfjg7dl+uQ6Gsx+4Ia",
697 "9W7vivG95027p25eKL0nHvx/OqmAQEZYJL/JO58lOj0zPdJxrQ5dZksjMISzVZNn7DsxqE3zgBBu",
697 "9W7vivG95027p25eKL0nHvx/OqmAQEZYJL/JO58lOj0zPdJxrQ5dZksjMISzVZNn7DsxqE3zgBBu",
698 "Nzk50R8lTK3U8P12QiOAQYSTeGlYlkvfeofrfO1AitEj02m9aUkxTFd1ZZJoLQT2d3zEU5PmE4lx",
698 "Nzk50R8lTK3U8P12QiOAQYSTeGlYlkvfeofrfO1AitEj02m9aUkxTFd1ZZJoLQT2d3zEU5PmE4lx",
699 "MVfL5ttNnIbqfcIU2RJKNWqdw77xfjfrNc/eNpRKPZ/6z50LzBprgjzBHRfKgSWWkDxHrX0aTbgw",
699 "MVfL5ttNnIbqfcIU2RJKNWqdw77xfjfrNc/eNpRKPZ/6z50LzBprgjzBHRfKgSWWkDxHrX0aTbgw",
700 "QFwd51+PoUWH4DkQg26uGslF5Hn3hB58+fkeLTosTANOIBNAeFZtTc4PIaLHw759zae7scY55xcT",
700 "QFwd51+PoUWH4DkQg26uGslF5Hn3hB58+fkeLTosTANOIBNAeFZtTc4PIaLHw759zae7scY55xcT",
701 "abzlilYIftst2RZ6ntsRC3zFxduCKvL6wLfYT+TiIWJn5P7sTwZwXuSzXY+9Q3xMZ5o4Xcpz6vD9",
701 "abzlilYIftst2RZ6ntsRC3zFxduCKvL6wLfYT+TiIWJn5P7sTwZwXuSzXY+9Q3xMZ5o4Xcpz6vD9",
702 "FtTjzS69iefEYt4pXiDrZUo4ePGiLeoIFIwYB/v6GXdmG5VLLk+eKbOc9AmsX2zmvqtcvDRGQbzu",
702 "FtTjzS69iefEYt4pXiDrZUo4ePGiLeoIFIwYB/v6GXdmG5VLLk+eKbOc9AmsX2zmvqtcvDRGQbzu",
703 "gXbH/kTH/lkNPBTmqN3ZJODUEXVohPEJ6th0xna0EVleB73Q3eNvaVUvhlJbjs3D/T17FRCebN7A",
703 "gXbH/kTH/lkNPBTmqN3ZJODUEXVohPEJ6th0xna0EVleB73Q3eNvaVUvhlJbjs3D/T17FRCebN7A",
704 "OXvzzbLE/I5kNfEmJcv4dxtIeo2uQ/z9ohSpiZzbDj1u40nJRyJxUK60wEv0nA9f/NuJ6/PEyU0b",
704 "OXvzzbLE/I5kNfEmJcv4dxtIeo2uQ/z9ohSpiZzbDj1u40nJRyJxUK60wEv0nA9f/NuJ6/PEyU0b",
705 "kK16z2KH12k3Lc4+1f5fawIzkK2qJRB4wnj8VHhUW9mbJhs9vgfFmU3xrXSShY67Ygb+gYNPxxtn",
705 "kK16z2KH12k3Lc4+1f5fawIzkK2qJRB4wnj8VHhUW9mbJhs9vgfFmU3xrXSShY67Ygb+gYNPxxtn",
706 "4K/9eTSwIA9fv/nR33lA2lZoXALRUTmOZIl3R0gAM5h6oX1y1thIyqViBK95VZc8Pvy7G3O90M9S",
706 "4K/9eTSwIA9fv/nR33lA2lZoXALRUTmOZIl3R0gAM5h6oX1y1thIyqViBK95VZc8Pvy7G3O90M9S",
707 "4zkpyFQ36jrMazvMveMA4d39fvoaC7p90quiJfjI4yrl+ECVkCJL5MxRSa+iVcIL7Xbl0jVaGhZI",
707 "4zkpyFQ36jrMazvMveMA4d39fvoaC7p90quiJfjI4yrl+ECVkCJL5MxRSa+iVcIL7Xbl0jVaGhZI",
708 "cMYmcGOBbLzhJgloM1x1zFnnj3ggJRFAM8yNnXxhavk+mA18JC+y3lqGsp6vPReRxGlGHMou17L4",
708 "cMYmcGOBbLzhJgloM1x1zFnnj3ggJRFAM8yNnXxhavk+mA18JC+y3lqGsp6vPReRxGlGHMou17L4",
709 "It070LzkoeCzarpv8Apw59smdS5KN9qVN1WgeL7OSN8BHg94ubCvS7DW6H3/PbtRB62jFLsBhUV5",
709 "It070LzkoeCzarpv8Apw59smdS5KN9qVN1WgeL7OSN8BHg94ubCvS7DW6H3/PbtRB62jFLsBhUV5",
710 "YqCIbIN5VZ81AAACpUGaIWxFfwAru8x8uT3FuOjrAeSWXmAWqq9jCNGE+N5AOv//9//xjk4uBAcA",
710 "YqCIbIN5VZ81AAACpUGaIWxFfwAru8x8uT3FuOjrAeSWXmAWqq9jCNGE+N5AOv//9//xjk4uBAcA",
711 "DN96c97AVGmzRtnWwPsgcCbLrVdQJgbKp4QSmPwQnVhv0hXyBjeFWWlcvx70urEN3FK6/lvk2tQe",
711 "DN96c97AVGmzRtnWwPsgcCbLrVdQJgbKp4QSmPwQnVhv0hXyBjeFWWlcvx70urEN3FK6/lvk2tQe",
712 "ZgbtlbzXluvTfnSj/Ctz7vZ+O1FjhDzzdpL7uLzewzCIW5VWLAEKUVuS2J6wNk6MR7UblcEd4EtO",
712 "ZgbtlbzXluvTfnSj/Ctz7vZ+O1FjhDzzdpL7uLzewzCIW5VWLAEKUVuS2J6wNk6MR7UblcEd4EtO",
713 "Y+R4/qJgfojCsfRvA0oC5dc41Vd0erZbSkrmPTjLCn815bxlchUJMS8gQD5hJNwoKHvNLNwn7XKu",
713 "Y+R4/qJgfojCsfRvA0oC5dc41Vd0erZbSkrmPTjLCn815bxlchUJMS8gQD5hJNwoKHvNLNwn7XKu",
714 "TtYIhH2wVNZvDWgzCjlPeQajnrcMsb6bZYJvNJU8HuGHvm50r7VG8qifEwmuyegAZXojh5Ul5Vvj",
714 "TtYIhH2wVNZvDWgzCjlPeQajnrcMsb6bZYJvNJU8HuGHvm50r7VG8qifEwmuyegAZXojh5Ul5Vvj",
715 "DW7kSAZyw8a7I6mHY3FZHd+OA3V4JZMbNliI3Tj1L6+MKTmilVialmyZagRtEMeKRdtxUPd3vVEt",
715 "DW7kSAZyw8a7I6mHY3FZHd+OA3V4JZMbNliI3Tj1L6+MKTmilVialmyZagRtEMeKRdtxUPd3vVEt",
716 "rOBVIVYWdgAGA7HmZiHQUQNxLkWxbLyWVlrh5EM0Do2NdbclHxxArz90d+MSVeUOIXQ/4V9quq8C",
716 "rOBVIVYWdgAGA7HmZiHQUQNxLkWxbLyWVlrh5EM0Do2NdbclHxxArz90d+MSVeUOIXQ/4V9quq8C",
717 "8qVflo1gPtPMkjO2/UrdOYqhY404ReObOu/fdp4hAEDq6jhy64vOeT7XUK/Onq0rXTldtA6kvgQa",
717 "8qVflo1gPtPMkjO2/UrdOYqhY404ReObOu/fdp4hAEDq6jhy64vOeT7XUK/Onq0rXTldtA6kvgQa",
718 "Jg+mgYSR9hfXtMbOUSLgLj/RmBSO8aAMHuJJZqf1tCM5pZ9eYUsrHmy+/z2NGalon0//uF6+33bQ",
718 "Jg+mgYSR9hfXtMbOUSLgLj/RmBSO8aAMHuJJZqf1tCM5pZ9eYUsrHmy+/z2NGalon0//uF6+33bQ",
719 "zT/RLRfBbYTjy9QrJqHLlw46lggWPGkHuPKSqk/CB7U4pNPXUbR0DdcJy9Db00wCzVzxVc6h7jfC",
719 "zT/RLRfBbYTjy9QrJqHLlw46lggWPGkHuPKSqk/CB7U4pNPXUbR0DdcJy9Db00wCzVzxVc6h7jfC",
720 "FgiL2Y0HVqd6bgIaVUqn/gJCEyCDVplnzebv0gg3XwMJAGu639lHu7rEvxTp1smIYjWp9R5L4Ssp",
720 "FgiL2Y0HVqd6bgIaVUqn/gJCEyCDVplnzebv0gg3XwMJAGu639lHu7rEvxTp1smIYjWp9R5L4Ssp",
721 "VvS07Nb+Smk1FgsMp1K3EMUT8X2Fty4VG54/Ec6bE8tNVw4/QV1VzBw7Px2/2eEhhUS+FMfbHAlD",
721 "VvS07Nb+Smk1FgsMp1K3EMUT8X2Fty4VG54/Ec6bE8tNVw4/QV1VzBw7Px2/2eEhhUS+FMfbHAlD",
722 "28x00jRgAAACW0GaQjwhkymEVwArOUkEOhoFqiELtH8wgecFLiUq6WqmwAP7iGEwbYzfnHacfqUN",
722 "28x00jRgAAACW0GaQjwhkymEVwArOUkEOhoFqiELtH8wgecFLiUq6WqmwAP7iGEwbYzfnHacfqUN",
723 "XAfD+CGR2ap0lAHL25ipuYtd5j2O0PU/MpaWPG/n2y5OkfTzaOpotaR5tWjN55B2XblVVqsFfBC/",
723 "XAfD+CGR2ap0lAHL25ipuYtd5j2O0PU/MpaWPG/n2y5OkfTzaOpotaR5tWjN55B2XblVVqsFfBC/",
724 "mvsiPvCBWUHFChacdY5whj5mP5rqQ0dqLJCsWjrs4TWnIbL2V/Iwfj3hwI35jfo1JkTOeR+8GhOd",
724 "mvsiPvCBWUHFChacdY5whj5mP5rqQ0dqLJCsWjrs4TWnIbL2V/Iwfj3hwI35jfo1JkTOeR+8GhOd",
725 "ma9rgiKWafCbQyhYMTDmVdvhND60Flm97EDSTjF0OC+0gD9b8Yn4tNeHipCa/aWyt0n79bMmjfcj",
725 "ma9rgiKWafCbQyhYMTDmVdvhND60Flm97EDSTjF0OC+0gD9b8Yn4tNeHipCa/aWyt0n79bMmjfcj",
726 "ntBCPjrcB5ecRTpfGHbEHy1IRj2cjkGXKC+VYoYJXBp4rd4cMd8ygLCk5nBSd8/cTaKNRjdBscOe",
726 "ntBCPjrcB5ecRTpfGHbEHy1IRj2cjkGXKC+VYoYJXBp4rd4cMd8ygLCk5nBSd8/cTaKNRjdBscOe",
727 "TXG6QEjSxj9/2pVwx9DMRVtWQR0BSaAcQcZ8W2KPSaeRC4QwmNMu2xx25CSyrDiq2rFSK/JJtmvo",
727 "TXG6QEjSxj9/2pVwx9DMRVtWQR0BSaAcQcZ8W2KPSaeRC4QwmNMu2xx25CSyrDiq2rFSK/JJtmvo",
728 "IjAKq0ciEXoOgw+Ke+Ylb7ULKCS3k1p/613UNRp450uSq5b7CAHo7S0b7fBMLfNmwSjRYEhLlo0H",
728 "IjAKq0ciEXoOgw+Ke+Ylb7ULKCS3k1p/613UNRp450uSq5b7CAHo7S0b7fBMLfNmwSjRYEhLlo0H",
729 "UaRe/I+IX2Z6XdZH9Hty/399ZA1PwZGC6EfvUJIf7CBeaxv7cu6IT2/s0zPRGthpvXpYw6A7P4Ww",
729 "UaRe/I+IX2Z6XdZH9Hty/399ZA1PwZGC6EfvUJIf7CBeaxv7cu6IT2/s0zPRGthpvXpYw6A7P4Ww",
730 "z5C4V98KnIUNUanadqabKP6eXWhvbvcQHxAjiOOiKZgXZplZW2g+B2NNyJSLiR+g48DqvWR6t9S2",
730 "z5C4V98KnIUNUanadqabKP6eXWhvbvcQHxAjiOOiKZgXZplZW2g+B2NNyJSLiR+g48DqvWR6t9S2",
731 "aGfFjdOW1Gi6oTtZ1d4p5XIslAr8mryeZ6+htSSQe4AcfVt7k+V6mOthBCYtr/LEU4ZHtl0mW987",
731 "aGfFjdOW1Gi6oTtZ1d4p5XIslAr8mryeZ6+htSSQe4AcfVt7k+V6mOthBCYtr/LEU4ZHtl0mW987",
732 "6PK8mRFAaT8DJOUFVz1lPfzRApuPggkkyq+UMvyfKTUbCk7/DpfX8Y4s4QAAAg9BmmNJ4Q8mUwIr",
732 "6PK8mRFAaT8DJOUFVz1lPfzRApuPggkkyq+UMvyfKTUbCk7/DpfX8Y4s4QAAAg9BmmNJ4Q8mUwIr",
733 "/wAsWUPjZw3ksgRsxZ6n4fQjprPbkj2aUh30y0bZJnLmiXnWskvOGnCPwBnG9dEhatwX3hoxk7BN",
733 "/wAsWUPjZw3ksgRsxZ6n4fQjprPbkj2aUh30y0bZJnLmiXnWskvOGnCPwBnG9dEhatwX3hoxk7BN",
734 "yG+wQ4emZUpcVzcWl2T9nKQB1euucuZWHTg7TCtM/iHyfPO2vbmGsfzs70b/egIbywUH4y4BQSL1",
734 "yG+wQ4emZUpcVzcWl2T9nKQB1euucuZWHTg7TCtM/iHyfPO2vbmGsfzs70b/egIbywUH4y4BQSL1",
735 "nWc1SmpHm2zHMBcUjYLDZ5gL5vdfxn0V8FFw66G88c/LN4I5icUa7xf4fcSBKywU0ajbp1P+aJYj",
735 "nWc1SmpHm2zHMBcUjYLDZ5gL5vdfxn0V8FFw66G88c/LN4I5icUa7xf4fcSBKywU0ajbp1P+aJYj",
736 "BgWT6Ggu0MDLDNl54tfqd42lKosQtM1aif4WXAZFP5Ww3vrQ1rH9+utSYxqZd6N6gGtNbSNMcVia",
736 "BgWT6Ggu0MDLDNl54tfqd42lKosQtM1aif4WXAZFP5Ww3vrQ1rH9+utSYxqZd6N6gGtNbSNMcVia",
737 "Kn5LcnjsbBi3T3EmGqshEbcme8VHKwR3kSfBOAprrIsv6K8R+X6az+MD23rWka/2v64m1qM69D7X",
737 "Kn5LcnjsbBi3T3EmGqshEbcme8VHKwR3kSfBOAprrIsv6K8R+X6az+MD23rWka/2v64m1qM69D7X",
738 "a+Kcs/n0KLCJdTilyaGadopLeaAn3eYvWTeHcucMM1Fp1KgHD1tiFeO6HvobLkZlRximsA3/7Mio",
738 "a+Kcs/n0KLCJdTilyaGadopLeaAn3eYvWTeHcucMM1Fp1KgHD1tiFeO6HvobLkZlRximsA3/7Mio",
739 "hYklLIcJrZL22BH+6W9d6kZsYIsej9RM681nU6mWNjepBAfAfTbrGRrVB/h2DxC5B8YyRjgSIzQj",
739 "hYklLIcJrZL22BH+6W9d6kZsYIsej9RM681nU6mWNjepBAfAfTbrGRrVB/h2DxC5B8YyRjgSIzQj",
740 "NYrse0rzChqbrsLl7mQ7W+1bsNKze5//9ZIa8rSsF+BXh/vgoRTDkPW/ws95B7VPCZEFChfX0icw",
740 "NYrse0rzChqbrsLl7mQ7W+1bsNKze5//9ZIa8rSsF+BXh/vgoRTDkPW/ws95B7VPCZEFChfX0icw",
741 "+tpcpN/q7NY87tUn4vESdSiMMlyhKklMjQu/G51J69ZRQLs2oUO6YfoJFqliy4qCFCrf8SZE9Fc6",
741 "+tpcpN/q7NY87tUn4vESdSiMMlyhKklMjQu/G51J69ZRQLs2oUO6YfoJFqliy4qCFCrf8SZE9Fc6",
742 "DcCagAAAAodBmoRJ4Q8mUwIr/wArPWF/KOw78THwadfPqhJO0CnmR/M74/XYZLqVYKlNcEaYauf+",
742 "DcCagAAAAodBmoRJ4Q8mUwIr/wArPWF/KOw78THwadfPqhJO0CnmR/M74/XYZLqVYKlNcEaYauf+",
743 "vrRUDJPmu75sMKy2Y+Bnslc/iAISSyWtw/h/3CF8fE5ZrbrwSNst+MSyCoNWP+8imtoX2eyojpdC",
743 "vrRUDJPmu75sMKy2Y+Bnslc/iAISSyWtw/h/3CF8fE5ZrbrwSNst+MSyCoNWP+8imtoX2eyojpdC",
744 "k8YP5K+cbK4SJPCkZXbYqSXYk7hO8AdSemBHgXKWiZ+UOr802aJo+98ZOIjX9hWL9bo31Gqx7cy4",
744 "k8YP5K+cbK4SJPCkZXbYqSXYk7hO8AdSemBHgXKWiZ+UOr802aJo+98ZOIjX9hWL9bo31Gqx7cy4",
745 "ZG+W/ar/WGlzDa1xPWnPRsEdrIcZlEVGV/jGmbirkxw1lyUYoqj8Vv7Bxube9XPQlBkXOV6Lc1LT",
745 "ZG+W/ar/WGlzDa1xPWnPRsEdrIcZlEVGV/jGmbirkxw1lyUYoqj8Vv7Bxube9XPQlBkXOV6Lc1LT",
746 "2IzNq0V7WwVhF0kA6yxfAsFxc9krNEH8vGGntTWI608ovjatXc/CKKXw7AjJSftlTcLI0hIIGXbR",
746 "2IzNq0V7WwVhF0kA6yxfAsFxc9krNEH8vGGntTWI608ovjatXc/CKKXw7AjJSftlTcLI0hIIGXbR",
747 "Ur0NCYNp7M4cVd/n73Rjetnixz4SAKpcz/P47UsijZG7T3SxzK2D79WS42aEalc12hQwCZ01LfmF",
747 "Ur0NCYNp7M4cVd/n73Rjetnixz4SAKpcz/P47UsijZG7T3SxzK2D79WS42aEalc12hQwCZ01LfmF",
748 "/H2mmGEvOzPBie1D0YT7Jh19vxa4Dd3SQ1FrDfmSUpvv4DjbYcZ2PrPpFpWtMjWqHBeoyMiZf6RP",
748 "/H2mmGEvOzPBie1D0YT7Jh19vxa4Dd3SQ1FrDfmSUpvv4DjbYcZ2PrPpFpWtMjWqHBeoyMiZf6RP",
749 "3EfYR6z9jsVNIIHxM0bzzBQF8eeYkPgDySydxPXv9Izo+QUY94N8kWi16fI6eZSDc1G0Yo0L91jc",
749 "3EfYR6z9jsVNIIHxM0bzzBQF8eeYkPgDySydxPXv9Izo+QUY94N8kWi16fI6eZSDc1G0Yo0L91jc",
750 "RQuDMGGS7B2zuf/0GbJyRhUO48UbMrqnILMrbQg1LF00Q3pH9nbGEK/RRQpRN3T/J/4IZQjwW2Ft",
750 "RQuDMGGS7B2zuf/0GbJyRhUO48UbMrqnILMrbQg1LF00Q3pH9nbGEK/RRQpRN3T/J/4IZQjwW2Ft",
751 "2ipWGztg1Jn9I4DmffKS60QC+JQcyakdVON6zDcKttIKlqeTcmAi4xzmo4QXa2dRKleS+fs3EtTd",
751 "2ipWGztg1Jn9I4DmffKS60QC+JQcyakdVON6zDcKttIKlqeTcmAi4xzmo4QXa2dRKleS+fs3EtTd",
752 "BBtony2wK9T2Imj+NCziOSEL7Q7VuIU8kclUHrJJsSneFcxGRgIgGGUEQM8/pklwTOqab7mMmJeR",
752 "BBtony2wK9T2Imj+NCziOSEL7Q7VuIU8kclUHrJJsSneFcxGRgIgGGUEQM8/pklwTOqab7mMmJeR",
753 "iaBrjJDEnDpkR4Vz3qXxgyn4/5x24FuTMNVPwQAAAhtBmqVJ4Q8mUwIr/wApcLwPT0/Xh9UdWqWX",
753 "iaBrjJDEnDpkR4Vz3qXxgyn4/5x24FuTMNVPwQAAAhtBmqVJ4Q8mUwIr/wApcLwPT0/Xh9UdWqWX",
754 "Is8Wbj5K1hivmN6qIQnq+aolcegdlM/63MbHsdC6xYZC1e/Q8UjQCt9N/Ejqwms8DzeWv2qxskel",
754 "Is8Wbj5K1hivmN6qIQnq+aolcegdlM/63MbHsdC6xYZC1e/Q8UjQCt9N/Ejqwms8DzeWv2qxskel",
755 "iZH0kt1QWkErWSEodq7V0ZNksctLkMGWayX33gBT368EehfIeGDolBZoqIbJfb4nqcfU+ev4OzVv",
755 "iZH0kt1QWkErWSEodq7V0ZNksctLkMGWayX33gBT368EehfIeGDolBZoqIbJfb4nqcfU+ev4OzVv",
756 "9zVqWyLck315GFmXxQKIM8pICQc8Q5es34LH1+DmnMnW8kQpVGrztQcDXhjCU3F0fOgoSsXSVWCj",
756 "9zVqWyLck315GFmXxQKIM8pICQc8Q5es34LH1+DmnMnW8kQpVGrztQcDXhjCU3F0fOgoSsXSVWCj",
757 "c6XKqGbCwQDfJUxCfXfIT6YmQoPpVp1mpGy1wQypXus9z0bScDpyDu23hViYDntdj1O45ea0znKZ",
757 "c6XKqGbCwQDfJUxCfXfIT6YmQoPpVp1mpGy1wQypXus9z0bScDpyDu23hViYDntdj1O45ea0znKZ",
758 "kj1+tLHbBtqAGJ1WTcbGlF6Vya6hQhEsiiZUIC2fRxIj8/wEXCICIbr0gZ/m6gcOhE10tenvE7iy",
758 "kj1+tLHbBtqAGJ1WTcbGlF6Vya6hQhEsiiZUIC2fRxIj8/wEXCICIbr0gZ/m6gcOhE10tenvE7iy",
759 "+BKY81wLWrnzos3S6FWxYtmCRes+LLhNGOKWRuQo6SyePH2OZ90xZm8oA1MuTe3V59euVNxjAt0F",
759 "+BKY81wLWrnzos3S6FWxYtmCRes+LLhNGOKWRuQo6SyePH2OZ90xZm8oA1MuTe3V59euVNxjAt0F",
760 "LkAc9TEiFhP/8CB+gA8mF+A8h1U01f4DVX55GzCH51jHI2xUS0L9GtsHoBxLPLK/NNel8zcnwG4X",
760 "LkAc9TEiFhP/8CB+gA8mF+A8h1U01f4DVX55GzCH51jHI2xUS0L9GtsHoBxLPLK/NNel8zcnwG4X",
761 "+UusfcfEb5hh+ffnXteCE9vRGbs2n9wYW0xA3ZicklfadmWKUtMiHYBfkMSULWnkBQr4CXxjpYOs",
761 "+UusfcfEb5hh+ffnXteCE9vRGbs2n9wYW0xA3ZicklfadmWKUtMiHYBfkMSULWnkBQr4CXxjpYOs",
762 "6ygeEoA5+5B0B1SZObgZ42wWqddyyYE0NfwQAl75tfdJGqOa7OMHwBYNeatJaJK0zT2+bFaw2qWC",
762 "6ygeEoA5+5B0B1SZObgZ42wWqddyyYE0NfwQAl75tfdJGqOa7OMHwBYNeatJaJK0zT2+bFaw2qWC",
763 "WwAAAitBmsZJ4Q8mUwIr/wAstkdsayRXchoFk703izqzduZ5WsyXriI9cfUdMUWvm0iGHwYIrUuj",
763 "WwAAAitBmsZJ4Q8mUwIr/wAstkdsayRXchoFk703izqzduZ5WsyXriI9cfUdMUWvm0iGHwYIrUuj",
764 "vz3Yjou+JLwv9df2kt7MJo8u+3P5CjEKbwlz4vkE5AHTAbgXn3+Xc/MMJLgW5cm7iX3KiGNnBpbp",
764 "vz3Yjou+JLwv9df2kt7MJo8u+3P5CjEKbwlz4vkE5AHTAbgXn3+Xc/MMJLgW5cm7iX3KiGNnBpbp",
765 "hhwJRlb3u91NRDr0d1IR2up/z7lKxE7XPAPFe0siPMYVlIqWNSn5KqLABPeuxxbOsvMEb27/nH1L",
765 "hhwJRlb3u91NRDr0d1IR2up/z7lKxE7XPAPFe0siPMYVlIqWNSn5KqLABPeuxxbOsvMEb27/nH1L",
766 "UVM8I2F95c1I3Lv1SpkhZXjs1JsmS9X7gsoTxkXyShGC2+zRJSGUbhCPo/q1XSFMHQyMWJ79FKPQ",
766 "UVM8I2F95c1I3Lv1SpkhZXjs1JsmS9X7gsoTxkXyShGC2+zRJSGUbhCPo/q1XSFMHQyMWJ79FKPQ",
767 "SL/RpVsacN2bYwdKo4TFBw1SsKq/L1iOmqMI+4Gxnbbjojdk0ek0JIcDb4bHv1czxchF7FX1Ym8H",
767 "SL/RpVsacN2bYwdKo4TFBw1SsKq/L1iOmqMI+4Gxnbbjojdk0ek0JIcDb4bHv1czxchF7FX1Ym8H",
768 "6IpPuE8CeNKjzQ1a1wqhEu+wl1N0x3Y37ZryCCKJRkxj0FT7bOoH3L38/yMUuh/v3aCmxY4eCkyk",
768 "6IpPuE8CeNKjzQ1a1wqhEu+wl1N0x3Y37ZryCCKJRkxj0FT7bOoH3L38/yMUuh/v3aCmxY4eCkyk",
769 "b2p6ZrYMFE044anM/nMjmbErMibfRFuCz58Io1rBlF7JfkIz0R2/5vjUMVskcdbX2mm7DntncOsW",
769 "b2p6ZrYMFE044anM/nMjmbErMibfRFuCz58Io1rBlF7JfkIz0R2/5vjUMVskcdbX2mm7DntncOsW",
770 "DIdg/XVmgsC9CzVzUyq4VsS/sk97lJggcddpWLNw/29egz8iLyzWHOAXCvl2fTIPkviYAOQXfVhZ",
770 "DIdg/XVmgsC9CzVzUyq4VsS/sk97lJggcddpWLNw/29egz8iLyzWHOAXCvl2fTIPkviYAOQXfVhZ",
771 "UQdxsyJUNFMTiALrZCmoQLMp2LmDbfbW8JQriDeR3fVz6P1sjT8C2yEDvzkCn7sh0aTBK+sx7BKH",
771 "UQdxsyJUNFMTiALrZCmoQLMp2LmDbfbW8JQriDeR3fVz6P1sjT8C2yEDvzkCn7sh0aTBK+sx7BKH",
772 "1nb4320+caQepQj4TCJtCeNXjdrVcNEnjvwlcRJwFT1pT+Y7HREbHnT71XYNh4EAAAGEQZrnSeEP",
772 "1nb4320+caQepQj4TCJtCeNXjdrVcNEnjvwlcRJwFT1pT+Y7HREbHnT71XYNh4EAAAGEQZrnSeEP",
773 "JlMCK/8AKIjxcI58rm/ML255fOJW1zbznFna7lfgMQrka7OTPPsvVAV4EJXye/Uxiu9dlftmRypJ",
773 "JlMCK/8AKIjxcI58rm/ML255fOJW1zbznFna7lfgMQrka7OTPPsvVAV4EJXye/Uxiu9dlftmRypJ",
774 "qfDot3xwDe8lX/qAVf6pBkSlUsaLyBYtww/SUSa1bGl1JvrJCN7FXCCXbLd5R4PoYlPiDIm/DQH2",
774 "qfDot3xwDe8lX/qAVf6pBkSlUsaLyBYtww/SUSa1bGl1JvrJCN7FXCCXbLd5R4PoYlPiDIm/DQH2",
775 "puO0StIWmrR77Isc/J1pRvdu5+mQa/n0SEHUeM2KkoRzCznfD9zaaRO7BDtvC9SYIT0uYZxrwTjx",
775 "puO0StIWmrR77Isc/J1pRvdu5+mQa/n0SEHUeM2KkoRzCznfD9zaaRO7BDtvC9SYIT0uYZxrwTjx",
776 "Q7N7UERTrYG0P+vRLAhxkfohFIYl3HXyjPOvnlbUFP2oiiy6nkUFuaIyQcJawJv3GU8k4ObcKsC1",
776 "Q7N7UERTrYG0P+vRLAhxkfohFIYl3HXyjPOvnlbUFP2oiiy6nkUFuaIyQcJawJv3GU8k4ObcKsC1",
777 "cNDXjSpsyQRrxLFaCCjke4mikyt7vs0iN0bnrNWv9HXruG9zOFEOer1ggIFTsT1Eos5CXRkgja5H",
777 "cNDXjSpsyQRrxLFaCCjke4mikyt7vs0iN0bnrNWv9HXruG9zOFEOer1ggIFTsT1Eos5CXRkgja5H",
778 "N4QUM6MhWpc5du/HgBIH8ANFcoo2kJpqcadw9r/0qk25X91MQSDJQiH8Hny2dQhqR+LFWEawiW75",
778 "N4QUM6MhWpc5du/HgBIH8ANFcoo2kJpqcadw9r/0qk25X91MQSDJQiH8Hny2dQhqR+LFWEawiW75",
779 "3SJhn0ngZcv/mPj3mwcHv1SL9ErBqAjm4JGiDetPKYtFwANYY11OyQAAAVdBmwhJ4Q8mUwIr/wAr",
779 "3SJhn0ngZcv/mPj3mwcHv1SL9ErBqAjm4JGiDetPKYtFwANYY11OyQAAAVdBmwhJ4Q8mUwIr/wAr",
780 "Ox5HV2505jRePGgMxptW4PGIHEszV1xGZS+flSkF+aq30AaqO7u6XK9jJsuWXTfYCRQTn1bZfFQ2",
780 "Ox5HV2505jRePGgMxptW4PGIHEszV1xGZS+flSkF+aq30AaqO7u6XK9jJsuWXTfYCRQTn1bZfFQ2",
781 "2DbO5DXAxK/TUmbQleCflFzeS6/czxkL4PJ8AwOs2U+oehekgCZC8gZyHHaQSaKbNJ46gTjNsLy8",
781 "2DbO5DXAxK/TUmbQleCflFzeS6/czxkL4PJ8AwOs2U+oehekgCZC8gZyHHaQSaKbNJ46gTjNsLy8",
782 "4ACQ5uNt11TPuCPqPTuh+schdw9S+/lU/6m+EyaqGZ49wDFPiBFBYXglQQBjyP9k/rqq0xL7SiLj",
782 "4ACQ5uNt11TPuCPqPTuh+schdw9S+/lU/6m+EyaqGZ49wDFPiBFBYXglQQBjyP9k/rqq0xL7SiLj",
783 "pe4riYg8SFUuUtOzPdWHyvxnI7Ug/0VLPGAAhgMISUnqe01d5QFf36yHpwMAHexjAZFIGQHAFaut",
783 "pe4riYg8SFUuUtOzPdWHyvxnI7Ug/0VLPGAAhgMISUnqe01d5QFf36yHpwMAHexjAZFIGQHAFaut",
784 "uMuEw6HzUZVzNdeHYxvEYOGkTo007bLwbuf/nxzrywGOxlRTYJLRdYI0mk0SdN3+LeTv1RIJwv21",
784 "uMuEw6HzUZVzNdeHYxvEYOGkTo007bLwbuf/nxzrywGOxlRTYJLRdYI0mk0SdN3+LeTv1RIJwv21",
785 "+e9rT5iFOTCgzeQoekEWXLYz0X8YLq5bVCtijP7/T7w1Ck71j0aqfrEn6wtIAAABNUGbKUnhDyZT",
785 "+e9rT5iFOTCgzeQoekEWXLYz0X8YLq5bVCtijP7/T7w1Ck71j0aqfrEn6wtIAAABNUGbKUnhDyZT",
786 "Aiv/ACcySi7VBgOid6qZNXvhh/JsllHkMLLq0yNbQTqv/Wk2EBoSKICZwFwAD0WRzhvvReCGirep",
786 "Aiv/ACcySi7VBgOid6qZNXvhh/JsllHkMLLq0yNbQTqv/Wk2EBoSKICZwFwAD0WRzhvvReCGirep",
787 "1Fe4bxjm49/UR+OYrXRmHR18T0C83AUVeBk7KvDZmb/eHzuzEN4yfXucr/NWFJl+USVMY4r4UQ9C",
787 "1Fe4bxjm49/UR+OYrXRmHR18T0C83AUVeBk7KvDZmb/eHzuzEN4yfXucr/NWFJl+USVMY4r4UQ9C",
788 "ayrfEY9v6AQ6mzAdLy2UMfFxrRJ99g/Rfl8qx+m4jIZNjlrTaThzJ/3OpVmAliDfxVyg8+CVIlI3",
788 "ayrfEY9v6AQ6mzAdLy2UMfFxrRJ99g/Rfl8qx+m4jIZNjlrTaThzJ/3OpVmAliDfxVyg8+CVIlI3",
789 "1IykiwQrXcebgajG+av8XU1SfyAG5ibvwbtdSAxkGBcJWL387V+uTdY56w3KN2vBtoQpVKD2zb3y",
789 "1IykiwQrXcebgajG+av8XU1SfyAG5ibvwbtdSAxkGBcJWL387V+uTdY56w3KN2vBtoQpVKD2zb3y",
790 "azIcATZ02upwIytNcM/rpaLCdMb1myWcikE25agzLhDhOS+4zwjYz2DnW6VY0gFBAPsphhsUMnau",
790 "azIcATZ02upwIytNcM/rpaLCdMb1myWcikE25agzLhDhOS+4zwjYz2DnW6VY0gFBAPsphhsUMnau",
791 "VVdUVHzCTSdvzEve/H8q4AAAAVdBm0pJ4Q8mUwIr/wAo+x5XKuiN1am7SkJKSMonFZDPU3f5XFcD",
791 "VVdUVHzCTSdvzEve/H8q4AAAAVdBm0pJ4Q8mUwIr/wAo+x5XKuiN1am7SkJKSMonFZDPU3f5XFcD",
792 "QSs0FLVq2idfsKwuIkt1mxIq8NgMHpzofTnDHqs/WedvAmhBgL0N5azdQa5MNKG2rJ4IAvGQY/uF",
792 "QSs0FLVq2idfsKwuIkt1mxIq8NgMHpzofTnDHqs/WedvAmhBgL0N5azdQa5MNKG2rJ4IAvGQY/uF",
793 "m3jKQAKzvhSS01gO1oIfizF817z9IShS4QK2WT0PeFPELqLSpED8eNOpVTR96vmwpk/WBKRVJdTQ",
793 "m3jKQAKzvhSS01gO1oIfizF817z9IShS4QK2WT0PeFPELqLSpED8eNOpVTR96vmwpk/WBKRVJdTQ",
794 "JzjiCQ5pgEwjtvk7KqoS0+lwXSbvIrXkYm8DignEts3DLNoLHrPjXlQmbIop76JZSyJEtB+91GrL",
794 "JzjiCQ5pgEwjtvk7KqoS0+lwXSbvIrXkYm8DignEts3DLNoLHrPjXlQmbIop76JZSyJEtB+91GrL",
795 "wo6Km5GeebyA2E6qGL3xSkpppej/ruoFprSKrH60UMbrq/SK7eCo+1QFoySPQmqDFsMGiQFqvtld",
795 "wo6Km5GeebyA2E6qGL3xSkpppej/ruoFprSKrH60UMbrq/SK7eCo+1QFoySPQmqDFsMGiQFqvtld",
796 "5BXDYdVI4yRaoyN7Y7wi83HRC6eVazuHU9OtIY3xJJApBWq1aJOsYwc38aTC3ee863Aa/4n9Lk4D",
796 "5BXDYdVI4yRaoyN7Y7wi83HRC6eVazuHU9OtIY3xJJApBWq1aJOsYwc38aTC3ee863Aa/4n9Lk4D",
797 "AtyFYHNZjB5m2e2vk8G2Gny9YFlBAAABQEGba0nhDyZTAiv/ACoZSZQfHxhfQxEqOBQrP+L3Dmgv",
797 "AtyFYHNZjB5m2e2vk8G2Gny9YFlBAAABQEGba0nhDyZTAiv/ACoZSZQfHxhfQxEqOBQrP+L3Dmgv",
798 "HSJQtB1iVkcLTxm+vagLHBLG91OGnopwrr7gT/loDypIhoRxjcwAAOeg/jN4WBbXzCJtnWGGllUC",
798 "HSJQtB1iVkcLTxm+vagLHBLG91OGnopwrr7gT/loDypIhoRxjcwAAOeg/jN4WBbXzCJtnWGGllUC",
799 "SdtUZQzKOSp9iM4yX18C6jrY4Sq6R9PUV/lEGNveJR4gw4FMve7110XdEPL1O2VTdHvdqeANyaq0",
799 "SdtUZQzKOSp9iM4yX18C6jrY4Sq6R9PUV/lEGNveJR4gw4FMve7110XdEPL1O2VTdHvdqeANyaq0",
800 "nLdEmtXnrzvdrFlBaUvmaR4EdlkqGkvkZKWJej8Vq+msbKa7JdbxjwZtRufiyGfD/NVqMgSrYRzw",
800 "nLdEmtXnrzvdrFlBaUvmaR4EdlkqGkvkZKWJej8Vq+msbKa7JdbxjwZtRufiyGfD/NVqMgSrYRzw",
801 "9z/a8Zwbr+9+19CxlWD5bCuAEfPmjY6kZJE2L/CQI6+tnCBTXOmWZtZMBoCLGOf7G2uAC3+kFlbo",
801 "9z/a8Zwbr+9+19CxlWD5bCuAEfPmjY6kZJE2L/CQI6+tnCBTXOmWZtZMBoCLGOf7G2uAC3+kFlbo",
802 "h9as5WCkO6+iqXq29dyhKnsHInorRYsPlgxIXyU1Om/Kyhj1DJV0Am9WJK3Dln0zNUH0q6ZTOnZc",
802 "h9as5WCkO6+iqXq29dyhKnsHInorRYsPlgxIXyU1Om/Kyhj1DJV0Am9WJK3Dln0zNUH0q6ZTOnZc",
803 "FD36AAABYkGbjEnhDyZTAiv/ACcwdIOLRFfoGK2ZkKsvgMwG0m0qsY0vMLPSzefc+ebp/aztyF7M",
803 "FD36AAABYkGbjEnhDyZTAiv/ACcwdIOLRFfoGK2ZkKsvgMwG0m0qsY0vMLPSzefc+ebp/aztyF7M",
804 "lsBz/fBeNtxFBcsKgR4pf65GvdfOMHah0ltZ918sMDmXUEZMeRHy/xpnWpTLeGz6uTs/7MATPmU5",
804 "lsBz/fBeNtxFBcsKgR4pf65GvdfOMHah0ltZ918sMDmXUEZMeRHy/xpnWpTLeGz6uTs/7MATPmU5",
805 "BgHbT/DkD8QeaZnFAzidyFCXDz2l/jaKhEdgqipbB2pH0+fQ039r05z9axxEWGmaLQjg6x9+po1o",
805 "BgHbT/DkD8QeaZnFAzidyFCXDz2l/jaKhEdgqipbB2pH0+fQ039r05z9axxEWGmaLQjg6x9+po1o",
806 "24yhkVO7m03YwWmPyCgy8cOwrvRyJkXJpRN4m8ZBS1zwY80HeN/VyMQQJSMwsTo7R1XMerSFuyx0",
806 "24yhkVO7m03YwWmPyCgy8cOwrvRyJkXJpRN4m8ZBS1zwY80HeN/VyMQQJSMwsTo7R1XMerSFuyx0",
807 "nz+8qOuhiqykc2ohCCsXia/+kIKbJ5Vs+cbWtvkqBKIDSfU7FhAd3GjcY/xar0EVmi6wWFTugAog",
807 "nz+8qOuhiqykc2ohCCsXia/+kIKbJ5Vs+cbWtvkqBKIDSfU7FhAd3GjcY/xar0EVmi6wWFTugAog",
808 "R3I7mTrQDdlTAqYgqO7Gn5NMXQVHu2i1zhFSdo9GjMbeGnbkJwsFbQ2XkoKRIDpuW7AewC9AEBt0",
808 "R3I7mTrQDdlTAqYgqO7Gn5NMXQVHu2i1zhFSdo9GjMbeGnbkJwsFbQ2XkoKRIDpuW7AewC9AEBt0",
809 "Ox/Ah6dGXfXO1jl8pEApj2RFmgAAAPlBm61J4Q8mUwIr/wAlR+eW/VZ7bSrmwwMA62G05DZ7p/5F",
809 "Ox/Ah6dGXfXO1jl8pEApj2RFmgAAAPlBm61J4Q8mUwIr/wAlR+eW/VZ7bSrmwwMA62G05DZ7p/5F",
810 "UugsSsQdonUq6abtbU5hjFr+I1lPgoiV5c3CkTQZS+K5zivdo+Ti2P4K90xXANp8dSMAu85uJIOC",
810 "UugsSsQdonUq6abtbU5hjFr+I1lPgoiV5c3CkTQZS+K5zivdo+Ti2P4K90xXANp8dSMAu85uJIOC",
811 "Qn2TXbEnNDifLB+3V84ht5tj4lvTaZx317BcliV8D5v2zZQW8RO1mUbuJEBItst8E7hfE+ZXj7tf",
811 "Qn2TXbEnNDifLB+3V84ht5tj4lvTaZx317BcliV8D5v2zZQW8RO1mUbuJEBItst8E7hfE+ZXj7tf",
812 "DxNZPTvtpFyUv0fH1cTg1pr2VLy0d0zQLiA58dg+GkRvR1/hs2LyifBgHcj6eTWz0vsypVn9iPXR",
812 "DxNZPTvtpFyUv0fH1cTg1pr2VLy0d0zQLiA58dg+GkRvR1/hs2LyifBgHcj6eTWz0vsypVn9iPXR",
813 "H/unJ6i8cfFL69NO24tQ9QQB+nDFhoP2cRhkAvhHwn56n5PppBD/oxni2f8AAAE9QZvOSeEPJlMC",
813 "H/unJ6i8cfFL69NO24tQ9QQB+nDFhoP2cRhkAvhHwn56n5PppBD/oxni2f8AAAE9QZvOSeEPJlMC",
814 "K/8AJjAXVGf+Kj2XNJnFeKC/gr7dJDTC2ngpd4WeAHlg04GuJKnn9hAmiECxxo9qM1IYMRiB85t6",
814 "K/8AJjAXVGf+Kj2XNJnFeKC/gr7dJDTC2ngpd4WeAHlg04GuJKnn9hAmiECxxo9qM1IYMRiB85t6",
815 "gALnlm9sRqGmioyzAm18RJndc9Ah8RlpGzr+44a6ntRaPx0cIwNIWAA8buL2JP00dmfjNqEiAlCa",
815 "gALnlm9sRqGmioyzAm18RJndc9Ah8RlpGzr+44a6ntRaPx0cIwNIWAA8buL2JP00dmfjNqEiAlCa",
816 "8OdV8FQxjp1vDXsGcAGF3Qbd62KEpkimeI3wH2nuXpbDHm8/ZKOR49s5ifUCkxCoJpfp43aC0lTz",
816 "8OdV8FQxjp1vDXsGcAGF3Qbd62KEpkimeI3wH2nuXpbDHm8/ZKOR49s5ifUCkxCoJpfp43aC0lTz",
817 "h2NXpcfVw6h0QnK8G60R4ZAxOxaJB7c0nn8ixXSU2JVY24EtGMF53nxJnHfzUheewUfBOGYSxeo8",
817 "h2NXpcfVw6h0QnK8G60R4ZAxOxaJB7c0nn8ixXSU2JVY24EtGMF53nxJnHfzUheewUfBOGYSxeo8",
818 "oK7oUCqX4rztzDwoc2QywNqQUJUkFrqIN+sb5ecYvX24Zujn+ZzTW6UDAF3R6WdNyJyRAremgC8s",
818 "oK7oUCqX4rztzDwoc2QywNqQUJUkFrqIN+sb5ecYvX24Zujn+ZzTW6UDAF3R6WdNyJyRAremgC8s",
819 "pSflTqygQNGfHyGkfIEEJJaFo/pBCBkAAAEWQZvvSeEPJlMCK/8AKI41fuekXG59Knbw4Y6YJrit",
819 "pSflTqygQNGfHyGkfIEEJJaFo/pBCBkAAAEWQZvvSeEPJlMCK/8AKI41fuekXG59Knbw4Y6YJrit",
820 "sh9VtQgc3QKvVmxrzzo7f4aXn8N74eyP4b2lV1Z2Q+rohxps7EHTkOY9jLdqxI3MXe7je4g2qepz",
820 "sh9VtQgc3QKvVmxrzzo7f4aXn8N74eyP4b2lV1Z2Q+rohxps7EHTkOY9jLdqxI3MXe7je4g2qepz",
821 "71+hY+jYdX+9LO0kA0Zg3NfyAlIRX7k6c/YHAZNtNaGZgTBMqiPgmEjiJH9Luk7shbgr+srfwiYw",
821 "71+hY+jYdX+9LO0kA0Zg3NfyAlIRX7k6c/YHAZNtNaGZgTBMqiPgmEjiJH9Luk7shbgr+srfwiYw",
822 "BX9rdS3fQNNFwcT8orQC+F60LAY9+GbFo2Sw3Ld4Tw9jq9yJtrY8RtHAdzytyek/mv2+j2TbTvAQ",
822 "BX9rdS3fQNNFwcT8orQC+F60LAY9+GbFo2Sw3Ld4Tw9jq9yJtrY8RtHAdzytyek/mv2+j2TbTvAQ",
823 "KbbCYtdC8E/KtR4V5ZTSScr5Wb63vmbw7UpddEXYvl55pARyyvMxWNSh3Li4GF8Jk5JBi5B5ASQw",
823 "KbbCYtdC8E/KtR4V5ZTSScr5Wb63vmbw7UpddEXYvl55pARyyvMxWNSh3Li4GF8Jk5JBi5B5ASQw",
824 "xCMYpX5hkAMc+d8tl2bT+IEvUTsAAAElQZoQSeEPJlMCK/8AJIAzFZs00JJ0yfm8CZiew4xWdArL",
824 "xCMYpX5hkAMc+d8tl2bT+IEvUTsAAAElQZoQSeEPJlMCK/8AJIAzFZs00JJ0yfm8CZiew4xWdArL",
825 "klEvBVXo/+ukPLu3XP9HFOfsme3T6BJEKmPPgZw/Lxnraq6Sl2kLVW19YU1qmqgfv+80LkZaWU5g",
825 "klEvBVXo/+ukPLu3XP9HFOfsme3T6BJEKmPPgZw/Lxnraq6Sl2kLVW19YU1qmqgfv+80LkZaWU5g",
826 "RAH4hqyo3bFYcbuY2SC3IW5Wm69gtYyAXOdbAYSEHA16fvCeRQjHEsxKVndJdrRAlrGHsKgUBQ3U",
826 "RAH4hqyo3bFYcbuY2SC3IW5Wm69gtYyAXOdbAYSEHA16fvCeRQjHEsxKVndJdrRAlrGHsKgUBQ3U",
827 "p/ZXIy1vkdFOfKSjpuZnswkuqr8NZI5tJ/dnBSErBTNWPaNwWV7nNomC0EYVGo+geGBhLXzaLw0U",
827 "p/ZXIy1vkdFOfKSjpuZnswkuqr8NZI5tJ/dnBSErBTNWPaNwWV7nNomC0EYVGo+geGBhLXzaLw0U",
828 "AOCYGjiPc3803BDw1GLoLIXjrIFJxwRfBNIAXYZAglu30oYzhpAfRWSprkeULMWYJTlWvbUQ5CNe",
828 "AOCYGjiPc3803BDw1GLoLIXjrIFJxwRfBNIAXYZAglu30oYzhpAfRWSprkeULMWYJTlWvbUQ5CNe",
829 "wSZssuDWIRAc3w8AcFaywwn+YSGhtR8VI1OGjYkfBbcAAAD8QZoxSeEPJlMCK/8AJdokjCUETRw/",
829 "wSZssuDWIRAc3w8AcFaywwn+YSGhtR8VI1OGjYkfBbcAAAD8QZoxSeEPJlMCK/8AJdokjCUETRw/",
830 "nciVPtaZQSBP/VxAQSITASEzlJBl9Na1r0DJhLOz279+KQLtl/xHZ8vAKc528mTMTqtWs4sFbeVg",
830 "nciVPtaZQSBP/VxAQSITASEzlJBl9Na1r0DJhLOz279+KQLtl/xHZ8vAKc528mTMTqtWs4sFbeVg",
831 "HWyBpHcHEtgTzjIqEinp/MPuUXF5poo8YLSSMFn9Ozx2FbU5/Kh9A39oN9NHQflVxV1NA6yT/84H",
831 "HWyBpHcHEtgTzjIqEinp/MPuUXF5poo8YLSSMFn9Ozx2FbU5/Kh9A39oN9NHQflVxV1NA6yT/84H",
832 "HyfMtfdSMS8KTvAEE2lDs14VQayNs5ctjXboQT7xMBf5OLj6thhPvgaDrFB2o/PV9ouK147lruWT",
832 "HyfMtfdSMS8KTvAEE2lDs14VQayNs5ctjXboQT7xMBf5OLj6thhPvgaDrFB2o/PV9ouK147lruWT",
833 "P2mkoA9oDIMYW1pcBx4yyV/t9GOPZ3aXneMUb2fFmUCX43BjXfUDMaa4GO2/Ankj3UEQwDxA7ZlN",
833 "P2mkoA9oDIMYW1pcBx4yyV/t9GOPZ3aXneMUb2fFmUCX43BjXfUDMaa4GO2/Ankj3UEQwDxA7ZlN",
834 "UQK2AAAA4UGaUknhDyZTAiv/ACJHv33I08bkhybYiJ/JiiheW5zMPBu4n5CxGr3frhE7TkLh0vPk",
834 "UQK2AAAA4UGaUknhDyZTAiv/ACJHv33I08bkhybYiJ/JiiheW5zMPBu4n5CxGr3frhE7TkLh0vPk",
835 "tM8m/AhaDiJisdk5QXNe/4WmxEDSAyaVi4eUVu0iHT2ly/KNTGqiORqA2oKpTjh84nYbrpXwnGv9",
835 "tM8m/AhaDiJisdk5QXNe/4WmxEDSAyaVi4eUVu0iHT2ly/KNTGqiORqA2oKpTjh84nYbrpXwnGv9",
836 "SOf/34Z06xN6Yo3t35UZrP8nlcs/63GtnEmnUwVZHBYfPM6bs5M5AeBfAQ/9mIqu7vnEst+5O2wp",
836 "SOf/34Z06xN6Yo3t35UZrP8nlcs/63GtnEmnUwVZHBYfPM6bs5M5AeBfAQ/9mIqu7vnEst+5O2wp",
837 "PjzdItjwGCZ2ApHVjGnYYFomlA9nm6AXnxNIWHIsDgxCk3zx+6QbXipu/CWLG1Wf0WIbt4C0JPVl",
837 "PjzdItjwGCZ2ApHVjGnYYFomlA9nm6AXnxNIWHIsDgxCk3zx+6QbXipu/CWLG1Wf0WIbt4C0JPVl",
838 "3TEb0QAAAMlBmnNJ4Q8mUwIr/wAVV64OfTKmlktYOqZHH1W1DhPy/X/6sD4T6hRdzfOgNtTOX2Ic",
838 "3TEb0QAAAMlBmnNJ4Q8mUwIr/wAVV64OfTKmlktYOqZHH1W1DhPy/X/6sD4T6hRdzfOgNtTOX2Ic",
839 "kRJHshfBQVkJIzns079io6kpJFCcS3VD4zrWCn/dNaGV0kWTpFBRuusfn8F0C0R/EhsQeyTsdZft",
839 "kRJHshfBQVkJIzns079io6kpJFCcS3VD4zrWCn/dNaGV0kWTpFBRuusfn8F0C0R/EhsQeyTsdZft",
840 "EkLGb5tq+nrir3vfmeb7rjmWJRXkIrTEKu8pIuAd+4FBGp8ARgGe80Jqpp//s1433HqBFqXsIFJT",
840 "EkLGb5tq+nrir3vfmeb7rjmWJRXkIrTEKu8pIuAd+4FBGp8ARgGe80Jqpp//s1433HqBFqXsIFJT",
841 "mU8j/toF9HyueI1Ea4uvsQ6NANGcYCbOAKCmbNiwABMCFaiUTMAAAAPSbW9vdgAAAGxtdmhkAAAA",
841 "mU8j/toF9HyueI1Ea4uvsQ6NANGcYCbOAKCmbNiwABMCFaiUTMAAAAPSbW9vdgAAAGxtdmhkAAAA",
842 "AHwlsIB8JbCAAAAD6AAAAyAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA",
842 "AHwlsIB8JbCAAAAD6AAAAyAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAA",
843 "AAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAv10cmFrAAAAXHRraGQA",
843 "AAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAv10cmFrAAAAXHRraGQA",
844 "AAAPfCWwgHwlsIAAAAABAAAAAAAAAyAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB",
844 "AAAPfCWwgHwlsIAAAAABAAAAAAAAAyAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB",
845 "AAAAAAAAAAAAAAAAAABAAAAAAY4AAAGGAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAMgAAAA",
845 "AAAAAAAAAAAAAAAAAABAAAAAAY4AAAGGAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAMgAAAA",
846 "AgABAAAAAAJ1bWRpYQAAACBtZGhkAAAAAHwlsIB8JbCAAAAAGQAAABRVxAAAAAAALWhkbHIAAAAA",
846 "AgABAAAAAAJ1bWRpYQAAACBtZGhkAAAAAHwlsIB8JbCAAAAAGQAAABRVxAAAAAAALWhkbHIAAAAA",
847 "AAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACIG1pbmYAAAAUdm1oZAAAAAEAAAAA",
847 "AAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACIG1pbmYAAAAUdm1oZAAAAAEAAAAA",
848 "AAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAeBzdGJsAAAAtHN0c2QA",
848 "AAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAeBzdGJsAAAAtHN0c2QA",
849 "AAAAAAAAAQAAAKRhdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAY4BhgBIAAAASAAAAAAAAAAB",
849 "AAAAAAAAAQAAAKRhdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAY4BhgBIAAAASAAAAAAAAAAB",
850 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAAMmF2Y0MBZAAV/+EAGWdkABWs",
850 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAAMmF2Y0MBZAAV/+EAGWdkABWs",
851 "2UGQz6mhAAADAAEAAAMAMg8WLZYBAAZo6+PLIsAAAAAcdXVpZGtoQPJfJE/FujmlG88DI/MAAAAA",
851 "2UGQz6mhAAADAAEAAAMAMg8WLZYBAAZo6+PLIsAAAAAcdXVpZGtoQPJfJE/FujmlG88DI/MAAAAA",
852 "AAAAGHN0dHMAAAAAAAAAAQAAABQAAAABAAAAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cwAAAAAA",
852 "AAAAGHN0dHMAAAAAAAAAAQAAABQAAAABAAAAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cwAAAAAA",
853 "AAABAAAAFAAAAAIAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAZHN0c3oAAAAAAAAAAAAA",
853 "AAABAAAAFAAAAAIAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAZHN0c3oAAAAAAAAAAAAA",
854 "ABQAAA05AAACqQAAAl8AAAITAAACiwAAAh8AAAIvAAABiAAAAVsAAAE5AAABWwAAAUQAAAFmAAAA",
854 "ABQAAA05AAACqQAAAl8AAAITAAACiwAAAh8AAAIvAAABiAAAAVsAAAE5AAABWwAAAUQAAAFmAAAA",
855 "/QAAAUEAAAEaAAABKQAAAQAAAADlAAAAzQAAAGBzdGNvAAAAAAAAABQAAAAsAAANZQAAEA4AABJt",
855 "/QAAAUEAAAEaAAABKQAAAQAAAADlAAAAzQAAAGBzdGNvAAAAAAAAABQAAAAsAAANZQAAEA4AABJt",
856 "AAAUgAAAFwsAABkqAAAbWQAAHOEAAB48AAAfdQAAINAAACIUAAAjegAAJHcAACW4AAAm0gAAJ/sA",
856 "AAAUgAAAFwsAABkqAAAbWQAAHOEAAB48AAAfdQAAINAAACIUAAAjegAAJHcAACW4AAAm0gAAJ/sA",
857 "ACj7AAAp4AAAAGF1ZHRhAAAAWW1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAA",
857 "ACj7AAAp4AAAAGF1ZHRhAAAAWW1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAA",
858 "AAAAAAAALGlsc3QAAAAkqXRvbwAAABxkYXRhAAAAAQAAAABMYXZmNTIuMTExLjA=",
858 "AAAAAAAALGlsc3QAAAAkqXRvbwAAABxkYXRhAAAAAQAAAABMYXZmNTIuMTExLjA=",
859 "\">"
859 "\">"
860 ],
860 ],
861 "output_type": "pyout",
861 "output_type": "pyout",
862 "prompt_number": 5,
862 "prompt_number": 5,
863 "text": [
863 "text": [
864 "&lt;IPython.core.display.HTML at 0x423a550&gt;"
864 "&lt;IPython.core.display.HTML at 0x423a550&gt;"
865 ]
865 ]
866 }
866 }
867 ],
867 ],
868 "prompt_number": 5
868 "prompt_number": 5
869 },
869 },
870 {
870 {
871 "cell_type": "markdown",
871 "cell_type": "markdown",
872 "source": [
872 "source": [
873 "## Local Files",
873 "## Local Files",
874 "",
874 "",
875 "The above examples embed images and video from the notebook filesystem in the output",
875 "The above examples embed images and video from the notebook filesystem in the output",
876 "areas of code cells. It is also possible to request these files directly in markdown cells",
876 "areas of code cells. It is also possible to request these files directly in markdown cells",
877 "if they reside in the notebook directory via relative urls prefixed with `files/`:",
877 "if they reside in the notebook directory via relative urls prefixed with `files/`:",
878 "",
878 "",
879 " files/[subdirectory/]<filename>",
879 " files/[subdirectory/]<filename>",
880 "",
880 "",
881 "",
881 "",
882 "For example, in the example notebook folder, we have the Python logo, addressed as:",
882 "For example, in the example notebook folder, we have the Python logo, addressed as:",
883 "",
883 "",
884 " <img src=\"files/python-logo.svg\" />",
884 " <img src=\"files/python-logo.svg\" />",
885 "",
885 "",
886 "<img src=\"/files/python-logo.svg\" />",
886 "<img src=\"/files/python-logo.svg\" />",
887 "",
887 "",
888 "and a video with the HTML5 video tag:",
888 "and a video with the HTML5 video tag:",
889 "",
889 "",
890 " <video controls src=\"files/animation.m4v\" />",
890 " <video controls src=\"files/animation.m4v\" />",
891 "",
891 "",
892 "<video controls src=\"/files/animation.m4v\" />",
892 "<video controls src=\"/files/animation.m4v\" />",
893 "",
893 "",
894 "These do not embed the data into the notebook file,",
894 "These do not embed the data into the notebook file,",
895 "and require that the files exist when you are viewing the notebook.",
895 "and require that the files exist when you are viewing the notebook.",
896 "",
896 "",
897 "### Security of local files",
897 "### Security of local files",
898 "",
898 "",
899 "Note that this means that the IPython notebook server also acts as a generic file server",
899 "Note that this means that the IPython notebook server also acts as a generic file server",
900 "for files inside the same tree as your notebooks. Access is not granted outside the",
900 "for files inside the same tree as your notebooks. Access is not granted outside the",
901 "notebook folder so you have strict control over what files are visible, but for this",
901 "notebook folder so you have strict control over what files are visible, but for this",
902 "reason it is highly recommended that you do not run the notebook server with a notebook",
902 "reason it is highly recommended that you do not run the notebook server with a notebook",
903 "directory at a high level in your filesystem (e.g. your home directory).",
903 "directory at a high level in your filesystem (e.g. your home directory).",
904 "",
904 "",
905 "When you run the notebook in a password-protected manner, local file access is restricted",
905 "When you run the notebook in a password-protected manner, local file access is restricted",
906 "to authenticated users unless read-only views are active."
906 "to authenticated users unless read-only views are active."
907 ]
907 ]
908 },
908 },
909 {
909 {
910 "cell_type": "markdown",
910 "cell_type": "markdown",
911 "source": [
911 "source": [
912 "### External sites",
912 "### External sites",
913 "",
913 "",
914 "You can even embed an entire page from another site in an iframe; for example this is today's Wikipedia",
914 "You can even embed an entire page from another site in an iframe; for example this is today's Wikipedia",
915 "page for mobile users:"
915 "page for mobile users:"
916 ]
916 ]
917 },
917 },
918 {
918 {
919 "cell_type": "code",
919 "cell_type": "code",
920 "collapsed": false,
920 "collapsed": false,
921 "input": [
921 "input": [
922 "HTML('<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>')"
922 "HTML('<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>')"
923 ],
923 ],
924 "language": "python",
924 "language": "python",
925 "outputs": [
925 "outputs": [
926 {
926 {
927 "html": [
927 "html": [
928 "<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>"
928 "<iframe src=http://en.mobile.wikipedia.org/?useformat=mobile width=700 height=350>"
929 ],
929 ],
930 "output_type": "pyout",
930 "output_type": "pyout",
931 "prompt_number": 6,
931 "prompt_number": 6,
932 "text": [
932 "text": [
933 "&lt;IPython.core.display.HTML at 0x41d4710&gt;"
933 "&lt;IPython.core.display.HTML at 0x41d4710&gt;"
934 ]
934 ]
935 }
935 }
936 ],
936 ],
937 "prompt_number": 6
937 "prompt_number": 6
938 },
938 },
939 {
939 {
940 "cell_type": "markdown",
940 "cell_type": "markdown",
941 "source": [
941 "source": [
942 "### Mathematics",
942 "### Mathematics",
943 "",
943 "",
944 "And we also support the display of mathematical expressions typeset in LaTeX, which is rendered",
944 "And we also support the display of mathematical expressions typeset in LaTeX, which is rendered",
945 "in the browser thanks to the [MathJax library](http://mathjax.org). ",
945 "in the browser thanks to the [MathJax library](http://mathjax.org). ",
946 "",
946 "",
947 "Note that this is *different* from the above examples. Above we were typing mathematical expressions",
947 "Note that this is *different* from the above examples. Above we were typing mathematical expressions",
948 "in Markdown cells (along with normal text) and letting the browser render them; now we are displaying",
948 "in Markdown cells (along with normal text) and letting the browser render them; now we are displaying",
949 "the output of a Python computation as a LaTeX expression wrapped by the `Math()` object so the browser",
949 "the output of a Python computation as a LaTeX expression wrapped by the `Math()` object so the browser",
950 "renders it. The `Math` object will add the needed LaTeX delimiters (`$$`) if they are not provided:"
950 "renders it. The `Math` object will add the needed LaTeX delimiters (`$$`) if they are not provided:"
951 ]
951 ]
952 },
952 },
953 {
953 {
954 "cell_type": "code",
954 "cell_type": "code",
955 "collapsed": false,
955 "collapsed": false,
956 "input": [
956 "input": [
957 "from IPython.core.display import Math",
957 "from IPython.core.display import Math",
958 "Math(r'F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx')"
958 "Math(r'F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx')"
959 ],
959 ],
960 "language": "python",
960 "language": "python",
961 "outputs": [
961 "outputs": [
962 {
962 {
963 "latex": [
963 "latex": [
964 "$$F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx$$"
964 "$$F(k) = \\int_{-\\infty}^{\\infty} f(x) e^{2\\pi i k} dx$$"
965 ],
965 ],
966 "output_type": "pyout",
966 "output_type": "pyout",
967 "prompt_number": 1,
967 "prompt_number": 1,
968 "text": [
968 "text": [
969 "<IPython.core.display.Math object at 0x10ad35e90>"
969 "<IPython.core.display.Math object at 0x10ad35e90>"
970 ]
970 ]
971 }
971 }
972 ],
972 ],
973 "prompt_number": 1
973 "prompt_number": 1
974 },
974 },
975 {
975 {
976 "cell_type": "markdown",
976 "cell_type": "markdown",
977 "source": [
977 "source": [
978 "With the `Latex` class, you have to include the delimiters yourself. This allows you to use other LaTeX modes such as `eqnarray`:"
978 "With the `Latex` class, you have to include the delimiters yourself. This allows you to use other LaTeX modes such as `eqnarray`:"
979 ]
979 ]
980 },
980 },
981 {
981 {
982 "cell_type": "code",
982 "cell_type": "code",
983 "collapsed": false,
983 "collapsed": false,
984 "input": [
984 "input": [
985 "from IPython.core.display import Latex",
985 "from IPython.core.display import Latex",
986 "Latex(r\"\"\"\\begin{eqnarray}",
986 "Latex(r\"\"\"\\begin{eqnarray}",
987 "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\",
987 "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\",
988 "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\",
988 "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\",
989 "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\",
989 "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\",
990 "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 ",
990 "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 ",
991 "\\end{eqnarray}\"\"\")"
991 "\\end{eqnarray}\"\"\")"
992 ],
992 ],
993 "language": "python",
993 "language": "python",
994 "outputs": [
994 "outputs": [
995 {
995 {
996 "latex": [
996 "latex": [
997 "\\begin{eqnarray}",
997 "\\begin{eqnarray}",
998 "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\ \\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\",
998 "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\ \\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\",
999 "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\",
999 "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\",
1000 "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 ",
1000 "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 ",
1001 "\\end{eqnarray}"
1001 "\\end{eqnarray}"
1002 ],
1002 ],
1003 "output_type": "pyout",
1003 "output_type": "pyout",
1004 "prompt_number": 5,
1004 "prompt_number": 5,
1005 "text": [
1005 "text": [
1006 "<IPython.core.display.Latex object at 0x109a38790>"
1006 "<IPython.core.display.Latex object at 0x109a38790>"
1007 ]
1007 ]
1008 }
1008 }
1009 ],
1009 ],
1010 "prompt_number": 5
1010 "prompt_number": 5
1011 },
1011 },
1012 {
1012 {
1013 "cell_type": "markdown",
1013 "cell_type": "markdown",
1014 "source": [
1014 "source": [
1015 "# Loading external codes",
1015 "# Loading external codes",
1016 "* Drag and drop a ``.py`` in the dashboard",
1016 "* Drag and drop a ``.py`` in the dashboard",
1017 "* Use ``%loadpy`` with any local or remote url: [the Matplotlib Gallery!](http://matplotlib.sourceforge.net/gallery.html)",
1017 "* Use ``%load`` with any local or remote url: [the Matplotlib Gallery!](http://matplotlib.sourceforge.net/gallery.html)",
1018 "",
1018 "",
1019 "In this notebook we've kept the output saved so you can see the result, but you should run the next",
1019 "In this notebook we've kept the output saved so you can see the result, but you should run the next",
1020 "cell yourself (with an active internet connection)."
1020 "cell yourself (with an active internet connection)."
1021 ]
1021 ]
1022 },
1022 },
1023 {
1023 {
1024 "cell_type": "code",
1024 "cell_type": "code",
1025 "collapsed": true,
1025 "collapsed": true,
1026 "input": [
1026 "input": [
1027 "%loadpy http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/integral_demo.py"
1027 "%load http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/integral_demo.py"
1028 ],
1028 ],
1029 "language": "python",
1029 "language": "python",
1030 "outputs": [],
1030 "outputs": [],
1031 "prompt_number": 8
1031 "prompt_number": 8
1032 },
1032 },
1033 {
1033 {
1034 "cell_type": "code",
1034 "cell_type": "code",
1035 "collapsed": false,
1035 "collapsed": false,
1036 "input": [
1036 "input": [
1037 "#!/usr/bin/env python",
1037 "#!/usr/bin/env python",
1038 "",
1038 "",
1039 "# implement the example graphs/integral from pyx",
1039 "# implement the example graphs/integral from pyx",
1040 "from pylab import *",
1040 "from pylab import *",
1041 "from matplotlib.patches import Polygon",
1041 "from matplotlib.patches import Polygon",
1042 "",
1042 "",
1043 "def func(x):",
1043 "def func(x):",
1044 " return (x-3)*(x-5)*(x-7)+85",
1044 " return (x-3)*(x-5)*(x-7)+85",
1045 "",
1045 "",
1046 "ax = subplot(111)",
1046 "ax = subplot(111)",
1047 "",
1047 "",
1048 "a, b = 2, 9 # integral area",
1048 "a, b = 2, 9 # integral area",
1049 "x = arange(0, 10, 0.01)",
1049 "x = arange(0, 10, 0.01)",
1050 "y = func(x)",
1050 "y = func(x)",
1051 "plot(x, y, linewidth=1)",
1051 "plot(x, y, linewidth=1)",
1052 "",
1052 "",
1053 "# make the shaded region",
1053 "# make the shaded region",
1054 "ix = arange(a, b, 0.01)",
1054 "ix = arange(a, b, 0.01)",
1055 "iy = func(ix)",
1055 "iy = func(ix)",
1056 "verts = [(a,0)] + zip(ix,iy) + [(b,0)]",
1056 "verts = [(a,0)] + zip(ix,iy) + [(b,0)]",
1057 "poly = Polygon(verts, facecolor='0.8', edgecolor='k')",
1057 "poly = Polygon(verts, facecolor='0.8', edgecolor='k')",
1058 "ax.add_patch(poly)",
1058 "ax.add_patch(poly)",
1059 "",
1059 "",
1060 "text(0.5 * (a + b), 30,",
1060 "text(0.5 * (a + b), 30,",
1061 " r\"$\\int_a^b f(x)\\mathrm{d}x$\", horizontalalignment='center',",
1061 " r\"$\\int_a^b f(x)\\mathrm{d}x$\", horizontalalignment='center',",
1062 " fontsize=20)",
1062 " fontsize=20)",
1063 "",
1063 "",
1064 "axis([0,10, 0, 180])",
1064 "axis([0,10, 0, 180])",
1065 "figtext(0.9, 0.05, 'x')",
1065 "figtext(0.9, 0.05, 'x')",
1066 "figtext(0.1, 0.9, 'y')",
1066 "figtext(0.1, 0.9, 'y')",
1067 "ax.set_xticks((a,b))",
1067 "ax.set_xticks((a,b))",
1068 "ax.set_xticklabels(('a','b'))",
1068 "ax.set_xticklabels(('a','b'))",
1069 "ax.set_yticks([])",
1069 "ax.set_yticks([])",
1070 "show()"
1070 "show()"
1071 ],
1071 ],
1072 "language": "python",
1072 "language": "python",
1073 "outputs": [
1073 "outputs": [
1074 {
1074 {
1075 "output_type": "display_data",
1075 "output_type": "display_data",
1076 "png": "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\nSUVORK5CYII=\n"
1076 "png": "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\nSUVORK5CYII=\n"
1077 }
1077 }
1078 ],
1078 ],
1079 "prompt_number": 9
1079 "prompt_number": 9
1080 },
1080 },
1081 {
1081 {
1082 "cell_type": "code",
1082 "cell_type": "code",
1083 "collapsed": true,
1083 "collapsed": true,
1084 "input": [
1084 "input": [
1085 ""
1085 ""
1086 ],
1086 ],
1087 "language": "python",
1087 "language": "python",
1088 "outputs": []
1088 "outputs": []
1089 }
1089 }
1090 ]
1090 ]
1091 }
1091 }
1092 ]
1092 ]
1093 }
1093 }
@@ -1,31 +1,31 b''
1 """
1 """
2 Run this script in the qtconsole with one of:
2 Run this script in the qtconsole with one of:
3
3
4 %loadpy hb_gil.py
4 %load hb_gil.py
5
5
6 or
6 or
7 %run hb_gil.py
7 %run hb_gil.py
8
8
9 Holding the GIL for too long could disrupt the heartbeat.
9 Holding the GIL for too long could disrupt the heartbeat.
10
10
11 See Issue #1260: https://github.com/ipython/ipython/issues/1260
11 See Issue #1260: https://github.com/ipython/ipython/issues/1260
12
12
13 """
13 """
14
14
15 import sys
15 import sys
16 import time
16 import time
17
17
18 from cython import inline
18 from cython import inline
19
19
20 def gilsleep(t):
20 def gilsleep(t):
21 """gil-holding sleep with cython.inline"""
21 """gil-holding sleep with cython.inline"""
22 code = '\n'.join([
22 code = '\n'.join([
23 'from posix cimport unistd',
23 'from posix cimport unistd',
24 'unistd.sleep(t)',
24 'unistd.sleep(t)',
25 ])
25 ])
26 while True:
26 while True:
27 inline(code, quiet=True, t=t)
27 inline(code, quiet=True, t=t)
28 print(time.time())
28 print(time.time())
29 sys.stdout.flush() # this is important
29 sys.stdout.flush() # this is important
30
30
31 gilsleep(5)
31 gilsleep(5)
@@ -1,609 +1,609 b''
1 .. _qtconsole:
1 .. _qtconsole:
2
2
3 =========================
3 =========================
4 A Qt Console for IPython
4 A Qt Console for IPython
5 =========================
5 =========================
6
6
7 We now have a version of IPython, using the new two-process :ref:`ZeroMQ Kernel
7 We now have a version of IPython, using the new two-process :ref:`ZeroMQ Kernel
8 <ipythonzmq>`, running in a PyQt_ GUI. This is a very lightweight widget that
8 <ipythonzmq>`, running in a PyQt_ GUI. This is a very lightweight widget that
9 largely feels like a terminal, but provides a number of enhancements only
9 largely feels like a terminal, but provides a number of enhancements only
10 possible in a GUI, such as inline figures, proper multiline editing with syntax
10 possible in a GUI, such as inline figures, proper multiline editing with syntax
11 highlighting, graphical calltips, and much more.
11 highlighting, graphical calltips, and much more.
12
12
13 .. figure:: ../_static/qtconsole.png
13 .. figure:: ../_static/qtconsole.png
14 :width: 400px
14 :width: 400px
15 :alt: IPython Qt console with embedded plots
15 :alt: IPython Qt console with embedded plots
16 :align: center
16 :align: center
17 :target: ../_static/qtconsole.png
17 :target: ../_static/qtconsole.png
18
18
19 The Qt console for IPython, using inline matplotlib plots.
19 The Qt console for IPython, using inline matplotlib plots.
20
20
21 To get acquainted with the Qt console, type `%guiref` to see a quick
21 To get acquainted with the Qt console, type `%guiref` to see a quick
22 introduction of its main features.
22 introduction of its main features.
23
23
24 The Qt frontend has hand-coded emacs-style bindings for text navigation. This
24 The Qt frontend has hand-coded emacs-style bindings for text navigation. This
25 is not yet configurable.
25 is not yet configurable.
26
26
27 .. tip::
27 .. tip::
28
28
29 Since the Qt console tries hard to behave like a terminal, by default it
29 Since the Qt console tries hard to behave like a terminal, by default it
30 immediately executes single lines of input that are complete. If you want
30 immediately executes single lines of input that are complete. If you want
31 to force multiline input, hit :kbd:`Ctrl-Enter` at the end of the first line
31 to force multiline input, hit :kbd:`Ctrl-Enter` at the end of the first line
32 instead of :kbd:`Enter`, and it will open a new line for input. At any
32 instead of :kbd:`Enter`, and it will open a new line for input. At any
33 point in a multiline block, you can force its execution (without having to
33 point in a multiline block, you can force its execution (without having to
34 go to the bottom) with :kbd:`Shift-Enter`.
34 go to the bottom) with :kbd:`Shift-Enter`.
35
35
36 ``%loadpy``
36 ``%load``
37 ===========
37 =========
38
38
39 The new ``%loadpy`` magic takes any python script (must end in '.py'), and
39 The new ``%load`` magic (previously ``%loadpy``) takes any script, and pastes
40 pastes its contents as your next input, so you can edit it before
40 its contents as your next input, so you can edit it before executing. The
41 executing. The script may be on your machine, but you can also specify a url,
41 script may be on your machine, but you can also specify an history range, or a
42 and it will download the script from the web. This is particularly useful for
42 url, and it will download the script from the web. This is particularly useful
43 playing with examples from documentation, such as matplotlib.
43 for playing with examples from documentation, such as matplotlib.
44
44
45 .. sourcecode:: ipython
45 .. sourcecode:: ipython
46
46
47 In [6]: %loadpy http://matplotlib.sourceforge.net/plot_directive/mpl_examples/mplot3d/contour3d_demo.py
47 In [6]: %load http://matplotlib.sourceforge.net/plot_directive/mpl_examples/mplot3d/contour3d_demo.py
48
48
49 In [7]: from mpl_toolkits.mplot3d import axes3d
49 In [7]: from mpl_toolkits.mplot3d import axes3d
50 ...: import matplotlib.pyplot as plt
50 ...: import matplotlib.pyplot as plt
51 ...:
51 ...:
52 ...: fig = plt.figure()
52 ...: fig = plt.figure()
53 ...: ax = fig.add_subplot(111, projection='3d')
53 ...: ax = fig.add_subplot(111, projection='3d')
54 ...: X, Y, Z = axes3d.get_test_data(0.05)
54 ...: X, Y, Z = axes3d.get_test_data(0.05)
55 ...: cset = ax.contour(X, Y, Z)
55 ...: cset = ax.contour(X, Y, Z)
56 ...: ax.clabel(cset, fontsize=9, inline=1)
56 ...: ax.clabel(cset, fontsize=9, inline=1)
57 ...:
57 ...:
58 ...: plt.show()
58 ...: plt.show()
59
59
60 Pylab
60 Pylab
61 =====
61 =====
62
62
63 One of the most exciting features of the new console is embedded matplotlib
63 One of the most exciting features of the new console is embedded matplotlib
64 figures. You can use any standard matplotlib GUI backend
64 figures. You can use any standard matplotlib GUI backend
65 to draw the figures, and since there is now a two-process model, there is no
65 to draw the figures, and since there is now a two-process model, there is no
66 longer a conflict between user input and the drawing eventloop.
66 longer a conflict between user input and the drawing eventloop.
67
67
68 .. image:: figs/besselj.png
68 .. image:: figs/besselj.png
69 :width: 519px
69 :width: 519px
70
70
71 .. display:
71 .. display:
72
72
73 :func:`display`
73 :func:`display`
74 ***************
74 ***************
75
75
76 An additional function, :func:`display`, will be added to the global namespace
76 An additional function, :func:`display`, will be added to the global namespace
77 if you specify the ``--pylab`` option at the command line. The IPython display
77 if you specify the ``--pylab`` option at the command line. The IPython display
78 system provides a mechanism for specifying PNG or SVG (and more)
78 system provides a mechanism for specifying PNG or SVG (and more)
79 representations of objects for GUI frontends. By default, IPython registers
79 representations of objects for GUI frontends. By default, IPython registers
80 convenient PNG and SVG renderers for matplotlib figures, so you can embed them
80 convenient PNG and SVG renderers for matplotlib figures, so you can embed them
81 in your document by calling :func:`display` on one or more of them. This is
81 in your document by calling :func:`display` on one or more of them. This is
82 especially useful for saving_ your work.
82 especially useful for saving_ your work.
83
83
84 .. sourcecode:: ipython
84 .. sourcecode:: ipython
85
85
86 In [5]: plot(range(5)) # plots in the matplotlib window
86 In [5]: plot(range(5)) # plots in the matplotlib window
87
87
88 In [6]: display(gcf()) # embeds the current figure in the qtconsole
88 In [6]: display(gcf()) # embeds the current figure in the qtconsole
89
89
90 In [7]: display(*getfigs()) # embeds all active figures in the qtconsole
90 In [7]: display(*getfigs()) # embeds all active figures in the qtconsole
91
91
92 If you have a reference to a matplotlib figure object, you can always display
92 If you have a reference to a matplotlib figure object, you can always display
93 that specific figure:
93 that specific figure:
94
94
95 .. sourcecode:: ipython
95 .. sourcecode:: ipython
96
96
97 In [1]: f = figure()
97 In [1]: f = figure()
98
98
99 In [2]: plot(rand(100))
99 In [2]: plot(rand(100))
100 Out[2]: [<matplotlib.lines.Line2D at 0x7fc6ac03dd90>]
100 Out[2]: [<matplotlib.lines.Line2D at 0x7fc6ac03dd90>]
101
101
102 In [3]: display(f)
102 In [3]: display(f)
103
103
104 # Plot is shown here
104 # Plot is shown here
105
105
106 In [4]: title('A title')
106 In [4]: title('A title')
107 Out[4]: <matplotlib.text.Text at 0x7fc6ac023450>
107 Out[4]: <matplotlib.text.Text at 0x7fc6ac023450>
108
108
109 In [5]: display(f)
109 In [5]: display(f)
110
110
111 # Updated plot with title is shown here.
111 # Updated plot with title is shown here.
112
112
113 .. _inline:
113 .. _inline:
114
114
115 ``--pylab=inline``
115 ``--pylab=inline``
116 ******************
116 ******************
117
117
118 If you want to have all of your figures embedded in your session, instead of
118 If you want to have all of your figures embedded in your session, instead of
119 calling :func:`display`, you can specify ``--pylab=inline`` when you start the
119 calling :func:`display`, you can specify ``--pylab=inline`` when you start the
120 console, and each time you make a plot, it will show up in your document, as if
120 console, and each time you make a plot, it will show up in your document, as if
121 you had called :func:`display(fig)`.
121 you had called :func:`display(fig)`.
122
122
123 The inline backend can use either SVG or PNG figures (PNG being the default).
123 The inline backend can use either SVG or PNG figures (PNG being the default).
124 To switch between them, set the ``InlineBackend.figure_format`` configurable
124 To switch between them, set the ``InlineBackend.figure_format`` configurable
125 in a config file, or via the ``%config`` magic:
125 in a config file, or via the ``%config`` magic:
126
126
127 .. sourcecode:: ipython
127 .. sourcecode:: ipython
128
128
129 In [10]: %config InlineBackend.figure_format = 'svg'
129 In [10]: %config InlineBackend.figure_format = 'svg'
130
130
131 .. note::
131 .. note::
132
132
133 Changing the inline figure format also affects calls to :func:`display` above,
133 Changing the inline figure format also affects calls to :func:`display` above,
134 even if you are not using the inline backend for all figures.
134 even if you are not using the inline backend for all figures.
135
135
136 By default, IPython closes all figures at the completion of each execution. This means you
136 By default, IPython closes all figures at the completion of each execution. This means you
137 don't have to manually close figures, which is less convenient when figures aren't attached
137 don't have to manually close figures, which is less convenient when figures aren't attached
138 to windows with an obvious close button. It also means that the first matplotlib call in
138 to windows with an obvious close button. It also means that the first matplotlib call in
139 each cell will always create a new figure:
139 each cell will always create a new figure:
140
140
141 .. sourcecode:: ipython
141 .. sourcecode:: ipython
142
142
143 In [11]: plot(range(100))
143 In [11]: plot(range(100))
144 <single-line plot>
144 <single-line plot>
145
145
146 In [12]: plot([1,3,2])
146 In [12]: plot([1,3,2])
147 <another single-line plot>
147 <another single-line plot>
148
148
149
149
150 However, it does prevent the list of active figures surviving from one input cell to the
150 However, it does prevent the list of active figures surviving from one input cell to the
151 next, so if you want to continue working with a figure, you must hold on to a reference to
151 next, so if you want to continue working with a figure, you must hold on to a reference to
152 it:
152 it:
153
153
154 .. sourcecode:: ipython
154 .. sourcecode:: ipython
155
155
156 In [11]: fig = gcf()
156 In [11]: fig = gcf()
157 ....: fig.plot(rand(100))
157 ....: fig.plot(rand(100))
158 <plot>
158 <plot>
159 In [12]: fig.title('Random Title')
159 In [12]: fig.title('Random Title')
160 <redraw plot with title>
160 <redraw plot with title>
161
161
162 This behavior is controlled by the :attr:`InlineBackend.close_figures` configurable, and
162 This behavior is controlled by the :attr:`InlineBackend.close_figures` configurable, and
163 if you set it to False, via %config or config file, then IPython will *not* close figures,
163 if you set it to False, via %config or config file, then IPython will *not* close figures,
164 and tools like :func:`gcf`, :func:`gca`, :func:`getfigs` will behave the same as they
164 and tools like :func:`gcf`, :func:`gca`, :func:`getfigs` will behave the same as they
165 do with other backends. You will, however, have to manually close figures:
165 do with other backends. You will, however, have to manually close figures:
166
166
167 .. sourcecode:: ipython
167 .. sourcecode:: ipython
168
168
169 # close all active figures:
169 # close all active figures:
170 In [13]: [ fig.close() for fig in getfigs() ]
170 In [13]: [ fig.close() for fig in getfigs() ]
171
171
172
172
173
173
174 .. _saving:
174 .. _saving:
175
175
176 Saving and Printing
176 Saving and Printing
177 ===================
177 ===================
178
178
179 IPythonQt has the ability to save your current session, as either HTML or
179 IPythonQt has the ability to save your current session, as either HTML or
180 XHTML. If you have been using :func:`display` or inline_ pylab, your figures
180 XHTML. If you have been using :func:`display` or inline_ pylab, your figures
181 will be PNG in HTML, or inlined as SVG in XHTML. PNG images have the option to
181 will be PNG in HTML, or inlined as SVG in XHTML. PNG images have the option to
182 be either in an external folder, as in many browsers' "Webpage, Complete"
182 be either in an external folder, as in many browsers' "Webpage, Complete"
183 option, or inlined as well, for a larger, but more portable file.
183 option, or inlined as well, for a larger, but more portable file.
184
184
185 .. note::
185 .. note::
186
186
187 Export to SVG+XHTML requires that you are using SVG figures, which is *not*
187 Export to SVG+XHTML requires that you are using SVG figures, which is *not*
188 the default. To switch the inline figure format to use SVG during an active
188 the default. To switch the inline figure format to use SVG during an active
189 session, do:
189 session, do:
190
190
191 .. sourcecode:: ipython
191 .. sourcecode:: ipython
192
192
193 In [10]: %config InlineBackend.figure_format = 'svg'
193 In [10]: %config InlineBackend.figure_format = 'svg'
194
194
195 Or, you can add the same line (c.Inline... instead of %config Inline...) to
195 Or, you can add the same line (c.Inline... instead of %config Inline...) to
196 your config files.
196 your config files.
197
197
198 This will only affect figures plotted after making this call
198 This will only affect figures plotted after making this call
199
199
200
200
201 The widget also exposes the ability to print directly, via the default print
201 The widget also exposes the ability to print directly, via the default print
202 shortcut or context menu.
202 shortcut or context menu.
203
203
204
204
205 .. Note::
205 .. Note::
206
206
207 Saving is only available to richtext Qt widgets, which are used by default,
207 Saving is only available to richtext Qt widgets, which are used by default,
208 but if you pass the ``--plain`` flag, saving will not be available to you.
208 but if you pass the ``--plain`` flag, saving will not be available to you.
209
209
210
210
211 See these examples of :download:`png/html<figs/jn.html>` and
211 See these examples of :download:`png/html<figs/jn.html>` and
212 :download:`svg/xhtml <figs/jn.xhtml>` output. Note that syntax highlighting
212 :download:`svg/xhtml <figs/jn.xhtml>` output. Note that syntax highlighting
213 does not survive export. This is a known issue, and is being investigated.
213 does not survive export. This is a known issue, and is being investigated.
214
214
215
215
216 Colors and Highlighting
216 Colors and Highlighting
217 =======================
217 =======================
218
218
219 Terminal IPython has always had some coloring, but never syntax
219 Terminal IPython has always had some coloring, but never syntax
220 highlighting. There are a few simple color choices, specified by the ``colors``
220 highlighting. There are a few simple color choices, specified by the ``colors``
221 flag or ``%colors`` magic:
221 flag or ``%colors`` magic:
222
222
223 * LightBG for light backgrounds
223 * LightBG for light backgrounds
224 * Linux for dark backgrounds
224 * Linux for dark backgrounds
225 * NoColor for a simple colorless terminal
225 * NoColor for a simple colorless terminal
226
226
227 The Qt widget has full support for the ``colors`` flag used in the terminal shell.
227 The Qt widget has full support for the ``colors`` flag used in the terminal shell.
228
228
229 The Qt widget, however, has full syntax highlighting as you type, handled by
229 The Qt widget, however, has full syntax highlighting as you type, handled by
230 the `pygments`_ library. The ``style`` argument exposes access to any style by
230 the `pygments`_ library. The ``style`` argument exposes access to any style by
231 name that can be found by pygments, and there are several already
231 name that can be found by pygments, and there are several already
232 installed. The ``colors`` argument, if unspecified, will be guessed based on
232 installed. The ``colors`` argument, if unspecified, will be guessed based on
233 the chosen style. Similarly, there are default styles associated with each
233 the chosen style. Similarly, there are default styles associated with each
234 ``colors`` option.
234 ``colors`` option.
235
235
236
236
237 Screenshot of ``ipython qtconsole --colors=linux``, which uses the 'monokai'
237 Screenshot of ``ipython qtconsole --colors=linux``, which uses the 'monokai'
238 theme by default:
238 theme by default:
239
239
240 .. image:: figs/colors_dark.png
240 .. image:: figs/colors_dark.png
241 :width: 627px
241 :width: 627px
242
242
243 .. Note::
243 .. Note::
244
244
245 Calling ``ipython qtconsole -h`` will show all the style names that
245 Calling ``ipython qtconsole -h`` will show all the style names that
246 pygments can find on your system.
246 pygments can find on your system.
247
247
248 You can also pass the filename of a custom CSS stylesheet, if you want to do
248 You can also pass the filename of a custom CSS stylesheet, if you want to do
249 your own coloring, via the ``stylesheet`` argument. The default LightBG
249 your own coloring, via the ``stylesheet`` argument. The default LightBG
250 stylesheet:
250 stylesheet:
251
251
252 .. sourcecode:: css
252 .. sourcecode:: css
253
253
254 QPlainTextEdit, QTextEdit { background-color: white;
254 QPlainTextEdit, QTextEdit { background-color: white;
255 color: black ;
255 color: black ;
256 selection-background-color: #ccc}
256 selection-background-color: #ccc}
257 .error { color: red; }
257 .error { color: red; }
258 .in-prompt { color: navy; }
258 .in-prompt { color: navy; }
259 .in-prompt-number { font-weight: bold; }
259 .in-prompt-number { font-weight: bold; }
260 .out-prompt { color: darkred; }
260 .out-prompt { color: darkred; }
261 .out-prompt-number { font-weight: bold; }
261 .out-prompt-number { font-weight: bold; }
262
262
263 Fonts
263 Fonts
264 =====
264 =====
265
265
266 The QtConsole has configurable via the ConsoleWidget. To change these, set the
266 The QtConsole has configurable via the ConsoleWidget. To change these, set the
267 ``font_family`` or ``font_size`` traits of the ConsoleWidget. For instance, to
267 ``font_family`` or ``font_size`` traits of the ConsoleWidget. For instance, to
268 use 9pt Anonymous Pro::
268 use 9pt Anonymous Pro::
269
269
270 $> ipython qtconsole --ConsoleWidget.font_family="Anonymous Pro" --ConsoleWidget.font_size=9
270 $> ipython qtconsole --ConsoleWidget.font_family="Anonymous Pro" --ConsoleWidget.font_size=9
271
271
272 Process Management
272 Process Management
273 ==================
273 ==================
274
274
275 With the two-process ZMQ model, the frontend does not block input during
275 With the two-process ZMQ model, the frontend does not block input during
276 execution. This means that actions can be taken by the frontend while the
276 execution. This means that actions can be taken by the frontend while the
277 Kernel is executing, or even after it crashes. The most basic such command is
277 Kernel is executing, or even after it crashes. The most basic such command is
278 via 'Ctrl-.', which restarts the kernel. This can be done in the middle of a
278 via 'Ctrl-.', which restarts the kernel. This can be done in the middle of a
279 blocking execution. The frontend can also know, via a heartbeat mechanism, that
279 blocking execution. The frontend can also know, via a heartbeat mechanism, that
280 the kernel has died. This means that the frontend can safely restart the
280 the kernel has died. This means that the frontend can safely restart the
281 kernel.
281 kernel.
282
282
283 .. _multiple_consoles:
283 .. _multiple_consoles:
284
284
285 Multiple Consoles
285 Multiple Consoles
286 *****************
286 *****************
287
287
288 Since the Kernel listens on the network, multiple frontends can connect to it.
288 Since the Kernel listens on the network, multiple frontends can connect to it.
289 These do not have to all be qt frontends - any IPython frontend can connect and
289 These do not have to all be qt frontends - any IPython frontend can connect and
290 run code. When you start ipython qtconsole, there will be an output line,
290 run code. When you start ipython qtconsole, there will be an output line,
291 like::
291 like::
292
292
293 [IPKernelApp] To connect another client to this kernel, use:
293 [IPKernelApp] To connect another client to this kernel, use:
294 [IPKernelApp] --existing kernel-12345.json
294 [IPKernelApp] --existing kernel-12345.json
295
295
296 Other frontends can connect to your kernel, and share in the execution. This is
296 Other frontends can connect to your kernel, and share in the execution. This is
297 great for collaboration. The ``--existing`` flag means connect to a kernel
297 great for collaboration. The ``--existing`` flag means connect to a kernel
298 that already exists. Starting other consoles
298 that already exists. Starting other consoles
299 with that flag will not try to start their own kernel, but rather connect to
299 with that flag will not try to start their own kernel, but rather connect to
300 yours. :file:`kernel-12345.json` is a small JSON file with the ip, port, and
300 yours. :file:`kernel-12345.json` is a small JSON file with the ip, port, and
301 authentication information necessary to connect to your kernel. By default, this file
301 authentication information necessary to connect to your kernel. By default, this file
302 will be in your default profile's security directory. If it is somewhere else,
302 will be in your default profile's security directory. If it is somewhere else,
303 the output line will print the full path of the connection file, rather than
303 the output line will print the full path of the connection file, rather than
304 just its filename.
304 just its filename.
305
305
306 If you need to find the connection info to send, and don't know where your connection file
306 If you need to find the connection info to send, and don't know where your connection file
307 lives, there are a couple of ways to get it. If you are already running an IPython console
307 lives, there are a couple of ways to get it. If you are already running an IPython console
308 connected to the kernel, you can use the ``%connect_info`` magic to display the information
308 connected to the kernel, you can use the ``%connect_info`` magic to display the information
309 necessary to connect another frontend to the kernel.
309 necessary to connect another frontend to the kernel.
310
310
311 .. sourcecode:: ipython
311 .. sourcecode:: ipython
312
312
313 In [2]: %connect_info
313 In [2]: %connect_info
314 {
314 {
315 "stdin_port":50255,
315 "stdin_port":50255,
316 "ip":"127.0.0.1",
316 "ip":"127.0.0.1",
317 "hb_port":50256,
317 "hb_port":50256,
318 "key":"70be6f0f-1564-4218-8cda-31be40a4d6aa",
318 "key":"70be6f0f-1564-4218-8cda-31be40a4d6aa",
319 "shell_port":50253,
319 "shell_port":50253,
320 "iopub_port":50254
320 "iopub_port":50254
321 }
321 }
322
322
323 Paste the above JSON into a file, and connect with:
323 Paste the above JSON into a file, and connect with:
324 $> ipython <app> --existing <file>
324 $> ipython <app> --existing <file>
325 or, if you are local, you can connect with just:
325 or, if you are local, you can connect with just:
326 $> ipython <app> --existing kernel-12345.json
326 $> ipython <app> --existing kernel-12345.json
327 or even just:
327 or even just:
328 $> ipython <app> --existing
328 $> ipython <app> --existing
329 if this is the most recent IPython session you have started.
329 if this is the most recent IPython session you have started.
330
330
331 Otherwise, you can find a connection file by name (and optionally profile) with
331 Otherwise, you can find a connection file by name (and optionally profile) with
332 :func:`IPython.lib.kernel.find_connection_file`:
332 :func:`IPython.lib.kernel.find_connection_file`:
333
333
334 .. sourcecode:: bash
334 .. sourcecode:: bash
335
335
336 $> python -c "from IPython.lib.kernel import find_connection_file;\
336 $> python -c "from IPython.lib.kernel import find_connection_file;\
337 print find_connection_file('kernel-12345.json')"
337 print find_connection_file('kernel-12345.json')"
338 /home/you/.ipython/profile_default/security/kernel-12345.json
338 /home/you/.ipython/profile_default/security/kernel-12345.json
339
339
340 And if you are using a particular IPython profile:
340 And if you are using a particular IPython profile:
341
341
342 .. sourcecode:: bash
342 .. sourcecode:: bash
343
343
344 $> python -c "from IPython.lib.kernel import find_connection_file;\
344 $> python -c "from IPython.lib.kernel import find_connection_file;\
345 print find_connection_file('kernel-12345.json', profile='foo')"
345 print find_connection_file('kernel-12345.json', profile='foo')"
346 /home/you/.ipython/profile_foo/security/kernel-12345.json
346 /home/you/.ipython/profile_foo/security/kernel-12345.json
347
347
348 You can even launch a standalone kernel, and connect and disconnect Qt Consoles
348 You can even launch a standalone kernel, and connect and disconnect Qt Consoles
349 from various machines. This lets you keep the same running IPython session
349 from various machines. This lets you keep the same running IPython session
350 on your work machine (with matplotlib plots and everything), logging in from home,
350 on your work machine (with matplotlib plots and everything), logging in from home,
351 cafΓ©s, etc.::
351 cafΓ©s, etc.::
352
352
353 $> ipython kernel
353 $> ipython kernel
354 [IPKernelApp] To connect another client to this kernel, use:
354 [IPKernelApp] To connect another client to this kernel, use:
355 [IPKernelApp] --existing kernel-12345.json
355 [IPKernelApp] --existing kernel-12345.json
356
356
357 This is actually exactly the same as the subprocess launched by the qtconsole, so
357 This is actually exactly the same as the subprocess launched by the qtconsole, so
358 all the information about connecting to a standalone kernel is identical to that
358 all the information about connecting to a standalone kernel is identical to that
359 of connecting to the kernel attached to a running console.
359 of connecting to the kernel attached to a running console.
360
360
361 .. _kernel_security:
361 .. _kernel_security:
362
362
363 Security
363 Security
364 --------
364 --------
365
365
366 .. warning::
366 .. warning::
367
367
368 Since the ZMQ code currently has no encryption, listening on an
368 Since the ZMQ code currently has no encryption, listening on an
369 external-facing IP is dangerous. You are giving any computer that can see
369 external-facing IP is dangerous. You are giving any computer that can see
370 you on the network the ability to connect to your kernel, and view your traffic.
370 you on the network the ability to connect to your kernel, and view your traffic.
371 Read the rest of this section before listening on external ports
371 Read the rest of this section before listening on external ports
372 or running an IPython kernel on a shared machine.
372 or running an IPython kernel on a shared machine.
373
373
374 By default (for security reasons), the kernel only listens on localhost, so you
374 By default (for security reasons), the kernel only listens on localhost, so you
375 can only connect multiple frontends to the kernel from your local machine. You
375 can only connect multiple frontends to the kernel from your local machine. You
376 can specify to listen on an external interface by specifying the ``ip``
376 can specify to listen on an external interface by specifying the ``ip``
377 argument::
377 argument::
378
378
379 $> ipython qtconsole --ip=192.168.1.123
379 $> ipython qtconsole --ip=192.168.1.123
380
380
381 If you specify the ip as 0.0.0.0 or '*', that means all interfaces, so any
381 If you specify the ip as 0.0.0.0 or '*', that means all interfaces, so any
382 computer that can see yours on the network can connect to the kernel.
382 computer that can see yours on the network can connect to the kernel.
383
383
384 Messages are not encrypted, so users with access to the ports your kernel is using will be
384 Messages are not encrypted, so users with access to the ports your kernel is using will be
385 able to see any output of the kernel. They will **NOT** be able to issue shell commands as
385 able to see any output of the kernel. They will **NOT** be able to issue shell commands as
386 you due to message signatures, which are enabled by default as of IPython 0.12.
386 you due to message signatures, which are enabled by default as of IPython 0.12.
387
387
388 .. warning::
388 .. warning::
389
389
390 If you disable message signatures, then any user with access to the ports your
390 If you disable message signatures, then any user with access to the ports your
391 kernel is listening on can issue arbitrary code as you. **DO NOT** disable message
391 kernel is listening on can issue arbitrary code as you. **DO NOT** disable message
392 signatures unless you have a lot of trust in your environment.
392 signatures unless you have a lot of trust in your environment.
393
393
394 The one security feature IPython does provide is protection from unauthorized execution.
394 The one security feature IPython does provide is protection from unauthorized execution.
395 IPython's messaging system will sign messages with HMAC digests using a shared-key. The key
395 IPython's messaging system will sign messages with HMAC digests using a shared-key. The key
396 is never sent over the network, it is only used to generate a unique hash for each message,
396 is never sent over the network, it is only used to generate a unique hash for each message,
397 based on its content. When IPython receives a message, it will check that the digest
397 based on its content. When IPython receives a message, it will check that the digest
398 matches, and discard the message. You can use any file that only you have access to to
398 matches, and discard the message. You can use any file that only you have access to to
399 generate this key, but the default is just to generate a new UUID. You can generate a random
399 generate this key, but the default is just to generate a new UUID. You can generate a random
400 private key with::
400 private key with::
401
401
402 # generate 1024b of random data, and store in a file only you can read:
402 # generate 1024b of random data, and store in a file only you can read:
403 # (assumes IPYTHONDIR is defined, otherwise use your IPython directory)
403 # (assumes IPYTHONDIR is defined, otherwise use your IPython directory)
404 $> python -c "import os; print os.urandom(128).encode('base64')" > $IPYTHONDIR/sessionkey
404 $> python -c "import os; print os.urandom(128).encode('base64')" > $IPYTHONDIR/sessionkey
405 $> chmod 600 $IPYTHONDIR/sessionkey
405 $> chmod 600 $IPYTHONDIR/sessionkey
406
406
407 The *contents* of this file will be stored in the JSON connection file, so that file
407 The *contents* of this file will be stored in the JSON connection file, so that file
408 contains everything you need to connect to and use a kernel.
408 contains everything you need to connect to and use a kernel.
409
409
410 To use this generated key, simply specify the ``Session.keyfile`` configurable
410 To use this generated key, simply specify the ``Session.keyfile`` configurable
411 in :file:`ipython_config.py` or at the command-line, as in::
411 in :file:`ipython_config.py` or at the command-line, as in::
412
412
413 # instruct IPython to sign messages with that key, instead of a new UUID
413 # instruct IPython to sign messages with that key, instead of a new UUID
414 $> ipython qtconsole --Session.keyfile=$IPYTHONDIR/sessionkey
414 $> ipython qtconsole --Session.keyfile=$IPYTHONDIR/sessionkey
415
415
416 .. _ssh_tunnels:
416 .. _ssh_tunnels:
417
417
418 SSH Tunnels
418 SSH Tunnels
419 -----------
419 -----------
420
420
421 Sometimes you want to connect to machines across the internet, or just across
421 Sometimes you want to connect to machines across the internet, or just across
422 a LAN that either doesn't permit open ports or you don't trust the other
422 a LAN that either doesn't permit open ports or you don't trust the other
423 machines on the network. To do this, you can use SSH tunnels. SSH tunnels
423 machines on the network. To do this, you can use SSH tunnels. SSH tunnels
424 are a way to securely forward ports on your local machine to ports on another
424 are a way to securely forward ports on your local machine to ports on another
425 machine, to which you have SSH access.
425 machine, to which you have SSH access.
426
426
427 In simple cases, IPython's tools can forward ports over ssh by simply adding the
427 In simple cases, IPython's tools can forward ports over ssh by simply adding the
428 ``--ssh=remote`` argument to the usual ``--existing...`` set of flags for connecting
428 ``--ssh=remote`` argument to the usual ``--existing...`` set of flags for connecting
429 to a running kernel, after copying the JSON connection file (or its contents) to
429 to a running kernel, after copying the JSON connection file (or its contents) to
430 the second computer.
430 the second computer.
431
431
432 .. warning::
432 .. warning::
433
433
434 Using SSH tunnels does *not* increase localhost security. In fact, when
434 Using SSH tunnels does *not* increase localhost security. In fact, when
435 tunneling from one machine to another *both* machines have open
435 tunneling from one machine to another *both* machines have open
436 ports on localhost available for connections to the kernel.
436 ports on localhost available for connections to the kernel.
437
437
438 There are two primary models for using SSH tunnels with IPython. The first
438 There are two primary models for using SSH tunnels with IPython. The first
439 is to have the Kernel listen only on localhost, and connect to it from
439 is to have the Kernel listen only on localhost, and connect to it from
440 another machine on the same LAN.
440 another machine on the same LAN.
441
441
442 First, let's start a kernel on machine **worker**, listening only
442 First, let's start a kernel on machine **worker**, listening only
443 on loopback::
443 on loopback::
444
444
445 user@worker $> ipython kernel
445 user@worker $> ipython kernel
446 [IPKernelApp] To connect another client to this kernel, use:
446 [IPKernelApp] To connect another client to this kernel, use:
447 [IPKernelApp] --existing kernel-12345.json
447 [IPKernelApp] --existing kernel-12345.json
448
448
449 In this case, the IP that you would connect
449 In this case, the IP that you would connect
450 to would still be 127.0.0.1, but you want to specify the additional ``--ssh`` argument
450 to would still be 127.0.0.1, but you want to specify the additional ``--ssh`` argument
451 with the hostname of the kernel (in this example, it's 'worker')::
451 with the hostname of the kernel (in this example, it's 'worker')::
452
452
453 user@client $> ipython qtconsole --ssh=worker --existing /path/to/kernel-12345.json
453 user@client $> ipython qtconsole --ssh=worker --existing /path/to/kernel-12345.json
454
454
455 Which will write a new connection file with the forwarded ports, so you can reuse them::
455 Which will write a new connection file with the forwarded ports, so you can reuse them::
456
456
457 [IPythonQtConsoleApp] To connect another client via this tunnel, use:
457 [IPythonQtConsoleApp] To connect another client via this tunnel, use:
458 [IPythonQtConsoleApp] --existing kernel-12345-ssh.json
458 [IPythonQtConsoleApp] --existing kernel-12345-ssh.json
459
459
460 Note again that this opens ports on the *client* machine that point to your kernel.
460 Note again that this opens ports on the *client* machine that point to your kernel.
461
461
462 .. note::
462 .. note::
463
463
464 the ssh argument is simply passed to openssh, so it can be fully specified ``user@host:port``
464 the ssh argument is simply passed to openssh, so it can be fully specified ``user@host:port``
465 but it will also respect your aliases, etc. in :file:`.ssh/config` if you have any.
465 but it will also respect your aliases, etc. in :file:`.ssh/config` if you have any.
466
466
467 The second pattern is for connecting to a machine behind a firewall across the internet
467 The second pattern is for connecting to a machine behind a firewall across the internet
468 (or otherwise wide network). This time, we have a machine **login** that you have ssh access
468 (or otherwise wide network). This time, we have a machine **login** that you have ssh access
469 to, which can see **kernel**, but **client** is on another network. The important difference
469 to, which can see **kernel**, but **client** is on another network. The important difference
470 now is that **client** can see **login**, but *not* **worker**. So we need to forward ports from
470 now is that **client** can see **login**, but *not* **worker**. So we need to forward ports from
471 client to worker *via* login. This means that the kernel must be started listening
471 client to worker *via* login. This means that the kernel must be started listening
472 on external interfaces, so that its ports are visible to `login`::
472 on external interfaces, so that its ports are visible to `login`::
473
473
474 user@worker $> ipython kernel --ip=0.0.0.0
474 user@worker $> ipython kernel --ip=0.0.0.0
475 [IPKernelApp] To connect another client to this kernel, use:
475 [IPKernelApp] To connect another client to this kernel, use:
476 [IPKernelApp] --existing kernel-12345.json
476 [IPKernelApp] --existing kernel-12345.json
477
477
478 Which we can connect to from the client with::
478 Which we can connect to from the client with::
479
479
480 user@client $> ipython qtconsole --ssh=login --ip=192.168.1.123 --existing /path/to/kernel-12345.json
480 user@client $> ipython qtconsole --ssh=login --ip=192.168.1.123 --existing /path/to/kernel-12345.json
481
481
482 .. note::
482 .. note::
483
483
484 The IP here is the address of worker as seen from *login*, and need only be specified if
484 The IP here is the address of worker as seen from *login*, and need only be specified if
485 the kernel used the ambiguous 0.0.0.0 (all interfaces) address. If it had used
485 the kernel used the ambiguous 0.0.0.0 (all interfaces) address. If it had used
486 192.168.1.123 to start with, it would not be needed.
486 192.168.1.123 to start with, it would not be needed.
487
487
488
488
489 Manual SSH tunnels
489 Manual SSH tunnels
490 ------------------
490 ------------------
491
491
492 It's possible that IPython's ssh helper functions won't work for you, for various
492 It's possible that IPython's ssh helper functions won't work for you, for various
493 reasons. You can still connect to remote machines, as long as you set up the tunnels
493 reasons. You can still connect to remote machines, as long as you set up the tunnels
494 yourself. The basic format of forwarding a local port to a remote one is::
494 yourself. The basic format of forwarding a local port to a remote one is::
495
495
496 [client] $> ssh <server> <localport>:<remoteip>:<remoteport> -f -N
496 [client] $> ssh <server> <localport>:<remoteip>:<remoteport> -f -N
497
497
498 This will forward local connections to **localport** on client to **remoteip:remoteport**
498 This will forward local connections to **localport** on client to **remoteip:remoteport**
499 *via* **server**. Note that remoteip is interpreted relative to *server*, not the client.
499 *via* **server**. Note that remoteip is interpreted relative to *server*, not the client.
500 So if you have direct ssh access to the machine to which you want to forward connections,
500 So if you have direct ssh access to the machine to which you want to forward connections,
501 then the server *is* the remote machine, and remoteip should be server's IP as seen from the
501 then the server *is* the remote machine, and remoteip should be server's IP as seen from the
502 server itself, i.e. 127.0.0.1. Thus, to forward local port 12345 to remote port 54321 on
502 server itself, i.e. 127.0.0.1. Thus, to forward local port 12345 to remote port 54321 on
503 a machine you can see, do::
503 a machine you can see, do::
504
504
505 [client] $> ssh machine 12345:127.0.0.1:54321 -f -N
505 [client] $> ssh machine 12345:127.0.0.1:54321 -f -N
506
506
507 But if your target is actually on a LAN at 192.168.1.123, behind another machine called **login**,
507 But if your target is actually on a LAN at 192.168.1.123, behind another machine called **login**,
508 then you would do::
508 then you would do::
509
509
510 [client] $> ssh login 12345:192.168.1.16:54321 -f -N
510 [client] $> ssh login 12345:192.168.1.16:54321 -f -N
511
511
512 The ``-f -N`` on the end are flags that tell ssh to run in the background,
512 The ``-f -N`` on the end are flags that tell ssh to run in the background,
513 and don't actually run any commands beyond creating the tunnel.
513 and don't actually run any commands beyond creating the tunnel.
514
514
515 .. seealso::
515 .. seealso::
516
516
517 A short discussion of ssh tunnels: http://www.revsys.com/writings/quicktips/ssh-tunnel.html
517 A short discussion of ssh tunnels: http://www.revsys.com/writings/quicktips/ssh-tunnel.html
518
518
519
519
520
520
521 Stopping Kernels and Consoles
521 Stopping Kernels and Consoles
522 *****************************
522 *****************************
523
523
524 Since there can be many consoles per kernel, the shutdown mechanism and dialog
524 Since there can be many consoles per kernel, the shutdown mechanism and dialog
525 are probably more complicated than you are used to. Since you don't always want
525 are probably more complicated than you are used to. Since you don't always want
526 to shutdown a kernel when you close a window, you are given the option to just
526 to shutdown a kernel when you close a window, you are given the option to just
527 close the console window or also close the Kernel and *all other windows*. Note
527 close the console window or also close the Kernel and *all other windows*. Note
528 that this only refers to all other *local* windows, as remote Consoles are not
528 that this only refers to all other *local* windows, as remote Consoles are not
529 allowed to shutdown the kernel, and shutdowns do not close Remote consoles (to
529 allowed to shutdown the kernel, and shutdowns do not close Remote consoles (to
530 allow for saving, etc.).
530 allow for saving, etc.).
531
531
532 Rules:
532 Rules:
533
533
534 * Restarting the kernel automatically clears all *local* Consoles, and prompts remote
534 * Restarting the kernel automatically clears all *local* Consoles, and prompts remote
535 Consoles about the reset.
535 Consoles about the reset.
536 * Shutdown closes all *local* Consoles, and notifies remotes that
536 * Shutdown closes all *local* Consoles, and notifies remotes that
537 the Kernel has been shutdown.
537 the Kernel has been shutdown.
538 * Remote Consoles may not restart or shutdown the kernel.
538 * Remote Consoles may not restart or shutdown the kernel.
539
539
540 Qt and the QtConsole
540 Qt and the QtConsole
541 ====================
541 ====================
542
542
543 An important part of working with the QtConsole when you are writing your own
543 An important part of working with the QtConsole when you are writing your own
544 Qt code is to remember that user code (in the kernel) is *not* in the same
544 Qt code is to remember that user code (in the kernel) is *not* in the same
545 process as the frontend. This means that there is not necessarily any Qt code
545 process as the frontend. This means that there is not necessarily any Qt code
546 running in the kernel, and under most normal circumstances there isn't. If,
546 running in the kernel, and under most normal circumstances there isn't. If,
547 however, you specify ``--pylab=qt`` at the command-line, then there *will* be a
547 however, you specify ``--pylab=qt`` at the command-line, then there *will* be a
548 :class:`QCoreApplication` instance running in the kernel process along with
548 :class:`QCoreApplication` instance running in the kernel process along with
549 user-code. To get a reference to this application, do:
549 user-code. To get a reference to this application, do:
550
550
551 .. sourcecode:: python
551 .. sourcecode:: python
552
552
553 from PyQt4 import QtCore
553 from PyQt4 import QtCore
554 app = QtCore.QCoreApplication.instance()
554 app = QtCore.QCoreApplication.instance()
555 # app will be None if there is no such instance
555 # app will be None if there is no such instance
556
556
557 A common problem listed in the PyQt4 Gotchas_ is the fact that Python's garbage
557 A common problem listed in the PyQt4 Gotchas_ is the fact that Python's garbage
558 collection will destroy Qt objects (Windows, etc.) once there is no longer a
558 collection will destroy Qt objects (Windows, etc.) once there is no longer a
559 Python reference to them, so you have to hold on to them. For instance, in:
559 Python reference to them, so you have to hold on to them. For instance, in:
560
560
561 .. sourcecode:: python
561 .. sourcecode:: python
562
562
563 def make_window():
563 def make_window():
564 win = QtGui.QMainWindow()
564 win = QtGui.QMainWindow()
565
565
566 def make_and_return_window():
566 def make_and_return_window():
567 win = QtGui.QMainWindow()
567 win = QtGui.QMainWindow()
568 return win
568 return win
569
569
570 :func:`make_window` will never draw a window, because garbage collection will
570 :func:`make_window` will never draw a window, because garbage collection will
571 destroy it before it is drawn, whereas :func:`make_and_return_window` lets the
571 destroy it before it is drawn, whereas :func:`make_and_return_window` lets the
572 caller decide when the window object should be destroyed. If, as a developer,
572 caller decide when the window object should be destroyed. If, as a developer,
573 you know that you always want your objects to last as long as the process, you
573 you know that you always want your objects to last as long as the process, you
574 can attach them to the QApplication instance itself:
574 can attach them to the QApplication instance itself:
575
575
576 .. sourcecode:: python
576 .. sourcecode:: python
577
577
578 # do this just once:
578 # do this just once:
579 app = QtCore.QCoreApplication.instance()
579 app = QtCore.QCoreApplication.instance()
580 app.references = set()
580 app.references = set()
581 # then when you create Windows, add them to the set
581 # then when you create Windows, add them to the set
582 def make_window():
582 def make_window():
583 win = QtGui.QMainWindow()
583 win = QtGui.QMainWindow()
584 app.references.add(win)
584 app.references.add(win)
585
585
586 Now the QApplication itself holds a reference to ``win``, so it will never be
586 Now the QApplication itself holds a reference to ``win``, so it will never be
587 garbage collected until the application itself is destroyed.
587 garbage collected until the application itself is destroyed.
588
588
589 .. _Gotchas: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html#garbage-collection
589 .. _Gotchas: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html#garbage-collection
590
590
591 Regressions
591 Regressions
592 ===========
592 ===========
593
593
594 There are some features, where the qt console lags behind the Terminal
594 There are some features, where the qt console lags behind the Terminal
595 frontend:
595 frontend:
596
596
597 * !cmd input: Due to our use of pexpect, we cannot pass input to subprocesses
597 * !cmd input: Due to our use of pexpect, we cannot pass input to subprocesses
598 launched using the '!' escape, so you should never call a command that
598 launched using the '!' escape, so you should never call a command that
599 requires interactive input. For such cases, use the terminal IPython. This
599 requires interactive input. For such cases, use the terminal IPython. This
600 will not be fixed, as abandoning pexpect would significantly degrade the
600 will not be fixed, as abandoning pexpect would significantly degrade the
601 console experience.
601 console experience.
602
602
603 * Use of ``\b`` and ``\r`` characters in the console: these are control
603 * Use of ``\b`` and ``\r`` characters in the console: these are control
604 characters that allow the cursor to move backwards on a line, and are used to
604 characters that allow the cursor to move backwards on a line, and are used to
605 display things like in-place progress bars in a terminal. We currently do
605 display things like in-place progress bars in a terminal. We currently do
606 not support this, but it is being tracked as issue :ghissue:`629`.
606 not support this, but it is being tracked as issue :ghissue:`629`.
607
607
608 .. _PyQt: http://www.riverbankcomputing.co.uk/software/pyqt/download
608 .. _PyQt: http://www.riverbankcomputing.co.uk/software/pyqt/download
609 .. _pygments: http://pygments.org/
609 .. _pygments: http://pygments.org/
General Comments 0
You need to be logged in to leave comments. Login now