CINXE.COM
August 2017 – MetaBrainz Blog
<!DOCTYPE html> <html lang="en" class="no-js"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="profile" href="https://gmpg.org/xfn/11"> <script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script> <title>August 2017 – MetaBrainz Blog</title> <meta name='robots' content='max-image-preview:large' /> <meta name="google-site-verification" content="aHsalzSsjEz9L3kesh85sP49ooc2wS4HR-_8_wmoIJg" /> <meta name="msvalidate.01" content="9A2D04F4206FB5DA8B1A5DDDD8772245" /> <!-- Async WordPress.com Remote Login --> <script id="wpcom_remote_login_js"> var wpcom_remote_login_extra_auth = ''; function wpcom_remote_login_remove_dom_node_id( element_id ) { var dom_node = document.getElementById( element_id ); if ( dom_node ) { dom_node.parentNode.removeChild( dom_node ); } } function wpcom_remote_login_remove_dom_node_classes( class_name ) { var dom_nodes = document.querySelectorAll( '.' + class_name ); for ( var i = 0; i < dom_nodes.length; i++ ) { dom_nodes[ i ].parentNode.removeChild( dom_nodes[ i ] ); } } function wpcom_remote_login_final_cleanup() { wpcom_remote_login_remove_dom_node_classes( "wpcom_remote_login_msg" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_validate" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_js" ); wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_iframe" ); wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_styles" ); } // Watch for messages back from the remote login window.addEventListener( "message", function( e ) { if ( e.origin === "https://r-login.wordpress.com" ) { var data = {}; try { data = JSON.parse( e.data ); } catch( e ) { wpcom_remote_login_final_cleanup(); return; } if ( data.msg === 'LOGIN' ) { // Clean up the login check iframe wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); var id_regex = new RegExp( /^[0-9]+$/ ); var token_regex = new RegExp( /^.*|.*|.*$/ ); if ( token_regex.test( data.token ) && id_regex.test( data.wpcomid ) ) { // We have everything we need to ask for a login var script = document.createElement( "script" ); script.setAttribute( "id", "wpcom_remote_login_validate" ); script.src = '/remote-login.php?wpcom_remote_login=validate' + '&wpcomid=' + data.wpcomid + '&token=' + encodeURIComponent( data.token ) + '&host=' + window.location.protocol + '//' + window.location.hostname + '&postid=6423' + '&is_singular='; document.body.appendChild( script ); } return; } // Safari ITP, not logged in, so redirect if ( data.msg === 'LOGIN-REDIRECT' ) { window.location = 'https://wordpress.com/log-in?redirect_to=' + window.location.href; return; } // Safari ITP, storage access failed, remove the request if ( data.msg === 'LOGIN-REMOVE' ) { var css_zap = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } @media screen and ( max-width: 782px ) { html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } }'; var style_zap = document.createElement( 'style' ); style_zap.type = 'text/css'; style_zap.appendChild( document.createTextNode( css_zap ) ); document.body.appendChild( style_zap ); var e = document.getElementById( 'wpcom_request_access_iframe' ); e.parentNode.removeChild( e ); document.cookie = 'wordpress_com_login_access=denied; path=/; max-age=31536000'; return; } // Safari ITP if ( data.msg === 'REQUEST_ACCESS' ) { console.log( 'request access: safari' ); // Check ITP iframe enable/disable knob if ( wpcom_remote_login_extra_auth !== 'safari_itp_iframe' ) { return; } // If we are in a "private window" there is no ITP. var private_window = false; try { var opendb = window.openDatabase( null, null, null, null ); } catch( e ) { private_window = true; } if ( private_window ) { console.log( 'private window' ); return; } var iframe = document.createElement( 'iframe' ); iframe.id = 'wpcom_request_access_iframe'; iframe.setAttribute( 'scrolling', 'no' ); iframe.setAttribute( 'sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-top-navigation-by-user-activation' ); iframe.src = 'https://r-login.wordpress.com/remote-login.php?wpcom_remote_login=request_access&origin=' + encodeURIComponent( data.origin ) + '&wpcomid=' + encodeURIComponent( data.wpcomid ); var css = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } @media screen and ( max-width: 660px ) { html { margin-top: 71px !important; } * html body { margin-top: 71px !important; } #wpcom_request_access_iframe { display: block; height: 71px !important; } } #wpcom_request_access_iframe { border: 0px; height: 46px; position: fixed; top: 0; left: 0; width: 100%; min-width: 100%; z-index: 99999; background: #23282d; } '; var style = document.createElement( 'style' ); style.type = 'text/css'; style.id = 'wpcom_request_access_styles'; style.appendChild( document.createTextNode( css ) ); document.body.appendChild( style ); document.body.appendChild( iframe ); } if ( data.msg === 'DONE' ) { wpcom_remote_login_final_cleanup(); } } }, false ); // Inject the remote login iframe after the page has had a chance to load // more critical resources window.addEventListener( "DOMContentLoaded", function( e ) { var iframe = document.createElement( "iframe" ); iframe.style.display = "none"; iframe.setAttribute( "scrolling", "no" ); iframe.setAttribute( "id", "wpcom_remote_login_key" ); iframe.src = "https://r-login.wordpress.com/remote-login.php" + "?wpcom_remote_login=key" + "&origin=aHR0cHM6Ly9ibG9nLm1ldGFicmFpbnoub3Jn" + "&wpcomid=1935472" + "&time=1740699313"; document.body.appendChild( iframe ); }, false ); </script> <link rel='dns-prefetch' href='//s2.wp.com' /> <link rel='dns-prefetch' href='//s1.wp.com' /> <link rel='dns-prefetch' href='//s0.wp.com' /> <link rel="alternate" type="application/rss+xml" title="MetaBrainz Blog » Feed" href="https://blog.metabrainz.org/feed/" /> <link rel="alternate" type="application/rss+xml" title="MetaBrainz Blog » Comments Feed" href="https://blog.metabrainz.org/comments/feed/" /> <script type="text/javascript"> /* <![CDATA[ */ function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function () { oldonload(); func(); } } } /* ]]> */ </script> <script> window._wpemojiSettings = {"baseUrl":"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/72x72\/","ext":".png","svgUrl":"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/s2.wp.com\/wp-includes\/js\/wp-emoji-release.min.js?m=1719498190i&ver=6.7.2-RC1-59780"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); </script> <link crossorigin='anonymous' rel='stylesheet' id='all-css-0-1' href='https://s2.wp.com/wp-content/mu-plugins/jetpack-plugin/sun/modules/theme-tools/compat/twentysixteen.css?m=1685115060i&cssminify=yes' type='text/css' media='all' /> <style id='wp-emoji-styles-inline-css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-2-1' href='https://s1.wp.com/_static/??-eJyljkEKwyAQRS9UMxoCWZWeRc1gTY3KzNjg7Zt2U+gq0OXn8R4f9qp8yYJZoKYWYmYI7ZgOKRyEEJ6jHvQwgmsxLeBS8Q+VoiNLHVh6wsEzX+C/kNxxOxP6WAwrSrVv3fbSRAWKy+kvPwmyEnPgr37brmaetNaTMfP6AnHzajo=&cssminify=yes' type='text/css' media='all' /> <style id='wp-block-library-inline-css'> .has-text-align-justify { text-align:justify; } .has-text-align-justify{text-align:justify;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-4-1' href='https://s2.wp.com/_static/??-eJzTLy/QzcxLzilNSS3WzyrWz01NyUxMzUnNTc0rQeEU5CRWphbp5qSmJyZX6uVm5uklFxfr6OPTDpRD5sM02efaGpoZmFkYGRuZGmQBAHPvL0Y=&cssminify=yes' type='text/css' media='all' /> <style id='jetpack-sharing-buttons-style-inline-css'> .jetpack-sharing-buttons__services-list{display:flex;flex-direction:row;flex-wrap:wrap;gap:0;list-style-type:none;margin:5px;padding:0}.jetpack-sharing-buttons__services-list.has-small-icon-size{font-size:12px}.jetpack-sharing-buttons__services-list.has-normal-icon-size{font-size:16px}.jetpack-sharing-buttons__services-list.has-large-icon-size{font-size:24px}.jetpack-sharing-buttons__services-list.has-huge-icon-size{font-size:36px}@media print{.jetpack-sharing-buttons__services-list{display:none!important}}.editor-styles-wrapper .wp-block-jetpack-sharing-buttons{gap:0;padding-inline-start:0}ul.jetpack-sharing-buttons__services-list.has-background{padding:1.25em 2.375em} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-6-1' href='https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/coblocks-style.css?m=1681832297i&cssminify=yes' type='text/css' media='all' /> <style id='classic-theme-styles-inline-css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-8-1' href='https://s1.wp.com/_static/??/wp-content/mu-plugins/core-compat/wp-mediaelement.css,/wp-content/mu-plugins/wpcom-bbpress-premium-themes.css?m=1432920480j&cssminify=yes' type='text/css' media='all' /> <style id='global-styles-inline-css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--dark-gray: #1a1a1a;--wp--preset--color--medium-gray: #686868;--wp--preset--color--light-gray: #e5e5e5;--wp--preset--color--blue-gray: #4d545c;--wp--preset--color--bright-blue: #007acc;--wp--preset--color--light-blue: #9adffd;--wp--preset--color--dark-brown: #402b30;--wp--preset--color--medium-brown: #774e24;--wp--preset--color--dark-red: #640c1f;--wp--preset--color--bright-red: #ff675f;--wp--preset--color--yellow: #ffef8e;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-family--albert-sans: 'Albert Sans', sans-serif;--wp--preset--font-family--alegreya: Alegreya, serif;--wp--preset--font-family--arvo: Arvo, serif;--wp--preset--font-family--bodoni-moda: 'Bodoni Moda', serif;--wp--preset--font-family--bricolage-grotesque: 'Bricolage Grotesque', sans-serif;--wp--preset--font-family--cabin: Cabin, sans-serif;--wp--preset--font-family--chivo: Chivo, sans-serif;--wp--preset--font-family--commissioner: Commissioner, sans-serif;--wp--preset--font-family--cormorant: Cormorant, serif;--wp--preset--font-family--courier-prime: 'Courier Prime', monospace;--wp--preset--font-family--crimson-pro: 'Crimson Pro', serif;--wp--preset--font-family--dm-mono: 'DM Mono', monospace;--wp--preset--font-family--dm-sans: 'DM Sans', sans-serif;--wp--preset--font-family--dm-serif-display: 'DM Serif Display', serif;--wp--preset--font-family--domine: Domine, serif;--wp--preset--font-family--eb-garamond: 'EB Garamond', serif;--wp--preset--font-family--epilogue: Epilogue, sans-serif;--wp--preset--font-family--fahkwang: Fahkwang, sans-serif;--wp--preset--font-family--figtree: Figtree, sans-serif;--wp--preset--font-family--fira-sans: 'Fira Sans', sans-serif;--wp--preset--font-family--fjalla-one: 'Fjalla One', sans-serif;--wp--preset--font-family--fraunces: Fraunces, serif;--wp--preset--font-family--gabarito: Gabarito, system-ui;--wp--preset--font-family--ibm-plex-mono: 'IBM Plex Mono', monospace;--wp--preset--font-family--ibm-plex-sans: 'IBM Plex Sans', sans-serif;--wp--preset--font-family--ibarra-real-nova: 'Ibarra Real Nova', serif;--wp--preset--font-family--instrument-serif: 'Instrument Serif', serif;--wp--preset--font-family--inter: Inter, sans-serif;--wp--preset--font-family--josefin-sans: 'Josefin Sans', sans-serif;--wp--preset--font-family--jost: Jost, sans-serif;--wp--preset--font-family--libre-baskerville: 'Libre Baskerville', serif;--wp--preset--font-family--libre-franklin: 'Libre Franklin', sans-serif;--wp--preset--font-family--literata: Literata, serif;--wp--preset--font-family--lora: Lora, serif;--wp--preset--font-family--merriweather: Merriweather, serif;--wp--preset--font-family--montserrat: Montserrat, sans-serif;--wp--preset--font-family--newsreader: Newsreader, serif;--wp--preset--font-family--noto-sans-mono: 'Noto Sans Mono', sans-serif;--wp--preset--font-family--nunito: Nunito, sans-serif;--wp--preset--font-family--open-sans: 'Open Sans', sans-serif;--wp--preset--font-family--overpass: Overpass, sans-serif;--wp--preset--font-family--pt-serif: 'PT Serif', serif;--wp--preset--font-family--petrona: Petrona, serif;--wp--preset--font-family--piazzolla: Piazzolla, serif;--wp--preset--font-family--playfair-display: 'Playfair Display', serif;--wp--preset--font-family--plus-jakarta-sans: 'Plus Jakarta Sans', sans-serif;--wp--preset--font-family--poppins: Poppins, sans-serif;--wp--preset--font-family--raleway: Raleway, sans-serif;--wp--preset--font-family--roboto: Roboto, sans-serif;--wp--preset--font-family--roboto-slab: 'Roboto Slab', serif;--wp--preset--font-family--rubik: Rubik, sans-serif;--wp--preset--font-family--rufina: Rufina, serif;--wp--preset--font-family--sora: Sora, sans-serif;--wp--preset--font-family--source-sans-3: 'Source Sans 3', sans-serif;--wp--preset--font-family--source-serif-4: 'Source Serif 4', serif;--wp--preset--font-family--space-mono: 'Space Mono', monospace;--wp--preset--font-family--syne: Syne, sans-serif;--wp--preset--font-family--texturina: Texturina, serif;--wp--preset--font-family--urbanist: Urbanist, sans-serif;--wp--preset--font-family--work-sans: 'Work Sans', sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-albert-sans-font-family{font-family: var(--wp--preset--font-family--albert-sans) !important;}.has-alegreya-font-family{font-family: var(--wp--preset--font-family--alegreya) !important;}.has-arvo-font-family{font-family: var(--wp--preset--font-family--arvo) !important;}.has-bodoni-moda-font-family{font-family: var(--wp--preset--font-family--bodoni-moda) !important;}.has-bricolage-grotesque-font-family{font-family: var(--wp--preset--font-family--bricolage-grotesque) !important;}.has-cabin-font-family{font-family: var(--wp--preset--font-family--cabin) !important;}.has-chivo-font-family{font-family: var(--wp--preset--font-family--chivo) !important;}.has-commissioner-font-family{font-family: var(--wp--preset--font-family--commissioner) !important;}.has-cormorant-font-family{font-family: var(--wp--preset--font-family--cormorant) !important;}.has-courier-prime-font-family{font-family: var(--wp--preset--font-family--courier-prime) !important;}.has-crimson-pro-font-family{font-family: var(--wp--preset--font-family--crimson-pro) !important;}.has-dm-mono-font-family{font-family: var(--wp--preset--font-family--dm-mono) !important;}.has-dm-sans-font-family{font-family: var(--wp--preset--font-family--dm-sans) !important;}.has-dm-serif-display-font-family{font-family: var(--wp--preset--font-family--dm-serif-display) !important;}.has-domine-font-family{font-family: var(--wp--preset--font-family--domine) !important;}.has-eb-garamond-font-family{font-family: var(--wp--preset--font-family--eb-garamond) !important;}.has-epilogue-font-family{font-family: var(--wp--preset--font-family--epilogue) !important;}.has-fahkwang-font-family{font-family: var(--wp--preset--font-family--fahkwang) !important;}.has-figtree-font-family{font-family: var(--wp--preset--font-family--figtree) !important;}.has-fira-sans-font-family{font-family: var(--wp--preset--font-family--fira-sans) !important;}.has-fjalla-one-font-family{font-family: var(--wp--preset--font-family--fjalla-one) !important;}.has-fraunces-font-family{font-family: var(--wp--preset--font-family--fraunces) !important;}.has-gabarito-font-family{font-family: var(--wp--preset--font-family--gabarito) !important;}.has-ibm-plex-mono-font-family{font-family: var(--wp--preset--font-family--ibm-plex-mono) !important;}.has-ibm-plex-sans-font-family{font-family: var(--wp--preset--font-family--ibm-plex-sans) !important;}.has-ibarra-real-nova-font-family{font-family: var(--wp--preset--font-family--ibarra-real-nova) !important;}.has-instrument-serif-font-family{font-family: var(--wp--preset--font-family--instrument-serif) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;}.has-josefin-sans-font-family{font-family: var(--wp--preset--font-family--josefin-sans) !important;}.has-jost-font-family{font-family: var(--wp--preset--font-family--jost) !important;}.has-libre-baskerville-font-family{font-family: var(--wp--preset--font-family--libre-baskerville) !important;}.has-libre-franklin-font-family{font-family: var(--wp--preset--font-family--libre-franklin) !important;}.has-literata-font-family{font-family: var(--wp--preset--font-family--literata) !important;}.has-lora-font-family{font-family: var(--wp--preset--font-family--lora) !important;}.has-merriweather-font-family{font-family: var(--wp--preset--font-family--merriweather) !important;}.has-montserrat-font-family{font-family: var(--wp--preset--font-family--montserrat) !important;}.has-newsreader-font-family{font-family: var(--wp--preset--font-family--newsreader) !important;}.has-noto-sans-mono-font-family{font-family: var(--wp--preset--font-family--noto-sans-mono) !important;}.has-nunito-font-family{font-family: var(--wp--preset--font-family--nunito) !important;}.has-open-sans-font-family{font-family: var(--wp--preset--font-family--open-sans) !important;}.has-overpass-font-family{font-family: var(--wp--preset--font-family--overpass) !important;}.has-pt-serif-font-family{font-family: var(--wp--preset--font-family--pt-serif) !important;}.has-petrona-font-family{font-family: var(--wp--preset--font-family--petrona) !important;}.has-piazzolla-font-family{font-family: var(--wp--preset--font-family--piazzolla) !important;}.has-playfair-display-font-family{font-family: var(--wp--preset--font-family--playfair-display) !important;}.has-plus-jakarta-sans-font-family{font-family: var(--wp--preset--font-family--plus-jakarta-sans) !important;}.has-poppins-font-family{font-family: var(--wp--preset--font-family--poppins) !important;}.has-raleway-font-family{font-family: var(--wp--preset--font-family--raleway) !important;}.has-roboto-font-family{font-family: var(--wp--preset--font-family--roboto) !important;}.has-roboto-slab-font-family{font-family: var(--wp--preset--font-family--roboto-slab) !important;}.has-rubik-font-family{font-family: var(--wp--preset--font-family--rubik) !important;}.has-rufina-font-family{font-family: var(--wp--preset--font-family--rufina) !important;}.has-sora-font-family{font-family: var(--wp--preset--font-family--sora) !important;}.has-source-sans-3-font-family{font-family: var(--wp--preset--font-family--source-sans-3) !important;}.has-source-serif-4-font-family{font-family: var(--wp--preset--font-family--source-serif-4) !important;}.has-space-mono-font-family{font-family: var(--wp--preset--font-family--space-mono) !important;}.has-syne-font-family{font-family: var(--wp--preset--font-family--syne) !important;}.has-texturina-font-family{font-family: var(--wp--preset--font-family--texturina) !important;}.has-urbanist-font-family{font-family: var(--wp--preset--font-family--urbanist) !important;}.has-work-sans-font-family{font-family: var(--wp--preset--font-family--work-sans) !important;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-10-1' href='https://s2.wp.com/_static/??-eJyNjt0KwjAMRl/IGqr4dyE+inQlzm5tVpqUubc3Uy8EFbzL93FyEhiz8QMJkoBcMSFDrg3IqMXE4SaIBBcFGBKWEkZ0ihWTY2WT5l5bJ88cSFU8RCdu6ZkX8CZPdWbaQAwdSna+f2XgSnDWVWiRsIRZ8X38cP58mGWK+D+uIDRx8P3jxCkd7Xa/sXa1Puy6O8ygbnY=&cssminify=yes' type='text/css' media='all' /> <!--[if lt IE 10]> <link rel='stylesheet' id='twentysixteen-ie-css' href='https://s2.wp.com/wp-content/themes/pub/twentysixteen/css/ie.css?m=1448353951i&ver=20170530' media='all' /> <![endif]--> <!--[if lt IE 9]> <link rel='stylesheet' id='twentysixteen-ie8-css' href='https://s2.wp.com/wp-content/themes/pub/twentysixteen/css/ie8.css?m=1493067000i&ver=20170530' media='all' /> <![endif]--> <!--[if lt IE 8]> <link rel='stylesheet' id='twentysixteen-ie7-css' href='https://s2.wp.com/wp-content/themes/pub/twentysixteen/css/ie7.css?m=1448353951i&ver=20170530' media='all' /> <![endif]--> <link crossorigin='anonymous' rel='stylesheet' id='all-css-16-1' href='https://s1.wp.com/wp-content/themes/pub/twentysixteen/css/style-wpcom.css?m=1514503118i&cssminify=yes' type='text/css' media='all' /> <style id='akismet-widget-style-inline-css'> .a-stats { --akismet-color-mid-green: #357b49; --akismet-color-white: #fff; --akismet-color-light-grey: #f6f7f7; max-width: 350px; width: auto; } .a-stats * { all: unset; box-sizing: border-box; } .a-stats strong { font-weight: 600; } .a-stats a.a-stats__link, .a-stats a.a-stats__link:visited, .a-stats a.a-stats__link:active { background: var(--akismet-color-mid-green); border: none; box-shadow: none; border-radius: 8px; color: var(--akismet-color-white); cursor: pointer; display: block; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen-Sans', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; font-weight: 500; padding: 12px; text-align: center; text-decoration: none; transition: all 0.2s ease; } /* Extra specificity to deal with TwentyTwentyOne focus style */ .widget .a-stats a.a-stats__link:focus { background: var(--akismet-color-mid-green); color: var(--akismet-color-white); text-decoration: none; } .a-stats a.a-stats__link:hover { filter: brightness(110%); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06), 0 0 2px rgba(0, 0, 0, 0.16); } .a-stats .count { color: var(--akismet-color-white); display: block; font-size: 1.5em; line-height: 1.4; padding: 0 13px; white-space: nowrap; } </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-18-1' href='https://s1.wp.com/_static/??-eJzTLy/QTc7PK0nNK9HPLdUtyClNz8wr1i9KTcrJTwcy0/WTi5G5ekCujj52Temp+bo5+cmJJZn5eSgc3bScxMwikFb7XFtDE1NLExMLc0OTLACohS2q&cssminify=yes' type='text/css' media='all' /> <style id='jetpack-global-styles-frontend-style-inline-css'> :root { --font-headings: unset; --font-base: unset; --font-headings-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; --font-base-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-20-1' href='https://s2.wp.com/wp-content/themes/h4/global.css?m=1420737423i&cssminify=yes' type='text/css' media='all' /> <script id="wpcom-actionbar-placeholder-js-extra"> var actionbardata = {"siteID":"1935472","postID":"0","siteURL":"https:\/\/blog.metabrainz.org","xhrURL":"https:\/\/blog.metabrainz.org\/wp-admin\/admin-ajax.php","nonce":"b2f33ba083","isLoggedIn":"","statusMessage":"","subsEmailDefault":"instantly","proxyScriptUrl":"https:\/\/s0.wp.com\/wp-content\/js\/wpcom-proxy-request.js?ver=20211021","i18n":{"followedText":"New posts from this site will now appear in your <a href=\"https:\/\/wordpress.com\/reader\">Reader<\/a>","foldBar":"Collapse this bar","unfoldBar":"Expand this bar","shortLinkCopied":"Shortlink copied to clipboard."}}; </script> <script id="jetpack-mu-wpcom-settings-js-before"> var JETPACK_MU_WPCOM_SETTINGS = {"assetsUrl":"https:\/\/s1.wp.com\/wp-content\/mu-plugins\/jetpack-mu-wpcom-plugin\/sun\/jetpack_vendor\/automattic\/jetpack-mu-wpcom\/src\/build\/"}; </script> <script crossorigin='anonymous' type='text/javascript' src='https://s0.wp.com/_static/??/wp-content/js/rlt-proxy.js,/wp-content/themes/pub/twentysixteen/js/html5.js?m=1720530689j'></script> <script id="rlt-proxy-js-after"> rltInitialize( {"token":null,"iframeOrigins":["https:\/\/widgets.wp.com"]} ); </script> <link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://musicbrainz.wordpress.com/xmlrpc.php?rsd" /> <meta name="generator" content="WordPress.com" /> <!-- Jetpack Open Graph Tags --> <meta property="og:type" content="website" /> <meta property="og:title" content="August 2017 – MetaBrainz Blog" /> <meta property="og:site_name" content="MetaBrainz Blog" /> <meta property="og:image" content="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150" /> <meta property="og:image:width" content="200" /> <meta property="og:image:height" content="200" /> <meta property="og:image:alt" content="" /> <meta property="og:locale" content="en_US" /> <meta name="twitter:creator" content="@MusicBrainz" /> <meta name="twitter:site" content="@MusicBrainz" /> <!-- End Jetpack Open Graph Tags --> <link rel='openid.server' href='https://blog.metabrainz.org/?openidserver=1' /> <link rel='openid.delegate' href='https://blog.metabrainz.org/' /> <link rel="search" type="application/opensearchdescription+xml" href="https://blog.metabrainz.org/osd.xml" title="MetaBrainz Blog" /> <link rel="search" type="application/opensearchdescription+xml" href="https://s1.wp.com/opensearch.xml" title="WordPress.com" /> <style>.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style> <style type="text/css"> .recentcomments a { display: inline !important; padding: 0 !important; margin: 0 !important; } table.recentcommentsavatartop img.avatar, table.recentcommentsavatarend img.avatar { border: 0px; margin: 0; } table.recentcommentsavatartop a, table.recentcommentsavatarend a { border: 0px !important; background-color: transparent !important; } td.recentcommentsavatarend, td.recentcommentsavatartop { padding: 0px 0px 1px 0px; margin: 0px; } td.recentcommentstextend { border: none !important; padding: 0px 0px 2px 10px; } .rtl td.recentcommentstextend { padding: 0px 10px 2px 0px; } td.recentcommentstexttop { border: none; padding: 0px 0px 0px 10px; } .rtl td.recentcommentstexttop { padding: 0px 10px 0px 0px; } </style> <meta name="description" content="7 posts published by Sambhav Kothari, psolanki, iliekcomputers, Suyash Garg, ruaok, and reosarevok during August 2017" /> <link rel="icon" href="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=32" sizes="32x32" /> <link rel="icon" href="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150" sizes="192x192" /> <link rel="apple-touch-icon" href="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150" /> <meta name="msapplication-TileImage" content="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150" /> </head> <body class="archive date wp-embed-responsive customizer-styles-applied group-blog hfeed jetpack-reblog-enabled"> <div id="page" class="site"> <div class="site-inner"> <a class="skip-link screen-reader-text" href="#content"> Skip to content </a> <header id="masthead" class="site-header"> <div class="site-header-main"> <div class="site-branding"> <a href="https://blog.metabrainz.org/" class="site-logo-link" rel="home" itemprop="url"></a> <p class="site-title"><a href="https://blog.metabrainz.org/" rel="home">MetaBrainz Blog</a></p> <p class="site-description">MetaBrainz Foundation community blog</p> </div><!-- .site-branding --> <button id="menu-toggle" class="menu-toggle">Menu</button> <div id="site-header-menu" class="site-header-menu"> <nav id="site-navigation" class="main-navigation" aria-label="Primary Menu"> </nav><!-- .main-navigation --> </div><!-- .site-header-menu --> </div><!-- .site-header-main --> <div class="header-image"> <a href="https://blog.metabrainz.org/" rel="home"> <img src="https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-twitter-banner-1500x500.jpg" srcset="" sizes="" width="1200" height="186" alt="MetaBrainz Blog"> </a> </div><!-- .header-image --> </header><!-- .site-header --> <div id="content" class="site-content"> <div id="primary" class="content-area"> <main id="main" class="site-main"> <header class="page-header"> <h1 class="page-title">Month: <span>August 2017</span></h1> </header><!-- .page-header --> <article id="post-6423" class="post-6423 post type-post status-publish format-standard hentry category-picard category-summer-of-code tag-google-summer-of-code tag-picard"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2017/08/31/500-commits-of-summer-my-story-of-foss-and-gsoc/" rel="bookmark">500 Commits of Summer: My story of FOSS and GSoC</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>This story of summer started in a dull grey winter at home. Bored, I started lingering around <a href="https://www.irccloud.com/irc/freenode">IRC</a> channels and much like the Alice of Wonderland, stumbled into the wonderful world of <a href="https://en.wikipedia.org/wiki/Free_and_open-source_software">FOSS</a>. Little did I know, it was gonna be one of the best things that happened to me. Below is a story of bugs, PRs , repos, commits, and some more commits. But it is also a story of curiosity, learning, frustrations (a lot of it), resilience (more than you think) and some amazing amazing people of the community. If I have to sum it up for you, I couldn’t think of a way better than this. So here it goes…</p> <p>Disclaimer: It was a long journey, hence the long blog. <a href="https://blog.metabrainz.org/2017/08/31/500-commits-of-summer-my-story-of-foss-and-gsoc/#more-6423" class="more-link">Continue reading<span class="screen-reader-text"> “500 Commits of Summer: My story of FOSS and GSoC”</span></a></p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/samj1912/">Sambhav Kothari</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2017/08/31/500-commits-of-summer-my-story-of-foss-and-gsoc/" rel="bookmark"><time class="entry-date published" datetime="2017-08-31T12:00:36+00:00">August 31, 2017</time><time class="updated" datetime="2017-09-04T19:20:00+00:00">September 4, 2017</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/musicbrainz/picard/" rel="category tag">Picard</a>, <a href="https://blog.metabrainz.org/category/google-programs/summer-of-code/" rel="category tag">Summer of Code</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/google-summer-of-code/" rel="tag">Google Summer of Code</a>, <a href="https://blog.metabrainz.org/tag/picard/" rel="tag">Picard</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2017/08/31/500-commits-of-summer-my-story-of-foss-and-gsoc/#comments">3 Comments<span class="screen-reader-text"> on 500 Commits of Summer: My story of FOSS and GSoC</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-6423 --> <article id="post-6428" class="post-6428 post type-post status-publish format-standard hentry category-critiquebrainz category-summer-of-code tag-critiquebrainz tag-google-summer-of-code"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2017/08/30/gsoc-2017-rating-system-in-critiquebrainz/" rel="bookmark">GSoC 2017: Rating System in CritiqueBrainz</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>Hello!</p> <p>I am Pinank Solanki, an undergrad at Indian Institute of Technology (IIT) Mandi, India. I worked with the MetaBrainz Foundation on one of its projects, as part of the Google Summer of Code 2017 over the last summer. It was one of the best and exciting summers I ever had.</p> <p>Let me begin from the beginning. I first came to know about MusicBrainz in January and first contacted the community in February and was immediately hooked. Initially I decided to make a proposal for addition of <a href="https://wiki.musicbrainz.org/Development/Summer_of_Code/2017/CritiqueBrainz">book reviews</a> for CritiqueBrianz, but it was not possible because the BookBrainz web service was unstable and the CritiqueBrainz’s host didn’t have direct access to BookBrainz database. So I tried to pitch my own ideas. But then, in one of the <a href="https://musicbrainz.org/doc/MetaBrainz_Meeting">weekly meetings</a>, I saw great support and enthusiasm among the community members for <a href="https://tickets.metabrainz.org/browse/CB-244">rating system for reviews</a> —and I personally liked the idea of the project and thought it would be a great addition to CritiqueBrainz. I submitted <a href="https://community.metabrainz.org/t/gsoc-2017-add-rating-system-in-critiquebrainz/239782">my proposal</a>, got accepted and a treat to the friends was due!</p> <h3>Overview</h3> <p>The aim of the project was to add support for three types of reviews: text, rating, text+rating (CB supported only-text reviews).</p> <p>The schema changes and data-access functions are completed and merged. The frontend part is mainly completed including the fundamental functionality along with additional features. It took a lot of time to select and modify the rating input plugin perfectly satisfying the project’s needs. There is still some work to be done, most of which is based on the rating scale conversion in db package. Similarly, most of the web service part is completed and is held up due to the rating scale conversion PR.</p> <h3>Implementation</h3> <h4>Schema changes</h4> <p>The schema changes done are quite different than what was mentioned in the proposal. My mentor for the project, Roman Tsukanov (Gentlecat), recommended some changes which would make keeping track of revisions a lot easier. You can see the schema <a href="https://github.com/ps2611/critiquebrainz/blob/4b9cfff962204f8871227564ef19d329a87104bb/docs/images/schema.svg">here</a> and the PR <a href="https://github.com/metabrainz/critiquebrainz/pull/109">here</a>.</p> <h4>Data-access functions</h4> <p>By the time I started working on the project, CB has migrated off the ORM. So, I wrote raw SQL queries and its tests. See the PR <a href="https://github.com/metabrainz/critiquebrainz/pull/125">here</a>. The rating scale was decided to be 1-5 but for storage a scale of 0-100 is used just like <a href="https://musicbrainz.org/">MusicBrainz</a> keeping the possibility of migration of ratings from MB to CB in mind (more info at <a href="https://tickets.metabrainz.org/browse/CB-245">CB-245</a>). This part is covered in the PR <a href="https://github.com/metabrainz/critiquebrainz/pull/152">here</a>.</p> <h4>Changes in user-interface</h4> <p><a href="https://github.com/javiertoledo/bootstrap-rating-input">This plugin</a> is used for rendering the rating star icons. The code can be seen in this <a href="https://github.com/metabrainz/critiquebrainz/pull/138">PR.</a> See the images below to get a good idea about the implementation.</p> <p>Write review page:</p> <p><img data-attachment-id="6480" data-permalink="https://blog.metabrainz.org/2017/08/30/gsoc-2017-rating-system-in-critiquebrainz/cb-write-review/" data-orig-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-write-review.png" data-orig-size="1176,599" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="cb-write-review" data-image-description="" data-image-caption="" data-medium-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-write-review.png?w=300" data-large-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-write-review.png?w=1176" class="alignnone size-full wp-image-6480" src="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-write-review.png?w=840" alt="cb-write-review" srcset="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-write-review.png 1176w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-write-review.png?w=128&h=65 128w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-write-review.png?w=300&h=153 300w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-write-review.png?w=768&h=391 768w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-write-review.png?w=1024&h=522 1024w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p> <p>Review page:</p> <p><img data-attachment-id="6498" data-permalink="https://blog.metabrainz.org/2017/08/30/gsoc-2017-rating-system-in-critiquebrainz/cb-review/" data-orig-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-review.png" data-orig-size="1173,600" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="cb-review" data-image-description="" data-image-caption="" data-medium-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-review.png?w=300" data-large-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-review.png?w=1173" class="alignnone size-full wp-image-6498" src="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-review.png?w=840" alt="cb-review" srcset="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-review.png 1173w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-review.png?w=128&h=65 128w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-review.png?w=300&h=153 300w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-review.png?w=768&h=393 768w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-review.png?w=1024&h=524 1024w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p> <p>Entity page:</p> <p><img data-attachment-id="6506" data-permalink="https://blog.metabrainz.org/2017/08/30/gsoc-2017-rating-system-in-critiquebrainz/cb-entity-page/" data-orig-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-entity-page.png" data-orig-size="1169,566" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="cb-entity-page" data-image-description="" data-image-caption="" data-medium-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-entity-page.png?w=300" data-large-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-entity-page.png?w=1169" class="alignnone size-full wp-image-6506" src="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-entity-page.png?w=840" alt="cb-entity-page" srcset="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-entity-page.png 1169w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-entity-page.png?w=128&h=62 128w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-entity-page.png?w=300&h=145 300w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-entity-page.png?w=768&h=372 768w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-entity-page.png?w=1024&h=496 1024w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p> <p>Revision comparison:</p> <p><img data-attachment-id="6511" data-permalink="https://blog.metabrainz.org/2017/08/30/gsoc-2017-rating-system-in-critiquebrainz/cb-revision-comparison/" data-orig-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-revision-comparison.png" data-orig-size="1176,420" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="cb-revision-comparison" data-image-description="" data-image-caption="" data-medium-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-revision-comparison.png?w=300" data-large-file="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-revision-comparison.png?w=1176" loading="lazy" class="alignnone size-full wp-image-6511" src="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-revision-comparison.png?w=840" alt="cb-revision-comparison" srcset="https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-revision-comparison.png 1176w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-revision-comparison.png?w=128&h=46 128w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-revision-comparison.png?w=300&h=107 300w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-revision-comparison.png?w=768&h=274 768w, https://blog.metabrainz.org/wp-content/uploads/2017/08/cb-revision-comparison.png?w=1024&h=366 1024w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p> <h4>Web service</h4> <p>All the functionalities added to CritiqueBrainz had to be implemented in the web service (API) as well. All three types of reviews and other features are now supported via the web service. See the PR <a href="https://github.com/metabrainz/critiquebrainz/pull/154">here</a>.</p> <h4>Documentation</h4> <p>The chief part of the documentation was to update the schema. Other than that, rating parameter and several notes were added to the API documentation. See the PR <a href="https://github.com/metabrainz/critiquebrainz/pull/150">here</a>.</p> <p>Other PRs relevant to the project can be found <a href="https://github.com/metabrainz/critiquebrainz/pulls?utf8=%E2%9C%93&q=is%3Apr%20author%3Aps2611%20">here</a>.</p> <h3>Future work</h3> <p>First of all, I will complete the leftover work. Web service and frontend PRs are dependent on the rating scale PR. Once it gets merged, it’s 2–3 days of work to complete the rest.</p> <p>Other than that, I look forward to keep contributing to CritiqueBrainz and other MetaBrainz projects. I am sure many interesting ideas will be discussed at the annual MetaBrainz Summit in Barcelona.</p> <h3>Conclusion</h3> <p>It was quite an eventful summer and GSoC was the biggest of them. Thanks to Roman for his constant help and guidance over the entire summer and also to all the other community members. It was so cool to work on an open-source project and I would definitely suggest for any music and data lover to explore the MetaBrainz projects.</p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/psolanki10/">psolanki</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2017/08/30/gsoc-2017-rating-system-in-critiquebrainz/" rel="bookmark"><time class="entry-date published" datetime="2017-08-30T19:09:36+00:00">August 30, 2017</time><time class="updated" datetime="2017-08-30T19:10:43+00:00">August 30, 2017</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/critiquebrainz/" rel="category tag">CritiqueBrainz</a>, <a href="https://blog.metabrainz.org/category/google-programs/summer-of-code/" rel="category tag">Summer of Code</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/critiquebrainz/" rel="tag">CritiqueBrainz</a>, <a href="https://blog.metabrainz.org/tag/google-summer-of-code/" rel="tag">Google Summer of Code</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2017/08/30/gsoc-2017-rating-system-in-critiquebrainz/#respond">Leave a comment<span class="screen-reader-text"> on GSoC 2017: Rating System in CritiqueBrainz</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-6428 --> <article id="post-6546" class="post-6546 post type-post status-publish format-standard hentry category-listenbrainz category-summer-of-code tag-google-summer-of-code tag-listenbrainz"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2017/08/29/gsoc-2017-hacking-on-listenbrainz/" rel="bookmark">GSoC 2017: Hacking on ListenBrainz</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>Namaste!</p> <p>I am Param Singh, an undergraduate at the National Institute of Technology, Hamirpur, India, and I worked on ListenBrainz over the summer as part of the Google Summer of Code program. I started contributing code to ListenBrainz in January 2017 and have been working on new features and bug fixes since. I’ll be writing about the work I did and my experience working on LB in this blog post.</p> <p>After a few of my patches had made it in and I was comfortable with the ListenBrainz codebase (which was a really nice example of software architecture for me), I talked with the LB team about what possible contributions I could make over the summer, and we decided that a Google BigQuery based statistics system is something that would be useful to have in ListenBrainz after we release a beta and have listen data that is permanently archived. I made a <a href="https://community.metabrainz.org/t/gsoc-2017-adding-statistics-and-graphs-to-listenbrainz/227733">proposal</a> for adding statistics to ListenBrainz which got accepted! During the community bonding period, we decided to try to get a solid and stable beta of ListenBrainz released before starting with the relatively large code additions that would be required by my project proposal. We tracked issues that we wanted fixed before a release in the MetaBrainz ticket tracker <a href="https://tickets.metabrainz.org/projects/LB/versions/10621">here</a>. This work of fixing release blocking issues went into the coding period and we decided to continue working on a solid beta instead of adding new features for the time being. </p> <p>I started with fixing bugs and adding new features to get a beta released as soon as possible. Some cool stuff I worked on during this time was dockerizing MessyBrainz (see PR <a href="https://github.com/metabrainz/messybrainz-server/pull/18">here</a>), migrating the codebases of MessyBrainz and ListenBrainz to Python 3 (PRs <a href="https://github.com/metabrainz/listenbrainz-server/pull/187">here</a> and <a href="https://github.com/metabrainz/messybrainz-server/pull/20">here</a>) and improving the startup resilience of various parts of ListenBrainz to make sure that the server is able to self-heal (partially) if some part of it like RabbitMQ goes down (ticket <a href="https://tickets.metabrainz.org/browse/LB-155">here</a>). </p> <p>Later on, I did a big refactor of the LB code so that adding new modules would be easier in the future (PR <a href="https://github.com/metabrainz/listenbrainz-server/pull/179">here</a>). I also spent a lot of time fixing bugs in our listen deduplication. Relevant pull requests for this are <a href="https://github.com/metabrainz/listenbrainz-server/pull/212">here</a> and <a href="https://github.com/metabrainz/listenbrainz-server/pull/223">here</a>.</p> <p>Another feature I added to ListenBrainz while working on the beta was incremental imports. Earlier, LB didn’t keep track of previous imports of a user and did a full Last.FM import every time. However, now we keep track of the last time each user imported listens and only import new data since then. The PR adding incremental imports is <a href="https://github.com/metabrainz/listenbrainz-server/pull/207">here</a>.</p> <p>My mentor, Robert Kaye (ruaok) set up a test instance of the ListenBrainz server that was used by the community and as the community kept throwing their data at us, bugs kept popping up. A particularly weird bug caused LB to lose data for users with special characters in their usernames. The <a href="https://github.com/metabrainz/listenbrainz-server/pull/199">PR</a> to fix this took a lot of time to create. </p> <p>We kept on fixing bugs for a long time and the biggest thing I took away from this period of GSoC was the <a href="https://en.wikipedia.org/wiki/Ninety-ninety_rule">Ninety-ninety rule</a>: «The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time.» This summer has drilled this into my mind.</p> <p>As soon as the beta was released, I started with writing code for statistics, making schema changes (PR <a href="https://github.com/metabrainz/listenbrainz-server/pull/192">here</a>) and adding some user stats (PRs <a href="https://github.com/metabrainz/listenbrainz-server/pull/202">here</a> and <a href="https://github.com/metabrainz/listenbrainz-server/pull/244">here</a>). I’ll be continuing on the stats work after Summer of Code. The basic foundation of stats is mostly done and soon I’ll start with showing statistics to the users.</p> <p>By the end of the official GSoC coding period, I have made 266 commits in the ListenBrainz <a href="https://github.com/metabrainz/listenbrainz-server/graphs/contributors">codebase</a> and have opened a total of <a href="https://github.com/metabrainz/listenbrainz-server/pulls?utf8=%E2%9C%93&q=author%3Aparamsingh">111 pull requests</a>. The current production ListenBrainz running on <a href="https://listenbrainz.org">https://listenbrainz.org</a> has 253 commits by me, most of which were made during the GSoC period. </p> <p>Over the summer, I have fallen in love with the MetaBrainz community and have learned a lot of stuff. I’m really looking forward to adding more features to ListenBrainz soon, so that the data that the community is contributing becomes useful to everyone. I loved working on a really cool open-source project like ListenBrainz this summer and am very thankful to Google for providing me this opportunity. I would encourage everyone reading this to give the ListenBrainz beta a try and contribute to ListenBrainz if possible.</p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/paramsingh258/">iliekcomputers</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2017/08/29/gsoc-2017-hacking-on-listenbrainz/" rel="bookmark"><time class="entry-date published" datetime="2017-08-29T15:56:14+00:00">August 29, 2017</time><time class="updated" datetime="2017-08-29T15:57:11+00:00">August 29, 2017</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/listenbrainz/" rel="category tag">ListenBrainz</a>, <a href="https://blog.metabrainz.org/category/google-programs/summer-of-code/" rel="category tag">Summer of Code</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/google-summer-of-code/" rel="tag">Google Summer of Code</a>, <a href="https://blog.metabrainz.org/tag/listenbrainz/" rel="tag">ListenBrainz</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2017/08/29/gsoc-2017-hacking-on-listenbrainz/#comments">1 Comment<span class="screen-reader-text"> on GSoC 2017: Hacking on ListenBrainz</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-6546 --> <article id="post-6425" class="post-6425 post type-post status-publish format-standard hentry category-critiquebrainz category-summer-of-code tag-critiquebrainz tag-google-summer-of-code"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2017/08/28/gsoc-2017-directly-accessing-musicbrainz-db-in-critiquebrainz/" rel="bookmark">GSoC 2017: Directly accessing MusicBrainz DB in CritiqueBrainz</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>Hello, everyone! This summer was fantastic for me!<br /> I’m Suyash Garg, an undergraduate at National Institute of Technology, Hamirpur and I participated in Google Summer of Code 2017 contributing code to <a href="https://critiquebrainz.org/">CritiqueBrainz</a>. Alastair Porter mentored me during this GSoC programme. This post summarizes my contributions to the project and experiences that I had throughout the summer.</p> <p>I started contributing to CritiqueBrainz in January, 2017 and before the start of the SoC programme, I mainly worked on writing raw SQL for retrieving data from the CB database and replacing the ORM code (<a href="https://tickets.metabrainz.org/projects/CB/issues/CB-230">CB-230</a>). Other than that I worked on issues like <a href="https://tickets.metabrainz.org/projects/CB/issues/CB-120">CB-120</a>, <a href="https://tickets.metabrainz.org/projects/CB/issues/CB-235">CB-235</a> and other minor bugs and issues. They were my first proper contributions to the open source world. Thank you MetaBrainz!!</p> <p>For the Google Summer of Code 2017, my project involved retrieving data related to various entities (release-groups, artists, releases, events and places) directly from the MusicBrainz database instead of querying the MusicBrainz web service (<a href="https://tickets.metabrainz.org/projects/CB/issues/CB-231">CB-231</a>). This became necessary as some pages on CB required to fetch too much data and thus made many requests to the MB web service. These pages were taking a long time to load. Thus, by connecting directly to the database, we could reduce the load time of these pages.</p> <p>Here is a summary of my contributions to the project during the summer:</p> <dl> <dt><em style="text-decoration:underline;">Accessing the MusicBrainz database</em></dt> <dd>New Infrastructure is allowing us to easily read data directly from the MusicBrainz database. For accessing the database in the development environment, another service running the MusicBrainz database was added which uses an existing Docker image which the MusicBrainz project was already using. This allowed us to share resources between projects. I worked on adding an option to download the database dumps and import the data into the database (see <a href="https://github.com/metabrainz/musicbrainz-server/pull/523">PR#523</a>). Also, I added the service in CB docker-compose files and updated the <a href="http://critiquebrainz.readthedocs.io/intro.html#setting-up-the-server">documentation for setting up the development environment</a> (see <a href="https://github.com/metabrainz/critiquebrainz/pull/115">PR#115</a> and <a href="https://github.com/metabrainz/critiquebrainz/pull/92">PR#92</a>).</dd> <dt><em style="text-decoration:underline;">Fetching data using <code>mbdata.models</code></em></dt> <dd>After setting up the development environment, my mentor suggested to me to use the <a href="https://bitbucket.org/lalinsky/mbdata"><code>mbdata</code></a> package for writing queries to fetch data from the database instead of writing raw SQL. I worked on retrieving information for the entity: <a href="https://github.com/metabrainz/critiquebrainz/pull/110">places</a> and added helpers for fetching the relationship information. Following that, I worked on retrieving information for other entities (<a href="https://github.com/metabrainz/critiquebrainz/pull/122">release-groups</a>, <a href="https://github.com/metabrainz/critiquebrainz/pull/137">releases</a>, <a href="https://github.com/metabrainz/critiquebrainz/pull/148">events</a>, and <a href="https://github.com/metabrainz/critiquebrainz/pull/140">artists</a>). Also, since SQLAlchemy makes lazy queries to the database, a number of queries were being issued to the database. This could slow things down as for each query it was going to require one trip to the SQL server (network trip in production). So, as suggested by my mentor, I also worked on reducing the number of queries made for fetching data related to each entity (see <a href="https://github.com/metabrainz/critiquebrainz/pull/140">PR#135</a>). For pages that made a number of requests to the web service, I made this <a href="https://github.com/metabrainz/critiquebrainz/pull/121">PR#121</a> for fetching information related to multiple entities at the same time.</dd> <dt><em style="text-decoration:underline;">Testing</em></dt> <dd>For testing, the database queries are mocked using the <a href="https://docs.python.org/3/library/unittest.mock.html#module-unittest.mock"><code>unittest.mock</code></a> Python package. The tests added make sure that the code (serializing RowProxy objects to dictionaries, caching, etc.) works properly (see <a href="https://github.com/metabrainz/critiquebrainz/pull/134">PR#134</a>). Adding up a new service (as a separate Docker container) in the test environment and running tests was taking too much time (in creating the tables and truncating them). So as suggested by my mentors, mocking the database queries was the best option. Throughout my GSoC period, I learned how important it was to write tests (especially when you break things more when you fix something) and make them run fast. I learned that «If tests don’t run fast, they would be a distraction rather than a help» (quoting from the book “The Art of Agile Development” by James Shore).</dd> </dl> <p>Other than these, I also worked on some UI/UX issues, namely <a href="https://tickets.metabrainz.org/projects/CB/issues/CB-80">CB-80</a> (adding option to filter releases with reviews), <a href="https://tickets.metabrainz.org/projects/CB/issues/CB-84">CB-84</a> (ordering release groups according to release year) and <a href="https://tickets.metabrainz.org/projects/CB/issues/CB-261">CB-261</a> (authenticating requests to Spotify Web API). <a href="https://tickets.metabrainz.org/projects/CB/issues/CB-130">CB-130</a> (reviewing entities with MBID redirects – see <a href="https://github.com/metabrainz/critiquebrainz/pull/145">PR#145</a>) was also solved while solving a <a href="https://sentry.metabrainz.org/share/issue/342e32363535/">production server issue</a>.</p> <p>This summer was awesome for me. I learned a lot of new things and techniques for writing better code. Thanks to my mentors, Alastair Porter and Roman Tsukanov. Also, great thanks to the lovely MetaBrainz community and Google for this opportunity. I’m really looking forward to keep contributing to CritiqueBrainz and to dive into other MetaBrainz projects.</p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/suyashgarg/">Suyash Garg</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2017/08/28/gsoc-2017-directly-accessing-musicbrainz-db-in-critiquebrainz/" rel="bookmark"><time class="entry-date published updated" datetime="2017-08-28T16:36:33+00:00">August 28, 2017</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/critiquebrainz/" rel="category tag">CritiqueBrainz</a>, <a href="https://blog.metabrainz.org/category/google-programs/summer-of-code/" rel="category tag">Summer of Code</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/critiquebrainz/" rel="tag">CritiqueBrainz</a>, <a href="https://blog.metabrainz.org/tag/google-summer-of-code/" rel="tag">Google Summer of Code</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2017/08/28/gsoc-2017-directly-accessing-musicbrainz-db-in-critiquebrainz/#comments">3 Comments<span class="screen-reader-text"> on GSoC 2017: Directly accessing MusicBrainz DB in CritiqueBrainz</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-6425 --> <article id="post-6419" class="post-6419 post type-post status-publish format-standard hentry category-musicbrainz category-schema-change-release tag-musicbrainz tag-schema-change"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2017/08/15/no-autumn-2017-schema-change-release/" rel="bookmark">No autumn 2017 schema change release</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>Once again, we’re opting to not have a schema change release in the Autumn of 2017. Expect our next schema change release to be on or about 15 May, 2018.</p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/ruaok/">ruaok</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2017/08/15/no-autumn-2017-schema-change-release/" rel="bookmark"><time class="entry-date published updated" datetime="2017-08-15T13:41:49+00:00">August 15, 2017</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/musicbrainz/" rel="category tag">MusicBrainz</a>, <a href="https://blog.metabrainz.org/category/development/updates/breaking-changes/schema-change-release/" rel="category tag">Schema Change Release</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/musicbrainz/" rel="tag">MusicBrainz</a>, <a href="https://blog.metabrainz.org/tag/schema-change/" rel="tag">schema change</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2017/08/15/no-autumn-2017-schema-change-release/#respond">Leave a comment<span class="screen-reader-text"> on No autumn 2017 schema change release</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-6419 --> <article id="post-6413" class="post-6413 post type-post status-publish format-standard hentry category-cleanup-of-the-month category-musicbrainz"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2017/08/06/classical-community-cleanup-1-debussy/" rel="bookmark">Classical Community Cleanup #1: Debussy</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p><span style="font-weight:400;">The Metabrainz Classical Music Enthusiasts Team has kicked off to a strong start! If you are unaware about the formation and tasks at hand, you can <a href="https://community.metabrainz.org/c/musicbrainz/classical">read more about it on the forums</a>.</span></p> <p><span style="font-weight:400;">It’s clear by the number of discussions and engagements in the forum that a community effort on classical music was long overdue! It’s thrilling and we are eager for the first mission: after some <a href="https://community.metabrainz.org/t/possible-community-cleanup-targets/293033">discussion</a></span><span style="font-weight:400;"> and <a href="https://community.metabrainz.org/t/vote-community-cleanup-for-august/300695">voting</a> </span><span style="font-weight:400;">we decided that the first community effort would be <a href="https://community.metabrainz.org/t/community-cleanup-1-debussy/315984">a clean-up of all our data for Claude Debussy</a></span><span style="font-weight:400;">. </span></p> <p><span style="font-weight:400;">As a composer with a huge influence in 20th century music, yet with a relatively low amount of hard to edit compositions like operas, <a href="https://musicbrainz.org/artist/be50643c-0377-4968-b48c-47e06b2e2a3b">Debussy</a></span><span style="font-weight:400;"> is a great first choice for the community of classical editors to start actively working together to improve the data. As such, if you’d like to help out, but are new to classical editing or not too active in the community yet, don’t hesitate to reach out and ask any questions. The classical community is active in <a href="https://community.metabrainz.org/c/musicbrainz/classical">its own forum category</a></span><span style="font-weight:400;">, and we’re hoping to see a lot of activity there with editors both asking and answering questions. </span></p> <p><span style="font-weight:400;">What will we be working on in this first classical cleanup project? </span></p> <ul> <li><span style="font-weight:400;">We will review the existing works and catalogues to make sure there are no duplicates and the info looks correct (several very active classical editors have already been working on this in preparation for this cleanup).</span></li> <li><span style="font-weight:400;">We will check the release list for anything that doesn’t follow the classical guidelines. Those should of course be fixed to follow the guidelines, and that’s usually a good sign of the recording and relationship info being incomplete as well.</span></li> <li><span style="font-weight:400;">We will work on the recording list. The only recordings that should be there by the end of the cleanup are of Debussy himself as a performer. Anything else currently there should have performer relationships added to it if missing, then the artist credits for the recording should be changed to list the main performers.</span></li> <li><span style="font-weight:400;">And we will add missing Debussy recordings! If you have enough info to add a release we’re missing that includes works by Debussy, that’s always useful. Just make sure to try to add as much info as possible from the get go, so we don’t have to clean that addition up as well!</span></li> </ul> <p><span style="font-weight:400;">Don’t know where to begin? Let us know and we can help find a starting point–or just jump in and help out! We can’t wait for Mr. Debussy to be a great example of how much information MusicBrainz can provide!</span></p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/reosarevok/">reosarevok</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2017/08/06/classical-community-cleanup-1-debussy/" rel="bookmark"><time class="entry-date published" datetime="2017-08-06T12:00:06+00:00">August 6, 2017</time><time class="updated" datetime="2017-08-05T13:32:56+00:00">August 5, 2017</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/community/cleanup-of-the-month/" rel="category tag">Cleanup of the Month</a>, <a href="https://blog.metabrainz.org/category/musicbrainz/" rel="category tag">MusicBrainz</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2017/08/06/classical-community-cleanup-1-debussy/#respond">Leave a comment<span class="screen-reader-text"> on Classical Community Cleanup #1: Debussy</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-6413 --> <article id="post-6364" class="post-6364 post type-post status-publish format-standard hentry category-listenbrainz tag-bigdata tag-bigquery tag-google tag-listenbrainz"> <header class="entry-header"> <h2 class="entry-title"><a href="https://blog.metabrainz.org/2017/08/05/listenbrainz-data-is-live-on-bigquery/" rel="bookmark">ListenBrainz data is live on BigQuery!</a></h2> </header><!-- .entry-header --> <div class="entry-content"> <p>We’re pleased to announce that in cooperation with Google, we are live streaming our <a href="https://listenbrainz.org">ListenBrainz</a> data to <a href="https://cloud.google.com/bigquery/">Google’s BigQuery service</a>!</p> <p>ListenBrainz is a project is that has the potential to gather a lot of data quickly, which would require us to have a Big Data infrastructure, which can be expensive. In an effort to use our available cash wisely, we began to look around for ways to take advantage of other infrastructures with lower costs.</p> <p>Two years ago at the Google Summer of Code mentor summit I met with a representative from the BigQuery team who said that Google was happy to host any public data set for free! I immediately took them up on this offer and started a conversation. With much time passed, we finally managed to get the data set live!</p> <p>If you wish to play with the data, please do!</p> <p style="padding-left:30px;"><a href="https://bigquery.cloud.google.com/table/listenbrainz:listenbrainz.listen"><em>https://bigquery.cloud.google.com/table/listenbrainz:listenbrainz.listen</em></a></p> <p>You’ll need a Google account to log in with — once you’re logged in, every user gets 5TB of query traffic free per month. That is quite a lot for how large this dataset is currently. The <a href="https://github.com/metabrainz/listenbrainz-server/blob/master/admin/bigquery/listen-schema.json">schema for this table</a> is defined here and what the data elements mean are defined in our <a href="http://listenbrainz.readthedocs.io/en/production/dev/json.html">API docs</a>. To get you started, I’ve written a few sample queries:</p> <ul> <li><a href="https://bigquery.cloud.google.com/savedquery/186965179676:d92533c348924618a9c39e74dbb85a63">The last 25 listens for all users</a></li> <li><a href="https://bigquery.cloud.google.com/results/resonant-cairn-175115:bquijob_4afb3311_15dacfbf2b6">The top 25 artists for user “rob”</a></li> <li><a href="https://bigquery.cloud.google.com/savedquery/186965179676:8b54ac5884ba46188093695ed84f7a71">Top tracks and artists for user “rob”</a></li> </ul> <p>BigQuery uses an SQL like syntax, so if you know some SQL then diving right in should be easy. The queries above should give you an idea of what you can do with this data. Now, please know that currently we have approaching 30M listens, so the dataset is still quite small. We’re very much interested to see what sort of things people can come up with in the near future.</p> <p>Finally, some notes about openness and proprietary software: Given that we have limited resources, we aim to make the most things happen with the services that are at our disposal. Google has been extremely generous to us over the years and we’re very pleased to have access to BigQuery now.</p> <p>That is not to say that we’re putting all of our eggs in one basket or forcing people to use BigQuery. Our InfluxDB database hosted on our own servers keeps the master archival copy of our listen data. Soon we hope to make dumps of this data available for anyone to download and play with using whatever tools they would like. With this setup we are not fully reliant on Google for keeping this project alive. We’re glad to have their support, but should circumstance change, we can find another BigData solution and load our master archival copy there.</p> <p>Now, go play with this very promising data and post some of your favorite queries in the comments!</p> <p> </p> <p> </p> </div><!-- .entry-content --> <footer class="entry-footer"> <span class="byline"><span class="author vcard"><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://blog.metabrainz.org/author/ruaok/">ruaok</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://blog.metabrainz.org/2017/08/05/listenbrainz-data-is-live-on-bigquery/" rel="bookmark"><time class="entry-date published updated" datetime="2017-08-05T10:20:45+00:00">August 5, 2017</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://blog.metabrainz.org/category/listenbrainz/" rel="category tag">ListenBrainz</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://blog.metabrainz.org/tag/bigdata/" rel="tag">bigdata</a>, <a href="https://blog.metabrainz.org/tag/bigquery/" rel="tag">bigquery</a>, <a href="https://blog.metabrainz.org/tag/google/" rel="tag">google</a>, <a href="https://blog.metabrainz.org/tag/listenbrainz/" rel="tag">ListenBrainz</a></span><span class="comments-link"><a href="https://blog.metabrainz.org/2017/08/05/listenbrainz-data-is-live-on-bigquery/#respond">Leave a comment<span class="screen-reader-text"> on ListenBrainz data is live on BigQuery!</span></a></span> </footer><!-- .entry-footer --> </article><!-- #post-6364 --> </main><!-- .site-main --> </div><!-- .content-area --> <aside id="secondary" class="sidebar widget-area"> <section id="block-7" class="widget widget_block"><h2 class="widget-title">Links</h2><div class="wp-widget-group__inner-blocks"> <ul class="wp-block-list"> <li><a href="https://metabrainz.org/">MetaBrainz Foundation</a></li> <li><a href="https://community.metabrainz.org/">MetaBrainz Forums</a></li> <li><a href="https://bsky.app/profile/metabrainz.org">Bluesky</a> / <a href="https://mastodon.social/@metabrainz">Mastodon</a></li> </ul> <ul class="wp-block-list"> <li><a href="https://musicbrainz.org/">MusicBrainz</a></li> <li><a href="https://listenbrainz.org/">ListenBrainz</a></li> <li><a href="https://bookbrainz.org/">BookBrainz</a></li> </ul> </div></section><section id="search-2" class="widget widget_search"><h2 class="widget-title">Search</h2> <form role="search" method="get" class="search-form" action="https://blog.metabrainz.org/"> <label> <span class="screen-reader-text"> Search for: </span> <input type="search" class="search-field" placeholder="Search …" value="" name="s" /> </label> <button type="submit" class="search-submit"><span class="screen-reader-text"> Search </span></button> </form> </section><section id="recent-comments-2" class="widget widget_recent_comments"><h2 class="widget-title">Recent Comments</h2> <table class="recentcommentsavatar" cellspacing="0" cellpadding="0" border="0"> <tr><td title="Hevosen Perse" class="recentcommentsavatartop" style="height:32px; width:32px;"></td><td class="recentcommentstexttop" style="">Hevosen Perse on <a href="https://blog.metabrainz.org/2024/04/23/ssl-com-is-evil-and-deceptive-dont-do-business-with-ssl-com/#comment-366399">SSL.com is evil and deceptive:…</a></td></tr><tr><td title="roman412" class="recentcommentsavatarend" style="height:32px; width:32px;"></td><td class="recentcommentstextend" style="">roman412 on <a href="https://blog.metabrainz.org/2025/02/05/picard-2-13-1-released/#comment-366398">Picard 2.13.1 released</a></td></tr><tr><td title="phwolfer" class="recentcommentsavatarend" style="height:32px; width:32px;"></td><td class="recentcommentstextend" style="">phwolfer on <a href="https://blog.metabrainz.org/2025/02/05/picard-2-13-1-released/#comment-366396">Picard 2.13.1 released</a></td></tr><tr><td title="roman412" class="recentcommentsavatarend" style="height:32px; width:32px;"></td><td class="recentcommentstextend" style="">roman412 on <a href="https://blog.metabrainz.org/2025/02/05/picard-2-13-1-released/#comment-366395">Picard 2.13.1 released</a></td></tr><tr><td title="yvanzo" class="recentcommentsavatarend" style="height:32px; width:32px;"></td><td class="recentcommentstextend" style="">yvanzo on <a href="https://blog.metabrainz.org/2025/01/29/musicbrainz-mirror-security-advisory-2025-01-29/#comment-366392">MusicBrainz mirror security ad…</a></td></tr> </table> </section><section id="categories-2" class="widget widget_categories"><h2 class="widget-title">Categories</h2><nav aria-label="Categories"> <ul> <li class="cat-item cat-item-304848241"><a href="https://blog.metabrainz.org/category/acousticbrainz/">AcousticBrainz</a> (17) </li> <li class="cat-item cat-item-12894481"><a href="https://blog.metabrainz.org/category/musicbrainz/android-app/">Android App</a> (9) </li> <li class="cat-item cat-item-494176"><a href="https://blog.metabrainz.org/category/metabrainz/annual-report/">Annual Report</a> (9) </li> <li class="cat-item cat-item-91682"><a href="https://blog.metabrainz.org/category/april-fools-day/">April Fools' Day</a> (7) </li> <li class="cat-item cat-item-143163948"><a href="https://blog.metabrainz.org/category/better-late-than-never-dept/">Better late than never dept.</a> (14) </li> <li class="cat-item cat-item-635784"><a href="https://blog.metabrainz.org/category/metabrainz/board-meeting-minutes/">Board Meeting Minutes</a> (2) </li> <li class="cat-item cat-item-462334187"><a href="https://blog.metabrainz.org/category/bookbrainz/">BookBrainz</a> (18) </li> <li class="cat-item cat-item-19867758"><a href="https://blog.metabrainz.org/category/development/updates/breaking-changes/">Breaking Changes</a> (7) </li> <li class="cat-item cat-item-772072676"><a href="https://blog.metabrainz.org/category/chatbrainz/">chatbrainz</a> (1) </li> <li class="cat-item cat-item-31409893"><a href="https://blog.metabrainz.org/category/community/cleanup-of-the-month/">Cleanup of the Month</a> (6) </li> <li class="cat-item cat-item-424687959"><a href="https://blog.metabrainz.org/category/google-programs/code%e2%80%90in/">Code‐in</a> (4) </li> <li class="cat-item cat-item-55382"><a href="https://blog.metabrainz.org/category/collaborations/">Collaborations</a> (4) </li> <li class="cat-item cat-item-2528"><a href="https://blog.metabrainz.org/category/community/">Community</a> (142) </li> <li class="cat-item cat-item-71159043"><a href="https://blog.metabrainz.org/category/community/community-recap/">Community Recap</a> (3) </li> <li class="cat-item cat-item-143163949"><a href="https://blog.metabrainz.org/category/musicbrainz/cover-art-archive/">Cover Art Archive</a> (5) </li> <li class="cat-item cat-item-225948242"><a href="https://blog.metabrainz.org/category/critiquebrainz/">CritiqueBrainz</a> (12) </li> <li class="cat-item cat-item-22379"><a href="https://blog.metabrainz.org/category/data/">Data</a> (30) </li> <li class="cat-item cat-item-780"><a href="https://blog.metabrainz.org/category/development/">Development</a> (259) </li> <li class="cat-item cat-item-772478166"><a href="https://blog.metabrainz.org/category/musicbrainz/event-art-archive/">Event Art Archive</a> (4) </li> <li class="cat-item cat-item-54"><a href="https://blog.metabrainz.org/category/general/">General</a> (134) </li> <li class="cat-item cat-item-23185871"><a href="https://blog.metabrainz.org/category/google-programs/">Google Programs</a> (18) </li> <li class="cat-item cat-item-79"><a href="https://blog.metabrainz.org/category/hardware/">Hardware</a> (24) </li> <li class="cat-item cat-item-149"><a href="https://blog.metabrainz.org/category/general/hosting/">Hosting</a> (70) </li> <li class="cat-item cat-item-6850"><a href="https://blog.metabrainz.org/category/musicbrainz/instruments/">Instruments</a> (10) </li> <li class="cat-item cat-item-47801351"><a href="https://blog.metabrainz.org/category/internet-pests/">Internet pests</a> (2) </li> <li class="cat-item cat-item-3558"><a href="https://blog.metabrainz.org/category/jobs/">Jobs</a> (1) </li> <li class="cat-item cat-item-2283"><a href="https://blog.metabrainz.org/category/legal/">Legal</a> (1) </li> <li class="cat-item cat-item-143163951"><a href="https://blog.metabrainz.org/category/libmusicbrainz/">libmusicbrainz</a> (15) </li> <li class="cat-item cat-item-7394916"><a href="https://blog.metabrainz.org/category/libtunepimp/">libtunepimp</a> (8) </li> <li class="cat-item cat-item-19606597"><a href="https://blog.metabrainz.org/category/data/linked-open-data/">Linked open data</a> (2) </li> <li class="cat-item cat-item-399253082"><a href="https://blog.metabrainz.org/category/listenbrainz/">ListenBrainz</a> (61) </li> <li class="cat-item cat-item-646467582"><a href="https://blog.metabrainz.org/category/messybrainz/">MessyBrainz</a> (1) </li> <li class="cat-item cat-item-122663067"><a href="https://blog.metabrainz.org/category/metabrainz/">MetaBrainz</a> (121) </li> <li class="cat-item cat-item-42827"><a href="https://blog.metabrainz.org/category/moderation/">Moderation</a> (8) </li> <li class="cat-item cat-item-170964"><a href="https://blog.metabrainz.org/category/musicbrainz/">MusicBrainz</a> (246) </li> <li class="cat-item cat-item-1511234"><a href="https://blog.metabrainz.org/category/musicbrainz/ngs/">NGS</a> (69) </li> <li class="cat-item cat-item-106116"><a href="https://blog.metabrainz.org/category/musicbrainz/picard/">Picard</a> (135) </li> <li class="cat-item cat-item-201310711"><a href="https://blog.metabrainz.org/category/development/updates/breaking-changes/schema-change-release/">Schema Change Release</a> (66) </li> <li class="cat-item cat-item-3079703"><a href="https://blog.metabrainz.org/category/development/search-server/">Search Server</a> (19) </li> <li class="cat-item cat-item-18568"><a href="https://blog.metabrainz.org/category/development/server/">Server</a> (461) </li> <li class="cat-item cat-item-646632085"><a href="https://blog.metabrainz.org/category/spambrainz/">SpamBrainz</a> (2) </li> <li class="cat-item cat-item-5959850"><a href="https://blog.metabrainz.org/category/style-guidelines/">Style Guidelines</a> (23) </li> <li class="cat-item cat-item-13930"><a href="https://blog.metabrainz.org/category/summaries/">Summaries</a> (6) </li> <li class="cat-item cat-item-176372"><a href="https://blog.metabrainz.org/category/google-programs/summer-of-code/">Summer of Code</a> (87) </li> <li class="cat-item cat-item-115537"><a href="https://blog.metabrainz.org/category/summit/">Summit</a> (25) </li> <li class="cat-item cat-item-143163953"><a href="https://blog.metabrainz.org/category/musicbrainz/tagger-affiliates/">Tagger Affiliates</a> (9) </li> <li class="cat-item cat-item-1"><a href="https://blog.metabrainz.org/category/uncategorized/">Uncategorized</a> (59) </li> <li class="cat-item cat-item-1171"><a href="https://blog.metabrainz.org/category/development/updates/">Updates</a> (358) </li> <li class="cat-item cat-item-95007"><a href="https://blog.metabrainz.org/category/development/virtual-machine/">Virtual Machine</a> (94) </li> <li class="cat-item cat-item-1359"><a href="https://blog.metabrainz.org/category/wiki/">Wiki</a> (7) </li> <li class="cat-item cat-item-143163954"><a href="https://blog.metabrainz.org/category/musicbrainz/windowstagger/">WindowsTagger</a> (33) </li> </ul> </nav></section><section id="archives-2" class="widget widget_archive"><h2 class="widget-title">Archives</h2><nav aria-label="Archives"> <ul> <li><a href='https://blog.metabrainz.org/2025/02/'>February 2025</a> (6)</li> <li><a href='https://blog.metabrainz.org/2025/01/'>January 2025</a> (4)</li> <li><a href='https://blog.metabrainz.org/2024/12/'>December 2024</a> (3)</li> <li><a href='https://blog.metabrainz.org/2024/11/'>November 2024</a> (6)</li> <li><a href='https://blog.metabrainz.org/2024/10/'>October 2024</a> (4)</li> <li><a href='https://blog.metabrainz.org/2024/09/'>September 2024</a> (7)</li> <li><a href='https://blog.metabrainz.org/2024/08/'>August 2024</a> (8)</li> <li><a href='https://blog.metabrainz.org/2024/07/'>July 2024</a> (3)</li> <li><a href='https://blog.metabrainz.org/2024/06/'>June 2024</a> (5)</li> <li><a href='https://blog.metabrainz.org/2024/05/'>May 2024</a> (6)</li> <li><a href='https://blog.metabrainz.org/2024/04/'>April 2024</a> (5)</li> <li><a href='https://blog.metabrainz.org/2024/03/'>March 2024</a> (5)</li> <li><a href='https://blog.metabrainz.org/2024/02/'>February 2024</a> (3)</li> <li><a href='https://blog.metabrainz.org/2024/01/'>January 2024</a> (5)</li> <li><a href='https://blog.metabrainz.org/2023/12/'>December 2023</a> (4)</li> <li><a href='https://blog.metabrainz.org/2023/11/'>November 2023</a> (5)</li> <li><a href='https://blog.metabrainz.org/2023/10/'>October 2023</a> (6)</li> <li><a href='https://blog.metabrainz.org/2023/09/'>September 2023</a> (8)</li> <li><a href='https://blog.metabrainz.org/2023/08/'>August 2023</a> (8)</li> <li><a href='https://blog.metabrainz.org/2023/07/'>July 2023</a> (6)</li> <li><a href='https://blog.metabrainz.org/2023/06/'>June 2023</a> (5)</li> <li><a href='https://blog.metabrainz.org/2023/05/'>May 2023</a> (9)</li> <li><a href='https://blog.metabrainz.org/2023/04/'>April 2023</a> (3)</li> <li><a href='https://blog.metabrainz.org/2023/03/'>March 2023</a> (3)</li> <li><a href='https://blog.metabrainz.org/2023/02/'>February 2023</a> (5)</li> <li><a href='https://blog.metabrainz.org/2023/01/'>January 2023</a> (4)</li> <li><a href='https://blog.metabrainz.org/2022/12/'>December 2022</a> (2)</li> <li><a href='https://blog.metabrainz.org/2022/11/'>November 2022</a> (5)</li> <li><a href='https://blog.metabrainz.org/2022/10/'>October 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2022/09/'>September 2022</a> (6)</li> <li><a href='https://blog.metabrainz.org/2022/08/'>August 2022</a> (4)</li> <li><a href='https://blog.metabrainz.org/2022/07/'>July 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2022/06/'>June 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2022/05/'>May 2022</a> (6)</li> <li><a href='https://blog.metabrainz.org/2022/04/'>April 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2022/03/'>March 2022</a> (5)</li> <li><a href='https://blog.metabrainz.org/2022/02/'>February 2022</a> (4)</li> <li><a href='https://blog.metabrainz.org/2022/01/'>January 2022</a> (3)</li> <li><a href='https://blog.metabrainz.org/2021/12/'>December 2021</a> (7)</li> <li><a href='https://blog.metabrainz.org/2021/11/'>November 2021</a> (3)</li> <li><a href='https://blog.metabrainz.org/2021/10/'>October 2021</a> (4)</li> <li><a href='https://blog.metabrainz.org/2021/09/'>September 2021</a> (3)</li> <li><a href='https://blog.metabrainz.org/2021/08/'>August 2021</a> (6)</li> <li><a href='https://blog.metabrainz.org/2021/07/'>July 2021</a> (2)</li> <li><a href='https://blog.metabrainz.org/2021/06/'>June 2021</a> (5)</li> <li><a href='https://blog.metabrainz.org/2021/05/'>May 2021</a> (5)</li> <li><a href='https://blog.metabrainz.org/2021/04/'>April 2021</a> (6)</li> <li><a href='https://blog.metabrainz.org/2021/03/'>March 2021</a> (6)</li> <li><a href='https://blog.metabrainz.org/2021/02/'>February 2021</a> (4)</li> <li><a href='https://blog.metabrainz.org/2021/01/'>January 2021</a> (2)</li> <li><a href='https://blog.metabrainz.org/2020/12/'>December 2020</a> (5)</li> <li><a href='https://blog.metabrainz.org/2020/11/'>November 2020</a> (3)</li> <li><a href='https://blog.metabrainz.org/2020/10/'>October 2020</a> (6)</li> <li><a href='https://blog.metabrainz.org/2020/09/'>September 2020</a> (4)</li> <li><a href='https://blog.metabrainz.org/2020/08/'>August 2020</a> (8)</li> <li><a href='https://blog.metabrainz.org/2020/07/'>July 2020</a> (4)</li> <li><a href='https://blog.metabrainz.org/2020/06/'>June 2020</a> (4)</li> <li><a href='https://blog.metabrainz.org/2020/05/'>May 2020</a> (5)</li> <li><a href='https://blog.metabrainz.org/2020/04/'>April 2020</a> (5)</li> <li><a href='https://blog.metabrainz.org/2020/03/'>March 2020</a> (3)</li> <li><a href='https://blog.metabrainz.org/2020/02/'>February 2020</a> (8)</li> <li><a href='https://blog.metabrainz.org/2020/01/'>January 2020</a> (3)</li> <li><a href='https://blog.metabrainz.org/2019/12/'>December 2019</a> (3)</li> <li><a href='https://blog.metabrainz.org/2019/11/'>November 2019</a> (4)</li> <li><a href='https://blog.metabrainz.org/2019/10/'>October 2019</a> (4)</li> <li><a href='https://blog.metabrainz.org/2019/09/'>September 2019</a> (4)</li> <li><a href='https://blog.metabrainz.org/2019/08/'>August 2019</a> (7)</li> <li><a href='https://blog.metabrainz.org/2019/06/'>June 2019</a> (3)</li> <li><a href='https://blog.metabrainz.org/2019/05/'>May 2019</a> (4)</li> <li><a href='https://blog.metabrainz.org/2019/04/'>April 2019</a> (3)</li> <li><a href='https://blog.metabrainz.org/2019/03/'>March 2019</a> (5)</li> <li><a href='https://blog.metabrainz.org/2019/02/'>February 2019</a> (2)</li> <li><a href='https://blog.metabrainz.org/2019/01/'>January 2019</a> (2)</li> <li><a href='https://blog.metabrainz.org/2018/12/'>December 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/11/'>November 2018</a> (4)</li> <li><a href='https://blog.metabrainz.org/2018/10/'>October 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/09/'>September 2018</a> (9)</li> <li><a href='https://blog.metabrainz.org/2018/08/'>August 2018</a> (7)</li> <li><a href='https://blog.metabrainz.org/2018/07/'>July 2018</a> (4)</li> <li><a href='https://blog.metabrainz.org/2018/06/'>June 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/05/'>May 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/04/'>April 2018</a> (2)</li> <li><a href='https://blog.metabrainz.org/2018/03/'>March 2018</a> (7)</li> <li><a href='https://blog.metabrainz.org/2018/02/'>February 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2018/01/'>January 2018</a> (3)</li> <li><a href='https://blog.metabrainz.org/2017/12/'>December 2017</a> (2)</li> <li><a href='https://blog.metabrainz.org/2017/11/'>November 2017</a> (2)</li> <li><a href='https://blog.metabrainz.org/2017/10/'>October 2017</a> (2)</li> <li><a href='https://blog.metabrainz.org/2017/09/'>September 2017</a> (10)</li> <li><a href='https://blog.metabrainz.org/2017/08/' aria-current="page">August 2017</a> (7)</li> <li><a href='https://blog.metabrainz.org/2017/07/'>July 2017</a> (3)</li> <li><a href='https://blog.metabrainz.org/2017/06/'>June 2017</a> (5)</li> <li><a href='https://blog.metabrainz.org/2017/05/'>May 2017</a> (6)</li> <li><a href='https://blog.metabrainz.org/2017/04/'>April 2017</a> (3)</li> <li><a href='https://blog.metabrainz.org/2017/03/'>March 2017</a> (5)</li> <li><a href='https://blog.metabrainz.org/2017/02/'>February 2017</a> (5)</li> <li><a href='https://blog.metabrainz.org/2017/01/'>January 2017</a> (4)</li> <li><a href='https://blog.metabrainz.org/2016/12/'>December 2016</a> (5)</li> <li><a href='https://blog.metabrainz.org/2016/11/'>November 2016</a> (5)</li> <li><a href='https://blog.metabrainz.org/2016/10/'>October 2016</a> (2)</li> <li><a href='https://blog.metabrainz.org/2016/09/'>September 2016</a> (1)</li> <li><a href='https://blog.metabrainz.org/2016/08/'>August 2016</a> (7)</li> <li><a href='https://blog.metabrainz.org/2016/07/'>July 2016</a> (3)</li> <li><a href='https://blog.metabrainz.org/2016/06/'>June 2016</a> (3)</li> <li><a href='https://blog.metabrainz.org/2016/05/'>May 2016</a> (14)</li> <li><a href='https://blog.metabrainz.org/2016/04/'>April 2016</a> (4)</li> <li><a href='https://blog.metabrainz.org/2016/03/'>March 2016</a> (8)</li> <li><a href='https://blog.metabrainz.org/2016/02/'>February 2016</a> (6)</li> <li><a href='https://blog.metabrainz.org/2016/01/'>January 2016</a> (4)</li> <li><a href='https://blog.metabrainz.org/2015/12/'>December 2015</a> (4)</li> <li><a href='https://blog.metabrainz.org/2015/11/'>November 2015</a> (6)</li> <li><a href='https://blog.metabrainz.org/2015/10/'>October 2015</a> (2)</li> <li><a href='https://blog.metabrainz.org/2015/09/'>September 2015</a> (9)</li> <li><a href='https://blog.metabrainz.org/2015/08/'>August 2015</a> (5)</li> <li><a href='https://blog.metabrainz.org/2015/07/'>July 2015</a> (12)</li> <li><a href='https://blog.metabrainz.org/2015/06/'>June 2015</a> (4)</li> <li><a href='https://blog.metabrainz.org/2015/05/'>May 2015</a> (8)</li> <li><a href='https://blog.metabrainz.org/2015/04/'>April 2015</a> (5)</li> <li><a href='https://blog.metabrainz.org/2015/03/'>March 2015</a> (9)</li> <li><a href='https://blog.metabrainz.org/2015/02/'>February 2015</a> (5)</li> <li><a href='https://blog.metabrainz.org/2015/01/'>January 2015</a> (6)</li> <li><a href='https://blog.metabrainz.org/2014/12/'>December 2014</a> (6)</li> <li><a href='https://blog.metabrainz.org/2014/11/'>November 2014</a> (8)</li> <li><a href='https://blog.metabrainz.org/2014/10/'>October 2014</a> (6)</li> <li><a href='https://blog.metabrainz.org/2014/09/'>September 2014</a> (5)</li> <li><a href='https://blog.metabrainz.org/2014/08/'>August 2014</a> (2)</li> <li><a href='https://blog.metabrainz.org/2014/07/'>July 2014</a> (5)</li> <li><a href='https://blog.metabrainz.org/2014/06/'>June 2014</a> (3)</li> <li><a href='https://blog.metabrainz.org/2014/05/'>May 2014</a> (9)</li> <li><a href='https://blog.metabrainz.org/2014/04/'>April 2014</a> (5)</li> <li><a href='https://blog.metabrainz.org/2014/03/'>March 2014</a> (7)</li> <li><a href='https://blog.metabrainz.org/2014/02/'>February 2014</a> (4)</li> <li><a href='https://blog.metabrainz.org/2014/01/'>January 2014</a> (2)</li> <li><a href='https://blog.metabrainz.org/2013/12/'>December 2013</a> (10)</li> <li><a href='https://blog.metabrainz.org/2013/11/'>November 2013</a> (7)</li> <li><a href='https://blog.metabrainz.org/2013/10/'>October 2013</a> (9)</li> <li><a href='https://blog.metabrainz.org/2013/09/'>September 2013</a> (7)</li> <li><a href='https://blog.metabrainz.org/2013/08/'>August 2013</a> (7)</li> <li><a href='https://blog.metabrainz.org/2013/07/'>July 2013</a> (4)</li> <li><a href='https://blog.metabrainz.org/2013/06/'>June 2013</a> (11)</li> <li><a href='https://blog.metabrainz.org/2013/05/'>May 2013</a> (8)</li> <li><a href='https://blog.metabrainz.org/2013/04/'>April 2013</a> (6)</li> <li><a href='https://blog.metabrainz.org/2013/03/'>March 2013</a> (7)</li> <li><a href='https://blog.metabrainz.org/2013/02/'>February 2013</a> (8)</li> <li><a href='https://blog.metabrainz.org/2013/01/'>January 2013</a> (8)</li> <li><a href='https://blog.metabrainz.org/2012/12/'>December 2012</a> (4)</li> <li><a href='https://blog.metabrainz.org/2012/11/'>November 2012</a> (4)</li> <li><a href='https://blog.metabrainz.org/2012/10/'>October 2012</a> (11)</li> <li><a href='https://blog.metabrainz.org/2012/09/'>September 2012</a> (13)</li> <li><a href='https://blog.metabrainz.org/2012/08/'>August 2012</a> (5)</li> <li><a href='https://blog.metabrainz.org/2012/07/'>July 2012</a> (9)</li> <li><a href='https://blog.metabrainz.org/2012/06/'>June 2012</a> (7)</li> <li><a href='https://blog.metabrainz.org/2012/05/'>May 2012</a> (14)</li> <li><a href='https://blog.metabrainz.org/2012/04/'>April 2012</a> (6)</li> <li><a href='https://blog.metabrainz.org/2012/03/'>March 2012</a> (7)</li> <li><a href='https://blog.metabrainz.org/2012/02/'>February 2012</a> (5)</li> <li><a href='https://blog.metabrainz.org/2012/01/'>January 2012</a> (13)</li> <li><a href='https://blog.metabrainz.org/2011/12/'>December 2011</a> (8)</li> <li><a href='https://blog.metabrainz.org/2011/11/'>November 2011</a> (4)</li> <li><a href='https://blog.metabrainz.org/2011/10/'>October 2011</a> (9)</li> <li><a href='https://blog.metabrainz.org/2011/09/'>September 2011</a> (6)</li> <li><a href='https://blog.metabrainz.org/2011/08/'>August 2011</a> (7)</li> <li><a href='https://blog.metabrainz.org/2011/07/'>July 2011</a> (11)</li> <li><a href='https://blog.metabrainz.org/2011/06/'>June 2011</a> (9)</li> <li><a href='https://blog.metabrainz.org/2011/05/'>May 2011</a> (22)</li> <li><a href='https://blog.metabrainz.org/2011/04/'>April 2011</a> (4)</li> <li><a href='https://blog.metabrainz.org/2011/03/'>March 2011</a> (8)</li> <li><a href='https://blog.metabrainz.org/2011/02/'>February 2011</a> (6)</li> <li><a href='https://blog.metabrainz.org/2011/01/'>January 2011</a> (7)</li> <li><a href='https://blog.metabrainz.org/2010/12/'>December 2010</a> (1)</li> <li><a href='https://blog.metabrainz.org/2010/11/'>November 2010</a> (1)</li> <li><a href='https://blog.metabrainz.org/2010/10/'>October 2010</a> (4)</li> <li><a href='https://blog.metabrainz.org/2010/09/'>September 2010</a> (4)</li> <li><a href='https://blog.metabrainz.org/2010/08/'>August 2010</a> (5)</li> <li><a href='https://blog.metabrainz.org/2010/07/'>July 2010</a> (7)</li> <li><a href='https://blog.metabrainz.org/2010/06/'>June 2010</a> (9)</li> <li><a href='https://blog.metabrainz.org/2010/05/'>May 2010</a> (7)</li> <li><a href='https://blog.metabrainz.org/2010/04/'>April 2010</a> (1)</li> <li><a href='https://blog.metabrainz.org/2010/03/'>March 2010</a> (7)</li> <li><a href='https://blog.metabrainz.org/2010/02/'>February 2010</a> (4)</li> <li><a href='https://blog.metabrainz.org/2010/01/'>January 2010</a> (4)</li> <li><a href='https://blog.metabrainz.org/2009/12/'>December 2009</a> (3)</li> <li><a href='https://blog.metabrainz.org/2009/11/'>November 2009</a> (1)</li> <li><a href='https://blog.metabrainz.org/2009/10/'>October 2009</a> (5)</li> <li><a href='https://blog.metabrainz.org/2009/09/'>September 2009</a> (2)</li> <li><a href='https://blog.metabrainz.org/2009/08/'>August 2009</a> (4)</li> <li><a href='https://blog.metabrainz.org/2009/07/'>July 2009</a> (3)</li> <li><a href='https://blog.metabrainz.org/2009/06/'>June 2009</a> (3)</li> <li><a href='https://blog.metabrainz.org/2009/05/'>May 2009</a> (6)</li> <li><a href='https://blog.metabrainz.org/2009/04/'>April 2009</a> (2)</li> <li><a href='https://blog.metabrainz.org/2009/03/'>March 2009</a> (5)</li> <li><a href='https://blog.metabrainz.org/2009/02/'>February 2009</a> (7)</li> <li><a href='https://blog.metabrainz.org/2009/01/'>January 2009</a> (2)</li> <li><a href='https://blog.metabrainz.org/2008/12/'>December 2008</a> (3)</li> <li><a href='https://blog.metabrainz.org/2008/11/'>November 2008</a> (6)</li> <li><a href='https://blog.metabrainz.org/2008/10/'>October 2008</a> (8)</li> <li><a href='https://blog.metabrainz.org/2008/09/'>September 2008</a> (8)</li> <li><a href='https://blog.metabrainz.org/2008/08/'>August 2008</a> (5)</li> <li><a href='https://blog.metabrainz.org/2008/07/'>July 2008</a> (5)</li> <li><a href='https://blog.metabrainz.org/2008/06/'>June 2008</a> (7)</li> <li><a href='https://blog.metabrainz.org/2008/05/'>May 2008</a> (5)</li> <li><a href='https://blog.metabrainz.org/2008/04/'>April 2008</a> (4)</li> <li><a href='https://blog.metabrainz.org/2008/03/'>March 2008</a> (6)</li> <li><a href='https://blog.metabrainz.org/2008/02/'>February 2008</a> (8)</li> <li><a href='https://blog.metabrainz.org/2008/01/'>January 2008</a> (3)</li> <li><a href='https://blog.metabrainz.org/2007/11/'>November 2007</a> (7)</li> <li><a href='https://blog.metabrainz.org/2007/10/'>October 2007</a> (7)</li> <li><a href='https://blog.metabrainz.org/2007/09/'>September 2007</a> (2)</li> <li><a href='https://blog.metabrainz.org/2007/08/'>August 2007</a> (5)</li> <li><a href='https://blog.metabrainz.org/2007/07/'>July 2007</a> (3)</li> <li><a href='https://blog.metabrainz.org/2007/06/'>June 2007</a> (4)</li> <li><a href='https://blog.metabrainz.org/2007/05/'>May 2007</a> (8)</li> <li><a href='https://blog.metabrainz.org/2007/04/'>April 2007</a> (11)</li> <li><a href='https://blog.metabrainz.org/2007/03/'>March 2007</a> (9)</li> <li><a href='https://blog.metabrainz.org/2007/02/'>February 2007</a> (4)</li> <li><a href='https://blog.metabrainz.org/2007/01/'>January 2007</a> (8)</li> <li><a href='https://blog.metabrainz.org/2006/12/'>December 2006</a> (4)</li> <li><a href='https://blog.metabrainz.org/2006/11/'>November 2006</a> (6)</li> <li><a href='https://blog.metabrainz.org/2006/10/'>October 2006</a> (7)</li> <li><a href='https://blog.metabrainz.org/2006/09/'>September 2006</a> (10)</li> <li><a href='https://blog.metabrainz.org/2006/08/'>August 2006</a> (13)</li> <li><a href='https://blog.metabrainz.org/2006/07/'>July 2006</a> (11)</li> <li><a href='https://blog.metabrainz.org/2006/06/'>June 2006</a> (3)</li> <li><a href='https://blog.metabrainz.org/2006/05/'>May 2006</a> (9)</li> <li><a href='https://blog.metabrainz.org/2006/04/'>April 2006</a> (2)</li> <li><a href='https://blog.metabrainz.org/2006/03/'>March 2006</a> (7)</li> <li><a href='https://blog.metabrainz.org/2006/02/'>February 2006</a> (8)</li> <li><a href='https://blog.metabrainz.org/2006/01/'>January 2006</a> (13)</li> <li><a href='https://blog.metabrainz.org/2005/12/'>December 2005</a> (4)</li> <li><a href='https://blog.metabrainz.org/2005/11/'>November 2005</a> (6)</li> <li><a href='https://blog.metabrainz.org/2005/10/'>October 2005</a> (3)</li> <li><a href='https://blog.metabrainz.org/2005/09/'>September 2005</a> (4)</li> <li><a href='https://blog.metabrainz.org/2005/08/'>August 2005</a> (1)</li> <li><a href='https://blog.metabrainz.org/2005/07/'>July 2005</a> (4)</li> <li><a href='https://blog.metabrainz.org/2005/06/'>June 2005</a> (3)</li> <li><a href='https://blog.metabrainz.org/2005/05/'>May 2005</a> (9)</li> <li><a href='https://blog.metabrainz.org/2005/04/'>April 2005</a> (6)</li> <li><a href='https://blog.metabrainz.org/2005/03/'>March 2005</a> (4)</li> <li><a href='https://blog.metabrainz.org/2005/02/'>February 2005</a> (9)</li> <li><a href='https://blog.metabrainz.org/2005/01/'>January 2005</a> (6)</li> <li><a href='https://blog.metabrainz.org/2004/12/'>December 2004</a> (8)</li> <li><a href='https://blog.metabrainz.org/2004/11/'>November 2004</a> (11)</li> <li><a href='https://blog.metabrainz.org/2004/10/'>October 2004</a> (22)</li> <li><a href='https://blog.metabrainz.org/2004/08/'>August 2004</a> (1)</li> <li><a href='https://blog.metabrainz.org/2004/07/'>July 2004</a> (1)</li> <li><a href='https://blog.metabrainz.org/2004/05/'>May 2004</a> (2)</li> <li><a href='https://blog.metabrainz.org/2004/04/'>April 2004</a> (1)</li> <li><a href='https://blog.metabrainz.org/2004/03/'>March 2004</a> (4)</li> <li><a href='https://blog.metabrainz.org/2004/02/'>February 2004</a> (2)</li> <li><a href='https://blog.metabrainz.org/2004/01/'>January 2004</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/12/'>December 2003</a> (1)</li> <li><a href='https://blog.metabrainz.org/2003/11/'>November 2003</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/10/'>October 2003</a> (4)</li> <li><a href='https://blog.metabrainz.org/2003/09/'>September 2003</a> (1)</li> <li><a href='https://blog.metabrainz.org/2003/07/'>July 2003</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/06/'>June 2003</a> (6)</li> <li><a href='https://blog.metabrainz.org/2003/04/'>April 2003</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/03/'>March 2003</a> (2)</li> <li><a href='https://blog.metabrainz.org/2003/01/'>January 2003</a> (1)</li> </ul> </nav></section> </aside><!-- .sidebar .widget-area --> </div><!-- .site-content --> <footer id="colophon" class="site-footer"> <nav class="main-navigation" aria-label="Footer Primary Menu"> </nav><!-- .main-navigation --> <div class="site-info"> <span class="site-title"><a href="https://blog.metabrainz.org/" rel="home">MetaBrainz Blog</a></span> <a href="https://wordpress.com/?ref=footer_blog" rel="nofollow">Blog at WordPress.com.</a> </div><!-- .site-info --> </footer><!-- .site-footer --> </div><!-- .site-inner --> </div><!-- .site --> <!-- --> <div style="display:none"> </div> <div id="actionbar" dir="ltr" style="display: none;" class="actnbr-pub-twentysixteen actnbr-has-follow actnbr-has-actions"> <ul> <li class="actnbr-btn actnbr-hidden"> <a class="actnbr-action actnbr-actn-follow " href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z" fill-rule="evenodd"></path></svg> <span>Subscribe</span> </a> <a class="actnbr-action actnbr-actn-following no-display" href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg> <span>Subscribed</span> </a> <div class="actnbr-popover tip tip-top-left actnbr-notice" id="follow-bubble"> <div class="tip-arrow"></div> <div class="tip-inner actnbr-follow-bubble"> <ul> <li class="actnbr-sitename"> <a href="https://blog.metabrainz.org"> <img loading='lazy' alt='' src='https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=50' srcset='https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=50 1x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=75 1.5x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=100 2x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150 3x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150 4x' class='avatar avatar-50' height='50' width='50' /> MetaBrainz Blog </a> </li> <div class="actnbr-message no-display"></div> <form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" style="display: none;"> <div class="actnbr-follow-count">Join 359 other subscribers</div> <div> <input type="email" name="email" placeholder="Enter your email address" class="actnbr-email-field" aria-label="Enter your email address" /> </div> <input type="hidden" name="action" value="subscribe" /> <input type="hidden" name="blog_id" value="1935472" /> <input type="hidden" name="source" value="https://blog.metabrainz.org/2017/08/" /> <input type="hidden" name="sub-type" value="actionbar-follow" /> <input type="hidden" id="_wpnonce" name="_wpnonce" value="5fe9c311f4" /> <div class="actnbr-button-wrap"> <button type="submit" value="Sign me up"> Sign me up </button> </div> </form> <li class="actnbr-login-nudge"> <div> Already have a WordPress.com account? <a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fblog.metabrainz.org%252F2017%252F08%252F31%252F500-commits-of-summer-my-story-of-foss-and-gsoc%252F">Log in now.</a> </div> </li> </ul> </div> </div> </li> <li class="actnbr-ellipsis actnbr-hidden"> <svg class="gridicon gridicons-ellipsis" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M7 12c0 1.104-.896 2-2 2s-2-.896-2-2 .896-2 2-2 2 .896 2 2zm12-2c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2zm-7 0c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2z"/></g></svg> <div class="actnbr-popover tip tip-top-left actnbr-more"> <div class="tip-arrow"></div> <div class="tip-inner"> <ul> <li class="actnbr-sitename"> <a href="https://blog.metabrainz.org"> <img loading='lazy' alt='' src='https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=50' srcset='https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=50 1x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=75 1.5x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=100 2x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150 3x, https://blog.metabrainz.org/wp-content/uploads/2018/11/cropped-metabrainz_logo.png?w=150 4x' class='avatar avatar-50' height='50' width='50' /> MetaBrainz Blog </a> </li> <li class="actnbr-folded-follow"> <a class="actnbr-action actnbr-actn-follow " href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z" fill-rule="evenodd"></path></svg> <span>Subscribe</span> </a> <a class="actnbr-action actnbr-actn-following no-display" href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg> <span>Subscribed</span> </a> </li> <li class="actnbr-signup"><a href="https://wordpress.com/start/">Sign up</a></li> <li class="actnbr-login"><a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fblog.metabrainz.org%252F2017%252F08%252F31%252F500-commits-of-summer-my-story-of-foss-and-gsoc%252F">Log in</a></li> <li class="flb-report"> <a href="https://wordpress.com/abuse/?report_url=https://blog.metabrainz.org" target="_blank" rel="noopener noreferrer"> Report this content </a> </li> <li class="actnbr-reader"> <a href="https://wordpress.com/reader/feeds/90752457"> View site in Reader </a> </li> <li class="actnbr-subs"> <a href="https://subscribe.wordpress.com/">Manage subscriptions</a> </li> <li class="actnbr-fold"><a href="">Collapse this bar</a></li> </ul> </div> </div> </li> </ul> </div> <script> window.addEventListener( "load", function( event ) { var link = document.createElement( "link" ); link.href = "https://s0.wp.com/wp-content/mu-plugins/actionbar/actionbar.css?v=20250116"; link.type = "text/css"; link.rel = "stylesheet"; document.head.appendChild( link ); var script = document.createElement( "script" ); script.src = "https://s0.wp.com/wp-content/mu-plugins/actionbar/actionbar.js?v=20250204"; script.defer = true; document.body.appendChild( script ); } ); </script> <div id="jp-carousel-loading-overlay"> <div id="jp-carousel-loading-wrapper"> <span id="jp-carousel-library-loading"> </span> </div> </div> <div class="jp-carousel-overlay" style="display: none;"> <div class="jp-carousel-container"> <!-- The Carousel Swiper --> <div class="jp-carousel-wrap swiper-container jp-carousel-swiper-container jp-carousel-transitions" itemscope itemtype="https://schema.org/ImageGallery"> <div class="jp-carousel swiper-wrapper"></div> <div class="jp-swiper-button-prev swiper-button-prev"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskPrev" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="9" height="12"> <path d="M16.2072 16.59L11.6496 12L16.2072 7.41L14.8041 6L8.8335 12L14.8041 18L16.2072 16.59Z" fill="white"/> </mask> <g mask="url(#maskPrev)"> <rect x="0.579102" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </div> <div class="jp-swiper-button-next swiper-button-next"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskNext" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="8" height="12"> <path d="M8.59814 16.59L13.1557 12L8.59814 7.41L10.0012 6L15.9718 12L10.0012 18L8.59814 16.59Z" fill="white"/> </mask> <g mask="url(#maskNext)"> <rect x="0.34375" width="23.8822" height="24" fill="#FFFFFF"/> </g> </svg> </div> </div> <!-- The main close buton --> <div class="jp-carousel-close-hint"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskClose" mask-type="alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="15" height="14"> <path d="M19.3166 6.41L17.9135 5L12.3509 10.59L6.78834 5L5.38525 6.41L10.9478 12L5.38525 17.59L6.78834 19L12.3509 13.41L17.9135 19L19.3166 17.59L13.754 12L19.3166 6.41Z" fill="white"/> </mask> <g mask="url(#maskClose)"> <rect x="0.409668" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </div> <!-- Image info, comments and meta --> <div class="jp-carousel-info"> <div class="jp-carousel-info-footer"> <div class="jp-carousel-pagination-container"> <div class="jp-swiper-pagination swiper-pagination"></div> <div class="jp-carousel-pagination"></div> </div> <div class="jp-carousel-photo-title-container"> <h2 class="jp-carousel-photo-caption"></h2> </div> <div class="jp-carousel-photo-icons-container"> <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-info" aria-label="Toggle photo metadata visibility"> <span class="jp-carousel-icon"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskInfo" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12.7537 2C7.26076 2 2.80273 6.48 2.80273 12C2.80273 17.52 7.26076 22 12.7537 22C18.2466 22 22.7046 17.52 22.7046 12C22.7046 6.48 18.2466 2 12.7537 2ZM11.7586 7V9H13.7488V7H11.7586ZM11.7586 11V17H13.7488V11H11.7586ZM4.79292 12C4.79292 16.41 8.36531 20 12.7537 20C17.142 20 20.7144 16.41 20.7144 12C20.7144 7.59 17.142 4 12.7537 4C8.36531 4 4.79292 7.59 4.79292 12Z" fill="white"/> </mask> <g mask="url(#maskInfo)"> <rect x="0.8125" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </span> </a> <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-comments" aria-label="Toggle photo comments visibility"> <span class="jp-carousel-icon"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskComments" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> <path fill-rule="evenodd" clip-rule="evenodd" d="M4.3271 2H20.2486C21.3432 2 22.2388 2.9 22.2388 4V16C22.2388 17.1 21.3432 18 20.2486 18H6.31729L2.33691 22V4C2.33691 2.9 3.2325 2 4.3271 2ZM6.31729 16H20.2486V4H4.3271V18L6.31729 16Z" fill="white"/> </mask> <g mask="url(#maskComments)"> <rect x="0.34668" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> <span class="jp-carousel-has-comments-indicator" aria-label="This image has comments."></span> </span> </a> </div> </div> <div class="jp-carousel-info-extra"> <div class="jp-carousel-info-content-wrapper"> <div class="jp-carousel-photo-title-container"> <h2 class="jp-carousel-photo-title"></h2> </div> <div class="jp-carousel-comments-wrapper"> <div id="jp-carousel-comments-loading"> <span>Loading Comments...</span> </div> <div class="jp-carousel-comments"></div> <div id="jp-carousel-comment-form-container"> <span id="jp-carousel-comment-form-spinner"> </span> <div id="jp-carousel-comment-post-results"></div> <form id="jp-carousel-comment-form"> <label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label> <textarea name="comment" class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea" id="jp-carousel-comment-form-comment-field" placeholder="Write a Comment..." ></textarea> <div id="jp-carousel-comment-form-submit-and-info-wrapper"> <div id="jp-carousel-comment-form-commenting-as"> <fieldset> <label for="jp-carousel-comment-form-email-field">Email (Required)</label> <input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field" /> </fieldset> <fieldset> <label for="jp-carousel-comment-form-author-field">Name (Required)</label> <input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field" /> </fieldset> <fieldset> <label for="jp-carousel-comment-form-url-field">Website</label> <input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field" /> </fieldset> </div> <input type="submit" name="submit" class="jp-carousel-comment-form-button" id="jp-carousel-comment-form-button-submit" value="Post Comment" /> </div> </form> </div> </div> <div class="jp-carousel-image-meta"> <div class="jp-carousel-title-and-caption"> <div class="jp-carousel-photo-info"> <h3 class="jp-carousel-caption" itemprop="caption description"></h3> </div> <div class="jp-carousel-photo-description"></div> </div> <ul class="jp-carousel-image-exif" style="display: none;"></ul> <a class="jp-carousel-image-download" href="#" target="_blank" style="display: none;"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="19" height="18"> <path fill-rule="evenodd" clip-rule="evenodd" d="M5.84615 5V19H19.7775V12H21.7677V19C21.7677 20.1 20.8721 21 19.7775 21H5.84615C4.74159 21 3.85596 20.1 3.85596 19V5C3.85596 3.9 4.74159 3 5.84615 3H12.8118V5H5.84615ZM14.802 5V3H21.7677V10H19.7775V6.41L9.99569 16.24L8.59261 14.83L18.3744 5H14.802Z" fill="white"/> </mask> <g mask="url(#mask0)"> <rect x="0.870605" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> <span class="jp-carousel-download-text"></span> </a> <div class="jp-carousel-image-map" style="display: none;"></div> </div> </div> </div> </div> </div> </div> <link crossorigin='anonymous' rel='stylesheet' id='all-css-0-2' href='https://s2.wp.com/_static/??-eJydjEEKgCAQAD+UrR6KLtFbTJfQdJXWxe9HUB/oOMMw0KtyhRpSgyyqJjkCMURs1brzZWAhyMVLQgZnryKMCbiHipfahXzC0TEP8H/2NZ94fltezbxMxkx61vEGx+U/hQ==&cssminify=yes' type='text/css' media='all' /> <script src="https://s1.wp.com/wp-content/js/mobile-useragent-info.js?m=1609849039i&ver=20241018" id="mobile-useragent-info-js" defer data-wp-strategy="defer"></script> <script id="twentysixteen-script-js-extra"> var screenReaderText = {"expand":"expand child menu","collapse":"collapse child menu"}; </script> <script id="jetpack-carousel-js-extra"> var jetpackSwiperLibraryPath = {"url":"https:\/\/s2.wp.com\/wp-content\/mu-plugins\/jetpack-plugin\/sun\/_inc\/build\/carousel\/swiper-bundle.min.js"}; var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"en","ajaxurl":"https:\/\/blog.metabrainz.org\/wp-admin\/admin-ajax.php","nonce":"65f09a9743","display_exif":"1","display_comments":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Comment","post_comment":"Post Comment","write_comment":"Write a Comment...","loading_comments":"Loading Comments...","image_label":"Open image in full-screen.","download_original":"View full size <span class=\"photo-size\">{0}<span class=\"photo-size-times\">\u00d7<\/span>{1}<\/span>","no_comment_text":"Please be sure to submit some text with your comment.","no_comment_email":"Please provide an email address to comment.","no_comment_author":"Please provide your name to comment.","comment_post_error":"Sorry, but there was an error posting your comment. Please try again later.","comment_approved":"Your comment was approved.","comment_unapproved":"Your comment is in moderation.","camera":"Camera","aperture":"Aperture","shutter_speed":"Shutter Speed","focal_length":"Focal Length","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https:\/\/musicbrainz.wordpress.com\/wp-login.php?redirect_to=https%3A%2F%2Fblog.metabrainz.org%2F2017%2F08%2F30%2Fgsoc-2017-rating-system-in-critiquebrainz%2F","blog_id":"1935472","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"],"stats_query_args":"blog=1935472&v=wpcom&tz=0&user_id=0&subd=musicbrainz","is_public":"1"}; </script> <script id="custom-content-types-data-js-before"> var CUSTOM_CONTENT_TYPE__INITIAL_STATE; typeof CUSTOM_CONTENT_TYPE__INITIAL_STATE === "object" || (CUSTOM_CONTENT_TYPE__INITIAL_STATE = JSON.parse(decodeURIComponent("%7B%22active%22%3Atrue%2C%22over_ride%22%3Afalse%2C%22should_show_testimonials%22%3Atrue%2C%22should_show_portfolios%22%3Atrue%7D"))); </script> <script crossorigin='anonymous' type='text/javascript' src='https://s2.wp.com/_static/??-eJyNjEEOgkAMRS/k0BCCxoXxKAZK0Q4znYmdBry9LMQFC+Py/bz3Yc4OkxSSAuVBkRSy9VDmdXgpL4VIwCvoxNkFlsmNCU3dyEvl9QB/5qMJFk6i+yiay8HuLAqeSu5w+jCoCdxYEHrjMAB2z2RK4attQxVZfrxumpszprjDtbvGS31qmnN9bJvWvwEh+WXn'></script> <script type="text/javascript"> (function () { var wpcom_reblog = { source: 'toolbar', toggle_reblog_box_flair: function (obj_id, post_id) { // Go to site selector. This will redirect to their blog if they only have one. const postEndpoint = `https://wordpress.com/post`; // Ideally we would use the permalink here, but fortunately this will be replaced with the // post permalink in the editor. const originalURL = `${ document.location.href }?page_id=${ post_id }`; const url = postEndpoint + '?url=' + encodeURIComponent( originalURL ) + '&is_post_share=true' + '&v=5'; const redirect = function () { if ( ! window.open( url, '_blank' ) ) { location.href = url; } }; if ( /Firefox/.test( navigator.userAgent ) ) { setTimeout( redirect, 0 ); } else { redirect(); } }, }; window.wpcom_reblog = wpcom_reblog; })(); </script> <script src="//stats.wp.com/w.js?68" defer></script> <script type="text/javascript"> _tkq = window._tkq || []; _stq = window._stq || []; _tkq.push(['storeContext', {'blog_id':'1935472','blog_tz':'0','user_lang':'en','blog_lang':'en','user_id':'0'}]); _stq.push(['view', {'blog':'1935472','v':'wpcom','tz':'0','user_id':'0','subd':'musicbrainz'}]); _stq.push(['extra', {'crypt':'UE40eW5QN0p8M2Y/RE1mNzc2NTVTamdsd0xoLz9RQkM2K298TXY9bERQMXc2MjhEaVZfb2wwakRoSj0mUkp1THptM1NdbkV1WjZIcU9mVWQmPUIvMlN6Jk8wW3NYVEJ3dWZOWExuWD9VNTEucGUwVDREUEpscXB+Y21XfHZTPUZ+WV0/Nnl8WzRRL0oreG1XYVpiaUVMdGs4NnxUbS9pRTZ4N2hMeE5KV0clPWh+PTAyYndQOFd1eHFbZn4rZmRmZ0YrWlcrZlVkZTE5Jm0sMkNmVFdzbVN+akJOJmZnVHowbktbdl1iPUllazk/X1p0M2FzRSZGamZkTUR8MnFCTEglSGpqVE4xYkNuZGcxVlkwQkVZX1ItRmVIci5xcG0xZGxUUjgtMndpa35XOXdpU2hkLA=='}]); _stq.push([ 'clickTrackerInit', '1935472', '0' ]); </script> <noscript><img src="https://pixel.wp.com/b.gif?v=noscript" style="height:1px;width:1px;overflow:hidden;position:absolute;bottom:1px;" alt="" /></noscript> <script defer id="bilmur" data-customproperties="{"logged_in":"0","wptheme":"pub\/twentysixteen","wptheme_is_block":"0"}" data-provider="wordpress.com" data-service="simple" data-site-tz="Etc/GMT-0" src="/wp-content/js/bilmur-4.min.js?i=12&m=202509"></script><script> ( function() { function getMobileUserAgentInfo() { if ( typeof wpcom_mobile_user_agent_info === 'object' ) { wpcom_mobile_user_agent_info.init(); var mobileStatsQueryString = ''; if ( wpcom_mobile_user_agent_info.matchedPlatformName !== false ) { mobileStatsQueryString += '&x_' + 'mobile_platforms' + '=' + wpcom_mobile_user_agent_info.matchedPlatformName; } if ( wpcom_mobile_user_agent_info.matchedUserAgentName !== false ) { mobileStatsQueryString += '&x_' + 'mobile_devices' + '=' + wpcom_mobile_user_agent_info.matchedUserAgentName; } if ( wpcom_mobile_user_agent_info.isIPad() ) { mobileStatsQueryString += '&x_' + 'ipad_views' + '=' + 'views'; } if ( mobileStatsQueryString != '' ) { new Image().src = document.location.protocol + '//pixel.wp.com/g.gif?v=wpcom-no-pv' + mobileStatsQueryString + '&baba=' + Math.random(); } } } document.addEventListener( 'DOMContentLoaded', getMobileUserAgentInfo ); } )(); </script></body> </html>