<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Blog]]></title><description><![CDATA[Blog]]></description><link>https://www.kojevnikov.com</link><image><url>https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png</url><title>Blog</title><link>https://www.kojevnikov.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 14 Mar 2026 01:35:37 GMT</lastBuildDate><atom:link href="https://www.kojevnikov.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Alexander Kojevnikov]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[alex@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[alex@substack.com]]></itunes:email><itunes:name><![CDATA[Alexander Kojevnikov]]></itunes:name></itunes:owner><itunes:author><![CDATA[Alexander Kojevnikov]]></itunes:author><googleplay:owner><![CDATA[alex@substack.com]]></googleplay:owner><googleplay:email><![CDATA[alex@substack.com]]></googleplay:email><googleplay:author><![CDATA[Alexander Kojevnikov]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Spek moved to Substack]]></title><description><![CDATA[All Spek posts have been moved to a separate Substack. Please subscribe if you want to receive future updates.]]></description><link>https://www.kojevnikov.com/p/spek-moved-to-substack</link><guid isPermaLink="false">https://www.kojevnikov.com/p/spek-moved-to-substack</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Tue, 17 Jan 2023 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>All <a href="https://www.spek.cc/">Spek</a> posts have been moved to a separate <a href="https://www.spek.cc/">Substack</a>. Please <a href="https://www.spek.cc/">subscribe</a> if you want to receive future updates. If you are using an RSS reader please change the <a href="https://www.spek.cc/feed">feed URL</a>.</p><p><a href="https://www.spek.cc/">https://www.spek.cc/</a></p>]]></content:encoded></item><item><title><![CDATA[xmonad-log-applet 2.1.0 released, with MATE support]]></title><description><![CDATA[I've just released a new version of xmonad-log-applet. Thanks to Ari Croock it now works with the MATE desktop environment, just include --with-panel=mate when configuring the applet.]]></description><link>https://www.kojevnikov.com/p/xmonad-log-applet-mate</link><guid isPermaLink="false">https://www.kojevnikov.com/p/xmonad-log-applet-mate</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Wed, 16 Jan 2013 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've just released a new version of <a href="https://github.com/alexkay/xmonad-log-applet">xmonad-log-applet</a>. Thanks to <a href="https://github.com/geniass">Ari Croock</a> it now works with the <a href="http://mate-desktop.org/">MATE</a> desktop environment, just include <code>--with-panel=mate</code> when configuring the applet.</p><p>Because GitHub recently disabled new downloads, the tarballs are now hosted on <a href="https://code.google.com/p/xmonad-log-applet/downloads/list">Google Code</a>.</p><p>I also added a <a href="/tag/xla.html">new tag</a> for the applet in case you want to follow just x-l-a related posts.</p>]]></content:encoded></item><item><title><![CDATA[The Boston Hackfest]]></title><description><![CDATA[The GNOME and Mono Festival of Love was a blast!]]></description><link>https://www.kojevnikov.com/p/the-boston-hackfest</link><guid isPermaLink="false">https://www.kojevnikov.com/p/the-boston-hackfest</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Thu, 05 Jul 2012 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e9a2f638-08c8-4210-a240-00ba2478a413_213x213.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The <a href="https://live.gnome.org/Hackfests/GNOMEandMonoFestivalofLove2012">GNOME and Mono Festival of Love</a> was a blast! I finally met <a href="http://bl-log.blogspot.com">Bertrand</a> and <a href="http://abock.org/">Aaron</a> -- my fellow Banshee co-maintainers; as well as a lot of GNOME and Mono people. I also met <a href="http://tecstuf.blogspot.com/">Udesh</a>, the SoC student I'm mentoring this year, who is working on voice control in Banshee.</p><p>I reviewed and committed a bunch of (mostly long overdue) patches in Banshee and taglib-sharp, and released a new version of the latter. We also discussed with Udesh his project and went through some technicalities.</p><p>I want to thank <a href="https://plus.google.com/111146406732565623394/posts">David</a> for organising the event, GNOME Foundation for covering my plane tickets and our sponsors for making it happen:</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZYl4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZYl4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png 424w, https://substackcdn.com/image/fetch/$s_!ZYl4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png 848w, https://substackcdn.com/image/fetch/$s_!ZYl4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png 1272w, https://substackcdn.com/image/fetch/$s_!ZYl4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZYl4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;GNOME Foundation&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="GNOME Foundation" title="GNOME Foundation" srcset="https://substackcdn.com/image/fetch/$s_!ZYl4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png 424w, https://substackcdn.com/image/fetch/$s_!ZYl4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png 848w, https://substackcdn.com/image/fetch/$s_!ZYl4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png 1272w, https://substackcdn.com/image/fetch/$s_!ZYl4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4807f832-11b6-4ec7-976b-e5b69f148898_213x213.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D2K7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D2K7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg 424w, https://substackcdn.com/image/fetch/$s_!D2K7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg 848w, https://substackcdn.com/image/fetch/$s_!D2K7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!D2K7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D2K7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Microsoft NERD&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Microsoft NERD" title="Microsoft NERD" srcset="https://substackcdn.com/image/fetch/$s_!D2K7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg 424w, https://substackcdn.com/image/fetch/$s_!D2K7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg 848w, https://substackcdn.com/image/fetch/$s_!D2K7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!D2K7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F570be7e6-9ed4-4b4c-be48-3bc686604d8a_300x86.jpeg 1456w" sizes="100vw"></picture><div></div></div></a><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q2Fk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q2Fk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png 424w, https://substackcdn.com/image/fetch/$s_!Q2Fk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png 848w, https://substackcdn.com/image/fetch/$s_!Q2Fk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png 1272w, https://substackcdn.com/image/fetch/$s_!Q2Fk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q2Fk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/632196d7-918f-4291-a563-05a37b4dfae3_220x60.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Fluendo&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Fluendo" title="Fluendo" srcset="https://substackcdn.com/image/fetch/$s_!Q2Fk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png 424w, https://substackcdn.com/image/fetch/$s_!Q2Fk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png 848w, https://substackcdn.com/image/fetch/$s_!Q2Fk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png 1272w, https://substackcdn.com/image/fetch/$s_!Q2Fk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F632196d7-918f-4291-a563-05a37b4dfae3_220x60.png 1456w" sizes="100vw"></picture><div></div></div></a><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0pEQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0pEQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png 424w, https://substackcdn.com/image/fetch/$s_!0pEQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png 848w, https://substackcdn.com/image/fetch/$s_!0pEQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png 1272w, https://substackcdn.com/image/fetch/$s_!0pEQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0pEQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Xamarin&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Xamarin" title="Xamarin" srcset="https://substackcdn.com/image/fetch/$s_!0pEQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png 424w, https://substackcdn.com/image/fetch/$s_!0pEQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png 848w, https://substackcdn.com/image/fetch/$s_!0pEQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png 1272w, https://substackcdn.com/image/fetch/$s_!0pEQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bcd0bda-fef1-45a3-91a8-805e5e7d22a9_198x53.png 1456w" sizes="100vw"></picture><div></div></div></a>]]></content:encoded></item><item><title><![CDATA[GNOME and Mono Festival of Love]]></title><description><![CDATA[Thanks to the travel sponsorship of the GNOME Foundation, this week I'm going to Boston to attend the hackfest. I will be in Boston from Thursday evening till Sunday afternoon.]]></description><link>https://www.kojevnikov.com/p/gnome-and-mono-festival-of-love</link><guid isPermaLink="false">https://www.kojevnikov.com/p/gnome-and-mono-festival-of-love</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Mon, 25 Jun 2012 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/dbbdd533-7580-447e-895e-159c749d38bd_213x213.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Thanks to the travel sponsorship of the <a href="http://kojevnikov.com/static/images/gnome-sponsored.png">GNOME Foundation</a>, this week I'm going to Boston to attend <a href="https://live.gnome.org/Hackfests/GNOMEandMonoFestivalofLove2012">the hackfest</a>. I will be in Boston from Thursday evening till Sunday afternoon.</p><p>Looking forward to finally meeting fellow <a href="http://banshee.fm/">Banshee</a> developers!</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Ol9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Ol9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png 424w, https://substackcdn.com/image/fetch/$s_!0Ol9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png 848w, https://substackcdn.com/image/fetch/$s_!0Ol9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png 1272w, https://substackcdn.com/image/fetch/$s_!0Ol9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Ol9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;GNOME Foundation&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="GNOME Foundation" title="GNOME Foundation" srcset="https://substackcdn.com/image/fetch/$s_!0Ol9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png 424w, https://substackcdn.com/image/fetch/$s_!0Ol9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png 848w, https://substackcdn.com/image/fetch/$s_!0Ol9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png 1272w, https://substackcdn.com/image/fetch/$s_!0Ol9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d091943-0d4b-4d7e-b21f-e767111c6871_213x213.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a>]]></content:encoded></item><item><title><![CDATA[CodeSprint 2]]></title><description><![CDATA[Last weekend Interviewstreet conducted a second CodeSprint. The event had a format similar to the Google's CodeJam: they gave you a bunch of problems and you had to program your way through as many of them as you could.]]></description><link>https://www.kojevnikov.com/p/codesprint-2</link><guid isPermaLink="false">https://www.kojevnikov.com/p/codesprint-2</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Thu, 12 Jan 2012 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last weekend <a href="http://www.interviewstreet.com/">Interviewstreet</a> conducted a second <a href="http://cs2.interviewstreet.com/">CodeSprint</a>. The event had a format similar to the Google's <a href="http://code.google.com/codejam/">CodeJam</a>: they gave you a bunch of problems and you had to program your way through as many of them as you could. There were a few differences though: the number of problems and the time given to solve them was higher (15 and 48h), they also ran solutions on their servers instead of just checking the output.</p><p>I managed to solve 5 problems and to rank 145th out of 1890 contestants, spending about 12h in total during the weekend. There were a few technical quirks in the process, but all in all I really enjoyed the sprint and was pleasantly surprised by the quality and the complexity of the problems.</p><p>In this post I will explain how I solved those 5 problems; it's mostly for myself, to straighten the thoughts out, as it was a bit chaotic and stressful during the contest.</p><p>If you are interested in solutions make sure to check out the official <a href="http://cs2.interviewstreet.com/">CodeSprint website</a>, they should have them available in a couple of days.</p><h3>Picking Cards</h3><p>Links: <a href="http://cs2.interviewstreet.com/recruit/challenges/solve/view/4f0a70674f380/4effeea14e3a7">problem</a>, <a href="https://gist.github.com/1600348">solution</a></p><p>Sort cards by their number, then take them one by one. On step <em>n</em> the number of ways is multiplied by the number of cards at the beginning of the deck with <em>c<sub>i</sub> &#8804; n</em>. If this number is 0, it's impossible to pick up all the cards.</p><p>The brute-force approach is <em>O(N<sup>2</sup>)</em> and could be too slow. To speed it up, we keep track of the last <em>m : c<sub>m</sub> &#8804; n</em> and start from there. As <em>m</em> is never decreased the overall complexity is <em>O(N)</em>.</p><h3>Coin Tosses</h3><p>Links: <a href="http://cs2.interviewstreet.com/recruit/challenges/solve/view/4f0a70674f380/4eff8af9879d1">problem</a>, <a href="https://gist.github.com/1600579">solution</a></p><p>On each toss we either have a head or a tail, so the expected number of remaining tosses <em>T(n, m) = 1 + &#189; &#215; [T(n, m+1) + T(n, 0)]</em>. We could try a dynamic programming approach, but the formula is cyclic.</p><p>However, for <em>m = 0</em> the expected number of tosses can be expressed analytically: <em>T(n, 0) = 2<sup>n+1</sup> - 2</em> (<a href="http://www.qbyte.org/puzzles/p082s.html">proof</a>). Add the boundary condition <em>T(n, n) = 0</em> and memoisation, and you have a solution.</p><h3>Fraud Prevention</h3><p>Links: <a href="http://cs2.interviewstreet.com/recruit/challenges/solve/view/4f0a70674f380/4f00b1502c006">problem</a>, <a href="https://gist.github.com/1600704">solution</a></p><p>One of the company-sponsored problems. We want to normalise email and street addresses and to keep two hashes with the combination of the normalised values and the deal IDs as keys. For each key we keep a list of credit cards along with order IDs. Then we process orders one by one and check all possible cases (see the source code comments).</p><p>I found this problem a bit uninteresting for a contest -- it's tedious and, uhm, un-algorithmic. However it would probably make a decent interview questions with all its practicalities.</p><h3>Subsequence Weighting</h3><p>Links: <a href="http://cs2.interviewstreet.com/recruit/challenges/solve/view/4f0a70674f380/4f009cfd9c541">problem</a>, <a href="https://gist.github.com/1600725">solution</a></p><p>Generalisation of the <a href="http://en.wikipedia.org/wiki/Longest_increasing_subsequence">Longest increasing subsequence</a> problem. The algorithm is very similar: take each value one by one and maintain values (and cumulative weights) of the last elements of subsequences of certain weight. After we process all values, the last element will have the maximal weight.</p><p>One complication is that we need a data structure with efficient insertion, deletion, search and traversal times. One possibility is to use a red-black tree (as implemented by std::set) and augment it so that all nodes form a doubly-linked list. Also, unlike with the LIS algorithm, each insertion can lead to many deletions (see lines 74-82).</p><p>With such a data structure, the running time is still at <em>O(n log n)</em>.</p><p>That was my favourite question, and the one I spent the most time on, even though in retrospect it doesn't look all that complex.</p><h3>Quora Nearby</h3><p>Links: <a href="http://cs2.interviewstreet.com/recruit/challenges/solve/view/4f0a70674f380/4f05b1d07b989">problem</a>, <a href="https://gist.github.com/1600742">solution</a></p><p>Another company-sponsored problem. A pity <em>N</em> was quite small and the brute-force approach actually worked. Higher limits would require a clever data structure, such as the <a href="http://en.wikipedia.org/wiki/K-d_tree">k-d tree</a> and would make the problem much harder and more interesting.</p><p>First we read all topics and questions and create a vector of all topics (ID and co-ordinates) and a map of topic IDs to the lists of question IDs.</p><p>Topic queries are straight-forward: we sort topics by distance (and IDs, in case the distance is the same) and print the first <em>m</em> IDs.</p><p>For queries it's a bit more involving: again, we sort topics by distance, then check all associated questions using our map. The complication is that we need to check all questions for topics with the same distance, and include those with higher IDs.</p><p>Please never mind the code for this problem, my solution was accepted literally 5 minutes before the contest ended, as you can imagine I was a bit in a hurry.</p><p>Big thanks to the Interviewstreet team for a great weekend!</p>]]></content:encoded></item><item><title><![CDATA[muspy API]]></title><description><![CDATA[muspy is a website that notifies you when your favourite artists release new albums.]]></description><link>https://www.kojevnikov.com/p/muspy-api</link><guid isPermaLink="false">https://www.kojevnikov.com/p/muspy-api</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Sun, 27 Nov 2011 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://muspy.com">muspy</a> is a website that notifies you when your favourite artists release new albums. muspy is free software released under GNU AGPL.</p><p>Today I'm happy to announce the availability of the <a href="https://github.com/alexkay/muspy/tree/master/api">muspy API</a>. The API allows you to create and modify user accounts, to manage the list of artists you want to follow and to receive their releases.</p><p>Someone is already working on an iPhone app that will use the API, expect more news on this front soon!</p>]]></content:encoded></item><item><title><![CDATA[Improved Last.fm import in muspy]]></title><description><![CDATA[muspy is a free / open-source album release notification service.]]></description><link>https://www.kojevnikov.com/p/improved-last-fm-import-in-muspy</link><guid isPermaLink="false">https://www.kojevnikov.com/p/improved-last-fm-import-in-muspy</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Thu, 03 Nov 2011 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6019161d-6763-46ff-ad37-57b8611b7eab_407x161.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="http://muspy.com/">muspy</a> is a free / open-source album release notification service.</p><p>To make it easier to populate the list of artists you want to follow, muspy allows to import top artists from your Last.fm account. Today this function became more flexible: in addition to getting overall top artists, it can now import most frequently listened artists in the last 12, 6 and 3 months and 1 week.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iZ47!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iZ47!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png 424w, https://substackcdn.com/image/fetch/$s_!iZ47!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png 848w, https://substackcdn.com/image/fetch/$s_!iZ47!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png 1272w, https://substackcdn.com/image/fetch/$s_!iZ47!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iZ47!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2f0ad82-988e-458d-838c-f40578bf8382_407x161.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Import from Last.fm&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Import from Last.fm" title="Import from Last.fm" srcset="https://substackcdn.com/image/fetch/$s_!iZ47!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png 424w, https://substackcdn.com/image/fetch/$s_!iZ47!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png 848w, https://substackcdn.com/image/fetch/$s_!iZ47!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png 1272w, https://substackcdn.com/image/fetch/$s_!iZ47!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f0ad82-988e-458d-838c-f40578bf8382_407x161.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>I also lifted the limit on the number of artists that can be imported from 200 to 500, and increased the number selected by default from 50 to 100.</p><p>Do you have a feature that you want to see in muspy? <a href="http://muspy.com/contact">Let me know</a>! Alternatively, feel free to fork muspy on <a href="https://github.com/alexkay/muspy">GitHub</a> and to send your pull requests.</p><p>If you are a music lover and never tried muspy before, <a href="http://muspy.com/">give it a go</a>! With muspy you will not miss an album release ever again.</p>]]></content:encoded></item><item><title><![CDATA[muspy is now free software]]></title><description><![CDATA[muspy is an album release notification service, you give it a list of your favourite artists and it sends you a notice (by email or RSS) as soon as they have new releases.]]></description><link>https://www.kojevnikov.com/p/muspy-free-software</link><guid isPermaLink="false">https://www.kojevnikov.com/p/muspy-free-software</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Sat, 29 Oct 2011 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://muspy.com">muspy</a> is an album release notification service, you give it a list of your favourite artists and it sends you a notice (by email or RSS) as soon as they have new releases.</p><p>I wrote muspy 3 years ago to scratch a personal itch -- I was spending too much time online checking if bands I'm into have something new; but was still missing many releases.</p><p>muspy was initially developed for Google App Engine, which was the hot new thing back then. In retrospect, while working with App Engine was extremely educational and a lot of fun, it wasn't a very good fit. The recent <a href="http://googleappengine.blogspot.com/2011/09/few-adjustments-to-app-engines-upcoming.html">announcement</a> on the price increase was the last straw -- I decided to re-write it in vanilla <a href="https://www.djangoproject.com/">Django</a> and to host it myself.</p><p>I'm also releasing the <a href="https://github.com/alexkay/muspy">source code</a> under GNU AGPL in the hope that it will be beneficial for the service and for its users.</p><p>Major changes since the previous version:</p><ul><li><p>Track <a href="http://musicbrainz.org/doc/Release_Group">release groups</a> instead of releases</p><p>This was the most frequently requested feature, there were too many duplicate releases for some artists, release groups make everything much cleaner. This change was also the reason why the new version is almost a complete rewrite.</p></li><li><p>Stars are off by default for new releases</p><p>muspy allows to star individual releases, starred releases show up on top of the sorted list of releases. This feature wasn't used by many which resulted in all releases being starred for most users. Now stars are off for new releases, if you want to star, you have to do it manually on the website. I migrated stars only for users with <em>S&nbsp;\&lt;&nbsp;min(R,&nbsp;40)&nbsp;/&nbsp;2</em>, where <em>S</em> is the number of starred releases and <em>R</em> is the total number of releases for all artists you follow.</p></li><li><p>Speed</p><p>It used to take more than a week to check all artists for new releases, now the checking cycle is much shorter. Things like importing from Last.fm or adding a comma-separated list of artists should also be significantly faster.</p></li><li><p>Blog</p><p>I will be blogging about muspy <a href="/">blog</a> instead of on the website itself. Feel free to subscribe to the <a href="/blog.xml">full feed</a> or just to the <a href="/muspy.xml">muspy category</a>.</p></li></ul><p>Other than that, muspy remains pretty much the same. I migrated all the data but I encourage you to go the old site at <a href="http://muspy.appspot.com">muspy.appspot.com</a> and to check if everything was migrated correctly. Please note that the old site's background processes are not running and it will be taken down in a month or two.</p><p>Now that muspy is free and open-source, don't hesitate to <a href="https://github.com/alexkay/muspy">look at the code</a>, tweak it and suggest improvements. Git and GitHub make it too damn easy!</p><p>And if you never used muspy before, <a href="https://muspy.com">give it a try</a>!</p>]]></content:encoded></item><item><title><![CDATA[xmonad-log-applet for GNOME and Xfce]]></title><description><![CDATA[xmonad-log-applet is a handy panel applet/plugin for GNOME (and now Xfce) users who use Xmonad as an alternative window manager.]]></description><link>https://www.kojevnikov.com/p/xmonad-log-applet-gnome-xfce</link><guid isPermaLink="false">https://www.kojevnikov.com/p/xmonad-log-applet-gnome-xfce</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Tue, 20 Sep 2011 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/221e871a-4594-4d26-ba90-1bad23170084_787x89.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://github.com/alexkay/xmonad-log-applet">xmonad-log-applet</a> is a handy panel applet/plugin for GNOME (and now Xfce) users who use <a href="http://xmonad.org/">Xmonad</a> as an alternative window manager. The applet will show the visible workspace(s), active window's title or anything you send its way from your xmonad.hs.</p><p>I recently <a href="http://uhsure.com/xmonad-log-applet.html">took over</a> xmonad-log-applet maintainership from Adam Wick, and today I'm happy to announce the release of version 2.0.0.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cIGp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cIGp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png 424w, https://substackcdn.com/image/fetch/$s_!cIGp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png 848w, https://substackcdn.com/image/fetch/$s_!cIGp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png 1272w, https://substackcdn.com/image/fetch/$s_!cIGp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cIGp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;xmonad-log-applet&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="xmonad-log-applet" title="xmonad-log-applet" srcset="https://substackcdn.com/image/fetch/$s_!cIGp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png 424w, https://substackcdn.com/image/fetch/$s_!cIGp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png 848w, https://substackcdn.com/image/fetch/$s_!cIGp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png 1272w, https://substackcdn.com/image/fetch/$s_!cIGp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ece169-b1b6-471c-bcb4-2907233df4a2_787x89.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>Changes since the previous release:</p><ul><li><p>Migrated the GNOME 2 applet from deprecated libbonobo API to the new <a href="http://live.gnome.org/GnomeGoals/AppletsDbusMigration">D-Bus based API</a>.</p></li><li><p>GNOME 3 panel support (in fallback mode).</p></li><li><p>Xfce 4 panel support.</p></li><li><p>Revamped the build system.</p></li><li><p>Dropped GConf dependency which was used to specify the applet width; instead fill all available space (like the window list applet) and ellipsise when necessary.</p></li><li><p>Simplified background transparency handling.</p></li><li><p>Fixed install locations.</p></li><li><p>Updated sample xmonad.hs.</p></li></ul><p>To install get and unpack <a href="http://cloud.github.com/downloads/alexkay/xmonad-log-applet/xmonad-log-applet-2.0.0.tar.gz">the tarball</a> or clone <a href="https://github.com/alexkay/xmonad-log-applet">the repo</a>, then run:</p><pre><code>% ./configure --with-panel=gnome2
% make
% sudo make install
</code></pre><p>Substitute <code>gnome2</code> with <code>gnome3</code> or <code>xfce4</code> if that's what you use. If you cloned the git repo, use <code>./autogen.sh</code> instead of <code>./configure</code>. After restarting the panel you should be able to add the applet.</p><p>Use the provided <a href="https://github.com/alexkay/xmonad-log-applet/blob/master/xmonad.hs">sample xmonad.hs</a> file to bind it to Xmonad. It depends on the <a href="http://hackage.haskell.org/package/DBus">DBus package</a>, which currently doesn't compile with GHC 7.x, but it's easy to work around:</p><pre><code>% cabal update
% cabal unpack DBus
% cd DBus-0.4
% $EDITOR DBus/Internal.hsc
</code></pre><p>Replace <code>import Control.Exception</code> with <code>import Control.OldException</code>, then:</p><pre><code>% cabal configure
% cabal build
% cabal install
</code></pre><p>After this, your xmonad.hs should compile.</p><p>EDIT: With GHC 7.4, you also need to edit <code>DBus/Message.hsc</code> and prepend <code>Foreign.</code> to <code>unsafePerformIO</code>.</p><p>Happy Xmonading!</p>]]></content:encoded></item><item><title><![CDATA[FreeBSD ports/UPDATING web feed]]></title><description><![CDATA[Two things recently happened to me: I fell in love with FreeBSD and I got a new job (and will be moving to Malaysia very soon!)]]></description><link>https://www.kojevnikov.com/p/freebsd-ports-updating-rss-feed</link><guid isPermaLink="false">https://www.kojevnikov.com/p/freebsd-ports-updating-rss-feed</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Fri, 24 Sep 2010 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two things recently happened to me: I fell in love with FreeBSD and I got a new job (and will be moving to Malaysia very soon!)</p><p>At the new job I will mostly be dealing with Perl and, considering it's not the language I'm most familiar with, I was looking for a small project to practice it.</p><p>Thus, <a href="http://updating.versia.com/">updating.versia.com</a> was born. It's a web feed that keeps track of the /usr/ports/UPDATING file. I personally find it much easier to use a news reader than manually checking the file each time I want to update my ports.</p><p>Like most Perl scripts, the one generating the feed is short, uses a lot of CPAN modules, and is a bit ugly :) You can check it on <a href="http://github.com/alexkay/freebsd-updating">GitHub</a>.</p><p><em>P.S. As requested on freebsd-ports@ I also added feeds to head/UPDATING, stable-7/UPDATING and stable-8/UPDATING. Subscribe on <a href="http://updating.versia.com/">updating.versia.com</a></em></p>]]></content:encoded></item><item><title><![CDATA[DIY NAS with Debian Lenny]]></title><description><![CDATA[After playing with FreeNAS I ended up using Debian for my server.]]></description><link>https://www.kojevnikov.com/p/nas-debian-lenny-raid1-encrypted</link><guid isPermaLink="false">https://www.kojevnikov.com/p/nas-debian-lenny-raid1-encrypted</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Thu, 19 Nov 2009 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After <a href="http://kojevnikov.com/grow-encrypted-raid1-freenas.html">playing with FreeNAS</a> I ended up using Debian for my server. FreeNAS is a great distribution if you want an out of the box experience, but I found it hard to customise, mostly because I'm not very familiar with BSDs. Also, they are <a href="http://sourceforge.net/apps/phpbb/freenas/viewtopic.php?f=5&amp;t=3966">switching to Debian</a> for the next version. So, Debian it is.</p><p>This post will explain how to set up a NAS server with Debian running essential services such as ssh, samba, nfs, cups, rdiff-backup and rtorrent with a web interface; and using two HDDs in RAID 1 mode with everything encrypted. It took me awhile to research all bits and pieces, hopefully it will save you time if you are going to do a similar set up.</p><p><strong>Table of contents</strong></p><ul><li><p><a href="#hardware">Hardware</a></p></li><li><p><a href="#partition-layout">Partition layout</a></p></li><li><p><a href="#finalising-the-installation-and-fixing-grub">Finalising the installation and fixing GRUB</a></p></li><li><p><a href="#ssh-and-sudo">SSH and sudo</a></p></li><li><p><a href="#padlock-modules">Padlock modules</a></p></li><li><p><a href="#nfs">NFS</a></p></li><li><p><a href="#samba">Samba</a></p></li><li><p><a href="#cups">CUPS</a></p></li><li><p><a href="#rtorrent-rutorrent">rTorrent + ruTorrent</a></p></li><li><p><a href="#backup-with-rdiff-backup">Backup with rdiff-backup</a></p></li><li><p><a href="#performance">Performance</a></p></li><li><p><a href="#growing-partitions">Growing partitions</a></p></li><li><p><a href="#a2000-tweaks">A2000 tweaks</a></p></li></ul><h3>Hardware</h3><p>I use a <a href="http://www.via.com.tw/en/products/embedded/artigo/a2000/">VIA ARTiGO A2000</a> barebone storage server. It's powered by a VIA C7-D processor, which has a built-in encryption engine called <a href="http://www.via.com.tw/en/initiatives/padlock/">Padlock</a> &#8212; quite useful for our scenario. If you are unsure which server to get, I can highly recommend A2000.</p><p>Some parts of this walk-through are specific to A2000 or C7, but most of it will apply to any hardware as long as it includes two HDDs and is compatible with Lenny.</p><h3>Partition layout</h3><p>I assume that you know how to use the Debian installer, if not &#8212; check the <a href="http://www.debian.org/releases/stable/i386/">documentation</a>. Because A2000 doesn't have a CD-ROM, I booted the installer from a <a href="http://www.debian.org/releases/stable/i386/ch04s03.html.en">memory stick</a>, you might need to do the same.</p><p>The tricky part of the installation process is disk partitioning. I used the following layout, though there are many ways to do the set up.</p><p>First we create RAID 1 partitions. We need a separate partition for /boot, because it won't be encrypted; and for /tmp, because it will have encryption settings different from the root partition. This means we will have three partitions on each disk:</p><ul><li><p>Select FREE SPACE on <strong>hda</strong> and create a new partition.</p></li><li><p>I used 512 MB for /boot, change it to what feels sane to you.</p></li><li><p>Make it a primary partition at the beginning of the disk.</p></li><li><p>Change "Use as" from "ext3" to "physical volume for RAID".</p></li><li><p>Set the bootable flag.</p></li><li><p>Create another RAID partition on <strong>hda</strong> for /tmp. I used 2 GB, again adapt it to your needs. Don't make it bootable.</p></li><li><p>Create yet another RAID partition on <strong>hda</strong> occupying the rest of the disk space.</p></li><li><p>Do the same for <strong>hdb</strong>.</p></li><li><p>In the main partitioning menu select "Configure software RAID". Write changes to the partition table when it asks you to.</p></li><li><p>Select "Create MD device" then "RAID1". Use defaults for the number of active and spare devices.</p></li><li><p>Choose <strong>/dev/hda1</strong> and <strong>/dev/hdb1</strong>.</p></li><li><p>Do the same for <strong>/dev/hda2</strong> and <strong>/dev/hdb2</strong>.</p></li><li><p>Do the same for <strong>/dev/hda3</strong> and <strong>/dev/hdb3</strong>.</p></li></ul><p>Phew, that was quite a few steps! Now you will see three RAID1 devices in the list, let's set them up:</p><ul><li><p>Select device #0, change "Use as" to "ext2". Set mount point as /boot.</p></li><li><p>Select device #1, change "Use as" to "physical volume for encryption". Set "Encryption key" to "Random key" <a href="#fn:1"><sup>1</sup></a></p></li><li><p>Select device #2, change "Use as" to "physical volume for encryption". Leave "Encryption key" as "Passphrase".</p></li><li><p>Select "Configure encrypted volumes" and enter a passphrase. Make sure you use a strong one but remember that there is no way to recover any of your encrypted data if you lose it.</p></li></ul><p>You should see two encrypted volumes now: <code>md1_crypt</code> is automatically set up to be used as swap (do it manually if it's not); <code>md2_crypt</code> however needs more tweaking.</p><ul><li><p>Edit it and change "Use as" to "physical volume for LVM".</p></li><li><p>Select "Configure the Logical Volume Manager" from the main menu.</p></li><li><p>Create a volume group, call it something (e.g. "MAIN").</p></li><li><p>Select <code>/dev/mapper/md2_crypt</code> device for the created group.</p></li><li><p>Create a logical volume for the root partition. Change its size, I used 10GB.</p></li><li><p>Create another logical volume for the data partition. Use all remaining space.</p></li><li><p>In the main menu, select LV root. Change "Use as" to "ext3" and "Mount point" to "/".</p></li><li><p>Select LV data. I formatted it with <a href="http://en.wikipedia.org/wiki/XFS">XFS</a> file system because of <a href="http://www.debian-administration.org/articles/388">this benchmark</a>, but you can select ext3 if you want.</p></li><li><p>When mounting, select "Enter manually" and enter "/data".</p></li></ul><p>That's it! With this scheme, data and root partitions sit on top of an LVM group, which sits on top of an encrypted volume, which sits on top of a multi-disk volume. <a href="http://www.howtoforge.com/set-up-a-fully-encrypted-raid1-lvm-system">Some people</a> prefer to have separate encrypted partitions for root and for data, but then you will need to enter passphrases for each of them on start up.</p><h3>Finalising the installation and fixing GRUB</h3><p>The rest of the installation should be straight-forward. When you reach the "Software selection" screen, make sure you choose "Standard system" and "File server"; and unselect "Desktop environment" &#8212; you are not going to need it on a headless server. Also tick off "Print server" if you need (I do).</p><p>After everything is installed, boot your server, type your passphrase to unlock the encrypted partition, and login as root. Now, because the installer writes GRUB only to the first disk, we need to install it manually to the second. Without this, if your first disk fails you won't be able to boot:</p><pre><code># grub
grub&gt; root (hd1,0)
grub&gt; setup (hd1)
grub&gt; quit
</code></pre><h3>SSH and sudo</h3><p>Let's install SSH, otherwise we will need a spare monitor and a keyboard connected to the server:</p><pre><code># aptitude update
# aptitude install ssh
</code></pre><p>Edit <code>/etc/ssh/sshd_config</code>, I suggest disabling PermitRootLogin and PasswordAuthentication and enabling PubkeyAuthentication. If you decide to use public key authentication, add your public key to <code>~/ssh/authorized_keys</code>. Then restart sshd, install sudo, and edit the list of sudoers:</p><pre><code># /etc/init.d/ssh restart
# aptitude install sudo
# visudo
</code></pre><p>Add this line under root, <code>&lt;user&gt;</code> is your non-root login:</p><pre><code>&lt;user&gt; ALL=(ALL) ALL
</code></pre><h3>Padlock modules</h3><p>This section is specific to VIA C7 CPU. As I mentioned, it includes the hardware encryption engine called Padlock. The engine is supported by the Linux kernel, but the support is not enabled by default.</p><p>First make sure you have it:</p><pre><code># modprobe padlock_aes
# modprobe padlock_sha
</code></pre><p>If the modules load fine, <a href="http://debianforum.de/forum/viewtopic.php?p=507901">these steps</a> (thanks Google Translate!) will auto-load them:</p><ul><li><p>Edit <code>/etc/modprobe.d/aliases</code> and add this line:</p></li></ul><pre><code>alias aes padlock_aes
</code></pre><ul><li><p>Edit <code>/etc/initramfs-tools/modules</code> and add these two lines:</p></li></ul><pre><code>padlock-aes  
padlock-sha
</code></pre><ul><li><p>Run <code>update-initramfs -u</code>, it should backup the image in /boot for you, but it never hurts to back it up manually.</p></li></ul><p>These steps are needed because Padlock modules must be loaded at boot, to work with our encrypted partitions. If they are loaded at a later stage, the software encryption modules will not be replaced because they are already in use.</p><p>After rebooting, check if Padlock is used. If <code>aes_i586</code> is in use instead of <code>padlock_aes</code>, you did something wrong:</p><pre><code># lsmod | grep -i aes
</code></pre><p>To enable hardware encryption for SSL, edit <code>/etc/ssl/openssl.cnf</code> and add this before the <code>[new_oids]</code> section:</p><pre><code>openssl_conf = openssl_def

[openssl_def]
engines = openssl_engines

[openssl_engines]
padlock = padlock_engine

[padlock_engine]
default_algorithms = ALL
</code></pre><p>After the change, observe an enormous speed bump with:</p><pre><code># openssl speed -evp aes-128-cbc
</code></pre><h3>NFS</h3><p>If you selected "File server" during the installation, NFS should already be up and running. To share the entire <code>/data</code> partition, edit <code>/etc/exports</code> and add this line:</p><pre><code>/data   *(rw,sync,no_subtree_check)
</code></pre><p>Check <a href="http://nfs.sourceforge.net/nfs-howto/ar01s03.html">NFS documentation</a> if you want something different. After changing your exports, reload them with:</p><pre><code># exportfs -a
</code></pre><p>On the client computers, add this line to <code>/etc/fstab</code>, replacing <code>&lt;server&gt;</code> with the IP of your NAS:</p><pre><code>&lt;server&gt;:/data /mnt/data nfs defaults 0 0
</code></pre><p>Then mount with <code>mount -a</code>. Again, check <a href="http://nfs.sourceforge.net/nfs-howto/ar01s04.html">the docs</a> if you need more control over how the NFS share is mounted.</p><h3>Samba</h3><p>As with NFS, Samba should already be running on your server. Append this to <code>/etc/samba/smb.conf</code>, replacing <code>&lt;user&gt;</code> with a non-root login on your server:</p><pre><code>[data]
    path = /data
    browseable = yes
    available = yes
    public = yes
    writable = yes
    force user = &lt;user&gt;
    create mask = 0644
    directory mask = 0755
</code></pre><p>Then restart Samba and you are set:</p><pre><code># /etc/init.d/samba restart
</code></pre><p>Check <a href="http://www.samba.org/samba/docs/">Samba docs</a> for more options.</p><h3>CUPS</h3><p>The set up heavily depends on the printer model. I have a fairly common Epson colour ink printer, its driver is included in the gutenprint package which gets installed if you select "Print server" during the installation.</p><p>You will need to edit <code>/etc/cups/cupsd.conf</code> to make the CUPS web interface accessible from another machine, then just add your printer from <a href="http://localhost:631/">http://localhost:631/</a>. Also check <code>/etc/samba/smb.conf</code>, it should have these sections:</p><pre><code>[printers]
   comment = All Printers
   browseable = yes
   path = /var/spool/samba
   printable = yes
   guest ok = yes
   read only = yes
   create mask = 0700

[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = yes
   read only = yes
   guest ok = no
</code></pre><p>Check <a href="http://www.cups.org/documentation.php">CUPS docs</a> if it doesn't work or if you want to fine-tune permissions.</p><h3>rTorrent + ruTorrent</h3><p>FreeNAS comes with <a href="http://www.transmissionbt.com/">Transmission</a> BitTorrent client. It looks nice but the web interface is too simple to my taste, it doesn't even support labels. On the desktop I used to run <a href="http://www.deluge-torrent.org/">Deluge</a>, which is great but probably a bit heavy for a small server. After a bit of research I ended up using <a href="http://libtorrent.rakshasa.no/">rTorrent</a>, which is what most blogs recommend for a headless server.</p><p>There are <a href="http://libtorrent.rakshasa.no/wiki/UtilsList">quite a few</a> frontends for rTorrent, the one I liked was <a href="http://code.google.com/p/rutorrent/">ruTorrent</a>, its development also seems to be the most active at the moment. It's an almost exact rip-off of a popular Windows-based <a href="http://www.utorrent.com/">&#956;Torrent</a> client, hence the name.</p><p>ruTorrent requires a recent version of rTorrent <em>compiled with</em> the XML-RPC support. The bad news is that Lenny doesn't have all packages required to build it. This can be circumvented by temporarily switching to testing (<em>aka</em> Squeeze), installing rTorrent's build-deps, then switching back to Lenny. Depending on your situation, switching to testing may not be the best idea, do it only if you are comfortable breaking your system.</p><p>After installing build-deps, get the latest tarball of rTorrent, <code>./configure</code> it with <code>--with-xmlrpc-c</code> option, <code>make</code> and <code>make install</code>. Afterwards, copy an example <a href="http://libtorrent.rakshasa.no/browser/trunk/rtorrent/doc/rtorrent.rc#latest">.rtorrent.rc</a> file to <code>~/</code> and edit it to suit your needs. Also follow the steps in the <a href="http://libtorrent.rakshasa.no/wiki/RTorrentCommonTasks#StartingrTorrentonSystemStartup">Starting rTorrent on System Startup</a> section.</p><p>ruTorrent can work with any web server supporting PHP 5.0, I went for <a href="http://www.lighttpd.net/">lighttpd</a>. Install it from the official repo, then follow ruTorrent <a href="http://code.google.com/p/rutorrent/wiki/Main">set up guide</a>.</p><p>The tricky part is setting up XML-RPC, there are a few contradictions in the the rTorrent and ruTorrent docs but the following works for me&#8482;:</p><p>Add to <code>~/.rtorrent.rc</code>:</p><pre><code>scgi_port = localhost:5000
encoding_list = UTF-8
</code></pre><p>Edit <code>/etc/lighttpd/lighttpd.conf</code> as <a href="http://code.google.com/p/rutorrent/wiki/WebserverSetup">described here</a>. Ignore <a href="http://libtorrent.rakshasa.no/wiki/RTorrentXMLRPCGuide">instructions</a> from rTorrent, they won't work. Restart rTorrent and the web server after you are done:</p><pre><code># /etc/init.d/rtorrent restart
# /etc/init.d/lighttpd force-reload
</code></pre><h3>Backup with rdiff-backup</h3><p><a href="http://rdiff-backup.nongnu.org/">rdiff-backup</a> is such a fantastic tool: it's available on all major platforms, it's ultra fast and efficient, it performs backups incrementally, it can work over SSH and also it allows to restore files at any point of time. If you don't already use it to backup your home directories &#8212; give it a try!</p><p>On the server, there's nothing special to be done to install it. Just get it from Debian repos and add your public keys to <code>~/ssh/authorized_keys</code> &#8212; we are going to use SSH.</p><p>On Linux clients, invoke it like this, replacing <code>&lt;user&gt;</code> with your login and <code>&lt;server&gt;</code> with the IP of the NAS:</p><pre><code>% rdiff-backup /home/&lt;user&gt; &lt;server&gt;::/data/Backup/&lt;user&gt;
</code></pre><p>On Windows clients, install <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">Putty</a> and follow <a href="http://www.andremolnar.com/how_to_set_up_ssh_keys_with_putty_and_not_get_server_refused_our_key">these steps</a> to generate a compatible key. Then invoke rdiff-backup like this:</p><pre><code>rdiff-backup.exe --no-hard-links --remote-schema
    "plink.exe -i C:Users&lt;WinUser&gt;privatekey.ppk %s rdiff-backup --server"
    C:Users&lt;WinUser&gt; &lt;user&gt;@&lt;server&gt;::/data/Backup/&lt;user&gt;
</code></pre><p>Check <a href="http://rdiff-backup.nongnu.org/docs.html">rdiff-backup docs</a> for more options, there are plenty!</p><h3>Performance</h3><p>Extremely unscientific tests, but they give an idea:</p><pre><code># bonnie++ -d /data/tmp
Version 1.03d       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
server           2G 10862  91 63699  27 29931  12 11483  91 83455  22 196.7   0
                    ------Sequential Create------ --------Random Create--------
                    -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16  2693  67 +++++ +++  3467  37  2948  47 +++++ +++  3131  38
#
# sync
# dd if=/dev/zero bs=16384 count=131072 of=/data/tmp
131072+0 records in
131072+0 records out
2147483648 bytes (2.1 GB) copied, 40.7823 s, 52.7 MB/s
#
# sync
# dd if=/data/tmp bs=16384 count=131072 of=/dev/null
131072+0 records in
131072+0 records out
2147483648 bytes (2.1 GB) copied, 23.5763 s, 91.1 MB/s

# hdparm -tT /dev/mapper/md2_crypt 

/dev/mapper/md2_crypt:
 Timing cached reads:   584 MB in  2.01 seconds = 291.10 MB/sec
 Timing buffered disk reads:  222 MB in  3.03 seconds =  73.19 MB/sec
</code></pre><p><strong>hda</strong> is a 1TB <a href="http://www.wdc.com/en/products/Products.asp?DriveID=559">WD Caviar Green</a>, <strong>hdb</strong> is a 640GB <a href="http://www.seagate.com/ww/v/index.jsp?vgnextoid=c9fec8fcbe4c9110VgnVCM100000f5ee0a0aRCRD">Seagate Barracuda</a>. I know, using different disk models is bad for RAID 1, but that's what I had. At some point I will get a second 1TB WD, read the next section to find out how to grow the mirror when upgrading drives.</p><p>NFS transfers are slower, but good enough for my needs: 49 MB/sec when reading from a NFS share and 23 MB/sec when writing to it.</p><h3>Growing partitions</h3><p>When your RAID 1 mirror is filled up you probably want to upgrade the disks with bigger ones. This can be done by replacing the first disk, syncing the mirror, then replacing the second one, and syncing again. After that you need to grow your data partition.</p><p>So, shut down your NAS, replace one of the drives, boot up and SSH to it. Check the status the mirror, notice that only one drive is used:</p><pre><code># watch -n 2 cat /proc/mdstat

Personalities : [raid1]
md2 : active raid1 hda3[0]
      622679296 blocks [2/1] [U_]

md1 : active raid1 hda2[0]
      1951808 blocks [2/1] [U_]

md0 : active raid1 hda1[0]
      497856 blocks [2/1] [U_]

unused devices: &lt;none&gt;
</code></pre><p>Here I assume that <strong>hda</strong> is used and <strong>hdb</strong> has been replaced, run <code>fdisk -l</code> to check which is which in your case. Now copy the partition table from <strong>hda</strong> to <strong>hdb</strong>:</p><pre><code># sfdisk -d /dev/hda | sfdisk /dev/hdb
</code></pre><p>Adjust the last partition on <strong>hdb</strong>: run <code>cfdisk /dev/hdb</code>, select <strong>hdb3</strong> and delete it, re-create <strong>hdb3</strong> to use the entire free space, change the partition type to "FD Linux raid autodetect", and finally write changes to disk and quit.</p><p>Add new partitions to the RAID array and wait until the sync is finished:</p><pre><code># mdadm --add /dev/md0 /dev/hdb1
# mdadm --add /dev/md1 /dev/hdb2
# mdadm --add /dev/md2 /dev/hdb3
# watch -n 2 cat /proc/mdstat
</code></pre><p>Add grub to <strong>hdb</strong>:</p><pre><code># grubgrub&gt; root (hd1,0)
grub&gt; setup (hd1)
grub&gt; quit
</code></pre><p>If you replaced the drive with a bigger one, you need to grow the last partition to take advantage of all available space. Here's how to do it (the steps are borrowed from <a href="http://www.howtoforge.com/set-up-a-fully-encrypted-raid1-lvm-system-p7">here</a>):</p><pre><code># mdadm --grow /dev/md2 --size=max
</code></pre><p>Reboot, then run this:</p><pre><code># pvresize /dev/mapper/md2_crypt
# vgdisplay -A | grep -i free
  Free  PE / Size       X / Y GB
</code></pre><p>Note the number <strong>X</strong>, we will use it in the next command. Also replace <strong>MAIN-data</strong> with the name you used for the <strong>/data</strong> partition:</p><pre><code># lvextend -l +X /dev/mapper/MAIN-data
</code></pre><p>Finally, grow the filesystem:</p><pre><code># xfs_growfs /data
</code></pre><p>The previous command will only work for XFS, adapt it if you use ext3 or another file system.</p><h3>A2000 tweaks</h3><p>Inspired by <a href="http://a2000-forum.viatech.com/posts/list/9001.page">this</a> forum post I replaced stock A2000 fans with <a href="http://www.scythe-usa.com/product/acc/016/sy124010l_detail.html">Scythe Mini Kaze SY124010L</a> 40mm fan on the CPU and <a href="http://www.noctua.at/main.php?show=productview&amp;products_id=9&amp;lng=en">Noctua NF-R8</a> 80mm fan on the rear exhaust. This made A2000 even more quiet. Other than that, I cannot think of any other mod I would like to do, A2000 is a <a href="http://www.via.com.tw/en/images/products/embedded/artigo/a2000/a2000_14.jpg">very nice</a> piece of hardware.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><div><hr></div><ol><li><p>When creating a physical volume for encryption, you can select the encryption algorithm and the key size. I use <a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard">AES</a>, because C7 provides hardware support for it; and 128 bits instead of default 256, because I'm not paranoid. Do your research and preferably select what your hardware supports. Software encryption is likely to be slow unless you have a very fast CPU.&nbsp;<a href="#fnref:1" title="Jump back to footnote 1 in the text">&#8617;</a></p></li></ol></div></div>]]></content:encoded></item><item><title><![CDATA[Growing mirrored and encrypted partitions in FreeNAS]]></title><description><![CDATA[UPDATE 2009-11-19: this post explains how to do the same in Debian.]]></description><link>https://www.kojevnikov.com/p/grow-encrypted-raid1-freenas</link><guid isPermaLink="false">https://www.kojevnikov.com/p/grow-encrypted-raid1-freenas</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Wed, 04 Nov 2009 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>UPDATE 2009-11-19: <a href="http://kojevnikov.com/nas-debian-lenny-raid1-encrypted.html">this post</a> explains how to do the same in Debian.</em></p><p>I'm building <a href="http://www.via.com.tw/en/products/embedded/artigo/a2000/#10">a small</a> <a href="http://en.wikipedia.org/wiki/Network-attached_storage">NAS</a> for the household. It will run <a href="http://www.freenas.org/">FreeNAS</a> and will be used as a file, rsync, BitTorrent and printer server. I want it to be reliable and secure so it will have two HDDs in RAID 1 (AKA <a href="http://en.wikipedia.org/wiki/Disk_mirroring">mirroring</a>) and their content will be encrypted.</p><p>But what if in the future I will want to upgrade the drives with larger ones? A common scenario with RAID 1 is to replace one of the disks with the bigger one, rebuild the mirror then replace the other one and rebuild it again. In theory it sounds like an easy process that will keep all your data intact.</p><p>In practice however it's not, Mike explains how to do it under FreeNAS <a href="http://rfandip.blogspot.com/2008/12/freenas-073953-raid-1-growfs-oh-my.html">in his blog</a>. Growing mirrored <em>and</em> encrypted drives is a bit more complicated.</p><p>Here is how, in case you might need it:</p><ul><li><p>After replacing the HDD, boot your box and log into the FreeNAS web interface</p></li><li><p>Go to Disks/Management, edit the disk you have replaced and click "Save". This will read the new disk's size.</p></li><li><p>Go to Disks/RAID, the status will be DEGRADED which is normal. In Tools select the new disk, "forget" and then "insert" it. Wait until the rebuild process is finished.</p></li><li><p>Go to Disks/Encryption, attach the disk and make sure your data is fine.</p></li><li><p>Go to Disks/Mount Point and delete the mount.</p></li><li><p>Get to the NAS console, either directly or via SSH. Things will get more interesting now:</p></li></ul><pre><code># geli backup /dev/mirror/raid1 bak
# geli detach /dev/mirror/raid1
# geli clear /dev/mirror/raid1
</code></pre><ul><li><p><a href="http://www.freebsd.org/cgi/man.cgi?query=geli&amp;sektion=8">geli</a> is the command line tool to manage encrypted storage in FreeNAS. <em>raid1</em> is the volume name I used, yours might be different. The first line saves the encrypted volume's metadata to a file called "bak", we will need it later.</p></li><li><p>Go to Disks/RAID again, delete and re-add the RAID. Use the same volume name and tick the "Create and initialize RAID" check box.</p></li><li><p>Now back to the terminal. This will restore the metadata from our backup and re-attach the encrypted volume</p></li></ul><pre><code># geli restore bak /dev/mirror/raid1
# geli attach /dev/mirror/raid1
</code></pre><ul><li><p>Fix <a href="http://en.wikipedia.org/wiki/GUID_Partition_Table">the partition table</a>, re-create and grow the partition to fill the entire disk (note that the device name ends with ".eli" &#8211; it's our encrypted disk):</p></li></ul><pre><code># gpt recover /dev/mirror/raid1.eli
# gpt remove -i 1 /dev/mirror/raid1.eli
# gpt add -i 1 -t ufs /dev/mirror/raid1.eli
# gpt label -i 1 -l data /dev/mirror/raid1.eli
# growfs /dev/mirror/raid1.elip1
</code></pre><ul><li><p>Finally go to Disks/Mount Point and mount the partition.</p></li></ul><p>That's it, your encrypted partition should be functional now!</p><p><em>NOTE: always do your backups, I can make no guarantees this guide will work for you.</em></p>]]></content:encoded></item><item><title><![CDATA[xmonad ⋙ metacity (mod GNOME)]]></title><description><![CDATA[xmonad is an elegantly minimalist and lightning fast window manager for X written in Haskell. I wanted to play with it for a long time: I'm using two 24" monitors and so have to spend a fair bit of time re-sizing windows and moving them around. A tiling window manager]]></description><link>https://www.kojevnikov.com/p/xmonad-metacity-gnome</link><guid isPermaLink="false">https://www.kojevnikov.com/p/xmonad-metacity-gnome</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Sun, 18 Oct 2009 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="http://xmonad.org/">xmonad</a> is an elegantly minimalist and lightning fast window manager for <a href="http://www.x.org/">X</a> written in <a href="http://haskell.org/">Haskell</a>. I wanted to play with it for a long time: I'm using two 24" monitors and so have to spend a fair bit of time re-sizing windows and moving them around. A <a href="http://en.wikipedia.org/wiki/Tiling_window_manager">tiling window manager</a> like xmonad takes care of this; in addition you can control all aspects of window placement with the keyboard alone.</p><p>The good news is: xmonad plays really well with GNOME. You can keep your GNOME panels, themes, desktop backgrounds, etc &#8211; xmonad just replaces <a href="http://en.wikipedia.org/wiki/Metacity">Metacity</a> leaving everything else intact.</p><p>The bad news is: I should have tried it earlier.</p><p>A few notes about xmonad set up and usage:</p><ul><li><p><a href="http://www.haskell.org/haskellwiki/Xmonad/Using_xmonad_in_Gnome">Recommended way</a> to set up xmonad with GNOME is to <code>export WINDOW_MANAGER=xmonad</code> before starting gnome-session, but it didn't work for me. I tried every suggested place: <code>~/.gnomerc</code>, <code>~/.xsession</code>, <code>~/.profile</code>, <code>~/.xinitrc</code>; but none of them worked &#8211; GNOME always started with Metacity.</p><p>What worked though is this:</p></li><li><p>Create a file in /usr/share/applications called xmonad.desktop:</p></li></ul><pre><code>[Desktop Entry]
Type=Application
Encoding=UTF-8
Name=Xmonad
Exec=/usr/bin/xmonad
NoDisplay=true
X-GNOME-WMName=Xmonad
X-GNOME-Bugzilla-Bugzilla=XMonad
X-GNOME-Bugzilla-Product=xmonad
X-GNOME-Bugzilla-Component=general
X-GNOME-Autostart-Phase=WindowManager
X-GNOME-Provides=windowmanager
X-GNOME-Autostart-Notify=true
</code></pre><ul><li><p>Change this GConf key from 'metacity' to 'xmonad':</p></li></ul><pre><code>/desktop/gnome/session/required_components/windowmanager
</code></pre><ul><li><p>On startup, xmonad doesn't set the usual left-arrow cursor but inherits an ugly X cursor which looks like it was created in the eighties. To change it, add this line to your <code>~/.xinitrc</code> file just before you start gnome-session:</p></li></ul><pre><code>xsetroot -cursor_name left_ptr
</code></pre><ul><li><p>You need to create a config file in <code>~/.xmonad</code> called xmonad.hs and <a href="http://www.haskell.org/haskellwiki/Xmonad/Basic_Desktop_Environment_Integration">add this</a>:</p></li></ul><pre><code>import XMonadimport XMonad.Config.Gnome main = xmonad gnomeConfig
</code></pre><ul><li><p>That's right, the config file is a Haskell program that starts xmonad, which means it's extremely customisable.</p><p>All keyboard short-cuts in xmonad are in the form Mod-X or Mod-Shift-X, where Mod is by default the Alt key. Line 7 tells xmonad to use the Win key &#8211; Alt is heavily used by GNOME applications:</p></li></ul><pre><code>import XMonad
import XMonad.Config.Gnome

main = do
  xmonad $ gnomeConfig
    { terminal    = "gnome-terminal"
    , modMask     = mod4Mask
    , focusFollowsMouse = False
    , borderWidth = 2
    }
</code></pre><ul><li><p>When touch-typing, some shortcuts are painful to use, Win-Shift-6 probably being the worst. What I wanted is to replace the Mod part with another shortcut, a bit in the Emacs fashion, so that instead of Win-Shift-6 I would have for example a sequence of Ctrl-m and Shift-6.</p><p>mauke on #xmonad was extremely helpful, he came up with this code which worked as advertised:</p></li></ul><pre><code>import XMonad
import XMonad.Config.Gnome
import XMonad.Actions.Submap

import Control.Arrow
import Data.Bits
import qualified Data.Map as M

main :: IO ()
main = do
    xmonad $ gnomeConfig
         { terminal = "gnome-terminal"
         , focusFollowsMouse = False
         , borderWidth = 2
         , keys = addPrefix (controlMask, xK_m) (keys gnomeConfig)
         }

addPrefix p ms conf =
    M.singleton p . submap $ M.mapKeys (first chopMod) (ms conf)
    where
    mod = modMask conf
    chopMod = (.&amp;. complement mod)
</code></pre><ul><li><p>To re-load xmonad after you changed the config file just press Mod-q. It takes just a second to re-compile and leaves all open windows intact.</p></li></ul><p>After using xmonad for 2 days I must say I'm a convert. The keyboard <a href="http://haskell.org/haskellwiki/Image:Xmbindings.png">short-cuts</a> feel very natural, it's not difficult to see the influence of vi. Moving a window to another screen or to another workspace (did I mention workspaces are per screen, which is a really neat feature), switching between workspaces, switching windows, changing layouts, etc... is just a short-cut away.</p><p>And as a bonus point, I now have a good reason to become more familiar with Haskell &#8211; it's a very nice language.</p>]]></content:encoded></item><item><title><![CDATA[Updated Play Queue In Banshee]]></title><description><![CDATA[Banshee 1.6 will include an updated Play Queue extension.]]></description><link>https://www.kojevnikov.com/p/updated-play-queue-in-banshee</link><guid isPermaLink="false">https://www.kojevnikov.com/p/updated-play-queue-in-banshee</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Wed, 23 Sep 2009 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7bec8e90-b514-4f8b-982d-263fd035a0c4_869x534.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="http://banshee-project.org/">Banshee</a> 1.6 will include an updated Play Queue extension. The changes are already in <a href="http://git.gnome.org/cgit/banshee/">git master</a>, here are a few teaser screen-shots:</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g067!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g067!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png 424w, https://substackcdn.com/image/fetch/$s_!g067!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png 848w, https://substackcdn.com/image/fetch/$s_!g067!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png 1272w, https://substackcdn.com/image/fetch/$s_!g067!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g067!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Play Queue in Banshee&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Play Queue in Banshee" title="Play Queue in Banshee" srcset="https://substackcdn.com/image/fetch/$s_!g067!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png 424w, https://substackcdn.com/image/fetch/$s_!g067!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png 848w, https://substackcdn.com/image/fetch/$s_!g067!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png 1272w, https://substackcdn.com/image/fetch/$s_!g067!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F110bc545-bb5e-4561-84fe-cbec2bc101cb_869x534.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>Played tracks are not removed from the queue but are shown as greyed out. You can play them again if you want, drag and drop to the back of the queue, delete, etc.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M002!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M002!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png 424w, https://substackcdn.com/image/fetch/$s_!M002!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png 848w, https://substackcdn.com/image/fetch/$s_!M002!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png 1272w, https://substackcdn.com/image/fetch/$s_!M002!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M002!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Play Queue Preferences&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Play Queue Preferences" title="Play Queue Preferences" srcset="https://substackcdn.com/image/fetch/$s_!M002!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png 424w, https://substackcdn.com/image/fetch/$s_!M002!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png 848w, https://substackcdn.com/image/fetch/$s_!M002!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png 1272w, https://substackcdn.com/image/fetch/$s_!M002!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236b09c1-1bb2-494c-9336-83bfa0315f92_434x180.png 1456w" sizes="100vw"></picture><div></div></div></a><p>The number of played tracks to show can be changed from the preferences dialogue.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yiCn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yiCn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png 424w, https://substackcdn.com/image/fetch/$s_!yiCn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png 848w, https://substackcdn.com/image/fetch/$s_!yiCn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png 1272w, https://substackcdn.com/image/fetch/$s_!yiCn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yiCn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Fill By option&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Fill By option" title="Fill By option" srcset="https://substackcdn.com/image/fetch/$s_!yiCn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png 424w, https://substackcdn.com/image/fetch/$s_!yiCn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png 848w, https://substackcdn.com/image/fetch/$s_!yiCn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png 1272w, https://substackcdn.com/image/fetch/$s_!yiCn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70abafb4-223f-4214-89e2-3f85bc9ac6c8_435x200.png 1456w" sizes="100vw"></picture><div></div></div></a><p>You can also ask Banshee to automatically update the queue using any shuffle mode (including the new <a href="http://kojevnikov.com/new-shuffle-modes-in-banshee.html">by rating and by score</a> modes). The number of upcoming tracks can also be changed in the preferences.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QhRx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QhRx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png 424w, https://substackcdn.com/image/fetch/$s_!QhRx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png 848w, https://substackcdn.com/image/fetch/$s_!QhRx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png 1272w, https://substackcdn.com/image/fetch/$s_!QhRx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QhRx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/041fda44-9230-4c9e-a469-37025dc2230e_495x189.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Fill From&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Fill From" title="Fill From" srcset="https://substackcdn.com/image/fetch/$s_!QhRx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png 424w, https://substackcdn.com/image/fetch/$s_!QhRx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png 848w, https://substackcdn.com/image/fetch/$s_!QhRx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png 1272w, https://substackcdn.com/image/fetch/$s_!QhRx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041fda44-9230-4c9e-a469-37025dc2230e_495x189.png 1456w" sizes="100vw"></picture><div></div></div></a><p>The tracks are taken from the entire library or from any play list.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o6v4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o6v4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png 424w, https://substackcdn.com/image/fetch/$s_!o6v4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png 848w, https://substackcdn.com/image/fetch/$s_!o6v4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png 1272w, https://substackcdn.com/image/fetch/$s_!o6v4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o6v4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Refresh and Add More&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Refresh and Add More" title="Refresh and Add More" srcset="https://substackcdn.com/image/fetch/$s_!o6v4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png 424w, https://substackcdn.com/image/fetch/$s_!o6v4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png 848w, https://substackcdn.com/image/fetch/$s_!o6v4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png 1272w, https://substackcdn.com/image/fetch/$s_!o6v4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312b0033-edaa-40c2-ace6-143b2ffb49f1_435x170.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>If you don't like what has been added, you can refresh the upcoming tracks. Or you can add more of them (thanks <a href="http://automorphic.blogspot.com/">Sandy</a>!)</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pual!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pual!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png 424w, https://substackcdn.com/image/fetch/$s_!pual!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png 848w, https://substackcdn.com/image/fetch/$s_!pual!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png 1272w, https://substackcdn.com/image/fetch/$s_!pual!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pual!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Manually added tracks&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Manually added tracks" title="Manually added tracks" srcset="https://substackcdn.com/image/fetch/$s_!pual!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png 424w, https://substackcdn.com/image/fetch/$s_!pual!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png 848w, https://substackcdn.com/image/fetch/$s_!pual!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png 1272w, https://substackcdn.com/image/fetch/$s_!pual!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88aa9bd6-6011-4d6c-ab70-e90d03fc491a_630x329.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>Tracks added manually are treated differently from those that had been added automatically. When adding, they are inserted to the front of the queue but after other manually-added tracks.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Lh71!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lh71!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png 424w, https://substackcdn.com/image/fetch/$s_!Lh71!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png 848w, https://substackcdn.com/image/fetch/$s_!Lh71!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png 1272w, https://substackcdn.com/image/fetch/$s_!Lh71!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lh71!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23fc818a-075a-4b0e-8162-119e803709ff_631x279.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;After refresh&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="After refresh" title="After refresh" srcset="https://substackcdn.com/image/fetch/$s_!Lh71!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png 424w, https://substackcdn.com/image/fetch/$s_!Lh71!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png 848w, https://substackcdn.com/image/fetch/$s_!Lh71!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png 1272w, https://substackcdn.com/image/fetch/$s_!Lh71!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23fc818a-075a-4b0e-8162-119e803709ff_631x279.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>Also, they are preserved when you refresh the queue.</p><p>That's about it. If you like what you saw you can <a href="http://banshee-project.org/contribute/write-code/">try</a> the git master version. Otherwise just wait until 1.6 is out, it shouldn't take too long.</p>]]></content:encoded></item><item><title><![CDATA[New shuffle modes in Banshee]]></title><description><![CDATA[Next version of Banshee will introduce two new shuffle modes: by rating and by score. In this post I will explain how they work since the modes can be a bit confusing.]]></description><link>https://www.kojevnikov.com/p/new-shuffle-modes-in-banshee</link><guid isPermaLink="false">https://www.kojevnikov.com/p/new-shuffle-modes-in-banshee</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Mon, 21 Sep 2009 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Next version of <a href="http://banshee-project.org/">Banshee</a> will introduce two new shuffle modes: <a href="https://bugzilla.gnome.org/show_bug.cgi?id=544680">by rating</a> and <a href="https://bugzilla.gnome.org/show_bug.cgi?id=585613">by score</a>. In this post I will explain how they work since the modes can be a bit confusing.</p><p>In the random shuffle mode (<em>aka</em> shuffle by song), every track has an <a href="http://en.wikipedia.org/wiki/Uniform_distribution_(discrete)">equal probability</a> to be selected. For example if our library contains 1,000 tracks, each of them will be chosen with probability</p><blockquote><p><em>P<sub>t</sub> = 1 &#247; 1,000 = 0.001</em></p></blockquote><p>But what if we want some tracks to be played more often than others? Say we have 100 favourite tracks and want to play each of them three times as often as any other track? In probability terms this can be written as</p><blockquote><p><em>P<sub>s</sub> = 3 &#215; P<sub>t</sub></em></p></blockquote><p>where <em>s</em> are our favourite tracks and <em>t</em> &#8211; the other 900 tracks in the library. Because the sum of all probabilities must be equal to one, we have</p><blockquote><p><em>100 &#215; 3 &#215; P<sub>t</sub> + 900 &#215; P<sub>t</sub> = 1 &#8594; P<sub>t</sub> = <sup>1</sup>/<sub>1,200</sub></em></p></blockquote><p>To chose the next track, we can pretend that our library contains 1,200 songs and pick one at random. If the track number is &#8804; 100 &#215; 3, we randomly select one of the 100 favourite songs, otherwise we take one of the 900 remaining songs.</p><p>If the library is partitioned into <em>n</em> slots, each containing <em>C<sub>i</sub></em> tracks, we will have</p><blockquote><p><em>&#8721;<sub>i=1,n</sub> C<sub>i</sub> &#8901; w<sub>i</sub> &#8901; P<sub>1</sub> = 1</em></p></blockquote><p>where <em>P<sub>1</sub></em> is the probability of selecting a track from the first partition, and <em>w<sub>i</sub></em> tells how frequently tracks from the <em>i</em>-th partition should be selected compared to the first one. That is <em>P<sub>i</sub> = w<sub>i</sub> &#8901; P<sub>1</sub></em></p><p>Numbers <em>w<sub>i</sub></em> are called <a href="http://en.wikipedia.org/wiki/Weight_function">weights</a> and by changing them we control how often the songs from different slots are played. For example, we could pick a number (lets call it <em>&#946;</em>) and require that songs from the second partition are played <em>&#946;</em> times as often as the songs from the first one, songs from the third <em>&#946;</em> times as often as the songs from the second, and so on. That is, <em>w<sub>i</sub> = &#946;<sup>i-1</sup></em></p><p>For ratings, we have 5 partitions &#8211; one for each rating. We could also put all unrated songs into the 3-rd partition (to treat them as songs with 3 stars) so that our entire library is partitioned. Now a good question is what to use for <em>&#946;</em>?</p><p>If we take <em>&#946;=1</em>, all songs will have an equal probability to be selected. Note that it's exactly the same as the shuffle by song mode. If we take <em>&#946;=2</em>, songs rated 5 will be played twice as often as songs rated 4, and so on.</p><p>In Banshee we use <em>&#946; = &#966; &#8776; 1.61803</em>, also known as the <a href="http://en.wikipedia.org/wiki/Golden_ratio">golden ratio</a>. This number has an interesting property:</p><blockquote><p><em>&#966;<sup>n</sup> = &#966;<sup>n-1</sup> + &#966;<sup>n-2</sup></em></p></blockquote><p>In terms of ratings, it means that songs with 5 stars will be played as often as songs with 4 and 3 stars combined, and so on.</p><p>In the shuffle by score mode, the songs are partitioned into 20 slots, first slot for the songs scoring 1&#8230;5, second &#8211; for 6&#8230;10, and the last &#8211; for scores 96&#8230;100. We also put songs with no score into the 10th slot (46&#8230;50).</p><p>We cannot use <em>&#966;</em> for <em>&#946;</em> because this time we have much more partitions &#8211; the songs with low scores would be hardly ever played. To keep scores behaving similar to ratings we need to scale the weights:</p><blockquote><p><em>&#946; = &#966;<sup>&#188;</sup>, w<sub>i</sub> = &#966;<sup>(i-1)/4</sup></em></p></blockquote><p>Hope that wasn't too tangled and I promise next post won't include a single formula :)</p>]]></content:encoded></item><item><title><![CDATA[Vertical panel in GNOME, 15 months later]]></title><description><![CDATA[I'm happy to report that the subject is mostly fixed.]]></description><link>https://www.kojevnikov.com/p/vertical-panel-in-gnome-15-months-later</link><guid isPermaLink="false">https://www.kojevnikov.com/p/vertical-panel-in-gnome-15-months-later</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Sun, 06 Sep 2009 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I'm happy to report that <a href="http://kojevnikov.com/vertical-panel-in-gnome.html">the subject</a> is mostly fixed.</p><p><strong>Window List</strong>: <a href="http://bugzilla.gnome.org/show_bug.cgi?id=86382">bgo#86382</a> has a working <a href="http://bugzilla-attachments.gnome.org/attachment.cgi?id=140334">patch</a>, it's not perfect (read comments 140, 141 and 145) but fixes the problem.</p><p><strong>Notification Area</strong>: <a href="http://bugzilla.gnome.org/show_bug.cgi?id=531371">bgo#531371</a> also has <a href="http://bugzilla-attachments.gnome.org/attachment.cgi?id=140510">a patch</a> which works really well.</p><p><strong>Quick Launch</strong>: My fix is included in version 2.12.6 of <a href="http://quick-lounge.sourceforge.net/">the applet</a>.</p><p><strong>Main Menu</strong>: The ugly arrow (<a href="http://bugzilla.gnome.org/show_bug.cgi?id=562247">bgo#562247</a> and <a href="http://bugzilla.gnome.org/show_bug.cgi?id=564903">bgo#564903</a>) can be removed by setting <code>"has-arrow"</code> to <code>FALSE</code> in gnome-panel/panel-menu-button.c</p><p><strong>Keyboard Indicator</strong>: <a href="http://bugzilla.gnome.org/show_bug.cgi?id=591515">bgo#591515</a> is not yet fixed. A quick and dirty hack is to comment out the entire switch statement in <code>GSwitchitAppletUpdateAngle()</code> function from gswitchit/gswitchit-applet.c</p><p>I'm using a GNOME desktop with all these fixes daily and I'm quite happy with it. You can get my customizepkg files for <a href="http://www.archlinux.org/">Arch Linux</a> from <a href="http://github.com/alexkay/arch/tree/master">GitHub</a>; read how to use them in the <a href="http://kojevnikov.com/arch-linux-yaourt-customizepkg-beauty.html">previous post</a>.</p>]]></content:encoded></item><item><title><![CDATA[Arch Linux + yaourt + customizepkg = beauty!]]></title><description><![CDATA[I recently switched my main desktop from Ubuntu to Arch Linux, mostly for its rolling release model.]]></description><link>https://www.kojevnikov.com/p/arch-linux-yaourt-customizepkg-beauty</link><guid isPermaLink="false">https://www.kojevnikov.com/p/arch-linux-yaourt-customizepkg-beauty</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Sat, 05 Sep 2009 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently switched my main desktop from Ubuntu to <a href="http://www.archlinux.org/">Arch Linux</a>, mostly for its rolling release model. I really like Ubuntu but I got tired of dealing with lots of custom <a href="https://launchpad.net/ubuntu/+ppas">PPAs</a>. Arch Linux not only provides the latest stable version for all packages, it also has tools to customise the packages to your liking and selectively build them from source.</p><p>In this post I will explain how to do it, taking as an example my pet peeve &#8211; <a href="http://kojevnikov.com/vertical-panel-in-gnome.html">the vertical Gnome panel</a>. <a href="http://cwillu.com/">Carey Underwood</a> has recently posted a (mostly) working <a href="http://bugzilla.gnome.org/show_bug.cgi?id=86382#c132">patch</a>, let's get it into our box.</p><p>First thing you need is to install <a href="http://aur.archlinux.org/packages.php?ID=5863">yaourt</a> and <a href="http://aur.archlinux.org/packages.php?ID=10314">customizepkg</a>, both are available in <a href="http://aur.archlinux.org/">AUR</a>. <a href="http://wiki.archlinux.org/index.php/Main_Page">ArchWiki</a> has a great <a href="http://wiki.archlinux.org/index.php/AUR_User_Guidelines#Installing_Packages_from_the_AUR">tutorial</a> on how to do it. Actually you only need the tutorial to install yaourt, afterwards installing packages from AUR is as simple as running:</p><pre><code>% yaourt -S customizepkg
</code></pre><p>customizepkg allows to tweak <a href="http://wiki.archlinux.org/index.php/PKGBUILD">PKGBUILDs</a>. You just add a file to /etc/customizepkg.d/ with the same name as the package you want to change. The file format is not well documented, but it's <a href="http://bbs.archlinux.org/viewtopic.php?id=53280">pretty intuitive</a>.</p><p>In our case we need to create <code>/etc/customizepkg.d/libwnck</code> with the following text (in one line):</p><pre><code>replace#global#cd "${srcdir}\/${pkgname}-${pkgver}"
#cd "${srcdir}\/${pkgname}-${pkgver}"\nwget -O vertical.patch
http:\/\/bugzilla-attachments.gnome.org\/attachment.cgi?id=140334
|| return 1\npatch -Np2 -i vertical.patch || return 1
</code></pre><p>The file will tell customizepkg to add two lines to libwnck's PKGBUILD:</p><pre><code> build() {
   cd "${srcdir}/${pkgname}-${pkgver}"
+wget -O vertical.patch http://bugzilla-attachments.gnome.org/attachment.cgi?id=140334 || return 1
+patch -Np2 -i vertical.patch || return 1
   ./configure --prefix=/usr --sysconfdir=/etc
               --localstatedir=/var --disable-static || return 1
   make || return 1
</code></pre><p>Then you just install the package as you always do, but using yaourt instead of pacman:</p><pre><code>% yaourt -S libwnck
</code></pre><p>Et voil&#224;, yaourt realises that you want to build libwnck from source, gets its PKGBUILD, changes it, and builds. When building, the patch is downloaded and applied to the source code of libwnck before it's made.</p><p>But wait, there's more to it! Next time you upgrade the system with <code>yaourt -Syu</code>, if there is a new version of libwnck, it will be automatically patched and built from source.</p><p>Hope you find this useful, and if you haven't tried Arch yet &#8211; do it today, you won't be disappointed ;)</p>]]></content:encoded></item><item><title><![CDATA[Vertical panel in GNOME]]></title><description><![CDATA[UPDATE 2009-09-06: Read the follow-up post]]></description><link>https://www.kojevnikov.com/p/vertical-panel-in-gnome</link><guid isPermaLink="false">https://www.kojevnikov.com/p/vertical-panel-in-gnome</guid><dc:creator><![CDATA[Alexander Kojevnikov]]></dc:creator><pubDate>Sun, 08 Jun 2008 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bJbj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F761e1dc4-d503-4325-88ba-40ac12dff4fe_150x150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>UPDATE 2009-09-06: Read the <a href="http://kojevnikov.com/vertical-panel-in-gnome-15-months-later.html">follow-up post</a></em></p><p>I've been playing with various desktop <a href="http://www.gnu.org/">GNU/Linux</a> distributions last couple of months. I'm not exactly a newbie to Linux, I have been administering a VPS box for a hobby project for several years now, but I never managed to play with it on a desktop.</p><p>So I did. And I must say I'm very impressed. Last time I checked (<a href="http://www.freebsd.org/">FreeBSD</a> 4 back in 2000), FLOSS desktop was mostly a geek toy, these days it <em>is</em> ready for the average user.</p><p>I will spare the overview of the <a href="http://www.ubuntu.com/">distros</a> <a href="http://www.opensuse.org/">that</a> <a href="http://fedoraproject.org/">I</a> <a href="http://www.mandriva.com/">tried</a>, as well as my take on the <a href="http://www.kde.org/">KDE</a> vs. <a href="http://www.gnome.org/">GNOME</a> flame war for another post, here I want to talk about one particular annoyance that I <em>really</em> want to see fixed.</p><p>You see, these days it's hard not to have a wide-screen monitor sitting on your desktop. They are great for watching films and playing games but this comes at a cost -- you end up with fewer vertical pixels.</p><p>Vertical space is much more important for most other tasks I do on the computer, be it browsing the web, coding or writing blog posts. And the only way to maximise it is to move the everlasting task bar sitting on the bottom of most operating systems to the left or right of the screen.</p><p>This is how it looks like in Vista and KDE. I know it takes some getting used to, but it's worth a few days of slight disorientation. And I'm not <a href="http://greasypc.blogspot.com/2008/05/vertical-taskbar-for-more-efficient.html">the</a> <a href="http://www.ghacks.net/2008/04/10/why-my-taskbar-is-on-the-right-side-of-the-screen/">only</a> <a href="http://lifehacker.com/software/windows/geek-to-live--top-windows-tweaks-158144.php">one</a> who thinks so.</p><p>The vertical layout works great in XP, Vista and KDE, but not in GNOME. I want to list here all open issues along with the links to the GNOME <a href="http://bugzilla.gnome.org/">bug database</a>. I guess we have all these issues because not many GNOME developers are using the vertical layout, or even aware of the benefits it can give them. I hope this post will help it, even if only a little bit.</p><p><strong>Window List</strong>: The list of open windows is arguably the most important piece of information sitting on the panel. And the most terribly behaving in vertical layout.</p><p>First of all, the height of the window list applet is fixed, meaning the list doesn't occupy all available vertical space.</p><p>Second, the height of the buttons that represent the open windows, stretches to fill the entire applet. The buttons should have a fixed height that depends on the font used in the buttons.</p><p>Third, after you open a few windows, the list splits to two columns and becomes irresponsible to mouse clicks. This is the most annoying bug of the three.</p><p>These issues are documented in <a href="http://bugzilla.gnome.org/show_bug.cgi?id=86382">bug 86382</a> that was open back in 2002! The bug has a patch, but it looks like it's not perfect either.</p><p><strong>Notificatioin Area</strong>: In vertical layout the notification area wastes a lot of space by placing one icon in a row. It also uses different sizes for different icons, some are really huge, e.g. 128x128. It should instead use a flow layout for icons and use the same size for all of them. This is described in <a href="http://bugzilla.gnome.org/show_bug.cgi?id=531371">bug 531371</a>.</p><p><strong>Quick Launch</strong>: The quick-lounge applet had a bug that made it nearly impossible to use on a vertical panel (see <a href="http://bugzilla.gnome.org/show_bug.cgi?id=531358">bug 531358</a>). It's fixed now in the trunk, hopefully it will be integrated into the next GNOME release.</p><p>There are other related annoyances (see <a href="http://bugzilla.gnome.org/show_bug.cgi?id=428943">bug 428943</a> and Ubuntu idea <a href="http://brainstorm.ubuntu.com/idea/1906/">#1906</a>) but I can live with them if the above issues are resolved.</p>]]></content:encoded></item></channel></rss>