<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - reproducibility</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/tag-reproducibility.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2025-03-03T14:05:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Simplifying and speeding up Binder builds with BuildKit</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2025/simplifying-and-speeding-up-binder-builds-with-buildkit/" rel="alternate"/><published>2025-03-03T14:05:00+00:00</published><updated>2025-03-03T14:05:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2025-03-03:/medium-archive/pelican/posts/2025/simplifying-and-speeding-up-binder-builds-with-buildkit/</id><summary type="html">&lt;p&gt;The Binder Project allows users to build reproducible, sharable environments for interactive computing. To accomplish this, Binder uses a…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The &lt;a href="http://mybinder.org"&gt;Binder Project&lt;/a&gt; allows users to build reproducible, sharable environments for interactive computing. To accomplish this, Binder uses a tool called &lt;a href="https://repo2docker.readthedocs.io/"&gt;repo2docker&lt;/a&gt; to generate an executable Docker image using the &lt;a href="https://repo2docker.readthedocs.io/en/latest/specification.html"&gt;Reproducible Execution Environment Specification&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/simplifying-and-speeding-up-binder-builds-with-buildkit/images/001-1_NOEeFGGHdpGZMHSq5ykl9A.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The first time a repository is launched on Binder, repo2docker must build the reproducible environment for it. This process can take a long time because of all the dependencies that need to be installed and turned into the image. As a result, Binder launches can feel slow and clunky, which is a poor UX for workflows that are designed around quick interactive sessions.&lt;/p&gt;
&lt;p&gt;repo2docker was built several years ago, and followed patterns that were commonplace at the time. However, in the past few years the Docker community has made significant advances in optimizing the image building process. One-such improvement is the creation of &lt;a href="https://docs.docker.com/build/buildkit/"&gt;BuildKit&lt;/a&gt;, a replacement for Docker’s historical build system that is much more sophisticated. However, repo2docker hasn’t leveraged these improvements because it was still using the original Docker Build system.&lt;/p&gt;
&lt;p&gt;So, we’ve decided to spend a few cycles modernizing repo2docker’s image building logic by using the more modern &lt;a href="https://docs.docker.com/build/buildkit/"&gt;BuildKit API&lt;/a&gt; (via ‘docker buildx build’). This allows for optimizations like build parallelization, better build caching, and supporting some &lt;code&gt;Dockerfile&lt;/code&gt; features that Binder didn’t support earlier (particularly, &lt;code&gt;COPY --chown&lt;/code&gt;). It also lays a foundation for significantly simplifying the repo2docker build infrastructure and leveraging more of BuildKit’s parallelization functionality. For example, we’d like to &lt;a href="https://docs.docker.com/build/builders/drivers/kubernetes/"&gt;leverage BuildKit’s Kubernetes driver&lt;/a&gt; which distributes builds much more efficiently and in parallel.&lt;/p&gt;
&lt;p&gt;Authors of Binder repositories won’t need to take any action¹, and they’ll simply notice that mybinder.org (and any other community-run BinderHub instance) will be a bit snappier at building images.&lt;/p&gt;
&lt;p&gt;If you’d like to learn more about the changes that enabled this, &lt;a href="https://github.com/jupyterhub/mybinder.org-deploy/pull/3225"&gt;check out this mybinder.org pull request&lt;/a&gt; which has links to the repo2docker pull requests that added this functionality. We’re excited keep improving Binder, and are hopeful that this makes the experience of using mybinder.org and community Binders a little bit better.&lt;/p&gt;
&lt;h2 id="authors-and-acknowledgements"&gt;Authors and acknowledgements&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://github.com/yuvipanda"&gt;Yuvi Panda&lt;/a&gt; is a co-founder and the Technical Lead at &lt;a href="http://2i2c.org"&gt;2i2c&lt;/a&gt;. He is passionate about building participatory open infrastructure for scientific &amp;amp; educational use cases. He is a Project Jupyter team member primarily focused on infrastructure related projects (JupyterHub, Binder, etc). He also wrote most of the code for this &lt;code&gt;docker buildx&lt;/code&gt; transition, and shepherded it through to deployment on mybinder.org as well. He is ex-Wikimedia and ex-GNOME. Let’s eliminate accidental complexities wherever we find them.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chrisholdgraf.com"&gt;Chris Holdgraf&lt;/a&gt; is a co-founder and the Executive Director of &lt;a href="http://2i2c.org"&gt;2i2c&lt;/a&gt;. He is on the Executive Council of Project Jupyter, and co-leads the &lt;a href="https://jupyterhub-team-compass.readthedocs.io/en/latest/team.html#jupyterhub-team"&gt;JupyterHub and Binder team&lt;/a&gt; as well as the &lt;a href="https://compass.jupyterbook.org"&gt;Jupyter Book team&lt;/a&gt;). He was previously a post-doctoral researcher in the Department of Statistics at &lt;a href="https://www.berkeley.edu/"&gt;UC Berkeley&lt;/a&gt;, and a Community Architect with the &lt;a href="https://data.berkeley.edu/"&gt;Division of Data Science&lt;/a&gt; at Berkeley. He’s interested in using open infrastructure to support interactive computing workflows in research and education.&lt;/p&gt;
&lt;p&gt;Many thanks to &lt;a href="https://github.com/minrk"&gt;@minrk&lt;/a&gt;, &lt;a href="https://github.com/manics"&gt;@manics&lt;/a&gt;, and &lt;a href="https://github.com/consideRatio"&gt;@consideRatio&lt;/a&gt; for their help reviewing and shaping this work.&lt;/p&gt;
&lt;h2 id="footnotes"&gt;Footnotes&lt;/h2&gt;
&lt;p&gt;¹ Unless they were relying on undocumented implementation details of the old builder — in particular, the presence of a &lt;code&gt;/.dockerenv&lt;/code&gt; file to detect if you are running in repo2docker &lt;a href="https://github.com/scikit-learn/scikit-learn/pull/30835"&gt;scikit-learn/scikit-learn#30835&lt;/a&gt; has an example.&lt;/p&gt;
</content><category term="Binder"/><category term="cloud computing"/><category term="JupyterHub"/><category term="reproducibility"/></entry><entry><title>Updating defaults on mybinder.org</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2023/updating-defaults-on-mybinder-org/" rel="alternate"/><published>2023-03-09T08:31:00+00:00</published><updated>2023-03-10T15:53:00+00:00</updated><author><name>Min RK</name></author><id>tag:jasongrout.github.io,2023-03-09:/medium-archive/pelican/posts/2023/updating-defaults-on-mybinder-org/</id><summary type="html">&lt;p&gt;This week, we are deploying some updates to repo2docker, the image-building tool that underpins mybinder.org. This may affect your repos…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2023/updating-defaults-on-mybinder-org/images/001-1_0dd02RZZwHXDo-Fr3tdB5w.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;This week, we are deploying some updates to &lt;a href="http://repo2docker.readthedocs.io"&gt;repo2docker&lt;/a&gt;, the image-building tool that underpins &lt;a href="https://mybinder.org/"&gt;mybinder.org&lt;/a&gt;. This may affect your repos. Please &lt;a href="https://discourse.jupyter.org/c/binder/12"&gt;get in touch&lt;/a&gt; if you have problems! Hopefully this will make things better, more stable, and &lt;em&gt;less&lt;/em&gt; surprising overall, but change always breaks &lt;em&gt;something&lt;/em&gt;, however hard we work to keep things working.&lt;/p&gt;
&lt;p&gt;To highlight the changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.10 is now the default Python version&lt;/li&gt;
&lt;li&gt;Python 3.11 is now supported, and new versions of Python should be supported more quickly&lt;/li&gt;
&lt;li&gt;If a repo requests an old version of Python (≤ 3.6), it will be installed in a separate environment, as we’ve been doing with Python 2.7 for a long time.&lt;/li&gt;
&lt;li&gt;The server implementation is switched from &lt;code&gt;jupyter-notebook&lt;/code&gt; to &lt;code&gt;jupyter-server&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More detail on each change, the reasons behind them, and their consequences below.&lt;/p&gt;
&lt;h2 id="python-311-and-separate-envs-for-legacy-python-support"&gt;Python 3.11 and separate envs for legacy Python support&lt;/h2&gt;
&lt;p&gt;When building an image, repo2docker installs packages in one or two environments — the &lt;strong&gt;kernel&lt;/strong&gt; environment where your code runs, and the &lt;strong&gt;server&lt;/strong&gt; environment, which runs the Jupyter server. If you’re using a reasonably supported version of Python, these are actually the same environment. This is the vast majority of repositories on mybinder.org. In order to function properly, we have certain requirements of what goes in the ‘server’ environment. Eventually, those requirements start making it difficult to setup the server environment with an outdated version of Python, as packages march ahead with their minimum required Python (The widely adopted &lt;a href="https://numpy.org/neps/nep-0029-deprecation_policy.html#support-table"&gt;NEP 29&lt;/a&gt; suggested dropping Python 3.7 support in December, 2021). Our solution for this has been to separate the kernel environment from the server environment, so they don’t create a conflict. Until recently, only Python 2 was handled this way (most packages dropped Python 2 support years ago). As part of adding support for Python 3.11, we have expanded this behavior to include Python ≤3.6, so if you are using a ‘legacy Python’, currently defined to be Python ≤3.6, your requested packages will be installed in the kernel environment instead of the server environment. This &lt;em&gt;should&lt;/em&gt; only have a noticeable effect if you are installing something with server extension components , which includes anything modifying the JupyterLab or notebook interfaces— those will not be available in the server environment. To address this, you will have to upgrade Python &lt;em&gt;or&lt;/em&gt; handle the server extension installation in &lt;code&gt;postBuild&lt;/code&gt; . &lt;a href="https://github.com/jupyterhub/repo2docker/pull/1239"&gt;PR adding Python 3.11 and adding Python ≤3.6 to legacy Python versions&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="default-python-is-now-310"&gt;Default Python is now 3.10&lt;/h2&gt;
&lt;p&gt;The default Python for repo2docker and thereby mybinder.org is now Python 3.10, upgraded from 3.7. 3.10 will be used when a repository does not specify which version of Python to use. Following Python’s own annual release cadence, we plan to update this more regularly in the future, lagging behind Python itself by a version or two. This has no effect on your repos if they specify a Python version, which is why we &lt;a href="https://repo2docker.readthedocs.io/en/latest/howto/languages.html#specifying-a-version-of-python"&gt;&lt;strong&gt;encourage you to specify your Python version&lt;/strong&gt;&lt;/a&gt;! If you don’t, then your Python version &lt;em&gt;will&lt;/em&gt; change over time, probably about once a year. &lt;a href="https://github.com/jupyterhub/repo2docker/pull/1219"&gt;PR switching the default Python&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="now-launching-jupyter-server"&gt;Now launching Jupyter Server&lt;/h2&gt;
&lt;p&gt;The default UI for mybinder.org has been JupyterLab for some time, with the classic notebook still available if you specify a url of &lt;code&gt;/tree/&lt;/code&gt;or &lt;code&gt;/notebooks/mynb.ipynb&lt;/code&gt;. When we rolled out that change, we kept the default &lt;em&gt;server&lt;/em&gt; as the &lt;code&gt;jupyter-notebook&lt;/code&gt; server, for improved compatibility with existing server extensions. As the newer Jupyter Server has taken over, the situation is becoming reversed — using the older &lt;code&gt;notebook&lt;/code&gt; server is now the &lt;em&gt;cause&lt;/em&gt; of compatibility issues with server extensions, so we are switching the server to launch &lt;code&gt;jupyter-server&lt;/code&gt; instead of &lt;code&gt;jupyter-notebook&lt;/code&gt;. The classic UI is still available at the same URLs, thanks to &lt;a href="https://nbclassic.readthedocs.io"&gt;nbclassic&lt;/a&gt;. This &lt;em&gt;should&lt;/em&gt; have no visible effects, as &lt;code&gt;jupyter-server&lt;/code&gt; and &lt;code&gt;nbclassic&lt;/code&gt; make a great deal of effort to keep classic notebook extensions working, but some extensions may need an update for jupyter-server compatibility if they haven’t been updated already. Because of where the server is specified, there is no supported way for images to express a preference for the deprecated &lt;code&gt;notebook&lt;/code&gt; server (&lt;a href="https://github.com/jupyterhub/binderhub/pull/1635"&gt;PR switching the default server command&lt;/a&gt;.&lt;/p&gt;
</content><category term="Binder"/><category term="Docker"/><category term="JupyterHub"/><category term="reproducibility"/></entry><entry><title>A 2019 retrospective from the Binder Project</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/" rel="alternate"/><published>2020-01-15T17:48:00+00:00</published><updated>2020-01-15T18:10:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2020-01-15:/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/</id><summary type="html">&lt;p&gt;2019 was a busy year for the Binder and JupyterHub projects — each saw growth in both their community and technology. Now that the year…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;2019 was a busy year for the Binder and JupyterHub projects — each saw growth in both their community and technology. Now that the year has wrapped up, it is a good time to reflect on some of the highlights from the year.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/001-1_ZeTyAGGLPlXs0UlQfKsr6g.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Overall, 2019 was about improving the robustness, stability, and team dynamics around the JupyterHub and Binder projects, as well as connecting these projects with other tools and services in the open source community. Here are a few things that we are most-excited about.&lt;/p&gt;
&lt;h2 id="more-people-are-using-mybinderorg"&gt;More people are using mybinder.org&lt;/h2&gt;
&lt;p&gt;The Binder Federation is a collection of BinderHubs accessible from mybinder.org. This deployment is run as a public service and a demonstration of BinderHub, the underlying technology of the Binder project. This deployment is run on a volunteer basis by Binder community members, and is supported through grants and donations in infrastructure from project stakeholders. In 2019, the user base of mybinder.org grew from around 70,000 users per week to around 100,000 users (a growth of nearly 40%). mybinder.org is being used for teaching classes, sharing reproducible analyses, creating interactive documentation and narratives, and much more. We’re astonished at the rapid growth of Binder-ready repositories, and we’re excited to see what the community creates next.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Weekly user sessions at mybinder.org. Here you can see a typical pattern of activity over the course of a year. There are dips in activity over the summer and winter months, reflecting reduced activity from academic institutions." src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/002-0_0_V6rIgF_oAW5VS-.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Weekly user sessions at mybinder.org. Here you can see a typical pattern of activity over the course of a year. There are dips in activity over the summer and winter months, reflecting reduced activity from academic institutions.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="jupyterhub-reaches-10"&gt;JupyterHub reaches 1.0&lt;/h2&gt;
&lt;p&gt;JupyterHub, the underlying technology that provides interactive computing sessions to multiple users, &lt;a href="/posts/2019/announcing-jupyterhub-1-0/"&gt;is now at 1.0 status&lt;/a&gt;. The JupyterHub Python application was written several years ago, and reaching 1.0 reflects the work of dozens of open source contributors over time. JupyterHub is now a robust and stable application, having been used at smaller scales (think 5–10 people running on a single VM) as well as much larger scales (think 5,000 students running Jupyter sessions for a class).&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The JupyterHub logo" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/003-1_m2PN2PR-a6X_J3M602tgog.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The JupyterHub logo&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="binderhub-is-out-of-beta"&gt;BinderHub is out of beta&lt;/h2&gt;
&lt;p&gt;BinderHub, the kubernetes-based technology that powers mybinder.org, also came out of Beta this year. This reflects the fact that BinderHub is a battle-hardened application that can provide a stable service over time. mybinder.org runs nearly 100,000 sessions a week, and requires minimal maintenance time from the Binder’s projects team of volunteer operators.&lt;/p&gt;
&lt;h2 id="the-binderhub-federation-is-launched"&gt;The BinderHub federation is launched&lt;/h2&gt;
&lt;p&gt;The Binder Project envisions a world in which technology can be used in vendor-agnostic and decentralized ways. BinderHub runs on Kubernetes, which can be deployed on a variety of cloud and local infrastructure. While the Binder team runs one BinderHub deployment at mybinder.org, our goal has always been to see &lt;em&gt;other&lt;/em&gt; organizations running their own BinderHubs. This year, we went one step beyond this by &lt;a href="/posts/2019/the-international-binder-federation/"&gt;launching the &lt;strong&gt;BinderHub Federation&lt;/strong&gt;&lt;/a&gt;. This is a collection of research and technology organizations that combine their expertise and computational resources to power mybinder.org. When users visit mybinder.org, they are now directed to one of several BinderHub instances. This makes mybinder.org more robust, and grows the number of organizations that utilize the project’s technology for their communities. A BIG THANKS goes out to Google, OVH, GESIS, and the Turing Institute for supporting the Binder Federation.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The (rough) location of each BinderHub deployment in the mybinder.org federation" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/004-1_KU35naJhl1LSDxKY8gog4g.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The (rough) location of each BinderHub deployment in the mybinder.org federation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="binder-connects-with-open-science-services"&gt;Binder connects with open science services&lt;/h2&gt;
&lt;p&gt;Another goal of Binder is to be a &lt;em&gt;part&lt;/em&gt; of the solution to more transparent, sharable, reproducible computational work. This means &lt;a href="/posts/2019/binder-with-zenodo/"&gt;plugging in to other ecosystems and projects&lt;/a&gt; in order to leverage the broader open science community. This year we saw a number of new connections with other services. BinderHub now supports links that point directly to Zenodo and Dataverse repositores, and we are working on a few other integrations in the coming months. This means that projects utilizing these resources will be able to share reproducible and interactive links to their work out-of-the-box.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Binder now works with Zenodo repositories!" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/005-1_WVSV4_bwWlGWnT0k8xrlWg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Binder now works with Zenodo repositories!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="the-binder-community-grows"&gt;The Binder community grows&lt;/h2&gt;
&lt;p&gt;The Binder project’s most important asset is its people — this is a collection of volunteers spread across the world and from a variety of organizations. Binder community members do a variety of things — from working on technology, to teaching others how to make their work more reproducible, to participating in community discussions, to maintaining and debugging Binder tech. There is also a “core team” of Binder members that dedicates a significant part of their time to supporting the project. In 2019, we saw several new members join the core team, as well as a general growth in the Binder community. Welcome to all of our new team members! You can find a &lt;a href="https://jupyterhub-team-compass.readthedocs.io/en/latest/team.html"&gt;list of our current team members here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="we-welcome-our-first-contributor-in-residence"&gt;We welcome our first Contributor in Residence&lt;/h2&gt;
&lt;p&gt;One challenge with running large, open projects is that resources tend to be scarce. The Binder Project has no formal project funding, and must find ways to both grow its technology as well as run mybinder.org on resources that are donated from its community. One thing that often suffers as a result is the maintenance and general improvement of our open source technology. This work is often under-appreciated, difficult, and unlikely to happen with purely volunteer labor.&lt;/p&gt;
&lt;p&gt;For this reason, the Binder project decided to &lt;a href="/posts/2019/the-jupyterhub-and-binder-contributor-in-residence/"&gt;apply for the CZI Essential Open Source grant series&lt;/a&gt;. We proposed the creation of the “Binder Contributor in Residence” position — an annual contractor position that pays a member of the Binder community to do many of the daily things that are crucial for the project’s growth. We are excited to have &lt;a href="https://github.com/GeorgianaElena"&gt;Georgiana Dolocan&lt;/a&gt; as our first contributor in residence, and look forward to where this project will go in 2020.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Many thanks to CZI for their support of the Binder and JupyterHub projects in 2020!" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/a-2019-retrospective-from-the-binder-project/images/006-0_pzbKC79Svh5Xrtev.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Many thanks to CZI for their support of the Binder and JupyterHub projects in 2020!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="there-are-more-binderhub-deployments"&gt;There are more BinderHub deployments&lt;/h2&gt;
&lt;p&gt;The Binder Project aims to create technology that is deployable anywhere so that other organizations can support their communities with Binder infrastructure. In 2019 we ran a number of training sessions for how other groups can run their own BinderHub. In particular, the Turing Institute ran several workshops that had attendees up-and-running with their own functioning BinderHubs.&lt;/p&gt;
&lt;h2 id="thanks-to-our-community"&gt;Thanks to our community&lt;/h2&gt;
&lt;p&gt;As you can see, 2019 was a busy and exciting year for the Binder community. As a final note, we want to say thanks to all of you who have supported Binder in one form or another over the years. Binder is a project run by the community, for the community. It wouldn’t be possible without all of your hard work and friendly faces, thanks! We look forward to what’s coming next in 2020!&lt;/p&gt;
</content><category term="Binder"/><category term="Kubernetes"/><category term="reproducibility"/></entry><entry><title>Binder + Zenodo: A how-to guide</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/" rel="alternate"/><published>2019-06-21T13:46:00+00:00</published><updated>2019-06-22T15:42:00+00:00</updated><author><name>Chris Holdgraf</name></author><id>tag:jasongrout.github.io,2019-06-21:/medium-archive/pelican/posts/2019/binder-with-zenodo/</id><summary type="html">&lt;p&gt;Interactive and reproducible repositories powered by Zenodo and Binder.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Interactive and reproducible repositories powered by &lt;a href="https://zenodo.org/"&gt;Zenodo&lt;/a&gt; and &lt;a href="https://mybinder.org/"&gt;Binder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When the Binder project was first launched, we imagined a world in which scientific scholarship and reproducibility could be carried out by the community using a fully-open stack of technology. We’re happy to say that this is now possible!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Zenodo DOIs now work with BinderHub" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/001-1_r8_qd2QciZ9B4hD2QnYXwQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Zenodo DOIs now work with BinderHub&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;a href="https://binderhub.readthedocs.io/"&gt;BinderHub&lt;/a&gt; team recently added in support for building Binder links that point to &lt;a href="https://zenodo.org/"&gt;Zenodo repositories&lt;/a&gt;. Zenodo is a general purpose open-access repository hosted by CERN that allows researchers to archive and apply a DOI to information that they put up on the web.&lt;/p&gt;
&lt;p&gt;Zenodo has the ability to archive &lt;strong&gt;GitHub repositories&lt;/strong&gt;, which means that you can archive the code, data, or reports that underly a scientific analysis and assign it a unique, citeable identifier. Now that BinderHub knows how to resolve a Zenodo identifier, you’ll be able to share Binder links that point to Zenodo and provide interactive access to your repository, letting readers reproduce results and interact with your analyses!&lt;/p&gt;
&lt;p&gt;Here’s a quick primer for how to do this:&lt;/p&gt;
&lt;h2 id="step-1-create-a-zenodo-account"&gt;Step 1: Create a Zenodo account&lt;/h2&gt;
&lt;p&gt;First off you’ll need to create an account on Zenodo. You can&lt;br&gt;
do so using a number of different log-in options.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/002-0_SbAeCLCNSpmbRQB6.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="step-2-create-your-binder-ready-repository-on-github"&gt;Step 2: Create your Binder-ready repository on GitHub&lt;/h2&gt;
&lt;p&gt;Next, you should create your Binder-ready repository on GitHub. Binder uses pre-existing best practices in data science in order to infer and build the environment needed for your repository.&lt;/p&gt;
&lt;p&gt;To make a repository Binder-ready, &lt;a href="https://mybinder.readthedocs.io/en/latest/introduction.html"&gt;follow the instructions in the Binder docs&lt;/a&gt;.&lt;br&gt;
Briefly, what you need to do is add the configuration files that define the environment needed to run your code. Once those files are in place, and you’ve added an analysis script (a Jupyter or R Notebook) that actually runs your code and displays the results, your repository is ready to build with Binder.&lt;/p&gt;
&lt;h2 id="step-3-make-sure-your-repository-is-ready-to-be-published"&gt;Step 3: Make sure your repository is ready to be published!&lt;/h2&gt;
&lt;p&gt;Once you create a DOI for your repository, it will be frozen in time — you won’t be able to easily update it. So double check that the repository builds properly with Binder and runs the way that you’d expect it to.&lt;/p&gt;
&lt;p&gt;Make sure to launch a Binder from your repository and run the analyses you’d like others to run. If they produce the expected result from within a Binder session, then they’ll continue to do so for others (assuming you have pinned your versions and followed other best practices in reproducibility).&lt;/p&gt;
&lt;h2 id="step-4-create-a-zenodo-doi-for-your-repository"&gt;Step 4: Create a Zenodo DOI for your repository&lt;/h2&gt;
&lt;p&gt;Now that your repository is ready, you’ll connect Zenodo with GitHub to create a DOI for your repository. Remember that this will be unique to the current state of the repo — future changes to this repository won’t be reflected in the DOI.&lt;/p&gt;
&lt;p&gt;We recommend following the &lt;a href="https://guides.github.com/activities/citable-code/"&gt;GitHub &lt;strong&gt;Citable Code Guide&lt;/strong&gt;&lt;/a&gt; which provides some best-practices for creating your Zenodo DOI for a GitHub repository. Click the image below to be taken to this (excellent) guide.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The GitHub Citable Code guide." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/003-0_LIxxv68WDxy6VkfY.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The GitHub Citable Code guide.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Once you’re done, you should have a Zenodo DOI badge&lt;br&gt;
like the one below:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A Zenodo DOI badge" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/004-1_CfBmxs8apLrlbGN5vG9MTA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A Zenodo DOI badge&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="step-5-create-a-binder-link-for-your-zenodo-doi"&gt;Step 5: Create a Binder link for your Zenodo DOI&lt;/h2&gt;
&lt;p&gt;Finally, use your Zenodo DOI to create a Binder link that allows others to interact with and replicate your results. You can create a Binder link for your Zenodo record by heading to &lt;a href="https://mybinder.org/"&gt;https://mybinder.org&lt;/a&gt; and filling in the form:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Building a Binder link for your Zenodo archive with the Binder UI." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/005-1_xOABVY2hNtVmjV5-LXreFw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Building a Binder link for your Zenodo archive with the Binder UI.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This will give you a link you can share with others as well as the Markdown and reStructured text snippets for creating a badge.&lt;/p&gt;
&lt;p&gt;The link’s structure should look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mybinder.org/v2/zenodo/&amp;lt;zenodo-DOI&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For example, if your Zenodo DOI is &lt;code&gt;10.5281/zenodo.3242074&lt;/code&gt; (corresponding to &lt;a href="https://doi.org/10.5281/zenodo.3242074"&gt;this zenodo repository&lt;/a&gt;), the Binder link for it would be:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mybinder.org/v2/zenodo/10.5281/zenodo.3242074/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can even pair this Binder link with your Zenodo DOI badge that&lt;br&gt;
we showed above!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The “launch binder” button contains a Binder link for your Zenodo archive. Clicking will launch a Binder session." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/binder-with-zenodo/images/006-1_hFRv6rDl9BekAFkxDpowOg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The “launch binder” button contains a Binder link for your Zenodo archive. Clicking will launch a Binder session.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And that’s it! You now have an archived version of your analysis with a unique identifier. This identifier can be used in conjunction with BinderHub to allow readers to &lt;em&gt;interact&lt;/em&gt; with your code and results!&lt;/p&gt;
&lt;h2 id="last-minute-update"&gt;Last minute update 🎉&lt;/h2&gt;
&lt;p&gt;A few hours before publishing this post we merged a contribution from &lt;a href="https://twitter.com/temorrell"&gt;Tom Morrell&lt;/a&gt; who works at CalTech’s library that allows you to launch records from &lt;a href="https://data.caltech.edu/"&gt;CalTech’s Data Repository&lt;/a&gt; as well! For example a notebook to analyze traffic to the archive itself: &lt;a href="https://mybinder.org/v2/zenodo/10.22002/d1.1250"&gt;https://mybinder.org/v2/zenodo/10.22002/d1.1250&lt;/a&gt;. You should also check out &lt;a href="https://medium.com/@lorenaabarba/excellent-6b99d506aa28"&gt;a quick response to this post from Lorena Barba&lt;/a&gt;, who describes her group’s approach to creating reproducible, citable bundles for figures in papers, and how Binder+Zenodo DOIs might fit into that workflow!&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;We are close to closing the loop of fully reproducible computational environments for scientific publication. We’re excited to see journals begin to integrate these workflows with their own publishing pipelines. For example, the &lt;a href="https://conp-pcno.github.io/"&gt;Neurolibre project&lt;/a&gt; is deploying their own BinderHub and using it alongside their reviewing and archiving process in order to provide more rich&lt;br&gt;
interaction with submitted material.&lt;/p&gt;
&lt;p&gt;Each type of repository needs a small amount of custom work to be integrated with Binder. We started with Zenodo because it is well known,&lt;br&gt;
general purpose and integrated with GitHub already. If there is an archive you’d like to see integrated please do stop by &lt;a href="https://github.com/jupyter/repo2docker"&gt;this repository&lt;/a&gt; and open a new issue or contribute the code to do so directly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you’re working with a publisher and are interested in this&lt;/strong&gt;&lt;br&gt;
please reach out! The Binder community would love to work with you in deploying these open tools to make your published work more open and accessible. Whether it is big or small, we hope that these workflows can make an impact across the publishing landscape, and we’re looking forward to seeing what people do next!&lt;/p&gt;
</content><category term="Binder"/><category term="GitHub"/><category term="open science"/><category term="reproducibility"/></entry><entry><title>elife sprint: Integrating Stencila and Binder</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2018/elife-sprint-integrating-stencila-and-binder/" rel="alternate"/><published>2018-12-10T10:15:00+00:00</published><updated>2018-12-10T10:15:00+00:00</updated><author><name>Daniel Nüst</name></author><id>tag:jasongrout.github.io,2018-12-10:/medium-archive/pelican/posts/2018/elife-sprint-integrating-stencila-and-binder/</id><summary type="html">&lt;p&gt;Short report on the project nbstencilaproxy for integrating Stencila and Binder.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;This article reports on a project, integrating Stencila and Binder, which started at the eLife Innovation Sprint 2018 (&lt;/em&gt;&lt;a href="https://twitter.com/hashtag/eLifeSprint?src=hash"&gt;&lt;code&gt;#eLifeSprint&lt;/code&gt;&lt;/a&gt;&lt;em&gt;). A longer version has been cross-posted on multiple blogs (&lt;/em&gt;&lt;a href="https://elifesciences.org/labs/d42fe2b9/integrating-binder-and-stencila-the-building-blocks-to-increased-open-communication-and-transparency"&gt;&lt;em&gt;eLife Labs&lt;/em&gt;&lt;/a&gt;, &lt;a href="https://stenci.la/blog/2018-11-20-stencila-binder/"&gt;&lt;em&gt;Stencila,&lt;/em&gt;&lt;/a&gt; &lt;a href="https://o2r.info/2018/11/21/elife-sprint-integrating-stencila-and-binder/"&gt;&lt;em&gt;o2r&lt;/em&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://elifesciences.org/"&gt;eLife&lt;/a&gt;, an open science journal published by the non-profit organisation eLife Sciences Publications from the UK, hosted the first &lt;a href="https://elifesciences.org/labs/bdd4c9aa/elife-innovation-sprint-2018-project-roundup"&gt;eLife Innovation Sprint 2018&lt;/a&gt; as part of their &lt;a href="https://elifesciences.org/about/innovation"&gt;Innovation Initiative&lt;/a&gt; in Cambridge, UK: &lt;em&gt;“[…] a two-day gathering of 62 researchers, designers, developers, technologists, science communicators and more, with the goal of developing prototypes of innovations that bring cutting-edge technology to open research communication.”&lt;/em&gt; One of the &lt;a href="https://elifesciences.org/labs/bdd4c9aa/elife-innovation-sprint-2018-project-roundup"&gt;13&lt;/a&gt; projects at the &lt;a href="https://elifesciences.org/inside-elife/b4ed92e1/innovation-collaboration-and-creativity-at-the-heart-of-the-elife-innovation-sprint-2018"&gt;excellently organised event&lt;/a&gt; was an &lt;strong&gt;integration of&lt;/strong&gt; &lt;a href="https://mybinder.readthedocs.io/"&gt;&lt;strong&gt;Binder&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;a href="https://stenci.la/"&gt;&lt;strong&gt;Stencila&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This article reports on the project’s results and changes made to Binder-related tools. &lt;strong&gt;Today, Binder has first class Stencila support.&lt;/strong&gt; Read the full story at the &lt;a href="https://elifesciences.org/labs/d42fe2b9/integrating-binder-and-stencila-the-building-blocks-to-increased-open-communication-and-transparency"&gt;eLife Labs blog post&lt;/a&gt; or try out to open Stencila documents from any online code repository on &lt;a href="https://mybinder.org/"&gt;mybinder.org&lt;/a&gt; with the click of a single button:&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://mybinder.org/v2/gh/binder-examples/stencila-py/master?urlpath=stencila"&gt;&lt;img alt="Click the Binder badge to open a Stencila document on mybinder.org" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/elife-sprint-integrating-stencila-and-binder/images/001-1_H28MLVCxQzhuXzKzbMyiZA.webp" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Click the Binder badge to open a Stencila document on mybinder.org&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This project is a collaboration between &lt;a href="https://github.com/minrk"&gt;Min&lt;/a&gt; from the &lt;a href="https://www.simula.no/people/benjaminrk"&gt;Simula Research Laboratory&lt;/a&gt;, Norway, a core developer of &lt;a href="https://mybinder.readthedocs.io/en/latest/"&gt;Binder&lt;/a&gt; and related tools, &lt;a href="https://github.com/nuest"&gt;Daniel&lt;/a&gt; from the &lt;a href="https://o2r.info"&gt;o2r&lt;/a&gt; project at the &lt;a href="https://www.uni-muenster.de/Geoinformatics/"&gt;Institute for Geoinformatics&lt;/a&gt;, Germany, &lt;a href="https://github.com/nokome"&gt;and Nokome&lt;/a&gt;, initiator and developer of Stencila. The final changes were made with the help of &lt;a href="https://github.com/betatim"&gt;Tim&lt;/a&gt;. Thanks! The project was also part of the &lt;a href="https://mozilla.github.io/global-sprint/"&gt;Mozilla Global Sprint 2018&lt;/a&gt;, see &lt;a href="https://github.com/mozilla/global-sprint/issues/317"&gt;mozilla/global-sprint#317&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-building-blocks-and-a-challenge"&gt;The building blocks and a challenge&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Stencila Desktop&lt;/strong&gt; is an &lt;a href="https://elifesciences.org/labs/c496b8bb/stencila-an-office-suite-for-reproducible-research"&gt;office suite for reproducible research documents&lt;/a&gt;. It allows scientists to use languages like R and Python within familiar and intuitive word processor and spreadsheet user interfaces to lower the barriers to reproducible research for those with little or no software development skills. &lt;strong&gt;Binder&lt;/strong&gt; (a part of &lt;a href="https://jupyter.org/"&gt;Project Jupyter&lt;/a&gt;) makes it simple to generate reproducible computing environments from code repositories (e.g. GitHub or GitLab, see &lt;a href="https://github.com/binder-examples/"&gt;binder examples&lt;/a&gt;) and &lt;a href="https://mybinder.org/"&gt;mybinder.org&lt;/a&gt; is the most prominent example. Binder uses &lt;a href="https://repo2docker.readthedocs.io/"&gt;repo2docker&lt;/a&gt;, for generating &lt;code&gt;Dockerfile&lt;/code&gt;s (a human- and machine-readable recipe for setting up a computational environmentt used by the popular &lt;a href="https://en.wikipedia.org/wiki/Docker_(software)"&gt;Docker&lt;/a&gt; container software) and building Docker images from software projects. While containers have become a commodity for developers, researchers still struggle to grasp and control the complexity of computational environments. This is where the two building blocks join: &lt;strong&gt;Running Stencila as part of a Binder helps researchers to communicate their work openly, to collaborate effectively with other scientists, and to ensure a high quality and transparency of their workflow and findings.&lt;/strong&gt; Min and Daniel &lt;a href="https://docs.google.com/document/d/1WPMY-Al7WMdjlepKvvLiIxFrQPHFbADMNuwszs8xMHk/edit"&gt;formulated their goal in the sprint project form&lt;/a&gt;: &lt;em&gt;“[…] to connect them so that users can edit reproducible documents (DAR files) as part of a Binder project”.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="connecting-stencila-and-jupyter-nbstencilaproxy"&gt;Connecting Stencila and Jupyter: &lt;code&gt;nbstencilaproxy&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Stencila has “execution contexts”, an equivalent to Jupyter’s “kernels”. The contexts use code dependency analysis and return execution results as data values to enable a reactive, functional execution model. To open Stencila documents on binder, these execution contexts must be installed and configured in the environment created by &lt;code&gt;repo2docker&lt;/code&gt;. This is achieved with a new software project initiated at the sprint: &lt;code&gt;nbstencilaproxy&lt;/code&gt; - a Jupyter notebook server extension and proxy for Stencila.&lt;/p&gt;
&lt;p&gt;The projects consists of a &lt;strong&gt;Python module&lt;/strong&gt; with the Jupyter notebook server and “non-server” extensions of the same name, and a &lt;a href="https://github.com/minrk/nbstencilaproxy/commit/93dabbd890397aaad0d8efb316f7e1f2129e52f3"&gt;bundled&lt;/a&gt; &lt;strong&gt;JavaScript module&lt;/strong&gt; (of the same name). The Python module allows proper versioned installation, dependency management, and installation from an established software repository. It takes care of the plumbing between the user interface and the services in the background, so that the binder is viewable over one port in the browser, while the many different background components run on their own ports. The “no server” extension adds a “Stencila session” menu entry and conveniently lives in the same directory structure as the server extension. The JavaScript module manages the required JavaScript dependencies and provides an well-defined structure for the code files. It serves the Dar document and provides access to the Stencila host.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;repo2docker&lt;/code&gt; was extended with &lt;a href="https://github.com/jupyter/repo2docker/pull/309/commits/eaa29ef3343442419df8cdd022f3e91ae9262926"&gt;automatic detection of Dar documents&lt;/a&gt;, including the &lt;a href="https://github.com/jupyter/repo2docker/pull/457"&gt;languages and execution context&lt;/a&gt;s. As with most Binder repositories, a no configuration is needed for most common user cases: users can open a Dar document on Binder and trust the required environment to provide all required software. Daniel created a few &lt;strong&gt;example repositories&lt;/strong&gt; to provide a starting point for users. The binder team generously welcomed &lt;a href="https://o2r.info/2018/11/21/elife-sprint-integrating-stencila-and-binder/"&gt;the changes to mybinder.org&lt;/a&gt; and and the examples to the &lt;a href="https://github.com/binder-examples/"&gt;binder examples organisation&lt;/a&gt; on GitHub:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/binder-examples/stencila-py"&gt;&lt;strong&gt;https://github.com/binder-examples/stencila-py&lt;/strong&gt;&lt;/a&gt; contains Python code cells, using both the Jupyter and plain Python execution contexts:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/elife-sprint-integrating-stencila-and-binder/images/002-0_BHjQbPTLV3XHoNqG.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://mybinder.org/v2/gh/binder-examples/stencila-py/master?urlpath=stencila"&gt;&lt;img alt="Click the Binder badge to open a Stencila document with Python code on mybinder.org" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/elife-sprint-integrating-stencila-and-binder/images/001-1_H28MLVCxQzhuXzKzbMyiZA.webp" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Click the Binder badge to open a Stencila document with Python code on mybinder.org&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://github.com/binder-examples/stencila-r"&gt;&lt;strong&gt;https://github.com/binder-examples/stencila-r&lt;/strong&gt;&lt;/a&gt; contains R code cells and two plots:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/elife-sprint-integrating-stencila-and-binder/images/003-0_osOwhBZGwlnr5FNk.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://mybinder.org/v2/gh/binder-examples/stencila-r/master?urlpath=stencila"&gt;&lt;img alt="Click the Binder badge to open a Stencila document with R code on mybinder.org" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/elife-sprint-integrating-stencila-and-binder/images/001-1_H28MLVCxQzhuXzKzbMyiZA.webp" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Click the Binder badge to open a Stencila document with R code on mybinder.org&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;One of the cool features of Stencila are the reactive cells, as demonstrated in a tweet following the feature release:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks to @nordholmen working on &lt;a href="https://x.com/stencila"&gt;@stencila&lt;/a&gt; support for &lt;a href="https://t.co/Zlj6FrYgBw"&gt;https://t.co/Zlj6FrYgBw&lt;/a&gt; you now have reactive cells with Python code on &lt;a href="https://x.com/mybinderteam"&gt;@mybinderteam&lt;/a&gt;! Give it a go &lt;a href="https://t.co/ToIuQPq0Fy"&gt;https://t.co/ToIuQPq0Fy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/betatim/status/1062004432806785024"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/elife-sprint-integrating-stencila-and-binder/images/004-Drz_AZeXQAAdMmn.jpg" alt="Video" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— &lt;a href="https://x.com/betatim"&gt;Tim Head, @betatim on the internet (@betatim)&lt;/a&gt;, &lt;a href="https://x.com/betatim/status/1062004432806785024"&gt;November 12, 2018&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Binder + Stencila is a demonstration of the power that the Open Source and Open Science community can foster. Many people are working together on the organisational and technological challenges of science today towards full research transparency and reproducibility, even if we use computers to an unprecedented level. Many small contributions on “side projects” such as these can make a difference, and connecting these two great projects hopefully helps to solve some problem in science down the road.&lt;/p&gt;
&lt;p&gt;Join the public &lt;a href="https://gitter.im/stencila/stencila"&gt;Stencila&lt;/a&gt; and &lt;a href="https://gitter.im/jupyterhub/binder"&gt;binder&lt;/a&gt; chats to stay in touch or get help. We look forward to see scientists using &lt;code&gt;nbstencilaproxy&lt;/code&gt; for communicating their work and new challenges that come with it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/hashtag/eLifeSprint?src=hash"&gt;#eLifeSprint&lt;/a&gt;-ers &lt;a href="https://x.com/minrk"&gt;@minrk&lt;/a&gt; and @nordholmen are working to connect &lt;a href="https://x.com/hashtag/JupyterNotebooks?src=hash"&gt;#JupyterNotebooks&lt;/a&gt; / &lt;a href="https://x.com/hashtag/Binder?src=hash"&gt;#Binder&lt;/a&gt; with DAR / &lt;a href="https://x.com/hashtag/Texture?src=hash"&gt;#Texture&lt;/a&gt; / &lt;a href="https://x.com/stencila"&gt;@Stencila&lt;/a&gt;, so that users can edit reproducible documents as part of a Binder project &lt;a href="https://t.co/2GoGNydsmX"&gt;https://t.co/2GoGNydsmX&lt;/a&gt; (&lt;a href="https://x.com/mybinderteam"&gt;@mybinderteam&lt;/a&gt; &lt;a href="https://x.com/ProjectJupyter"&gt;@ProjectJupyter&lt;/a&gt; &lt;a href="https://x.com/_SUBSTANCE"&gt;@_substance&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/elife-sprint-integrating-stencila-and-binder/images/005-Dc14Uo1W0AEwdk9.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;— &lt;a href="https://x.com/eLifeInnovation"&gt;eLife Innovation (@eLifeInnovation)&lt;/a&gt;, &lt;a href="https://x.com/eLifeInnovation/status/994583390895697920"&gt;May 10, 2018&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content><category term="Binder"/><category term="open science"/><category term="reproducibility"/></entry><entry><title>JupyterCon 2018, NYC August 21–25</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2018/jupytercon-2018-nyc-august-21-25/" rel="alternate"/><published>2018-03-15T18:30:00+00:00</published><updated>2018-03-20T14:28:00+00:00</updated><author><name>Paco Xander Nathan</name></author><id>tag:jasongrout.github.io,2018-03-15:/medium-archive/pelican/posts/2018/jupytercon-2018-nyc-august-21-25/</id><summary type="html">&lt;p&gt;Discover how data-driven organizations are using Jupyter to analyze data, share insights, and foster practices for dynamic, reproducible…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;Discover how data-driven organizations are using Jupyter to analyze data, share insights, and foster practices for dynamic, reproducible data science.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I’m grateful to join Fernando Pérez and Brian Granger as a program co-chair for &lt;a href="https://conferences.oreilly.com/jupyter/jup-ny"&gt;&lt;strong&gt;JupyterCon 2018&lt;/strong&gt;&lt;/a&gt;. Project Jupyter, NumFOCUS, and O’Reilly Media will present the second annual JupyterCon in New York City on August 21–25.&lt;/p&gt;
&lt;p&gt;Timing for this event couldn’t be better. The human side of data science, machine learning/AI, and scientific computing is more important than ever. This is seen in the broad adoption of data-driven decision making in human organizations of all kinds, the increasing importance of human centered design in tools for working with data, the urgency for better data insights in the face of complex socioeconomic conditions worldwide, as well as dialogue about the social issues these technologies bring to the fore: collaboration, security, ethics, data privacy, transparency, propaganda, etc.&lt;/p&gt;
&lt;p&gt;To paraphrase our co-chairs, Brian Granger:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Jupyter is where humans and data science intersect”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and Fernando Perez:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The better the technology, the more important that human judgement becomes”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Consequently, we’ll explore three main themes at JupyterCon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Interactive computing with data at scale&lt;/strong&gt;: the technical best practices and organizational challenges of supporting interactive computing in companies, universities, research collaborations, etc (JupyterHub)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensible user interfaces&lt;/strong&gt; for data science, machine learning/AI, and scientific computing (JupyterLab)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Computational communication&lt;/strong&gt;: taking the artifacts of interactive computing and communicating them to different audiences&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A meta-theme which ties these together is &lt;strong&gt;extensible software architecture for interactive computing with data&lt;/strong&gt;. Jupyter is built on a set of flexible, extensible, and re-usable building blocks which can be combined and assembled to address a wide range of usage cases. These building blocks are expressed through the various open protocols, APIs, and standards of Jupyter.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The Jupyter community has much to discuss and share this year. For example, success stories such as the &lt;a href="https://youtu.be/xuNj5paMuow?t=12m17s"&gt;data science program at UC Berkeley&lt;/a&gt; illustrate the power of &lt;a href="https://jupyterhub.readthedocs.io/en/latest/"&gt;JupyterHub&lt;/a&gt; deployments at scale, in both education, research and industry. As universities and enterprise firms learn to handle the technical challenges of rolling out &lt;strong&gt;hands-on, interactive computing at scale&lt;/strong&gt;, a cohort of organizational challenges come to the fore: practices regarding collaboration, security, compliance, data privacy, ethics, etc. These points are especially poignant in verticals such as healthcare, finance and education, where the handling of sensitive data is rightly constrained by ethical and legal requirements (HIPAA, FERPA, etc.). Overall, this dialogue is extremely relevant — it is happening at the intersection of contemporary political and social issues, industry concerns, new laws (GDPR), the evolution of computation, plus good storytelling and communication in general — as we’ll explore with practitioners throughout the conference.&lt;/p&gt;
&lt;p&gt;Recent &lt;a href="/posts/2018/jupyterlab-is-ready-for-users/"&gt;beta release of JupyterLab&lt;/a&gt; embodies the meta-theme of &lt;strong&gt;extensible software architecture for interactive computing with data&lt;/strong&gt;. While many people think of Jupyter as a “notebook,” that’s merely one building block needed for interactive computing with data. Other building blocks include terminals, file browsers, LaTeX, markdown, rich outputs, text editors, and renderers/viewers for different data formats. JupyterLab is the next-generation user interface for Project Jupyter, and provides these different building blocks in a flexible, configurable, customizable environment. This opens the door for Jupyter users to build custom workflows, and also for organizations to extend JupyterLab with their own custom functionality.&lt;/p&gt;
&lt;p&gt;Thousands of organizations require data infrastructure for reporting, sharing data insights, reproducing results of analytics, etc. Recent &lt;a href="https://www.oreilly.com/ideas/the-state-of-ai-adoption"&gt;business studies&lt;/a&gt; estimate that more than half of all companies globally are precluded from adopting AI technologies due to a lack of digital infrastructure — often because their efforts toward data and reporting infrastructure are buried in technical debt. So much of that infrastructure was built from scratch, even when organizations needed essentially the same building blocks. JupyterLab’s primary goal is to make it &lt;em&gt;routine&lt;/em&gt; to build highly customized, interactive computing platforms, while supporting more than 90 different popular programming environments.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Screenshot from the JupyterLab beta release. Image used with permission from Project Jupyter contributors." src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/jupytercon-2018-nyc-august-21-25/images/001-0_bxsg6Ki5hqSN64yo.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;em&gt;Screenshot from the&lt;/em&gt; &lt;a href="/posts/2018/jupyterlab-is-ready-for-users/"&gt;&lt;em&gt;JupyterLab&lt;/em&gt;&lt;/a&gt; &lt;em&gt;beta release. Image used with permission from Project Jupyter contributors.&lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A third major theme builds on top of the other two: &lt;strong&gt;computational communication&lt;/strong&gt;. For data and code to be useful for humans, who need to make decisions, it has to be embedded into a narrative — a story — that that can be communicated to others. Examples of this pattern include: data journalism, reproducible research and open science, computational narratives, open data in society and government, citizen science, and really any area of scientific research (physics, zoology, chemistry, astronomy, etc.), plus the range of economics, finance, and econometric forecasting.&lt;/p&gt;
&lt;p&gt;Another growing segment of use cases involves Jupyter as a “last-mile” layer for leveraging AI resources in the cloud. This becomes especially important in light of new hardware emerging for AI needs, vying with competing demand from online gaming, virtual reality, cryptocurrency mining, etc.&lt;/p&gt;
&lt;p&gt;Please take the following as personal opinion, observations, perspectives: We’ve reached a point where &lt;strong&gt;hardware appears to be evolving more rapidly than software, while software appears to be evolving more rapidly than effective process&lt;/strong&gt;. At O’Reilly Media we work to &lt;a href="https://youtu.be/s3ha6vHapcI"&gt;map the emerging themes&lt;/a&gt; in industry, in a process nicknamed “radar”. This perspective about hardware is a theme I’ve been mapping, and meanwhile comparing notes with industry experts. A few data points to consider: Jeff Dean’s talk at NIPS 2017, “&lt;a href="http://learningsys.org/nips17/assets/slides/dean-nips17.pdf"&gt;Machine Learning for Systems and Systems for Machine Learning&lt;/a&gt;” about comparisons of CPUs/GPUs/TPUs, and how AI is transforming the design of computer hardware; &lt;a href="https://www.arxiv-vanity.com/papers/1712.01208/"&gt;&lt;em&gt;The Case for Learned Index Structures&lt;/em&gt;&lt;/a&gt;, also from Google, about the impact of “branch vs. multiple” costs on decades of database theory; this podcast interview “&lt;a href="https://www.oreilly.com/ideas/scaling-machine-learning"&gt;Scaling machine learning&lt;/a&gt;” with Reza Zadeh about the critical importance of hardware/software interfaces in AI apps; the &lt;a href="https://www.youtube.com/watch?v=Q7y9l-L8yiU"&gt;video interview&lt;/a&gt; that Wes McKinney and I recorded at JupyterCon 2017 about how &lt;a href="https://arrow.apache.org/"&gt;Apache Arrow&lt;/a&gt; presents a much different take on how to leverage hardware and distributed resources.&lt;/p&gt;
&lt;p&gt;The notion that “&lt;strong&gt;hardware &amp;gt; software &amp;gt; process&lt;/strong&gt;” contradicts the past 15–20 years of software engineering practice. It’s an inversion of the general assumptions we make. In response, industry will need to rework approaches for building software within the context of AI — which was articulated succinctly by Lenny Pruss from Amplify Partners in “&lt;a href="https://venturebeat.com/2017/11/28/infrastructure-3-0-building-blocks-for-the-ai-revolution/"&gt;Infrastructure 3.0: Building blocks for the AI revolution&lt;/a&gt;”. In this light, Jupyter provides an abstraction layer — a kind of buffer to help “future proof” — for complex use cases in NLP, machine learning, and related work. We’re seeing this from most of the public cloud vendors, who are also leaders in AI, Google, Amazon, Microsoft, IBM, etc., and who will be represented at the conference in August.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Our program at JupyterCon will feature expert speakers across all of these themes. However, to me, that’s merely the tip of the iceberg. So much of the real value that I get from conferences happens in the proverbial “Hallway Track”, where you run into people who are riffing off news they’ve just learned in a session — perhaps in line with your thinking, perhaps in a completely different direction. Those conversations have space to flourish when people get immersed in the community, the issues, the possibilities.&lt;/p&gt;
&lt;p&gt;It’ll be a busy week. We’ll have two days of &lt;strong&gt;training&lt;/strong&gt; courses: intensive, hands-on coding, lots of interaction with expert instructors. Training will overlap with one day of &lt;strong&gt;tutorials&lt;/strong&gt;: led by experts, generally larger than training courses though more detailed than session talks, featuring lots of Q&amp;amp;A.&lt;/p&gt;
&lt;p&gt;Then we’ll have two days of &lt;strong&gt;keynotes and session talks&lt;/strong&gt;, expo hall, lunches and sponsored breaks, plus Project Jupyter sponsored events. Events include Jupyter User Testing, author signings, “Meet the Experts” office hours, demos in the &lt;strong&gt;vendor expo hall&lt;/strong&gt; — plus related meetups in the evenings. Last year the Poster Session was one of the biggest surprises to me: it was difficult to move through the room, walkways were packed with people asking presenters questions about their projects.&lt;/p&gt;
&lt;p&gt;This year we’ll introduce a &lt;strong&gt;Business Summit&lt;/strong&gt;, similar to the popular summits at &lt;a href="https://conferences.oreilly.com/strata"&gt;Strata Data Conference&lt;/a&gt; and &lt;a href="https://conferences.oreilly.com/artificial-intelligence/"&gt;The AI Conf&lt;/a&gt;. This will include high-level presentations on the most promising and important developments in Jupyter for executives and decision-makers. Brian Granger and I will be hosting the Business Summit, along with Joel Horwitz of IBM. One interesting data point: among the regional events, we’ve seen much more engagement this year from enterprise and government than we’d expected, more emphasis on business use cases and new product launches. The ecosystem is growing, and will be represented well at JupyterCon!&lt;/p&gt;
&lt;p&gt;We will also feature an &lt;strong&gt;Education Track&lt;/strong&gt; in the main conference, expanding on the well-attended Education Birds-of-a-Feather and related talks during JupyterCon 2017. Use of Jupyter in education has grown rapidly across many contexts: middle/high-school, universities, corporate training, and online courses. Lorena Barba and Robert Talbert will be organizing this track.&lt;/p&gt;
&lt;p&gt;Following our schedule of conference talks, the week wraps up with a &lt;strong&gt;community sprint day&lt;/strong&gt; on Saturday. You can work side-by-side with leaders and contributors in the Jupyter ecosystem to implement that feature you’ve always wanted, fix bugs, work on design, write documentation, test software, or dive deep into the internals of something in the Jupyter ecosystem. Be sure to bring your laptop.&lt;/p&gt;
&lt;p&gt;Note that we believe true innovation depends on hearing from, and listening to, people with a variety of perspectives. Please read our &lt;a href="http://www.oreilly.com/diversity/"&gt;Diversity Statement&lt;/a&gt; for more details. Also, we’re committed to creating a safe and productive environment for everyone at all of our events. Please read our &lt;a href="https://conferences.oreilly.com/jupyter/jup-ny/public/content/conduct"&gt;Code of Conduct&lt;/a&gt;. Last year we were able to work with the community plus matching donations to provide several Diversity &amp;amp; Inclusion scholarships, as well as more than dozen student scholarships. Looking forward to building on that this year!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That’s a sample of what’s coming up for JupyterCon in NYC this August. Meanwhile, we’ll be helping present and sponsor regional community events to help build momentum for the conference:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.eventbrite.com/e/jupyter-pop-up-tickets-42550005211?aff=medium"&gt;&lt;strong&gt;Jupyter Pop-up Boston&lt;/strong&gt;&lt;/a&gt;, March 21&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@jupyteratlanta/jupyter-day-in-the-a-b34d5a738a69"&gt;&lt;strong&gt;Jupyter Day Atlanta&lt;/strong&gt;&lt;/a&gt;, March 31&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jupyter Pop-up DC&lt;/strong&gt; (TBD)&lt;/li&gt;
&lt;li&gt;plus, talks at related meetups in some North American metro areas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We look forward to many opportunities to showcase new work and ideas, to meet each other, to learn about the architecture of the project itself, and to contribute to the future of Jupyter.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/jupytercon-2018-nyc-august-21-25/images/002-1_kNk_CB4cP4xv2epHxCKXFw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Sign-up for email updates on the &lt;a href="https://conferences.oreilly.com/jupyter/jup-ny"&gt;JupyterCon web site&lt;/a&gt;. See you there!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;[kudos to Brian Granger for help developing and editing this article]&lt;/em&gt;&lt;/p&gt;
</content><category term="events"/><category term="JupyterCon"/><category term="reproducibility"/></entry><entry><title>Reproducible Data Dependencies for Python [Guest Post]</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2018/reproducible-data-dependencies-for-python-guest-post/" rel="alternate"/><published>2018-03-13T17:01:00+00:00</published><updated>2018-03-13T17:01:00+00:00</updated><author><name>Aneesh Karve</name></author><id>tag:jasongrout.github.io,2018-03-13:/medium-archive/pelican/posts/2018/reproducible-data-dependencies-for-python-guest-post/</id><summary type="html">&lt;p&gt;This article is the first in a series of guest blog posts about open source projects in the Jupyter ecosystem and the problems they attempt…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/reproducible-data-dependencies-for-python-guest-post/images/001-1_-St-4RrS2ECywj_K1h_TDg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This article is the first in a series of guest blog posts about open source projects in the Jupyter ecosystem and the problems they attempt to solve. If you would like to submit a guest post to highlight a specific tool or project, please get in touch with us.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Jupyter Notebooks go a long way towards making computations reproducible and sharable. Nevertheless, for many Jupyter users, it remains a challenge to manage datasets across machines, over time, and across collaborators — especially when those datasets are large or change often. Quilt Data is a company that supports Quilt, an open source project to version and package data. The Quilt team recently released an extension for JupyterLab.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;We are excited to see how the community will extend Jupyter and JupyterLab to manage datasets. Thanks to the Quilt team for submitting this guest blog post.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;— The Jupyter Team&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The open-source community has developed strong foundations for reproducible source code. Git supports versioning, GitHub supports collaboration. PyPI and Conda deliver code in immutable packages. Docker executes code in uniform, scalable containers.&lt;/p&gt;
&lt;p&gt;But what about reproducible data? Data poses unique challenges: it’s larger than code, and resides in a wide variety of formats. Each data format implies different tradeoffs in serialization performance, compression, and file size. As a result, managing data becomes intractable in line-based version control systems like git. This presents a problem for Jupyter users: source code gets shared, but data gets left behind.&lt;/p&gt;
&lt;p&gt;One solution to this problem is to port successful abstractions from source code management over to data. Versioning, packaging, and execution are well understood and universally adopted in source code management. In this article we’ll explore a collection of services that version, package, and marshal data — &lt;a href="https://quiltdata.com/"&gt;Quilt&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="getting-data-into-notebooks"&gt;Getting data into notebooks&lt;/h2&gt;
&lt;p&gt;Notebooks that depend on data from files are fragile. File formats change, file stores move, files are copied, and file copies diverge. As a result, notebooks break as we share them across collaborators, across machines, and over time.&lt;/p&gt;
&lt;p&gt;Quilt hides &lt;em&gt;network, files, and storage&lt;/em&gt; behind a &lt;em&gt;data package&lt;/em&gt; abstraction so that anyone can create durable, reproducible data dependencies for notebooks.&lt;/p&gt;
&lt;p&gt;To run the sample code in this article, launch your favorite Python environment and install quilt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;quilt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we use quilt to pull data dependencies into a Jupyter notebook:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;quilt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;small&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subpackage&lt;/span&gt;
&lt;span class="nx"&gt;quilt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;uciml/heart_disease/tables/processed/switzerland&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;force&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# import the data package&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;quilt.data.uciml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;heart_disease&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the above code, &lt;a href="https://quiltdata.com/package/uciml/heart_disease"&gt;uciml/heart_disease&lt;/a&gt; is a data package. Packages live in repositories and have handles of the form USER/PACKAGE. The package repository includes a versioned history of the data, which we can access as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;quilt&lt;/span&gt;
&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;quilt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;uciml/heart_disease&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Hash                  Pushed              Author
eb79ef86f84fdcf61e... 2017-06-13 19:54:44 uciml
780397900f81c3c088... 2017-06-13 19:52:21 uciml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We could install a specific version of the data by providing the &lt;code&gt;hash=&lt;/code&gt; keyword argument to &lt;code&gt;quilt.install&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Let’s access the data in our subpackage. Data are loaded into memory by adding parentheses to a package path, as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;heart_disease.tables.processed.switzerland()
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Heart disease data in a data frame" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/reproducible-data-dependencies-for-python-guest-post/images/002-0_6qBidoOcMQHZuZt2.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Heart disease data in a data frame&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="command-line-and-python-interfaces"&gt;Command line and Python interfaces&lt;/h3&gt;
&lt;p&gt;Virtually all Quilt commands are available on both the command line and in Python. For example &lt;code&gt;$ quilt log uciml/heart_disease&lt;/code&gt; in Terminal is equivalent to &lt;code&gt;quilt.log(&amp;quot;uciml/heart_disease&amp;quot;)&lt;/code&gt; in Python.&lt;/p&gt;
&lt;h3 id="what-about-unstructured-data-like-images"&gt;What about unstructured data, like images?&lt;/h3&gt;
&lt;p&gt;In the preceding example we saw that Quilt reads columnar data into data frames. Semi-structured and unstructured data — such as JSON, images, and text — are also supported. Unstructured data skip serialization and are simply copied into Quilt’s object store. For instance if a user calls &lt;code&gt;pkg.unstructured_txt()&lt;/code&gt; they receive a path to the unstructured file on disk, not a data frame. Future versions of Quilt will provide a wider variety of native deserializers (e.g. JSON to &lt;code&gt;dict&lt;/code&gt; for Python).&lt;/p&gt;
&lt;h3 id="understanding-the-object-store"&gt;Understanding the object store&lt;/h3&gt;
&lt;p&gt;All package data are read from Quilt’s object store. The object store provides three performance enhancements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;deduplication&lt;/strong&gt; — Each unique data fragment is named by its SHA-256 hash so that when Quilt users push and pull data, only the fragments that have changed are sent over the network&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fast reads of large files —&lt;/strong&gt; the package &lt;a href="https://quiltdata.com/package/akarve/nyc_taxi"&gt;akarve/nyc_taxi&lt;/a&gt; contains a 1.7GB CSV table. Quilt produces a data frame from the table in 4.88 seconds, thanks to PyArrow’s efficient handling of Parquet. By comparison, &lt;code&gt;pandas.read_csv()&lt;/code&gt; takes 47 seconds to produce the same data frame from its CSV source. And &lt;code&gt;pandas.read_sql()&lt;/code&gt; takes more than 5 minutes to acquire the same data from a database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;columnar storage&lt;/strong&gt; — Quilt converts tabular data into Apache Parquet columns. Parquet columns can be efficiently compressed, deserialized, and searched by tools like PrestoDB and HiveSQL.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="browsing-data-packages-in-jupyterlab"&gt;Browsing data packages in JupyterLab&lt;/h2&gt;
&lt;p&gt;As Jupyter users we want to make it easy to find and consume new data packages. Quilt leverages JupyterLab’s extension architecture to create an extension that lets you search Quilt for data packages.&lt;/p&gt;
&lt;p&gt;If desired, switch to an environment of your choice. Next, install the Quilt extension for JupyterLab as follows (see the &lt;a href="https://github.com/quiltdata/jupyterlab"&gt;quilt extension repo&lt;/a&gt; for further documentation):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;quilt
$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;-U
$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;jupyterlab
$&lt;span class="w"&gt; &lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;labextension&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;jupyterlab-quilt
$&lt;span class="w"&gt; &lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;lab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Quilt extension for JupyterLab" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/reproducible-data-dependencies-for-python-guest-post/images/003-1_cZJ19W0a1ZcO9S6hhJQW_g.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Quilt extension for JupyterLab&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you type “uciml” in the search box you’ll see a list of packages from the UCI Machine Learning Repository. If you click on a package in the list, the extension will generate the code to install and import the package. Click on the link icon, far right, to visit the package repository page, where you’ll find further documentation on the data.&lt;/p&gt;
&lt;h2 id="quiltyml-is-like-requirementstxt-for-data"&gt;quilt.yml is like requirements.txt for data&lt;/h2&gt;
&lt;p&gt;We can express a notebook’s data dependencies in a YAML file, conventionally called &lt;code&gt;quilt.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;asah&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mnist&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;uciml&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;heart_disease&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;tables&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;processed&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;switzerland&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;eb79ef86&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;akarve&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pydata_book&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;titanic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Anyone with the above wishes to reproduce a notebook that depends on the above packages can type the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;quilt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;quilt.yml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Jupyter notebooks on the same machine now have access to the quilt.yml-specified versions of MNIST, Titanic, and Heart Disease.&lt;/p&gt;
&lt;h3 id="quiltyml-for-binder-notebooks"&gt;quilt.yml for Binder notebooks&lt;/h3&gt;
&lt;p&gt;If you’re running Jupyter notebooks on the web with &lt;a href="https://mybinder.org/"&gt;Binder&lt;/a&gt;, here’s an example of &lt;a href="https://github.com/quiltdata/data2binder"&gt;how to install data dependencies&lt;/a&gt; in a Binder container.&lt;/p&gt;
&lt;h2 id="build-your-own-data-package"&gt;Build your own data package&lt;/h2&gt;
&lt;p&gt;Let’s create a data package that contains Bitcoin prices. You can start by downloading the source data &lt;a href="https://s3.amazonaws.com/quilt-web-public/data/BTC_prices.csv"&gt;BTC_prices.csv&lt;/a&gt;, placing it in a clean directory, and changing to the same directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;quilt-btc
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;quilt-btc
$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;https://s3.amazonaws.com/quilt-web-public/data/BTC_prices.csv&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;BTC_prices.csv
$&lt;span class="w"&gt; &lt;/span&gt;ls
BTC_prices.csv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can use quilt generate to create a &lt;code&gt;build.yml&lt;/code&gt; file. &lt;code&gt;build.yml&lt;/code&gt; specifies how data are transformed into an in-memory package tree.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;quilt&lt;span class="w"&gt; &lt;/span&gt;generate&lt;span class="w"&gt; &lt;/span&gt;.
Generated&lt;span class="w"&gt; &lt;/span&gt;build-file&lt;span class="w"&gt; &lt;/span&gt;./build.yml.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here’s what’s in &lt;code&gt;build.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;BTC_prices&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BTC_prices&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;csv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;quilt generate&lt;/code&gt; recursively descends a directory to include all descendants folders and files in a generated &lt;code&gt;build.yml&lt;/code&gt; file. Quilt packages can contain thousands of files and hundreds of gigabytes of data.&lt;/p&gt;
&lt;p&gt;Let’s modify our &lt;code&gt;build.yml&lt;/code&gt; to specify how we want our data package to be structured. We’ll rename the node, and use &lt;code&gt;kwargs&lt;/code&gt; to parse the Date column as a datetime, specify the quote character, and skip some comment rows.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;parse_dates&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Date&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;quotechar&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;skiprows&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2714&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2715&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2716&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BTC_prices&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;csv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(Behind the scenes, &lt;code&gt;kwargs&lt;/code&gt; are handed to &lt;code&gt;pandas.read_csv&lt;/code&gt;.)&lt;/p&gt;
&lt;p&gt;Finally, we’ll document our data package with a &lt;code&gt;README.md&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# Bitcoin prices
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;This data was produced from the [CoinDesk price page](http://www.coindesk.com/price/).
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We need to add &lt;code&gt;README.md&lt;/code&gt; to &lt;code&gt;build.yml&lt;/code&gt; so that the Quilt compiler knows to include it in the package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;README&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;README&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;md&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;parse_dates&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Date&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;quotechar&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;skiprows&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2714&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2715&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2716&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BTC_prices&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;csv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you wish to upload your package you’ll need a Quilt account. You can log in to Quilt from Terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;quilt&lt;span class="w"&gt; &lt;/span&gt;login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we rebuild the package to include our README and new kwargs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;quilt&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;USERNAME/PACKAGE&lt;span class="w"&gt; &lt;/span&gt;build.yml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, we publish our package to the registry so that other users can access the data:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;quilt&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;USERNAME/PACKAGE&lt;span class="w"&gt; &lt;/span&gt;--public
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Your package is now live in the web catalog, &lt;a href="https://quiltdata.com/package/akarve/BTC"&gt;like this akarve/BTC example&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;quilt log USERNAME/PACKAGE&lt;/code&gt; shows the time and tophash for our recent push. Here’s what quilt log outputs for my package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Hash                             Pushed              Author
e81757c6cc6fd5ccfcd589e0b62a7d9… 2017–12–22 13:43:12 akarve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Any notebooks that depend on this version of the akarve/BTC package can declare the dependency in a &lt;code&gt;quilt.yml&lt;/code&gt; file or directly in code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;quilt.install(&amp;quot;akarve/BTC&amp;quot;, hash=&amp;quot;e81757c&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, we can associate a human-readable tag with any of the hashes from &lt;code&gt;quilt log&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;quilt&lt;span class="w"&gt; &lt;/span&gt;tag&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;akarve/BTC&lt;span class="w"&gt; &lt;/span&gt;crypto&lt;span class="w"&gt; &lt;/span&gt;e81757c
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Any notebooks that contain the following line of code point to the same immutable data package and are reproducible across machines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;quilt.install(&amp;quot;akarve/BTC&amp;quot;, tag=&amp;quot;crypto&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="where-does-my-data-live"&gt;Where does my data live?&lt;/h3&gt;
&lt;p&gt;By default Quilt store data in the registry at &lt;a href="https://quiltdata.com"&gt;quiltdata.com&lt;/a&gt;. Alternatively, you can host your own registry by &lt;a href="https://github.com/quiltdata/quilt/tree/master/registry"&gt;running the open source containers&lt;/a&gt;, then using &lt;code&gt;quilt config&lt;/code&gt; to point clients to your private registry.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We’ve explored data packages as versioned, immutable building blocks that encapsulate data dependencies. The data package lifecycle is driven by four commands: &lt;a href="https://github.com/quiltdata/quilt#commands"&gt;&lt;em&gt;build&lt;/em&gt;, &lt;em&gt;push&lt;/em&gt;, &lt;em&gt;install&lt;/em&gt;, and &lt;em&gt;import&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the near future we plan to make the JupyterLab extension bidirectional, so that users can not only pull data from Quilt, but easily push cell data into Quilt. Support for R, Spark, and HDFS are also on the Quilt roadmap.&lt;/p&gt;
&lt;p&gt;The Quilt compiler, registry, and catalog are &lt;a href="https://github.com/quiltdata/quilt"&gt;open source&lt;/a&gt;. We welcome your contributions.&lt;/p&gt;
</content><category term="reproducibility"/></entry></feed>