<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Frédéric Collonval</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/author-frederic-collonval.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2023-04-12T17:40:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Jupyter Notebook format workshop outcomes</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2023/jupyter-notebook-format-workshop-outcomes/" rel="alternate"/><published>2023-04-12T17:40:00+00:00</published><updated>2023-04-12T17:40:00+00:00</updated><author><name>Frédéric Collonval</name></author><id>tag:jasongrout.github.io,2023-04-12:/medium-archive/pelican/posts/2023/jupyter-notebook-format-workshop-outcomes/</id><summary type="html">&lt;p&gt;The Jupyter Community Workshop on the notebook file format took place near Paris. Here are the great subjects we worked on.&lt;/p&gt;
</summary><content type="html">&lt;figure&gt;
&lt;img alt="Workshop Social Event challenging our senses" src="https://jasongrout.github.io/medium-archive/pelican/posts/2023/jupyter-notebook-format-workshop-outcomes/images/001-1_OfVNHv8zp7Tn2I0hRIkN4Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Workshop Social Event challenging our senses&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The Jupyter Community Workshop on the notebook file format took place at the Safran Campus near Paris from February 28th to March 2nd. It was a great opportunity to gather various Jupyter stakeholders from private and public affiliations to bootstrap new features for the &lt;a href="https://nbformat.readthedocs.io/en/latest"&gt;Notebook file format&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="/posts/2022/jupyter-community-workshops/"&gt;Jupyter Community Workshops&lt;/a&gt; are a series of events designed to bring together small groups of Jupyter community members and core contributors for high-impact strategic work and community engagement on focused topics.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="community-discussions"&gt;Community discussions&lt;/h2&gt;
&lt;p&gt;The community has lots of &lt;a href="https://docs.google.com/document/d/1CZZ_EpMIeh3zDlqYEvUH4WLvjKrKGmDU6Afcz1NvMkg"&gt;ideas to improve the Notebook format&lt;/a&gt;. So we split in three smaller groups with the aim of drafting Jupyter Enhancement Proposal (JEP): the markdown group, the text-format group and the cell types group.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;markdown&lt;/strong&gt; group focused on backward compatible enhancement for the Markdown cells. The discussions focused on two subjects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The specification of the Markdown flavor (&lt;a href="https://github.com/jupyter/enhancement-proposals/issues/98"&gt;pre-proposal&lt;/a&gt;): the goals are to specify which Markdown flavor (e.g. GitHub, CommonMark, MyST,…) is used for the cell source, how to store rendered output for easier cross-compatibility and what is the default Markdown flavor.&lt;/li&gt;
&lt;li&gt;The persistence of user expression (&lt;a href="https://github.com/jupyter/enhancement-proposals/issues/94"&gt;pre-proposal&lt;/a&gt;): in order to display inline expressions within Markdown cells, the results obtained from the kernel should be stored in the notebook. This proposal aims to define the schema modification to store such information.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;strong&gt;text-format&lt;/strong&gt; group lays out a specification for an official Jupyter notebook textual format. The discussion went on after the meeting to prepare that &lt;a href="https://github.com/jupyter/enhancement-proposals/issues/102"&gt;proposal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally the &lt;strong&gt;cell-types&lt;/strong&gt; group took the hypothesis of starting from the blank page to create the best Jupyter notebook format building on top of 10-years of experience. The discussion will take time to settle down on a new specification. So if you are interested, join the weekly discussion (see &lt;a href="https://hackmd.io/hHW8k7mKS5qFBhxnFtVTCw"&gt;the meeting notes&lt;/a&gt; for all the details). In addition to the fully new specification, two backward compatible enhancements have been proposed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adding &lt;em&gt;$schema&lt;/em&gt; to the notebook format and deprecate the nbformat version keys (see &lt;a href="https://github.com/jupyter/enhancement-proposals/pull/97"&gt;proposal&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Adding &lt;em&gt;extraSchema&lt;/em&gt; to the notebook format to optionally extend the schema to specify in particular metadata (see &lt;a href="https://github.com/jupyter/enhancement-proposals/issues/96"&gt;pre-proposal&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="follow-up"&gt;Follow-up&lt;/h2&gt;
&lt;p&gt;Six JEP’s are foreseen from the workshop discussions. But as mentioned earlier, the community has lots of great other ideas (like SQL cells, low-/no-code cells for inputs or visualization). So we would like to encourage anyone interested by any Jupyter enhancement to open issue on the &lt;a href="https://github.com/jupyter/enhancement-proposals"&gt;Jupyter Enhancement Proposals&lt;/a&gt; repository (see the &lt;a href="https://jupyter.org/enhancement-proposals/jupyter-enhancement-proposal-guidelines/jupyter-enhancement-proposal-guidelines.html"&gt;guidelines&lt;/a&gt; for more information).&lt;/p&gt;
&lt;p&gt;With the new &lt;a href="/posts/2023/announcing-a-new-jupyter-governance-model-and-our-first/"&gt;Jupyter governance&lt;/a&gt; in place, the new Software Steering Council is responsible for ensuring those proposals get reviewed and go through the approval process.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;I deeply want to thank all participants to the workshop that took the time (some of them despite time zone difference) to bring very constructive and thoughtful discussion.&lt;/p&gt;
&lt;p&gt;We are really grateful to Bloomberg and Amazon Web Services for their donations to the Jupyter Community Workshops program. This event would not have been possible without their generous support.&lt;/p&gt;
&lt;p&gt;We are also grateful to Safran Group for hosting this workshop and the NumFOCUS foundation for helping and mentoring this workshop organization.&lt;/p&gt;
</content><category term="community"/><category term="events"/><category term="Jupyter Notebook"/><category term="workshops"/></entry><entry><title>Jupyter Community Workshop: The notebook file format</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-community-workshop-the-notebook-file-format/" rel="alternate"/><published>2022-12-08T16:09:00+00:00</published><updated>2022-12-08T16:09:00+00:00</updated><author><name>Frédéric Collonval</name></author><id>tag:jasongrout.github.io,2022-12-08:/medium-archive/pelican/posts/2022/jupyter-community-workshop-the-notebook-file-format/</id><summary type="html">&lt;p&gt;We are excited to announce the next in-person Jupyter Community Workshop! It will focus on the Notebook file format.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We are excited to announce the next in-person Jupyter Community Workshop! It will focus on the &lt;a href="https://nbformat.readthedocs.io/en/latest"&gt;Notebook file format&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="/posts/2022/jupyter-community-workshops/"&gt;Jupyter Community Workshops&lt;/a&gt; are a series of events designed to bring together small groups of Jupyter community members and core contributors for high-impact strategic work and community engagement on focused topics.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Jupyter notebook file format has been around for 10 years. Its usage has grown in countless fields from teaching to data analysis in production pipelines. A great number of software applications and online services have added support for it.&lt;/p&gt;
&lt;p&gt;We want this workshop to be an opportunity for various stakeholders to push forward the format while preserving its reusability in as many applications as possible. We could for example prototype a syntax for injecting variable values in Markdown cells, specify an alternative more textual format like RMarkdown, define the Markdown variant we support,… the boundary is our imagination. By the end of the workshop, we will submit those new specifications as &lt;a href="https://jupyter.org/enhancement-proposals/README.html"&gt;Jupyter Enhancement Proposals&lt;/a&gt; to kick start the validation process for enhancing the official notebook format.&lt;/p&gt;
&lt;p&gt;The workshop will last three days, with hands-on discussions, hacking sessions, and technical presentations. The goal of this event is to foster collaboration and the sharing of knowledge between maintainers of various platforms supporting the file format, downstream library authors and power users.&lt;/p&gt;
&lt;p&gt;The workshop will be held at the Safran Campus in &lt;a href="https://www.safran-group.com/locations/france/safran-campus-2117707"&gt;Paris suburb, France&lt;/a&gt; from February 28th to March 2nd, 2023. Travel funding assistance is available for attendees from academia and those from groups which are not well-represented within the Jupyter and wider tech community!&lt;/p&gt;
&lt;p&gt;Application and all other details can be found in this &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSfBQlor-UNtpGvyafefE9xEtBwd47q5ev5ju8wTYpP1Z9YRCA/viewform?usp=pp_url&amp;amp;entry.828738498=Tuesday,+February+28th&amp;amp;entry.828738498=Wednesday,+March+1st&amp;amp;entry.828738498=Thursday,+March+2nd&amp;amp;entry.541109147=No&amp;amp;entry.148929239=No"&gt;form&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We are grateful to Safran Group for sponsoring this event. We are also grateful to the sponsors of the Jupyter Community Workshop series, Bloomberg and Amazon Web Services.&lt;/em&gt;&lt;/p&gt;
</content><category term="events"/><category term="Jupyter Notebook"/><category term="workshops"/></entry><entry><title>Accelerating JupyterLab</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2022/accelerating-jupyterlab/" rel="alternate"/><published>2022-10-10T17:38:00+00:00</published><updated>2022-10-10T17:38:00+00:00</updated><author><name>Frédéric Collonval</name></author><id>tag:jasongrout.github.io,2022-10-10:/medium-archive/pelican/posts/2022/accelerating-jupyterlab/</id><summary type="html">&lt;p&gt;How JupyterLab is switching to second gear for Version 4&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/accelerating-jupyterlab/images/001-1_EZX55-XLmck_LfFfV3KeaA.webp" alt="Illustration of an astronaut flying in space with a jet pack." loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The next major release of JupyterLab will be significantly faster than previous versions. This was achieved both through systematic tracking of performance bugs and through significant upgrades to the Jupyter communication protocol and rendering mechanism for documents.&lt;/p&gt;
&lt;h2 id="1-setting-up-rigorous-performance-measurements"&gt;1. Setting up rigorous performance measurements&lt;/h2&gt;
&lt;p&gt;The first step to any measurable improvement in performance is to set up systematic measurement of performance.&lt;/p&gt;
&lt;p&gt;The JupyterLab project now includes a UI performance benchmarking tool, in the form of a GitHub action that can be triggered on any pull request to check how performance is impacted by the change. The implementation of this new GitHub action is available in this repository: &lt;a href="https://github.com/jupyterlab/benchmarks"&gt;https://github.com/jupyterlab/benchmarks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This tool measures the time required for performing the following actions: opening a test notebook, switching from the test notebook to a copy of it opened in another tab, switching from the test notebook to a text editor, switching back, searching for a word in the test notebook and closing the test notebook. There are multiple example notebooks in the test suites. Benchmark results are posted as comments on the pull request. You can see such a benchmark report here: &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/11494#issuecomment-976393815"&gt;#11494#issuecomment-976393815&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Example report from the new benchmarking tool" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/accelerating-jupyterlab/images/002-0_pEgLswpTd_LWmMsi.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Example report from the new benchmarking tool — each execution time distribution is represented by a box-plot graph (the box spans from the 1st to the 3rd quartiles with the white line positioned at the median value).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The addition of this benchmarking tool immediately allowed for optimization on how notebooks are &lt;em&gt;hidden&lt;/em&gt; when switching tabs. Hiding can be done by adding a CSS class that enables some CSS rule, or forcibly setting display to “none”. Depending on the browser, picking one way or another of hiding content may trigger a reflow of the entire page, so we made this a settable with an option in the JupyterLab config.&lt;/p&gt;
&lt;p&gt;The benchmark GitHub action was developed by &lt;strong&gt;Frédéric Collonval&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="2-upgrading-to-codemirror-6"&gt;2. Upgrading to CodeMirror 6&lt;/h2&gt;
&lt;p&gt;The rendering of the text editor used in notebooks can be very expensive, especially in the case of large notebooks with many cells. Jupyter has historically relied on CodeMirror as its based text editor.&lt;/p&gt;
&lt;p&gt;JupyterLab 4 includes an upgrade from CodeMirror 5 to CodeMirror 6, which is a complete rewrite of the text editor. This work can be found in pull requests &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/11638"&gt;#11638&lt;/a&gt;, &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/12877"&gt;#12877&lt;/a&gt;, and &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/12861"&gt;#12861&lt;/a&gt; — modifying over 150 files of the JupyterLab codebase. Benchmarks indicate a rendering speedup factor between 2 and 3 on the large notebooks used in the benchmarking suite.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Benchmark report on the CodeMirror 6 migration PR" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/accelerating-jupyterlab/images/003-0_68j3WUTV1hUtR4wC.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Benchmark report on the CodeMirror 6 migration PR&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: CodeMirror 6 is also an important stepping stone towards making Jupyter notebooks &lt;em&gt;&lt;strong&gt;accessible&lt;/strong&gt;&lt;/em&gt; to people who need screen readers and other devices.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The migration of JupyterLab to CodeMirror 6 was performed by &lt;strong&gt;Johan Mabille&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="3-virtual-rendering-of-notebooks"&gt;3. Virtual rendering of notebooks&lt;/h2&gt;
&lt;p&gt;In JupyterLab 4, the notebook will only render the parts of the documents that are visible in the viewport. It significantly improves the rendering speed of large notebooks. The main pull request implementing this feature is available here: &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/12554"&gt;#12554&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Significant preparation work was required for this Pull Request, especially regarding the “search feature” and the “table of content” components that both made use of the notebook view instead of the document model. This was done in PRs &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/11689"&gt;#11689&lt;/a&gt; and &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/12374"&gt;#12374&lt;/a&gt; respectively.&lt;/p&gt;
&lt;p&gt;The end results showed significant improvement in the rendering speed of large notebook files, with a speedup of 3 to 4, which come on top of the already improved performance from the CodeMirror 6 migration.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Benchmark report on the Virtual Rendering of notebooks" src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/accelerating-jupyterlab/images/004-0_y7zl2IRtKoeyYp5e.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Benchmark report on the Virtual Rendering of notebooks&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The virtual rendering of notebooks was developed by &lt;strong&gt;Frédéric Collonval&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="4-jupyter-protocol-alignment"&gt;4. Jupyter protocol alignment&lt;/h2&gt;
&lt;p&gt;The Jupyter server serves as a relay between the frontends such as JupyterLab or the notebook and kernels. The &lt;strong&gt;server ⇄ kernel&lt;/strong&gt; communication is done over ZeroMQ sockets, with the well-specified Jupyter kernel protocol. The &lt;strong&gt;server ⇄ client&lt;/strong&gt; communication is done over WebSockets.&lt;/p&gt;
&lt;p&gt;Unfortunately, up until recently, the &lt;strong&gt;server ⇄ kernel&lt;/strong&gt; (ZMQ), and the &lt;strong&gt;server ⇄ client&lt;/strong&gt; (WebSocket) protocols differed slightly so that the server had to parse each message and re-serialise it in both directions. This processing cost is small for short messages such as execution requests and replies which are typically very short, however, it can become very costly when dealing with larger datasets being sent or retrieved from the front-end, such as large tables, complex mime type rendering. This misalignment of the ZMQ and WebSocket protocol can then become a real bottleneck.&lt;/p&gt;
&lt;p&gt;In Jupyter Server 2, the WebSocket connection supports a new “aligned” protocol, in which messages can simply be copied over to and from ZeroMQ messages, which is supported by JupyterLab 4. (This work was done in PRs &lt;a href="https://github.com/jupyter-server/jupyter_server/pull/657"&gt;#657&lt;/a&gt; (jupyter-server), &lt;a href="https://github.com/jupyter-server/jupyverse/pull/154"&gt;#154&lt;/a&gt; (jupyverse), and &lt;a href="https://github.com/jupyterlab/jupyterlab/pull/11841"&gt;#11841&lt;/a&gt; (JupyterLab)). This new aligned protocol is an opt-in, so that legacy Jupyter front-end are still expected to function with Jupyter Server 2.&lt;/p&gt;
&lt;p&gt;Benchmarks indicate a &lt;strong&gt;large&lt;/strong&gt; &lt;strong&gt;speedup factor&lt;/strong&gt; (at least one order of magnitude, and more for larger messages) in the performance of the Jupyter server when displaying large data sets in Jupyter widgets. However, this is not captured by the JupyterLab benchmark tests which focus on the rendering performances.&lt;/p&gt;
&lt;p&gt;The procol alignment work was done by &lt;strong&gt;David Brochart&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="5-lumino-2"&gt;5. Lumino 2&lt;/h2&gt;
&lt;p&gt;The JupyterLab frontend is built upon the Lumino framework, which provides utilities for building in-browser desktop-like applications. It provides the foundations for such applications, including a uniform component wrapper that handles lifecycle management and efficient propagation of front-end events to an entire application, (e.g., resize events, drag-and-drop, layout calculation). Lumino also provides several high-performance components such as a drag-and-drop dock panel (used as the application shell for JupyterLab) and a best-in-class data grid component.&lt;/p&gt;
&lt;p&gt;JupyterLab 4 includes a major upgrade of the Lumino. The main changes in Lumino 2 include the migration to ES2018, which allowed for the removal of large parts of the codebase prodiving features that are now natively available in JavaScript, such as native iterators, removing polyfills for promises, and special-case logic for idiosyncrasies of legacy browsers like IE. This upgrade is also leading to across-the-board performance improvements in the front-end, although not for the rendering of large documents. Lumino 2 supports background processing of UI components when the application resides in a background browser tab (a feature that may be back-ported to Lumino 1.x as well).&lt;/p&gt;
&lt;p&gt;The Lumino 2 upgrade and integration in JupyterLab was done by &lt;strong&gt;Afshin Darian.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="6-a-faster-lumino-data-grid"&gt;6. A faster Lumino data grid&lt;/h2&gt;
&lt;p&gt;Optimizations to the Lumino data grid widget were also implemented, speeding up the rendering in the case of merged cells (cf. PR &lt;a href="https://github.com/jupyterlab/lumino/pull/394"&gt;#394&lt;/a&gt;). The Lumino datagrid is used in various parts of the JupyterLab UI, such as the table view for CSV files. It is also used extensively in third-party extensions such as the &lt;a href="https://github.com/bloomberg/ipydatagrid"&gt;ipydatagrid&lt;/a&gt; Jupyter widget and the &lt;a href="https://github.com/twosigma/beakerx_tabledisplay"&gt;BeakerX table display&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Lumino data grid optimization was done by &lt;strong&gt;Martin Renou&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="acknowledgement"&gt;Acknowledgement&lt;/h2&gt;
&lt;p&gt;The work by the &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; team on JupyterLab performance improvements was done in collaboration with &lt;a href="https://www.twosigma.com/"&gt;&lt;strong&gt;Two Sigma&lt;/strong&gt;&lt;/a&gt;. Several of these pull requests required major changes across the JupyterLab codebase. We are very grateful to Two Sigma for supporting the development of the Jupyter project at such a deep level.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/accelerating-jupyterlab/images/005-0_P3blJAk0ZNg4obBV.webp" alt="Two-sigma logo" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We are grateful to &lt;a href="https://twitter.com/juliettetaka?lang=en"&gt;&lt;strong&gt;Juliette Taka&lt;/strong&gt;&lt;/a&gt; for the illustrations.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Frédéric Collonval&lt;/strong&gt;, who led the charge on JupyterLab performance improvements, is a technical director at QuantStack. He is a member of the core JupyterLab core team and authored several JupyterLab extensions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Johan Mabille&lt;/strong&gt; is a technical director at QuantStack, very active in the Jupyter ecosystem. He regularly contributes to JupyterLab, and developed the Xeus framework for creating Jupyter kernels.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;David Brochart&lt;/strong&gt; is a scientific software developer at QuantStack, very active in the Jupyter ecosystem. He is a maintainer of the Jupyter-server project, and the main author of Jupyverse. David also contributes to the geo-science open-source stack built atop Jupyter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Afshin Darian&lt;/strong&gt; is a technical director at QuantStack. He is the co-creator of the JupyterLab project and continues working on the project to this day.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/accelerating-jupyterlab/images/006-1_OwFstCVzAGZX3EiQejEWog.webp" alt="Illustration of an astronaut planting a Jupyter flag at the top of a mountain." loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterLab"/></entry></feed>