<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Outreachy</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/tag-outreachy.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2023-06-19T08:02:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>From intern to mentor</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2023/from-intern-to-mentor/" rel="alternate"/><published>2023-06-19T08:02:00+00:00</published><updated>2023-06-19T08:02:00+00:00</updated><author><name>Georgiana Dolocan</name></author><id>tag:jasongrout.github.io,2023-06-19:/medium-archive/pelican/posts/2023/from-intern-to-mentor/</id><summary type="html">&lt;p&gt;Four years ago, Project Jupyter participated for the first time in the Outreachy program. And at the end of last year, during the December…&lt;/p&gt;
</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Four years ago, Project Jupyter participated for &lt;a href="/posts/2018/outreachy-jupyter-supporting-diversity-in-open/"&gt;the first time in the Outreachy program&lt;/a&gt;. And at the end of last year, during the December round, t&lt;a href="/posts/2022/introducing-jupyterhubs-outreachy-interns-december-2022/"&gt;hree more awesome interns joined the project&lt;/a&gt;. Because I was lucky enough to be part of this program both times, first time as an intern and second time as a mentor, in this post I will share the parts that were the most impactful and contributed the most to my growth as both mentor and engineer. I hope this will inspire other interns, to start their journey, but also other community members into becoming mentors.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;When I first interacted with the Jupyter community, I remember I was impressed by how welcoming everyone was, how well organized they seemed, how promptly questions got answered and how fast code got reviewed. This was especially impressive during the &lt;a href="https://www.outreachy.org/docs/applicant/#make-contributions"&gt;contribution phase&lt;/a&gt; when prospect interns were everywhere at the same time, we were generating crazy amount of work for mentors and the community when asking for guidance and tackling tasks.&lt;/p&gt;
&lt;p&gt;When the internship ended I realized how much I appreciated this process compared to other internships. The contribution phase made me feel very motivated because of the opportunity to work on &lt;strong&gt;real&lt;/strong&gt; tasks, with &lt;strong&gt;impact&lt;/strong&gt; for the entire community.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;All the work traffic, immense quantity of GitHub notifications, emails, questions, etc., were totally opaque to me as an intern, they seemed to just be magically handled by mentors. I now know this seamless interaction is made of some very special ingredients like team work, time commitment and hard work, nothing magic about it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Scoping the project, the most challenging part&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I believe scoping the project was the part that I found the most challenging as a first time mentor.&lt;/p&gt;
&lt;p&gt;The plan I had in mind for how to create the project roadmap, was to &lt;strong&gt;define a few tasks&lt;/strong&gt; that were not very tightly scoped, &lt;strong&gt;choose one&lt;/strong&gt; to start with, allocate time for the intern to &lt;strong&gt;research&lt;/strong&gt; about it, have synchronous meetings to &lt;strong&gt;collaboratively refine&lt;/strong&gt; it, then &lt;strong&gt;implement&lt;/strong&gt; it, &lt;strong&gt;review&lt;/strong&gt;, and then &lt;strong&gt;repeat&lt;/strong&gt; for next task. And although this was a good first plan, I failed to recognize when it stopped working and didn’t realize it’s important to pause and adapt the plan.&lt;/p&gt;
&lt;p&gt;It took me some time and guidance from others in the community, to realize that sometimes, &lt;strong&gt;constraints are beneficial&lt;/strong&gt; and allowing complete implementation freedom over a task, can be overwhelming. For finding the appropriate &lt;em&gt;[freedom — constraint]&lt;/em&gt; balance I needed to experimented with different task sizes, until tasks had a less overwhelming learning curve. This fosters and grows confidence and improves time management skills.&lt;/p&gt;
&lt;p&gt;I found this to be particularly tricky because this balance can be hard to achieve when creating a project roadmap. The hidden complexities of a project, existing skills, or any prior experience managing a project from scratch, are hard to know and plan around in the very first iteration.&lt;/p&gt;
&lt;p&gt;Another challenge of being a mentor that is usually hidden is the &lt;strong&gt;context switch penalty&lt;/strong&gt; between mentor time and daily job responsibilities. A mentor needs to fine tune the amount of intern interaction and involvement in the project implementation so that context switches from daily responsibilities are as soft as possible. It’s also critical that a mentor has full support and transparent communication with the daily job management so that work responsibilities don’t spill over into mentoring time, otherwise this can lead to stress and a sub-optimal experience for the intern.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Asking questions publicly, the biggest achievement&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The open source comes with a challenge attached to it by default, which is &lt;strong&gt;being comfortable communicating in the open and asking questions publicly&lt;/strong&gt;. The time and work that needs to go into fostering this skill needs to be taken into account from the very beginning and it’s extremely important to consider it from the project proposal and roadmap definition phase. It will help set the correct project expectations, and expose an otherwise hidden complexity of open source project maintainability.&lt;/p&gt;
&lt;p&gt;This was a challenge that was more difficult to overcome than expected, because in our case it involved, &lt;strong&gt;a first time mentor, a first time intern&lt;/strong&gt;, and a project that required diving into the codebase of lots of other different projects in the ecosystem, so &lt;strong&gt;guidance from the entire community&lt;/strong&gt; and asking questions was crucial.&lt;/p&gt;
&lt;p&gt;My intern, Sheila was very determined and courageous and she received great care and support from the entire community in overcoming this obstacle. She is now a key maintainer &lt;a href="https://github.com/jupyterhub/pytest-jupyterhub"&gt;of the internship project&lt;/a&gt; she worked on, asking and answering questions without issues. Checkout out her many achievements captured in &lt;a href="https://hackmd.io/cvqPq6XVQbaYVndwFvJ0Kw?view"&gt;this list (not complete)&lt;/a&gt; and &lt;a href="https://cfp.jupytercon.com/2023/talk/HNTKXF/"&gt;her presentation&lt;/a&gt; about the Reusable JupyterHub Pytest Plugin at JupyterCon. A recording of her talk should soon be available on &lt;a href="https://www.youtube.com/@JupyterCon"&gt;JupyterCon’s YouTube channel.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mentor training, mentor shadowing, co-mentoring, the best allies&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am extremely grateful to have had the support of the other mentors and the community during theses three mentoring months.&lt;/p&gt;
&lt;p&gt;In particular, I am very grateful for Sarah Gibson, &lt;a href="/posts/2021/czi-awards-three-eoss-grants-to-jupyter-community/"&gt;the Jupyter strategic lead&lt;/a&gt; and our Community Coordinator with Outreachy, for organizing for us to get &lt;strong&gt;mentor training&lt;/strong&gt; beforehand through the &lt;a href="https://openlifesci.org/"&gt;OLS community&lt;/a&gt;. I found that to be very helping and ground setting and it made me feel more empowered.&lt;/p&gt;
&lt;p&gt;I also appreciated and found really useful the &lt;strong&gt;mentor shadowing sessions&lt;/strong&gt; that I did with Sarah and the &lt;strong&gt;demo session&lt;/strong&gt; that Min RK hold with all the interns and mentors. They were both great opportunities for me to observe and learn from the other mentors and get feedback from them.&lt;/p&gt;
&lt;p&gt;Co-mentoring was something that was considered during this round, but because we wanted to select all these great interns we ended up not mentoring in teams. But this appears as a great approach of introducing first-time mentors.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It was all worth it, the takeway&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The JupyterHub project got to improve its documentation, accessibility and testing thanks to this program and to the three amazing interns that worked with us during this round ❤️. In addition, this internship round helped us create &lt;a href="https://jupyterhub-outreachy.readthedocs.io/en/latest/"&gt;a place where people can learn about JupyterHub’s experience with Outreachy&lt;/a&gt; and &lt;a href="https://github.com/jupyterhub/jupyterhub-python-repo-template"&gt;a template repository&lt;/a&gt; to be used for quickly generating other JupyterHub Python sub-repositories that follow the standards of the organization.&lt;/p&gt;
&lt;p&gt;On the personal side now that the internship is over, I can happily say that it was very enlightening and humbling to be on the mentoring side as well. Even if it’s challenging, you get an amazing feeling when you give back and channel all the effort and kindness that shaped you and that you received as a mentee from other people.&lt;/p&gt;
</content><category term="community"/><category term="JupyterHub"/><category term="Outreachy"/></entry><entry><title>Introducing JupyterHub’s Outreachy interns! — December 2022 Cohort</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2022/introducing-jupyterhubs-outreachy-interns-december-2022/" rel="alternate"/><published>2022-12-07T07:45:00+00:00</published><updated>2022-12-07T07:45:00+00:00</updated><author><name>Sarah Gibson</name></author><id>tag:jasongrout.github.io,2022-12-07:/medium-archive/pelican/posts/2022/introducing-jupyterhubs-outreachy-interns-december-2022/</id><summary type="html">&lt;p&gt;As part of the community strategic support project funded by CZI’s EOSS grant series, the JupyterHub sub-project has funding to support…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/introducing-jupyterhubs-outreachy-interns-december-2022/images/001-1_mRtgDdoRwjO3Kb2nSGOsdw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;As part of the &lt;a href="/posts/2021/czi-awards-three-eoss-grants-to-jupyter-community/"&gt;community strategic support project funded by CZI’s EOSS grant series&lt;/a&gt;, the JupyterHub sub-project has funding to support Outreachy interns through four cohorts over the next two years. We would like to introduce you to the first cohort and the projects they will be working on!&lt;/p&gt;
&lt;h2 id="ogoh-blessing-onyowoicho-improve-accessibility-in-jupyterhub"&gt;Ogoh Blessing Onyowoicho — Improve Accessibility in JupyterHub&lt;/h2&gt;
&lt;p&gt;Accessibility is the ability of tools (in our case web tools) to be used by a variety of communities with different disabilities. There are a variety of standards and tools for evaluating and ensuring that a web page can be used effectively by as many people as possible. Work by the &lt;a href="https://jupyter-accessibility.readthedocs.io"&gt;Accessibility team&lt;/a&gt; is ongoing to define a set of standard tools to improve accessibility across the Jupyter ecosystem.&lt;/p&gt;
&lt;p&gt;The JupyterHub project is working to improve the accessibility of its pages to ensure we are providing tools that are as useful as they can be to as many people as we can. During the internship, we will evaluate JupyterHub’s accessibility, find ways to improve it, and integrate accessibility testing into the development process, in collaboration with the Accessibility team, to ensure we do a better job going forward.&lt;/p&gt;
&lt;h3 id="ogoh-blessing-says"&gt;Ogoh Blessing says:&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;My name is Ogoh Blessing Onyowoicho. I am a self-taught Frontend developer based in Lagos, Nigeria and I am an Outreachy intern working on Improving the accessibility of JupyterHub.&lt;br&gt;
I am excited to work on JupyterHub because it is giving me the opportunity to use skills that I have accrued over the years to proffer solutions to problems that affect people’s lives directly. On hearing accessibility, the first thought one has is that it involves building web products that people with special needs can use seamlessly. Though this is part of it, accessibility goes way beyond this. It involves building products that different users (e.g users at different locations, users with different devices etc) can use easily. The thought of contributing to improving the experience of so many people alone excites me.&lt;br&gt;
In the coming months, I hope to learn and continue to hone my skills as I am guided by my mentors and members of the community I get to interact with.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="allan-wasega-restructure-and-improve-jupyterhub-documentation-by-implementing-the-diataxis-framework"&gt;Allan Wasega — Restructure and improve JupyterHub documentation by implementing the Diátaxis framework&lt;/h2&gt;
&lt;p&gt;JupyterHub has a range of documentation that covers both developer and user audiences in order to help them deploy, maintain, and use their own instance of a JupyterHub. The success of an open source software project to (i) be adopted by users, and (ii) receive meaningful contributions relies heavily on the quality, navigability and accessibility of documentation so that users and developers have all the information they need to achieve what they want to do.&lt;/p&gt;
&lt;p&gt;A framework for organising technical documentation has arisen called &lt;a href="https://diataxis.fr"&gt;diátaxis&lt;/a&gt;. It takes a systematic approach to understanding user requirements of documentation throughout the lifecycle of interaction with a product and posits that different user needs require different approaches in creation of the documentation, as well as a layout to navigate these different “modes” of documentation.&lt;/p&gt;
&lt;p&gt;This project will focus on a refactoring of the documentation for the &lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub package&lt;/a&gt;. We will begin by performing a review of the present documentation, categorise these into the diataxis framework, and then restructure the documentation files in the repository. Once we have transformed the documentation into this framework, it will be much easier to identify missing and unclear documentation (those that were difficult to categorise). We can then begin to curate resources that can fill the gaps and improve documentation that is not specific enough.&lt;/p&gt;
&lt;h3 id="allan-says"&gt;Allan says:&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;I am Allan Wasega, from Nairobi, Kenya. Broadly, I like to describe myself as a researcher and a writer. Researcher because looking into things to find patterns or hidden information has always been of interest to me. Writer because I figured early on that words allow me to express myself and to communicate to a larger audience than that inside my head :). As a Computer Science student, I looked for ways to bring these two skills together within the realm of computing and that is how I found myself in the technical writing space.&lt;br&gt;
As an undergraduate student, I used Jupyter Notebooks extensively for most of my programming assignments and projects. As a result, when making my Outreachy application, the JupyterHub project immediately piqued my interest because I did not know that there was a way to serve Jupyter Notebooks to multiple users, such as within a classroom setting. Presently, I serve as a mentor at KamiLimu, which is a mentorship program for students pursuing technology-aligned courses in tertiary institutions in Kenya. One of the objectives of KamiLimu is to introduce students to tech specializations such as Data Science and Machine Learning, which, from experience, uses Jupyter Notebooks! Therefore, I am excited to work on JupyterHub because I will be learning about and helping to improve a product I hold dear and which I can use to advance the skills of the next generation of computer technologists in Kenya.&lt;br&gt;
First, I hope to gain a deep understanding of how JupyterHub works so as to spread the word about it and its functionalities. Second, I hope to apply and advance my technical writing skills. I encountered the Diataxis Framework earlier this year while working as a technical writer at Tingle Software, a Nairobi-based software company. I have also been following Daniele Procida (the author of the framework) on Twitter for a while now and his work has been quite inspiring. Through this project, I will apply the Diataxis Framework to restructure JupyterHub’s documentation and, in doing so, further my understanding of the framework. Finally, I am passionate about mentorship, especially in the tech field. Therefore, besides expanding my professional and personal networks, this project will enable me to learn how to conduct mentorship within a global setting, and I can, in turn, apply this knowledge within my local community.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="sheila-kahwai-create-a-reusable-jupyterhub-pytest-plugin"&gt;Sheila Kahwai — Create a reusable JupyterHub pytest plugin&lt;/h2&gt;
&lt;p&gt;JupyterHub is a modular and extensible project, with parts, like the proxy, authenticator and spawner, that can be easily changed and extended. Testing the functionality of these components against JupyterHub is important and it requires various hub setups that can sometimes become complicated.&lt;/p&gt;
&lt;p&gt;Currently, each of these hub components and the hub itself define their own testing infrastructure, building everything from the ground up using the pytest framework. But some of this complex work is either repetitive across JupyterHub sub-projects, or under-specified for some of them.&lt;/p&gt;
&lt;p&gt;This project will abstract out these common parts into a separate testing framework. This framework should be a pip-installable pytest plugin that would provide various hub functionalities through pytest fixtures. These fixtures can then be re-used by JupyterHub and its components to bootstrap their own testing suite.&lt;/p&gt;
&lt;p&gt;Integrating this plugin will drive some important refactoring work of the current testing architecture of JupyterHub and have a great impact in improving the overall test coverage, maintainability and continuity of the JupyterHub project.&lt;/p&gt;
&lt;h3 id="sheila-says"&gt;Sheila says:&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;My name is Sheila Kahwai. I am a self-taught python developer from Nairobi, Kenya, working to specialize in back-end engineering.&lt;br&gt;
I am excited to work on JupyterHub because it has made many products I have used throughout my learning journey. It is a privilege to work with a diverse community that has created products that are very useful to equally diverse users like myself.&lt;br&gt;
While creating a reusable JupyterHub pytest plugin, I hope to gain more insight into creating plugins for massive codebases to improve maintainability and scalability with clean and reusable code. Through this project, I look forward to improving the overall testing infrastructure of the various JupyterHub components.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Welcome to the interns! We’re so excited to start working with you!&lt;/p&gt;
</content><category term="accessibility"/><category term="documentation"/><category term="JupyterHub"/><category term="Outreachy"/></entry><entry><title>The Jupyter Contributor In Residence, update 1</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/cir-report-i/" rel="alternate"/><published>2020-05-07T15:22:00+00:00</published><updated>2020-05-07T15:22:00+00:00</updated><author><name>Georgiana Dolocan</name></author><id>tag:jasongrout.github.io,2020-05-07:/medium-archive/pelican/posts/2020/cir-report-i/</id><summary type="html">&lt;p&gt;JupyterHub and Binder Contributor in Residence. The first keepalive message.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;This year Jupyter was awarded a one-year “&lt;/em&gt;&lt;a href="https://chanzuckerberg.com/eoss/"&gt;&lt;em&gt;Essential Open Source Software for Science&lt;/em&gt;&lt;/a&gt;&lt;em&gt;” grant from the&lt;/em&gt; &lt;a href="https://chanzuckerberg.com/"&gt;&lt;em&gt;Chan Zuckerberg Initiative&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, which we are using to bring on our first “Contributor in Residence” (many thanks, CZI&lt;/em&gt; ❤&lt;em&gt;). This is a short report back from Jupyter’s first “&lt;/em&gt;&lt;a href="/posts/2019/the-jupyterhub-and-binder-contributor-in-residence/"&gt;&lt;em&gt;Contributor in Residence&lt;/em&gt;&lt;/a&gt;”, &lt;a href="https://github.com/GeorgianaElena"&gt;&lt;em&gt;Georgiana Dolocan&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. We are now about one third of the way through her tenure as CIR. Editor’s note: Georgiana has also made all of her own GIFs, because she’s just awesome like that ;-)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/cir-report-i/images/001-1_vCYZLSCYhI4XGm8pZG-okw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="the-jupyterhub-and-binder-contributor-in-residence-the-first-keepalive-message"&gt;The JupyterHub and Binder Contributor in Residence. The first &lt;a href="https://en.wikipedia.org/wiki/Keepalive"&gt;keepalive message&lt;/a&gt;.&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;At the end of last year, I found out that the &lt;a href="/posts/2019/the-jupyterhub-and-binder-contributor-in-residence/"&gt;CZI grant&lt;/a&gt; (so nicely put together by Chris Holdgraf), was accepted. I was very happy to have gotten the chance to continue working alongside an amazing community that I grew very fond of from day one that I started contributing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="plan-10"&gt;Plan 1.0&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/cir-report-i/images/002-1__GNG9croNBQjsCLGO-riNA.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Being the first project of its kind, we had millions of ideas about what the Contributor in Residence (CIR) project should be about. We discussed and converged towards a common plan, then we decided to continuously iterate once we got some real life feedback.&lt;/p&gt;
&lt;p&gt;See &lt;a href="https://github.com/jupyterhub/team-compass/issues/237"&gt;this GitHub issue&lt;/a&gt; with the end result of the brainstorming, and with various milestones set in place. In short, the purpose of the CIR is to work on the little day-to-day tasks that occur across a project (respond to questions, review PRs, fix bugs, write documentation, maintain infrastructure), nothing fancy, no big projects.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-biggest-little-achievements"&gt;The biggest little achievements&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Among the little day-to-day tasks, there are a few achievements that are more noticeable and worthwhile to mention, that will potentially have a bigger impact than others.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="the-first-blog-post-about-the-littlest-jupyterhub-is-out"&gt;🚩 The first blog post about The-Littlest-JupyterHub is out&lt;/h3&gt;
&lt;p&gt;&lt;a href="/posts/2020/the-superheros-and-the-magic-wand/"&gt;&lt;em&gt;The superheroes and the magic wand&lt;/em&gt;&lt;/a&gt; is the first blog post about TLJH on the Jupyter Blog. It first started as a technical blog post but while writing and constantly relating to TLJH as having superpowers to explain how it works, it turned rapidly into a superhero story.&lt;/p&gt;
&lt;p&gt;TLJH is an important project in the Jupyter ecosystem and one that I care about a lot, so stay tuned as there are more blog posts to come about it, and although technical this time, I won’t restrain myself from talking about its superpowers.&lt;/p&gt;
&lt;h3 id="the-tljh-ci-tests-were-refactored-and-an-upgrade-test-was-added"&gt;🚩 The TLJH CI tests were refactored and an upgrade test was added&lt;/h3&gt;
&lt;p&gt;Are you familiar with that feeling when a pull request looks OK, it passes all tests and all the bots are happy, so you hit that merge button? Yet, soon after, the unexpected happens and bug reports start showing up. 🙈&lt;/p&gt;
&lt;p&gt;Even though you manage to find the issue and solve it, one question remains: “Why did the checks pass?” The answer isn’t easy to hear: “The tests need to be improved”.&lt;/p&gt;
&lt;p&gt;TLJH operates on a “rolling release” model, where people just install from master, so it’s very important to have strong tests. However, our issue wasn’t exactly with the tests themselves, but rather our &lt;a href="https://github.com/jupyterhub/the-littlest-jupyterhub/issues/503"&gt;CI didn’t match the production installation workflow&lt;/a&gt;, and that small difference between the workflows left TLJH in an uninstallable state. Merging that PR in the first place along with finding the divergence point was the key to solve the problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bonus point&lt;/strong&gt;: whenever someone wants to upgrade TLJH, they do it by running the installer again. Thus, the changes we’re adding by merging a PR, don’t just need to pass the tests, but also they must not break the upgrade process. So, we also added an &lt;a href="https://github.com/jupyterhub/the-littlest-jupyterhub/pull/511"&gt;upgrade test to our CI&lt;/a&gt; to solve any potential future upgrade problems.&lt;/p&gt;
&lt;h3 id="three-repositories-in-the-jupyterhub-organization-are-now-being-watched-by-a-support-bot"&gt;🚩 Three repositories in the JupyterHub organization are now being watched by a support bot&lt;/h3&gt;
&lt;p&gt;The Jupyter community currently uses GitHub, &lt;a href="https://gitter.im/jupyterhub/jupyterhub"&gt;Gitter&lt;/a&gt; and &lt;a href="https://discourse.jupyter.org/"&gt;Discourse&lt;/a&gt; (the newest of them) to connect to one another. Having three communication channels might be confusing if there isn’t any clear distinction between them in terms of their scope. So we needed to find a way to organize our discussion to make the contributing experience better for everyone (users, core developers, and everyone in between).&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://discourse.jupyter.org"&gt;Discourse forum&lt;/a&gt; was already the place where most of our general discussions happened. So why not make this place even more popular and encourage everybody to share their ideas and questions there? This way, the forum becomes the place where we can help and inspire each-other, and GitHub issues are where we talk about cool new features, find bugs, and figure out how to solve the issues.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/apps/support"&gt;support bot&lt;/a&gt; will help spread the word about the forum and will make the transition easier. Currently, it is plugged into the &lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;jupyterhub&lt;/a&gt;, &lt;a href="https://github.com/jupyterhub/binderhub"&gt;binderhub&lt;/a&gt; and &lt;a href="https://github.com/jupyterhub/the-littlest-jupyterhub"&gt;tljh&lt;/a&gt; repositories and will act each time the “support” label is added to a GitHub issue that should be on Discourse.&lt;/p&gt;
&lt;p&gt;We kindly encourage everybody to use Discourse to start or participate in awesome discussions or ask questions of any kind. A great place to start is the &lt;a href="https://discourse.jupyter.org/t/introduce-yourself/17/131"&gt;&lt;em&gt;Introduce yourself&lt;/em&gt; thread&lt;/a&gt; where you can just stop by and say “Hi”.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="struggles-and-solutions"&gt;Struggles and solutions&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Working on little tasks sounds simpler and easier than starting a big, complex project from scratch. Well, this is not entirely true… Those small tasks are happening around big projects that are used by a lot of people and are constantly evolving. So, even a small, not very complicated task, can be hard when you’re still figuring out the “hows” and “wheres” of a project.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/cir-report-i/images/003-1_qaJ2OXcIQc9qeHDhH4ZUyw.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h3 id="struggle-distributing-focus-across-multiple-repositories-and-issues"&gt;Struggle: distributing focus across multiple repositories and issues&lt;/h3&gt;
&lt;p&gt;When working on a bigger project, I used to switch between tasks as a means to unwind when running out of ideas and things seemed impossible. I guess one could call this multitasking. However, switching between tasks of different projects that you know little about is challenging enough to cause stress, resuscitate that impostor syndrome, and ultimately turn into burnout.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Although I don’t have a solution to this and I’m still having troubles mastering this skill, I find inspiration and hope among the people in the Jupyter community. Even if maintaining lots of projects at once, they manage to successfully juggle between tasks, sometimes even when this isn’t their main job, so they deserve a huge shout out ❤️&lt;/p&gt;
&lt;h3 id="struggle-keeping-track-of-little-things"&gt;Struggle: keeping track of little things&lt;/h3&gt;
&lt;p&gt;The difference between working on a big project and solving small tasks here and there (besides the obvious size distinction) is that solving smaller tasks makes you prone to loosing a sense of progress. Though not a project in the traditional way, the CIR is a concept that would be worth extending if successful, so evaluating its progress is a must and can help determine and improve those weak points — and why not — even point out when it’s time to stop. But keeping track of little things is tricky.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: GitHub issues, comments or PRs can automatically be retrieved through GitHub’s API (Chris Holdgraf has a great tool for this called &lt;a href="https://github.com/choldgraf/github-activity"&gt;github-activity&lt;/a&gt;). However, to get a sense of accomplishment and progress at the end of the day, I tried to keep my own list of todos and tasks done. I experimented with two approaches in this sense: keeping a HackMD “journal” and creating a &lt;a href="https://github.com/users/GeorgianaElena/projects/1"&gt;GitHub project&lt;/a&gt;. After these three months I think I like the GitHub project better because it allows me to keep a todo list with small enhancements I’d like to work when that notification bell doesn’t ring that often and it’s less copy and pasting links.&lt;/p&gt;
&lt;h3 id="struggle-getting-out-of-the-comfort-zone"&gt;Struggle: getting out of the comfort zone&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/cir-report-i/images/004-1_7IYmviNQrZQtsDBcx95-9Q.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Implementing that cool new feature or solving that annoying bug when feeling adventurous are part of the fun of software development. However, being a CIR is more than writing code. Things like writing blog posts and reviewing PRs are core responsibilities as well. But these are all new territory, so much that, I think up until last year I could count on the fingers of one hand the number of blog posts I had written or the number of PRs I had reviewed. So, the only thing left to say is “Hello new challenges! Farewell comfort zone 👋”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Accept the challenge and practice every day until things don’t feel that scary anymore. Patience is key.&lt;/p&gt;
&lt;h2 id="plan-20"&gt;Plan 2.0&lt;/h2&gt;
&lt;p&gt;Version 1 of the plan was solid enough not to have to modify it completely.&lt;br&gt;
So, things like tracking down the bugs and failing tests won’t be halted.&lt;br&gt;
Instead, during these next two months, the plan will only suffer some little focus-related adjustments.&lt;/p&gt;
&lt;p&gt;Specifically, I want to focus more on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Getting more familiar with some of the repositories that didn’t get enough attention during the first phase of the project (&lt;a href="http://github.com/jupyterhub/zero-to-jupyterhub-k8s"&gt;zero-to-jupyterhub-k8s&lt;/a&gt;, &lt;a href="http://github.com/jupyterhub/jupyterhub-deploy-docker"&gt;jupyterhub-deploy-docker&lt;/a&gt;, &lt;a href="http://github.com/jupyterhub/binderhub"&gt;binderhub&lt;/a&gt;, &lt;a href="http://github.com/jupyterhub/dockerspawner"&gt;dockerspawner&lt;/a&gt;, &lt;a href="http://github.com/jupyterhub/kubespawner"&gt;kubespawner&lt;/a&gt;, &lt;a href="http://github.com/jupyter/repo2docker"&gt;repo2docker&lt;/a&gt;), potentially improving the documentation along the way. No more dipping the toes in the water, just dive in 🌊.&lt;/li&gt;
&lt;li&gt;Writing more blog posts about the superpowers of TLJH.&lt;/li&gt;
&lt;li&gt;Have more bots 🤖 helping the community.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the process, I hope I can check the boxes for some of the items on my “learn and improve” wish-list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;technical writing&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;UI/UX&lt;/li&gt;
&lt;li&gt;courage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stay tuned, because the next blog post about the JupyterHub and Binder Contributor in Residence adventures should be out in two months time.&lt;/p&gt;
</content><category term="community"/><category term="Outreachy"/></entry><entry><title>Introducing TraefikProxy — a scalable and highly available proxy for JupyterHub</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/introducing-traefikproxy-a-new-jupyterhub-proxy-based/" rel="alternate"/><published>2019-03-06T11:58:00+00:00</published><updated>2019-03-06T11:58:00+00:00</updated><author><name>Georgiana Dolocan</name></author><id>tag:jasongrout.github.io,2019-03-06:/medium-archive/pelican/posts/2019/introducing-traefikproxy-a-new-jupyterhub-proxy-based/</id><summary type="html">&lt;p&gt;Removing the single point of failure from your JupyterHub infrastructure with traefik, etcd and Outreachy&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In the JupyterHub context, the proxy is the unit in charge of directing the user requests to their notebook servers.&lt;/p&gt;
&lt;p&gt;The proxy manages a list of &lt;strong&gt;[user : notebook]&lt;/strong&gt; mappings (the proxy routing table) in order to decide which request is sent where. The routing table must be continuously updated as users start and stop their servers without disrupting the requests being processed. The following drawing illustrates the proxy functionality in a JupyterHub deployment.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/introducing-traefikproxy-a-new-jupyterhub-proxy-based/images/001-1_cy9fESaJhd0iDhH2v-LySQ.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Why the need for a new proxy?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Currently, the &lt;strong&gt;default&lt;/strong&gt; proxy implementation for JupyterHub is &lt;a href="https://github.com/jupyterhub/configurable-http-proxy"&gt;&lt;em&gt;configurable-http-proxy&lt;/em&gt;&lt;/a&gt; &lt;em&gt;(CHP)&lt;/em&gt;, which is a single-process nodejs proxy, that stores the routing table in-memory. &lt;em&gt;CHP&lt;/em&gt; is easy to install and run, and thus in most of the cases it’s a fine option. However, because you can only run a single copy of the proxy at a time, it has its limitations when used in dynamic, large scale systems.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;What makes this new proxy special?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;JupyterHub 0.8.&lt;/strong&gt; opened the way towards allowing users to &lt;a href="https://jupyterhub.readthedocs.io/en/stable/reference/proxy.html"&gt;create custom proxy implementations&lt;/a&gt; based on their deployment needs. &lt;a href="https://github.com/jupyterhub/traefik-proxy"&gt;&lt;em&gt;JupyterHub Traefik Proxy&lt;/em&gt;&lt;/a&gt; leverages this feature to offer an alternative to the default proxy. It is an implementation of the JupyterHub Proxy API based on &lt;a href="https://traefik.io"&gt;traefik&lt;/a&gt;, an extremely lightweight, portable reverse proxy implementation, that supports load balancing and can configure itself automatically and dynamically. JupyterHub Traefik Proxy comes in two flavors, depending on how traefik stores the routing table:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TraefikTomlProxy&lt;/strong&gt; — &lt;em&gt;for&lt;/em&gt; smaller, &lt;em&gt;single-node deployments&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TraefikEtcdProxy&lt;/strong&gt; — &lt;em&gt;for&lt;/em&gt; distributed &lt;em&gt;setups&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;How does it work?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Both &lt;em&gt;TraefikTomlProxy&lt;/em&gt; and &lt;em&gt;TraefikEtcdProxy&lt;/em&gt; use a &lt;em&gt;toml&lt;/em&gt; file for the global configuration. This file contains information about how to set up the connections to the routing table provider (the unit that stores the routing rules like “/user/mary” should be sent to Mary’s server at http://10.0.1.5:12345) and to the network entry points into Traefik (listening port, SSL, traffic redirection). However, the two proxies go in different directions when it comes to the provider used for storing the routing table.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;TraefikTomlProxy&lt;/strong&gt;&lt;/em&gt; uses a &lt;em&gt;toml&lt;/em&gt; file to store the routes and keeps an in-memory copy of it for a faster access to the routes. This is appropriate for smaller-scale deployments. For example, &lt;a href="https://github.com/jupyterhub/the-littlest-jupyterhub"&gt;&lt;em&gt;the Littlest Jupyterhub&lt;/em&gt;&lt;/a&gt; (the single-node JupyterHub distribution, for a small number of users) just switched from using two proxies (traefik as an edge proxy with letsencrypt support and CHP for routing) to a configuration with just &lt;em&gt;TraefikTomlProxy&lt;/em&gt; that serves both requirements. ❤&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;TraefikEtcdProxy&lt;/strong&gt;&lt;/em&gt; uses &lt;a href="https://coreos.com/etcd/"&gt;&lt;em&gt;etcd&lt;/em&gt;&lt;/a&gt;, a distributed key-value store to persist the routing table. This implementation aims to benefit &lt;a href="http://z2jh.jupyter.org/en/stable/"&gt;&lt;em&gt;Zero to JupyterHub with Kubernetes&lt;/em&gt;&lt;/a&gt; because it allows having multiple proxy replicas, making the proxy highly available and thus improving the scalability and stability of the system.&lt;/p&gt;
&lt;p&gt;Adding the information about TraefikProxy to the first diagram , the drawing below presents the two proxy flavors with their &lt;strong&gt;common&lt;/strong&gt; parts (the global configuration file — &lt;em&gt;traefik.toml&lt;/em&gt;) and their &lt;strong&gt;differences&lt;/strong&gt; (the mechanism used for storing the routing table — a toml file vs. etcd)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/introducing-traefikproxy-a-new-jupyterhub-proxy-based/images/002-1_A--P2mM21Cj6gfWImInnww.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Another cool Traefik feature is the &lt;em&gt;&lt;strong&gt;Web UI dashboard&lt;/strong&gt;&lt;/em&gt; which lists all of the registered frontends (the set of rules that determine how incoming requests are forwarded) and backends (the notebooks), the routing rules, some useful metrics, and other configuration elements. The port on which TraefikProxy’s api will run, as well as the username and password used for authenticating, are all configurable.&lt;/p&gt;
&lt;p&gt;Here’s what the dashboard looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/introducing-traefikproxy-a-new-jupyterhub-proxy-based/images/003-1_DQjZmUX2a6nzPJzFdZJqTw.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;How to enable Traefik Proxy?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;These instructions help you enable one of the Traefik proxies on your JupyterHub.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install it:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python3 -m pip install jupyterhub-traefik-proxy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Install traefik and etcd:&lt;/li&gt;
&lt;/ol&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;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;jupyterhub_traefik_proxy.install&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will install the default versions of traefik and etcd, namely &lt;code&gt;traefik-1.7.5&lt;/code&gt; and &lt;code&gt;etcd-3.3.10&lt;/code&gt; to &lt;code&gt;/usr/local/bin&lt;/code&gt; specified through the &lt;code&gt;--output&lt;/code&gt; option.&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Configure JupyterHub to run with TraefikProxy through &lt;em&gt;jupyterhub_config.py,&lt;/em&gt; using the &lt;em&gt;proxy_class&lt;/em&gt; config option.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jupyterhub_traefik_proxy&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;TraefikEtcdlProxy&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JupyterHub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;proxy_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TraefikEtcdProxy&lt;/span&gt;
&lt;span class="c1"&gt;# will configure JupyterHub to run with TraefikEtcdProxy&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;jupyterhub_traefik_proxy&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;TraefikTomlProxy&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JupyterHub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;proxy_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TraefikTomlProxy&lt;/span&gt;
&lt;span class="c1"&gt;# will configure JupyterHub to run with TraefikTomlProxy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As there are many other proxy configuration options, please check out the project &lt;a href="https://jupyterhub-traefik-proxy.readthedocs.io/en/latest/"&gt;documentation&lt;/a&gt; for more info and some example configurations.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What’s next?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;TraefikEtcdProxy is soon to be integrated into &lt;a href="https://github.com/jupyterhub/zero-to-jupyterhub-k8s"&gt;&lt;strong&gt;zero-to-jupyterhub-k8s&lt;/strong&gt;&lt;/a&gt;, the Helm Chart for deploying JupyterHub on Kubernetes. By using the Traefik proxy with etcd, we can eliminate the downtime while the proxy restarts or upgrades, as well as have an all-in-one proxy that can be used for both routing and &lt;em&gt;HTTPS (Let’s Encrypt)&lt;/em&gt; support.&lt;/p&gt;
&lt;p&gt;Also, there’s a performance analysis of all the three proxies on the way that will help us understand the advantages and limitations of this new JupyterHub Proxy implementation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The story behind&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;JupyterHub Traefik Proxy was developed as part of my &lt;a href="https://www.outreachy.org/"&gt;Outreachy&lt;/a&gt; internship. I am very grateful to have had the chance to work with the Jupyter community and I’m happy and proud to say that I’ve learned a lot and the experience has been invaluable. There were a lot of questions and a ton of fears along the way, but the encouragements and guidance I received, helped me move forward and finish this great project. So, a big &lt;strong&gt;thank you to&lt;/strong&gt; everyone for their support and to &lt;a href="https://numfocus.org/"&gt;&lt;em&gt;NumFocus&lt;/em&gt;&lt;/a&gt; &lt;em&gt;and&lt;/em&gt; &lt;a href="https://bids.berkeley.edu/"&gt;&lt;em&gt;Berkeley Institute for Data Science&lt;/em&gt;&lt;/a&gt; &lt;em&gt;for sponsoring this Outreachy round&lt;/em&gt;! ❤&lt;/p&gt;
&lt;/blockquote&gt;
</content><category term="JupyterHub"/><category term="Kubernetes"/><category term="Outreachy"/></entry><entry><title>Simpler authentication for small scale JupyterHubs with NativeAuthenticator</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/" rel="alternate"/><published>2019-02-26T16:31:00+00:00</published><updated>2019-03-04T14:41:00+00:00</updated><author><name>Leticia Portella</name></author><id>tag:jasongrout.github.io,2019-02-26:/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/</id><summary type="html">&lt;p&gt;NativeAuthenticator adds traditional username / password based sign up, login, &amp;amp; user management features to JupyterHub&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In this post I’ll tell you about the new &lt;a href="https://jupyterhub.readthedocs.io/en/stable/"&gt;JupyterHub&lt;/a&gt; authenticator I implemented in the last couple of months, not only technically but also the context in which it was built. If you have no idea what JupyterHub is and how it works, I recommend &lt;a href="https://www.youtube.com/watch?v=4GJFNQBB26s&amp;amp;t=973s"&gt;this short talk&lt;/a&gt; by the awesome &lt;a href="https://twitter.com/WillingCarol"&gt;Carol Willing&lt;/a&gt; 🙃.&lt;/p&gt;
&lt;p&gt;But first things first, let me introduce myself! My name is &lt;a href="https://leportella.com/"&gt;Leticia&lt;/a&gt; and I’m Brazilian 🇧🇷. Last year (2018) I saw an opening for an internship program called &lt;a href="https://www.outreachy.org/"&gt;Outreachy&lt;/a&gt;. I am a woman, a self-taught programmer with a non traditional background (&lt;a href="https://leportella.com/english/2016/03/16/from-oceanographer-to-programmer.html"&gt;I’m an oceanographer&lt;/a&gt;) and I had no job at this time. The program would fit me perfectly. Lucky me, Jupyter was one of the projects available! Thus, everything you’ll see here is the result (so far) of everything I’ve been doing with the internship and the help of my mentors.&lt;/p&gt;
&lt;p&gt;Before going any further I would also like to thank the &lt;a href="https://bids.berkeley.edu/"&gt;Berkeley Institute for Data Science&lt;/a&gt; and &lt;a href="https://numfocus.org/"&gt;NumFocus&lt;/a&gt; for jointly sponsoring my Outreachy internship. This was a huge opportunity for me ❤️&lt;/p&gt;
&lt;h2 id="why-do-we-need-another-authenticator"&gt;Why do we need another authenticator?&lt;/h2&gt;
&lt;p&gt;JupyterHub authenticators determine how users on a particular installation of JupyterHub can log in. For example, here are a few common authenticators already available to JupyterHub:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jupyterhub.readthedocs.io/en/stable/getting-started/authenticators-users-basics.html"&gt;&lt;strong&gt;PAM Authenticator&lt;/strong&gt;&lt;/a&gt;: Any whitelisted user with an account and password on the system will be allowed to login;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterhub/oauthenticator"&gt;&lt;strong&gt;OAuthenticator&lt;/strong&gt;&lt;/a&gt;: An authenticator that uses the login of other services (OAuth) to authenticate on the Jupyterhub (such as Azure, Github or Moodle);&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterhub/firstuseauthenticator"&gt;&lt;strong&gt;First Use Authenticator&lt;/strong&gt;&lt;/a&gt;: A new user is created when the user logs in for the first time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Large installations usually rely on a third party service (using OAuthenticator), while smaller ones maintain user accounts by hand (PAM Authenticator). However, maintining user lists by hand can be a lot of effort, especially as the number of users grows. &lt;strong&gt;Native Authenticator&lt;/strong&gt; was created to supply smaller JupyterHub installations with a more convenient authentication system instead of maintaining user accounts by hand, without the overhead of needing an external third party service.&lt;/p&gt;
&lt;h2 id="native-authenticator-features"&gt;Native Authenticator features&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://native-authenticator.readthedocs.io/en/latest/"&gt;&lt;strong&gt;Native Authenticator&lt;/strong&gt;&lt;/a&gt; was added to &lt;a href="https://pypi.org/"&gt;PyPI&lt;/a&gt; this week and we are super excited about this! The default features available on the authenticator are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://native-authenticator.readthedocs.io/en/latest/quickstart.html#adding-new-users"&gt;&lt;strong&gt;A signup page&lt;/strong&gt; that creates new users&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Username sanitation&lt;/strong&gt; (avoiding spaces, commas and backslashes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Administrator” privileges&lt;/strong&gt; that can be given to specific users&lt;/li&gt;
&lt;li&gt;The ability for users to &lt;strong&gt;change their passwords&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;A panel for &lt;strong&gt;controlling access to the system&lt;/strong&gt; on a user-by-user basis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some optional features are available and can be activated through &lt;a href="https://jupyterhub.readthedocs.io/en/latest/getting-started/config-basics.html#generate-a-default-config-file"&gt;the configuration file&lt;/a&gt; and will be discussed further on this post 🙃&lt;/p&gt;
&lt;h2 id="installing-and-using-native-authenticator"&gt;Installing and using Native Authenticator&lt;/h2&gt;
&lt;p&gt;To use the authenticator, you can install it through &lt;code&gt;pip&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;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;jupyterhub-nativeauthenticator
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can configure JupyterHub to work with &lt;strong&gt;Native Authenticator&lt;/strong&gt; by adding the following line to the configuration file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;c.JupyterHub.authenticator_class = &amp;#39;nativeauthenticator.NativeAuthenticator&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and that is it 😉&lt;/p&gt;
&lt;h2 id="default-authenticator-workflow"&gt;Default authenticator workflow&lt;/h2&gt;
&lt;p&gt;Once you’ve configured your JupyterHub installation to work with &lt;strong&gt;Native Authenticator&lt;/strong&gt;, no new user can enter the system. To enter the system, a new user must sign up. To do so, the operator of the Hub should point users to&lt;code&gt;/hub/signup&lt;/code&gt; and create a new username and password. After submitting the information, the user receives a message indicating that the information was sent to an admin.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/images/001-1_j03d42mqjsyDxqn_8ckcpA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;By default, &lt;em&gt;all users that Sign Up are unauthorized and can’t login to the system&lt;/em&gt;. The admin will need to enter the Authorization Area dashboard at &lt;code&gt;/hub/authorize&lt;/code&gt; and authorize the users into the system. The panel looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/images/002-1_EWg9RdlOG21IcB1ogCcpTg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Authorized users are shown with a green background while unauthorized users have a white background. Each has a button to change the authorization status. Once a user is authorized, it will be able to go to the &lt;code&gt;/&lt;/code&gt; endpoint and login.&lt;/p&gt;
&lt;p&gt;The default workflow of the Native Authenticator is like this:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Default workflow of Native Authenticator" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/images/003-1_PiSAI-wFEma2dUz_MgQ7nw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Default workflow of Native Authenticator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A quick remark on this workflow: this only works for users that are &lt;strong&gt;not&lt;/strong&gt; listed as admins. Any username that is listed as an admin in the JupyterHub configuration file will automatically have authorization to login when they sign up. You can add admins by adding this line to the configuration file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;c.Authenticator.admin_users = { &amp;#39;johnsnow&amp;#39; }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Admins still need to sign up in order to define a password, but they already have authorization to login.&lt;/p&gt;
&lt;h2 id="open-signup"&gt;&lt;strong&gt;Open SignUp&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Although the default workflow can be useful for avoiding unwanted people to enter the system, it can lead to a bottleneck if you have a lot of users that need to quickly enter the system. So, one option is to allow everyone in, and later block any users you don’t want to access your system.&lt;/p&gt;
&lt;p&gt;To do this, you need to activate the Open SignUp feature on &lt;strong&gt;Native Authenticator&lt;/strong&gt;, which is done by adding the following line to the JupyterHub configuration file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;c.NativeAuthenticator.open_signup = True
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now the workflow is much simpler:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Workflow of Native Authenticator when you configured an Open Signup" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/images/004-1_6CFAojIq8vUuGUdWtRLOMg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Workflow of Native Authenticator when you configured an Open Signup&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="increasing-password-security"&gt;&lt;strong&gt;Increasing password security&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We wanted to give an option to increase security, if needed. So, with Native Authenticator you can add verification of strong passwords. But, what is indeed a “&lt;em&gt;strong password&lt;/em&gt;”? We followed &lt;a href="https://auth0.com/blog/dont-pass-on-the-new-nist-password-guidelines/"&gt;the NSIT guidelines described beautifully on this post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The first thing is that we added an option to see the password while typing. As said on the post:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Typos are common when entering passwords, and when characters turn into dots as soon as they’re typed, it’s difficult to tell where you went wrong. This motivates users to pick shorter passwords that they’re less likely to mess up&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, we added this on &lt;em&gt;SignUp&lt;/em&gt; and &lt;em&gt;Change Password&lt;/em&gt; (and soon to the login as well 🙃).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/images/005-1_kNVLn4UYGS58YAEGmsYLOA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Example of input box for passwords with hidden password (left) and open text password (right)" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/images/006-1_aSz7IYH4Ox-T4BUO53mx7Q.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Example of input box for passwords with hidden password (left) and open text password (right)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Also, you can add a verification for a minimum number of characters in a password by adding the value in the configuration file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;c.NativeAuthenticator.minimum_password_length = 10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will prevent users to signup if the password is less then 10 characters. An error message appears in case the password is not good enough:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Error indicating the password is not long enough" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/images/007-1_lD3D5a2W8GHc3g-J6A-hDQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Error indicating the password is not long enough&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Additionally, you can add a verification to avoid common passwords. Instead of asking for users to add special characters or upper case letters, the guide suggests to check for common passwords instead. Passwords such as &lt;code&gt;123456&lt;/code&gt; or &lt;code&gt;qwerty&lt;/code&gt; are common and not nearly secure enough. We used &lt;a href="https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/10-million-password-list-top-10000.txt"&gt;a list of 10 thousand common passwords&lt;/a&gt; that will be checked when this option is activated. To activate this verification add to the configuration file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;c.NativeAuthenticator.check_common_password = True
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="avoid-throttling-of-failed-login"&gt;Avoid throttling of failed login&lt;/h2&gt;
&lt;p&gt;Another thing that increases security is to block users when they’ve had a number of failed logins. &lt;a href="https://native-authenticator.readthedocs.io/en/latest/options.html#block-users-after-failed-logins"&gt;In &lt;strong&gt;Native Authenticator&lt;/strong&gt; you can activate this behavior.&lt;/a&gt; The system will add a count for every consecutive failed login attempt. If the user exceeds the number of attempts that is permitted, it will check if some time has passed since the last attempt. If not enough time has passed, the system will keep them blocked until they wait a while longer before attempting to sign-in again.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/images/008-1_BUap43L0AqEpdc_4YVA9xg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;As you can imagine, both the number of attempts permitted and the wait time are configurable.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;c.NativeAuthenticator.allowed_failed_logins = 3
c.NativeAuthenticator.seconds_before_next_try = 1200
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="how-we-accomplished-this"&gt;How we accomplished this&lt;/h2&gt;
&lt;p&gt;To construct this new Authenticator, Project Jupyter decided to get an intern (me!) through the &lt;a href="https://www.outreachy.org/"&gt;Outreachy&lt;/a&gt; Program. &lt;a href="https://github.com/jupyterhub/outreachy/blob/master/ideas/native-jupyterhub-user-management.rst"&gt;The description of the project&lt;/a&gt; was made in advance and potential interns applied by resolving a &lt;a href="https://github.com/jupyterhub/outreachy/issues?q=is%3Aopen+is%3Aissue+label%3Amicrotask"&gt;micro-task&lt;/a&gt; defined in a specific repository. The main workflow was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a profile on the Outreachy website;&lt;/li&gt;
&lt;li&gt;Submit a pull request for a micro-task of the project you want to participate;&lt;/li&gt;
&lt;li&gt;Fill a more complete profile about yourself;&lt;/li&gt;
&lt;li&gt;Wait for the selection 🤓&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full presentation of the Project Jupyter participation, a list of mentors, and more details can be seen on &lt;a href="/posts/2018/outreachy-jupyter-supporting-diversity-in-open/"&gt;this post&lt;/a&gt;, and more technical details on the micro-task I submitted can be seen &lt;a href="https://leportella.com/english/2018/12/12/outreachy-I.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="technical-details-and-day-to-day-development"&gt;Technical details and day-to-day development&lt;/h2&gt;
&lt;p&gt;There were a lot of struggles to get things going. As part of the Outreachy program, I had to write about the tasks and struggles I had in posts &lt;a href="https://leportella.com/"&gt;on my personal blog&lt;/a&gt;. If you would like to check the details for how the process went at each you can checkout each of the available posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leportella.com/english/2018/12/12/outreachy-I.html"&gt;Outreachy Report I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leportella.com/english/2019/01/11/outreachy-II.html"&gt;Outreachy Report II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leportella.com/english/2019/01/23/outreachy-III.html"&gt;Outreachy Report III&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leportella.com/english/2019/02/05/outreachy-IV.html"&gt;Outreachy Report IV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leportella.com/english/2019/02/21/outreachy-V.html"&gt;Outreachy Report V&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See ya :)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/simpler-authentication-for-small-scale-jupyterhubs-with/images/009-fWgAW7WZtPMBjmpa3V-giphy.mp4" alt="See Ya Kiss GIF by CBC" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterHub"/><category term="Outreachy"/></entry><entry><title>Outreachy &amp; Jupyter: Supporting diversity in open communities</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2018/outreachy-jupyter-supporting-diversity-in-open/" rel="alternate"/><published>2018-11-28T17:26:00+00:00</published><updated>2018-11-28T18:35:00+00:00</updated><author><name>yuvipanda</name></author><id>tag:jasongrout.github.io,2018-11-28:/medium-archive/pelican/posts/2018/outreachy-jupyter-supporting-diversity-in-open/</id><summary type="html">&lt;p&gt;Project Jupyter has accepted 2 interns through the Outreachy program, which supports open community members from under-represented…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/outreachy-jupyter-supporting-diversity-in-open/images/001-1_OsCmvuJ-lLeC7UtWK8CkNA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Project Jupyter has accepted 2 interns through the &lt;a href="https://www.outreachy.org/"&gt;Outreachy program&lt;/a&gt;, which supports open community members from under-represented backgrounds. Our Outreachy interns will work on important problems in the JupyterHub community with help from 2 mentors from December 2018 through March 2019. This is a short post describing why Jupyter is committing to this program, as well as what we’ll be working on with our Outreachy participants.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We are grateful to the Berkeley Institute for Data Science &amp;amp; NumFocus for jointly sponsoring our interns. This article is cross-posted with the&lt;/em&gt; &lt;a href="https://bids.berkeley.edu/news/outreachy-jupyter-supporting-diversity-open-communities"&gt;&lt;em&gt;Berkeley Institute for Data Science blog&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why-focus-on-diversity-and-inclusion"&gt;Why focus on diversity and inclusion?&lt;/h2&gt;
&lt;p&gt;The tech industry isn’t doing great on diversity, and the Open Source community &lt;a href="https://www.wired.com/2017/06/diversity-open-source-even-worse-tech-overall/"&gt;is doing worse&lt;/a&gt; . This limits the community’s ability to tackle challenging, diverse projects. The amount of responsibility and power held by open source communities is increasing, so we have a responsibility to be more representative of the diversity present in our world. Many projects grow their community by encouraging people to start making small patches on their own. However, &lt;a href="https://www.ashedryden.com/blog/the-ethics-of-unpaid-labor-and-the-oss-community"&gt;requiring uncompensated work&lt;/a&gt; is a big barrier to getting more diverse representation in our open source communities. Paid internships with dedicated mentors are a great way to help people break through this particular barrier and make the open source community more diverse.&lt;/p&gt;
&lt;h2 id="what-is-outreachy"&gt;What is Outreachy?&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://outreachy.org"&gt;Outreachy&lt;/a&gt; is an internship program coordinated by the &lt;a href="https://sfconservancy.org/"&gt;Software Freedom Conservancy&lt;/a&gt;. It is run twice a year with a goal to bring people from underrepresented backgrounds in tech into open source projects. 21 open source organizations are participating in this round, and will be working with a total of 46–47 interns. Importantly, these are &lt;em&gt;paid&lt;/em&gt; internships, which make them more viable for a much broader slice of the population. Jupyter and BIDS will both contribute funding and mentorship for two Outreachy interns.&lt;/p&gt;
&lt;h2 id="our-interns-and-mentors"&gt;Our Interns and Mentors&lt;/h2&gt;
&lt;p&gt;We have two amazing interns for this Outreachy round, working on important projects in the JupyterHub ecosystem. Below we’ll describe the projects that they’ll work on.&lt;/p&gt;
&lt;h2 id="a-highly-available-proxy-for-jupyterhub-link"&gt;A highly Available Proxy for JupyterHub (&lt;a href="https://github.com/jupyterhub/outreachy/blob/master/ideas/traefik-jupyterhub-proxy.rst"&gt;link&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Georgiana Dolocan will be mentored by Min RK and Yuvi Panda in building &lt;a href="https://github.com/jupyterhub/outreachy/blob/master/ideas/traefik-jupyterhub-proxy.rst"&gt;a highly available &amp;amp; scalable proxy for JupyterHub&lt;/a&gt; using the &lt;a href="https://traefik.io/"&gt;Traefik&lt;/a&gt; project. This will help JupyterHub deployments scale more easily for thousands of active users with minimal service disruptions. Georgiana will be working from Bucharest, Romania where she likes to paint and explore the city and the villages nearby alongside her dog and camera.&lt;/p&gt;
&lt;h2 id="improvements-to-user-management-link"&gt;Improvements to user management (&lt;a href="https://github.com/jupyterhub/outreachy/blob/master/ideas/native-jupyterhub-user-management.rst"&gt;link&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leportella.com/"&gt;Leticia Portella&lt;/a&gt; will be mentored by Yuvi Panda and Min RK in building &lt;a href="https://github.com/jupyterhub/outreachy/blob/master/ideas/native-jupyterhub-user-management.rst"&gt;better native user management features&lt;/a&gt; into JupyterHub. Small to medium installations of JupyterHub that do not want to depend entirely on an external authentication provider will benefit greatly from this. Leticia will be working from Dublin, Ireland (although she used to live in Florianópolis, Brazil), where she likes to read a lot (especially The Chronicles of Ice and Fire), to swim, and to work on her podcast (the first Brazilian podcast specialized in Data Science topics), &lt;a href="https://pizzadedados.com/"&gt;Pizza de Dados&lt;/a&gt; (Data Pizza, free translation).&lt;/p&gt;
&lt;h2 id="about-our-mentors"&gt;About our mentors&lt;/h2&gt;
&lt;p&gt;Outreachy requires more than just funding, but also mentorship. Two members of the JupyterHub community have offered their time to help mentor our Outreachy contributors, some information about them is below!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/minrk"&gt;Min RK&lt;/a&gt; is a research engineer at Simula Research Laboratory in Norway and has been working on the IPython and Jupyter open source projects since joining in 2006 as an undergraduate in Engineering Physics at Santa Clara University with Brian Granger, one of the founders of the Jupyter project. Min currently focuses on JupyterHub, and is excited to welcome new folks to the Jupyter team.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://yuvi.in"&gt;Yuvi Panda&lt;/a&gt; is an operations engineer at University of California, Berkeley. He works at the &lt;a href="https://bids.berkeley.edu/"&gt;Berkeley Institute for Data Science&lt;/a&gt;, where he maintains the JupyterHub infrastructure for the &lt;a href="https://data.berkeley.edu/"&gt;Division of Data Sciences&lt;/a&gt;. He has been involved in various Open Source communities in the last ten years, spending time in the GNOME, Wikimedia &amp;amp; Jupyter communities. His life was changed drastically by participating as a student in Google Summer of Code 2010, and he’s excited to give back to the Open Source community.&lt;/p&gt;
&lt;p&gt;We would like to thank everyone who applied to JupyterHub for this round of Outreachy. We received a number of robust proposals, out of which we were only able to accept two. JupyterHub mentors spent quite a lot of time mentoring candidates during the application period, in reviewing their pull requests, and giving them feedback on their proposals. We look forward to bringing these new open source contributors into our community, and hope that we can set a path that other open source projects may follow in the future. Open source works best when it is diverse and inclusive, we think this is a small step in that direction.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://people.eecs.berkeley.edu/~odemasi/"&gt;Orianna DeMasi&lt;/a&gt;, &lt;a href="https://sastoudt.github.io/"&gt;Sara Stoudt&lt;/a&gt;, &lt;a href="https://predictablynoisy.com/"&gt;Chris Holdgraf&lt;/a&gt; &amp;amp; others for contributing heavily to this blog post.&lt;/p&gt;
</content><category term="community"/><category term="diversity"/><category term="Outreachy"/></entry></feed>