<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Data</title><link>https://jwheel.org/tags/data/</link><description>Homepage of Justin Wheeler, an Open Source contributor and Free Software advocate from Georgia, USA.</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>Justin Wheeler</managingEditor><lastBuildDate>Tue, 15 Nov 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://jwheel.org/rss/tags/data/index.xml" rel="self" type="application/rss+xml"/><item><title>Scrub gently: On data scrubbing in a community survey.</title><link>https://jwheel.org/blog/2022/11/scrub-gently-community-survey/</link><pubDate>Tue, 15 Nov 2022 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2022/11/scrub-gently-community-survey/</guid><description><![CDATA[<p>Recently, my team with the <a href="https://chaoss.community/">CHAOSS Project</a> had a data concern emerge when I was working on a project to run a community survey. This community had never run a survey before, and it was the first notable event where the project made an explicit, structured ask for feedback from the community. As a result, this first experience was also a calibration event, so we could guide this kind of work in future years.</p>

<h2 id="survey-says-what">Survey says: What?&nbsp;<a class="hanchor" href="#survey-says-what" aria-label="Anchor link for: Survey says: What?">🔗</a></h2>
<p>At some point, after we opened the survey, a question emerged about how to handle an unruly response. In the ongoing responses, our data manager noticed one response that was objectively harmful. The person was strongly against the D.E.I. initiative that organized the survey. The response was written in a hostile tone, made insulting and derogatory comments about groups of people, and was entirely opposed to the project spending any time and resources on diversity, equity, and inclusion. The question asked to our group was whether we would include this response in the published data, or whether we would omit it.</p>
<p>There were two perspectives. Some elected to remove this response from the final report and any published data. Others felt it was important to wait and see if this response would become a pattern as we ran the survey. I found myself in the second group that felt it was important to wait and see first. I want to unpack this rationale, both for future me and perhaps someone else reading.</p>

<h2 id="on-discarding-the-survey-response">On discarding the survey response&nbsp;<a class="hanchor" href="#on-discarding-the-survey-response" aria-label="Anchor link for: On discarding the survey response">🔗</a></h2>
<p>There were good points about removing the harmful response.</p>
<p>Firstly, the response used harmful language and was likely triggering. This particular response included angry rhetoric that was reflective, to a degree, of the social and political &ldquo;climate&rdquo; of our world today. Including the response in our final reporting could also be giving it a platform, which would arguably be a harmful act. It would validate that input as acceptable input. Our group was not in disagreement that the response was harmful and not behavior the community should tolerate.</p>
<p>Second, the response did not provide actionable insight or useful asks to the project and community. It was written in an aggressive, angry tone towards the reader and did not offer workable suggestions other than ending and divesting from all D.E.I. work immediately. Given this was not an acceptable option, there wasn&rsquo;t much there for us to learn or understand about CHAOSS from this individual response. So, why include or save this response?</p>
<p>There is an option to ignore feedback by intentionally discarding it, but what if the individual feedback represents a larger trend?</p>

<h2 id="what-is-community-culture">What is community culture?&nbsp;<a class="hanchor" href="#what-is-community-culture" aria-label="Anchor link for: What is community culture?">🔗</a></h2>
<p>It is important to be aware of threats to community culture. What is community culture? My improvised definition is any organizational culture oriented towards the care, well-being, and thriving of others (including the self) within a single, shared community environment. Regardless of other values and goals in a project, the shared culture of the project can either lean towards a collective, communal-oriented approach or an independent, individual-oriented approach. The communal approach that prioritizes the well-being of all instead of a privileged view could also be considered as community culture. Many traditional &ldquo;Open&rdquo; projects skew toward a strong community culture.</p>

<h2 id="on-monitoring-survey-responses-for-a-pattern">On monitoring survey responses for a pattern&nbsp;<a class="hanchor" href="#on-monitoring-survey-responses-for-a-pattern" aria-label="Anchor link for: On monitoring survey responses for a pattern">🔗</a></h2>
<p>Coming back to the survey response, what if omitting the data leaves holes in the story of your community? If there is not just one, but several of these kinds of responses, what comments does that make about the community culture? Is there already a strong community culture, or is there resistance and challenges to building a more cooperative, caring environment? There is real work to do at both ends of the spectrum, but what that work might look like depends on which side you are on.</p>
<p>I posit that omitting the &ldquo;unhappy&rdquo; or harmful responses can create a dangerous blind spot to toxicity within a community culture. When it comes to direct, interpersonal interactions with others (e.g. meetings, emails, chats, etc.), stewards of the community culture need to take direct action against visible challenges and threats to the community culture. If someone starts swearing out at someone in a meeting, that is a hard-to-miss action. It is visible, and anyone could observe it or even record it.</p>
<p>In anonymous surveys, you might find a more subtle layer of the community culture than what is shown by the actions of a small few. There can be greater trust that someone&rsquo;s comments will not be tied back to their identity, so some responders may feel emboldened with their words and true opinions.</p>

<h2 id="dont-discard-a-blind-spot">Don&rsquo;t discard a blind spot.&nbsp;<a class="hanchor" href="#dont-discard-a-blind-spot" aria-label="Anchor link for: Don&rsquo;t discard a blind spot.">🔗</a></h2>
<p>The point of this is that especially in larger communities, it is worth noting negative and harmful responses and not totally ignoring them. Communities that organize in more decentralized ways will always have supporters, users, and contributors from both the core and the periphery. The core project membership may not interact or engage often with the periphery often, so there can be a blind spot to parts of the project that identify with the community but are a few degrees removed from the inner ring of the project community.</p>
<p>Noting whether something is indicative of a larger pattern is important. If your community has a ton of jerks, you need to know that your community is full of jerks so that you don&rsquo;t waste time persuading people otherwise, when the lived experience is very different.</p>
<p>In the original conversation with the CHAOSS Project team, this data scrubbing question emerged in the process of running the survey instead of <em>after</em> the data collection concluded. The survey later closed and our data manager confirmed that the flagged response from earlier was the only one of its kind. As a group, we then felt more confident in discarding that one outlier as an anomaly since the survey was open to the general public.</p>
<hr>
<p><em>Feature photo by <a href="https://unsplash.com/@jeshoots?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">JESHOOTS.COM</a> on <a href="https://unsplash.com/s/photos/cleaning?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>. Modified by Justin Wheeler.</em></p>]]></description></item><item><title>CHAOSS DEI Review: Midyear reflection</title><link>https://jwheel.org/blog/2022/10/chaoss-dei-review-reflection/</link><pubDate>Tue, 25 Oct 2022 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2022/10/chaoss-dei-review-reflection/</guid><description><![CDATA[<p>Since February 2021, the CHAOSS Project is conducting a funded, long-term review of its governance, practices, and processes in a diversity, equity, and inclusion (D.E.I.) &ldquo;audit.&rdquo; I originally joined as an internal community liaison and initially helped to identify a team of D.E.I. practitioners external to the CHAOSS Project to support this work. Thanks to the support of the Ford Foundation, we are slowly approaching the two-year anniversary of when this work began.</p>
<p>My brief readout is a guided reflection using questions shared by Matt Germonprez. This reflects my review of our work as a team to date and also shares some of my hopeful outlooks for what our amazing team can accomplish together. This readout will cover <strong>(1)</strong> our accomplishments as a team, <strong>(2)</strong> what was expected and surprising, and <strong>(3)</strong> what we could change in the next year.</p>

<h2 id="chaoss-accomplishments--learnings">CHAOSS accomplishments &amp; learnings&nbsp;<a class="hanchor" href="#chaoss-accomplishments--learnings" aria-label="Anchor link for: CHAOSS accomplishments &amp; learnings">🔗</a></h2>
<p>Three achievements and aspirations stand out over the past year:</p>
<ol>
<li>Established process management and a team workflow.</li>
<li>Created a small but active Community of Practice (CoP).</li>
<li>Sharing our results with CHAOSS and the Open ecosystem.</li>
</ol>

<h3 id="processes--workflow">Processes &amp; workflow&nbsp;<a class="hanchor" href="#processes--workflow" aria-label="Anchor link for: Processes &amp; workflow">🔗</a></h3>
<p>
<figure>
  <img src="/blog/2022/10/jonny-gios-4AT3mZMuFuI-unsplash.jpg" alt="A metalworker is working at an anvil. A red-hot iron rod is on the anvil, and a person uses a hammer to shape and mold the hot iron into a hooked shape." loading="lazy">
  <figcaption>We had to forge our own practices that worked best for our group. Photo by Jonny Gios (<a href="https://unsplash.com/@supergios?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/@supergios?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>) on Unsplash (<a href="https://unsplash.com/s/photos/forge?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/s/photos/forge?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>).</figcaption>
</figure>
</p>
<p>For direct participants of the team, the Ford Foundation funding did not come with strict requirements or success metrics. As we assembled our team, we were given the discretion of how to conduct a D.E.I. review for the project and determine the best course of doing that. This allowed for creative freedom to figure out what would work best for CHAOSS. Additionally, I could not identify a straightforward way to discover other Open communities and projects doing our kind of work. Since there were also not many other known successful models to follow, we combined our shared experiences across multiple Open communities to build our team, identify main areas of focus, and engage the community around our efforts.</p>
<p>This is an achievement because we collectively created an active group that makes incremental, positive changes to CHAOSS. This is a model we could share with other projects so that others can learn from our experiences.</p>

<h3 id="community-of-practice">Community of Practice&nbsp;<a class="hanchor" href="#community-of-practice" aria-label="Anchor link for: Community of Practice">🔗</a></h3>
<p>Our team is a small but engaged group of D.E.I. practitioners. We share a connection through our ongoing review of the CHAOSS Project, but we also give and take from our own personal experiences outside of CHAOSS. Our group regularly meets and discusses complex, difficult issues that are both (a) not easy to discuss openly and (b) applicable to many communities beyond only CHAOSS. Our team meetings are a safe space that promotes honest and constructive discussion centered on diversity, equity, and inclusion. In addition to our recommendations and direct efforts with CHAOSS, I often reflect on our conversations as a team when working with other Open communities. An example of this is how we built a list of questions to get a &ldquo;pulse&rdquo; from the community on their feelings about CHAOSS.</p>

<h3 id="sharing-results-with-chaoss-and-beyond">Sharing results with CHAOSS and beyond&nbsp;<a class="hanchor" href="#sharing-results-with-chaoss-and-beyond" aria-label="Anchor link for: Sharing results with CHAOSS and beyond">🔗</a></h3>
<p>This is aspirational and not yet fully realized. Our team has collected a solid portfolio of stories and experiences that other communities would stand to benefit learning from. I consider this a current achievement because while our work does specifically look at CHAOSS, we also often reflect from a general perspective and how a topic of interest might look in other communities. When the time comes to package our findings, I believe we are setting ourselves up for easier messaging and outreach opportunities in the future.</p>

<h2 id="according-to-expectations">According to expectations&nbsp;<a class="hanchor" href="#according-to-expectations" aria-label="Anchor link for: According to expectations">🔗</a></h2>
<p>While I have worked in Open Source D.E.I. communities since 2015, I have never conducted an applied research review for community D.E.I. before. I did not come into this with strong immediate expectations because it would inevitably reflect the backgrounds and strengths of the team we would assemble. However, I did have specific hopes or things I hoped would be realized by this work.</p>

<h3 id="as-expected">As expected&nbsp;<a class="hanchor" href="#as-expected" aria-label="Anchor link for: As expected">🔗</a></h3>
<ul>
<li><strong>Data-driven approach</strong>: We began this work without a strong representation of the state of CHAOSS. What do contributors think about the project? While data is not a universal panacea, we gravitated to a community survey early on because we needed to understand the community experience better first before making serious suggestions.</li>
<li><strong>Time zones are hard</strong>: Our team was spread out across North America, Africa, LATAM, and Europe. Additionally, the work with CHAOSS was also a part-time venture for most of us, in addition to primary employment. Calendars and schedules are hard to get right. Since our team&rsquo;s organization was ad-hoc, momentum would occasionally slow for some periods.</li>
<li><strong>We have an amazing team!</strong> I expected great things once we identified our roster. We have also had more amazing people join us over time and add new passion and insight to our focus as a group.</li>
</ul>

<h3 id="surprises">Surprises&nbsp;<a class="hanchor" href="#surprises" aria-label="Anchor link for: Surprises">🔗</a></h3>
<ul>
<li><strong>Documenting our impact is not always intuitive</strong>: While we have done internal storytelling work within the CHAOSS Project, we do not have a good record of our achievements to date. Our linear progression does not lend itself easily to self-reflection and recalibration. Although much of our focus is on the CHAOSS community survey and CHAOSS Africa, we also facilitated several other notable achievements in the project in the last year. See the following examples:
<ul>
<li>Supporting the establishment of a Code of Conduct Committee.</li>
<li>Community office hours for newcomers.</li>
<li>Improved, peer-to-peer onboarding experience in CHAOSS.</li>
<li>Increased efforts in CHAOSS mentored projects (e.g. Outreachy and GSoC).</li>
<li>Recommending changes to the project and community, like broader localization to Chinese &amp; Spanish and establishing a D.E.I. council.</li>
</ul>
</li>
<li><strong>Losing and regaining steam on the survey</strong>: Although the community pulse survey was one of the earliest tasks identified in our work, launching a first survey proved to take a lot of resources from the team. We briefly stalled out on the survey effort while focused on other areas (like listed above). While our team was able to achieve many smaller victories for CHAOSS with low-hanging fruits, it took a sustained focus and slowdown on new topics to achieve larger contributions like the community pulse survey.</li>
</ul>

<h2 id="changes-for-the-chaoss-team-next-year">Changes for the CHAOSS team next year&nbsp;<a class="hanchor" href="#changes-for-the-chaoss-team-next-year" aria-label="Anchor link for: Changes for the CHAOSS team next year">🔗</a></h2>
<p>Looking ahead to 2023, I hope to strengthen our efforts as a team in these areas:</p>
<ol>
<li>Packaging our work</li>
<li>Dissemination of our work</li>
</ol>
<p>
<figure>
  <img src="/blog/2022/10/christophe-rollando-uOi-nHgMR5o-unsplash.jpg" alt="Large, gold-colored balloons spell out 2023. Several other silver-colored objects surround the gold letters, like star-shaped balloons, tree ornaments, and card-stock stars." loading="lazy">
  <figcaption>Photo by Christophe Rollando (<a href="https://unsplash.com/@chrisrolls?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/@chrisrolls?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>) on Unsplash (<a href="https://unsplash.com/s/photos/2023?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/s/photos/2023?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>).</figcaption>
</figure>
</p>

<h3 id="packaging">Packaging&nbsp;<a class="hanchor" href="#packaging" aria-label="Anchor link for: Packaging">🔗</a></h3>
<p>Our work stream was linearly ordered and we took a forward-looking approach. Now is a good time to look back and reflect on our results to date. What are our key findings and observations? What suggestions will we make to CHAOSS? How could other communities learn from our experience running this review? One task for us as a team is to identify key messages and themes so that dissemination into broader domains is possible.</p>

<h3 id="dissemination">Dissemination&nbsp;<a class="hanchor" href="#dissemination" aria-label="Anchor link for: Dissemination">🔗</a></h3>
<p>Once we package our work, notes, and reflections, we should take an active approach to disseminating and sharing our work. This includes both the CHAOSS Project and a more general audience. For the CHAOSS Project, this could be a written report, presentations to the CHAOSS board, speaking at <a href="/tags/chaosscon/">CHAOSScon</a>, and outreach to the multiple Working Groups. For a general audience, this could include speaking at industry conferences, sharing our work with other Communities of Practice, social media, or other ways of promoting our deliverables.</p>]]></description></item><item><title>4 metrics to measure sustainable open source investments.</title><link>https://jwheel.org/blog/2021/12/4-metrics-open-source-investments/</link><pubDate>Fri, 31 Dec 2021 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2021/12/4-metrics-open-source-investments/</guid><description><![CDATA[<p>How do we understand value when we talk about sustainability? What does investing in open source mean? The meaning is different for many people because of an implicit understanding of what open source means.</p>
<p>This post is a reflection on the past year in my work with the <a href="https://www.unicefinnovationfund.org/">UNICEF Venture Fund</a>. We integrated new open source tools to capture metrics and data about open source repositories connected to UNICEF portfolio companies and created a shortlist of key metrics that map to business sustainability metrics. Now, we are better positioned to look back on past, current, and upcoming portfolio companies and mentor support programs.</p>
<p>As we move into 2022, this post covers my current thinking on these points:</p>
<ol>
<li>Defining investments.</li>
<li>How do these investments impact sustainability?</li>
<li>CHAOSS metrics as an open source tool for an investment lens on sustainability.</li>
<li>What next?</li>
</ol>

<h2 id="defining-investments">Defining investments.&nbsp;<a class="hanchor" href="#defining-investments" aria-label="Anchor link for: Defining investments.">🔗</a></h2>
<p>When we talk about investing in open source, what do we mean? What are the known inputs? What are the expected outputs? &ldquo;Investments&rdquo; and &ldquo;investing&rdquo; are broad terms. Investments typically mean sizeable financial injections of support and growth, but can also include non-financial investments too. Investments can also take the form of both time and energy (i.e. electricity and digital infrastructure).</p>
<p>The UNICEF Venture Fund provides equity-free funding for start-up companies building open source solutions of interest to UNICEF. All the start-up companies are registered companies in <a href="https://www.unicef.org/where-we-work">UNICEF program countries</a>. As part of the Venture Fund&rsquo;s location in the <a href="https://www.unicef.org/innovation/">Office of Innovation</a>, it is also a vehicle for UNICEF to explore frontier technology areas through the investments. When a start-up company is receiving investment from UNICEF, the company receives both funding and tailored mentorship about business and open technology.</p>
<p>A question I want to know is, <strong>what is the impact of the received funding plus guided mentorship</strong>? How does this approach enable the companies to be successful after graduating? What discoveries or knowledge could be shared with others to assist the development of their own open programs?</p>
<p>To summarize, <strong>an investment can be financial or non-financial</strong>. Financial investments include direct funding, grants, venture capital, fellowships, or any other exchange of capital. Non-financial investments include time spent in coaching sessions, personalized content for companies, and shared digital infrastructure. Neither list is exhaustive.</p>

<h2 id="how-do-these-investments-impact-sustainability">How do these investments impact sustainability?&nbsp;<a class="hanchor" href="#how-do-these-investments-impact-sustainability" aria-label="Anchor link for: How do these investments impact sustainability?">🔗</a></h2>
<p>
<figure>
  <img src="https://cauldron.io/static/img/cauldron-logo-white.png" alt="Logo for Bitergia&rsquo;s Cauldron hosted analytics platform. A key part of metrics for UNICEF Venture Fund investments." loading="lazy">
  <figcaption>Bitergia Cauldron.io (<a href="https://cauldron.io" class="bare">https://cauldron.io</a>)</figcaption>
</figure>
</p>
<p>Data makes introspection easier. Bitergia&rsquo;s <a href="https://cauldron.io/">Cauldron.io</a> was a champion tool for kickstarting an open source metrics strategy for the UNICEF Venture Fund. Its introduction as a tool opened up a wider span of data to look at. There are new opportunities to ask questions and explore growth, scale, and sustainability.</p>
<p>In order to come to a conclusion on sustainability impact, we need streamlined data to test a thesis. The Venture Fund team improved internal processes to how metrics are collected from portfolio companies. The team is unifying behind fewer tools and methods to ensure we see the same data and have the same view of the data points we measure. This also provides a fresh opportunity to review how we measure open source impact across portfolio companies. Many have dashboards on Cauldron.io, but data needs a storyteller for it to make meaning. So, the next step is to ask questions with this new data and frame a thesis to measure and test the sustainability of Venture Fund investments into open source.</p>
<p>Many have traveled before me on the same trail of thought. I started first with the <a href="https://chaoss.community/">Community Health Analytics Open Source Software (CHAOSS) project</a> and its metrics releases. This served as the initial point of brainstorming to frame questions and different scenarios of risk, evolution, DEI, and value.</p>

<h2 id="chaoss-metrics-as-an-open-source-tool-for-an-investment-lens-on-sustainability">CHAOSS metrics as an open source tool for an investment lens on sustainability.&nbsp;<a class="hanchor" href="#chaoss-metrics-as-an-open-source-tool-for-an-investment-lens-on-sustainability" aria-label="Anchor link for: CHAOSS metrics as an open source tool for an investment lens on sustainability.">🔗</a></h2>
<p>I reviewed the <a href="https://chaoss.community/wp-content/uploads/2021/10/English-Release-2021-10-21.pdf">latest release</a> of CHAOSS metrics and narrowed down four metrics I want to measure in the next year. I also shared thoughts on why collect this data and how to do it. This blog post is no more than me wondering out loud, to help me frame an analytical approach for this metrics strategy.</p>
<p>The four metrics are detailed below:</p>
<ol>
<li>Contribution Attribution</li>
<li>Contributors</li>
<li>Collaboration Platform Activity</li>
<li>Labor Investment</li>
</ol>
<p>
<figure>
  <img src="/blog/2021/12/glenn-carstens-peters-RLw-UC03Gwc-unsplash.jpg" alt="A hand holds a pen and is writing on a sheet of notebook paper. They appear to be making a list." loading="lazy">
  <figcaption>Take note of your dependencies and contributors.
<em>Photo by Glenn Carstens-Peters (<a href="https://unsplash.com/@glenncarstenspeters?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/@glenncarstenspeters?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>) on Unsplash (<a href="https://unsplash.com/s/photos/lists?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/s/photos/lists?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>)</em>.</figcaption>
</figure>
</p>

<h3 id="contribution-attribution"><a href="https://chaoss.community/metric-contribution-attribution/">Contribution Attribution</a>&nbsp;<a class="hanchor" href="#contribution-attribution" aria-label="Anchor link for: Contribution Attribution">🔗</a></h3>
<blockquote>
<p>Question: Who has contributed to an open source project and what attribution information about people and organizations is assigned for contributions?</p>
<p><a href="https://chaoss.community/metric-contribution-attribution/">chaoss.community/metric-contribution-attribution/</a></p>
</blockquote>
<p>This metric is insightful because it is targeted deeply into team and project culture. This metric is a good representation of how much the project leans into an open source model of building their project. This work ethos and intention to forge on an open source path is difficult to understand at times. If a team takes care to attribute their software dependencies and other contributors to their code (if any), this is a good sign that the team accepts collaboration as a value and encourages working with others.</p>
<p>I would measure this across two <a href="https://chaoss.community/metric-types-of-contributions/">types of contributions</a>: attributions for software dependencies including those with permissive licenses, and for any other direct contributors to the code and how they are recognized for their participation. This could be filtered in a red-yellow-green light approach:</p>
<ol>
<li><strong>Red</strong>: No attributions are made, or all attributions are inadequate.</li>
<li><strong>Yellow</strong>: One of two attributions are made, or one attribution type is inadequately attributed.</li>
<li><strong>Green</strong>: All dependencies and used works are correctly attributed.</li>
</ol>
<p>
<figure>
  <img src="/blog/2021/12/alex-hudson-m3I92SgM3Mk-unsplash.jpg" alt="View looking down at a small farmer&rsquo;s market, where a woman sits behind several different cases of vegetables. A man hands payment to the woman for unseen goods. This is connected how knowing your customers can also be like knowing your community." loading="lazy">
  <figcaption>Spend more time getting to know who participates and why.
<em>Photo by Alex Hudson (<a href="https://unsplash.com/@aliffhassan91?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/@aliffhassan91?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>) on Unsplash (<a href="https://unsplash.com/s/photos/bazaar?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/s/photos/bazaar?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>)</em>.</figcaption>
</figure>
</p>

<h3 id="contributors"><a href="https://chaoss.community/metric-contributors/">Contributors</a>&nbsp;<a class="hanchor" href="#contributors" aria-label="Anchor link for: Contributors">🔗</a></h3>
<blockquote>
<p>Question: Who are the contributors to a project?</p>
<p><a href="https://chaoss.community/metric-contributors/">chaoss.community/metric-contributors/</a></p>
</blockquote>
<p>This metric explores a more human dimension of the people and participants to an open source project. The metric defines contributors and contributions broadly, as &ldquo;anyone who contributes to the project in any way.&rdquo; Understanding the people participating in a community, their motivations, goals, and why they choose to be in that community is important to understand sustainability. Otherwise, you may lose out on good opportunities to attract contributions from people who are already engaged, and new engagements may be difficult because of a mismatch of expectations.</p>
<p>This metric is more a means than it is an end; that is, it provides opportunities to ask more questions than provide detailed answers. Nevertheless, it does provide some guidance towards understanding contributors in a project, and it can lead to some concrete actions based on gathered insights. For example, this metric will enable deeper looks in areas of diversity, equity, and inclusion.</p>
<p>Since I work with start-up companies with small, lean development teams, I look to understand the motivations of the developers working on their projects and where the motivations may align with another open source solution. This enables the two communities to leverage their combined brainstorming for meeting complimentary goals around development and innovation.</p>
<p>To collect this data, I would have the team define what <a href="https://chaoss.community/metric-types-of-contributions/">areas of contribution</a> they seek for their open source solutions and then map those desired contributions to a specific project area or different team members. This enables a form of consistent accountability for checking expectations with reality and understanding team capacity. Each area could be a key-value pair, where the value is the project area, team lead, or delegated team member for the type of contribution solicited.</p>
<p>
<figure>
  <img src="/blog/2021/12/kai-dahms-5paXZX8lWk-unsplash.jpg" alt="The dashboard of an older plane is shown, with several different meters, switches, and control knobs. In many ways, the places where we collaborate on our projects can also be as complicated, and we can miss out on some useful features if we are not looking in the right place." loading="lazy">
  <figcaption>There are many ways to collaborate, but the question is, are you counting the right ways?
<em>Photo by Kai Dahms (<a href="https://unsplash.com/@dilucidus?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/@dilucidus?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>) on Unsplash (<a href="https://unsplash.com/s/photos/measure?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/s/photos/measure?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>)</em>.</figcaption>
</figure>
</p>

<h3 id="collaboration-platform-activity"><a href="https://chaoss.community/metric-collaboration-platform-activity/">Collaboration Platform Activity</a>&nbsp;<a class="hanchor" href="#collaboration-platform-activity" aria-label="Anchor link for: Collaboration Platform Activity">🔗</a></h3>
<blockquote>
<p>Question: What is the count of activities across digital collaboration platforms (e.g., GitHub, GitLab, Slack, email) used by a project?</p>
<p><a href="https://chaoss.community/metric-collaboration-platform-activity/">chaoss.community/metric-collaboration-platform-activity/</a></p>
</blockquote>
<p>Collaboration platform activity is one effective proxy metric for community engagement if measured accurately. The metric does not define collaboration as much as it provides a data structure to measure it. It abstracts collaboration into key data points like timestamp, sender, whether the platform has threaded or non-threaded discussions, data collection date, and platform message identifier. To a degree, collaboration can be abstracted out in this way: a person takes any given action at a given time in a given way, and this action is measured as project-related activity on the collaboration platform.</p>
<p>There are a few possible approaches to collecting this data from UNICEF Venture Fund companies. Each approach does not cancel out another, but each approach could be combined with the others:</p>
<ol>
<li><strong>Measure common git activity like commits, issues, pull/merge requests</strong>. We already measure this data, but use it only in connection to validating Venture Fund workplans for each team with UNICEF portfolio manager(s).</li>
<li><strong>Count communications like comments, reviews, public messages, and other outreach</strong>. Communications strategies and tools are typically inferred from common git activity. Measuring for engagement and stratifying those metrics into a smaller group could allow for deeper insights to the evolution of early-stage open source communities.</li>
<li><strong>Make community hubs first-class citizens in the data curation process to infer about informal engagement</strong>. Both open source projects and UNICEF Venture Fund portfolio companies use a variety of tools to communicate, especially in view of COVID-19 and its seismic impact on how we work. Platforms like Discord, Telegram, Mattermost, Slack, Rocket.chat, Matrix, and others are focal points where projects collaborate, ask questions, and support others. Bringing this data stream into the mix offers deeper insights into how teams engage and build community around their work, and also guidance on when to push for contribution opportunities at the right time.</li>
</ol>
<p>The satisfaction of these three options in their totality is not enough. To leverage the fullest impact, these metrics must tie into each other, and need to be connected back to a narrative. Why is this data being collected and what actions are influenced by the knowledge of this data? The data collection enables the evaluation of sustainability and understanding the birth, growth, and evolution of an open source technology product. Influenced actions can include moving more human resources (i.e. contractors or staff) to support a project, adopting a new open source best practice, and/or engaging new customers, talent, or other leads based on participation in the community.</p>
<p>Measuring collaboration platform activity is not black and white. Many new questions would likely come forward as part of measuring this activity. Yet this is the point—it lays the foundation for the next layer to the data collection, analysis, and reporting process around sustainability.</p>
<p>
<figure>
  <img src="/blog/2021/12/jon-tyson-kR4K8nJ9JRc-unsplash.jpg" alt="A man is facing forward with his back to the camera. He wears a heavy coat and a construction hard hat. The background is blurred and unclear. In this way, we can think of labor investment from a human-centered approach first." loading="lazy">
  <figcaption>What is the impact of an investment on fair and equitable labor?
<em>Photo by Jon Tyson (<a href="https://unsplash.com/@jontyson?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/@jontyson?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>) on Unsplash (<a href="https://unsplash.com/s/photos/worker?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" class="bare">https://unsplash.com/s/photos/worker?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText</a>)</em>.</figcaption>
</figure>
</p>

<h3 id="labor-investment"><a href="https://chaoss.community/metric-labor-investment/">Labor Investment</a>&nbsp;<a class="hanchor" href="#labor-investment" aria-label="Anchor link for: Labor Investment">🔗</a></h3>
<blockquote>
<p>Question: What was the cost of an organization for its employees to create the counted contributions (e.g., commits, issues, and pull requests)?</p>
<p><a href="https://chaoss.community/metric-labor-investment/">chaoss.community/metric-labor-investment/</a></p>
</blockquote>
<p>This metric is perhaps the most ambitious of the group. How do you measure labor investment into an open source project? Or literally, the number of person-hours that go into software design, development, co-creation, and community management? It feels like a gargantuan effort, but there may be better ways to measure this in connection to other data the UNICEF Venture Fund is already connected about the businesses.</p>
<p>Measuring labor investment impacts two narratives: the rate of development on the open source work, and the impact of UNICEF investment into a company backing an open source work.</p>
<p>Firstly, understanding the rate of development on an open source work is easier to infer by understanding who is allocated on a project and how much of their time they dedicate to it. If a team of three contributors spares a few hours a week, it will mean something different compared to a team of five engineers spread across different disciplines working full-time. Mapping the labor investment for open source projects supported by UNICEF would enable better planning by understanding the typical labor investment in open source workplan tasks as piloted by other Venture Fund portfolio companies.</p>
<p>Secondly, this gives us a new way of talking about the impact of UNICEF Venture Fund investments as an investment not only in software products but also in labor. It gives us insight into the investment of labor in software engineering talent among portfolio companies. How does this measurement change over time of the investment? Do projects receive more or less investment of labor during the 12 month period we work with them? This could also be used as a proxy metric for the impact of our unique mentorship and coaching opportunities.</p>

<h2 id="what-next">What next?&nbsp;<a class="hanchor" href="#what-next" aria-label="Anchor link for: What next?">🔗</a></h2>
<p>Knowing is half the journey. Even if the knowledge is not yet firmly rooted. The analysis and introspection are from me as an individual working among the UNICEF Venture Fund and do not represent the views and beliefs of UNICEF or the UN in any capacity. My intent is that by sharing this analysis in the open, it allows for a space where conversation can spark where it could not before. It also invites others to share ideas, feedback, and constructive criticism of an emerging metrics strategy for investments made into the open source ecosystem.</p>
<p>Next, more layers can be added and internal and external validation can help to keep this moving forward. An implementation plan would be the next step to follow this post. The implementation plan considers the process of how start-up companies move through the Venture Fund from start to finish. Who interacts with the companies and when? At what point is a company ready to begin building in a new metric or count in their monthly metrics? Do they understand the implications and assessments of these metrics? At what points in the process is data already being collected? Could these new data requests be added to existing requests? And so on.</p>
<p>I hope to formalize some of this new reporting and metrics strategy in upcoming cohorts in 2022, as part of a renewed effort into communicating how our open source investments tie into sustainable impact towards the U.N. Sustainable Development Goals.</p>
<p>This post will serve as a milestone marker on the metrics strategy discussion in the coming one to two months. See you in 2022.</p>
<hr>
<p><em>Featured photo by <a href="https://unsplash.com/@edwardhowellphotography?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Edward Howell</a> on <a href="https://unsplash.com/s/photos/sustainable?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>. Modified by Justin Wheeler. CC BY-SA 4.0</em>.</p>]]></description></item><item><title>Cryptographic Autonomy License (CAL-1.0): My first license review</title><link>https://jwheel.org/blog/2020/10/cryptographic-autonomy-license-cal-1-0/</link><pubDate>Wed, 28 Oct 2020 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2020/10/cryptographic-autonomy-license-cal-1-0/</guid><description><![CDATA[<p>The bookmark was creeping on my browser&rsquo;s toolbar for months. &ldquo;Cryptographic Autonomy License&rdquo; CAL-1.0 on the <a href="https://opensource.org/licenses/CAL-1.0">Open Source Initiative webpage</a>. But today, I decided it was time to do my first amateur license review. This is a fun exercise (for me). Remember, <strong>I am not a lawyer and this does not constitute legal advice</strong>!</p>
<p>The <strong>Cryptographic Autonomy License</strong> is one of newest Open Source licenses on the block. The Open Source Initiative <a href="https://lists.opensource.org/pipermail/license-review_lists.opensource.org/2020-February/004693.html">approved</a> it in February 2020. This license also made ripples when it came through. But the question I had, and <a href="/blog/2020/04/copyleftconf-2020-quick-rewind/">could not find a clear answer to</a>, was <em>why is it so interesting</em>?</p>
<p>This blog post is my attempt to do a casual coffee-table review of the license. If you agree or disagree, I encourage you to leave a comment and share your opinion and <strong>why</strong>!</p>
<p>This short article covers three sections:</p>
<ol>
<li><strong>CAL-1.0 provisions</strong>: What basic Free Software assumptions are present in the license, much like other copyleft licenses.</li>
<li><strong>What&rsquo;s fresh!!</strong>: What is the hype? Ready for the key information? It is covered here.</li>
<li><strong>Personal takeaways</strong>: My personal thoughts on this license and where it might be applicable.</li>
</ol>

<h2 id="cal-10-provisions">CAL-1.0 provisions&nbsp;<a class="hanchor" href="#cal-10-provisions" aria-label="Anchor link for: CAL-1.0 provisions">🔗</a></h2>
<p>I learned there are basic assumptions and expectations that are true for all Open Source licenses, per the <a href="https://opensource.org/osd-annotated">Open Source Definition</a>. Copyleft licenses also have different degrees of rigidity depending on context and use. So, what basic ingredients of a Free Software license are present in the Cryptographic Autonomy License?</p>
<p><em>Note</em>: The number in parentheses before each line is the corresponding section number in the license text.</p>

<h3 id="basic-legal-provisions">Basic legal provisions&nbsp;<a class="hanchor" href="#basic-legal-provisions" aria-label="Anchor link for: Basic legal provisions">🔗</a></h3>
<ul>
<li>(<em>6.0</em>) <strong>Disclaimer of warranty, limit on liability</strong>: If someone uses the software and it causes unexpected disastrous side effects, the Licensor cannot be held responsible.</li>
<li>(<em>2.0</em>) <strong>Receiving a license</strong>: Anyone can receive a CAL-1.0 license. To receive it, you just have to agree to its rules.</li>
<li>(<em>7.4</em>) <strong>Attorney fees</strong>: If a case involving noncompliance with the CAL-1.0 is brought to court, loser pays legal fees for prosecution and defense.</li>
<li>(<em>7.3</em>) <strong>No sub-licensing</strong>: You cannot add another license &ldquo;on top&rdquo; of the CAL-1.0.</li>
<li>(<em>3.0</em>) <strong>Patent clause</strong>: Got patents? This license is equipped to interface with external patent licenses.</li>
</ul>

<h3 id="permissive-provisions">Permissive provisions&nbsp;<a class="hanchor" href="#permissive-provisions" aria-label="Anchor link for: Permissive provisions">🔗</a></h3>
<ul>
<li>(<em>4.1</em>) <strong>Access</strong>: Source code must be made available over a network with this license.</li>
<li>(<em>4.3</em>) <strong>Attribution</strong>: Cite your sources. Retain all licensing, authorship, and/or attribution notices.</li>
</ul>

<h3 id="copyleft-provisions">Copyleft provisions&nbsp;<a class="hanchor" href="#copyleft-provisions" aria-label="Anchor link for: Copyleft provisions">🔗</a></h3>
<ul>
<li>(<em>4.1</em>) <strong>Modified Work</strong>: Changes to the original Work make it a Modified Work. Same license rules apply to a Modified Work.</li>
<li>(<em>5.2</em>) <strong>Reinstatement</strong>: A la GPLv3, for non-compliant derivative works, there is a 60 day grace period to come into compliance before your license is terminated.</li>
<li>(<em>4.5</em>) <strong>Combined Work Exception</strong>: Software in the Larger Work as well as the Larger Work as a whole may be licensed under the terms of your choice.</li>
<li><strong>Network use</strong>: A la AGPL, it also includes a trigger for network use.</li>
</ul>

<h2 id="whats-fresh">What&rsquo;s fresh!!&nbsp;<a class="hanchor" href="#whats-fresh" aria-label="Anchor link for: What&rsquo;s fresh!!">🔗</a></h2>
<p>The fresh take on this license from other licenses is all in <strong>4.2. Maintain User Autonomy</strong>:</p>
<blockquote>
<p>In addition to providing each Recipient the opportunity to have Access to the Source Code, You cannot use the permissions given under this License to interfere with a Recipient’s ability to fully use an independent copy of the Work generated from the Source Code You provide with the Recipient’s own User Data.</p>
<p>Section 4.2 Maintain User Autonomy: intro text</p>
</blockquote>
<p>My non-lawyer take on this is that user data plays a much more prominent role in the terms of this license than other copyleft licenses. Just like the AGPL was a response to the changing world of network services and cloud computing, the CAL-1.0 is a response to the changing world of machine learning and data science.</p>
<p>The CAL-1.0 seems to define &ldquo;user autonomy&rdquo; in the context of actually <em>using</em> the software, versus something more holistic like <a href="https://techautonomy.org/">Digital Autonomy</a>. In other words, if you are running CAL-1.0 software, you cannot interfere with requests for personal user data from your users.</p>
<p>This might not sound so radical, but it really is. It is a radical way to assert users&rsquo; ownership of their data. If you are the end user of a distributed or cloud-based app licensed under CAL-1.0, <strong>you are enabled (to some degree) to request copies of personal user data without interference or obfuscation.</strong></p>

<h3 id="cal-10-and-hatbrim-technologies">CAL-1.0 and Hatbrim Technologies&nbsp;<a class="hanchor" href="#cal-10-and-hatbrim-technologies" aria-label="Anchor link for: CAL-1.0 and Hatbrim Technologies">🔗</a></h3>
<p>To better explain this, consider this made-up example.</p>
<p>I am a product manager at Hatbrim Technologies. Hatbrim develops an integrated calendar application, <strong>Holocal</strong>, to store events, meetings, and reminders. Holocal is an integrated application that includes a front-end component, back-end component, and a machine learning algorithm. The algorithm offers tailored suggestions to reduce my meeting load based on my common meeting patterns with other events or activities I have planned.</p>
<p>Oraculous, a competing company to Hatbrim Technologies, creates a fork of Holocal called <strong>OraCal</strong>. It is almost functionally identical to Holocal except it also adds an integration to other services from Oraculous. However, OraCal also modifies the calendar optimization algorithm. It adds a periodic random event suggestion based on events and activities in your calendar.</p>

<h3 id="meanwhile-at-hatbrim">Meanwhile at Hatbrim…&nbsp;<a class="hanchor" href="#meanwhile-at-hatbrim" aria-label="Anchor link for: Meanwhile at Hatbrim…">🔗</a></h3>
<p>Since I am a product manager at Hatbrim, I turn to my trusty team of developers and ask them to explore the OraCal fork of Holocal. I am curious to know how their calendar optimization method works, since Oraculous must also release OraCal under the Cryptographic Autonomy License (CAL-1.0). My team of developers review the OraCal code, try making changes to Holocal, but we are unable to replicate this feature of OraCal in our environment.</p>
<p>Eventually, one developer runs OraCal internally, but optimized for our data. Still no luck to reproduce the nifty calendar event suggestion feature! Fortunately, the CAL-1.0 offers a protection here. So, the developer sends an email to Oraculous to request her personal user data from OraCal provided to her. Because the CAL-1.0 has provisions to prevent foul play or modifying the data, the developer receives a copy of her data and realizes another Oraculous tool was scrubbing and appending data for calendar predictions before it returned to OraCal.</p>
<p>In this hypothetical scenario, our developer is ultimately able to understand how the Modified Work is changed and how Oraculous adapted the original Work. Under another copyleft license like any GPL variant or the Mozilla Public License, a licensee has no obligation to share any user data with an end user. For any reason. Unless they happen to be nice or because another legal authority or body holds them accountable to share user data.</p>

<h2 id="cal-10-personal-takeaways">CAL-1.0 personal takeaways&nbsp;<a class="hanchor" href="#cal-10-personal-takeaways" aria-label="Anchor link for: CAL-1.0 personal takeaways">🔗</a></h2>
<p>Did I mention I am not a lawyer and this does not constitute legal or financial advice? In case I did not, <strong>I am not a lawyer and this does not constitute legal or financial advice</strong>.</p>
<p>This advice and interpretation of the license is raw and unfiltered. But you only read something for the first time but once. So, with all other contemporary issues in the Free Software world going on, I thought it would be a fun exercise to draft this blog post as I read through the Cryptographic Autonomy License for the first time.</p>
<p>Ultimately, my takeaways after reading and reflecting on the license a few times is this:</p>
<ol>
<li><strong>Lack of transparency in motivation</strong>: <a href="https://holo.host/">Holo</a>, the company behind the license, emphasizes all the good qualities of this license while sneakily dodging the fact that it is a mildly anti-competitive license for their business case.</li>
<li><strong>Precedent-setting</strong>: This is the first approved Open Source license that <a href="https://medium.com/holochain/why-cal-is-important-to-the-end-user-aec58b2ff730">explicitly does anything significant about data</a>. It will be interesting to see if this inspires other licenses that make definitions on data.</li>
<li><strong>Potentially powerful if picked up</strong>: If used more widely or in more popular projects, it has potential to disrupt the status quo of how Open Source thinks about user data and the autonomy of the end user.</li>
<li><strong>No defining moment</strong>: To my knowledge, CAL-1.0 lacks a significant defining moment since its approval. It is unclear what real-world noncompliance litigation looks like. It lacks the battle-testing of other copyleft licenses.</li>
</ol>
<p>I imagine I am not the only one who feels mutually excited and hesitant about the Cryptographic Autonomy License. I am not sure if it makes sense to apply to any of my work or to recommend as a default license to others yet. And licensing is only but one of many pathways in the Free Software legal and policy world. But nonetheless, it is an interesting Free Software development that is still maturing since February 2020.</p>
<hr>
<p><em>Photo by <a href="https://unsplash.com/@markusspiske?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Markus Spiske</a> on <a href="https://unsplash.com/s/photos/access?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>. Modified by Justin Wheeler.</em></p>]]></description></item><item><title>How five Queen songs went mainstream in totally different ways</title><link>https://jwheel.org/blog/2018/10/five-queen-songs-mainstream/</link><pubDate>Tue, 16 Oct 2018 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2018/10/five-queen-songs-mainstream/</guid><description><![CDATA[<p><a href="http://blog.musicbrainz.org/2018/10/16/five-queen-songs-mainstream/"><em>Originally published on the MusicBrainz blog.</em></a></p>
<p><a href="http://blog.musicbrainz.org/2018/10/16/five-queen-songs-mainstream/"></a></p>
<hr>
<p>Making graphs is easy. Making intuitive, easy-to-understand graphs? It&rsquo;s harder than most people think. At the <a href="https://www.rit.edu/">Rochester Institute of Technology</a>, the ISTE-260 (Designing the User Experience) course teaches the language of design to IT students. For an introductory exercise in the class, students are tasked to visualize any set of data they desire. Students <a href="https://www.linkedin.com/in/davidkim18/">David Kim</a>, <a href="https://www.linkedin.com/in/jathan-a/">Jathan Anandham</a>, <a href="https://www.linkedin.com/in/jwwheel/">Justin Wheeler</a>, and <a href="https://www.linkedin.com/in/scott-tinker-216962129/">Scott Tinker</a> used the MusicBrainz database to look at how five different Queen songs went mainstream in different ways.</p>

<h2 id="five-factors-of-queen">Five factors of Queen&nbsp;<a class="hanchor" href="#five-factors-of-queen" aria-label="Anchor link for: Five factors of Queen">🔗</a></h2>
<p>Our mini data science experiment decided to look at five unique data points available to us via <a href="https://musicbrainz.org/doc/Work">MusicBrainz Works</a>:</p>
<ul>
<li>Number of recorded covers</li>
<li>Number of artists who covered a song</li>
<li>Release year</li>
<li>Year of last recorded cover</li>
<li>Time elapsed between release year and year of last recorded cover</li>
</ul>
<p>Originally, we looked at songs from different artists, but decided to look at five recordings from the same artist. With Queen being a notoriously famous band, there were several data points to work with in terms of how often a song was covered.</p>
<p>
<figure>
  <img src="/blog/2018/10/Queen-data-visualization.png" alt="How five Queen songs went mainstream in totally different ways" loading="lazy">
  <figcaption><strong><em>Studying five Queen songs</em></strong>: Another One Bites the Dust, Bohemian Rhapsody, Don’t Stop Me Now, Fat Bottomed Girls, We Will Rock You</figcaption>
</figure>
</p>

<h2 id="making-sense-of-the-data">Making sense of the data&nbsp;<a class="hanchor" href="#making-sense-of-the-data" aria-label="Anchor link for: Making sense of the data">🔗</a></h2>
<p>A few explanations are necessary for some of the data, especially the difference in number of covers and number of artists. <em>Don&rsquo;t Stop Me Now</em>, <em>Fat Bottomed Girls</em>, and <em>We Will Rock You</em> had the same number of recorded covers as number of artists who have covered the song. Why were <em>Another One Bites the Dust</em> and <em>Bohemian Rhapsody</em> different?</p>
<p>As it turns out, <em>Another One Bites the Dust</em> had more covers than the number of artists who have covered the song. This happens because some artists have covered the song twice (e.g. once on a studio release and another on a live recording release). On the other hand, Bohemian Rhapsody had more artists covering it than number of covers because some recordings featured multiple artists on the same cover (e.g. the 1992 live performance with Elton John and Axl Rose).</p>
<p>The data opens many interesting questions. Why have some songs persisted longer than others (in terms of recent covers)? Have these songs impacted culture and society in different ways? How have they permeated culture? Is there geographical bias in the data?</p>
<p>This exercise was an exploratory assignment, but we had fun visualizing it and ended up learning an interesting pattern in music data.</p>

<h2 id="check-out-the-presentation-and-paper">Check out the presentation and paper&nbsp;<a class="hanchor" href="#check-out-the-presentation-and-paper" aria-label="Anchor link for: Check out the presentation and paper">🔗</a></h2>
<p>If you&rsquo;re interested for the full details, the <a href="https://docs.google.com/presentation/d/1sMgwgo5dxi2n0j1elnlfZgk3OU5QnwsZfcrNwQYmmCQ/edit?usp=sharing">slides</a> and a <a href="https://docs.google.com/document/d/1sLXBK2uUCpBazBUe_EiRdHOGlKUcBMwP7CG1XX9-Aiw/edit?usp=sharing">short paper</a> about the presentation are available online. They provide deeper context for the research and the visualization details based on different design concepts.</p>
<p>You can see what else <a href="https://www.linkedin.com/in/davidkim18/">David Kim</a>, <a href="https://www.linkedin.com/in/jathan-a/">Jathan Anandham</a>, <a href="https://www.linkedin.com/in/jwwheel/">Justin Wheeler</a>, and <a href="https://www.linkedin.com/in/scott-tinker-216962129/">Scott Tinker</a> are up to on LinkedIn. Thanks for tuning in to this adventure into music data analysis, powered by MusicBrainz!</p>
<hr>
<p><em>Photo by <a href="https://unsplash.com/photos/QrqeusbpFMM?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Matthias Wagner</a> on <a href="https://unsplash.com/search/photos/microphone?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</em></p>]]></description></item><item><title>Statistics proposal and self-hosting ListenBrainz</title><link>https://jwheel.org/blog/2017/12/statistics-hosting-listenbrainz/</link><pubDate>Mon, 18 Dec 2017 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2017/12/statistics-hosting-listenbrainz/</guid><description><![CDATA[<p><em>This post is part of a series of posts where I contribute to the ListenBrainz project for my independent study at the Rochester Institute of Technology in the fall 2017 semester. For more posts, find them in <a href="/tags/rit-2171/">this tag</a>.</em></p>
<hr>
<p>This week is the last week of the fall 2017 semester at RIT. This semester, I spent time with the MetaBrainz community working on ListenBrainz for an independent study. This post explains what I was working on in the last month and reflects back on my <a href="/blog/2017/10/contributing-listenbrainz/">original objectives</a> for the independent study.</p>

<h2 id="running-my-own-listenbrainz">Running my own ListenBrainz&nbsp;<a class="hanchor" href="#running-my-own-listenbrainz" aria-label="Anchor link for: Running my own ListenBrainz">🔗</a></h2>
<p>The <a href="http://ritlug.com/">RIT Linux Users Group</a> hosts various virtual machines for our projects. I requested one to set up and host a &ldquo;production&rdquo; ListenBrainz site. The purpose of doing this was to…</p>
<ol>
<li>Test my changes in a &ldquo;production&rdquo; environment</li>
<li>Offer a service for the RIT Linux Users Group to poke around with</li>
</ol>
<p>I spent most of this time working with our system administrator to set up the machine and adjust hardware specs for ListenBrainz. Once we fixed storage space and memory issues, it was easy to set it up and get ListenBrainz running. My experience writing the <a href="https://listenbrainz.readthedocs.io/en/latest/dev/devel-env.html">development guide</a> made it easy to get set up and get working. On the first run, it worked!</p>
<p>Now, <a href="http://listen.ritlug.com/">listen.ritlug.com</a> is live.</p>

<h4 id="figuring-out-https">Figuring out HTTPS&nbsp;<a class="hanchor" href="#figuring-out-https" aria-label="Anchor link for: Figuring out HTTPS">🔗</a></h4>
<p>My next challenge for the site is to set up HTTPS. I tried using a <a href="https://www.nginx.com/resources/admin-guide/nginx-https-upstreams/">reverse proxy in nginx</a> to set up HTTPS, but I received <em>502 Bad Gateway</em> errors. I realized I spent too much time figuring this out on my own and decided to <a href="https://community.metabrainz.org/t/how-does-metabrainz-use-https-on-listenbrainz/347319">ask for help</a> in the MetaBrainz community forums.</p>

<h2 id="proposing-new-statistics">Proposing new statistics&nbsp;<a class="hanchor" href="#proposing-new-statistics" aria-label="Anchor link for: Proposing new statistics">🔗</a></h2>
<p>Halfway through the independent study, I realized I would fall short of my original objective of implementing basic statistics in ListenBrainz. To compromise, I wrote a <a href="https://docs.google.com/document/d/1kByAgC9kbuDHNbsEJDkYkTMJ-wAoouWj0qNyi2UPb2Y/edit?usp=sharing">proposal for new statistics</a> to start in the project. My proposal looked at other proprietary platforms that compete with ListenBrainz to see some of their statistics. I also came up with some of my own.</p>
<p>I <a href="https://community.metabrainz.org/t/feedback-needed-listenbrainz-statistics-proposal/347327">proposed this to the MetaBrainz community</a> on the community forums. I&rsquo;m awaiting feedback on my ideas. Once I get feedback, I plan to file new tickets for each statistic to track their implementation over time.</p>
<p>I don&rsquo;t expect statistics being at the forefront of ListenBrainz for some time. A lot of work is going towards other areas of the project. But later in 2018, I expect more focus on the user-facing side of the project.</p>

<h2 id="my-statistic-and-google-bigquery">My statistic and Google BigQuery&nbsp;<a class="hanchor" href="#my-statistic-and-google-bigquery" aria-label="Anchor link for: My statistic and Google BigQuery">🔗</a></h2>
<p>My biggest blocker over the last month was <a href="https://cloud.google.com/bigquery/">Google BigQuery</a>. I wrote a statistic to <a href="https://github.com/metabrainz/listenbrainz-server/pull/318/commits/c1c08ce7f8d207591daeb288087872616d5063a4">calculate play counts</a> over a time period, but was asked to test my statistic. To test my statistic, I needed real data to work with.</p>
<p>Originally, I tried using the <a href="https://github.com/tgwizard/sls">Simple Last.fm Scrobbler</a> to submit listens to the local IP address for my development environment, but I wasn&rsquo;t able to get the app to reach my ListenBrainz server. To get the data, I had to set up Google BigQuery credentials so I could make queries against data on the production site, <a href="https://listenbrainz.org/">listenbrainz.org</a>.</p>
<p>I tried working through the <a href="https://cloud.google.com/bigquery/docs/">Google BigQuery documentation</a>. There&rsquo;s a lot of documentation for using BigQuery as a developer, but it was confusing where to find the information I needed to set it up in my development environment. I tried creating a new project in the Google Cloud Platform, but I was confused because it prompted me to upload my own data instead of accessing data already in BigQuery.</p>
<p>Too late, I realized I spent too much time on my own and not asking for help. I <a href="https://github.com/metabrainz/listenbrainz-server/pull/318">submitted a pull request</a> with the statistic I made and <a href="https://community.metabrainz.org/t/how-to-set-up-google-bigquery-in-a-listenbrainz-development-environment/347307">asked for help</a> in the MetaBrainz community. I also offered to write documentation for setting this up once I learn how to do it.</p>

<h2 id="reflecting-back">Reflecting back&nbsp;<a class="hanchor" href="#reflecting-back" aria-label="Anchor link for: Reflecting back">🔗</a></h2>
<p>I looked back on my <a href="/blog/2017/10/contributing-listenbrainz/">original objectives</a> for the independent study, and I was satisfied and dissatisfied.</p>

<h4 id="not-enough-programming">Not enough programming&nbsp;<a class="hanchor" href="#not-enough-programming" aria-label="Anchor link for: Not enough programming">🔗</a></h4>
<p>I wanted this independent study to enhance my programming knowledge. I especially wanted to focus on Python because I wanted to become more familiar with the language. However, I actually didn&rsquo;t do much programming during the independent study, to my own fault.</p>
<p>My biggest challenge was I bit off more than I could chew. I wanted to write code, and made a big goal before I knew the code base of the project. Even now, I still am not completely comfortable with the code yet. It&rsquo;s a big project with a lot of things going on. I was able to understand the things I did work on, but there&rsquo;s still a lot.</p>
<p>I realized that next time, I need to spend more time evaluating the code base of a project before writing out my milestones. I wish I set more realistic, smaller milestones for myself. My milestone of implementing basic reports was lofty given my existing programming knowledge.</p>

<h4 id="successes">Successes&nbsp;<a class="hanchor" href="#successes" aria-label="Anchor link for: Successes">🔗</a></h4>
<p>One of my other objectives was to write documentation for the project. I felt I succeeded in this milestone, and actually found it enjoyable and interesting to do! I helped separate out documentation from the README into the dedicated <a href="https://listenbrainz.readthedocs.io/en/latest/">ReadTheDocs site</a>. I wrote the <a href="https://listenbrainz.readthedocs.io/en/latest/dev/devel-env.html">development environment guide</a> and helped fix some build issues with the docs site. I also plan to write more for some of the other pain points I found, like Google BigQuery.</p>
<p>My last milestone was to create a use case for a data visualization course at RIT. While I didn&rsquo;t implement my basic reports, I did create the proposal and make an effort to write new statistics. There&rsquo;s a lot of potential now to work with the data in Google BigQuery and do front-end work with tools like <a href="https://d3js.org/">D3.js</a> and <a href="https://plot.ly/javascript/">Plotly.js</a>. I believe there&rsquo;s significant potential to use ListenBrainz as a hands-on project for students to explore data visualization with real data. I hope to support my independent study professor, Prof. Roberts, with questions and logistics of using it as a tool for learning in the future.</p>

<h4 id="unexpected-success">Unexpected success&nbsp;<a class="hanchor" href="#unexpected-success" aria-label="Anchor link for: Unexpected success">🔗</a></h4>
<p>I also think I had an unplanned success too. I immersed myself in the community for ListenBrainz too. Over the last few months, I realized that many of my strengths are in community management and tooling. During my time in the community, I did the following:</p>
<ul>
<li><a href="https://github.com/metabrainz/listenbrainz-server/pull/290">Fixed SELinux labels in Docker</a></li>
<li><a href="https://github.com/metabrainz/listenbrainz-server/pull/288">Contributed a pull request template</a></li>
<li><a href="https://github.com/metabrainz/listenbrainz-server/pull/287">Drafted contributing guidelines</a></li>
<li><a href="https://github.com/metabrainz/listenbrainz-server/pull/294">Fixed a PostgreSQL bug</a></li>
<li><a href="https://github.com/metabrainz/listenbrainz-server/pulls?utf8=%E2%9C%93&amp;q=is%3Apr&#43;author%3Ajflory7&#43;">And more…</a></li>
</ul>

<h2 id="to-the-future">To the future!&nbsp;<a class="hanchor" href="#to-the-future" aria-label="Anchor link for: To the future!">🔗</a></h2>
<p>This ends my independent study with ListenBrainz, but it doesn&rsquo;t end my time contributing! I chose ListenBrainz because it&rsquo;s a project I&rsquo;m passionate about. An independent study allowed me to justify more time on it than a side project in my free time. I&rsquo;m happy to have that opportunity, but I don&rsquo;t want to end here!</p>
<p>I want to follow through on the statistics because I&rsquo;m passionate about understanding music listening trends. I think there&rsquo;s a lot of power for psychological research through music data. To this point, I filed a ticket to request <a href="https://tickets.metabrainz.org/browse/LB-243">tagging listens with &ldquo;emotion&rdquo; words</a> that are synced back to <a href="https://musicbrainz.org/doc/MusicBrainz_Database">MusicBrainz entities</a>.</p>
<p>I won&rsquo;t have as much time to work on the project without the course credit, but I hope to stay involved for the future. I love the project and I love the community. I&rsquo;m thankful for the opportunity to work on this project as an independent study, and learn some things along the way.</p>]]></description></item><item><title>Exploring Google Code-In, ListenBrainz easyfix bugs, D3.js</title><link>https://jwheel.org/blog/2017/10/google-code-in-listenbrainz-d3-js/</link><pubDate>Sat, 21 Oct 2017 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2017/10/google-code-in-listenbrainz-d3-js/</guid><description><![CDATA[<p><em>This post is part of a series of posts where I contribute to the ListenBrainz project for my independent study at the Rochester Institute of Technology in the fall 2017 semester. For more posts, find them in <a href="/tags/rit-2171/">this tag</a>.</em></p>
<hr>
<p>Last week moved quickly for me in ListenBrainz. I submitted multiple pull requests and participated in the weekly developer&rsquo;s meeting on Monday. I was also invited to take part as a mentor for ListenBrainz for the upcoming round of Google Code-In! In addition to my changes and new role as a mentor, I&rsquo;m researching libraries like D3.js to help build visualizations for music data.  Suddenly, everything started moving fast!</p>

<h2 id="last-week-recap">Last week: Recap&nbsp;<a class="hanchor" href="#last-week-recap" aria-label="Anchor link for: Last week: Recap">🔗</a></h2>
<p>The ListenBrainz team accepted my <a href="https://github.com/metabrainz/listenbrainz-server/pull/257">development environment improvements</a> and <a href="https://github.com/metabrainz/listenbrainz-server/pull/259">documentation</a>. This gave me an opportunity to better explore project documentation tools. I experimented with <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> and <a href="https://readthedocs.org/">Read the Docs</a>. Sphinx introduced me to <a href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> for documentation formats. I&rsquo;ve avoided it in favor of Markdown for a long time, but I see where reStructuredText is stronger for advanced documentation.</p>
<p>Since ListenBrainz is a new project, I plan to contribute documentation for any of my work and improve documentation for pre-existing work. One of the goals for this independent study is to make ListenBrainz a viable candidate for a future data analysis course. To make it easy to use and understand, ListenBrainz needs excellent documentation. Since one of my strengths is technical writing, I plan to contribute more documentation this semester.</p>
<p>You can see some of the <a href="https://listenbrainz.readthedocs.io/en/master/">new documentation</a> already!</p>

<h2 id="google-code-in-mentor">Google Code-In mentor&nbsp;<a class="hanchor" href="#google-code-in-mentor" aria-label="Anchor link for: Google Code-In mentor">🔗</a></h2>
<p>The MetaBrainz community manager, <a href="https://musicbrainz.org/user/Freso">Freso Olesen</a>, approached me to mentor for Google Code-In. <a href="https://codein.withgoogle.com/">Google Code-In</a> is an opportunity for teenagers to meaningfully contribute to open source projects. Google describes Google Code-In as…</p>
<blockquote>
<p>Pre-university students ages 13 to 17 are invited to take part in Google Code-in: Our global, online contest introducing teenagers to the world of open source development. With a wide variety of bite-sized tasks, it’s easy for beginners to jump in and get started no matter what skills they have.</p>
<p>Mentors from our participating organizations lend a helping hand as participants learn what it’s like to work on an open source project. Participants get to work on real software and win prizes from t-shirts to a trip to Google HQ!</p>
</blockquote>
<p>MetaBrainz is a participating organization of Google Code-In this cycle. Because of my work with ListenBrainz, I will contribute a few hours a week to help mentor participating students with ListenBrainz. Beginner problems should be easy to help with since I&rsquo;m still beginning too, and as I spend more time with ListenBrainz, I can help with harder problems.</p>
<p>I&rsquo;m excited to give back to one of my favorite open source projects in this way! I&rsquo;m grateful to have this chance to help out during Google Code-In.</p>

<h2 id="choosing-easyfix-bugs">Choosing easyfix bugs&nbsp;<a class="hanchor" href="#choosing-easyfix-bugs" aria-label="Anchor link for: Choosing easyfix bugs">🔗</a></h2>
<p>After I figured out the development environment issues, I went through <a href="https://tickets.metabrainz.org/projects/LB/issues/">open tickets</a> filed against ListenBrainz to find some to work on. I made a preliminary pass through all open tickets and left some comments for more information, when needed. The tickets I highlighted to look into next were</p>
<ul>
<li><a href="https://tickets.metabrainz.org/browse/LB-85"><strong>LB-85</strong></a>: Username in the profile URL should be case insensitive</li>
<li><a href="https://tickets.metabrainz.org/browse/LB-124"><strong>LB-124</strong></a>: Install messybrainz as a a python library from requirements</li>
<li><a href="https://tickets.metabrainz.org/browse/LB-176"><strong>LB-176</strong></a>: Add stats module and begin calculating some user stats from BigQuery</li>
<li><strong><a href="https://tickets.metabrainz.org/browse/LB-206">LB-206</a></strong>: &ldquo;playing_now&rdquo; submissions not showing on profile</li>
<li><a href="https://tickets.metabrainz.org/browse/LB-212"><strong>LB-212</strong></a>: Show the MetaBrainz logo on the listenbrainz footer.</li>
</ul>
<p>Of these five, LB-124 and LB-212 are already closed. While drafting this article, I completed LB-124 in <a href="https://github.com/metabrainz/listenbrainz-server/pull/266">PR #266</a>. This was part of a test to get the documentation building again because of odd import errors. Later, a new student also learning the project for the first time asked to work on LB-212. Since it was a good first task to explore the project code, I passed the ticket to him.</p>
<p>I want to do one more &ldquo;easyfix&rdquo; bug before going into the main part of my independent study timeline. I don&rsquo;t yet feel comfortable with the code and one more bug solved will help. After this, I plan to pursue the heavier lifting of the independent study to explore data operations and queries to make.</p>

<h2 id="researching-d3js">Researching D3.js&nbsp;<a class="hanchor" href="#researching-d3js" aria-label="Anchor link for: Researching D3.js">🔗</a></h2>
<p>Prof. Roberts introduced <a href="https://d3js.org/">D3.js</a> as a library to build interactive, dynamic charts and visual representations of data. I haven&rsquo;t yet looked into much front-end work, but this was a cool project that I wanted to highlight in my weekly report. This feels like it could be a powerful match for ListenBrainz, especially since the data has high detail.</p>

<h2 id="upcoming-activity">Upcoming activity&nbsp;<a class="hanchor" href="#upcoming-activity" aria-label="Anchor link for: Upcoming activity">🔗</a></h2>
<p>This next week, I won&rsquo;t have as much time to contribute to ListenBrainz. On October 21, I&rsquo;m traveling to Raleigh, NC for <a href="https://allthingsopen.org/">All Things Open</a>. On October 24, I <a href="https://allthingsopen.org/speakers/justin-w-flory/">present my talk</a>, &ldquo;<em>What open source and J.K. Rowling have in common</em>&rdquo;. Since I&rsquo;ll be out of Rochester and missing other classwork, I expect less time on my ListenBrainz work.</p>
<p>This next week will be slower than the last two weeks. Hopefully I&rsquo;ll learn something at the conference too to bring back for ListenBrainz.</p>
<p>Until then… keep the FOSS flag high.</p>]]></description></item><item><title>How to set up a ListenBrainz development environment</title><link>https://jwheel.org/blog/2017/10/listenbrainz-development-environment/</link><pubDate>Wed, 04 Oct 2017 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2017/10/listenbrainz-development-environment/</guid><description><![CDATA[<p><em>This post is part of a series of posts where I contribute to the ListenBrainz project for my independent study at the Rochester Institute of Technology in the fall 2017 semester. For more posts, find them in <a href="/tags/rit-2171/">this tag</a>.</em></p>
<hr>
<p>One of the first rites of passage when working on a new project is creating your development environment. It always seems simple, but sometimes there are bumps along the way. The first activity I did to begin contributing to ListenBrainz was create my development environment. I wasn&rsquo;t successful with the documentation in the README, so I had to play around and work with the project before I was even running it.</p>
<p>The first part of this post details how to set up your own development environment. Then, the second half talks about the solution I came up with and my first contribution back to the project.</p>

<h2 id="install-dependencies-docker">Install dependencies: Docker&nbsp;<a class="hanchor" href="#install-dependencies-docker" aria-label="Anchor link for: Install dependencies: Docker">🔗</a></h2>
<p>This tutorial assumes you are using a Linux distribution. If you&rsquo;re using a different operating system, install the necessary dependencies or packages with your preferred method.</p>
<p>ListenBrainz ships in Docker containers, which helps create your development environment and later deploy the application. Therefore, to work on the project, you need to install Docker and use containers for building the project. Containers save you from installing all of this on your own workstation! Since I&rsquo;m using Fedora, I run this command.</p>
<pre tabindex="0"><code>sudo dnf install docker docker-compose
</code></pre>
<h2 id="register-a-musicbrainz-application">Register a MusicBrainz application&nbsp;<a class="hanchor" href="#register-a-musicbrainz-application" aria-label="Anchor link for: Register a MusicBrainz application">🔗</a></h2>
<p>Next, you need to register your application and get a OAuth token from MusicBrainz. Using the OAuth token lets you sign into your development environment with your MusicBrainz account. Then, you can import your plays from somewhere else.</p>
<p>To register, visit the <a href="https://musicbrainz.org/account/applications">MusicBrainz applications page</a>. There, look for the option to <a href="https://musicbrainz.org/account/applications/register">register your application</a>. Fill out the form with these three options.</p>
<ul>
<li><strong>Name</strong>: (any name you want and will recognize, I used <code>listenbrainz-server-devel</code>)</li>
<li><strong>Type</strong>: <code>Web Application</code></li>
<li><strong>Callback URL</strong>: <code>http://localhost/login/musicbrainz/post</code></li>
</ul>
<p>After entering this information, you&rsquo;ll have a OAuth client ID and OAuth client secret. You&rsquo;ll use these for configuring ListenBrainz.</p>

<h4 id="update-configpy">Update config.py&nbsp;<a class="hanchor" href="#update-configpy" aria-label="Anchor link for: Update config.py">🔗</a></h4>
<p>With your new client ID and secret, update the ListenBrainz configuration file. If this is your first time configuring ListenBrainz, copy the sample to a live configuration.</p>
<pre tabindex="0"><code>cp listenbrainz/config.py.sample listenbrainz/config.py
</code></pre><p>Next, open the file with your favorite text editor and look for this section.</p>
<pre tabindex="0"><code># MusicBrainz OAuth
MUSICBRAINZ_CLIENT_ID = &#34;CLIENT_ID&#34;
MUSICBRAINZ_CLIENT_SECRET = &#34;CLIENT_SECRET&#34;
</code></pre><p>Update the strings with your client ID and secret. After doing this, your ListenBrainz development environment is able to authenticate and log in from your MusicBrainz login.</p>

<h2 id="initialize-listenbrainz-databases">Initialize ListenBrainz databases&nbsp;<a class="hanchor" href="#initialize-listenbrainz-databases" aria-label="Anchor link for: Initialize ListenBrainz databases">🔗</a></h2>
<p>Your development environment needs some databases present to work. Before proceeding, run these three commands to initialize the databases.</p>
<pre tabindex="0"><code>docker-compose -f docker/docker-compose.yml -p listenbrainz run --rm web python3 manage.py init_db --create-db
docker-compose -f docker/docker-compose.yml -p listenbrainz run --rm web python3 manage.py init_msb_db --create-db
docker-compose -f docker/docker-compose.yml -p listenbrainz run --rm web python3 manage.py init_influx
</code></pre><p>Your development environment is now ready. Now, let&rsquo;s actually see ListenBrainz load locally!</p>

<h2 id="run-the-magic-script">Run the magic script&nbsp;<a class="hanchor" href="#run-the-magic-script" aria-label="Anchor link for: Run the magic script">🔗</a></h2>
<p>Once you have done this, run the <code>develop.sh</code> script in the root of the repository. Using <code>docker-compose</code>, the script creates multiple Docker containers for the different services and parts of the ListenBrainz server. Running this script will start Redis, PostgreSQL, InfluxDB, and web server containers, to name a few. But this also makes it easy to stop them all later.</p>
<pre tabindex="0"><code>./develop.sh
</code></pre><p>You will see the containers build and eventually run. Leave the script running to see your development environment. Later, you can shut it down by pressing <code>CTRL^C</code>. Once everything is running, visit your new site from your browser!</p>
<p><a href="http://localhost/">http://localhost/</a></p>
<p>Now, you are all set to begin making changes and testing them in your development environment!</p>

<h2 id="making-my-first-pull-request">Making my first pull request&nbsp;<a class="hanchor" href="#making-my-first-pull-request" aria-label="Anchor link for: Making my first pull request">🔗</a></h2>
<p>As mentioned earlier, my first attempt at a development environment was unsuccessful. My system kept denying permission to the processes in the containers. After looking at system audit logs and running a temporary <code>setenforce 0</code>, I tried the script one more time. Everything suddenly worked! So the issue was mostly with SELinux.</p>
<p>With my goal to get my environment set up, I figured out a few issues with the configuration offered by the project developers. I eventually made <a href="https://github.com/metabrainz/listenbrainz-server/pull/257">PR #257</a> against <code>listenbrainz-server</code> with my improvements.</p>

<h4 id="labeling-selinux-volume-mounts">Labeling SELinux volume mounts&nbsp;<a class="hanchor" href="#labeling-selinux-volume-mounts" aria-label="Anchor link for: Labeling SELinux volume mounts">🔗</a></h4>
<p>To diagnose the issue, I started with a quick search and found a <a href="https://stackoverflow.com/questions/24288616/permission-denied-on-accessing-host-directory-in-docker">StackOverflow question</a> with my same problem. There, the question was about Docker containers and denied permissions in the container. The answers explained it was an SELinux error and the context for the containers was not set. However, temporarily changing context for a directory didn&rsquo;t seem too effective and doesn&rsquo;t persist across reboots.</p>
<p>Continuing the search, I found an issue filed against <code>docker-compose</code> about the <code>:z</code> and <code>:Z</code> flags for volume mounts. These flags set SELinux context for containers, with the best explanation I found coming from <a href="https://stackoverflow.com/a/35222815/2497452">this StackOverflow answer</a>.</p>
<blockquote>
<p>Two suffixes :z or :Z can be added to the volume mount. These suffixes tell Docker to relabel file objects on the shared volumes. The &lsquo;z&rsquo; option tells Docker that the volume content will be shared between containers. Docker will label the content with a shared content label. Shared volumes labels allow all containers to read/write content. The &lsquo;Z&rsquo; option tells Docker to label the content with a private unshared label.</p>
</blockquote>
<p>Therefore, I added the <code>:z</code> flag to all the volume mounts in the <code>docker-compose.yml</code> file. I submitted a fix upstream for this in <a href="https://github.com/metabrainz/listenbrainz-server/pull/257">listenbrainz-server#257</a>!</p>

<h4 id="correct-the-startup-port">Correct the startup port&nbsp;<a class="hanchor" href="#correct-the-startup-port" aria-label="Anchor link for: Correct the startup port">🔗</a></h4>
<p>In the README, it says the server will start on port 8000, but the <code>docker-compose.yml</code> file actually started the server on port 80. I included a fix for this in <a href="https://github.com/metabrainz/listenbrainz-server/pull/257">my pull request</a> as well.</p>

<h2 id="git-push">git push!&nbsp;<a class="hanchor" href="#git-push" aria-label="Anchor link for: git push!">🔗</a></h2>
<p>This post makes a debugging experience that actually took hours look like it happened in minutes. But after getting over this hurdle, it was awesome to finally see ListenBrainz running locally on my workstation. It was an even better feeling when I could take my improvements and send them back in a pull request to ListenBrainz. Hopefully this will make it easier for others to create their own development environments and start hacking!</p>]]></description></item><item><title>On the data refrain: Contributing to ListenBrainz</title><link>https://jwheel.org/blog/2017/10/contributing-listenbrainz/</link><pubDate>Mon, 02 Oct 2017 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2017/10/contributing-listenbrainz/</guid><description><![CDATA[<p>A unique opportunity of attending an open source-friendly university is when course credits and working on open source projects collide. This semester, I&rsquo;m participating in an independent study at the <a href="https://www.rit.edu/">Rochester Institute of Technology</a> where I will contribute to the <a href="https://listenbrainz.org/">ListenBrainz</a> project.</p>
<p>Many students take part in independent studies where they work on their own projects. However, in the spirit of open source collaboration, I wanted to contribute to a project that already existed. That way, my work would be helpful to a real-world project where it would have a value even after the end of the semester. Additionally, I wanted  a project to help me sharpen my Python skill. And ListenBrainz was a fun, exciting candidate for this.</p>

<h2 id="objectives">Objectives&nbsp;<a class="hanchor" href="#objectives" aria-label="Anchor link for: Objectives">🔗</a></h2>
<p>The independent study proposal included three primary goals I hoped to meet during this independent study:</p>
<ol>
<li><strong>Add basic reports</strong> to ListenBrainz from listening history data for top songs / artists / albums of week, month, year, etc.</li>
<li><strong>Create documentation</strong> to improve ease to use and develop for the ListenBrainz project</li>
<li>Offer as a <strong>use case for the data visualization course</strong> in fall 2018 with instructions on how to use the data</li>
</ol>

<h4 id="add-basic-reports">Add basic reports&nbsp;<a class="hanchor" href="#add-basic-reports" aria-label="Anchor link for: Add basic reports">🔗</a></h4>
<p>Methods for generating basic reports, charts, and statistics about listening history are important. They help make ListenBrainz a more interesting platform for a casual music listener, not just a developer. Therefore, my goal was to add a way to add basic reports or specific metrics for presenting to the user in the front-end.</p>
<p>As a stretch goal, if I have extra time, I would work on generating content (e.g. charts / graphs / statistics) to show the user in the front-end.</p>

<h4 id="documentation">Documentation&nbsp;<a class="hanchor" href="#documentation" aria-label="Anchor link for: Documentation">🔗</a></h4>
<p>Documentation is something near and dear to me. I enjoy making it easier for other people to use a project or get started with contributing. Therefore, I will contribute some time as a technical writer and help improve documentation on the project. This includes improving existing documentation, like how to set up a development environment, or creating new content.</p>
<p>As an end deliverable, it would be nice to have someone who has never worked with the project run get a development environment set up, import some data, and see something presented to them. Good documentation is key to making something like this possible.</p>

<h4 id="use-case-for-data-course">Use case for data course&nbsp;<a class="hanchor" href="#use-case-for-data-course" aria-label="Anchor link for: Use case for data course">🔗</a></h4>
<p>RIT will offer a data visualization course in future semesters and it would be helpful if ListenBrainz could be a use case or even tool for the course. Then, students could work with ListenBrainz for creating different visualizations for the music data. And maybe contribute some of their visualizations back upstream! For this to happen, we need comprehensive documentation and complete features.</p>
<p>A focus includes making ListenBrainz a good fit for this course.</p>

<h2 id="learn-more-about-listenbrainz">Learn more about ListenBrainz&nbsp;<a class="hanchor" href="#learn-more-about-listenbrainz" aria-label="Anchor link for: Learn more about ListenBrainz">🔗</a></h2>
<p>For the next few months, until December, I will blog regularly about contributing to the ListenBrainz project and my progress. Additionally, more posts about MusicBrainz, other MetaBrainz projects, or music data may follow. I&rsquo;m hoping to either create new or improve old documentation as well, so I plan to write often anyways!</p>
<p>For now, you can learn a bit more about ListenBrainz and other projects in the MetaBrainz family, like MusicBrainz.</p>
<ul>
<li><a href="https://listenbrainz.org/">ListenBrainz</a></li>
<li><strong>GitHub</strong>: <a href="https://github.com/metabrainz/listenbrainz-server">metabrainz/listenbrainz-server</a></li>
<li><a href="https://musicbrainz.org/doc/About">About MusicBrainz</a></li>
<li><a href="https://metabrainz.org/about">About MetaBrainz</a></li>
</ul>]]></description></item></channel></rss>