<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Richard Jones, Esq. &#187; bash</title>
	<atom:link href="http://www.metabrew.com/article/tag/bash/feed" rel="self" type="application/rss+xml" />
	<link>http://www.metabrew.com</link>
	<description>Erlang, PHP, C, C++, Java, PostgreSQL, MySQL, Hadoop, Linux, awk, bash, sed, grep, screen, vim, irc, ssh etc...</description>
	<lastBuildDate>Sun, 20 Dec 2009 18:59:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Updated bash PS1</title>
		<link>http://www.metabrew.com/article/updated-bash-ps1/</link>
		<comments>http://www.metabrew.com/article/updated-bash-ps1/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 00:33:01 +0000</pubDate>
		<dc:creator>RJ</dc:creator>
				<category><![CDATA[hacks]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://www.metabrew.com/?p=72</guid>
		<description><![CDATA[Made a minor tweak to my .bashrc after browsing dotfiles.org for some ideas. One neat trick I gleaned was detecting when the exit code of the last command ($?) was non-zero and altering the prompt. This will be useful for quickly seeing at a glance if some enormous load of output from make was successful [...]]]></description>
			<content:encoded><![CDATA[<p>Made a minor tweak to my <code>.bashrc</code> after browsing <a href="http://www.dotfiles.org/">dotfiles.org</a> for some ideas. One neat trick I gleaned was detecting when the exit code of the last command (<code>$?</code>) was non-zero and altering the prompt. This will be useful for quickly seeing at a glance if some enormous load of output from make was successful or not.</p>
<div id="attachment_73" class="wp-caption alignnone" style="width: 408px"><a href="http://www.metabrew.com/wp-content/uploads/2008/10/ps1.png"><img class="size-full wp-image-73" title="Bash prompt" src="http://www.metabrew.com/wp-content/uploads/2008/10/ps1.png" alt="Note the prompt goes red on failure" width="398" height="285" /></a><p class="wp-caption-text">Note the prompt goes red on failure</p></div>
<p>Here are the bits from my updated <code>.bashrc</code>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3"># define useful aliases <span class="kw1">for</span> color codes</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_norm=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[0m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_black=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[0;30m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_darkgray=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[1;30m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re2">sh_blue=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[0;34m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_light_blue=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[1;34m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_green=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[0;32m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_light_green=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[1;32m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_cyan=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[0;36m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re2">sh_light_cyan=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[1;36m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_red=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[0;31m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_light_red=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[1;31m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_purple=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[0;35m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_light_purple=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[1;35m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re2">sh_brown=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[0;33m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_yellow=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[1;33m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_light_gray=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[0;37m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">sh_white=</span><span class="st0">&quot;<span class="es0">\[</span><span class="es0">\0</span>33[1;37m<span class="es0">\]</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">case</span> `<span class="kw2">hostname</span>` <span class="kw1">in</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;livehost&quot;</span>|<span class="st0">&quot;production_server&quot;</span>|<span class="st0">&quot;sauron&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">HOSTCOLOUR=</span><span class="re0">$<span class="br0">&#123;</span>sh_red<span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ;;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&quot;staging-node&quot;</span><span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp;<span class="re2">HOSTCOLOUR=</span><span class="re0">$<span class="br0">&#123;</span>sh_yellow<span class="br0">&#125;</span></span> ;;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; *<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re2">HOSTCOLOUR=</span><span class="re0">$<span class="br0">&#123;</span>sh_green<span class="br0">&#125;</span></span> ;;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">esac</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">export</span> <span class="re2">PROMPT_COMMAND=</span><span class="st0">&#8216;if [ $? -ne 0 ]; then ERROR_FLAG=1; else ERROR_FLAG=; fi; &#8216;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">export</span> <span class="re2">PS1=</span><span class="re0">$<span class="br0">&#123;</span>sh_white<span class="br0">&#125;</span></span><span class="st0">&#8216;<span class="es0">\u</span>@&#8217;</span><span class="re0">$<span class="br0">&#123;</span>HOSTCOLOUR<span class="br0">&#125;</span></span><span class="st0">&#8216;<span class="es0">\h</span>&#8216;</span><span class="re0">$<span class="br0">&#123;</span>sh_norm<span class="br0">&#125;</span></span><span class="st0">&#8216; <span class="es0">\w</span><span class="es0">\n</span>&#8216;</span><span class="re0">$<span class="br0">&#123;</span>sh_norm<span class="br0">&#125;</span></span><span class="st0">&#8216;${ERROR_FLAG:+&#8217;</span><span class="re0">$<span class="br0">&#123;</span>sh_light_red<span class="br0">&#125;</span></span><span class="st0">&#8216;}<span class="es0">\$</span>${ERROR_FLAG:+&#8217;</span><span class="re0">$<span class="br0">&#123;</span>sh_norm<span class="br0">&#125;</span></span><span class="st0">&#8216;} &#8216;</span></div>
</li>
</ol>
</div>
<p><br/><br />
I&#8217;m also using the hostname to decide what colour the host appears in the prompt. My home directory, and thus .bashrc, is mounted on most hosts I log in to, and this serves as a reminder if I&#8217;m logged in to a production host. Green is the default, and it&#8217;s overridden for various special hosts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.metabrew.com/article/updated-bash-ps1//feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Transcoding HTTP mp3 streaming proxy in bash</title>
		<link>http://www.metabrew.com/article/transcoding-http-mp3-streaming-proxy-in-bash/</link>
		<comments>http://www.metabrew.com/article/transcoding-http-mp3-streaming-proxy-in-bash/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 21:01:09 +0000</pubDate>
		<dc:creator>RJ</dc:creator>
				<category><![CDATA[hacks]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[netcat]]></category>
		<category><![CDATA[streaming]]></category>

		<guid isPermaLink="false">http://www.metabrew.com/?p=58</guid>
		<description><![CDATA[Here&#8217;s how to make a proxy for streaming mp3s. It transcodes on-the-fly to 64kpbs MP3 using lame. When transcoding is finished, it calls the ./posthandler.sh script, which can either just delete the file, or potentially archive it so you don&#8217;t need to transcode it again. #!/bin/bash read method url version &#160; method=&#34;${method%$CR}&#34; url=&#34;${url%$CR}&#34; version=&#34;${version%$CR}&#34; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s how to make a proxy for streaming mp3s. It transcodes on-the-fly to 64kpbs MP3 using lame. When transcoding is finished, it calls the ./posthandler.sh script, which can either just delete the file, or potentially archive it so you don&#8217;t need to transcode it again.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">read</span> method url version</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">method=</span><span class="st0">&quot;${method%$CR}&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re2">url=</span><span class="st0">&quot;${url%$CR}&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">version=</span><span class="st0">&quot;${version%$CR}&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> -ne <span class="st0">&quot;HTTP/1.0 200 OK<span class="es0">\r</span><span class="es0">\n</span>Content-type: audio/mpeg<span class="es0">\r</span><span class="es0">\n</span><span class="es0">\r</span><span class="es0">\n</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re2">BR=</span><span class="nu0">64</span> <span class="re3">#birate to transcode to.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">PIPE=</span><span class="st0">&quot;/tmp/$$.pipe&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">mkfifo</span> <span class="st0">&quot;$PIPE&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">OUTFILE=</span><span class="st0">&quot;./tmp.$$.$BR.mp3&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">rm</span> <span class="re1">$OUTFILE</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">url=</span>`<span class="kw3">echo</span> <span class="st0">&quot;$url&quot;</span> | <span class="kw2">sed</span> <span class="st0">&#8216;s/<span class="es0">\/</span>//&#8217;</span>`</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;** GET $url&quot;</span> &gt;&amp;<span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">nohup</span> <span class="kw2">lynx</span> &#8211;<span class="kw3">source</span> <span class="st0">&quot;$url&quot;</span> \</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; | <span class="br0">&#40;</span>lame &#8211;preset cbr <span class="re1">$BR</span> &#8211;mp3input &#8211; - <span class="nu0">2</span>&gt;/dev/null \</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &amp;&amp; <span class="br0">&#40;</span><span class="kw3">echo</span> <span class="st0">&quot;** Finished transcoding $url&quot;</span> &gt;&amp;<span class="nu0">2</span> ; \</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ./posthandler.<span class="kw2">sh</span> <span class="st0">&quot;$OUTFILE&quot;</span>&amp;<span class="br0">&#41;</span><span class="br0">&#41;</span>\</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; | <span class="kw2">tee</span> -i <span class="st0">&quot;$PIPE&quot;</span> &gt; <span class="re1">$OUTFILE</span> &amp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">cat</span> &lt; <span class="re1">$PIPE</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">rm</span> <span class="re1">$PIPE</span></div>
</li>
</ol>
</div>
<p><br/></p>
<p>One interesting limitation seems to be the buffer size of a fifo pipe in linux. Even though the transcoding step is pretty quick, if a client is connected the transcoding only manages to fill the pipe a couple of hundred k ahead of what is being read. </p>
<p>The -i flag to `tee` means it ignores interrupts, and will finish transcoding the file and call the posthandler even if the client disconnects.</p>
<p>Run is like this:</p>
<p><code>while [ 1 ]; do nc -vlp 8080 -c './transstreamer.sh' ; done</code></p>
<p>Then hit up a url of your choice using your awesome new proxy:</p>
<p><code>mpg321 "http://localhost:8080/http://freedownloads.last.fm/download/105468518/Letters%2BFrom%2BThe%2BBoatman.mp3"</code></p>
<p>Not the most scalable solution, but a mildly amusing quick hack.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.metabrew.com/article/transcoding-http-mp3-streaming-proxy-in-bash//feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
