<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MetaBrainz</title><link>https://jwheel.org/categories/metabrainz/</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>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://jwheel.org/rss/categories/metabrainz/index.xml" rel="self" type="application/rss+xml"/><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>2017 - My Year in Review</title><link>https://jwheel.org/blog/2018/02/2017-year-review/</link><pubDate>Mon, 12 Feb 2018 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2018/02/2017-year-review/</guid><description><![CDATA[<p>I can&rsquo;t remember how <a href="/tags/year-in-review/">writing an annual reflection</a> became a tradition, but after writing them for the last two years, it is now a habit. Every time I look back on all that the last year brought into my life, it is surreal. Many things that happened, I could never have expected one or two years ago. And perhaps now, I see that life is defined by the unexpected moments: the things that surprise us, warm our hearts, sadden us, and remind us of our humanity. Thus, I present my year in review of 2017.</p>

<h2 id="home-is-a-suitcase">Home is a suitcase&nbsp;<a class="hanchor" href="#home-is-a-suitcase" aria-label="Anchor link for: Home is a suitcase">🔗</a></h2>
<p>I began the third year of my degree and moved for the fifth time in two years when I made it back to Rochester in August. This time, I found somewhere to ideally live longer than only a few months of the year. I moved into a house with a few other roommates with more space than I&rsquo;ve had before. For the first time in a while, it&rsquo;s somewhere I&rsquo;ve made to feel like home.</p>
<p>This move came months after I ended a semester of a study abroad program and lived in a city for an internship. Most of 2017 made my suitcase feel like a home, but it afforded many unique experiences.</p>

<h2 id="croatia-study-abroad">Croatia: Study abroad&nbsp;<a class="hanchor" href="#croatia-study-abroad" aria-label="Anchor link for: Croatia: Study abroad">🔗</a></h2>
<p>
<figure>
  <img src="/blog/2018/02/photo_2017-01-17_19-09-11.jpg" alt="Saying goodbye to my mom and sister at the airport before flying to Dubrovnik" loading="lazy">
  <figcaption>Saying goodbye to my mom and sister at the airport before flying to Dubrovnik</figcaption>
</figure>
</p>
<p>From January to May 2017, I participated in a study abroad program with my university to <a href="https://en.wikipedia.org/wiki/Dubrovnik">Dubrovnik, Croatia</a>. RIT has full campuses in both Zagreb and Dubrovnik. This made planning the semester abroad easy, but also encouraged me to go somewhere I might not have gone otherwise.</p>
<p>My choice to study in Croatia was well-rewarded. On paper, I earned 12 credit hours, but I took away more than what I learned in class. My most important lessons came in the form of midnight bus rides to Albania, photograph exhibits capturing genocide in Sarajevo, and hugs from normally faraway friends in Czechia. My time abroad began a process in finding myself that has continued since my time in Europe.</p>

<h4 id="devconf-2017--fedora-diversity-fad">DevConf 2017 / Fedora Diversity FAD&nbsp;<a class="hanchor" href="#devconf-2017--fedora-diversity-fad" aria-label="Anchor link for: DevConf 2017 / Fedora Diversity FAD">🔗</a></h4>
<p>At the beginning of the year, the Fedora <a href="https://fedoraproject.org/wiki/Diversity">Diversity Team</a> held a &ldquo;Fedora Activity Day&rdquo; (FAD) event in Brno, Czechia. If you&rsquo;re outside of the Fedora community, think of a FAD as a focused, in-person team sprint. Together with our team in-person and remote, we mapped out our goals and plans for 2017 and set out to continue the work we began nearly three years ago.</p>
<p>
<figure>
  <img src="/blog/2018/02/DSC_0031.jpg" alt="" loading="lazy">
  <figcaption>Diversity Team group photo at our team sprint in Brno, Czechia</figcaption>
</figure>
</p>
<p>In addition to the work we accomplished together, it was fulfilling for me to see my teammates that span three continents. I spent a week with not only my teammates but also my friends. The days we get to spend together are a privileged few in the year, and it was fulfilling and motivating for me to spend some of our time together in a way that wasn&rsquo;t Pagure tickets or IRC meetings.</p>
<p>Read more about our team sprint in this event report:</p>
<p><a href="https://communityblog.fedoraproject.org/fedora-diversity-fad-2017/">https://communityblog.fedoraproject.org/fedora-diversity-fad-2017/</a></p>

<h4 id="fosdem-2017">FOSDEM 2017&nbsp;<a class="hanchor" href="#fosdem-2017" aria-label="Anchor link for: FOSDEM 2017">🔗</a></h4>
<p>
<figure>
  <img src="/blog/2018/02/MwwPknD.jpg" alt="I didn&rsquo;t get many photos during FOSDEM, but this one seemed fitting enough." loading="lazy">
  <figcaption>I didn’t get many photos during FOSDEM, but this one seemed fitting enough. Photo: Bhagyashree Padalkar</figcaption>
</figure>
</p>
<p>In February, I attended the Free and Open Source Software Developers European Meeting (FOSDEM) for the first time. <a href="https://fosdem.org">FOSDEM</a> is the largest open source conference in Europe, bringing together over 8,000 open source enthusiasts, contributors, and leaders from around the globe.</p>
<p>I had the privilege to attend as a member of the Fedora community, so my time was between the Fedora booth to meet the community and catching interesting talks. I also gave a talk of my own on the main track, <a href="https://archive.fosdem.org/2017/schedule/event/storytelling/"><em>What open source and J.K. Rowling have in common</em></a>! I gave this talk to a smaller audience at DevConf, but the FOSDEM audience was considerably larger.</p>
<p>In retrospect, my original talk topic is relevant but I have ideas on how I could have delivered my message more effectively. Regardless, it was a learning experience for me to present in front of a new audience. Public speaking opportunities filled my youth, both in theater and in presentations, but I had never presented to a technical audience before (let alone on a non-technical topic). The experience at FOSDEM helped build my understanding and I hope to return with a new topic someday in the future.</p>

<h4 id="exploring-the-balkans">Exploring the Balkans&nbsp;<a class="hanchor" href="#exploring-the-balkans" aria-label="Anchor link for: Exploring the Balkans">🔗</a></h4>
<p>Outside of open source and Fedora, my time in Croatia included a lot of time outside of Croatia. When many of my roommates went to explore the wonders of Western Europe, I lost my heart in the shadows of the Balkan mountains. My spring break was a solo trip split between Sarajevo, Bosnia and Hercegovina and Tirana, Albania.</p>

<h6 id="sarajevo">Sarajevo&nbsp;<a class="hanchor" href="#sarajevo" aria-label="Anchor link for: Sarajevo">🔗</a></h6>
<p>
<figure>
  <img src="/blog/2018/02/DSC_0033.jpg" alt="Taken from the Yellow Bastion in Sarajevo. I could get lost in this view forever." loading="lazy">
  <figcaption>Taken from the Yellow Bastion (<a href="https://goo.gl/maps/s4SHYxVLkEC2" class="bare">https://goo.gl/maps/s4SHYxVLkEC2</a>) in Sarajevo. I could get lost in this view forever.</figcaption>
</figure>
</p>
<p>The three days I spent in Sarajevo were short but significant. I was truly alone on this visit and it was up to me to make the most of it. Originally, I was skeptical to go alone, but I knew that I would never have a better opportunity to go. My fascination with Sarajevo stemmed from a year of studying European history in high school, and knowing the cultural significance of Sarajevo as a meeting point of western and eastern cultures. In the end, I decided to go, and I was rewarded for it.</p>
<p>
<figure>
  <img src="/blog/2018/02/eLj9O40.jpg" alt="Inside of the Tunnel of Sarajevo. It was so quiet I could hear myself breathe. This was a grounding experience." loading="lazy">
  <figcaption>Inside of the Tunnel of Sarajevo. It was so quiet I could hear myself breathe. This was a grounding experience.</figcaption>
</figure>
</p>
<p>Most of my trip in Sarajevo consisted of museums. I visited various museums, ranging from eighteenth to twentieth century history. The most rewarding for me were the <a href="http://galerija110795.ba/">Galerija 11/07/95</a> and the <a href="https://en.wikipedia.org/wiki/Sarajevo_Tunnel">Tunnel of Sarajevo</a>. The gallery documented the <a href="https://en.wikipedia.org/wiki/Srebrenica_massacre">Srebrenica genocide</a> in July 1995 by the Serbian armed forces. The exhibit was eye-opening and perspective-shifting. The Tunnel of Sarajevo, sometimes called the Tunnel of Hope, is another perspective-shattering experience. The museum introduces the tunnel used during the siege of Sarajevo during the 1990s, when Serbian forces surrounded the city for an almost <a href="https://en.wikipedia.org/wiki/Siege_of_Sarajevo">four-year siege</a>. The tunnel was the only way for citizens and resistance forces to contact the outside world and keep the resistance alive. A small part of the tunnel is preserved, and the other artifacts make it a gripping experience (not to mention it&rsquo;s a short drive out of the city, so you also have a chance to mentally prepare and later unpack the experience).</p>

<h6 id="tirana">Tirana&nbsp;<a class="hanchor" href="#tirana" aria-label="Anchor link for: Tirana">🔗</a></h6>
<p>I visited Tirana, Albania four times on my trip abroad. In Tirana, my heart was captured by the people there. For years, I read about the <a href="https://openlabs.cc/en/">Open Labs Hackerspace</a> community based in Tirana and I always imagined an opportunity to see it in person. I actually remember my first encounter with their community was an <a href="https://blog.azizaj.com/ada-lovelace-day/">Ada Lovelace Day event report</a>. And somehow, the circumstances shifted where I was able to meet their community and immerse myself in the culture, if only for a short time.</p>
<p>
<figure>
  <img src="/blog/2018/02/DSC_0187.jpg" alt="My visits to Tirana are best defined by the people who impacted my time there." loading="lazy">
  <figcaption>My visits to Tirana are best defined by the people who impacted my time there.</figcaption>
</figure>
</p>
<p>During my times in Tirana, I participated in the <a href="https://opensource.com/article/17/3/open-labs-48-hour-hackathon-albania">first-ever 48 hour hackathon</a> to support the UN&rsquo;s <a href="http://www.undp.org/content/undp/en/home/sustainable-development-goals.html">Sustainable Development Goals</a> (SDGs), the first edition of <a href="https://fedoramagazine.org/students-fedora-linux-weekend-2017/">Linux Weekend</a>, and the annual <a href="https://oscal.openlabs.cc/">Open Source Conference Albania</a> (OSCAL).</p>
<p> </p>
<p><a href="https://fedoramagazine.org/students-fedora-linux-weekend-2017/">https://fedoramagazine.org/students-fedora-linux-weekend-2017/</a></p>

<h2 id="india">India&nbsp;<a class="hanchor" href="#india" aria-label="Anchor link for: India">🔗</a></h2>
<p>At the end of my study abroad experience in Croatia, a unique opportunity presented itself to me. I did not buy my return airfare back to the US before I left for Croatia. When price-checking for my trip back, I noticed it was a few hundred dollars extra if I decided to spend a week in India before flying back to the US.</p>
<p>I booked the tickets.</p>
<p>
<figure>
  <img src="/blog/2018/02/yBioeCg.jpg" alt="Witnessing a tradition on my final day in Mumbai." loading="lazy">
  <figcaption>Witnessing a tradition on my final day in Mumbai.</figcaption>
</figure>
</p>
<p>The last day of my classes finally came, and the next day, I was traveling further east, to <a href="https://en.wikipedia.org/wiki/Mumbai">Mumbai</a> (or Bombay, if you prefer). I had the great fortune of having two great friends who invited me to the homes of their families during my trip. I visited Bee in Mumbai and Amita in Pune, all split across a single week!</p>
<p>My trip to India was eye-opening. For years, I&rsquo;ve had a fascination with Eastern culture and philosophy, but it was something completely different to experience. Bee and her family took me to the <a href="https://en.wikipedia.org/wiki/Global_Vipassana_Pagoda">Global Vipassana Pagoda</a>, a personally fulfilling experience for me. We visited the <a href="https://en.wikipedia.org/wiki/Bandra%E2%80%93Worli_Sea_Link">Bandra–Worli Sea Link</a>, <a href="https://goo.gl/maps/5kthSFfZmBJ2">Shree Mahalakshmi Temple</a>, and several other places in Mumbai. I remember walking through the streets more than anything.</p>
<p>
<figure>
  <img src="/blog/2018/02/DSC_0037.jpg" alt="The Bandra–Worli Sea Link. This may have been one of my best photos." loading="lazy">
  <figcaption>The Bandra–Worli Sea Link. This may have been one of my best photos.</figcaption>
</figure>
</p>
<p>
<figure>
  <img src="/blog/2018/02/DSC_0018.jpg" alt="Together at the gurdwara in Pune. Left to right: Prakash Mishra, me, Amita Sharma, Sumantro Mukherjee" loading="lazy">
  <figcaption>Together at the gurdwara in Pune. Left to right: Prakash Mishra, me, Amita Sharma, Sumantro Mukherjee</figcaption>
</figure>
</p>
<p>In Pune, Amita and her family showed me their favorite places. I had a chance to meet many other Fedora friends in Pune too. One of my favorite memories of Pune was a historic <a href="https://en.wikipedia.org/wiki/Gurdwara">gurdwara</a>. Amita took me and the others in our group to visit. For a moment, I finally got to see something I&rsquo;ve only read about right in front of my eyes. The history and reverence in these places was absorbed into my mind.</p>
<p>
<figure>
  <img src="/blog/2018/02/DSC_0048.jpg" alt="Definitely not proper zazen posture. But a cool shot anyways." loading="lazy">
  <figcaption>Definitely not proper zazen posture. But a cool shot anyways. Photo: Amita Sharma</figcaption>
</figure>
</p>
<p>I never expected an Indian visa stamp in my passport in 2017, yet it happened. I&rsquo;m equally filled with wonder at how the circumstances unfolded as I am grateful this experience sneaked into my year.</p>

<h2 id="chicago-urban-experience">Chicago: Urban experience&nbsp;<a class="hanchor" href="#chicago-urban-experience" aria-label="Anchor link for: Chicago: Urban experience">🔗</a></h2>
<p>After my semester abroad and visiting India, I was whisked back to the United States, only to pack up once again for another new experience. From June to August, I lived in <a href="https://en.wikipedia.org/wiki/Chicago">Chicago, Illinois</a> to work an internship at <a href="http://jumptrading.com/">Jump Trading</a>. Chicago had a feeling of nostalgia for me because much of my father&rsquo;s family has origins tracing back to Chicago. But I would find myself losing more of my heart in Chicago than I realized.</p>
<p>
<figure>
  <img src="/blog/2018/02/DSC_0001.jpg" alt="The view from my apartment in Chicago. Could this even be real??" loading="lazy">
  <figcaption>The view from my apartment window in Chicago. Could this even be real??</figcaption>
</figure>
</p>

<h4 id="the-internship">The internship&nbsp;<a class="hanchor" href="#the-internship" aria-label="Anchor link for: The internship">🔗</a></h4>
<p>I worked with a fantastic team of people on exciting projects. Professionally, my time in Chicago was motivating and empowering. I was provided the opportunity to learn and also contribute. I walked in with a dreadful feeling of imposter syndrome and left feeling more confident in my own learning abilities. <a href="https://www.docker.com/">Docker</a>, <a href="https://kubernetes.io/">Kubernetes</a>, and <a href="https://opensource.com/article/17/8/influxdb-time-series-database-stack">time-series data</a> became a part of my daily work life, when I had little to no knowledge before then.</p>
<p>By the time my internship finished, I helped contribute to our team&rsquo;s goal of standing up Kubernetes and <a href="https://github.com/kubernetes/minikube/commits?author=jflory7">contributing a few patches</a> in Kubernetes projects like Minikube. I have great mentors to thank for not only direct, technical assistance but also motivational mentorship and empowerment too.</p>

<h4 id="everything-else">Everything else&nbsp;<a class="hanchor" href="#everything-else" aria-label="Anchor link for: Everything else">🔗</a></h4>
<p>
<figure>
  <img src="/blog/2018/02/chicago-matt-justin.jpg" alt="When old friends come to visit. Hi Matt!" loading="lazy">
  <figcaption>When old friends come to visit. Hi Matt!</figcaption>
</figure>
</p>
<p>There was more to Chicago than only the work too. Before long, I felt like a true Chicagoan, traveling the subways into the Loop, catching free concerts in <a href="https://www.cityofchicago.org/city/en/depts/dca/supp_info/millennium_park.html">Millennium Park</a>, and indulging in the Chicago tradition of <a href="https://en.wikipedia.org/wiki/Chicago-style_pizza">deep-dish pizza</a>.</p>
<p>Unlike other cities I&rsquo;ve visited, like New York City, Chicago felt easier to integrate into. The culture was notably &ldquo;slower&rdquo; than the fast-pace life of NYC, London, or Washington DC. I discovered <a href="http://www.middleeastbakeryandgrocery.com/">Middle Eastern markets</a> that became a regular part of my weekends, made friends with the baristas at a <a href="https://www.intelligentsiacoffee.com/old-town-coffeebar">local coffeehouse</a>, and had the privilege of hosting friends from three continents for short stays.</p>
<p>
<figure>
  <img src="/blog/2018/02/chicago-bee-fireworks.jpg" alt="4th of July fireworks on the Navy Pier with Bee" loading="lazy">
  <figcaption>4th of July fireworks on the Navy Pier with Bee</figcaption>
</figure>
</p>
<p>I left Chicago and was offered a new contract for the following summer in 2018. I&rsquo;m looking forward to be back in June again.</p>

<h2 id="year-of-fedora">Year of Fedora&nbsp;<a class="hanchor" href="#year-of-fedora" aria-label="Anchor link for: Year of Fedora">🔗</a></h2>
<p>2017 was full of time and effort spent in the Fedora community. In addition to the Diversity FAD, I was elected to the <a href="https://docs.fedoraproject.org/fedora-project/council/charter.html">Fedora Council</a> (on my third attempt), attended the annual Fedora contributor conference, Flock, and also narrowed my scope for contributions.</p>
<p>When I began contributing to Fedora, I was contributing to many things. Marketing, community operations, Fedora Badges, Fedora Magazine, Ambassadors, Games SIG, Join SIG, the Diversity Team, and maybe a few more things. After a while, I realized my contributions carried great width but poor depth. In 2017, I &ldquo;reconfigured&rdquo; my time in Fedora to focus in on the areas where I felt my time yielded the highest impact. This is Fedora <a href="https://fedoraproject.org/wiki/CommOps">CommOps</a> and the <a href="https://fedoraproject.org/wiki/Diversity">Diversity Team</a>.</p>
<p>I resigned as Fedora Magazine editor-in-chief and also formally stepped down from other teams. It made me sad, but I knew it was the right decision for me. I&rsquo;m happy to spend more time working in fewer projects at a greater depth and focus than I had before.</p>

<h4 id="flock-2017">Flock 2017&nbsp;<a class="hanchor" href="#flock-2017" aria-label="Anchor link for: Flock 2017">🔗</a></h4>
<p><a href="https://flocktofedora.org/">Flock</a>, Fedora&rsquo;s annual contributor conference, was held from Aug. 29 to Sep. 1 in Cape Cod, Massachusetts. Every year, Flock is an empowering experience for me because of the face-time I get with the people I spend much of my year working with remotely. This year was no different, and many new faces were mixed in with the old ones.</p>
<p>The highlights for me were in three forms: the <a href="https://flock2017.sched.com/event/Bm9a/commops-and-metrics-workshop">CommOps session</a>, the <a href="https://flock2017.sched.com/event/Bm8o/diversity-team-hackfest">Diversity Team session</a>, and the <a href="https://flock2017.sched.com/event/Bm8p/fedora-magazine-workshop">Fedora Magazine session</a>. Together with <a href="https://twitter.com/iamskamath">Sachin Kamath</a>, we led the CommOps session. You can read more about our session here:</p>
<p><a href="https://communityblog.fedoraproject.org/metrics-docs-flock-2017/">https://communityblog.fedoraproject.org/metrics-docs-flock-2017/</a></p>
<p>The Diversity Team and Magazine sessions were also valuable for both teams to get feedback from the rest of the community. In the Diversity Team session, we had many active participants outside of our team that reminded us the importance of narrowing our focus for higher impact. I also attended other interesting sessions held by the community, like the <a href="https://flock2017.sched.com/event/Bm9C/the-future-of-fedmsg">future of fedmsg</a> by Jeremy Cline.</p>

<h4 id="commops-fad">CommOps FAD&nbsp;<a class="hanchor" href="#commops-fad" aria-label="Anchor link for: CommOps FAD">🔗</a></h4>
<p>Towards the end of 2017, I worked together with our team in CommOps to organize our own team sprint, or FAD, in 2018. We <a href="https://fedoraproject.org/wiki/FAD_CommOps_2018">successfully planned the event</a> and organized it in Brno, Czechia, similar to last year&rsquo;s Diversity FAD.</p>
<p>More details on this will be found in its own event report!</p>

<h2 id="listenbrainz-indie-study">ListenBrainz indie study&nbsp;<a class="hanchor" href="#listenbrainz-indie-study" aria-label="Anchor link for: ListenBrainz indie study">🔗</a></h2>
<p>In my fall semester of 2017, I took on an <a href="/tags/rit-2171/">independent study</a> to further explore the ListenBrainz project. <a href="https://listenbrainz.org/">ListenBrainz</a> is an open source social platform to document the music you listen to over time. If you&rsquo;re familiar with Last.fm or Libre.fm, it&rsquo;s a similar concept, but the focus is more on the data than the social features. ListenBrainz is supported by the <a href="https://metabrainz.org/">MetaBrainz Foundation</a>, also the guiding body for the more well-known <a href="https://musicbrainz.org/doc/About">MusicBrainz</a> project.</p>
<p>In my independent study, I had a chance to contribute documentation and community tools (like issue / PR templates), as well as explore how the project gathers and builds metrics. I didn&rsquo;t make my original milestone of major code contributions to the project, but I better understood the community and tried to help in the areas of low coverage, like documentation.</p>
<p>The experience was insightful for me and provided me an excuse to work on something that I am genuinely passionate about. Music is a powerful part of human culture, and the MetaBrainz Foundation takes a serious approach to documenting music, especially in a technical sense. ListenBrainz represents an opportunity for us to better explore and understand ourselves through our music listening habits. I hope someday that ListenBrainz will be a platform for data journalism and research about music. That&rsquo;s my dream.</p>

<h2 id="opensourcecom-community-moderator">Opensource.com community moderator&nbsp;<a class="hanchor" href="#opensourcecom-community-moderator" aria-label="Anchor link for: Opensource.com community moderator">🔗</a></h2>
<p>At the beginning of 2017, I was brought on board as an <a href="https://opensource.com/">Opensource.com</a> community moderator. Together with other community moderators and site staff, I help contribute new content and source new writers to the site. My invitation to the community moderator team came shortly after the announcement that I received the <a href="https://opensource.com/article/17/2/community-awards-2017">2017 People&rsquo;s Choice Award</a>. When <a href="https://twitter.com/rikkiends">Rikki Endsley</a> invited me to the team, it felt like a natural alignment to my passion for storytelling.</p>

<h4 id="all-things-open-2017">All Things Open 2017&nbsp;<a class="hanchor" href="#all-things-open-2017" aria-label="Anchor link for: All Things Open 2017">🔗</a></h4>
<p>
<figure>
  <img src="/blog/2018/02/DSC_0146.jpg" alt="Working together with the Opensource.com team to plan out the next year ahead." loading="lazy">
  <figcaption>Working together with the Opensource.com team to plan out the next year ahead.</figcaption>
</figure>
</p>
<p>I was invited to <a href="https://allthingsopen.org/">All Things Open</a>, an annual open source conference in Raleigh, by the Opensource.com team. The day before the conference, I met the rest of the team and other community moderators at the Red Hat HQ in Raleigh. We spent the day locked into a room together to hash out plans and goals for the next year. It was a productive opportunity for the team to work together and also a great opportunity to meet the other members of the community.</p>
<p>Some of my best takeaways from this experience were catching coffee with other community moderators, meeting Jim Whitehurst to talk about Opensource.com, and giving my talk, <em>What open source and J.K. Rowling have in common</em>, for the final time.</p>
<p>I hope I have the opportunity to go again next year to meet the awesome team behind Opensource.com. (If you haven&rsquo;t considered before, <a href="https://opensource.com/how-submit-article">come and write for us</a> too!)</p>

<h2 id="happiness-packet-challenge">Happiness Packet Challenge&nbsp;<a class="hanchor" href="#happiness-packet-challenge" aria-label="Anchor link for: Happiness Packet Challenge">🔗</a></h2>
<p>Another unusual milestone for my 2017 was the first rendition of the Happiness Packet Challenge. I was introduced to the Happiness Packets website in 2016. <a href="https://www.happinesspackets.io/">Happiness Packets</a> are an easy way to say thank you to someone who has had a positive impact on you. I came up with a challenge to my friends and network to write one Happiness Packet a day, every day, for a week.</p>
<p>I followed up with the team behind the project to evaluate the impact of this idea, and I was pleasantly surprised. Here&rsquo;s the number of messages sent for the two weeks prior to the Happiness Packet Challenge, followed by the week of the challenge:</p>
<ul>
<li><strong>Week starting 2017-03-27</strong>: 2 sent</li>
<li><strong>Week starting 2017-04-03</strong>: 35 sent</li>
<li><strong>Week starting 2017-04-10 (challenge week)</strong>: 72 sent</li>
</ul>
<p>You can read more about the challenge in my <a href="/blog/2017/04/happiness-packets-challenge/">original blog post</a>. Keep an eye out for it again in 2018.</p>

<h2 id="living-openly">Living openly&nbsp;<a class="hanchor" href="#living-openly" aria-label="Anchor link for: Living openly">🔗</a></h2>
<p>Earlier in this post, I alluded to how I felt like I began to find myself when I was abroad. My study abroad experience was the beginning of a longer process that leads into present day.</p>
<p>In April, <a href="https://medium.com/@jflory7/turn-on-the-lights-267603e553b5">I went public</a> with my depression, both to help take a weight off my shoulder and to be a voice for others who are afraid to speak up. I was always concerned of the reaction from publishing something like that, but I was met with nothing but loving-kindness from friends and strangers. It gave me new confidence to live more openly and wear my values in the open.</p>
<p>The story continued in October, when I decided to delete my Facebook and Instagram accounts.</p>
<p><a href="https://medium.com/@jflory7/cut-the-plug-deleting-facebook-and-instagram-6cbe7c86d9c9">https://medium.com/@jflory7/cut-the-plug-deleting-facebook-and-instagram-6cbe7c86d9c9</a></p>
<p>I considered this for a couple of years before, but I pulled the trigger in October. Like many others, it felt almost too much of a task to disconnect myself from this huge network of people and friends. But the negative impacts of it were draining me and trapping me. Since I deleted my accounts, I&rsquo;ve noticed a positive impact in overall levels of happiness and awareness. However, I don&rsquo;t think the social media accounts alone are the reason for this.</p>
<p>In the near future, I hope to do a follow-up post to my decision to cut away from the Facebook and Instagram machines. Keep an eye out for more.</p>

<h2 id="2018">2018&nbsp;<a class="hanchor" href="#2018" aria-label="Anchor link for: 2018">🔗</a></h2>
<p>It&rsquo;s already February in 2018 when I finished this post. This year, I thought it would be the year when I get the post out closer to the new year, but somehow I always slip. In either case, it gives me a chance to take in some of the new opportunities and excitement of the new year before reflecting and looking back.</p>
<p>This year, I&rsquo;m working an internship with <a href="https://www.unicef.org/">UNICEF</a> to help lead on open source community engagement and supporting the non-technical areas of their <a href="http://unicefstories.org/magicbox/">MagicBox platform</a>. In the one month I&rsquo;ve been doing this, I feel like I have tens of articles I could write about, but the experience is still maturing for me.</p>
<p>I also have another round in Chicago to look forward to over the summer. I&rsquo;ll get to work with the same team as last year on similar projects, and I&rsquo;m looking forward to going back.</p>
<p>As for the rest, who knows what&rsquo;s to come? So many things that made 2017 what it was were the things I didn&rsquo;t expect. The surprises in life are the salt to the regiment of daily life, and add flavor and spice in unexpected ways. I have no idea what my 2018 Year in Review will look like, and that&rsquo;s okay. I&rsquo;m looking forward to seeing what will make it in.</p>

<h2 id="thank-you">Thank you&nbsp;<a class="hanchor" href="#thank-you" aria-label="Anchor link for: Thank you">🔗</a></h2>
<p>Above all, every year, I think back on the people who positively impacted my life and contributed to the &ldquo;flavor&rdquo; of my year. A close friend reminded me recently that we all stand on the shoulders of giants. And isn&rsquo;t it true? We all have our great mentors, great friends, and unexpected sages that help us find our own footing on this great path of life. We become ourselves from the various pieces impacted on us by others.</p>
<p>I&rsquo;m thankful for all of the people who have made my year into the experience it was. The list is too long to write and I fear I would leave someone out – even significant impacts were made by people who had a short-term role in this last year.</p>
<p>A long time ago, my open source experience was jump-started by someone who did something kind and exceptional for me. It was a continuing trend since that moment. My only aspiration is to pay forward the good will that so many have bestowed unto me.</p>
<p>Thanks for making it this far down, and I hope to see you in 2018. Or who knows – maybe it will just be me reading this far down for next year, when I go to write my next year in review. Hi future me!</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>ListenBrainz community gardening and user statistics</title><link>https://jwheel.org/blog/2017/11/listenbrainz-community-user-statistics/</link><pubDate>Mon, 13 Nov 2017 00:00:00 +0000</pubDate><guid>https://jwheel.org/blog/2017/11/listenbrainz-community-user-statistics/</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>My progress with ListenBrainz slowed, but I am resuming the pace of contributing and advancing on my independent study timeline. This past week, I finished out assigned tasks to discuss contributor-related documentation, like a Code of Conduct, contributor guidelines, and a pull request template. I began research on user statistics and found some already created. I wrote one of my own, but need to learn more about Google BigQuery to advance further.</p>

<h2 id="paving-the-contributor-pathway">Paving the contributor pathway&nbsp;<a class="hanchor" href="#paving-the-contributor-pathway" aria-label="Anchor link for: Paving the contributor pathway">🔗</a></h2>
<p>
<figure>
  <img src="/blog/2017/11/Screenshot-from-2017-11-13-02-05-12.png" alt="Making it easier for people to contribute user statistics to ListenBrainz" loading="lazy">
  <figcaption>Making it easier for people to contribute to ListenBrainz with helpful contibuting guidelines</figcaption>
</figure>
</p>
<p>Earlier, I identified weaknesses for the ListenBrainz contributor pathway and found ways we could improve the pathway. This started with the development environment documentation. Now, I helped draft first revisions of our <a href="https://github.com/metabrainz/listenbrainz-server/pull/287">contributor guidelines</a>, <a href="https://github.com/metabrainz/listenbrainz-server/pull/286">Code of Conduct reference</a>, and <a href="https://github.com/metabrainz/listenbrainz-server/pull/288">pull request templates</a>. Together, these three documents have two goals.</p>
<ol>
<li><strong>Make it easier</strong> to contribute to ListenBrainz</li>
<li>Have a better experience and <strong>have fun</strong> contributing!</li>
</ol>
<p>Adding these documents addresses these goals. Additionally, the <a href="https://github.com/metabrainz/listenbrainz-server/community">GitHub community profile</a> also highlights these deliverables as ways to meet these goals. After getting feedback and seeing what others think, we make more revisions later (with some trial runs).</p>

<h2 id="back-to-selinux-context-flags">Back to SELinux context flags&nbsp;<a class="hanchor" href="#back-to-selinux-context-flags" aria-label="Anchor link for: Back to SELinux context flags">🔗</a></h2>
<p>Recently, I set my desktop back up and installed Docker for the first time on this machine; however, the development environment still failed to start. When I ran the script, it would eventually error out because of a permission denial. The web server image for ListenBrainz was failing.</p>
<p>After debugging, I noticed that I missed the SELinux volume tags for the ListenBrainz web server images in my original pull request, <a href="https://github.com/metabrainz/listenbrainz-server/pull/257">#257</a>. When I created the pull request, I might have had cached data that let my laptop run the development environment without a problem. In either case, it was an easy fix and I knew what the issue was when it happened. Therefore, I submitted a new fix in <a href="https://github.com/metabrainz/listenbrainz-server/pull/290">#290</a>.</p>

<h2 id="writing-new-user-statistics">Writing new user statistics&nbsp;<a class="hanchor" href="#writing-new-user-statistics" aria-label="Anchor link for: Writing new user statistics">🔗</a></h2>
<p>The most interesting part of my independent study is working with the music data to build and generate interesting statistics. I finally began exploring the <a href="https://github.com/metabrainz/listenbrainz-server/tree/master/listenbrainz/stats">existing statistics</a> in ListenBrainz. The statistic queries use BigQuery standard SQL. BigQuery helps rapidly scan and scale data queries to help with performance (I have a lot to learn about BigQuery).</p>

<h4 id="two-types-of-statistics">Two types of statistics&nbsp;<a class="hanchor" href="#two-types-of-statistics" aria-label="Anchor link for: Two types of statistics">🔗</a></h4>
<p>Additionally, ListenBrainz generates <strong>two types</strong> of statistics:</p>
<ol>
<li>Site-wide statistics</li>
<li>User statistics</li>
</ol>
<p>Site-wide statistics are metrics non-specific to a single user. There is only <a href="https://github.com/metabrainz/listenbrainz-server/blob/master/listenbrainz/stats/sitewide.py">one site-wide query</a> now. It counts how many artists were ever submitted to this ListenBrainz instance and returns an integer. There&rsquo;s room for expansion in site-wide statistics.</p>
<p>On the other hand, user statistics are metrics specific to a single user. There&rsquo;s a <a href="https://github.com/metabrainz/listenbrainz-server/blob/master/listenbrainz/stats/user.py">fair number already</a>, like the top artists and songs in a time period and the number of artists you&rsquo;ve listened to. These are a little more complete and offer more expansion for doing cool front-end work with something like <a href="https://d3js.org/">D3.js</a>.</p>

<h4 id="writing-user-statistics">Writing user statistics&nbsp;<a class="hanchor" href="#writing-user-statistics" aria-label="Anchor link for: Writing user statistics">🔗</a></h4>
<p>Of course, I had to try writing my own. One helpful query I thought of was getting a count of the songs you listened to over a time period (e.g. &ldquo;you listened to 500 songs this week!&rdquo;). I haven&rsquo;t tested it yet, but I have this in a local branch and hope to test it with real data soon.</p>
<pre tabindex="0"><code>def get_play_count(musicbrainz_id, time_interval=None): 
 
 filter_clause = &#34;&#34; 
 if time_interval: 
     filter_clause = &#34;AND listened_at &gt;=
     TIMESTAMP_SUB(CURRENT_TIME(), 
     INTERVAL {})&#34;.format(time_interval) 
 
 query = &#34;&#34;&#34;SELECT COUNT(release_msid) as listen_count 
            FROM {dataset_id}.{table_id} 
            WHERE user_name = @musicbrainz_id 
            {time_filter_clause} 
            LIMIT {limit} 
         &#34;&#34;&#34;.format( 
                 dataset_id=config.BIGQUERY_DATASET_ID, 
                 table_id=config.BIGQUERY_TABLE_ID, 
                 time_filter_clause=filter_clause, 
                 limit=config.STATS_ENTITY_LIMIT, 
            ) 
 
 parameters = [ 
     { 
         &#39;type&#39;: &#39;STRING&#39;, 
         &#39;name&#39;: &#39;musicbrainz_id&#39;, 
         &#39;value&#39;: musicbrainz_id 
     } 
 ] 
 
 return stats.run_query(query, parameters)
</code></pre>
<h2 id="researching-google-bigquery">Researching Google BigQuery&nbsp;<a class="hanchor" href="#researching-google-bigquery" aria-label="Anchor link for: Researching Google BigQuery">🔗</a></h2>
<p>My next steps for the independent study are researching <a href="https://cloud.google.com/bigquery/docs/">Google BigQuery</a>. After going through the existing statistics and understanding how ListenBrainz generates them, an understanding of Google BigQuery is essential to writing effective queries. When I become more comfortable with the tooling and how it works, I want to map out a plan of statistics to generate and measure.</p>
<p>Until then, the hacking continues! As always, keep the FOSS flag high…</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>