<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - education</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/tag-education.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2026-02-19T12:26:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>JupyterLite Officially Joins Project Jupyter!</title><link href="https://jasongrout.github.io/medium-archive/pelican/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>Project Jupyter</name></author><id>tag:jasongrout.github.io,2026-02-12:/medium-archive/pelican/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…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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="http://p5.js"&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://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;a href="https://jupyter.org/try-jupyter/"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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;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;
&lt;p&gt;— this post was coauthored by Jérémy Tuloup, Sylvain Corlay, and Fernando Pérez&lt;/p&gt;
</content><category term="education"/><category term="JupyterLite"/><category term="WebAssembly"/></entry><entry><title>Desktop GIS software in the cloud with JupyterHub: A QGreenland workshop success story</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2023-08-02:/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/posts/2023/desktop-gis-software-in-the-cloud-with-jupyterhub/images/002-0__t2MDU659mlYEvxD.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;em&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;/em&gt;&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="/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;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="accessibility"/><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://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2023-04-28:/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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;
</content><category term="education"/></entry><entry><title>Jupyter Community Workshop: Jupyter for Education</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2022-12-05:/medium-archive/pelican/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;/em&gt; &lt;a href="https://www.cnam.fr/"&gt;&lt;em&gt;CNAM&lt;/em&gt;&lt;/a&gt; &lt;em&gt;for hosting us and to&lt;/em&gt; &lt;a href="https://www.inria.fr/"&gt;&lt;em&gt;INRIA&lt;/em&gt;&lt;/a&gt; &lt;em&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 Boshifor Wikimedia Commons" src="https://jasongrout.github.io/medium-archive/pelican/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 Boshifor Wikimedia Commons&lt;/figcaption&gt;
&lt;/figure&gt;
</content><category term="community"/><category term="education"/><category term="events"/><category term="workshops"/></entry><entry><title>Upgrading Nbgrader</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2022-09-15:/medium-archive/pelican/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…&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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;a href="https://mybinder.org/v2/gh/jupyter/nbgrader.git/v0.8.0"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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;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;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/upgrading-nbgrader/images/005-1_C1fPJUhN8pk86GIXCQq5AA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="education"/></entry><entry><title>Jupyter Community Workshops: Call for Proposals</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-community-workshops/" rel="alternate"/><published>2022-04-26T16:55:00+00:00</published><updated>2022-05-25T16:18:00+00:00</updated><author><name>Gayle Ollington</name></author><id>tag:jasongrout.github.io,2022-04-26:/medium-archive/pelican/posts/2022/jupyter-community-workshops/</id><summary type="html">&lt;p&gt;Call for Proposals for July 2022 — April 2023&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/jupyter-community-workshops/images/001-1_eQGWQqYPRRDdxzlINXqpXw.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We are pleased to announce that the next call for proposals for Jupyter Community Workshops is &lt;a href="https://forms.gle/1FsSTKaQDNJSSBDG8"&gt;now open&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The majority of Jupyter’s work is accomplished through online collaboration; yet, over the years, we found value in focused in-person workshops. In-person events are particularly useful for tackling challenging development and design projects, growing the community of contributors, and for strengthening collaborations.&lt;/p&gt;
&lt;p&gt;Jupyter Community Workshops is a series of community-organized events to enable such gatherings. See examples of recent workshops &lt;a href="/posts/2019/jupyter-community-workshops/"&gt;here&lt;/a&gt;, and stay tuned for updates on the current round of workshops.&lt;/p&gt;
&lt;p&gt;We are grateful for the initial and continuing financial support by Bloomberg and Amazon Web Services that makes our workshops possible. If your organization would like to support this program, please contact &lt;a href="https://numfocus.org/"&gt;NumFOCUS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fourth call for proposals for Jupyter Community Workshops is open through&lt;/strong&gt; S̶u̶n̶d̶a̶y̶,̶ ̶M̶a̶y̶ ̶2̶2̶,̶ ̶2̶0̶2̶2̶ &lt;strong&gt;Monday, June 6, 2022.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jupyter Community Workshops bring together small groups of Jupyter community members and core contributors for high-impact strategic work and community engagement on focused topics. Events funded in this round would occur no later than April 30, 2023.&lt;/p&gt;
&lt;p&gt;These workshops are expected to involve up to two dozen participants over the course of two to four days, in an in-person or virtual format. Depending on the format of the event, proposals may include a Jupyter-funded budget for direct expenses of up to $20,000 to reimburse in-person events or up to $5,000 for virtual events. Direct expenses include, for example, travel expenses, speaker promotional items, video conferencing platform, accommodation, meals and event space. (Please note this is not a grant with overhead or indirect costs.) It is our intent the workshops will include both participants who are core Jupyter contributors and stakeholders, contributors, and potential contributors within the larger Jupyter ecosystem. Participants should be at least 18 years old (i.e., not minors). While not the primary focus of the workshops, it would be highly beneficial to couple the workshop with broader community outreach events, such as sprints, talks, or tutorials at local meetings or conferences. For examples of recent workshops, see some &lt;a href="/posts/2019/jupyter-community-workshops/"&gt;proposals funded in a recent round&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proposal Process Highlights:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Submit initial proposal &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSfmH8Q5XWL7SFkrSh85kYgvN9eSo_YzvQwpwqgOjvHizkOpIQ/viewform?usp=sf_link"&gt;using this form&lt;/a&gt; by S̶u̶n̶d̶a̶y̶,̶ ̶M̶a̶y̶ ̶2̶2̶,̶ ̶2̶0̶2̶2̶ &lt;strong&gt;Monday, June 6, 2022 (&lt;/strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Anywhere_on_Earth"&gt;&lt;strong&gt;Anywhere on Earth&lt;/strong&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initial Jupyter Community Building Committee (CBC) review (up to a week). Proposal goes to CBC for initial review and feedback. Proposal is either approved or declined.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Budget and Logistics Development (up to four weeks). Jupyter Community Events Manager will support workshop organizers, who will develop a venue/date proposal, detailed budget, event plan, and proposed list of participants.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final CBC review (up to a week). Proposal presented for final approval to CBC, including final budget, event details, and an estimate of the potential impact of the event. Assuming the budget included in the initial proposal is fully developed and no major changes are proposed, this period may be waived.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The proposal process for these workshops is managed by the Jupyter Community Building Committee, NumFOCUS and the Jupyter Community Events Manager, Gayle Ollington (gayle@numfocus.org). Applications can be completed using the &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSfmH8Q5XWL7SFkrSh85kYgvN9eSo_YzvQwpwqgOjvHizkOpIQ/viewform?usp=sf_link"&gt;online form&lt;/a&gt; and are due by Sunday, May 22, 2022 (&lt;a href="https://en.wikipedia.org/wiki/Anywhere_on_Earth"&gt;Anywhere on Earth&lt;/a&gt;). Events should be hosted no later than April 30, 2023.&lt;/p&gt;
&lt;p&gt;—&lt;/p&gt;
&lt;p&gt;This initiative is organized by Ana Ruvalcaba, Jason Grout, Sylvain Corlay, and Gayle Ollington.&lt;/p&gt;
</content><category term="community"/><category term="education"/><category term="events"/><category term="workshops"/></entry><entry><title>Jupyter Games</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2021-12-14:/medium-archive/pelican/posts/2021/jupyter-games/</id><summary type="html">&lt;p&gt;Ipycanvas + Box2D&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyter-games/images/005-1_uPfz8srjXR24dtFm8wVBQg.mp4" 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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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://camo.githubusercontent.com/581c077bdbc6ca6899c86d0acc6145ae85e9d80e6f805a1071793dbe48917982/68747470733a2f2f6d7962696e6465722e6f72672f62616467655f6c6f676f2e737667"&gt;MyBinder&lt;/a&gt; for example).&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://camo.githubusercontent.com/581c077bdbc6ca6899c86d0acc6145ae85e9d80e6f805a1071793dbe48917982/68747470733a2f2f6d7962696e6465722e6f72672f62616467655f6c6f676f2e737667"&gt;&lt;img alt="Conways game of life in ipycanvas, try it out!" src="https://jasongrout.github.io/medium-archive/pelican/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://camo.githubusercontent.com/581c077bdbc6ca6899c86d0acc6145ae85e9d80e6f805a1071793dbe48917982/68747470733a2f2f6d7962696e6465722e6f72672f62616467655f6c6f676f2e737667"&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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;a href="https://mybinder.org/v2/gh/pyb2d/pyb2d/main?urlpath=/lab/tree/examples/jupyter_integration.ipynb"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/jupyter-games/images/014-1_8f05EGZrQyBxZr-Byn_vxg.mp4" 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://jasongrout.github.io/medium-archive/pelican/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;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://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2020-08-03:/medium-archive/pelican/posts/2020/juan-klopper/</id><summary type="html">&lt;p&gt;JupyterCon 2020 keynote speaker announcement&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;JupyterCon 2020 keynote speaker announcement&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Juan Klopper and Lorena Barba in Delft, Holland, for the Global Open Education Conference, April 2018." src="https://jasongrout.github.io/medium-archive/pelican/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="/posts/2020/anima-anandkumar/"&gt;Anima Anandkumar&lt;/a&gt; and &lt;a href="/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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;
</content><category term="education"/><category term="events"/><category term="JupyterCon"/></entry><entry><title>Plasma: A learning platform powered by Jupyter</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2020-05-11:/medium-archive/pelican/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…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Jupyter has been a &lt;a href="/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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/plasmabio"&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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/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://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/007-1_0n1kaev7c81I45SZ0HoLxQ.mp4" 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="/posts/2020/interactive-graph-visualization-in-jupyter-with/"&gt;https://blog.jupyter.org/interactive-graph-visualization-in-jupyter-with-ipycytoscape-a8828a54ab63&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/plasma-a-learning-platform-powered-by-jupyter/images/008-1_-mk2TL1LTFBzkfW4JX30Pw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="education"/><category term="JupyterHub"/></entry><entry><title>University of Edinburgh Jupyter Community nbgrader Hackathon</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/https-blog-jupyter-org-university-of-edinburgh-jupyter/" 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:jasongrout.github.io,2019-05-22:/medium-archive/pelican/posts/2019/https-blog-jupyter-org-university-of-edinburgh-jupyter/</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="/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;p&gt;&lt;strong&gt;What are we working on?&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;Want to get involved?&lt;/strong&gt;&lt;/p&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: [https://edin.ac/2vP8bFS].&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;
</content><category term="education"/><category term="hackathons"/></entry><entry><title>Teaching and Learning with Jupyter</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2019-01-07:/medium-archive/pelican/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…&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://jasongrout.github.io/medium-archive/pelican/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&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/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="/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;
</content><category term="education"/></entry><entry><title>Synopsis: JupyterCon 2018 Education Track</title><link href="https://jasongrout.github.io/medium-archive/pelican/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:jasongrout.github.io,2018-08-22:/medium-archive/pelican/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…&lt;/p&gt;
</summary><content type="html">&lt;figure&gt;
&lt;img alt="Barba keynoting at JupyterCon 2017. Credit: O’Reilly Media." src="https://jasongrout.github.io/medium-archive/pelican/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;/blockquote&gt;
&lt;blockquote&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;h3 id="thursday-5-sessions"&gt;&lt;strong&gt;Thursday: 5 sessions&lt;/strong&gt;&lt;/h3&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;h3 id="friday-6-sessions"&gt;&lt;strong&gt;Friday: 6 sessions&lt;/strong&gt;&lt;/h3&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;
</content><category term="education"/><category term="events"/><category term="JupyterCon"/></entry></feed>