<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Johan Mabille</title><link href="https://jupyter.org/blog/" rel="alternate"/><link href="https://jupyter.org/blog/feeds/author-johan-mabille.atom.xml" rel="self"/><id>https://jupyter.org/blog/</id><updated>2026-06-26T07:16:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jupyter.org/blog/posts/2026/congratulations-distinguished-contributors/" rel="alternate"/><published>2026-06-24T15:08:00+00:00</published><updated>2026-06-26T07:16:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jupyter.org,2026-06-24:/blog/posts/2026/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2025 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the 2025 cohort of Jupyter Distinguished Contributors!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Photo of James Colliander" src="https://jupyter.org/blog/posts/2026/congratulations-distinguished-contributors/images/001-1_tvqSgVCwpnNq8c4yARxlZQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;James Colliander&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Florence Haudin" src="https://jupyter.org/blog/posts/2026/congratulations-distinguished-contributors/images/002-1_Woii0mAKX49rdgHRdv5tyQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Florence Haudin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Greg Mooney" src="https://jupyter.org/blog/posts/2026/congratulations-distinguished-contributors/images/003-1_c1eU0cCYGogiSMTlYK3j7Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Greg Mooney&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Photo of Kirstie Whitaker" src="https://jupyter.org/blog/posts/2026/congratulations-distinguished-contributors/images/004-1_C7R23KzWzt6vhNUyRFeOgA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Kirstie Whitaker&lt;/figcaption&gt;
&lt;/figure&gt;
</content><category term="community"/></entry><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jupyter.org/blog/posts/2025/congratulations-distinguished-contributors/" rel="alternate"/><published>2025-05-15T15:15:00+00:00</published><updated>2025-05-15T15:22:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jupyter.org,2025-05-15:/blog/posts/2025/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2024 cohort of contributors.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2024 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the 2024 cohort of Jupyter Distinguished Contributors!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Portrait of Denisa Checiu" src="https://jupyter.org/blog/posts/2025/congratulations-distinguished-contributors/images/001-1_NAL0ma8SVR9HGcwBo0RorA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Denisa Checiu&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Portrait of Rowan Cockett" src="https://jupyter.org/blog/posts/2025/congratulations-distinguished-contributors/images/002-1_RrEf4-SrJqlAemyX_adfpg.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Rowan Cockett&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Mahendra Paipuri" src="https://jupyter.org/blog/posts/2025/congratulations-distinguished-contributors/images/003-1_tJbjvVBKnd3ulyaTdBtEsQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Mahendra Paipuri&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Portrait of Isabel Paredes" src="https://jupyter.org/blog/posts/2025/congratulations-distinguished-contributors/images/004-1_mpNi0Uqt9egOWkiVzgzr8Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Isabel Paredes&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Portrait of David L. Qiu" src="https://jupyter.org/blog/posts/2025/congratulations-distinguished-contributors/images/005-1_dhQc-wwRu30xZJB5PNLIdg.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;David L. Qiu&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Portrait of Rick Wagner" src="https://jupyter.org/blog/posts/2025/congratulations-distinguished-contributors/images/006-1_gwYPh1yExp-OR0e7q3e5pA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Rick Wagner&lt;/figcaption&gt;
&lt;/figure&gt;
</content><category term="community"/></entry><entry><title>Announcing the 2023 Jupyter Distinguished Contributor Award Recipients</title><link href="https://jupyter.org/blog/posts/2024/announcing-the-2023-jupyter-distinguished-contributor/" rel="alternate"/><published>2024-09-04T16:46:00+00:00</published><updated>2024-09-04T16:46:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jupyter.org,2024-09-04:/blog/posts/2024/announcing-the-2023-jupyter-distinguished-contributor/</id><summary type="html">&lt;p&gt;We are delighted to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2023 cohort.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are delighted to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2023 cohort.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their significant and sustained contributions to Jupyter over a period of at least two years. These contributions encompass a wide range of areas, including code development, code review, infrastructure work, participation in mailing lists and chats, community building and support, education and outreach, fundraising, branding and marketing, efforts in inclusion and diversity, UX design, and research.&lt;/p&gt;
&lt;p&gt;Please join us in congratulating the winners of the 2023 cohort of Jupyter Distinguished Contributors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nicolas Brichet&lt;/li&gt;
&lt;li&gt;Piyush Jain&lt;/li&gt;
&lt;li&gt;Duc Trung Le&lt;/li&gt;
&lt;li&gt;Jason Weill&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Their dedication and hard work have been instrumental in advancing the Jupyter project and community.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2024/announcing-the-2023-jupyter-distinguished-contributor/images/001-0_psjWHR7z2EmlvZlF.webp" alt="Portraits of the recipients of the JDC award: Nicolas Brichet, Piyush Jain, Duc Trung Le, Jason Weill" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Johan Mabille — on behalf of the Jupyter Distinguished Contributors&lt;/p&gt;
</content><category term="community"/></entry><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/" rel="alternate"/><published>2023-06-02T12:41:00+00:00</published><updated>2023-06-02T12:41:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jupyter.org,2023-06-02:/blog/posts/2023/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2022 cohort of contributors.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2022 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the &lt;a href="https://jupyter.org/about#2022-cohort"&gt;2022 cohort of Jupyter Distinguished Contributors&lt;/a&gt;!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Tania Allard" src="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/images/001-1_qBAxw1QPlFn0NGTA6w3VQQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Tania Allard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Carlos Herrero" src="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/images/002-1_gqUY-RV-ZHEjEvgBxsRBtQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Carlos Herrero&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Itay Dafna" src="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/images/003-1_5ytgEqe9qdSL_S0zwRJcGA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Itay Dafna&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Eric Charles" src="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/images/004-1_UZMz3Km915REn82mvVhTqw.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Eric Charles&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Max Klein" src="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/images/005-1_NXN4W9sjoFT60wHCWHT2rQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Max Klein&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Ryan Lovett" src="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/images/006-1_eMVttLuc9NH2UT7h0Y9vlw.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Ryan Lovett&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Sharan Foga" src="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/images/007-1_AIRl3XcCNaddR4dYD8jT8A.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Sharan Foga&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Rollin Thomas" src="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/images/008-1__UioMnv1IKqFvOoQRjh8oQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Rollin Thomas&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Ayaz Salikhov" src="https://jupyter.org/blog/posts/2023/congratulations-distinguished-contributors/images/009-1_F2Bw8lZIsIfk8hsw_wHGWQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Ayaz Salikhov&lt;/figcaption&gt;
&lt;/figure&gt;
</content><category term="community"/></entry><entry><title>Improving the accessibility of Jupyter</title><link href="https://jupyter.org/blog/posts/2023/improving-the-accessibility-of-jupyter/" rel="alternate"/><published>2023-02-24T11:11:00+00:00</published><updated>2023-02-24T11:11:00+00:00</updated><author><name>Nicolas Brichet</name></author><id>tag:jupyter.org,2023-02-24:/blog/posts/2023/improving-the-accessibility-of-jupyter/</id><summary type="html">&lt;p&gt;Towards a more accessible Jupyter notebook&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The adoption of Jupyter has grown significantly in the past few years — especially in education contexts. The project has become a foundational component of our digital experience, from the first lines of code written by high-school students to the most advanced research and engineering use cases.&lt;/p&gt;
&lt;p&gt;In this context of global adoption, it is even more important to ensure that as many people as possible can use the project. It is estimated that 15% of the population has a disability that may impair their ability to use online services. If we don’t want them to be excluded from learning sciences, technology, and engineering, we must improve the tools to make them usable by everyone…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;To address this issue, a Jupyter accessibility working group formed and has now become an &lt;a href="https://jupyter.org/governance/list_of_subprojects.html"&gt;official Jupyter Subproject&lt;/a&gt; and received &lt;a href="https://github.com/jupyter/accessibility/blob/main/docs/funding/czi-grant-roadmap.md"&gt;a grant from the Chan Zuckerberg Initiative&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Creating accessible user interfaces is a challenging task as it requires accommodating a broad range of disabilities, including vision, motor, and cognitive impairments. This article presents some of the recent accessibility improvements in the Jupyter Notebook codebase.&lt;/p&gt;
&lt;h2 id="codemirror-6-and-notebook-7"&gt;CodeMirror 6 and Notebook 7&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter/enhancement-proposals/pull/79"&gt;Jupyter Notebook 7&lt;/a&gt;, which is the next major release of the Jupyter Notebook frontend, has been rebuilt with modern JupyterLab components and extensions while maintaining the classic Jupyter Notebook user experience. Notebook 7 will be released shortly after JupyterLab 4 and will take advantage of JupyterLab improvements.&lt;/p&gt;
&lt;p&gt;Improving the accessibility of Jupyter had long been impeded by significant obstacles. The primary obstacle was that the text editor underlying the Jupyter Notebook (CodeMirror 5) had major accessibility issues.&lt;/p&gt;
&lt;p&gt;Fortunately, this accessibility bottleneck has been unblocked as JupyterLab has been upgraded to use &lt;a href="https://codemirror.net/6/"&gt;CodeMirror 6&lt;/a&gt;, a complete rewrite of the text editor with a strong focus on accessibility. Although this upgrade required extensive codebase modifications, the changes landed a few months ago and will be available with JupyterLab 4. Jupyter Notebook 7 will benefit from the CodeMirror 6 upgrade.&lt;/p&gt;
&lt;h2 id="initial-accessibility-audits"&gt;Initial accessibility audits&lt;/h2&gt;
&lt;p&gt;Shortly after the &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/10370"&gt;CodeMirror 6 migration&lt;/a&gt; landed, we made an automated audit of the accessibility of Notebook 7 with these changes, and found that the number of warnings and errors reported by Axe Auditor went down from several hundreds to a few dozen, most of which seemed fixable. Encouraged by these results, we decided to work on bringing that count to zero!&lt;/p&gt;
&lt;p&gt;With a series of fixes ranging from simple changes to the DOM structure of components to fixing up base Lumino components (&lt;a href="https://github.com/jupyterlab/lumino"&gt;Lumino&lt;/a&gt; is a JavaScript framework that underlies a lot of the JupyterLab frontend architecture), we were able to make the Notebook 7 codebase pass the Axe Auditor tests with zero error or warning. While we have not reached that yet in JupyterLab, both JupyterLab and Jupyter Notebook benefit from these improvements made for Notebook 7 since they are built from the same components.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of the output of the Axe accessibility audit tool on the classic Jupyter notebook user interface with a test notebook, showing a total of 242 errors, including 20 “critical” errors, 88 “serious” errors, and 134 errors of “moderate” severity." src="https://jupyter.org/blog/posts/2023/improving-the-accessibility-of-jupyter/images/001-0_-v-lL8LJ8DIqlgXb.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Axe Auditor output with the “classic” Notebook UI (v6) with a &lt;a href="https://nbviewer.org/github/waltherg/notebooks/blob/master/2013-12-03-Crank_Nicolson.ipynb"&gt;test notebook&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of the output of the Axe accessibility audit tool on the new Jupyter notebook user interface with a same test notebook, showing zero detected errors." src="https://jupyter.org/blog/posts/2023/improving-the-accessibility-of-jupyter/images/002-0_7imwXY7uST5QSNfi.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Axe Auditor output with the “next” Notebook UI (v7 alpha 13) with the same &lt;a href="https://nbviewer.org/github/waltherg/notebooks/blob/master/2013-12-03-Crank_Nicolson.ipynb"&gt;test notebook&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Similar results were achieved with the file explorer and text editor tabs of the application.&lt;/p&gt;
&lt;h2 id="beyond-accessibility-audits"&gt;Beyond accessibility audits&lt;/h2&gt;
&lt;p&gt;Improving the accessibility of Jupyter requires more than just addressing issues flagged by automated audit tools and the &lt;a href="https://github.com/jupyter/accessibility"&gt;Jupyter Accessibility Subproject&lt;/a&gt; is working on improving accessibility across the board in Project Jupyter. These results with the Notebook 7 codebase are very encouraging, but working with end-users and getting their feedback will also be necessary to make the user interface truly accessible.&lt;/p&gt;
&lt;p&gt;To address the diversity of accessibility requirements, we will approach specific use cases separately (for example, users with screen readers, or users who can operate a keyboard but not a pointing device). While the resulting changes may improve usability for everyone, we need to learn from users who have specific needs to make meaningful improvements.&lt;/p&gt;
&lt;p&gt;Finally, many of the accessibility challenges in Jupyter stem from the &lt;em&gt;content&lt;/em&gt; of the notebooks, as notebook authors may not follow the best practices to make their content usable by everyone (such as adding alt text to images and figures, or properly using headings to communicate the organization of a notebook). To promote these best practices, Jupyter could provide linting tools that produce inline warnings and hints for notebooks that do not follow these guidelines.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The work by Johan Mabille at &lt;a href="https://twitter.com/QuantStack"&gt;&lt;strong&gt;QuantStack&lt;/strong&gt;&lt;/a&gt; on migrating JupyterLab to use CodeMirror 6 was funded by &lt;a href="https://www.twosigma.com/"&gt;&lt;strong&gt;Two Sigma&lt;/strong&gt;&lt;/a&gt;. This upgrade also enabled significant performance improvements in the rendering of Jupyter notebooks, as detailed in this &lt;a href="https://jupyter.org/blog/posts/2022/accelerating-jupyterlab/"&gt;earlier post&lt;/a&gt; by Frédéric Collonval.&lt;/p&gt;
&lt;p&gt;We are grateful to members of the Jupyter Accessibility Subproject who produced a thorough review of the Notebook 7 UI with a focus on keyboard navigation. This is an example of an issue that cannot be easily detected by auditing tools.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the Authors&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/NicolasBrichet_"&gt;&lt;strong&gt;Nicolas Brichet&lt;/strong&gt;&lt;/a&gt; is a scientific software developer at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; active in the Jupyter ecosystem. Among other things, Nicolas made significant contributions to the JupyterLab and Voilà projects, and worked on porting the &lt;a href="https://github.com/jupyter/nbgrader/"&gt;nbgrader&lt;/a&gt; package to JupyterLab. Nicolas worked on accessibility improvements in the JupyterLab and Lumino packages.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/JohanMabille"&gt;&lt;strong&gt;Johan Mabille&lt;/strong&gt;&lt;/a&gt; is a technical director at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;. He was honored with the Distinguished Contributors award in 2020 for his contributions to the Jupyter project. Among other things, he is one of the main authors of the JupyterLab visual debugger, and the creator of Xeus, a C++ implementation of the Jupyter kernel protocol at the basis of many Jupyter kernels. Johan was responsible for the migration of JupyterLab to CodeMirror 6.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/jtpio"&gt;&lt;strong&gt;Jeremy Tuloup&lt;/strong&gt;&lt;/a&gt; is a technical director at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;, and a Jupyter Distinguished Contributor. He is a core maintainer of JupyterLab and Voilà, and the creator of the JupyterLite project. Jeremy is the main initiator of the Notebook 7 project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frédéric Collonval&lt;/strong&gt; is a technical director at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;, and a Jupyter Distinguished Contributor. He is a core maintainer of the JupyterLab project. Frédéric contributed to the CodeMirror 6 migration and helped numerous new contributors to get their enhancements accepted.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/SylvainCorlay"&gt;&lt;strong&gt;Sylvain Corlay&lt;/strong&gt;&lt;/a&gt; is the founder and CEO of &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;, and a Jupyter Distinguished Contributor. He has worked on many areas of the Jupyter project, from interactive widgets to language kernels and other core components.&lt;/p&gt;
</content><category term="accessibility"/></entry><entry><title>Accelerating JupyterLab</title><link href="https://jupyter.org/blog/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:jupyter.org,2022-10-10:/blog/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 class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/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://jupyter.org/blog/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://jupyter.org/blog/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://jupyter.org/blog/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 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 class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/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 class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/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><entry><title>Congratulations, Distinguished Contributors!</title><link href="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/" rel="alternate"/><published>2022-03-16T16:23:00+00:00</published><updated>2022-03-16T17:21:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jupyter.org,2022-03-16:/blog/posts/2022/congratulations-distinguished-contributors/</id><summary type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2021 cohort of contributors.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are proud to announce the recipients of the Jupyter Distinguished Contributor (JDC) award for the 2021 cohort of contributors.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/distinguished_contributors.html"&gt;Project Jupyter Distinguished Contributors&lt;/a&gt; are recognized for their substantial contributions to Jupyter itself in both quality and quantity over at least two years. Contributions may include code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, fundraising, branding, marketing, inclusion and diversity, UX design and research, etc.&lt;/p&gt;
&lt;p&gt;Please congratulate the winners of the &lt;a href="https://jupyter.org/about#2021-cohort"&gt;2021 cohort of Jupyter Distinguished Contributors&lt;/a&gt;!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Mehmet Bektas" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/001-0_LZx735MQPDZmcWG-.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Mehmet Bektas&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="David Brochart" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/002-0_gB-nomoquRZLokGn.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;David Brochart&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="S. Chris Colbert" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/003-1_EowDp-ZU8rBaOslA6SJc2Q.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;S. Chris Colbert&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Frédéric Collonval" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/004-1_oxLYUYCQAQ1Hj04mr8ABdg.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Frédéric Collonval&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Martha Cryan" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/005-0_cZ2ca3X4_J35xQz2.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Martha Cryan&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Wayne Decatur" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/006-0_0fOIeXNIXqjP4l2E.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Wayne Decatur&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Sarah Gibson" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/007-0_bpGVZZyohxtpSngk.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Sarah Gibson&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Mariana Meireles" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/008-0_5wS1KBvwFVn0hyrW.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Mariana Meireles&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Isabela Presedo-Floyd" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/009-0_u_DJ1U3Xf7g-m1xV.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Isabela Presedo-Floyd&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Nicolas Thiéry" src="https://jupyter.org/blog/posts/2022/congratulations-distinguished-contributors/images/010-1_t761M0eIk-LY-tLy25csQQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Nicolas Thiéry&lt;/figcaption&gt;
&lt;/figure&gt;
</content><category term="community"/></entry><entry><title>Xeus 2.0</title><link href="https://jupyter.org/blog/posts/2021/xeus-2-0/" rel="alternate"/><published>2021-09-28T09:41:00+00:00</published><updated>2021-09-28T09:41:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jupyter.org,2021-09-28:/blog/posts/2021/xeus-2-0/</id><summary type="html">&lt;p&gt;Announcing a major release of the Xeus library&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We have just released &lt;a href="https://github.com/jupyter-xeus/xeus"&gt;Xeus&lt;/a&gt; 2. This is a major release of the library. While it includes backward-incompatible changes, they are very limited and upgrading your kernels should be relatively easy.&lt;/p&gt;
&lt;h2 id="how-to-upgrade-xeus-based-kernels"&gt;How to upgrade Xeus-based kernels&lt;/h2&gt;
&lt;p&gt;Let’s illustrate that with the code of a simple kernel before and after upgrading to Version 2. Most typically, only the kernel’s main file will have to be updated:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;diff --git a/example/src/main.cpp b/example/src/main.cpp&lt;/span&gt;
&lt;span class="gh"&gt;index 29de437..eb8fdba 100644&lt;/span&gt;
&lt;span class="gd"&gt;--- a/example/src/main.cpp&lt;/span&gt;
&lt;span class="gi"&gt;+++ b/example/src/main.cpp&lt;/span&gt;
&lt;span class="gu"&gt;@@ -21,12 +21,14 @@ int main(int argc, char* argv[])&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;    std::string file_name = (argc == 1) ? &amp;quot;connection.json&amp;quot; : argv[2];
&lt;span class="w"&gt; &lt;/span&gt;    xeus::xconfiguration config = xeus::load_configuration(file_name);

&lt;span class="gi"&gt;+    auto context = xeus::make_context&amp;lt;zmq::context_t&amp;gt;();&lt;/span&gt;
&lt;span class="gi"&gt;+&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;    // Create interpreter instance
&lt;span class="w"&gt; &lt;/span&gt;    using interpreter_ptr = std::unique_ptr&amp;lt;custom::custom_interpreter&amp;gt;;
&lt;span class="w"&gt; &lt;/span&gt;    interpreter_ptr interpreter = interpreter_ptr(new custom::custom_interpreter());

&lt;span class="w"&gt; &lt;/span&gt;    // Create kernel instance and start it
&lt;span class="gd"&gt;-    xeus::xkernel kernel(config, xeus::get_user_name(), std::move(interpreter), xeus::make_xserver_zmq);&lt;/span&gt;
&lt;span class="gi"&gt;+    xeus::xkernel kernel(config, xeus::get_user_name(), std::move(context), std::move(interpreter), xeus::make_xserver_zmq);&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;    kernel.start();

&lt;span class="w"&gt; &lt;/span&gt;    return 0;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The first change is that you now have to instantiate and pass an additional argument to the kernel constructor: the &lt;em&gt;context&lt;/em&gt;. Fortunately, Xeus provides a function to build such a context object, making the update straightforward. We will detail the reason for this change in the next section.&lt;/p&gt;
&lt;p&gt;The second change is that the kernel constructor now &lt;em&gt;requires&lt;/em&gt; a function to build the server while a default value was provided for it in Xeus 1.x. Again, the motivations for this change will be detailed in the next section. Finally the functions for building the servers have moved to different headers.&lt;/p&gt;
&lt;p&gt;To summarize, here is the list of the breaking changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The kernel’s constructor now requires an additional argument, the context. Xeus provides a function to easily instantiate it.&lt;/li&gt;
&lt;li&gt;The order of kernel’s constructor arguments has changed, and the function for building the server is now required.&lt;/li&gt;
&lt;li&gt;The functions for building the servers have moved to the headers where the corresponding servers are defined.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="motivation-for-these-changes"&gt;Motivation for these changes&lt;/h2&gt;
&lt;p&gt;When we created &lt;a href="https://github.com/jupyter-xeus/xeus"&gt;Xeus&lt;/a&gt;, kernels were expected to run in separate processes. The communication between the kernels and the client was achieved with the &lt;a href="https://zeromq.org/"&gt;ZeroMQ&lt;/a&gt; middleware framework, and it was natural to heavily rely on it in Xeus.&lt;/p&gt;
&lt;p&gt;Recent &lt;a href="https://jupyter.org/blog/posts/2021/jupyterlite-jupyter-webassembly-python/"&gt;developments&lt;/a&gt; have pushed in a different direction, where the &lt;a href="https://jupyterlite.readthedocs.io/en/latest/"&gt;kernel can run directly in the browser&lt;/a&gt;. In that case, a middleware library is not required anymore to communicate with the frontend. The architecture of Xeus was not suitable for this new kind of kernels. An update was required so that it is possible to build Xeus without the dependency on ZeroMQ.&lt;/p&gt;
&lt;h2 id="about-the-developers"&gt;About the developers&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/xeus-2-0/images/001-0_tHIyMRx_JbgkU2xy.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Johan Mabille&lt;/strong&gt; is a scientific software developer at QuantStack. Johan is a co-author of Xeus, and developed the debugger extension to xeus-python.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/xeus-2-0/images/002-0_zUMSbNcno1BZSfjO.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sylvain Corlay&lt;/strong&gt; is the founder and CEO of QuantStack, and a core Jupyter developer. He co-authored Xeus and xeus-python.&lt;/p&gt;
</content><category term="xeus"/></entry><entry><title>Enabling the JupyterLab debugger with ipykernel</title><link href="https://jupyter.org/blog/posts/2021/enabling-the-jupyterlab-debugger-with-ipykernel/" rel="alternate"/><published>2021-05-13T11:45:00+00:00</published><updated>2021-06-02T14:59:00+00:00</updated><author><name>Sylvain Corlay</name></author><id>tag:jupyter.org,2021-05-13:/blog/posts/2021/enabling-the-jupyterlab-debugger-with-ipykernel/</id><summary type="html">&lt;p&gt;Support for the Jupyter Debugger Protocol just landed in ipykernel&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Support for the Jupyter Debugger Protocol just landed in ipykernel&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;JupyterLab 3.0 includes a visual debugger that allows to interactively set breakpoints, step into functions, and inspect variables with any Jupyter kernel that implements the Jupyter debugger protocol.&lt;/p&gt;
&lt;p&gt;The first two language kernels to implement the new protocol were &lt;a href="https://github.com/jupyter-xeus/xeus-python/"&gt;xeus-python&lt;/a&gt; (a Python kernel) and &lt;a href="https://github.com/jupyter-xeus/xeus-robot/"&gt;xeus-robot&lt;/a&gt; (a kernel for Robot Framework). Unfortunately, the reference Python kernel, &lt;a href="https://github.com/ipython/ipykernel"&gt;&lt;strong&gt;ipykernel&lt;/strong&gt;&lt;/a&gt;, did not support debugging yet, &lt;em&gt;until now&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;Today, we are pleased to announce that debugging support landed in ipykernel, and will be available in the next major release, ipykernel 6.0. Pre-releases including the ipykernel debugger are available.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Debugging with ipykernel" src="https://jupyter.org/blog/posts/2021/enabling-the-jupyterlab-debugger-with-ipykernel/images/001-1_jSQWLvCYoV-L-kp_lTkRKg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Debugging with ipykernel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="what-will-change-with-ipykernel-60"&gt;What will change with ipykernel 6.0?&lt;/h2&gt;
&lt;p&gt;Enabling support for debugging in ipykernel required important changes in the code base regarding the concurrency model of the kernel. The main change is that the processing of messages on the “control channel” now happens in a different thread, allowing for the processing to happen while user code is running.&lt;/p&gt;
&lt;p&gt;Ipykernel 6.0 includes several other updates. Tornado coroutines were dropped in favor of native coroutines. The Matplotlib inline backend was split into a separate package, and ipykernel depends on &lt;a href="https://github.com/microsoft/debugpy"&gt;debugpy&lt;/a&gt;, an implementation of the Debug Adapter Protocol for Python.&lt;/p&gt;
&lt;p&gt;If you are interested in testing out the new features, check out the beta release!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install ipykernel --pre
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="try-it-now"&gt;Try it now!&lt;/h2&gt;
&lt;p&gt;Thanks to &lt;a href="https://mybinder.org/"&gt;MyBinder&lt;/a&gt;, you can also try it out without the need of installing anything on your computer. Just follow this link:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://mybinder.org/v2/gist/SylvainCorlay/a6405bbdfa9d58a670a67f3a47741bd2/HEAD?urlpath=doc%2Ftree%2Fdebugger.ipynb"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/enabling-the-jupyterlab-debugger-with-ipykernel/images/002-0_rELNpt0w5qbk_GQn.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-about-the-future"&gt;What about the future?&lt;/h2&gt;
&lt;p&gt;A lot of new features are in the works with the JupyterLab debugger.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab 3.1 will include several usability improvements to the debugger.&lt;/li&gt;
&lt;li&gt;It will also add the ability to submit code for execution when stopped at a breakpoint.&lt;/li&gt;
&lt;li&gt;We are working on a richer variable explorer, using Jupyter’s rich display system to enable the rich-rendering of variables in the explorer, to &lt;em&gt;e.g.&lt;/em&gt; render dataframes as tables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, we also plan on adding debugging support to other language kernels.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The work of Johan and Sylvain at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; on the debugger support in ipykernel was funded by &lt;a href="https://www.twosigma.com/"&gt;Two Sigma&lt;/a&gt;. We are grateful to Min Ragan Kelley and Matthias Bussonnier, who reviewed the pull requests on debugger support.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/enabling-the-jupyterlab-debugger-with-ipykernel/images/003-1_8_HgQuq5_HXhLXSdfGnhrA.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/JohanMabille"&gt;Johan Mabille&lt;/a&gt; is a scientific software developer at QuantStack.&lt;/p&gt;
&lt;p&gt;Johan is very active in the Jupyter ecosystem, as the creator of &lt;a href="https://github.com/jupyter-xeus/xeus"&gt;xeus&lt;/a&gt;, a C++ implementation of the Jupyter protocol, and several language kernels, such as &lt;a href="https://github.com/jupyter-xeus/xeus-python"&gt;xeus-python&lt;/a&gt;, &lt;a href="https://github.com/jupyter-xeus/xeus-cling"&gt;xeus-cling&lt;/a&gt;, and &lt;a href="https://github.com/jupyter-xeus/xeus-robot"&gt;xeus-robot&lt;/a&gt;. Johan also made contributions to the Jupyter widgets ecosystem and to JupyterLab.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/enabling-the-jupyterlab-debugger-with-ipykernel/images/004-1_LpuIpGQIDYMhv5IBthmwcA.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/SylvainCorlay"&gt;Sylvain Corlay&lt;/a&gt; is the founder and CEO of QuantStack.&lt;/p&gt;
&lt;p&gt;As an open-source developer, Sylvain is very active in the Jupyter project with contributions in several components of the stack, including widgets, kernels, nbconvert, and others. He is also a steering committee member of the project.&lt;/p&gt;
&lt;p&gt;Sylvain also does volunteer work for the community, as member of board of directors of NumFOCUS, co-organizer of the &lt;a href="https://www.meetup.com/pyData-paris"&gt;PyData Paris Meetup&lt;/a&gt;, and vice-chair of JupyterCon 2020.&lt;/p&gt;
</content><category term="IPython"/><category term="JupyterLab"/><category term="kernels"/></entry><entry><title>Robotic Process Automation with JupyterLab</title><link href="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/" rel="alternate"/><published>2021-01-18T10:36:00+00:00</published><updated>2021-01-18T10:36:00+00:00</updated><author><name>Martin Renou</name></author><id>tag:jupyter.org,2021-01-18:/blog/posts/2021/robotic-process-automation-with-jupyterlab/</id><summary type="html">&lt;p&gt;Introducing a new Jupyter kernel for Robot Framework&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Robotic Process Automation (RPA) differs from classical automation tools in that the actions to automate can be developed by observing a user perform a task in a graphical user interface, across multiple applications.&lt;/p&gt;
&lt;p&gt;It is a means to lower the entry barrier of process automation and enable the use of tools that don’t provide a programmatic interface.&lt;/p&gt;
&lt;p&gt;Most typically, RPA developers will use a mixed approach between textual programming and performing actions manually. The resulting programs are typically called software &lt;em&gt;robots&lt;/em&gt;. Therefore, interactive computing tools like Jupyter are a natural environment for RPA, as the interactive nature of Jupyter allows for quick iterations and trial-and-errors when developing such robots.&lt;/p&gt;
&lt;p&gt;While many RPA tools are commercial software, &lt;a href="https://robotframework.org/"&gt;Robot Framework&lt;/a&gt; and the tooling developed by &lt;a href="https://robocorp.com/"&gt;Robocorp&lt;/a&gt; provide an open-source RPA programming language, with a high-level syntax, extensible with Python plugins. It has a rich ecosystem of libraries and tools that are developed as separate projects.&lt;/p&gt;
&lt;h2 id="robot-framework-and-project-jupyter"&gt;Robot Framework and Project Jupyter&lt;/h2&gt;
&lt;p&gt;Today, we are happy to announce the first release of &lt;a href="https://github.com/jupyter-xeus/xeus-robot"&gt;&lt;strong&gt;xeus-robot&lt;/strong&gt;&lt;/a&gt;, a Jupyter kernel for &lt;a href="https://robotframework.org/"&gt;Robot Framework&lt;/a&gt; based on &lt;a href="https://github.com/jupyter-xeus/xeus"&gt;xeus&lt;/a&gt;, supporting the new JupyterLab 3.0 visual debugger, auto-completion, and much more!&lt;/p&gt;
&lt;p&gt;But before we dive into xeus-robot, we should recognize the earlier work by &lt;a href="https://github.com/bollwyvl"&gt;Nick Bollweg&lt;/a&gt; and &lt;a href="https://github.com/datakurre"&gt;Asko Soukka&lt;/a&gt;, who developed two Jupyter kernels for Robot Framework, &lt;a href="https://github.com/gtri/irobotframework"&gt;irobotframework&lt;/a&gt;, and &lt;a href="https://github.com/robots-from-jupyter/robotkernel"&gt;robotkernel&lt;/a&gt;, and gave an &lt;a href="https://www.youtube.com/watch?v=rbYF_RmiAR8"&gt;amazing talk&lt;/a&gt; together at &lt;a href="https://robocon.io/"&gt;RoboCon&lt;/a&gt; in 2019!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The motivation for us to reboot this effort with a kernel based on xeus was to enable the &lt;strong&gt;JupyterLab Visual Debugger&lt;/strong&gt; for this kernel. This requires a different concurrency model than that of ipykernel, which underlies both irobotframework and robotkernel. In the end, we were able to provide the same features and more, including e.g. code completion in Python cells, debugging etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="diving-into-xeus-robot"&gt;Diving into Xeus-robot&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/001-1_3HNfLnwDpXNZ6n6HPD2lXQ.webp" alt="Xeus robot logo" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter-xeus/xeus-robot"&gt;xeus-robot&lt;/a&gt; is a reboot of the already existing robotkernel, based on xeus.&lt;/p&gt;
&lt;p&gt;Like most language kernels, &lt;a href="https://github.com/jupyter-xeus/xeus-robot"&gt;xeus-robot&lt;/a&gt; supports code completion, inspection, error handling, etc. It also allows using Python cells to define custom robot keywords in Python, those Python cells support code completion as well.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Code completion in Robot framework" src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/002-1_OPqkYEI78eT1dj5P6WEeXg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Code Completion in Robot Framework&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;By using the libraries robotframework-seleniumlibrary and robotframework-seleniumscreenshots, you can even complete the selection of elements on the page you are currently testing!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="RPA code completion" src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/003-1_Z-aWN6goZH_1YcabAYj2fQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Code completion with an action of the user in the UI.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;%%python&lt;/code&gt; cell magic makes it possible to extend Robotframework with Python modules in the notebook.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Robot Framework extenions in Python" src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/004-1_TSiSmKHJOGE0PQ_c7alv1w.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Extending RobotFramework with Python, and code completion in Python cells&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Widget-based UIs are provided to test Robotframework “keywords”.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Robot Framework and Jupyter widgets" src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/005-1_nyXQAQivNvV23xvS_1KCYQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Testing Robot Framework “keywords” with Jupyter widgets&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Last but not least, xeus-robot comes with full support for the JupyterLab Visual Debugger! After the xeus-python kernel, it is the second Jupyter kernel to support the Jupyter Debugger Protocol! We hope that many more will come.&lt;/p&gt;
&lt;p&gt;You can set breakpoints, step in defined keywords (the equivalent of functions), inspect variables, and see the callstack, as shown below.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLab Visual Debugger" src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/006-1_EFxI8mzCwYwnK9DB_xGxTQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterLab Visual Debugger in action with Robot Framework&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="installing-xeus-robot"&gt;Installing xeus-robot&lt;/h2&gt;
&lt;p&gt;Xeus-robot is available for all platforms on conda-forge, and can be installed with conda or mamba.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mamba install xeus-robot -c conda-forge
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;jupyterlab-robotmode&lt;/code&gt; package, which provides JupyterLab syntax highlighting for Robot Framework will also be installed as a dependency.&lt;/p&gt;
&lt;p&gt;For your conda installation, we recommend starting from &lt;strong&gt;mambaforge&lt;/strong&gt; or &lt;strong&gt;miniforge&lt;/strong&gt; which are available for download &lt;a href="https://github.com/conda-forge/miniforge"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;, and default to the conda-forge channel (making the &lt;code&gt;-c conda-forge&lt;/code&gt; argument unnecessary).&lt;/p&gt;
&lt;h2 id="try-it-online"&gt;Try it online&lt;/h2&gt;
&lt;p&gt;Thanks to &lt;a href="https://mybinder.org/"&gt;MyBinder&lt;/a&gt;, you can try it out without the need of installing anything on your computer. Just follow this link:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://mybinder.org/v2/gh/jupyter-xeus/xeus-robot/stable?urlpath=/lab/tree/notebooks/xrobot.ipynb"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/007-0_TQpdhVZSAnE-XOrm.jpg" alt="&amp;quot;Launch binder&amp;quot; badge" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://robocorp.com/"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/008-1_E9XGge6uWrbmvndUoZ1Qug.webp" alt="Robocorp logo" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The work on xeus-robot by &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; was funded by &lt;a href="https://robocorp.com/"&gt;Robocorp&lt;/a&gt;, and is part of their initiative to create an open-source RPA ecosystem. Beyond the xeus-robot kernel, Robocorp also funds the integration of Robot Framework with &lt;a href="https://marketplace.visualstudio.com/items?itemName=robocorp.robocorp-code"&gt;Visual Studio Code&lt;/a&gt;, &lt;a href="https://rpaframework.org/"&gt;RPA Framework&lt;/a&gt;, and other development to push the Robot Framework project forward.&lt;/p&gt;
&lt;p&gt;The implementation of the debugger in xeus-robot relies on &lt;a href="https://github.com/robocorp/robotframework-lsp"&gt;robotframework-lsp&lt;/a&gt; by &lt;a href="https://twitter.com/fabiofz"&gt;Fabio Zadrozny&lt;/a&gt; and we want to thank him for his help in integrating it in xeus-robot.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/009-1_zwPmx9pH4pkXOxowHQOsuQ.jpeg" alt="Martin Renou" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Martin Renou&lt;/strong&gt; is a scientific software developer at QuantStack. He is the creator of the xeus-python and xeus-robot kernels.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2021/robotic-process-automation-with-jupyterlab/images/010-1_YQZupQRMB6JJfhM_byi2KA.jpeg" alt="Johan Mabille" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Johan Mabille&lt;/strong&gt; is a scientific software developer at QuantStack. He is a co-author of the xeus project, and developed the debugger extensions to xeus-python and xeus-robot. He also co-authored the front-end for the JupyterLab visual debugger.&lt;/p&gt;
</content><category term="JupyterLab"/></entry><entry><title>Xeus is now a Jupyter subproject</title><link href="https://jupyter.org/blog/posts/2020/xeus-is-now-a-jupyter-subproject/" rel="alternate"/><published>2020-02-04T12:08:00+00:00</published><updated>2020-02-08T13:30:00+00:00</updated><author><name>Johan Mabille</name></author><id>tag:jupyter.org,2020-02-04:/blog/posts/2020/xeus-is-now-a-jupyter-subproject/</id><summary type="html">&lt;p&gt;The Xeus project has been incorporated as a Jupyter subproject.&lt;/p&gt;
</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;It is a great pleasure to announce that the Xeus project has been incorporated as a Jupyter subproject. Xeus will now be subject to the &lt;a href="https://github.com/jupyter/governance/blob/master/governance.md"&gt;Jupyter governance&lt;/a&gt; and &lt;a href="https://github.com/jupyter/governance/blob/master/conduct/code_of_conduct.md"&gt;code of conduct&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For reference, the Jupyter Enhancement Proposal (JEP) for the Xeus incorporation is available &lt;a href="https://github.com/jupyter/enhancement-proposals/pull/44"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-is-xeus"&gt;What is Xeus?&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/jupyter-xeus/xeus/"&gt;Xeus&lt;/a&gt; project is a C++ implementation of the Jupyter kernel protocol. Xeus is not a kernel, but a library meant to facilitate the authoring of kernels.&lt;br&gt;
Several Jupyter kernels have been created with Xeus:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter-xeus/xeus-cling"&gt;xeus-cling&lt;/a&gt;, a kernel for the C++ programming language, based on the Cling C++ interpreter. The &lt;a href="https://github.com/root-project/cling"&gt;cling&lt;/a&gt; project comes from CERN and is at the foundation of the &lt;a href="https://github.com/root-project/root.git"&gt;ROOT&lt;/a&gt; project.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The xeus-cling Jupyter kernel for the C++ programming language." src="https://jupyter.org/blog/posts/2020/xeus-is-now-a-jupyter-subproject/images/001-0_SSdFFWmES-6AW8Yo.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The xeus-cling Jupyter kernel for the C++ programming language.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter-xeus/xeus-python"&gt;xeus-python&lt;/a&gt;, a kernel for the Python programming language, embedding the Python interpreter.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The xeus-python Jupyter kernel for the Python programming language" src="https://jupyter.org/blog/posts/2020/xeus-is-now-a-jupyter-subproject/images/002-0_Mh5cOdG7YWJxrFSw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The xeus-python Jupyter kernel for the Python programming language&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyter-xeus/xeus-calc"&gt;xeus-calc&lt;/a&gt;, a calculator kernel, meant as an educational example on how to make Jupyter kernels with Xeus.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond these three kernels built on top of Xeus by the Xeus maintainers, third-parties have developed other Jupyter kernels with Xeus:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JuniperKernel/JuniperKernel"&gt;JuniperKernel&lt;/a&gt;, a kernel for the R programming language by Spencer Aiello.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/atomex-me/xeus-fift"&gt;xeus-fift&lt;/a&gt;, a kernel for the fift programming language by Michael Zaikin. The fift programming language was developed by Telegram to create TON blockchain contracts.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Slicer/SlicerJupyter"&gt;SlicerJupyter&lt;/a&gt;, a kernel for the Python programming language by Kitware which integrates into the Qt event loop of the Kitware “Slicer” project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, the xeus-python kernel includes a first implementation of the Jupyter debugger protocol used by the &lt;a href="https://github.com/jupyterlab/debugger"&gt;Jupyter debugger&lt;/a&gt; project. xeus-python enables the &lt;a href="https://microsoft.github.io/debug-adapter-protocol/"&gt;Debug Adapter Protocol&lt;/a&gt; over the Control channel through new debug request/reply and debug event messages.&lt;/p&gt;
&lt;h2 id="why-moving-xeus-under-the-jupyter-governance"&gt;Why moving Xeus under the Jupyter governance?&lt;/h2&gt;
&lt;p&gt;While Xeus started as a side project for &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; engineers, the project now has several stakeholders who depend on it. We think that moving the project to an open governance organization may be a better way to reflect this situation.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Xeus was started by the team of open-source developers at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; as a separate project, but with the full intent to incorporate it into Jupyter. The initial project development at QuantStack was funded by &lt;a href="https://twitter.com/techatbloomberg"&gt;Bloomberg&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Now, Xeus contributors work in many institutions, including &lt;a href="https://www.universite-paris-saclay.fr/"&gt;Université Paris-Saclay&lt;/a&gt; and &lt;a href="https://www.polytechnique.edu/"&gt;École Polytechnique&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/johanmabille?lang=en"&gt;Johan Mabille&lt;/a&gt; is a Scientific Software Developer at &lt;a href="https://github.com/QuantStack/"&gt;QuantStack&lt;/a&gt;, specializing in high-performance computing in C++. He holds master’s degree in computer science from Centrale-Supelec.&lt;/p&gt;
&lt;p&gt;As an open source developer, Johan coauthored &lt;a href="https://quantstack.net/xtensor.html"&gt;&lt;strong&gt;xtensor&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://quantstack.net/xeus.html"&gt;&lt;strong&gt;xeus&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://quantstack.net/xsimd.html"&gt;&lt;strong&gt;xsimd&lt;/strong&gt;&lt;/a&gt;. He also made major contributions to the JupyterLab debugger project and bqplot.&lt;/p&gt;
</content><category term="C++"/><category term="xeus"/></entry><entry><title>Interactive Workflows for C++ with Jupyter</title><link href="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/" rel="alternate"/><published>2017-11-29T16:33:00+00:00</published><updated>2019-12-25T09:42:00+00:00</updated><author><name>Sylvain Corlay</name></author><id>tag:jupyter.org,2017-11-29:/blog/posts/2017/interactive-workflows-for-c-with-jupyter/</id><summary type="html">&lt;p&gt;Scientists, educators and engineers not only use programming languages to build software systems, but also in interactive workflows, using the tools available to explore a problem and reason about it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Scientists, educators and engineers not only use programming languages to build software systems, but also in interactive workflows, using the tools available to &lt;em&gt;explore&lt;/em&gt; a problem and &lt;em&gt;reason&lt;/em&gt; about it.&lt;/p&gt;
&lt;p&gt;Running some code, looking at a visualization, loading data, and running more code. Quick iteration is especially important during the exploratory phase of a project.&lt;/p&gt;
&lt;p&gt;For this kind of workflow, users of the C++ programming language currently have no choice but to use a heterogeneous set of tools that don’t play well with each other, making the whole process cumbersome, and difficult to reproduce.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;We currently lack a good story for interactive computing in C++&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In our opinion, this hurts the productivity of C++ developers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most of the progress made in software projects comes from incrementalism. Obstacles to fast iteration hinder progress.&lt;/li&gt;
&lt;li&gt;This also makes C++ more difficult to teach. The first hours of a C++ class are rarely rewarding as the students must learn how to set up a small project before writing any code. And then, a lot more time is required before their work can result in any visual outcome.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="project-jupyter-and-interactive-computing"&gt;Project Jupyter and Interactive Computing&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/001-1_wOHyKy6fl3ltcBMNpCvC6Q.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The goal of Project Jupyter is to provide a consistent set of tools for scientific computing and data science workflows, from the exploratory phase of the analysis to the presentation and the sharing of the results. The Jupyter stack was designed to be agnostic of the programming language, and also to allow alternative implementations of any component of the layered architecture (back-ends for programming languages, custom renderers for file types associated with Jupyter). The stack consists of&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a low-level specification for messaging protocols, standardized file formats,&lt;/li&gt;
&lt;li&gt;a reference implementation of these standards,&lt;/li&gt;
&lt;li&gt;applications built on top of these libraries: the Notebook, JupyterLab, Binder, JupyterHub&lt;/li&gt;
&lt;li&gt;and visualization libraries integrated into the Notebook and JupyterLab.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adoption of the Jupyter ecosystem has skyrocketed in the past years, with millions of users worldwide, over a million Jupyter notebooks shared on GitHub and large-scale deployments of Jupyter in universities, companies and high-performance computing centers.&lt;/p&gt;
&lt;h2 id="jupyter-and-c"&gt;Jupyter and C++&lt;/h2&gt;
&lt;p&gt;One of the main extension points of the Jupyter stack is the &lt;em&gt;kernel&lt;/em&gt;, the part of the infrastructure responsible for executing the user’s code. Jupyter kernels exist for &lt;a href="https://github.com/jupyter/jupyter/wiki/Jupyter-kernels"&gt;numerous programming languages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Most Jupyter kernels are implemented in the target programming language: the reference implementation &lt;a href="https://github.com/ipython/ipykernel"&gt;ipykernel&lt;/a&gt; in Python, &lt;a href="https://github.com/JuliaLang/IJulia.jl"&gt;IJulia&lt;/a&gt; in Julia, leading to a duplication of effort for the implementation of the protocol. A common denominator to a lot of these interpreted languages is that the interpreter generally exposes a C API, allowing the embedding into a native application. In an effort to consolidate these commonalities and save work for future kernel builders, we developed &lt;em&gt;xeus&lt;/em&gt;.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/002-1_TKrPv5AvFM3NJ6a7VMu8Tw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QuantStack/xeus"&gt;Xeus&lt;/a&gt; is a C++ implementation of the Jupyter kernel protocol. It is not a kernel itself but a library that facilitates the authoring of kernels, and other applications making use of the Jupyter kernel protocol.&lt;/p&gt;
&lt;p&gt;A typical kernel implementation using xeus would in fact make use of the target interpreter &lt;em&gt;as a library.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There are a number of benefits of using xeus over implementing your kernel in the target language:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Xeus provides a complete implementation of the protocol, enabling a lot of features from the start for kernel authors, who only need to deal with the language bindings.&lt;/li&gt;
&lt;li&gt;Xeus-based kernels can very easily provide a back-end for Jupyter interactive widgets.&lt;/li&gt;
&lt;li&gt;Finally, xeus can be used to implement kernels for domain-specific languages such as SQL flavors. Existing approaches use a Python wrapper. With xeus, the resulting kernel won’t require Python at run-time, leading to large performance benefits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/003-1_Cr_cfHdrgFXHlO15qdNK7w.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interpreted C++&lt;/strong&gt; is already a reality at CERN with the &lt;a href="https://root.cern.ch/cling"&gt;Cling&lt;/a&gt; C++ interpreter in the context of the &lt;a href="https://root.cern.ch/"&gt;ROOT&lt;/a&gt; data analysis environment.&lt;/p&gt;
&lt;p&gt;As a first example for a kernel based on xeus, we have implemented &lt;a href="https://github.com/QuantStack/xeus-cling"&gt;xeus-cling&lt;/a&gt;, a pure C++ kernel.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Redirection of outputs to the Jupyter front-end, with different styling in the front-end." src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/004-1_NnjISpzZtpy5TOurg0S89A.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Redirection of outputs to the Jupyter front-end, with different styling in the front-end.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Complex features of the C++ programming language such as, polymorphism, templates, lambdas, are supported by the cling interpreter, making the C++ Jupyter notebook a great prototyping and learning platform for the C++ users. See the image below for a demonstration:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Features of the C++ programming language supported by the cling interpreter" src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/005-1_lGVLY4fL1ytMfT-eWtoXkw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Features of the C++ programming language supported by the cling interpreter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Finally, xeus-cling supports live quick-help, fetching the content on &lt;a href="http://en.cppreference.com/w/"&gt;cppreference&lt;/a&gt; in the case of the standard library.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Live help for the C++standard library in the Jupyter notebook" src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/006-1_Igegq0xBebuJV8hy0TGpfg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Live help for the C++standard library in the Jupyter notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;We realized that we started using the C++ kernel ourselves very early in the development of the project. For quick experimentation, or reproducing bugs. No need to set up a project with a cpp file and complicated project settings for finding the dependencies… Just write some code and hit &lt;strong&gt;Shift+Enter&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual output can also be displayed using the rich display mechanism of the Jupyter protocol.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using Jupyter's rich display mechanism to display an image inline in the notebook" src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/007-1_t_9qAXtdkSXr-0tO9VvOzQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using Jupyter’s rich display mechanism to display an image inline in the notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/008-1_OVfmXFAbfjUtGFXYS9fKRA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Another important feature of the Jupyter ecosystem are the &lt;a href="http://jupyter.org/widgets"&gt;Jupyter Interactive Widgets&lt;/a&gt;. They allow the user to build graphical interfaces and interactive data visualization inline in the Jupyter notebook. Moreover it is not just a collection of widgets, but a framework that can be built upon, to create arbitrary visual components. Popular interactive widget libraries include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bloomberg/bqplot"&gt;bqplot&lt;/a&gt; (2-D plotting with d3.js)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jovyan/pythreejs"&gt;pythreejs&lt;/a&gt; (3-D scene visualization with three.js)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ellisonbg/ipyleaflet"&gt;ipyleaflet&lt;/a&gt; (maps visualization with leaflet.js)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/maartenbreddels/ipyvolume"&gt;ipyvolume&lt;/a&gt; (3-D plotting and volume rendering with three.js)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/arose/nglview"&gt;nglview&lt;/a&gt; (molecular visualization)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just like the rest of the Jupyter ecosystem, Jupyter interactive widgets were designed as a language-agnostic framework. Other language back-ends can be created reusing the front-end component, which can be installed separately.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QUantStack/xwidgets"&gt;xwidgets&lt;/a&gt;, which is still at an early stage of development, is a native C++ implementation of the Jupyter widgets protocol. It already provides an implementation for most of the widget types available in the core Jupyter widgets package.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="C++ back-end to the Jupyter interactive widgets" src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/009-1_ro5Ggdstnf0DoqhTUWGq3A.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;C++ back-end to the Jupyter interactive widgets&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Just like with ipywidgets, one can build upon xwidgets and implement C++ back-ends for the Jupyter widget libraries listed earlier, effectively enabling them for the C++ programming language and other xeus-based kernels: xplot, xvolume, xthreejs…&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/010-1_yCRYoJFnbtxYkYMRc9AioA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QuantStack/xplot"&gt;xplot&lt;/a&gt; is an experimental C++ back-end for the &lt;a href="https://github.com/bloomberg/bqplot"&gt;bqplot&lt;/a&gt; 2-D plotting library. It enables an API following the constructs of the &lt;a href="https://dl.acm.org/citation.cfm?id=1088896"&gt;&lt;em&gt;Grammar of Graphics&lt;/em&gt;&lt;/a&gt; in C++.&lt;/p&gt;
&lt;p&gt;In xplot, every item in a chart is a separate object that can be modified from the back-end, &lt;em&gt;dynamically&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Changing a property of a plot item, a scale, an axis or the figure canvas itself results in the communication of an update message to the front-end, which reflects the new state of the widget visually.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Changing the data of a scatter plot dynamically to update the chart" src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/011-1_Mx2g3JuTG1Cfvkkv0kqtLA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Changing the data of a scatter plot dynamically to update the chart&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; the xplot and xwidgets projects are still at an early stage of development and are changing drastically at each release.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Interactive computing environments like Jupyter are not the only missing tool in the C++ world. Two key ingredients to the success of Python as the &lt;em&gt;lingua franca&lt;/em&gt; of data science is the existence of libraries like &lt;a href="http://www.numpy.org/"&gt;NumPy&lt;/a&gt; and &lt;a href="https://pandas.pydata.org/"&gt;Pandas&lt;/a&gt; at the foundation of the ecosystem.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/012-1_HsU43Jzp1vJZpX2g8XPJsg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QuantStack/xtensor/"&gt;xtensor&lt;/a&gt; is a C++ library meant for numerical analysis with multi-dimensional array expressions.&lt;/p&gt;
&lt;p&gt;xtensor provides&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an extensible expression system enabling lazy NumPy-style broadcasting.&lt;/li&gt;
&lt;li&gt;an API following the &lt;em&gt;idioms&lt;/em&gt; of the C++ standard library.&lt;/li&gt;
&lt;li&gt;tools to manipulate array expressions and build upon xtensor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;xtensor exposes an API similar to that of NumPy covering a growing portion of the functionalities. A cheat sheet can be &lt;a href="http://xtensor.readthedocs.io/en/latest/numpy.html"&gt;found in the documentation&lt;/a&gt;:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Scrolling the NumPy to xtensor cheat sheet" src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/013-1_PBrf5vWYC8VTq_7VUOZCpA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Scrolling the NumPy to xtensor cheat sheet&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;However, xtensor internals are very different from NumPy. Using modern C++ techniques (template expressions, closure semantics) xtensor is a lazily evaluated library, avoiding the creation of temporary variables and unnecessary memory allocations, even in the case complex expressions involving broadcasting and language bindings.&lt;/p&gt;
&lt;p&gt;Still, from a user perspective, the combination of xtensor with the C++ notebook provides an experience very similar to that of NumPy in a Python notebook.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using the xtensor array expression library in a C++ notebook" src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/014-1_ULFpg-ePkdUbqqDLJ9VrDw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using the xtensor array expression library in a C++ notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In addition to the core library, the xtensor ecosystem has a number of other components&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/xtensor-blas"&gt;&lt;strong&gt;xtensor-blas&lt;/strong&gt;&lt;/a&gt;: the counterpart to the numpy.linalg module.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/egpbos/xtensor-fftw"&gt;&lt;strong&gt;xtensor-fftw&lt;/strong&gt;&lt;/a&gt;: bindings to the &lt;a href="http://www.fftw.org/"&gt;fftw&lt;/a&gt; library.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/xtensor-io"&gt;&lt;strong&gt;xtensor-io&lt;/strong&gt;&lt;/a&gt;: APIs to read and write various file formats (images, audio, NumPy’s NPZ format).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wolfv/xtensor_ros"&gt;&lt;strong&gt;xtensor-ros&lt;/strong&gt;&lt;/a&gt;: bindings for ROS, the robot operating system.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/xtensor-python"&gt;&lt;strong&gt;xtensor-python&lt;/strong&gt;&lt;/a&gt;: bindings for the Python programming language, allowing the use of NumPy arrays in-place, using the NumPy C API and the pybind11 library.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/Xtensor.jl"&gt;&lt;strong&gt;xtensor-julia&lt;/strong&gt;&lt;/a&gt;: bindings for the Julia programming language, allowing the use of Julia arrays in-place, using the C API of the Julia interpreter, and the CxxWrap library.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/xtensor-r"&gt;&lt;strong&gt;xtensor-r&lt;/strong&gt;&lt;/a&gt;: bindings for the R programming language, allowing the use of R arrays in-place.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Detailing further the features of the xtensor framework would be beyond the scope of this post.&lt;/p&gt;
&lt;p&gt;If you are interested in trying the various notebooks presented in this post, there is no need to install anything. You can just use &lt;em&gt;binder&lt;/em&gt;:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/015-1_9cy5Mns_I0eScsmDBjvxDQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/"&gt;The Binder project&lt;/a&gt;, which is part of Project Jupyter, enables the deployment of containerized Jupyter notebooks, from a GitHub repository together with a manifest listing the dependencies (as conda packages).&lt;/p&gt;
&lt;p&gt;All the notebooks in the screenshots above can be run online, by just clicking on one of the following links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mybinder.org/v2/gh/QuantStack/xeus-cling/stable?filepath=notebooks/xcpp.ipynb"&gt;&lt;strong&gt;xeus-cling&lt;/strong&gt;&lt;/a&gt;: the main xeus-cling example notebook,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mybinder.org/v2/gh/QuantStack/xtensor/stable?filepath=notebooks/xtensor.ipynb"&gt;&lt;strong&gt;xtensor&lt;/strong&gt;&lt;/a&gt;: the C++ N-D array expression library in a C++ notebook,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mybinder.org/v2/gh/QuantStack/xwidgets/0.11.1?filepath=notebooks/xwidgets.ipynb"&gt;&lt;strong&gt;xwidgets&lt;/strong&gt;&lt;/a&gt;: the C++ back-end for Jupyter interactive widgets,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mybinder.org/v2/gh/QuantStack/xplot/0.5.0?filepath=notebooks"&gt;&lt;strong&gt;xplot&lt;/strong&gt;&lt;/a&gt;: the C++ back-end to the bqplot 2-D plotting library for Jupyter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://jupyter.org/blog/posts/2017/interactive-workflows-for-c-with-jupyter/images/016-1_JwqhpMxMJppEepj7U4fV-g.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub&lt;/a&gt; is the multi-user infrastructure underlying open wide deployments of Jupyter like Binder but also smaller deployments for authenticated users.&lt;/p&gt;
&lt;p&gt;The modular architecture of JupyterHub enables a great variety of scenarios on how users are authenticated, and what service is made available to them. JupyterHub deployment for several hundreds of users have been done in various universities and institutions, including the Paris-Sud University, where the C++ kernel was also installed for the students to use.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In September 2017, the 350 first-year students at Paris-Sud University who took the “&lt;a href="http://nicolas.thiery.name/Enseignement/Info111/"&gt;Info 111: Introduction to Computer
Science&lt;/a&gt;” class wrote their first lines of C++ in a Jupyter notebook.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The use of Jupyter notebooks in the context of teaching C++ proved especially useful for the first classes, where students can focus on the syntax of the language without distractions such as compiling and linking.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The software presented in this post was built upon the work of a large number of people including the &lt;strong&gt;Jupyter&lt;/strong&gt; team and the &lt;strong&gt;Cling&lt;/strong&gt; developers.&lt;/p&gt;
&lt;p&gt;We are especially grateful to &lt;a href="https://twitter.com/egpbos"&gt;Patrick Bos&lt;/a&gt; (who authored xtensor-fftw), Nicolas Thiéry, Min Ragan Kelley, Thomas Kluyver, Yuvi Panda, Kyle Cranmer, Axel Naumann and Vassil Vassilev.&lt;/p&gt;
&lt;p&gt;We thank the &lt;a href="http://diana-hep.org"&gt;DIANA/HEP&lt;/a&gt; organization for supporting travel to CERN and encouraging the collaboration between Project Jupyter and the ROOT team.&lt;/p&gt;
&lt;p&gt;We are also grateful to the team at &lt;strong&gt;Paris-Sud University&lt;/strong&gt; who worked on the JupyterHub deployment and the class materials, notably &lt;a href="https://twitter.com/pyviv"&gt;Viviane Pons&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The development of xeus, xtensor, xwidgets and related packages at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; is sponsored by &lt;a href="http://www.techatbloomberg.com"&gt;&lt;strong&gt;Bloomberg&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="about-the-authors-alphabetical-order"&gt;About the Authors (alphabetical order)&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/SylvainCorlay"&gt;&lt;em&gt;Sylvain Corlay&lt;/em&gt;&lt;/a&gt;, Scientific Software Developer at &lt;a href="https://github.com/QuantStack/"&gt;QuantStack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/lgouarin"&gt;&lt;em&gt;Loic Gouarin&lt;/em&gt;&lt;/a&gt;, Research Engineer at &lt;a href="https://www.math.u-psud.fr"&gt;Laboratoire de Mathématiques at Orsay&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/johanmabille?lang=en"&gt;&lt;em&gt;Johan Mabille&lt;/em&gt;&lt;/a&gt;, Scientific Software Developer at &lt;a href="https://github.com/QuantStack/"&gt;QuantStack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/wuoulf"&gt;&lt;em&gt;Wolf Vollprecht&lt;/em&gt;&lt;/a&gt;, Scientific Software Developer at &lt;a href="https://github.com/QuantStack/"&gt;QuantStack&lt;/a&gt;&lt;/p&gt;
</content><category term="C++"/><category term="science"/></entry></feed>