<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - education</title><link href="https://blog.jupyter.org/" rel="alternate"/><link href="https://blog.jupyter.org/feeds/tag-education.atom.xml" rel="self"/><id>https://blog.jupyter.org/</id><updated>2026-07-31T12:28:00+00:00</updated><subtitle>Teaching and learning with Jupyter, including courses, classroom deployments, nbgrader, and other educational tools.</subtitle><entry><title>Positron Server available for academic use via JupyterHub</title><link href="https://blog.jupyter.org/posts/2026/positron-server-available-for-academic-use-via/" rel="alternate"/><published>2026-07-29T18:19:00+00:00</published><updated>2026-07-31T12:28:00+00:00</updated><author><name>Jupyter Foundation</name></author><id>tag:blog.jupyter.org,2026-07-29:/posts/2026/positron-server-available-for-academic-use-via/</id><summary type="html">&lt;p&gt;Academic institutions can now offer Positron directly within their existing JupyterHub environments, giving students access to a modern, full-featured data science IDE without requiring local installation or additional infrastructure.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Editor’s note: This is a guest blog post from Posit, a &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; member&lt;/em&gt;&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/positron-server-available-for-academic-use-via/images/001-1_1jHlCkiGYDfmAd0mWDhf1A.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Academic institutions can now offer &lt;a href="https://positron.posit.co/"&gt;Positron&lt;/a&gt; directly within their existing JupyterHub environments, giving students access to a modern, full-featured data science IDE without requiring local installation or additional infrastructure. Licensed under the permissive, source-available &lt;a href="https://positron.posit.co/licensing.html"&gt;Elastic License 2.0&lt;/a&gt;, Positron as a desktop app is free for everyone to use, build on, and extend across personal, academic, and commercial projects. Through a free educational license, universities and other academic organizations can additionally make &lt;a href="https://positron.posit.co/education.html"&gt;Positron Server&lt;/a&gt; available to currently enrolled students for coursework, helping create a consistent learning experience across classrooms, labs, and remote environments.&lt;/p&gt;
&lt;p&gt;By integrating Positron into JupyterHub, educators can provide students with a powerful development environment alongside the tools they already use. Students simply launch Positron from the JupyterHub interface, just as they would open JupyterLab or a different environment, and can begin working immediately.&lt;/p&gt;
&lt;h2 id="bringing-a-modern-data-science-ide-to-the-classroom"&gt;Bringing a Modern Data Science IDE to the Classroom&lt;/h2&gt;
&lt;p&gt;Positron combines the familiarity of notebook-based workflows with the capabilities of a professional integrated development environment (IDE). Once launched through JupyterHub, students have access to the complete Positron experience, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprehensive support for both Python and R&lt;/li&gt;
&lt;li&gt;Access to the OpenVSX extension marketplace&lt;/li&gt;
&lt;li&gt;Built-in data viewer and variables explorer&lt;/li&gt;
&lt;li&gt;Integrated help pane, debugging tools, and version control&lt;/li&gt;
&lt;li&gt;Advanced development features that help students grow their data science skills over time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach allows instructors to standardize course environments while reducing the technical barriers often associated with software installation and configuration.&lt;/p&gt;
&lt;h2 id="designed-to-work-with-existing-jupyterhub-deployments"&gt;Designed to Work with Existing JupyterHub Deployments&lt;/h2&gt;
&lt;p&gt;Positron Server is built to integrate directly into existing JupyterHub environments, making adoption straightforward for administrators already managing Jupyter-based infrastructure.&lt;/p&gt;
&lt;p&gt;The solution is compatible with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JupyterHub deployments running JupyterLab 4&lt;/li&gt;
&lt;li&gt;Python 3.9 and later environments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Installation is provided through the &lt;a href="https://posit-dev.github.io/jupyter-positron-server/"&gt;jupyter-positron-server&lt;/a&gt; Python package, which is built on &lt;a href="https://jupyter-server-proxy.readthedocs.io/"&gt;Jupyter Server Proxy&lt;/a&gt;. For administrators who have previously configured services within JupyterHub, the setup process will feel familiar.&lt;/p&gt;
&lt;p&gt;Rather than functioning as a standalone desktop application, Positron Server extends existing JupyterHub deployments by making the Positron IDE available as another launch option within the environment.&lt;/p&gt;
&lt;h2 id="free-educational-licensing-for-teaching"&gt;Free Educational Licensing for Teaching&lt;/h2&gt;
&lt;p&gt;Academic institutions using Positron for instructional purposes are eligible for a free teaching license. Under this license, access can be provided to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Currently enrolled students&lt;/li&gt;
&lt;li&gt;Course participants&lt;/li&gt;
&lt;li&gt;Faculty and staff involved in delivering educational programs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This licensing model enables institutions to incorporate Positron into coursework without additional software costs, helping educators provide professional-grade tools to learners.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;Institutions interested in offering Positron through JupyterHub can get started in three simple steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Review the eligibility requirements outlined in the &lt;a href="https://positron.posit.co/licensing.html#positron-education-license-rider"&gt;Positron Education License Rider&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://positron.posit.co/education.html#applying-for-a-teaching-license"&gt;Contact Posit&lt;/a&gt; to request a free teaching license.&lt;/li&gt;
&lt;li&gt;Follow the &lt;a href="https://posit-dev.github.io/jupyter-positron-server/"&gt;jupyter-positron-server&lt;/a&gt; installation and configuration documentation to deploy Positron within your JupyterHub environment.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="supporting-the-next-generation-of-data-scientists"&gt;Supporting the Next Generation of Data Scientists&lt;/h2&gt;
&lt;p&gt;As data science and computational research continue to grow across disciplines, educational institutions are looking for ways to provide students with professional tools that are easy to access and manage. By bringing Positron directly into JupyterHub, universities can deliver a modern, scalable development environment that supports both teaching and learning while minimizing setup complexity.&lt;/p&gt;
&lt;p&gt;Whether students are writing Python code, analyzing data in R, or exploring advanced development workflows, Positron Server helps create a seamless experience from the first day of class through more advanced coursework and research projects.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="education"/><category term="JupyterHub"/></entry><entry><title>Navigating the Post-Workshop Fog: a Path to Myst</title><link href="https://blog.jupyter.org/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/" rel="alternate"/><published>2026-07-09T15:15:00+00:00</published><updated>2026-07-09T15:15:00+00:00</updated><author><name>Chiara Marmo</name></author><id>tag:blog.jupyter.org,2026-07-09:/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/</id><summary type="html">&lt;p&gt;From June 15th to 17th 2026 a Jupyter Workshop took place at Paris-Saclay University : “Demystifying MyST Markdown in education”. The workshop combined presentations in the mornings with collaborative sprints during the afternoons. It has been funded by the Jupyter Foundation and SaclAI-School.&lt;/p&gt;</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/images/001-1_rxDzW-V0Ey6pg-hkg2bPag.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;From June 15th to 17th 2026 a &lt;a href="https://events.linuxfoundation.org/jupyter-workshops/"&gt;Jupyter Workshop&lt;/a&gt; took place at Paris-Saclay University : “&lt;a href="https://blog.jupyter.org/posts/2026/a-jupyter-workshop-demystifying-myst-markdown-in/"&gt;Demystifying MyST Markdown in education&lt;/a&gt;”. The workshop combined presentations in the mornings with collaborative sprints during the afternoons. It has been funded by the &lt;a href="https://jupyterfoundation.org/"&gt;Jupyter Foundation&lt;/a&gt; and &lt;a href="https://www.dataia.eu/formations"&gt;SaclAI-School&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="milestones"&gt;Milestones&lt;/h2&gt;
&lt;h3 id="improving-documentation-and-tools-for-easier-deployment-even-for-non-specialists"&gt;Improving documentation and tools for easier deployment even for non-specialists&lt;/h3&gt;
&lt;p&gt;Freek Pols from Delft University and Brigitta Sipočz form CalTech presented some examples and challenges in publishing courses and documentation at large scales. Angus Hollands, MyST maintainer, made an in depth presentation of Myst and JupyterBook2. Guided tutorials introduced participants to complete a Jupyter Book workflow. The participants learned how to create their first Jupyter Book, and how to publish it.&lt;/p&gt;
&lt;h3 id="text-notebooks-as-first-citizens"&gt;Text notebooks as first citizens&lt;/h3&gt;
&lt;p&gt;Marc Wouts and Yahya Heni discussed the path from &lt;a href="https://jupytext.org/"&gt;jupytext&lt;/a&gt; to &lt;a href="https://github.com/notebook-link/jupyter-plainb"&gt;jupyter-plainb&lt;/a&gt; to open and execute plain markdown text notebooks directly in Jupyter Lab. Two Jupyter Enhancement Proposals (JEP) has been discussed together with Jupyter Lab and MyST maintainers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter/enhancement-proposals/pull/103"&gt;Markdown based notebooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter/enhancement-proposals/pull/138"&gt;Specify the markup language and flavor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="one-step-at-a-time"&gt;One step at a time&lt;/h2&gt;
&lt;p&gt;Over 30 &lt;a href="https://github.com/search?q=myst-education-2026&amp;amp;type=issues"&gt;issues&lt;/a&gt; and &lt;a href="https://github.com/search?q=myst-education-2026&amp;amp;type=pullrequests"&gt;pull requests&lt;/a&gt; have been opened in the whole Jupyter ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;documentation items: for example, about &lt;a href="https://github.com/jupytext/jupytext/issues/1548"&gt;text notebooks in jupyterlite&lt;/a&gt; or publishing on &lt;a href="https://github.com/jupyter-book/jupyter-book/pull/2635"&gt;different hosting solutions&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;feature requests: for example, &lt;a href="https://github.com/jupyter-book/jupyter-book/issues/2634"&gt;single document feature in JupyterBook2&lt;/a&gt;, &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/19093"&gt;non-default application to open files in Jupyter Lab&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;adopt JupyterBook2 for software documentation: for instance &lt;a href="https://github.com/mwouts/itables/pull/570"&gt;itables&lt;/a&gt; and &lt;a href="https://gitlab.com/travo-cr/travo/-/merge_requests/240"&gt;travo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sidewalks"&gt;Sidewalks&lt;/h2&gt;
&lt;p&gt;The workshop provided the opportunity to continue previous discussions about AI in education: some participants attended the workshop “&lt;a href="https://events.linuxfoundation.org/ai-in-jupyter/"&gt;AI in Jupyter&lt;/a&gt;” and were able to pick up the conversation from there.&lt;/p&gt;
&lt;p&gt;Relationships between Academia and Open Source Software communities were also topic of conversation: about Open Source Program Offices (OSPOs) and how their action can be connected to education strategies.&lt;/p&gt;
&lt;h2 id="wandering"&gt;Wandering&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/navigating-the-post-workshop-fog-a-path-to-myst/images/002-1_aWttEDS_jHdMWa1ZwvimPg.jpeg" alt="Participant group photo" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Collaboration is a matter of trust. That’s why it is still important for people to meet in person and to know each other. It is about exchanging details, like keys to decrypt characters and aspirations. One might discover a shared passion for shoes. Another may finally enjoy long French-style lunch breaks.&lt;/p&gt;
&lt;p&gt;When the time comes to resume the path, important steps have already been taken in the right direction.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="education"/><category term="events"/><category term="Jupyter Book"/><category term="MyST"/><category term="workshops"/></entry><entry><title>A Jupyter Workshop: Demystifying MyST Markdown in Education</title><link href="https://blog.jupyter.org/posts/2026/a-jupyter-workshop-demystifying-myst-markdown-in/" rel="alternate"/><published>2026-04-30T15:05:00+00:00</published><updated>2026-04-30T15:05:00+00:00</updated><author><name>Chiara Marmo</name></author><id>tag:blog.jupyter.org,2026-04-30:/posts/2026/a-jupyter-workshop-demystifying-myst-markdown-in/</id><summary type="html">&lt;p&gt;A new Jupyter Workshop is happening June 15–17, 2026 in Orsay, France. Demystifying MyST Markdown in Education is a three-day workshop organized by the Jupyter community, focused on helping science educators adopt Jupyter Book and the MyST document engine for their teaching materials.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A new &lt;a href="https://events.linuxfoundation.org/jupyter-workshops/"&gt;Jupyter Workshop&lt;/a&gt; is happening &lt;strong&gt;June 15–17, 2026&lt;/strong&gt; in Orsay, France. &lt;a href="https://events.linuxfoundation.org/demystifying-myst-markdown/"&gt;Demystifying MyST Markdown in Education&lt;/a&gt; is a three-day workshop organized by the Jupyter community, focused on helping science educators adopt Jupyter Book and the MyST document engine for their teaching materials.&lt;/p&gt;
&lt;h2 id="whats-it-about"&gt;What’s it about?&lt;/h2&gt;
&lt;p&gt;The workshop aims to remove barriers for educators who want to use Jupyter Book and MyST to publish accessible, reproducible pedagogical content. Here are the broad topics of each day of the event:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Teaching use cases and needs&lt;/strong&gt; : what educators actually need from tools like Jupyter Book.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contributor tutorials and onboarding&lt;/strong&gt; : how to get involved with the project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MyST Markdown as a text representation for Jupyter notebooks :&lt;/strong&gt; writing and sharing computational narratives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attendees will learn how to contribute to the Jupyter Book community, collaborate with maintainers, and advocate for the needs of their users.&lt;/p&gt;
&lt;p&gt;Have a look to the &lt;a href="https://events.linuxfoundation.org/demystifying-myst-markdown/program/schedule/"&gt;workshop agenda&lt;/a&gt; and if you have ideas you would like to be discussed there, please share them in the &lt;a href="https://github.com/jupyter-book/team-compass/issues/47"&gt;related issue&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="where-and-how-to-join"&gt;Where and how to join&lt;/h2&gt;
&lt;p&gt;The workshop is hosted by &lt;a href="https://www.lisn.upsaclay.fr/"&gt;Laboratoire Interdisciplinaire des Sciences du Numérique (LISN)&lt;/a&gt; and supported by &lt;a href="https://www.dataia.eu/en/saclai-school"&gt;SaclAI-School&lt;/a&gt; at Université Paris-Saclay.&lt;br&gt;
&lt;strong&gt;Travel funding is available&lt;/strong&gt;, &lt;a href="https://events.linuxfoundation.org/demystifying-myst-markdown/attend/travel-funding/"&gt;apply here for travel funding&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Registration and full details are on the &lt;a href="https://events.linuxfoundation.org/demystifying-myst-markdown/"&gt;event page&lt;/a&gt;.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="thanks"&gt;Thanks&lt;/h2&gt;
&lt;p&gt;A huge thank you to the whole Jupyter community supporting the event and to the &lt;a href="https://blog.jupyter.org/posts/2025/jupyter-community-workshops-early-2026/"&gt;Jupyter Foundation&lt;/a&gt; for making it possible.&lt;/p&gt;
</content><category term="education"/><category term="events"/><category term="Jupyter Book"/><category term="MyST"/><category term="workshops"/></entry><entry><title>Better sharing UX with nbgitpuller and contextual error handling</title><link href="https://blog.jupyter.org/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/" rel="alternate"/><published>2026-04-09T15:02:00+00:00</published><updated>2026-04-09T15:02:00+00:00</updated><author><name>Jenny Wong</name></author><id>tag:blog.jupyter.org,2026-04-09:/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/</id><summary type="html">&lt;p&gt;nbgitpuller now has improved UX context-aware error handling. Update to version 1.3.0 and let us know what you think by opening an issue 🚀&lt;/p&gt;</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/001-1_d1wtukpXH7983Z0nCKv33Q.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyterhub/nbgitpuller"&gt;nbgitpuller&lt;/a&gt; now has improved UX context-aware error handling. Update to &lt;a href="https://pypi.org/project/nbgitpuller/1.3.0/"&gt;version 1.3.0&lt;/a&gt; and let us know what you think by opening an &lt;a href="https://github.com/jupyterhub/nbgitpuller/issues"&gt;issue&lt;/a&gt; 🚀&lt;/p&gt;
&lt;h2 id="what-is-nbgitpuller"&gt;What is nbgitpuller?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyterhub/nbgitpuller"&gt;nbgitpuller&lt;/a&gt; lets you distribute content to a Jupyter user via the click of a button! This allows your users to focus on the content without needing to understand git or other version control machinery.&lt;/p&gt;
&lt;p&gt;nbgitpuller provides &lt;a href="https://nbgitpuller.readthedocs.io/en/latest/topic/automatic-merging.html"&gt;automatic, opinionated conflict resolution&lt;/a&gt; by using git under the hood. It is commonly used to distribute content to multiple users of a JupyterHub, though it works just fine on an individual person’s computer, if they have Jupyter installed.&lt;/p&gt;
&lt;p&gt;Here’s an example of nbgitpuller in action:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The author uses the &lt;a href="https://nbgitpuller.readthedocs.io/en/latest/link.html"&gt;nbgitpuller link generator&lt;/a&gt; to create a link.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/002-0_2M4f_Hh6iyGP7VCo.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The consumer clicks the link, and the content is pulled into a live Jupyter session.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/003-0_J_A7MbZ2JI5hZh7n.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example use cases for sharing with nbgitpuller include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interactive demos&lt;/li&gt;
&lt;li&gt;Workshop and training scenarios&lt;/li&gt;
&lt;li&gt;University exams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and many more!&lt;/p&gt;
&lt;h2 id="how-does-nbgitpuller-work"&gt;How does nbgitpuller work?&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;nbgitpuller&lt;/code&gt; package is installed in the compute environment. The compute environment now has a &lt;code&gt;/git-pull&lt;/code&gt; endpoint URL that can understand where to pull content from using URL parameters. Syncing content critically depends on &lt;code&gt;git&lt;/code&gt; operations to &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;checkout&lt;/code&gt;, &lt;code&gt;clone&lt;/code&gt;, &lt;code&gt;merge&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h2 id="when-it-goes-wrong"&gt;When it goes wrong&lt;/h2&gt;
&lt;p&gt;Based on the data sent through by the kind folks running the Berkeley DataHub, there were 2163 logs available, of which:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;983 (45%) were ‘merge’ conflicts&lt;/li&gt;
&lt;li&gt;493 (23%) were ‘fetch’ errors&lt;/li&gt;
&lt;li&gt;467 (22%) were ‘ls-remote’ errors&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Bar chart showing the most common errors users faced." src="https://blog.jupyter.org/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/004-1_v1NGeWyH5Frl9QDJ2qed0Q.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Bar chart showing the most common errors users faced.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The remaining errors (10%) were mostly ‘checkout’ errors. This represents the most &lt;strong&gt;frequent&lt;/strong&gt; errors as seen by students.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Bar chart showing the most unique errors link authors made." src="https://blog.jupyter.org/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/005-1_6sYjI1QPnc_yz6IiIw442g.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Bar chart showing the most unique errors link authors made.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In the same set of logs, there were 172 &lt;strong&gt;unique&lt;/strong&gt; errors: most ‘ls-remote’ errors come from mistakes in the content repo URL. This represents the most uniquely common errors made by instructors.&lt;/p&gt;
&lt;h2 id="merge-conflicts"&gt;Merge conflicts&lt;/h2&gt;
&lt;p&gt;If the link author changes content after the consumer clicks a link, then &lt;code&gt;nbgitpuller&lt;/code&gt; needs to sync updates for the consumer on subsequent link clicks. The &lt;code&gt;nbgitpuller&lt;/code&gt; merging strategy makes opinionated choices so that the link consumer &lt;em&gt;never&lt;/em&gt; has to interact with git, and will always preserve the consumer’s working changes.&lt;/p&gt;
&lt;p&gt;Things can go wrong when&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consumers can diverge the git history if they perform a git commit&lt;/li&gt;
&lt;li&gt;Authors can diverge the git history if they perform force push commits&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="error-ux-old"&gt;Error UX (old)&lt;/h2&gt;
&lt;figure&gt;
&lt;img alt="Old UX for merge errors." src="https://blog.jupyter.org/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/006-1_prhJ0nFlArAhfFwFFZbbLA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Old UX for merge errors.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Problems with the old UX include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a scary terminal&lt;/li&gt;
&lt;li&gt;difficulty for the user to figure out what went wrong&lt;/li&gt;
&lt;li&gt;no suggestion for the user to fix the problem or a signpost to continue to the compute platform&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="error-ux-new"&gt;Error UX (new)&lt;/h2&gt;
&lt;figure&gt;
&lt;img alt="New UX for merge errors." src="https://blog.jupyter.org/posts/2026/better-sharing-ux-with-nbgitpuller-and-contextual-error/images/007-1_iE8c5G51r3qL8ITBFiOZKg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;New UX for merge errors.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;New improvements to the UX include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The terminal is closed by default, but you can optionally toggle it open&lt;/li&gt;
&lt;li&gt;There is a copy to clipboard button to easily share the error log from the terminal&lt;/li&gt;
&lt;li&gt;A more user-friendly and context-aware helper message is displayed&lt;/li&gt;
&lt;li&gt;A link to the general documentation for reference&lt;/li&gt;
&lt;li&gt;A ‘Proceed without syncing’ button takes the user to the compute platform without making any changes&lt;/li&gt;
&lt;li&gt;In the case of merge errors, an extra &lt;strong&gt;Backup and resync&lt;/strong&gt; button option is presented&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learn-more"&gt;Learn more&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nbgitpuller.readthedocs.io/en/latest/"&gt;nbgitpuller documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.berkeley.edu/"&gt;UC Berkeley&lt;/a&gt; and the &lt;a href="https://www.cloudbank.org/training/access-cloudbank-classroom"&gt;CloudBank Classroom&lt;/a&gt; project&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cal-icor.org/"&gt;CAL ICOR&lt;/a&gt; for co-funding this development work&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ericvd-ucb"&gt;Eric Van Dusen&lt;/a&gt; and &lt;a href="https://github.com/sean-morris"&gt;Sean Morris&lt;/a&gt; for championing this work&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/balajialg"&gt;Balaji Alwar&lt;/a&gt; for providing the error data and sharing feedback&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nthiery"&gt;Nicolas M. Thiéry&lt;/a&gt; for feedback on the UX design&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cmarmo"&gt;cmarmo&lt;/a&gt; for contributing the ‘Backup and resync button’&lt;/li&gt;
&lt;/ul&gt;
</content><category term="education"/><category term="JupyterHub"/></entry><entry><title>JupyterLite Officially Joins Project Jupyter!</title><link href="https://blog.jupyter.org/posts/2026/jupyterlite-officially-joins-project-jupyter/" rel="alternate"/><published>2026-02-12T16:14:00+00:00</published><updated>2026-02-19T12:26:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:blog.jupyter.org,2026-02-12:/posts/2026/jupyterlite-officially-joins-project-jupyter/</id><summary type="html">&lt;p&gt;We are thrilled to announce that JupyterLite is now an official part of Project Jupyter. This milestone marks a significant step forward for interactive computing in the browser and strengthens JupyterLite’s role within the Jupyter ecosystem.&lt;/p&gt;</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlite-officially-joins-project-jupyter/images/001-1_1mHVBUr6tB3TP0Z1ujvdjw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We are thrilled to announce that JupyterLite is now an official part of Project Jupyter. This milestone marks a significant step forward for interactive computing in the browser and strengthens JupyterLite’s role within the Jupyter ecosystem.&lt;/p&gt;
&lt;h2 id="what-is-jupyterlite"&gt;What is JupyterLite?&lt;/h2&gt;
&lt;p&gt;JupyterLite is a JupyterLab distribution that runs entirely in your web browser. Kernels execute directly in the browser using WebAssembly, eliminating the need for an application server. This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instant access&lt;/strong&gt;: Start computing with a single click: no prior Python setup, environment configuration, or server management required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Host thousands of concurrent users from a static website (e.g., GitHub Pages) with zero per-user server costs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacy and portability&lt;/strong&gt;: Code and data remain in the user’s browser, making it ideal for embedding in documentation, tutorials, and interactive demos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JupyterLite greatly expands the options available in the Jupyter ecosystem for &lt;strong&gt;education&lt;/strong&gt;, &lt;strong&gt;documentation&lt;/strong&gt;, and &lt;strong&gt;demos&lt;/strong&gt;, where reducing friction is critical.&lt;/p&gt;
&lt;p&gt;As Brian Granger reminded us during his &lt;a href="https://youtu.be/IJO7_v7GEVc?si=8_0bMM39ci_QulYb&amp;amp;t=337"&gt;JupyterCon 2025 keynote&lt;/a&gt;, Jupyter’s mission is “to empower people of all backgrounds to think, collaborate, and share knowledge using computational storytelling.” From this perspective, JupyterLite is a logical and key next step to take, letting Jupyter take advantage of the impressive strides made in recent years by the WebAssembly/JavaScript ecosystem (in reach and capability) to advance this mission. JupyterLite is an excellent complement to other forms of accessing Jupyter (whether through a local Python installation or a hosted infrastructure service), that facilitates new use cases and lowers barriers in many others.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screencast of JupyterLite in action, showing a live jupyter notebook with widgets and data visualisation." src="https://blog.jupyter.org/posts/2026/jupyterlite-officially-joins-project-jupyter/images/002-1_OEJksEVfQVZugt_d6EYXBQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Interactive computing in the browser with JupyterLite&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="the-journey-of-jupyterlite"&gt;The Journey of JupyterLite&lt;/h2&gt;
&lt;p&gt;JupyterLite’s development began in 2021, led by &lt;strong&gt;Jeremy Tuloup&lt;/strong&gt; at &lt;strong&gt;QuantStack&lt;/strong&gt;. Over the past four years, it has benefited from the dedication of several other team members, Martin Renou, Trung Le, and Ian Thomas — as well as invaluable contributions from &lt;strong&gt;community members&lt;/strong&gt; like Nick Bollweg and many others.&lt;/p&gt;
&lt;p&gt;Beyond the JupyterLite repository, the project includes &lt;strong&gt;comprehensive tooling&lt;/strong&gt; for creating in-browser language kernels based on &lt;strong&gt;xeus&lt;/strong&gt;. These kernels support languages like &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;R&lt;/strong&gt;, &lt;strong&gt;C++&lt;/strong&gt;, &lt;strong&gt;GNU Octave&lt;/strong&gt;, &lt;strong&gt;Lua&lt;/strong&gt;, and &lt;strong&gt;SQLite&lt;/strong&gt;, sharing the same codebase as their backend counterparts, developed by Thorsten Beier, Isabel Paredes, Johan Mabille, and Antoine Prouvost. These kernels are built upon the &lt;strong&gt;emscripten-forge&lt;/strong&gt; software distribution for WebAssembly. The project also includes a Python kernel based on &lt;strong&gt;Pyodide&lt;/strong&gt;, and kernels for JavaScript and &lt;a href="https://p5js.org/"&gt;p5.js&lt;/a&gt;. This architecture means that the same language-agnostic model for kernels that Jupyter pioneered over a decade ago, carries over to the WebAssembly world.&lt;/p&gt;
&lt;p&gt;The JupyterLite GitHub organization also features the &lt;strong&gt;JupyterLite Terminal&lt;/strong&gt;, a terminal and shell emulator that runs entirely in the browser and was developed by Ian Thomas. It enables the use of basic Unix commands like &lt;strong&gt;grep&lt;/strong&gt;, &lt;strong&gt;sed&lt;/strong&gt;, &lt;strong&gt;cat&lt;/strong&gt;, &lt;strong&gt;touch&lt;/strong&gt;, and even &lt;strong&gt;vim&lt;/strong&gt; or &lt;strong&gt;nano&lt;/strong&gt;, all built to WebAssembly.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of the JupyterLite terminal emulator, showing some basic Unix commands" src="https://blog.jupyter.org/posts/2026/jupyterlite-officially-joins-project-jupyter/images/003-1_8hPGoJK8chK2uEVlL9ig9Q.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterLite terminal emulator, with basic Unix commands&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;JupyterLite now powers the &lt;strong&gt;official Jupyter website&lt;/strong&gt; and is used by projects like &lt;strong&gt;numpy.org&lt;/strong&gt;, &lt;strong&gt;sympy.org&lt;/strong&gt;. It also underlies services such as &lt;a href="https://www.jupytereverywhere.org/"&gt;&lt;strong&gt;Jupyter Everywhere&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://notebook.link/"&gt;&lt;strong&gt;notebook.link&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="a-natural-fit-with-jupyterlab"&gt;A Natural Fit with JupyterLab&lt;/h2&gt;
&lt;p&gt;JupyterLite has always been closely tied to JupyterLab. It is increasingly becoming a set of JupyterLab extensions that replace core plugins to manage kernels, settings, and content in the browser. With contributors overlapping significantly with the Jupyter Frontends group, this integration formalizes what many in the community already recognized: JupyterLite is a core part of the Jupyter ecosystem.&lt;/p&gt;
&lt;p&gt;The proposal to transfer JupyterLite to the Jupyter governance received strong support from the Jupyter community and by the &lt;a href="https://github.com/jupyterlab/frontends-team-compass/issues/290"&gt;Jupyter Frontends council&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="better-integration-with-the-rest-of-jupyter"&gt;Better integration with the rest of Jupyter&lt;/h2&gt;
&lt;p&gt;With JupyterLite now being an official part of Jupyter, it will be easier to find areas for better integration with other aspects of our ecosystem: we can reduce duplication, smooth out the documentation and model for creating and using both “traditional” (server-hosted) and WebAssembly kernels, and make JupyterLite a natural instant-access component of &lt;a href="https://mystmd.org/guide/in-page-execution#jupyterlite"&gt;MyST/JupyterBook-based sites&lt;/a&gt;, and more.&lt;/p&gt;
&lt;p&gt;Mission-wise, JupyterLite is a natural next step for Jupyter, and having it be an official part of the project makes it much easier for the community to integrate its benefits throughout. We hope you’ll try it, use it and contribute to its growth!&lt;/p&gt;
&lt;h2 id="try-it-in-your-browser"&gt;Try it in your browser&lt;/h2&gt;
&lt;p&gt;If you would like to try JupyterLite in your browser, click on the following link:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://jupyter.org/try-jupyter/"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/jupyterlite-officially-joins-project-jupyter/images/004-1_EUSdzza6CGF6EA195jkzCA.webp" alt="Try lite now." loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgments-and-team-credits"&gt;Acknowledgments and team credits&lt;/h2&gt;
&lt;p&gt;JupyterLite’s success is thanks to the support of &lt;strong&gt;individuals and organizations&lt;/strong&gt; who believed in its vision. This includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QuantStack&lt;/strong&gt;, for their continued investment in the project since 2021 and the broader Jupyter ecosystem,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bloomberg&lt;/strong&gt;, for funding improvements to JupyterLite by QuantStack since 2023,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Gates Foundation&lt;/strong&gt;, for funding the development of the xeus-R kernel and its port to WebAssembly,&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Pyodide&lt;/strong&gt; project, whose pioneering work on Python in the browser via WebAssembly made JupyterLite possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Key developers to this stack include:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Jeremy Tuloup&lt;/strong&gt; (Director at QuantStack, creator of JupyterLite, and JupyterLab maintainer),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nicholas Bollweg&lt;/strong&gt; (JupyterLite maintainer and #2 all-time committer),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Martin Renou&lt;/strong&gt; (Director at QuantStack, JupyterLite maintainer, responsible for integrating xeus with emscripten-forge, and creator of JupyterLite-Sphinx),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thorsten Beier&lt;/strong&gt; (Software developer at QuantStack, lead developer of emscripten-forge, and xeus-lite),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isabel Paredes&lt;/strong&gt; (Software developer at QuantStack, led the packaging of R and GNU Octave in Emscripten-forge),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anutosh Bhat&lt;/strong&gt; (Software developer at QuantStack, C++ kernel in the browser),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ian Thomas&lt;/strong&gt; (Software developer at QuantStack, creator of the JupyterLite terminal, and the cockle shell emulator),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Johan Mabille&lt;/strong&gt; (Director at QuantStack, creator of xeus),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agriya Khetarpal&lt;/strong&gt; (Pyodide contributor, JupyterLite-Sphinx maintainer),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Albert Steppi&lt;/strong&gt; (JupyterLite-Sphinx maintainer).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you for being part of this journey, we cannot wait to see what you build with JupyterLite!&lt;/p&gt;
</content><category term="education"/><category term="governance"/><category term="JupyterLite"/><category term="WebAssembly"/></entry><entry><title>Desktop GIS software in the cloud with JupyterHub</title><link href="https://blog.jupyter.org/posts/2023/desktop-gis-software-in-the-cloud-with-jupyterhub/" rel="alternate"/><published>2023-08-02T16:23:00+00:00</published><updated>2023-08-02T16:51:00+00:00</updated><author><name>Matt Fisher</name></author><id>tag:blog.jupyter.org,2023-08-02:/posts/2023/desktop-gis-software-in-the-cloud-with-jupyterhub/</id><summary type="html">&lt;p&gt;A QGreenland workshop success story&lt;/p&gt;
</summary><content type="html">&lt;p&gt;👋 We are Trey Stafford and Matt Fisher, co-authors of the &lt;a href="https://github.com/nsidc/qgreenland"&gt;QGreenland&lt;/a&gt; data package’s source code. This year, we had the pleasure of running a hands-on geospatial data and open science &lt;a href="http://qgreenland-workshop-2023-researcher.github.io/"&gt;QGreenland Researcher Workshop&lt;/a&gt;. It was important for attendees to participate in the workshop in a hands-on way while minimizing the negative impacts of installing software, requiring expensive personal computers, and troubleshooting unique computer configurations. We felt a &lt;a href="https://jupyter.org/hub"&gt;JupyterHub&lt;/a&gt; was a good fit for our workshop for this reason, if it could accommodate our need for running QGIS — a desktop application.&lt;/p&gt;
&lt;p&gt;In this blog post, we will introduce QGreenland, describe our experience using JupyterHub in the cloud for our workshop’s computing environment, and discuss challenges we overcame to enable our attendees to use QGIS in a cloud graphical desktop environment. Finally, we will highlight some workshop outcomes and discuss opportunities for enhancement based on new developments in the Jupyter ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In our workshop, 25–30 international learners (including from Germany, India, France, Canada, Poland, and the United States) used &lt;em&gt;QGIS&lt;/em&gt; in a &lt;em&gt;JupyterHub&lt;/em&gt;’s browser-based Linux desktop environment to collaboratively test, explore, visualize, and process Earth science data simultaneously with the same user experience they expect from using &lt;em&gt;QGIS&lt;/em&gt; on their personal computers! Better yet, getting started was as simple as logging in.&lt;/strong&gt; Our workshop was a success story not just in education, but also in open source and collaborative development, and we want to share what we learned.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A map depicting Greenland is displayed within QGIS software running in a cloud-based desktop environment. A visualization of September 2012 Arctic sea ice concentration is overlaid." src="https://blog.jupyter.org/posts/2023/desktop-gis-software-in-the-cloud-with-jupyterhub/images/001-1_ZG76hcKdS3-4PppQ6lSnuQ.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Note the browser tabs at the top of this screenshot; this is a full desktop-based GIS environment running QGreenland in the cloud!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The JupyterHub used by the QGreenland 2023 Researcher Workshop was generously provided by the &lt;a href="https://cryointhecloud.com/"&gt;NASA CryoCloud&lt;/a&gt; team, whose mission is to help researchers transition to cloud-based collaboration.&lt;/p&gt;
&lt;h2 id="about-qgreenland"&gt;About QGreenland&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://qgreenland.org/"&gt;QGreenland&lt;/a&gt; is an open-source Greenland-focused geospatial data package for &lt;a href="https://qgis.org/en/site/"&gt;QGIS&lt;/a&gt;, a community-owned graphical Geographic Information System (GIS) platform. Researchers and members of the public leverage QGreenland’s ready-to-use interdisciplinary datasets to do field planning, teach about glaciers, and much more.&lt;/p&gt;
&lt;p&gt;QGreenland’s MIT-licensed &lt;a href="https://github.com/nsidc/qgreenland/"&gt;source code&lt;/a&gt; uses community-maintained open software like &lt;a href="https://gdal.org/index.html"&gt;GDAL&lt;/a&gt; and &lt;a href="https://qgis.org/pyqgis/latest"&gt;PyQGIS&lt;/a&gt; to automate data normalization and populate the QGIS project with important information like data provenance and the order of layers in the QGIS Layers Panel. Check out &lt;a href="https://qgreenland.readthedocs.io"&gt;our documentation&lt;/a&gt; to learn more! QGreenland also has a &lt;a href="https://www.youtube.com/@qgreenland/videos"&gt;YouTube channel&lt;/a&gt; with tutorials produced by &lt;a href="https://cires.colorado.edu/outreach/programs/qgreenland"&gt;CIRES Education and Outreach&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A map depicting Greenland is displayed within QGIS software running in a cloud-based desktop environment. Visualizations of bathymetric depth, Greenland ice sheet thickness, and Arctic sea routes are overlaid." src="https://blog.jupyter.org/posts/2023/desktop-gis-software-in-the-cloud-with-jupyterhub/images/002-0__t2MDU659mlYEvxD.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Once QGIS is installed, opening QGreenland is as easy as double-clicking the included “.qgs” file. Here, a representative view of QGreenland v3 alpha in QGIS is displayed with newly updated layers: Arctic sea routes (National Geospatial Intelligence Agency), bathymetric depth (General Bathymetric Chart of the Oceans (GEBCO)), and ice thickness (IceBridge BedMachine Greenland v5) layers.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Based on user research, QGreenland has enabled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the public to more easily access data gathered by researchers visiting Greenland: &lt;em&gt;“In Greenland, people are often asking, ‘how can we find the data the foreign scientists bring back from Greenland?’ Now we can directly utilize much of it.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;researchers to plan field work: &lt;em&gt;“Being able to use QGreenland at our field station was critical to our research process!”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;educators to develop interactive lessons about Greenland and climate change: &lt;em&gt;“…using QGreenland for presentations because it is presentation quality already.”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="qgreenlands-2023-researcher-workshop"&gt;QGreenland’s 2023 researcher workshop&lt;/h2&gt;
&lt;p&gt;One of the QGreenland team’s most important forms of direct user interaction and support is facilitating workshops. Most recently, we hosted a 3-day (total of 9 hours) virtual workshop for researchers focused on working with geospatial data in an open science framework. All of the &lt;a href="https://qgreenland-workshop-2023-researcher.github.io/content/materials.html"&gt;materials&lt;/a&gt; covered in the workshop were built &lt;a href="https://qgreenland-workshop-2023-researcher.github.io/content/built-with-open-source.html"&gt;using open-source tools&lt;/a&gt; and are MIT-licensed and &lt;a href="https://github.com/qgreenland-workshop-2023-researcher/qgreenland-workshop-2023-researcher.github.io"&gt;published on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="a-personal-computer-in-the-cloud"&gt;A “personal computer” in the cloud&lt;/h3&gt;
&lt;p&gt;We decided early on that we wanted to use JupyterHub to solve the diverse problems that come with “bring your own device” workshops. We experimented with administering our own &lt;a href="http://z2jh.jupyter.org"&gt;JupyterHub on Kubernetes&lt;/a&gt;, but the setup overhead was too high for our short workshop. CryoCloud’s JupyterHub enabled us to avoid this overhead and focus on serving our participants. Because the software that comprises CryoCloud is open-source and developed in collaboration with the communities CryoCloud serves, we could directly contribute to curating a computing environment ideal for our participants.&lt;/p&gt;
&lt;p&gt;JupyterHub is known for providing access to Jupyter Notebooks via JupyterLab, but it turns out it can also be used to host pretty much any interactive web based application! The &lt;a href="https://github.com/jupyterhub/jupyter-server-proxy/"&gt;jupyter-server-proxy&lt;/a&gt; project enables this, and there are additional packages that make running specific applications easier. &lt;a href="https://github.com/jupyterhub/jupyter-rsession-proxy"&gt;jupyter-rsession-proxy&lt;/a&gt; makes it easy to run &lt;a href="https://posit.co/download/rstudio-server/"&gt;RStudio&lt;/a&gt; inside JupyterHub, &lt;a href="https://github.com/betatim/vscode-binder/"&gt;jupyter-vscode-proxy&lt;/a&gt; allows running code-server (fully open source self-hosted version of Visual Studio Code) inside a JupyterHub, etc. Pertinent to our use case is &lt;a href="https://github.com/jupyterhub/jupyter-remote-desktop-proxy"&gt;jupyter-remote-desktop-proxy&lt;/a&gt;, which lets you run a complete Linux desktop environment inside your JupyterHub! This was critical for our workshop, as it allowed us to use QGIS — purely desktop software, not adapted for the web — from inside a web browser. Workshop participants did not need to install anything. This enabled participants to focus on the &lt;em&gt;content&lt;/em&gt; of our workshop rather than the logistics of setting up and debugging tools on their varied machines.&lt;/p&gt;
&lt;p&gt;The CryoCloud JupyterHub enabled each of our workshop participants to provision their own compute environment (JupyterLab + Linux Desktop) with all of our workshop’s dependencies pre-installed. It also set everyone on equitable footing — someone accessing the workshop on a 10 year old laptop would get the same computing resources as someone on a brand new MacBook Pro.&lt;/p&gt;
&lt;h3 id="challenges-scaling-qgreenland"&gt;Challenges scaling QGreenland&lt;/h3&gt;
&lt;p&gt;The CryoCloud JupyterHub already had &lt;em&gt;jupyter-remote-desktop-proxy&lt;/em&gt; and &lt;em&gt;QGIS&lt;/em&gt; installed, so we could validate this approach to our workshop quickly. However, to use &lt;em&gt;QGreenland&lt;/em&gt; at this scale, we needed to solve a couple of usability problems. The first issue was a user experience problem: the operating system did not have appropriate file type associations for &lt;em&gt;QGIS&lt;/em&gt;, so files like the &lt;em&gt;QGreenland&lt;/em&gt; project file would not open in &lt;em&gt;QGIS&lt;/em&gt; when double-clicked in the desktop file browser. We quickly discovered a solution and integrated it with a &lt;a href="https://github.com/CryoInTheCloud/hub-image/pull/59"&gt;simple pull request&lt;/a&gt; to the Docker image we were using.&lt;/p&gt;
&lt;p&gt;The second problem was a performance problem: QGIS would take several minutes to open QGreenland from the hub’s shared storage drive. After some investigation, it turned out this was due to us loading multiple GB of data from an NFS share! While a long term solution might involve getting QGIS to load data directly from cloud object storage (like S3), we instead decided to go a different route — provision each user a small, fast and temporary &lt;a href="https://aws.amazon.com/ebs/"&gt;Elastic Block Store&lt;/a&gt; disk. At the start of the workshop, we provided all users a small script that would copy the dataset from NFS to this faster disk once, and this drastically reduced load times from about 5 minutes to under 3 seconds! You can follow our debugging process &lt;a href="https://github.com/CryoInTheCloud/hub-image/issues/60"&gt;on this issue&lt;/a&gt;, and find the JupyterHub config used to provision these disks &lt;a href="https://github.com/2i2c-org/infrastructure/blob/5078e5b6e2115930468f910f3095a9ffd1261eb3/helm-charts/basehub/values.yaml#L616"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By overcoming these challenges, we created a smooth, intuitive, and performant computing experience for all of our participants, most of whom had never been exposed to this sort of collaborative computing environment.&lt;/p&gt;
&lt;h3 id="outcomes"&gt;Outcomes&lt;/h3&gt;
&lt;p&gt;The workshop participants engaged in small group work to complete various exercises, group discussions, and data scenarios. Each group produced Jupyter Notebooks and GitHub Discussions posts as deliverables. We created an &lt;a href="https://qgreenland-workshop-2023-researcher.github.io/outcomes/"&gt;outcomes&lt;/a&gt; webpage to summarize our participants’ accomplishments. One highlight was &lt;a href="https://github.com/orgs/qgreenland-workshop-2023-researcher/discussions/categories/fair-care"&gt;participants’ insightful commentary on FAIR &amp;amp; CARE principles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Based on these outcomes, we consider our workshop a success. While we put in a significant amount of time creating our materials, CryoCloud’s cloud costs and our time investment in preparing computing resources were relatively small. For approximately 25 people, our cloud costs break down to roughly &lt;strong&gt;$1/person/day&lt;/strong&gt;!&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The CryoCloud JupyterHub met our workshop needs and provided a delightful experience for administrators and participants alike, and we are excited for what’s next. JupyterLab 4 and jupyter_collaboration v1.0.0, a real-time collaboration extension, were &lt;a href="https://blog.jupyter.org/posts/2023/jupyterlab-4-0-is-here/"&gt;just announced&lt;/a&gt;, and the CryoCloud team is currently working to integrate these new releases into their hub. Real-time collaboration will enable exciting cloud use cases, like small groups working together on the same notebook without a screen share, or organizers providing technical support in a live notebook. We anticipate running this workshop again. We are excited to use JupyterHub again and look forward to experimenting with these new features!&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;h3 id="reviewers"&gt;Reviewers&lt;/h3&gt;
&lt;p&gt;In alphabetical order, thanks to Twila Moon, Yuvi Panda, Tasha Snow, and Alyse Thurber for their time contributing to this post!&lt;/p&gt;
&lt;h3 id="cryocloud"&gt;CryoCloud&lt;/h3&gt;
&lt;p&gt;Snow, Tasha, Millstein, Joanna, Scheick, Jessica, Sauthoff, Wilson, Leong, Wei Ji, Colliander, James, Pérez, Fernando, James Munroe, Felikson, Denis, Sutterley, Tyler, &amp;amp; Siegfried, Matthew. (2023). CryoCloud JupyterBook (2023.01.26). Zenodo.&lt;a href="https://doi.org/10.5281/zenodo.7576602"&gt;https://doi.org/10.5281/zenodo.7576602&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2i2c"&gt;2i2c&lt;/h3&gt;
&lt;p&gt;2i2c is a non-profit organization that runs open-source &lt;a href="https://github.com/2i2c-org/infrastructure"&gt;infrastructure&lt;/a&gt; for collaborative computing, and maintains the CryoCloud JupyterHub used in this workshop. You can see the complete configuration of this JupyterHub in this &lt;a href="https://github.com/CryoInTheCloud/hub-image"&gt;public repository&lt;/a&gt;.&lt;/p&gt;
</content><category term="cloud computing"/><category term="education"/><category term="events"/><category term="geoscience"/><category term="JupyterHub"/><category term="science"/><category term="workshops"/></entry><entry><title>Introducing “Learn Python with Jupyter”</title><link href="https://blog.jupyter.org/posts/2023/introducing-learn-python-with-jupyter/" rel="alternate"/><published>2023-04-28T06:14:00+00:00</published><updated>2023-04-28T06:14:00+00:00</updated><author><name>Serena Bonaretti</name></author><id>tag:blog.jupyter.org,2023-04-28:/posts/2023/introducing-learn-python-with-jupyter/</id><summary type="html">&lt;p&gt;A free course book to develop computational thinking while learning to code&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Learning a &lt;em&gt;programming&lt;/em&gt; language is about learning a &lt;em&gt;language&lt;/em&gt;. When learning a new language (such as French, Korean, etc.), we commonly learn two key components: a way of thinking–which is typically connected to a culture–and grammar–that is, how to arrange elements of speech (verbs, nouns, etc.) to create coherent sentences. Each aspect usually has a dedicated book. We study how to greet people, order a coffee, and ask for directions on the streets–that is, how to behave and &lt;em&gt;think&lt;/em&gt; in that language–in &lt;em&gt;course&lt;/em&gt; books. At the same time, we deepen and refine our grammar knowledge in &lt;em&gt;grammar&lt;/em&gt; books, where chapters explain elements of speech providing detailed rules, list of exceptions, and short disjoint examples.&lt;/p&gt;
&lt;p&gt;Books to learn &lt;em&gt;programming&lt;/em&gt; languages typically follow a &lt;em&gt;grammar&lt;/em&gt; book format. Each chapter covers a different aspect of coding grammar (such as data structures, loops, etc.) with brief examples that frequently use mathematics. Finding &lt;em&gt;course&lt;/em&gt; books that gradually teach to &lt;em&gt;think&lt;/em&gt; in a coding language is rare.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Learn Python with Jupyter&lt;/em&gt; is intended as a &lt;em&gt;course&lt;/em&gt; book to help develop computational thinking while learning to code in Python. Similar to language course books, each chapter starts with a story (or a few long examples) to introduce a new topic, while providing context and favoring pattern memorization (Fig. 1A). In coding, stories are possible thanks to Jupyter notebooks, which allow seamless integration of narrative and code in the same file. Each story is accompanied by code pronunciation, as pronunciation affects thinking (e.g., &lt;code&gt;=&lt;/code&gt; should be pronounced as “is assigned”, not as “equals”). Code and concepts presented in the story are then thoroughly described and definitions are highlighted in colored boxes (Fig. 1B). Learners have the possibility to elaborate on the presented topic with theoretical quizzes and exercises (True or false, Match the sentence halves, etc.) as well as coding exercises of increasing difficulty (Fig. 1C). Chapters finish with bullet-point recaps reformulating the latest concepts (Fig. 1D), and with a “More in depth session” addressing error management, good practice, and coding suggestions (Fig. 1E).&lt;/p&gt;
&lt;p&gt;The order of topics presented in &lt;em&gt;Learn Python with Jupyter&lt;/em&gt; supports development of computational thinking by progressing from spoken language to abstract symbols and constructs. The very first chapters (1–5) introduce strings as English words, followed by lists of strings, if/else conditions, and basic methods for list manipulation. The following chapters (6–12) explain slicing as an abstract alternative to list methods and the for loop as an automatic way to slice list elements. These chapters mark the transition from concrete to abstract thinking, after which more complex topics are explained. The remaining chapters (13–38) introduce numbers, more coding syntax and constructs (e.g., while loop, dictionaries, functions, etc.), and typical aspects of coding, such as “divide and conquer”, “debugging”, etc.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Figure 1. Chapter sections in Learn Python with Jupyter" src="https://blog.jupyter.org/posts/2023/introducing-learn-python-with-jupyter/images/001-1_YogfUsOzSo54H_RaM8t8iA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Figure 1. Chapter sections in &lt;em&gt;Learn Python with Jupyter&lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;Learn Python with Jupyter&lt;/em&gt; aims at enabling absolute beginners–who have never been exposed to any programming language–to learn coding. This aim is supported by the conviction that everybody, regardless of social circumstances or gender, has the right to become digitally literate and acquire awareness of the increasingly digitalized world we live in. The book is free and is currently halfway finished. A new chapter is released on &lt;a href="http://learnpythonwithjupyter.com/"&gt;learnpythonwithjupyter.com&lt;/a&gt; every 4–6 weeks along with the related Jupyter notebook.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="education"/></entry><entry><title>Jupyter Community Workshop: Jupyter for Education</title><link href="https://blog.jupyter.org/posts/2022/jupyter-community-workshop-jupyter-for-education/" rel="alternate"/><published>2022-12-05T23:37:00+00:00</published><updated>2022-12-19T11:40:00+00:00</updated><author><name>Sylvain Corlay</name></author><id>tag:blog.jupyter.org,2022-12-05:/posts/2022/jupyter-community-workshop-jupyter-for-education/</id><summary type="html">&lt;p&gt;We are excited to announce the next in-person Jupyter Community Workshop! It will focus on the use of Jupyter for Education.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are excited to announce the next in-person Jupyter Community Workshop! It will focus on the use of Jupyter for Education.&lt;/p&gt;
&lt;p&gt;The event will be held at the Conservatoire National des Arts et Métiers (CNAM) headquarters in &lt;strong&gt;Paris&lt;/strong&gt;, France, &lt;strong&gt;from January 24th to January 26th&lt;/strong&gt;, 2023. Funding for travel expenses is available for attendees from academia and those from groups which are not well-represented in the Jupyter and wider tech community!&lt;/p&gt;
&lt;p&gt;Jupyter Community Workshop are a series of community-organized events to tackle challenging development and design projects, growing the community of contributors, and strengthening collaborations.&lt;/p&gt;
&lt;p&gt;This workshop will focus on the use of Jupyter for education. The goal is to bring together contributors, and community members to further the development of Jupyter-based tools and practices for education. Given the broad variety of topics relevant to this workshop (pedagogical practices, automatic grading, deployment challenges), we will compose the program based on the attendance. We are also planning an installment of the &lt;a href="https://www.meetup.com/PyData-Paris/"&gt;PyData Paris meetup&lt;/a&gt; at CNAM on the 26th of January, with a focus on open-source tools for education.&lt;/p&gt;
&lt;p&gt;The workshop will last three days, with hands-on discussions, hacking sessions, and technical presentations. The goal of this event is to foster collaboration and the sharing of knowledge between Jupyter maintainers and downstream library authors and power users.&lt;/p&gt;
&lt;p&gt;Should you be interested in joining us for this workshop, please fill this &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSdjoU93eHJvc7O9S-jUtjQviAP1ZOZ6XEA9QZFM-R4ZDK2eQg/viewform?usp=sf_link"&gt;&lt;strong&gt;form&lt;/strong&gt;&lt;/a&gt;. A limited number of spots are available for this event.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We are grateful to &lt;a href="https://www.cnam.fr/"&gt;CNAM&lt;/a&gt; for hosting us and to &lt;a href="https://www.inria.fr/"&gt;INRIA&lt;/a&gt; for supporting this event. We are also grateful to the sponsors of the Jupyter Community Workshop series, Bloomberg and Amazon AWS.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Avion III de Clément Ader, at the CNAM — photo by Roi Boshi for Wikimedia Commons" src="https://blog.jupyter.org/posts/2022/jupyter-community-workshop-jupyter-for-education/images/001-1_oqQfLSu5KKFN8rIr1w-PBw.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Avion III de Clément Ader, at the CNAM — photo by Roi Boshi for Wikimedia Commons&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="community"/><category term="education"/><category term="events"/><category term="workshops"/></entry><entry><title>Upgrading Nbgrader</title><link href="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/" rel="alternate"/><published>2022-09-15T07:51:00+00:00</published><updated>2022-09-15T08:09:00+00:00</updated><author><name>Nicolas Brichet</name></author><id>tag:blog.jupyter.org,2022-09-15:/posts/2022/upgrading-nbgrader/</id><summary type="html">&lt;p&gt;Project Jupyter provides a broad collection of open-source tools for interactive computing that has become ubiquitous in data science and scientific computing, and is very popular in educational contexts.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Project Jupyter&lt;/em&gt; provides a broad collection of open-source tools for interactive computing that has become ubiquitous in data science and scientific computing, and is very popular in educational contexts.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nbgrader.readthedocs.io/en/stable/"&gt;&lt;em&gt;Nbgrader&lt;/em&gt;&lt;/a&gt;, started by &lt;a href="https://twitter.com/jhamrick"&gt;Jessica Hamrick&lt;/a&gt; in 2014, is an extension for creating notebook-based assignments, online courses, and for auto-grading these assignments. It is central to many Jupyter-based services used by teaching institutions.&lt;/p&gt;
&lt;p&gt;As a large part of the Jupyter user base has adopted the JupyterLab frontend, most of the popular extensions to the classic notebook UI now have an equivalent in the JupyterLab world. Unfortunately, the nbgrader extension was still outstanding as it had not yet been ported to the JupyterLab extension system. Resolving this has become critical as it was recently decided in a &lt;a href="https://github.com/jupyter/enhancement-proposals/blob/master/79-notebook-v7/notebook-v7.md"&gt;Jupyter Enhancement Proposal&lt;/a&gt; (JEP) that the next major version of the Notebook package (v7) will be based on JupyterLab components, and will rely on the JupyterLab extension mechanism. As part of this JEP, it was decided that the release of Notebook 7 should be contingent on porting certain popular classic notebook extensions to JupyterLab, including nbgrader.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Upgrading nbgrader is an important step for the advancement of the Jupyter project!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="nbgrader-08"&gt;Nbgrader 0.8&lt;/h2&gt;
&lt;p&gt;The port of nbgrader to JupyterLab is a longstanding request of the community. A lot of work had already been done on this front by contributors to the &lt;a href="https://ngshare.readthedocs.io/en/latest/"&gt;ngshare&lt;/a&gt; project (Kevin Rong, Abigail Almanza, Lawrence Lee, and Eric Li) who developed a large part of the JupyterLab-based UI, but did not finalize the migration due to lack of time. Fortunately, they made their work available to the community for others to complete the upgrade. This includes the development of the remaining elements of the UI, the adaptation of the server-side extension, and adding tests on the JupyterLab extensions to improve the CI. The nbgrader 0.8 release also includes other significant work items such as the upgrade to nbconvert 6, the switch from the notebook server to jupyter-server, and the adoption of the jupyter releaser.&lt;/p&gt;
&lt;p&gt;Today, we are pleased to announce the release of nbgrader 0.8.0, the first release of the extension to support the JupyterLab frontend.&lt;/p&gt;
&lt;h3 id="creating-an-assignment"&gt;Creating an assignment&lt;/h3&gt;
&lt;p&gt;Teachers can create assignments directly in the notebook UI by setting the proper information for each cell, such as the cell type (whether it is a locked cell, a manually graded answer, or an automatically graded answer) and the number of points the answer is worth.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screencast, of the UI for creating an assignment in the notebook (teachers)." src="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/images/001-1_apqtMnPMoBql8XXbIQOpYA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The UI for creating an assignment in the notebook (teachers).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="managing-assignments-on-the-teacher-side"&gt;Managing assignments on the teacher side&lt;/h3&gt;
&lt;p&gt;Formgrader is the part of the nbgrader UI for the teachers to manage the assignments.&lt;/p&gt;
&lt;p&gt;From this UI, teachers will be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;generate assignments from a Notebook file&lt;/li&gt;
&lt;li&gt;share assignments with students&lt;/li&gt;
&lt;li&gt;fetch assignments after student submission&lt;/li&gt;
&lt;li&gt;grade assignments&lt;/li&gt;
&lt;li&gt;provide feedback to students&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Formgrader UI" src="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/images/002-1_S2B9CFCZi4fLA-spXbqhzg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The Formgrader UI to manage assignments (teachers).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="managing-assignments-on-the-student-side"&gt;Managing assignments on the student side&lt;/h3&gt;
&lt;p&gt;The assignments list UI is used by students to fetch assignments released by the teacher, submit their answers, and benefit from the feedback after the evaluation by teachers.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="assignments list UI" src="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/images/003-1_iDhidg4ebeIL2a6pYJOOvw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The assignments list UI to fetch and submit assignments (students).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="what-about-the-future"&gt;What about the future?&lt;/h2&gt;
&lt;p&gt;Creating and grading assignments in nbgrader uses the metadata of individual notebook cells. The current release of nbgrader provides a widget to interact with the corresponding metadata.&lt;/p&gt;
&lt;p&gt;As other extensions need a similar functionality, we are expanding the generic cell metadata editor to address this requirement in a more generic and pluggable way. The new metadata editor allows any extension to create a specific form to interact with the relevant part of the metadata, specified with a JSON schema and rendered with &lt;a href="https://react-jsonschema-form.readthedocs.io/en/latest/"&gt;react-jsonschema-form&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nbgrader could take advantage of this improvement in a future release.&lt;/p&gt;
&lt;h2 id="try-it-online"&gt;Try it online&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://mybinder.org/v2/gh/jupyter/nbgrader.git/v0.8.0"&gt;&lt;img src="https://blog.jupyter.org/posts/2022/upgrading-nbgrader/images/004-1_KlCHlIFqOeXmqzGmwlh52w.webp" alt="binder" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;You can install the latest version of nbgrader using pip:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install nbgrader
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The GitHub repository can be found &lt;a href="https://github.com/jupyter/nbgrader/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; was partly funded by &lt;a href="https://u-paris.fr/"&gt;Université Paris Cité&lt;/a&gt; in the context of the &lt;a href="http://plasmabio.org"&gt;PlasmaBio&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;We are grateful to &lt;a href="https://twitter.com/jhamrick"&gt;Jessica Hamrick&lt;/a&gt;, &lt;a href="https://twitter.com/jtpio"&gt;Jeremy Tuloup&lt;/a&gt;, and Ian Stuart for their help and code reviews during the upgrade to nbgrader 0.8.0.&lt;/p&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/NicolasBrichet_"&gt;Nicolas Brichet&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. In the past few months, he has been working on the Nbgrader extension, as well as other developments in core JupyterLab such as an improved notebook metadata editor. Before joining QuantStack, Nicolas was a software engineer at INRAE.&lt;/p&gt;
</content><category term="education"/><category term="extensions"/><category term="JupyterLab"/><category term="releases"/></entry><entry><title>Visual programming in JupyterLab with Blockly</title><link href="https://blog.jupyter.org/posts/2022/visual-programming-in-jupyterlab-with-blockly/" rel="alternate"/><published>2022-07-29T13:12:00+00:00</published><updated>2022-07-29T13:12:00+00:00</updated><author><name>Denisa Checiu</name></author><id>tag:blog.jupyter.org,2022-07-29:/posts/2022/visual-programming-in-jupyterlab-with-blockly/</id><summary type="html">&lt;p&gt;Block-based programming has become ubiquitous in school curricula for early computer science education. It is an excellent means to teach basic programming concepts without having to deal with the specific syntax of a text-based programming language.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Block-based programming has become ubiquitous in school curricula for early computer science education. It is an excellent means to teach basic programming concepts without having to deal with the specific syntax of a text-based programming language.&lt;/p&gt;
&lt;p&gt;When moving from block-based programming to a more classical language like Python, students often have to switch to a completely new environment. In order to provide a smooth ramp of complexity for learners, we designed a JupyterLab extension for Blockly so that Jupyter can be used from the very first steps of their learning journey. We also used Blockly’s code generation feature to create a more integrated experience with Jupyter.&lt;/p&gt;
&lt;h2 id="but-what-exactly-is-blockly"&gt;But what exactly is Blockly?&lt;/h2&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of the JupyterLab-Blockly extension, running a simple code" src="https://blog.jupyter.org/posts/2022/visual-programming-in-jupyterlab-with-blockly/images/001-0_yEQ8djozBKDLcCxZ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterLab-Blockly extension, running a simple loop, and the corresponding Python code in a cell.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://developers.google.com/blockly"&gt;Blockly&lt;/a&gt; is an open source library designed by &lt;a href="https://twitter.com/GoogleOSS"&gt;Google&lt;/a&gt; to make coding easier and more accessible through block-based visual programming. It uses interlocking graphical blocks to represent coding concepts, while giving the user full creative freedom, it removes all language specific syntax requirements.&lt;/p&gt;
&lt;h2 id="getting-started-installing-the-blockly-extension"&gt;Getting started: installing the Blockly extension&lt;/h2&gt;
&lt;p&gt;To install the extension, you just need to execute the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mamba install -c conda-forge jupyterlab-blockly
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once installed, you can easily open a Blockly editor directly from the launcher, and start experimenting!&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;p&gt;The UI is made primarily of the toolbox located on the left side and the canvas where you can drag and drop the blocks you want to use in your code. When you are ready, just click the run button and see how the syntactically correct converted code appears on the bottom part of your screen in the programming language of your choice along with the output!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Short demo on how to use the JupyterLab-Blockly extension" src="https://blog.jupyter.org/posts/2022/visual-programming-in-jupyterlab-with-blockly/images/002-0_69P-HcYWrtriGmS-.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Short demo for the JupyterLab-Blockly extension&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The extension is also prepared to adapt to all your needs. The workspace is ready to generate the blocks using your selected JupyterLab kernel and modify its colors based on your individual theme, whether it’s dark, light or personalized.&lt;/p&gt;
&lt;p&gt;JupyterLab-Blockly integrates smoothly with the rest of the Jupyter stack: by using Jupyter kernels to execute the generated code, by reusing the JupyterLab code cell component to display the generated code, etc.&lt;/p&gt;
&lt;p&gt;In doing so, JupyterLab-Blockly remains consistent with the rest of the UI (consistent syntax highlighting, theming, and life cycle of Jupyter kernels).&lt;/p&gt;
&lt;h2 id="robotics-education"&gt;Robotics education&lt;/h2&gt;
&lt;p&gt;On top of JupyterLab-Blockly, we also built another extension dedicated to operating robots with the help of visual programming — more specifically, we created a toolbox which includes the blocks necessary to control the &lt;a href="https://niryo.com/fr/product/niryo-one/"&gt;Niryo One&lt;/a&gt; robot. Using ROS can be a time consuming task, but the pre-built visual blocks make it easier to experiment and faster to produce a prototype for any project you have in mind.&lt;/p&gt;
&lt;p&gt;To install this extension you need to execute the following commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mamba install -c conda-forge jupyterlab-niryo-one
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, all you need to do is switch from the &lt;em&gt;‘default’&lt;/em&gt; toolbox to the &lt;em&gt;‘niryo’&lt;/em&gt; one, and you will immediately gain access to forty-two new blocks, so if you have access to one of these robots, give it a try!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Demo on how to use the JupyterLab-NiryoOne extension" src="https://blog.jupyter.org/posts/2022/visual-programming-in-jupyterlab-with-blockly/images/003-0_KSNrd_DXpVWHkvPC.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Short demo for the JupyterLab-NiryoOne extension&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Both extensions can be found on GitHub. The &lt;a href="https://github.com/QuantStack/jupyterlab-blockly"&gt;JupyterLab-Blockly&lt;/a&gt; extension is ready to be used as a base for other projects; you can register new blocks, toolboxes and generators. Taking the &lt;a href="https://github.com/QuantStack/jupyterlab_niryo_one"&gt;JupyterLab-Niryo-One&lt;/a&gt; extension as an example, feel free to experiment on your own!&lt;/p&gt;
&lt;figure&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/41GoTIljCug" title="Demo JupyterLab-Niryo-One with Blockly" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
&lt;p&gt;Controlling the Niryo-one robot with the JupyterLab-blockly extension.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You can also try out the JupyterLab-Blockly extension now, directly from your browser, using JupyterLite! Just click on the &lt;a href="https://jupyterlab-blockly.readthedocs.io/en/latest/lite/lab/index.html?path=example.jpblockly"&gt;link&lt;/a&gt; below.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://jupyterlab-blockly.readthedocs.io/en/latest/lite/lab/index.html?path=example.jpblockly"&gt;&lt;img src="https://blog.jupyter.org/posts/2022/visual-programming-in-jupyterlab-with-blockly/images/004-0_Z2TP8VlU-j14Taxo.webp" alt="Link to JupyterLite for the JupyterLab-Blockly extension" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/DenisaCheciu"&gt;&lt;strong&gt;Denisa Checiu&lt;/strong&gt;&lt;/a&gt; is a Robotics working student at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt;. She is also currently pursuing her bachelor’s degree, majoring in Robotics and Intelligent Systems and minoring in Computer Science.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/carlosherrerob"&gt;&lt;strong&gt;Carlos Herrero&lt;/strong&gt;&lt;/a&gt; is a scientific software developer at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; passionate about AI and its applications to robotics. His current work focuses on the JupyterLab stack and expanding the &lt;a href="https://jupyter.org/"&gt;Jupyter ecosystem&lt;/a&gt; by developing new extensions to integrate &lt;a href="https://www.ros.org/"&gt;ROS&lt;/a&gt; in JupyterLab and also contributing to &lt;a href="https://github.com/voila-dashboards/voila"&gt;Voilà&lt;/a&gt;.&lt;/p&gt;
</content><category term="education"/><category term="extensions"/><category term="JupyterLab"/></entry><entry><title>Jupyter Games</title><link href="https://blog.jupyter.org/posts/2021/jupyter-games/" rel="alternate"/><published>2021-12-14T19:38:00+00:00</published><updated>2021-12-14T19:38:00+00:00</updated><author><name>Thorsten Beier</name></author><id>tag:blog.jupyter.org,2021-12-14:/posts/2021/jupyter-games/</id><summary type="html">&lt;p&gt;Ipycanvas + Box2D&lt;/p&gt;
</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2021/jupyter-games/images/001-1_gXbeqCDvKyaRySdAX6SnKg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Making their own tiny video games can be a great way for kids to learn programming in a playful matter. While &lt;a href="https://jupyter.org/"&gt;Jupyter&lt;/a&gt; is widely used as a scientific and educational tool, &lt;a href="https://jupyter.org/"&gt;Jupyter&lt;/a&gt; is seldom used as a platform for game development. In this blog post, we show how &lt;a href="https://jupyter.org/"&gt;Jupyter&lt;/a&gt; can be used to develop tiny games based on &lt;a href="https://box2d.org/"&gt;Box2D&lt;/a&gt;. While &lt;a href="https://jupyter.org/"&gt;Jupyter&lt;/a&gt; is language agnostic and kernels exist for many programming languages, we will focus on the &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; programming language in this blog post.&lt;/p&gt;
&lt;h2 id="mini-games"&gt;Mini-Games&lt;/h2&gt;
&lt;p&gt;When talking about video-games one might think of games such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.epicgames.com/fortnite/de/home"&gt;Fortnite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ea.com/de-de/games/battlefield"&gt;Battlefield&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ageofempires.com/"&gt;Age of Empires&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Games as the ones above are usually developed with an engine like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://unity.com/pages/unity-pro-buy-now?gclid=CjwKCAiA-9uNBhBTEiwAN3IlNHGsvz9U2GgitHO4hm4sVSHaBTi99nBotad_ht7kqABcbL00fYA0wxoC4osQAvD_BwE&amp;amp;gclsrc=aw.ds"&gt;Unity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.unrealengine.com/en-US/"&gt;Unreal Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://godotengine.org/"&gt;Godot engine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not only do these games require complex engines to be developed, but also a whole team developing them and a lot of time and money.&lt;br&gt;
Obviously, these are not the kind of games we can and want to develop in Jupyter. We want tiny games (~ 1000 lines of code) which can be implemented by kids in a matter of a few hours rather than many days, i.e. games like &lt;a href="https://de.wikipedia.org/wiki/Pong"&gt;Pong&lt;/a&gt;, Pinball, and &lt;a href="https://www.angrybirds.com/"&gt;AngryBirds&lt;/a&gt;. In fact, we will focus on a certain class of games: 2D physics-based games, since these can be implemented very easily with the use of a 2D physics simulation engine like &lt;a href="https://box2d.org/"&gt;Box2D&lt;/a&gt; or &lt;a href="https://github.com/slembcke/Chipmunk2D"&gt;Chipmunk2D&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="box2d"&gt;Box2D&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://box2d.org/"&gt;Box2D&lt;/a&gt; is a 2D rigid body simulation library for games. &lt;a href="https://box2d.org/"&gt;Box2D&lt;/a&gt; is best explained by the demo below.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="http://www.iforce2d.net/embox2d/testbed.html"&gt;&lt;img alt="A demo of Box2D compiled to JavaScript with Emscripten. Try it out (only HTTP, no HTTPS 😢 )" src="https://blog.jupyter.org/posts/2021/jupyter-games/images/002-1_-g4lwaLsCuTGDQUR9IBYxA.mp4" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;A demo of &lt;a href="https://box2d.org/"&gt;Box2D&lt;/a&gt; compiled to &lt;a href="https://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; with &lt;a href="https://emscripten.org/"&gt;Emscripten&lt;/a&gt;. &lt;a href="http://www.iforce2d.net/embox2d/testbed.html"&gt;Try it out&lt;/a&gt; (only HTTP, no HTTPS 😢 )&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://box2d.org/"&gt;Box2D&lt;/a&gt; makes it very easy to implement physics-based games like &lt;a href="https://de.wikipedia.org/wiki/Angry_Birds"&gt;Angry Birds&lt;/a&gt; or &lt;a href="https://store.steampowered.com/app/22000/World_of_Goo/?l=german"&gt;World of Goo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="box2d-debug-draw"&gt;Box2D Debug Draw&lt;/h2&gt;
&lt;h3 id="debugdraw"&gt;DebugDraw&lt;/h3&gt;
&lt;p&gt;Box2D has an abstract class &lt;em&gt;DebugDraw&lt;/em&gt; with a handful of methods to draw simple primitives. The API is given by the following:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Box2D DebugDraw API" src="https://blog.jupyter.org/posts/2021/jupyter-games/images/003-1_WjriahGPOAl9g4GlMRJlVw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Box2D DebugDraw API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="The ipycanvas based Box2D debug draw in action" src="https://blog.jupyter.org/posts/2021/jupyter-games/images/004-1_63aIvo4SQdeqUbVppf_WUA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The ipycanvas based &lt;a href="https://box2d.org/"&gt;Box2D&lt;/a&gt; debug draw in action&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Implementing this abstract class allows you to draw the physics for your UI back-end. Box2D is shipped with a &lt;a href="https://www.glfw.org/"&gt;glfw&lt;/a&gt; based DebugDraw implementation. For Python one can implement a &lt;a href="https://www.pygame.org/news"&gt;pygame&lt;/a&gt; or &lt;a href="https://kivy.org/#home"&gt;kivy&lt;/a&gt; based &lt;em&gt;DebugDraw&lt;/em&gt; implementation. For a finished product, one wants to replace the debug-draw-based renderings with custom shiny rendering routines. But using only debug-draw-based renderings is more than enough to quickly test game ideas and play around with &lt;a href="https://box2d.org/"&gt;Box2D&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="liquidfun"&gt;LiquidFun&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://google.github.io/liquidfun/"&gt;LiquidFun&lt;/a&gt; is a 2D rigid-body and fluid simulation library for games written in C++ based upon &lt;a href="http://box2d.org/"&gt;Box2D&lt;/a&gt;. &lt;a href="https://google.github.io/liquidfun/"&gt;LiquidFun&lt;/a&gt; is best explained by the demo below:&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://google.github.io/liquidfun/"&gt;&lt;img alt="A demo of LiquidFun compiled to JavaScript with Emscripten which runs in the browser. Try it out!" src="https://blog.jupyter.org/posts/2021/jupyter-games/images/005-1_uPfz8srjXR24dtFm8wVBQg.gif" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;A demo of LiquidFun compiled to JavaScript with &lt;a href="https://emscripten.org/"&gt;Emscripten&lt;/a&gt; which runs in the browser. &lt;a href="https://google.github.io/liquidfun/"&gt;Try it out!&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="more-than-just-games"&gt;More than just Games&lt;/h2&gt;
&lt;p&gt;Even though &lt;a href="http://box2d.org/"&gt;Box2D&lt;/a&gt; is advertised as a 2D physics engine for games, &lt;a href="http://box2d.org/"&gt;Box2D&lt;/a&gt; can also be used for educational purposes:&lt;br&gt;
The YouTube channel &lt;a href="https://www.youtube.com/c/iforce2d/videos?view=0&amp;amp;sort=da&amp;amp;flow=grid"&gt;iforce2d&lt;/a&gt; has done some impressive things with &lt;a href="http://box2d.org/"&gt;Box2D&lt;/a&gt; like a Box2D-based &lt;a href="https://youtu.be/8kZRpouZ3OQ?t=1228"&gt;combustion engine&lt;/a&gt; and a &lt;a href="https://youtu.be/zhFVMxus3No?t=155"&gt;wind tunnel&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://youtu.be/8kZRpouZ3OQ?t=1228"&gt;&lt;img alt="Box2D based combustion engine by the youtuber iforce2d" src="https://blog.jupyter.org/posts/2021/jupyter-games/images/006-1_0AABOZ_YoDUqcyOVlCT-SA.mp4" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Box2D based &lt;a href="https://youtu.be/8kZRpouZ3OQ?t=1228"&gt;combustion engine&lt;/a&gt; by the youtuber &lt;a href="https://www.youtube.com/channel/UCTXOorupCLqqQifs2jbz7rQ"&gt;iforce2d&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img alt="Box2D based wind tunnel by the youtuber iforce2d" src="https://blog.jupyter.org/posts/2021/jupyter-games/images/007-1_rVDzJqp1EHI9UzzgkPzlqw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Box2D based &lt;a href="https://youtu.be/zhFVMxus3No?t=155"&gt;wind tunnel&lt;/a&gt; by the youtuber &lt;a href="https://www.youtube.com/channel/UCTXOorupCLqqQifs2jbz7rQ"&gt;iforce2d&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="box2d-python"&gt;Box2D Python&lt;/h2&gt;
&lt;p&gt;Box2D has bindings for many languages and can be compiled to &lt;a href="https://webassembly.org/"&gt;Wasm&lt;/a&gt;. Several Box2D demos exist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.iforce2d.net/embox2d/testbed.html"&gt;http://www.iforce2d.net/embox2d/testbed.html&lt;/a&gt; (only HTTP, no HTTPS 😢 )&lt;/li&gt;
&lt;li&gt;&lt;a href="https://birchlabs.co.uk/liquidfun-wasm/"&gt;https://birchlabs.co.uk/liquidfun-wasm/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/liquidfun/"&gt;https://google.github.io/liquidfun/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are particularly interested in using Box2D / LiquidFun from Python.&lt;br&gt;
Here we have the following possibilities:&lt;/p&gt;
&lt;h3 id="pybox2d"&gt;pybox2d&lt;/h3&gt;
&lt;p&gt;With &lt;a href="https://github.com/pybox2d/pybox2d"&gt;pybox2d&lt;/a&gt;, Box2D has matured and robust &lt;a href="https://github.com/pybox2d/pybox2d"&gt;Python bindings&lt;/a&gt; with extensive &lt;a href="https://github.com/pybox2d/pybox2d/wiki/manual"&gt;documentation&lt;/a&gt;. Unfortunately, &lt;a href="https://github.com/pybox2d/pybox2d"&gt;pybox2d&lt;/a&gt; has a few shortcomings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It only works with an old version of Box2D.&lt;/li&gt;
&lt;li&gt;There is no support for LiquidFun.&lt;/li&gt;
&lt;li&gt;pybox2d is mostly unmaintained.&lt;/li&gt;
&lt;li&gt;The Python bindings are generated with &lt;a href="http://www.swig.org/"&gt;SIWG&lt;/a&gt; (not really a shortcoming, but I personally strongly prefer &lt;a href="https://github.com/pybind/pybind11"&gt;pybind11&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pyb2d"&gt;pyb2d&lt;/h3&gt;
&lt;p&gt;A disclaimer first, I am the author of the &lt;a href="https://github.com/pyb2d/pyb2d"&gt;pyb2d&lt;/a&gt; Box2D Python bindings. The motivation for creating &lt;a href="https://github.com/pyb2d/pyb2d"&gt;pyb2d&lt;/a&gt; was having Box2D / LiquidFun bindings created with &lt;a href="https://github.com/pybind/pybind11"&gt;pybind11&lt;/a&gt;. While pyb2d works with the brand-new 2.4.1 release of Box2D, has support for LiquidFun and &lt;a href="https://github.com/pybind/pybind11"&gt;pybind11&lt;/a&gt; has been used for generating the Python bindings, there are also some downsides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pyb2d/pyb2d"&gt;pyb2d&lt;/a&gt; has fewer examples compared to &lt;a href="https://github.com/pybox2d/pybox2d"&gt;pybox2d&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pyb2d/pyb2d"&gt;pyb2d&lt;/a&gt; is not as mature and robust as &lt;a href="https://github.com/pybox2d/pybox2d"&gt;pybox2d&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pyb2d/pyb2d"&gt;pyb2d&lt;/a&gt; is not yet as well documented as &lt;a href="https://github.com/pybox2d/pybox2d"&gt;pybox2d&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A particularly useful feature of &lt;a href="https://github.com/pyb2d/pyb2d"&gt;pyb2d&lt;/a&gt; is its &lt;em&gt;BatchDebugDraw&lt;/em&gt; implementation: While we could implement the above mentioned debug draw API directly in Python, this would have a few drawbacks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There is a certain overhead when calling C++ from Python and vice versa. When our game contains a lot of shapes, for instance circles, we would have to call &lt;em&gt;drawCircle&lt;/em&gt; very often and have a lot of calls from C++ to Python and vice versa.&lt;/li&gt;
&lt;li&gt;Some back-ends provide &lt;em&gt;batch-drawing&lt;/em&gt; capabilities such that we can draw multiple primitives at once. For instance, drawing 100 circles at different locations with a single function call where the function arguments are NumPy nd-arrays with the centers/radii of the circles. Using such a batch API can lead to tremendous speedups.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="The python batch debug draw API of pyb2d" src="https://blog.jupyter.org/posts/2021/jupyter-games/images/008-1_He7B_NhepkHeNjPEfziwjw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The python batch debug draw API of pyb2d&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;To address these issues pyb2d provides a &lt;em&gt;BatchDebugDraw&lt;/em&gt; implementation where we first collect all the individual calls like &lt;em&gt;drawCircle&lt;/em&gt;, &lt;em&gt;drawSegment, drawPolygon etc.&lt;/em&gt; We store the arguments of these calls in NumPy arrays. After collecting all the shapes we call the Python API with functions like &lt;em&gt;draw_circles, draw_segments, draw_polygons,&lt;/em&gt; etc. where all the shapes are passed to Python in a single function call. On the Python side, one can pass these batched draw instructions to a &lt;em&gt;batch-drawing&lt;/em&gt; API of the UI backed. (Spoiler: We will use the batch drawing API of ipycanvas for the Jupyter pyb2d integration.)&lt;/p&gt;
&lt;h2 id="jupyter-box2d-integration-requirements"&gt;Jupyter Box2D Integration: Requirements&lt;/h2&gt;
&lt;p&gt;To have a platform to develop tiny games from within Jupyter we need at least the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Canvas: We need a surface/canvas on which we can draw the content of the games.&lt;/li&gt;
&lt;li&gt;Input Devices: Games would be boring without any user input. We need access to input devices like the mouse, the keyboard or even game-pads.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ipycanvas-ipywidgets-ipyevents"&gt;Ipycanvas, Ipywidgets, Ipyevents&lt;/h2&gt;
&lt;p&gt;Jupyter has a huge ecosystem of extensions. For the Jupyter Box2D integration, we just need to pick the appropriate Jupyter extensions: &lt;a href="https://ipycanvas.readthedocs.io/en/latest/"&gt;Ipycanvas&lt;/a&gt; gives us access to the &lt;a href="https://developer.mozilla.org/de/docs/Web/API/Canvas_API"&gt;HTML Canvas&lt;/a&gt; from within Python kernels in Jupyter. This serves as the drawable surface for our games. &lt;a href="https://ipywidgets.readthedocs.io/en/latest/"&gt;Ipywidets&lt;/a&gt; and &lt;a href="https://github.com/mwcraig/ipyevents"&gt;Ipyevents&lt;/a&gt; give us access to input devices like game-pads, the keyboard, and the mouse.&lt;/p&gt;
&lt;h2 id="ipycanvas"&gt;Ipycanvas&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2021/jupyter-games/images/009-1_KlqFuAvQ6Hd9-pPo4hthgA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ipycanvas.readthedocs.io/en/latest/"&gt;Ipycanvas&lt;/a&gt; is a lightweight library developed by &lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; exposing the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API"&gt;browser’s Canvas API&lt;/a&gt; to Jupyter. It allows drawing simple primitives directly from Python like text, lines, polygons, arcs, images, etc. With &lt;a href="https://ipycanvas.readthedocs.io/en/latest/animations.html"&gt;a few tricks&lt;/a&gt;, ipycanvas is fast enough to draw smooth animations. This even works when the server and the client are not on the same machines (when we run ipycanvas on &lt;a href="https://mybinder.org/v2/gh/martinRenou/ipycanvas/stable?urlpath=lab%2Ftree%2Fexamples"&gt;MyBinder&lt;/a&gt; for example).&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://mybinder.org/v2/gh/martinRenou/ipycanvas/stable?urlpath=lab%2Ftree%2Fexamples"&gt;&lt;img alt="Conways game of life in ipycanvas, try it out!" src="https://blog.jupyter.org/posts/2021/jupyter-games/images/010-1_v8D4SUV9rkTKQ6nnL6Yfsg.mp4" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Conways game of life in ipycanvas, &lt;a href="https://mybinder.org/v2/gh/martinRenou/ipycanvas/stable?urlpath=lab%2Ftree%2Fexamples"&gt;try it out!&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="an-ipycanvas-based-debugdraw"&gt;An Ipycanvas-based DebugDraw:&lt;/h3&gt;
&lt;p&gt;The first step of integrating pyb2d in Jupyter notebooks is implementing an ipycanvas based &lt;em&gt;DebugDraw&lt;/em&gt;. We recently released a &lt;a href="https://github.com/martinRenou/ipycanvas/releases/tag/0.10.0"&gt;new version&lt;/a&gt; of ipycanvas which provides an extended batch API to draw things very fast. We utilize this batch API when implementing the above mention batch-debug-draw API.&lt;/p&gt;
&lt;h3 id="handling-events-in-jupyter"&gt;Handling events in Jupyter:&lt;/h3&gt;
&lt;p&gt;We can use &lt;a href="https://github.com/mwcraig/ipyevents"&gt;Ipyevents&lt;/a&gt; for the event handling in Jupyter. Obviously, we want to handle the events &lt;em&gt;while&lt;/em&gt; our game is running. To achieve this within a Jupyter-notebook we need to run our game-loop in a dedicated thread and listen for events in the main thread.&lt;/p&gt;
&lt;h3 id="adding-buttons"&gt;Adding Buttons:&lt;/h3&gt;
&lt;p&gt;We want to have a few buttons to &lt;em&gt;start&lt;/em&gt;, &lt;em&gt;pause&lt;/em&gt; and &lt;em&gt;reset&lt;/em&gt; the Box2D based games. We can add these with &lt;a href="https://ipywidgets.readthedocs.io/en/latest/"&gt;ipywidgets&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="putting-it-all-together"&gt;Putting it all together&lt;/h2&gt;
&lt;p&gt;With all the above we can put together a pyb2d based Python Box2D integration in Jupyter. As a proof of concept we implemented a few mini-games:&lt;/p&gt;
&lt;h3 id="billiard"&gt;Billiard:&lt;/h3&gt;
&lt;p&gt;A very simple billiard game. &lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;Try it on binder!&lt;/a&gt;&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2021/jupyter-games/images/011-1_ZkV-0GDc_0Kxdbc6CHzB0w.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h3 id="angry-shapes"&gt;Angry Shapes:&lt;/h3&gt;
&lt;p&gt;An &lt;a href="https://www.angrybirds.com/"&gt;Angry Birds&lt;/a&gt;-like game implemented with pyb2d. &lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;Try it on binder!&lt;/a&gt;&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;&lt;img src="https://blog.jupyter.org/posts/2021/jupyter-games/images/012-1_cIqICNLl2CTGoW5vdmyr-w.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="world-of-goo-homage"&gt;World of Goo homage:&lt;/h3&gt;
&lt;p&gt;A &lt;a href="https://store.steampowered.com/app/22000/World_of_Goo/"&gt;World of Goo&lt;/a&gt; homage implemented with pyb2d. &lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;Try it on binder!&lt;/a&gt;&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;&lt;img src="https://blog.jupyter.org/posts/2021/jupyter-games/images/013-1_Mr_2vTFlIfad2Wsbz6gmTQ.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="rocket"&gt;Rocket:&lt;/h3&gt;
&lt;p&gt;Fly a rocket controlled with the keyboard, but avoid the black hole! &lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;Try it on binder!&lt;/a&gt;&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;&lt;img src="https://blog.jupyter.org/posts/2021/jupyter-games/images/014-1_8f05EGZrQyBxZr-Byn_vxg.gif" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="compatibility"&gt;Compatibility&lt;/h2&gt;
&lt;p&gt;All the pyb2d examples shown above can also be run in a &lt;a href="https://www.pygame.org/news"&gt;pygame&lt;/a&gt; window or a &lt;a href="https://kivy.org/#home"&gt;kivy&lt;/a&gt; window since pyb2d also provides back-ends for these. But even when one prefers to experiment with &lt;a href="https://www.pygame.org/news"&gt;pygame&lt;/a&gt;, the Jupyter back-end can still be interesting since one can put the testbed-examples on &lt;a href="https://mybinder.org/"&gt;MyBinder&lt;/a&gt; and have them accessible in a convenient fashion.&lt;/p&gt;
&lt;h2 id="caveats"&gt;Caveats&lt;/h2&gt;
&lt;p&gt;The Jupyter integration of pyb2d gives usable frame rates, even when run through &lt;a href="https://mybinder.org/"&gt;MyBinder&lt;/a&gt;. But nevertheless, a &lt;a href="https://www.pygame.org/news"&gt;pygame&lt;/a&gt; based back-end usually leads to a better frame rate and smoother gameplay.&lt;/p&gt;
&lt;h2 id="outlook-sneak-preview"&gt;Outlook / Sneak preview&lt;/h2&gt;
&lt;p&gt;We currently work on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adding more examples and better documentation to pyb2d.&lt;/li&gt;
&lt;li&gt;Improve the performance of the Jupyter integration.&lt;/li&gt;
&lt;li&gt;Add pyb2d to &lt;a href="https://jupyterlite.readthedocs.io/en/latest/"&gt;JupyterLite&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Implement remote multiplayer-based gaming via the collaborative mode of JupyterLab.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Sneak-preview: Via the collaborative mode of JupyterLab we can connect to the notebook from two machines and play billiard against each other." src="https://blog.jupyter.org/posts/2021/jupyter-games/images/015-1_9gJsZRQ9CUEd2Uz_I_BBJw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Sneak-preview: Via the collaborative mode of JupyterLab we can connect to the notebook from two machines and play billiard against each other.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;I would like to thank &lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; for his help with ipycanvas.&lt;/p&gt;
&lt;h2 id="about-the-author"&gt;About the author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://quantstack.net/thorsten.html"&gt;Thorsten Beier&lt;/a&gt; is a Scientific Software Engineer at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;. Before joining &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;, he graduated in computer science at the University of Heidelberg and worked at the &lt;a href="https://www.embl.org/"&gt;EMBL&lt;/a&gt;. As an open-source developer, Thorsten worked on a variety of projects, from &lt;a href="https://github.com/DerThorsten/nifty"&gt;nifty&lt;/a&gt; and &lt;a href="https://github.com/ukoethe/vigra"&gt;vigra&lt;/a&gt; in C++ to &lt;a href="https://github.com/inferno-pytorch/inferno"&gt;inferno&lt;/a&gt;, &lt;a href="https://kipoi.org/"&gt;kipoi&lt;/a&gt;, and &lt;a href="https://www.ilastik.org/"&gt;ilastik&lt;/a&gt; in Python.&lt;/p&gt;
</content><category term="education"/><category term="widgets"/></entry><entry><title>Juan Klopper</title><link href="https://blog.jupyter.org/posts/2020/juan-klopper/" rel="alternate"/><published>2020-08-03T16:01:00+00:00</published><updated>2020-08-03T16:01:00+00:00</updated><author><name>Lorena A Barba</name></author><id>tag:blog.jupyter.org,2020-08-03:/posts/2020/juan-klopper/</id><summary type="html">&lt;p&gt;JupyterCon 2020 keynote speaker announcement&lt;/p&gt;
</summary><content type="html">&lt;figure&gt;
&lt;img alt="Juan Klopper and Lorena Barba in Delft, Holland, for the Global Open Education Conference, April 2018." src="https://blog.jupyter.org/posts/2020/juan-klopper/images/001-1_Pv7g_IdbOpvxFT_BW3Z4xA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Juan Klopper and Lorena Barba in Delft, Holland, for the Global Open Education Conference, April 2018.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Juan Klopper is a medical doctor and surgeon at Groote Schuur Hospital, the academic hospital complex of the University of Cape Town, South Africa, and a senior lecturer in surgery. His specialty is emergency surgery, and he heads the hospital’s Acute Care Surgery unit. He is also the Head of Post-Graduate Surgical Research, the Head of Surgical Education, and the Faculty of Health Science representative on the University Senate Committee for Online Education.&lt;/p&gt;
&lt;p&gt;An ardent open educator, Juan was recognized with the &lt;a href="https://www.oeconsortium.org/projects/open-education-awards-for-excellence/2014-winners-of-ace-awards/2014-ace-winners-individual-categories/"&gt;2014 Educator Award&lt;/a&gt; of the Open Education Consortium, a global network for open education. His first collections of educational videos on YouTube focused on &lt;a href="https://www.youtube.com/watch?v=-ily6RyUcgU&amp;amp;list=PLsu0TcgLDUiITcBHNziC7XxJ0AuHV7aiU"&gt;biomathematics&lt;/a&gt;, and &lt;a href="https://www.youtube.com/watch?v=ejPnFeJUH-o&amp;amp;list=PLsu0TcgLDUiKNr6FBKtm3-hD3QUBx0FRe"&gt;acute care surgery&lt;/a&gt;, but he also created loads of teaching videos on physics and mathematics. At the time, he recorded a course on &lt;a href="https://www.youtube.com/watch?v=b1fEb7VKEEs&amp;amp;list=PLC1872221CD8DDAB2"&gt;medical statistics using Excel&lt;/a&gt;, but he also ventured into a short set of Python lectures, and then a full-fledged course on &lt;a href="https://www.youtube.com/watch?v=Kp9RuOLTHvQ&amp;amp;list=PLsu0TcgLDUiIueDMfTX3322AZhdGb0_zm"&gt;Medical Statistics&lt;/a&gt; using IPython notebooks. He has since then developed courses on the &lt;a href="https://www.youtube.com/watch?v=4nPmKG_f8-M&amp;amp;list=PLsu0TcgLDUiIznEhN165XmykqyLgzwY0Y"&gt;Julia language&lt;/a&gt;, on &lt;a href="https://www.youtube.com/watch?v=zrXPG1onjiE&amp;amp;list=PLsu0TcgLDUiJznd-n-i7rMUmNjCuNhgpB"&gt;R for medical statistics&lt;/a&gt;, and on &lt;a href="https://www.youtube.com/watch?v=KLqZgmwn5Hk&amp;amp;list=PLsu0TcgLDUiLjvlqlgWlujHvi-kTpVIeo"&gt;Understanding Clinical Research using Google Colab&lt;/a&gt; — the latter also a Coursera &lt;a href="https://www.coursera.org/learn/clinical-research"&gt;MOOC&lt;/a&gt; that has enrolled more than 85,000 learners. Juan was the first educator from the African Continent to have a course on the Coursera platform.&lt;/p&gt;
&lt;p&gt;Juan’s research focus is on improvements of healthcare through data science and mathematics. The unique blend of his decade-long career as an attending surgeon and years as an autodidact of mathematics and programming brings forth inventive projects applying technology to medicine. One uses convolutional neural networks to diagnose &lt;a href="https://en.wikipedia.org/wiki/Hemopneumothorax"&gt;hemopneumothorax&lt;/a&gt; (air and blood in the chest cavity) in victims with gunshot or stab wounds. Another is looking into the diagnostic accuracy of magnetic resonance imaging for tuberculosis spondylitis in HIV-positive and HIV-negative patients. The surgical research unit that he heads at University of Cape Town has supported more than a hundred master’s and doctoral research projects.&lt;/p&gt;
&lt;p&gt;In the resource-constrained environment of South Africa, such research efforts rely heavily on open source software tools. For both teaching and research, open source tools remove barriers to technology in the developing world. A number of initiatives involving and advocating &lt;a href="https://unu.edu/publications/articles/free-and-open-source-software-in-sub-saharan-africa.html"&gt;open source software in Sub-Saharan Africa&lt;/a&gt; attest to the significant impact it can have in capacity building, public policy implementation, and economic growth.&lt;/p&gt;
&lt;p&gt;Juan — not content with saving lives applying his surgical talents — has devoted himself to the open dissemination of knowledge. His motto is &lt;em&gt;“Never stop learning,”&lt;/em&gt; and he shares his learning journeys openhandedly with his students and everyone else. I can’t wait to hear what he will share with the JupyterCon community.&lt;/p&gt;
&lt;p&gt;Just like our previously announced JupyterCon keynotes — &lt;a href="https://blog.jupyter.org/posts/2020/anima-anandkumar/"&gt;Anima Anandkumar&lt;/a&gt; and &lt;a href="https://blog.jupyter.org/posts/2020/jeremy-howard/"&gt;Jeremy Howard&lt;/a&gt; — this is an exciting chance to imagine how far our community can go impacting the world for the better. Oh, the anticipation!&lt;/p&gt;
&lt;p&gt;— &lt;a href="https://medium.com/@lorenaabarba"&gt;Lorena A Barba&lt;/a&gt;, &lt;a href="https://jupytercon.com"&gt;JupyterCon 2020&lt;/a&gt; General Chair&lt;/p&gt;
&lt;hr&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2020/juan-klopper/images/002-1_zYJGVYB9SJGnrhiq1IzVqA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Proposals for tutorials, talks and posters are being selected this week!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="education"/><category term="events"/><category term="JupyterCon"/></entry><entry><title>Plasma: A learning platform powered by Jupyter</title><link href="https://blog.jupyter.org/posts/2020/plasma-a-learning-platform-powered-by-jupyter/" rel="alternate"/><published>2020-05-11T07:55:00+00:00</published><updated>2020-05-11T07:55:00+00:00</updated><author><name>Jeremy Tuloup</name></author><id>tag:blog.jupyter.org,2020-05-11:/posts/2020/plasma-a-learning-platform-powered-by-jupyter/</id><summary type="html">&lt;p&gt;Jupyter has been a great choice for education for many years. The Jupyter Notebook has become one of the most popular tools to conduct workshops, tutorials, and teach online classes.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Jupyter has been a &lt;a href="https://blog.jupyter.org/posts/2019/teaching-and-learning-with-jupyter/"&gt;great choice&lt;/a&gt; for &lt;a href="https://jupyter4edu.github.io/jupyter-edu-book/"&gt;education&lt;/a&gt; for many years. The Jupyter Notebook has become one of the most popular tools to conduct workshops, tutorials, and teach online classes.&lt;/p&gt;
&lt;p&gt;Recently we have seen the emergence and adoption of JupyterHub distributions to facilitate the deployment of Jupyter-based platforms, both on private servers and in the cloud.&lt;/p&gt;
&lt;p&gt;We would like to share with you an open-source learning platform called &lt;a href="https://twitter.com/PlasmaBio"&gt;Plasma&lt;/a&gt;, built with Jupyter at its core.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/001-0_wWdglu7KBVC08Lcc.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="jupyterhub-distributions"&gt;JupyterHub Distributions&lt;/h2&gt;
&lt;p&gt;JupyterHub is a highly customizable and modular framework. To simplify its adoption, &lt;a href="https://jupyterhub.readthedocs.io/en/stable/#jupyterhub"&gt;JupyterHub distributions&lt;/a&gt; target specific deployment scenarios with opinionated defaults. They make it easier to deploy JupyterHub on a single server and in the cloud.&lt;/p&gt;
&lt;p&gt;There are currently two popular JupyterHub distributions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tljh.jupyter.org"&gt;The Littlest JupyterHub (TLJH)&lt;/a&gt;: for running JupyterHub on a single machine, targeting between 1 and 100 users&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zero-to-jupyterhub.readthedocs.io"&gt;Zero To JupyterHub on Kubernetes (ZTJH)&lt;/a&gt;: for running JupyterHub on top of &lt;a href="https://k8s.io/"&gt;Kubernetes&lt;/a&gt;, to scale to a large number of users and machines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although not an official distribution, &lt;a href="https://github.com/jupyterhub/jupyterhub-deploy-docker"&gt;jupyterhub-deploy-docker&lt;/a&gt; is also a good resource for a full Docker-based setup. It runs JupyterHub itself in a Docker container and orchestrates the stack with &lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="the-plasma-stack"&gt;The Plasma Stack&lt;/h2&gt;
&lt;p&gt;Plasma stands for &lt;em&gt;PLateforme d’e-Learning pour l’Analyse de données Scientifiques MAssives&lt;/em&gt;, which can be translated to “An e-learning platform for massive scientific data analysis”.&lt;/p&gt;
&lt;p&gt;The platform is typically meant to be deployed on high-end machines with multiple cores and GB of RAM.&lt;/p&gt;
&lt;p&gt;Some of the requirements for the Plasma project fall somewhere between the TLJH and ZTJH distributions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The deployment should be on a single server, and reproducible on other machines too (running on Ubuntu 18.04+)&lt;/li&gt;
&lt;li&gt;It should support multiple user environments with different sets of dependencies&lt;/li&gt;
&lt;li&gt;Users should authenticate as system users and their data should be persisted in their home directories on the host machine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although TLJH doesn’t officially support container technology, its &lt;a href="http://tljh.jupyter.org/en/latest/contributing/plugins.html"&gt;plugin system&lt;/a&gt; opens the door to many other use cases.&lt;/p&gt;
&lt;p&gt;Because of this and to foster the TLJH plugin ecosystem, we decided to develop the Plasma stack as a plugin for TLJH and consolidate the deployment story with Ansible playbooks.&lt;/p&gt;
&lt;p&gt;Plasma is an opinionated JupyterHub stack powered by The Littlest JupyterHub, with the following defaults:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jupyterhub.readthedocs.io/en/stable/api/auth.html#pamauthenticator"&gt;PAMAuthenticator&lt;/a&gt; to authenticate JupyterHub as users existing on the host machine&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterhub/dockerspawner#systemuserspawner"&gt;SystemUserSpawner&lt;/a&gt; to start single-user servers in Docker containers, using the system user home directories for data persistence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To enable extra functionalities, the Plasma stack relies on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://github.com/plasmabio/tljh-repo2docker"&gt;tljh-repo2docker&lt;/a&gt; plugin to create multiple user environments&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://github.com/plasmabio/plasma/tree/master/tljh-plasma"&gt;tljh-plasma&lt;/a&gt; plugin to define the JupyterHub config&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/plasmabio/plasma/tree/master/ansible"&gt;Ansible playbooks&lt;/a&gt; to automate the deployment and configuration of the server and add additional tools&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Plasma stack also contains tools to monitor the system, create and configure users, and add hub admins. It can be visualized with the diagram below:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The Plasma Overview Diagram" src="https://blog.jupyter.org/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/002-1_r-RSTILR7yfT7By30eaeTg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The Plasma Overview Diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The stack is defined in the following repository: &lt;a href="https://github.com/plasmabio/plasma"&gt;https://github.com/plasmabio/plasma&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is also extensive documentation with detailed explanations on how to deploy the stack on a new server: &lt;a href="https://docs.plasmabio.org"&gt;https://docs.plasmabio.org&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="a-repo2docker-plugin-for-the-littlest-jupyterhub"&gt;A repo2docker plugin for The Littlest JupyterHub&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/plasmabio/tljh-repo2docker"&gt;tljh-repo2docker&lt;/a&gt; plugin lets JupyterHub admins create new user environments using &lt;a href="https://repo2docker.readthedocs.io"&gt;repo2docker&lt;/a&gt;. This plugin starts a &lt;a href="https://jupyterhub.readthedocs.io/en/stable/reference/services.html"&gt;JupyterHub service&lt;/a&gt; to manage user environments from the JupyterHub UI.&lt;/p&gt;
&lt;p&gt;For those already using &lt;a href="https://mybinder.org"&gt;Binder&lt;/a&gt;, the idea will sound very familiar. Under the hood, the tljh-repo2docker plugin also uses &lt;a href="https://repo2docker.readthedocs.io/en/latest/"&gt;repo2docker&lt;/a&gt; to build the Docker images. It follows the same patterns and naming conventions as Binder, which makes it easier and more natural to test the environments on Binder before adding them to JupyterHub.&lt;/p&gt;
&lt;p&gt;New environments can be added by clicking on the &lt;em&gt;Add New&lt;/em&gt; button and providing a URL to the repository. Optional names, memory, and CPU limits can also be set for the environment:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Adding a new environment" src="https://blog.jupyter.org/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/003-1_KMOJ3287DPh6aG8Kg4EkEg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Adding a new environment&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;em&gt;Environments&lt;/em&gt; page shows the list of built environments, as well as the ones currently being built:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Building a new environment" src="https://blog.jupyter.org/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/004-1_VpXTXOEt4Owlf5O713ktLw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Building a new environment&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The status of the environment changes once the underlying Docker image has been built:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The list of available user environments" src="https://blog.jupyter.org/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/005-1_uHAYqgSCAfswFXvRHTO43w.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The list of available user environments&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Once ready, the environments can be selected from the JupyterHub spawn page:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Selecting an environment" src="https://blog.jupyter.org/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/006-0_nOCNtzHaQ_dj3-Jg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Selecting an environment&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Because it is separate from the Plasma stack, this plugin can also be used for other temporary TLJH deployments on a virtual machine. For example, the organizer of a workshop can prepare a list of environments before the event, just like they would with Binder.&lt;/p&gt;
&lt;h2 id="automating-deployments-with-ansible"&gt;Automating deployments with Ansible&lt;/h2&gt;
&lt;p&gt;To minimize the number of manual steps involved in the setup of the stack, Plasma also provides a list of &lt;a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks.html"&gt;Ansible playbooks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.ansible.com/ansible/latest/index.html"&gt;Ansible&lt;/a&gt; is an open-source tool to automate the provisioning of servers, configuration management, and application deployment.&lt;/p&gt;
&lt;p&gt;Playbooks define a list of tasks that should be executed and declare the desired state of the server.&lt;/p&gt;
&lt;p&gt;The list of playbooks and instructions on how to use them are provided in the &lt;a href="https://docs.plasmabio.org/en/latest/install/index.html"&gt;Installation section of the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Overall, the playbooks make it easier to perform upgrades, to automate the deployment process, and to replicate the setup at other institutions and universities.&lt;/p&gt;
&lt;p&gt;Here is an example of what an upgrade looks like:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Upgrading the stack with an Ansible playbook" src="https://blog.jupyter.org/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/007-1_0n1kaev7c81I45SZ0HoLxQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Upgrading the stack with an Ansible playbook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This playbook defines the tasks to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;download the TLJH installer&lt;/li&gt;
&lt;li&gt;execute the TLJH installer to perform the upgrade&lt;/li&gt;
&lt;li&gt;update the TLJH plugins&lt;/li&gt;
&lt;li&gt;set the idle culler timeout&lt;/li&gt;
&lt;li&gt;set the default memory and CPU limits&lt;/li&gt;
&lt;li&gt;reload JupyterHub&lt;/li&gt;
&lt;li&gt;pulls the latest &lt;code&gt;jupyter/repo2docker&lt;/code&gt; Docker image&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="further-reading"&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Plasma documentation: &lt;a href="https://docs.plasmabio.org/"&gt;https://docs.plasmabio.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To use the tljh-repo2docker as a standalone plugin for TLJH: &lt;a href="https://github.com/plasmabio/tljh-repo2docker"&gt;https://github.com/plasmabio/tljh-repo2docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Also part of the Plasma project, the new &lt;a href="https://github.com/QuantStack/ipycytoscape"&gt;ipycytoscape&lt;/a&gt; package for interactive graph visualization in Jupyter: &lt;a href="https://blog.jupyter.org/posts/2020/interactive-graph-visualization-in-jupyter-with/"&gt;Interactive Graph Visualization in Jupyter with ipycytoscape&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The development of the Plasma stack at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; was funded as part of the &lt;a href="https://twitter.com/PlasmaBio"&gt;Plasma&lt;/a&gt; project, led by &lt;a href="https://twitter.com/CVandiedonck"&gt;Claire Vandiedonck&lt;/a&gt;, &lt;a href="https://twitter.com/pierrepo"&gt;Pierre Poulain&lt;/a&gt;, and &lt;a href="https://twitter.com/SCaburet"&gt;Sandrine Caburet&lt;/a&gt;, associate professors at Université de Paris.&lt;/p&gt;
&lt;p&gt;Sponsors to the Plasma initiative include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/iledefrance"&gt;Région Île-de-France&lt;/a&gt;, via the “Trophées franciliens de l’innovation numérique dans le supérieur” (&lt;a href="https://www.iledefrance.fr/trophees-franciliens-de-linnovation-numerique-dans-le-superieur-les-laureats-2018"&gt;EdTech 2018&lt;/a&gt;) grant program,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Univ_Paris"&gt;Université de Paris&lt;/a&gt;, via the &lt;a href="https://u-paris.fr/en/the-initiative-of-excellence-idex-label/"&gt;Initiative of Excellence (IdEx) Label&lt;/a&gt; and its “inovating teaching” grant program,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/EURGENEPARIS"&gt;EUR G.E.N.E.&lt;/a&gt;, the graduate school on Genetics and Epigenetics,&lt;/li&gt;
&lt;li&gt;the university training “Création, analyse et valorisation de données biologiques omiques” (&lt;a href="https://omics-school.net/"&gt;DU Omiques&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
</content><category term="education"/><category term="JupyterHub"/><category term="repo2docker"/><category term="TLJH"/></entry><entry><title>National Scale Interactive Computing</title><link href="https://blog.jupyter.org/posts/2019/national-scale-interactive-computing/" rel="alternate"/><published>2019-08-22T19:06:00+00:00</published><updated>2019-08-22T20:06:00+00:00</updated><author><name>James Colliander</name></author><id>tag:blog.jupyter.org,2019-08-22:/posts/2019/national-scale-interactive-computing/</id><summary type="html">&lt;p&gt;Delivering interactive computing to universities at a national scale with a Jupyter stack.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;This is an invited post from Jim Colliander, Professor of Mathematics at UBC and Director of the &lt;a href="http://www.pims.math.ca/"&gt;Pacific Institute for the Mathematical Sciences&lt;/a&gt;.&lt;/em&gt;&lt;sup class="footnote-ref"&gt;&lt;a href="#fn1" id="fnref1"&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;In 2017, the &lt;a href="http://www.pims.math.ca/"&gt;Pacific Institute for the Mathematical Sciences (PIMS)&lt;/a&gt;, in partnership with &lt;a href="https://www.computecanada.ca/featured/compute-canada-and-pims-launch-jupyter-service-for-researchers/"&gt;Compute Canada&lt;/a&gt; and &lt;a href="https://www.cybera.ca/services/jupyter-all-in-one-science-platform/"&gt;Cybera&lt;/a&gt;, launched &lt;a href="https://syzygy.ca"&gt;Syzygy&lt;/a&gt;, a cloud-hosted interactive computing platform that delivers &lt;a href="https://jupyter.org/"&gt;JupyterHub deployments&lt;/a&gt; for &lt;a href="https://www.google.com/maps/d/embed?mid=1nzSAGLSn8eWdfQ6K7zTw-31h82I&amp;amp;hl=en"&gt;universities across Canada&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Syzygy has been used by over 16,000 students at 20 universities. The main results of the Syzygy experiment so far are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Demand for interactive computing is ubiquitous&lt;sup class="footnote-ref"&gt;&lt;a href="#fn2" id="fnref2"&gt;[2]&lt;/a&gt;&lt;/sup&gt; and growing strongly at universities.&lt;/li&gt;
&lt;li&gt;The Jupyter ecosystem is an effective way to deliver interactive computing.&lt;/li&gt;
&lt;li&gt;A scalable, sustainable, and cost-effective interactive computing service for universities is needed as soon as possible.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="demand-for-interactive-computing"&gt;Demand for interactive computing&lt;/h2&gt;
&lt;p&gt;Both research and teaching at universities are adapting to major societal changes driven by explosions in data and computational tools. New educational programs that prepare students to think computationally are emerging, while research strategies are changing in ways that are more open, reproducible, collaborative, and interdisciplinary. These transformations are inextricably linked and are accelerating demand for interactive computing. The Syzygy experiment has shown that using Jupyter in educational programs drives interest in using Jupyter for research (and vice versa). For example, students in mathematics, statistics, and computer science &lt;a href="https://medium.com/pims-math/saving-lives-with-data-and-math-b697667d1cd7"&gt;collaborated with a researcher from St. Paul’s Hospital in Vancouver using Syzygy&lt;/a&gt; to identify new pathways to prevent death from sepsis. Research communities typically need access to deeper computational resources and often span multiple universities, but the common thread is the need to expand access to interactive computing.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A map of JupyterHub deployments deployed by Syzygy." src="https://blog.jupyter.org/posts/2019/national-scale-interactive-computing/images/001-1_L8MzmheO2NZQBH0t-BGpFg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A map of JupyterHub deployments deployed by Syzygy.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="technical-milestone-achieved"&gt;Technical milestone achieved&lt;/h2&gt;
&lt;p&gt;The Syzygy project has demonstrated that it’s possible to deploy tools for interactive computation at a national scale rapidly and efficiently using an entirely open source technology stack. Students, faculty and staff across Canada use Syzygy to access Jupyter through their browsers with their university single-sign-on credentials. The JupyterHubs range from a “standard” configuration to bespoke environments with specially curated tools and data integrations. This richness is possible because of the architecture of the Syzygy and Jupyter projects and the flexibility of the underlying cloud resources. As a case-study, Syzygy demonstrates that the Jupyter community has achieved a significant technical milestone: interactive computing &lt;em&gt;can be delivered&lt;/em&gt; at national scale using cloud technologies.&lt;/p&gt;
&lt;h2 id="service-level-requirements"&gt;Service level requirements&lt;/h2&gt;
&lt;p&gt;The validation that interactive computing can be technically delivered at national scale prompts universities to ask a variety of questions. Can interactive computing service be delivered robustly? How will users be supported? What are the uptime expectations? What is the data security policy? How is privacy protected? Can the robustness of the service be clarified in a service level agreement? Syzygy, as an experimental service offered to universities at no charge and without a service level agreement, does not properly address these questions. To advance on their education-research-service mission and address growing demand, universities need a reliable interactive computing service with a service level agreement.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;How should universities address their needs for interactive computing over the next five years? Right now, universities are following two primary approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🙏 &lt;em&gt;&lt;strong&gt;Ad hoc&lt;/strong&gt;&lt;/em&gt;: faculty figure out how to meet their own needs for interactive computing; IT staff deploys JupyterHub on local or commercial cloud servers; this approach gives universities control over their deployments and hardware, though requires time and expertise that many may not have.&lt;/li&gt;
&lt;li&gt;🎩 &lt;em&gt;&lt;strong&gt;Use a cloud provider’s service&lt;/strong&gt;&lt;/em&gt;: Google Colab, Amazon Sagemaker, Microsoft Azure Notebooks, IBM Watson Studio; this approach allows universities to quickly launch interactive computing services, with a loss of flexibility and some risks by becoming reliant upon a particular vendor’s closed-source and proprietary software.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These approaches are not sustainable over the long term. If universities all deploy their own JupyterHub services, many will need technical expertise they do not currently have and will involve a significant duplication of effort. If universities rely on hosted cloud notebook services, the reliance on proprietary technology will impair their ability to switch between different cloud vendors, change hardware, customize software, etc. Vendor lock-in will limit the ability of universities to respond to changes in price for the service. Universities will lose agility in responding to changes in faculty, staff, and student computing needs.&lt;/p&gt;
&lt;p&gt;There is a third option that addresses the issues with these two approaches and generates other benefits for universities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🤔 &lt;em&gt;&lt;strong&gt;Form an interactive computing consortium&lt;/strong&gt;&lt;/em&gt;: universities collaborate to &lt;em&gt;build&lt;/em&gt; an interactive computing service provider aligned with their missions to better serve their students, facilitate research, and avoid risks associated with vendor lock-in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To retain control over their interactive computing stacks, avoid dependence&lt;sup class="footnote-ref"&gt;&lt;a href="#fn3" id="fnref3"&gt;[3]&lt;/a&gt;&lt;/sup&gt; on cloud providers, and accelerate the emergence of new programs, universities should work together to deploy interactive computing environments in a vendor-agnostic manner. This might take the form of a consortium — an organization dedicated to serving the needs of universities through customized shared infrastructure for interactive computing. The consortium would also ensure that universities will continue to play a leadership role in the development of the interactive computing tools used for education and research.&lt;/p&gt;
&lt;p&gt;The Syzygy experiment confirmed that growing demand for interactive computation within universities can be supplied with the available technologies advanced by the Jupyter open source community. In the coming year, we aim to build upon the success of the Syzygy experiment and seed an initial node of a consortium in Canada with the intention of fostering a global network of people invested in advanced interactive computing. If you are interesting in partnering, &lt;a href="https://ten.blue/2i2c/#/3/4"&gt;please get in touch!&lt;/a&gt; See &lt;a href="https://discourse.jupyter.org/t/creating-national-infrastructure-for-jupyter-environments/1966"&gt;this Jupyter Community Forum post&lt;/a&gt; to continue the discussion.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;hr class="footnotes-sep"&gt;
&lt;section class="footnotes"&gt;
&lt;ol class="footnotes-list"&gt;
&lt;li id="fn1" class="footnote-item"&gt;&lt;p&gt;The author gratefully acknowledges feedback on this piece from Ian Allison, Lindsey Heagy, Chris Holdgraf, Fernando Perez, and Lindsay Sill. &lt;a href="#fnref1" class="footnote-backref"&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn2" class="footnote-item"&gt;&lt;p&gt;Interactive computing needs have been identified in agriculture, applied mathematics, astronomy, chemistry, climate science, computer science, data science, digital humanities, ecology, economics, engineering, genomics, geoscience, health sciences, K-12 education, neuroscience, political science, physics, pure mathematics, statistics, and sociology. &lt;a href="#fnref2" class="footnote-backref"&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn3" class="footnote-item"&gt;&lt;p&gt;Relying on commercial cloud vendors to provide the interactive computing service for universities risks recreating the problems associated with scientific publishing that emerged with the internet. &lt;a href="#fnref3" class="footnote-backref"&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content><category term="cloud computing"/><category term="education"/><category term="HPC"/><category term="JupyterHub"/><category term="science"/></entry><entry><title>University of Edinburgh Jupyter Community nbgrader Hackathon</title><link href="https://blog.jupyter.org/posts/2019/university-of-edinburgh-nbgrader-hackathon/" rel="alternate"/><published>2019-05-22T16:59:00+00:00</published><updated>2019-05-22T16:59:00+00:00</updated><author><name>James Slack</name></author><id>tag:blog.jupyter.org,2019-05-22:/posts/2019/university-of-edinburgh-nbgrader-hackathon/</id><summary type="html">&lt;p&gt;The University of Edinburgh is happy to announce our upcoming event as part of the Jupyter Community Workshop series funded by Bloomberg.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The University of Edinburgh is happy to announce our upcoming event as part of the &lt;a href="https://blog.jupyter.org/posts/2019/jupyter-community-workshops/"&gt;Jupyter Community Workshop series&lt;/a&gt; funded by &lt;a href="https://www.techatbloomberg.com/"&gt;Bloomberg&lt;/a&gt;. The University will be hosting a three-day event, the core aspect of this event being a hackathon focused on adding improvements, fixes and extra documentation for the nbgrader extension. Alongside this we will also hold an afternoon of talks highlighting how Jupyter can be used in education at varying levels. The event will take place on 29 to 31 May at the University of Edinburgh, with the afternoon of talks taking place on 30 May.&lt;/p&gt;
&lt;p&gt;The first and main part of the event will be the nb grader hackathon. nbgrader is a Jupyter extension that allows for the creation and marking of notebook-based assignments. Here at the University, we have adopted nbgrader and our developers have integrated the extension into our Jupyter service &lt;a href="https://noteable.edina.ac.uk/"&gt;Noteable&lt;/a&gt;. The hackathon will focus on improving the core features and extending the abilities of nbgrader; by adding such features, it will be easier for institutions to adopt and embed both Jupyter and nbgrader into their teaching practice.&lt;/p&gt;
&lt;p&gt;The second, equally important part of our event is a series of talks aimed at highlighting the uses of Jupyter within education. As part of developing our local Jupyter service, we have uncovered many use cases across the University of how Jupyter can be adopted in a variety of disciplines and scenarios that we are keen to share. We will also be able to showcase an institutional approach to adopting and supporting Jupyter at scale. On top of this, there is also the opportunity to hear from many of our hackathon attendees. This series of talks is aimed at academic colleagues, and teaching and support staff at any level of education and includes an evening networking event to allow attendees to further explore how they may introduce Jupyter to their institution.&lt;/p&gt;
&lt;h2 id="what-are-we-working-on"&gt;What are we working on?&lt;/h2&gt;
&lt;p&gt;We have worked with our local developers and scoured the &lt;a href="https://github.com/jupyter/nbgrader"&gt;nbgrader&lt;/a&gt; Github repo to devise a plan of attack for the hackathon in terms of features and improvement. We’re keen to engage with the wider community regarding these goals and have created a post on the &lt;a href="https://discourse.jupyter.org/t/jupyter-nbgrader-hackathon-topics/1040"&gt;Jupyter Discourse&lt;/a&gt; to allow further discussion.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for Multiple course/Multiple classes. Instructors that teach multiple course using nbgrader or students enrolled on multiple course. Multiple Courses (ref: &lt;a href="https://github.com/jupyter/nbgrader/pull/1040"&gt;PR #1040&lt;/a&gt;) vs Support for multiple classes via Jupyterhub groups (&lt;a href="https://github.com/jupyter/nbgrader/pull/893"&gt;PR #893&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Considerations for LTI use: Users/Courses not in the database at startup&lt;/li&gt;
&lt;li&gt;Support for Multiple markers for one assignment (part of issue &lt;a href="https://github.com/jupyter/nbgrader/issues/1030"&gt;#1030&lt;/a&gt;, which extends &lt;a href="https://github.com/jupyter/nbgrader/issues/998"&gt;#998&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;API Tests have hard-coded file copy methods to pre-load the system to enable testing, and os.file_exists-type tests for release &amp;amp; submit tests&lt;/li&gt;
&lt;li&gt;Generation of feedback copies for students within the formgrader UI (to mirror the existing terminal command). Also consider ability to disseminate this feedback back to students within nbgrader.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="want-to-get-involved"&gt;Want to get involved?&lt;/h2&gt;
&lt;p&gt;If you would like to be involved in the hackathon, we still have an amount of funding left for travel and accommodation. We are looking for participants who have a good understanding of Jupyter and nbgrader who would be able to attend all three days of the event. If you would be able to attend, please complete the following form: [&lt;a href="https://edin.ac/2vP8bFS"&gt;https://edin.ac/2vP8bFS&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;If you can’t attend but want to have a say on what is worked on during the hackathon then join the discussion on the &lt;a href="https://discourse.jupyter.org/t/jupyter-nbgrader-hackathon-topics/1040"&gt;Jupyter Discourse&lt;/a&gt; (if you’re new to Jupyter this is an excellent place to head to for community discussions)&lt;/p&gt;
&lt;p&gt;If you’d like to come along to our Jupyter community afternoon on 30 May, book a place via &lt;a href="https://edin.ac/2vPaCIk"&gt;Eventbrite&lt;/a&gt;.&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="education"/><category term="events"/><category term="workshops"/></entry><entry><title>Teaching and Learning with Jupyter</title><link href="https://blog.jupyter.org/posts/2019/teaching-and-learning-with-jupyter/" rel="alternate"/><published>2019-01-07T12:57:00+00:00</published><updated>2019-01-07T12:57:00+00:00</updated><author><name>Lorena A Barba</name></author><id>tag:blog.jupyter.org,2019-01-07:/posts/2019/teaching-and-learning-with-jupyter/</id><summary type="html">&lt;p&gt;From the early days — even before the Jupyter name — many of us foresaw that the IPython Notebook and the ecosystem of tools growing around it would be a “killer app” for education.&lt;/p&gt;</summary><content type="html">&lt;figure&gt;
&lt;img alt="The book-sprint participants on day 1, developing the content ideas for our open book. Credit: Richard West." src="https://blog.jupyter.org/posts/2019/teaching-and-learning-with-jupyter/images/001-1_wOfBLJW4hIryREyEtsYHmg.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The book-sprint participants on day 1, developing the content ideas for our open book. Credit: Richard West.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;From the early days — even before the Jupyter name — many of us foresaw that the IPython Notebook and the ecosystem of tools growing around it would be a “killer app” for education. But how could we imagine that Jupyter would be at the epicenter of the data science shake-up of tech jobs, reskilling, and educational innovation?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/hashtag/scipy2014?src=hash"&gt;#scipy2014&lt;/a&gt; keynote &lt;a href="https://x.com/LorenaABarba"&gt;@LorenaABarba&lt;/a&gt; says “IPython Notebooks are the Killer App for teaching (science and engineering).”&lt;/p&gt;
&lt;p&gt;— &lt;a href="https://x.com/katyhuff"&gt;katy huff (@katyhuff)&lt;/a&gt;, &lt;a href="https://x.com/katyhuff/status/486519116451176448"&gt;July 8, 2014&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Today, Jupyter is the technology behind the most innovative educational programs in data science, and is platform-of-choice for tutorials, workshops, online lessons, and even books. So I decided it’s a good time to collect the knowledge and experience of early adopters of Jupyter for teaching, combine it with reflections of scholars of education, and write an open book: a &lt;strong&gt;Handbook for Teaching and Learning with Jupyter&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;On Nov. 28–29, 2018, I welcomed fifteen researchers, educators and STEM faculty at the George Washington University, in Washington, D.C., for a &lt;a href="https://en.wikipedia.org/wiki/Book_sprint"&gt;book sprint&lt;/a&gt; — in two and a half days, we collaboratively wrote the first draft of this handbook, and immediately published it online at &lt;a href="http://go.gwu.edu/jupyter4edu"&gt;jupyter4edu.github.io&lt;/a&gt;. The open book continues to be edited and added to via an open-development model on GitHub, with dozens of pull requests merged in its first month.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ready to start writing today, post-it notes everywhere &lt;a href="https://x.com/hashtag/Jupyter4Edu?src=hash"&gt;#Jupyter4Edu&lt;/a&gt;&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2019/teaching-and-learning-with-jupyter/images/002-DtLNcpnX4AAZP_k.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;— &lt;a href="https://x.com/LorenaABarba"&gt;Lorena Barba @labarba@fosstodon.org (@LorenaABarba)&lt;/a&gt;, &lt;a href="https://x.com/LorenaABarba/status/1068141969690583041"&gt;November 29, 2018&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The book covers the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why we use Jupyter notebooks for teaching, the learning benefits and some anecdotes from our own experiences&lt;/li&gt;
&lt;li&gt;What we do with Jupyter, with lots of examples and tips for incorporating notebooks into a lesson or course&lt;/li&gt;
&lt;li&gt;A catalogue of pedagogical patterns with notebooks, drawn from our own experience and examples from others&lt;/li&gt;
&lt;li&gt;The Jupyter Notebook ecosystem, focusing on the tools that are most useful for teaching and learning&lt;/li&gt;
&lt;li&gt;Getting your class going with Jupyter: all you need to know about options for installing software, infrastructure options, distributing and collecting materials, assessing student work, and more&lt;/li&gt;
&lt;li&gt;Usage case studies, including large-scale adoption, single courses, and notable teaching materials published as notebooks&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Book link: &lt;a href="http://go.gwu.edu/jupyter4edu"&gt;jupyter4edu.github.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jupyter continues to grow in popularity for teaching data science and computation not only in STEM fields, but also data journalism, business and quantitative economics, data-based decision sciences and policy, quantitative health sciences, and digital humanities.&lt;/p&gt;
&lt;p&gt;For educators newly adopting Jupyter, navigating the ecosystem of tools and content can be overwhelming. They could study many examples, and consume myriad blog posts and talk videos to distill the patterns of good practices and technical solutions to best serve their students. Our open book aims to be the entry point for educators who want to use Jupyter to empower their teaching. We hope it will grow to encompass all you need to know about Jupyter in teaching and learning.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The book sprint was supported by a grant from Bloomberg to Project Jupyter for holding &lt;a href="https://blog.jupyter.org/posts/2018/jupyter-community-workshops/"&gt;Jupyter Community Workshops last year&lt;/a&gt;, which provided funding for the participants’ travel and event catering. The grant was managed by &lt;a href="https://www.numfocus.org"&gt;NumFOCUS&lt;/a&gt; (fiscal sponsor for Project Jupyter). Meeting space was provided free of charge by the George Washington University, and the group was fêted at a reception sponsored by &lt;a href="https://www.leidos.com"&gt;Leidos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tweet with &lt;a href="https://twitter.com/hashtag/Jupyter4Edu?src=hash"&gt;#jupyter4edu&lt;/a&gt; to let us know what you think!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Book-sprint participants, with their bios, at:&lt;/em&gt; &lt;a href="https://osf.io/uqz4j/wiki/Participants/"&gt;https://osf.io/uqz4j/wiki/Participants/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Book link:&lt;/em&gt; &lt;a href="http://go.gwu.edu/jupyter4edu"&gt;jupyter4edu.github.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="education"/></entry><entry><title>Synopsis: JupyterCon 2018 Education Track</title><link href="https://blog.jupyter.org/posts/2018/synopsis-jupytercon-2018-education-track/" rel="alternate"/><published>2018-08-22T01:02:00+00:00</published><updated>2018-08-22T11:54:00+00:00</updated><author><name>Lorena A Barba</name></author><id>tag:blog.jupyter.org,2018-08-22:/posts/2018/synopsis-jupytercon-2018-education-track/</id><summary type="html">&lt;p&gt;I’m on the train to NY, giddy in anticipation of the Jupyter community celebrating together for the second year. It was a privilege for me to be invited to keynote last year, at the inaugural JupyterCon.&lt;/p&gt;</summary><content type="html">&lt;figure&gt;
&lt;img alt="Barba keynoting at JupyterCon 2017. Credit: O’Reilly Media." src="https://blog.jupyter.org/posts/2018/synopsis-jupytercon-2018-education-track/images/001-1_gTmXUbSg_koWhh3hIW7dhA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Barba keynoting at JupyterCon 2017. Credit: O’Reilly Media.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I’m on the train to NY, giddy in anticipation of the Jupyter community celebrating together for the second year. It was a privilege for me to be invited to keynote last year, at the inaugural JupyterCon. This year, I am part of the Program Committee, co-chairing the education track with &lt;a href="https://twitter.com/RobertTalbert"&gt;Robert Talbert&lt;/a&gt;. Let me tell you about the impressive and inspiring conference line-up for Jupyter in education!&lt;/p&gt;
&lt;p&gt;The main conference lists 11 talks on the education track, listed below. In addition to these, we have a panel (2:40–3:20pm Thursday), and an unconference-style session on Thursday at 5 PM.&lt;/p&gt;
&lt;p&gt;The panel is titled &lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/71871"&gt;“The Future of Jupyter in Education,”&lt;/a&gt; and features the following panelists:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Carol Willing, &lt;a href="https://twitter.com/WillingCarol"&gt;@WillingCarol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Natalia Clementi, &lt;a href="https://twitter.com/ncclementi"&gt;@ncclementi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;James Colliander, &lt;a href="https://twitter.com/colliand"&gt;@colliand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allen Downey, &lt;a href="https://twitter.com/AllenDowney"&gt;@allendowney&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jason Moore, &lt;a href="https://twitter.com/moorepants"&gt;@moorepants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Danny Caballero, &lt;a href="https://twitter.com/physicistdanny"&gt;@physicistdanny&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each panelist will make a 2–3 min statement to get people thinking, and then it’s Q&amp;amp;A with the audience. We’ve asked the panelists to jot down some ideas to share with us, based on the following questions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What do you see in &lt;em&gt;the future of Jupyter&lt;/em&gt; if it is to fulfill its potential for teaching and learning?&lt;/p&gt;
&lt;p&gt;What do you &lt;em&gt;want from Jupyter&lt;/em&gt; as its adoption in education grows?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you are interested in the future of Jupyter in education, please come join the conversation at the panel — it will be energizing!&lt;/p&gt;
&lt;p&gt;One thing we &lt;em&gt;don’t want&lt;/em&gt; for the discussion in this panel is to drift towards the DevOps challenges of adopting the tools (like JupyterHub and nbgrader). The Project Jupyter team is very aware that DevOps is a pain point for the educational uses of Jupyter. And they are working on it!&lt;/p&gt;
&lt;p&gt;Let’s put our minds together to build a vision for the ecosystem, imagine how institutions might collaborate (e.g., &lt;a href="https://medium.com/@pimsmath/canadians-land-on-jupyter-ef5872720420"&gt;federated solution in Canada&lt;/a&gt;), what could be the role of the private sector (i.e., paid options, freemium models), or the nonprofit sector (e.g., &lt;a href="https://www.numfocus.org"&gt;NumFOCUS&lt;/a&gt;) — but refrain from going into the weeds of concrete technical details (on this occasion).&lt;/p&gt;
&lt;p&gt;We want to steer the conversation towards the &lt;em&gt;learning&lt;/em&gt; concerns more than the &lt;em&gt;edtech&lt;/em&gt; concerns. For example, now that many educators are using Jupyter, can we look into what works, and are we using research-based pedagogical strategies? What are these (e.g., &lt;a href="https://www.dashe.com/blog/learning/chunking-memory-retention/"&gt;chunking&lt;/a&gt;, scaffolding), and can we distill some “best practices”?&lt;/p&gt;
&lt;p&gt;For the unconference-style session, the slate is clean. We’ll bring sharpies and big post-it notes, and be ready to live tweet!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="thursday-5-sessions"&gt;Thursday: 5 sessions&lt;/h2&gt;
&lt;p&gt;11:05am–11:45am&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68412"&gt;Flipped learning with Jupyter: Experiences, best practices, and supporting research&lt;/a&gt;, Beekman/Sutton North | Lorena Barba (George Washington University), Robert Talbert (Grand Valley State University)&lt;/p&gt;
&lt;p&gt;11:55am–12:35pm&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68434"&gt;JupyterHub for domain-focused integrated learning modules&lt;/a&gt;, Beekman/Sutton North | Mariah Rogers (UC Berkeley Division of Data Sciences), Ronald Walker (UC Berkeley Division of Data Sciences), Julian Kudszus (Yelp)&lt;/p&gt;
&lt;p&gt;1:50pm–2:30pm&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68251"&gt;Jupyter for every high schooler&lt;/a&gt;, Beekman/Sutton North | Rob Newton (Trinity School)&lt;/p&gt;
&lt;p&gt;2:40pm–3:20pm&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68375"&gt;Real-time collaboration with Jupyter notebooks using CoCalc&lt;/a&gt;, Murray Hill | William Stein (SageMath, Inc. | University of Washington)&lt;/p&gt;
&lt;p&gt;4:10pm–4:50pm&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68408"&gt;Learn by doing: Using data-driven stories and visualizations in the (high school and college) classroom&lt;/a&gt;, Beekman/Sutton North | Carol Willing (Cal Poly San Luis Obispo), Jessica Forde (Jupyter), Erik Sundell (IT-Gymnasiet Uppsala)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="friday-6-sessions"&gt;Friday: 6 sessions&lt;/h2&gt;
&lt;p&gt;11:05am–11:45am&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68332"&gt;Data science in US and Canadian higher education&lt;/a&gt;, Beekman/Sutton North | Laura Noren (NYU Center for Data Science)&lt;/p&gt;
&lt;p&gt;11:55am–12:35pm&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68282"&gt;I don’t like notebooks&lt;/a&gt;, Nassau | Joel Grus (Allen Institute for Artificial Intelligence)&lt;/p&gt;
&lt;p&gt;11:55am–12:35pm&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68308"&gt;The Jupyter Notebook as a transparent way to document machine learning model development: A case study from a US defense agency&lt;/a&gt;, Concourse A: Business Summit | Catherine Ordun (Booz Allen Hamilton)&lt;/p&gt;
&lt;p&gt;1:50pm–2:30pm&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68395"&gt;Jupyter graduates&lt;/a&gt;, Beekman/Sutton North | Douglas Blank (Bryn Mawr College), Nicole Petrozzo (Bryn Mawr College)&lt;/p&gt;
&lt;p&gt;2:40pm–3:20pm&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68286"&gt;Reproducible education: What teaching can learn from open science practices&lt;/a&gt;, Beekman/Sutton North | Elizabeth Wickes (School of Information Sciences, University of Illinois at Urbana-Champaign)&lt;/p&gt;
&lt;p&gt;5:00pm–5:40pm&lt;br&gt;
&lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68318"&gt;Current RISE candies and its evolution into the future&lt;/a&gt;, Beekman/Sutton North | Damián Avila (Anaconda, Inc.)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;If I missed an education-track session in my synopsis, let me know and I’ll add it!&lt;/em&gt;&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
</content><category term="education"/><category term="events"/><category term="JupyterCon"/></entry></feed>