<?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>Sonia Hamilton</title>
	<atom:link href="http://www.snowfrog.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.snowfrog.net</link>
	<description>Linux, Programming, Martial Arts</description>
	<lastBuildDate>Fri, 15 Mar 2013 20:59:14 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>git bisect run &#8211; example</title>
		<link>http://www.snowfrog.net/2013/03/15/git-bisect-run-example/</link>
		<comments>http://www.snowfrog.net/2013/03/15/git-bisect-run-example/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 23:55:06 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Other-Tech]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Golang]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1814</guid>
		<description><![CDATA[Git bisect is a great tool for finding bugs in a program. But many examples show manual uses of git bisect &#8211; here&#8217;s an example of automating the process using git bisect run. tl;dr Using git bisect run is easy if you&#8217;ve make small atomic… <a href="http://www.snowfrog.net/2013/03/15/git-bisect-run-example/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html">Git bisect</a> is a great tool for finding bugs in a program. But many examples show manual uses of git bisect &#8211; here&#8217;s an example of automating the process using <strong>git bisect run</strong>.</p>
<h2>tl;dr</h2>
<p>Using <strong>git bisect run</strong> is easy if you&#8217;ve make small atomic commits and you have good tests. <strong>run</strong> makes a large debug easier (compared to manually doing <strong>git bisect good</strong> and <strong>git bisect bad</strong>) &#8211; you&#8217;re less likely to make errors due to boredom. And run means you can use an iterative process &#8211; use rebase to split bad commits then just run again.</p>
<h2>Example</h2>
<p>So I had an elusive bug in a long running process (an snmp poller, calculator and aggregator for a large network). I had a point where the program was <strong>good</strong>, but I&#8217;d added more features since good and now results were <strong>bad</strong>. The first step was to write a shell script to be called from <strong>git bisect run</strong>:</p>
<pre class="brush: bash; title: ; notranslate">
% cat bisect.sh
#!/bin/bash
# copy this to ~ before running with `git bisect run ~/bisect.sh`

cp ~/Makefile .
make clean

# make modifies manpage output, so stash after build
if make &amp;&gt; /dev/null ; then
	git stash
	git stash clear
else
	git stash
	git stash clear
	exit 125
fi

sudo cat /var/tmp/empty &gt; /var/log/abc/abc-poller.log
sudo ./abc-poller --tmp --once -d 2 -c 150 || exit 125
echo &quot;=== poller finished&quot;

percent=`godir=/var/tmp/data/abcmon/poll_queue/new ~/checker | \
  tail -1 | awk '{print $5}' | awk -F. '{print $1}'`
echo &quot;=== percent is $percent&quot;
(( percent &lt; 5 ))
</pre>
<p>Things that make writing the test script easier:</p>
<ul>
<li>first get it working outside of <strong>git bisect run</strong> &#8211; usually means echoing results along the way</li>
<li>already having a test suite that produces a quantified pass/fail output, In my case the I had already written the checker program, whose last line of output contained a &#8220;percentage failure&#8221; figure</li>
</ul>
<p>Next step was having an abbreviated log of commits to refer to:</p>
<pre class="brush: bash; title: ; notranslate">
% git log --oneline
f00f232 sql.go - better debugging       # bad                                                                                                                                                        
9780d44 dummy .gitignore, so out dir preserved
0de0796 Makefile for nsch1abcs01
a2f6c96 defaults - 20 workers, udp 15
b8ee3d9 GOMAXPROCS()
04f21ba start v0.0.2
dbc6a60 Makefile: Jenkins as default for env vars
557a5e3 more work on stats
ef6a453 remove excessive debugging
ccc4644 remove file buffering - wasn't writing..???
98bf4b1 stats write failing
9a9682d move type queue_t struct
467aeed buffered writes for queue file
148a8cc stats: + device_run, device_ok
c61be42 done chan *Stats_t; calculate_value() bool
0e41461 debugging - print out device_id as %5s
7cbe167 default workers 5000, correct stop/start commands
544e8d7 gather statistics
6990cf2 rename data chan to device_id
5e8562b rename sql -&gt; sqlconn; global var
fd52d89 remove dead code
4d7b9b1 device_for() - err if count != 1
6ceb305 deb: fail if version main.go isn't same changelog
5ce1855 deb: rules producing abc-poller_0.0.1_amd64.deb
db5bff4 deb: cleaned up Makefile, roffs
76674c2 JSON -&gt; SQL; version 0.0.1
4cf198e deb: basic removal of 64 references
d980f26 deb: rename 64 to vanilla
b933570 deb: remove 32 bit stuff
970bd82 current debug level is 2; adjust output
70f8921 Revert &quot;deb build - don't init, cron while testing&quot;
855ce00 default debug is 2; misc tidy
f3d80e1 remove timeoutOpt - no longer used
48ced38 misc tidys before release
a3fe13c runonceOpt, revert cycling code  # good
24cd998 use passed in udpOpt
5ca1830 remove stash/sender.old.go
06b9566 remove gsnmpgo; use gosnmp
bffd430 rules: add note about &quot;too many open files&quot;
</pre>
<p>Mark bad and good, start the run, go and have a coffee :-)</p>
<pre class="brush: bash; title: ; notranslate">
% git bisect start f00f232 a3fe13c
% git bisect run ~/bisect.sh
# lots of output
</pre>
<p>I get the result that the ominously named <strong>557a5e3 more work on stats</strong> is the first bad commit &#8211; I remember it as one of those large &#8220;kitchen sink&#8221; commits done at the end of the day. So &#8220;first rule of <s>fightclub</s> git&#8221; remembered &#8211; <strong>always do small atomic commits</strong>.</p>
<p>I have a useful shell function <strong>gri()</strong> &#8211; I used that to interactively rebase and break up 557a5e3 into many small commits:</p>
<pre class="brush: bash; title: ; notranslate">
gri () {
  git rebase -i HEAD~${1:-7}
}
</pre>
<p>After rebasing git log looked like this &#8211; notice the many small commits named &#8220;bisect1&#8243; etc:</p>
<pre class="brush: bash; title: ; notranslate">
382b3ee defaults - 20 workers, udp 15
11db314 GOMAXPROCS()
4b547ea start v0.0.2
c92feef Makefile: Jenkins as default for env vars
8fcc595 bisect6: calc/noncalc
ad3a18f bisect5: tweak debug msgs
311bb8d bisect4: mv stats init
957c234 bisect3: remove stats from send_gosnmp()
3c01d62 bisect2: use Add(); Calcs/NonCalcs
947cb27 bisect1: move Stats_t; Add()
ef6a453 remove excessive debugging
ccc4644 remove file buffering - wasn't writing..???
98bf4b1 stats write failing
</pre>
<p>And here&#8217;s the real win of writing bisect.sh &#8211; you can just keep rebasing and running until you&#8217;ve narrowed down the bad code to a few lines:</p>
<pre class="brush: bash; title: ; notranslate">
=== poller finished
=== percent is 49
947cb27fd57642dc545ee23090d7ae8fd8b14b3f is the first bad commit
commit 947cb27fd57642dc545ee23090d7ae8fd8b14b3f
Author: Sonia Hamilton &lt;sonia@snowfrog.net&gt;
Date:   Thu Mar 14 10:02:42 2013 +1100

    bisect1: move Stats_t; Add()
</pre>
<p>I do another interactive rebase, fix the logic error, and then HEAD is good.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2013/03/15/git-bisect-run-example/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PayPal resolved case</title>
		<link>http://www.snowfrog.net/2013/03/12/paypal-resolved-case/</link>
		<comments>http://www.snowfrog.net/2013/03/12/paypal-resolved-case/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 00:19:30 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Paypal]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1812</guid>
		<description><![CDATA[I just had a case resolved with PayPal, got my money back &#8211; it&#8217;s nice to know there&#8217;s some things on the internet that can be trusted. The seller has a nice website but didn&#8217;t ship the item and didn&#8217;t respond to emails. ---------------------------------------------------------------------- Resolution… <a href="http://www.snowfrog.net/2013/03/12/paypal-resolved-case/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<p>I just had a case resolved with PayPal, got my money back &#8211; it&#8217;s nice to know there&#8217;s some things on the internet that can be trusted.</p>
<p>The seller has a nice website but didn&#8217;t ship the item and didn&#8217;t respond to emails.</p>
<pre>----------------------------------------------------------------------
Resolution of Your Case: #DEADBEEF
----------------------------------------------------------------------

Dear Sonia Hamilton,

We have concluded our investigation into your case and have decided in your
favour.

We were able to recover $0.01 AUD, and this amount has been credited to
you. Please allow 5 business days for this adjustment to be posted.

If you are due any additional funds, we will make our best effort to
recover the balance from the seller.

If the seller's account has insufficient funds to complete the refund owed
to you, please be assured that we will take appropriate action against the
seller's account, which may include limitation of the seller's account
privileges.</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2013/03/12/paypal-resolved-case/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GoSnmp &#8211; SNMP for GoLang</title>
		<link>http://www.snowfrog.net/2013/03/11/gosnmp-snmp-for-golang/</link>
		<comments>http://www.snowfrog.net/2013/03/11/gosnmp-snmp-for-golang/#comments</comments>
		<pubDate>Mon, 11 Mar 2013 01:19:54 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Golang]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1771</guid>
		<description><![CDATA[Today I released soniah/gosnmp &#8211; an update of alouca/gosnmp. Many, many thanks to Andreas Louca for writing alouca/gosnmp. The major difference between his version and soniah/gosnmp is that the latter has tests written. (However the code could do with refactoring). The tests were used to… <a href="http://www.snowfrog.net/2013/03/11/gosnmp-snmp-for-golang/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<p>Today I released <a href="http://github.com/soniah/gosnmp">soniah/gosnmp</a> &#8211; an update of <a href="http://github.com/alouca">alouca/gosnmp</a>.</p>
<p>Many, many thanks to Andreas Louca for writing <strong>alouca/gosnmp</strong>. The major difference between his version and <strong>soniah/gosnmp</strong> is that the latter has tests written. (However the code could do with refactoring). The tests were used to find and correct errors in the following SNMP BER Types:</p>
<ul>
<li>Counter32</li>
<li>Gauge32</li>
<li>Counter64</li>
<li>OctetString</li>
<li>ObjectIdentifier</li>
<li>IpAddress</li>
</ul>
<p>Also, this version contains functions for treating the returned snmp values as <code>*big.Int</code> (convenient, as SNMP can return int32, uint32, and uint64 values)</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2013/03/11/gosnmp-snmp-for-golang/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>refactoring in Go &#8211; rather pleasant actually&#8230;</title>
		<link>http://www.snowfrog.net/2013/02/12/refactoring-in-go-rather-pleasant-actually/</link>
		<comments>http://www.snowfrog.net/2013/02/12/refactoring-in-go-rather-pleasant-actually/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 01:12:32 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Other-Tech]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1790</guid>
		<description><![CDATA[I&#8217;ve just finished refactoring a large Go program, and the process was rather&#8230;. pleasant. Static typing catches all those obscure errors I wouldn&#8217;t think about in a scripting language (Python, Perl, Ruby, etc). My process is: type :make in vim (I have a dummy Makefile… <a href="http://www.snowfrog.net/2013/02/12/refactoring-in-go-rather-pleasant-actually/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just finished refactoring a large Go program, and the process was rather&#8230;. pleasant.</p>
<p>Static typing catches all those obscure errors I wouldn&#8217;t think about in a scripting language (Python, Perl, Ruby, etc). My process is:</p>
<ul>
<li>type <strong>:make</strong> in vim (I have a dummy Makefile in my Go project just for vim)</li>
<li>vim jumps cursor to error (<a href="http://vimdoc.sourceforge.net/htmldoc/quickfix.html">vim quickfix list</a>)</li>
<li>&#8220;oh, I shouldn&#8217;t do that&#8221; &#8211; fix (type type type)</li>
<li>start again</li>
</ul>
<p>Finish rather sooner than expected, run tests, smile in knowledge program is working <em>properly</em>.</p>
<p><strong>Update</strong></p>
<p>To quickly setup the <strong>make</strong> command for Go, type this in a Vim window:</p>
<pre class="brush: bash; title: ; notranslate">
:setlocal makeprg=go\ build\ \.
</pre>
<p>Or even better configure vim via your ~/.vimrc, for example:</p>
<pre class="brush: bash; title: ; notranslate">
autocmd BufRead *_test.go setlocal makeprg=go\ test\ \.
autocmd BufRead *.go setlocal makeprg=go\ test\ \./..
</pre>
<p>Thanks Martin for the comment!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2013/02/12/refactoring-in-go-rather-pleasant-actually/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>gsnmpgo &#8211; SNMP for Golang using gsnmp</title>
		<link>http://www.snowfrog.net/2013/02/10/gsnmpgo-snmp-for-golang-using-gsnmp/</link>
		<comments>http://www.snowfrog.net/2013/02/10/gsnmpgo-snmp-for-golang-using-gsnmp/#comments</comments>
		<pubDate>Sun, 10 Feb 2013 10:02:40 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Other-Tech]]></category>
		<category><![CDATA[CGo]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[Golang]]></category>
		<category><![CDATA[SNMP]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1787</guid>
		<description><![CDATA[Update 8/Mar/13 Work on gsnmpgo has halted. Making the gsnmp C library multithreaded was proving too time consuming. Use http://github.com/soniah/gosnmp instead. Previously&#8230; I recently released gsnmpgo &#8211; a Go/CGo snmp library using gsnmp. Pull requests welcome! From the gsnmpgo documentation, here&#8217;s an example of usage: <a href="http://www.snowfrog.net/2013/02/10/gsnmpgo-snmp-for-golang-using-gsnmp/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<h2>Update 8/Mar/13</h2>
<p>Work on gsnmpgo has halted. Making the gsnmp C library multithreaded was proving too time consuming. Use http://github.com/soniah/gosnmp instead.</p>
<h2>Previously&#8230;</h2>
<p>I recently released <a href="http://github.com/soniah/gsnmpgo">gsnmpgo</a> &#8211; a Go/CGo snmp library using gsnmp. Pull requests welcome!</p>
<p>From the <a href="http://godoc.org/github.com/soniah/gsnmpgo">gsnmpgo documentation</a>, here&#8217;s an example of usage:</p>
<pre class="brush: cpp; title: ; notranslate">
// do an snmp get; RFC 4088 is used for uris
uri := `snmp://public@192.168.1.10//(1.3.6.1.2.1.1.1.0)`
params := gsnmpgo.NewDefaultParams(uri)
results, err := gsnmpgo.Query(params)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

// check your results
gsnmpgo.Dump(results)

// turn on debugging
gsnmpgo.Debug = true
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2013/02/10/gsnmpgo-snmp-for-golang-using-gsnmp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bokken and Sword Training</title>
		<link>http://www.snowfrog.net/2013/01/23/bokken-and-sword-training/</link>
		<comments>http://www.snowfrog.net/2013/01/23/bokken-and-sword-training/#comments</comments>
		<pubDate>Wed, 23 Jan 2013 07:01:51 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Martial Arts]]></category>
		<category><![CDATA[Balintawak]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1781</guid>
		<description><![CDATA[The guys training with wooden swords (Bokken) and metal swords. http://www.youtube.com/watch?v=xETBPYwqXMI <a href="http://www.snowfrog.net/2013/01/23/bokken-and-sword-training/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<p>The guys training with wooden swords (Bokken) and metal swords.</p>
<p><a href="http://www.youtube.com/watch?v=xETBPYwqXMI">http://www.youtube.com/watch?v=xETBPYwqXMI</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2013/01/23/bokken-and-sword-training/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>git &#8211; delete local tracking branches</title>
		<link>http://www.snowfrog.net/2013/01/23/git-delete-local-tracking-branches/</link>
		<comments>http://www.snowfrog.net/2013/01/23/git-delete-local-tracking-branches/#comments</comments>
		<pubDate>Tue, 22 Jan 2013 22:11:48 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1775</guid>
		<description><![CDATA[(Just a summary of Stack Overflow &#8220;How do you Remove an Invalid Remote Branch Reference from Git?&#8221;). To delete a local tracking branch (without deleting the remote branch), do: And of course to delete the remote branch: Occasionally a gc will help, but usually shouldn&#8217;t… <a href="http://www.snowfrog.net/2013/01/23/git-delete-local-tracking-branches/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<p>(Just a summary of <a href="http://stackoverflow.com/questions/1072171/how-do-you-remove-an-invalid-remote-branch-reference-from-git">Stack Overflow &#8220;How do you Remove an Invalid Remote Branch Reference from Git?&#8221;</a>).</p>
<p>To delete a local tracking branch (without deleting the remote branch), do:</p>
<pre class="brush: bash; title: ; notranslate">
git branch -rd remote/branch
</pre>
<p>And of course to delete the remote branch:</p>
<pre class="brush: bash; title: ; notranslate">
git push remote :branch
</pre>
<p>Occasionally a gc will help, but usually shouldn&#8217;t be used:</p>
<pre class="brush: bash; title: ; notranslate">
git gc --prune=now
</pre>
<p>So, when would you want to use this? Let&#8217;s say the repository you&#8217;re tracking has a lot of branches (eg the Linux Kernel). You start tracking branch &#8220;foo&#8221;, do some work with it, merge some of it in to your branch &#8220;bar&#8221;, then push &#8220;bar&#8221; up to the remote repository. Or, you&#8217;ve got a whole lot of dev branches you&#8217;ve merged pushed to your backup repository and also merged into your master branch.</p>
<p>In either case you&#8217;ve got a collection of tracking branches you don&#8217;t want to see anymore, so clean them up:</p>
<pre class="brush: bash; title: ; notranslate">
% git branch -r
  soniah/dev.a
  soniah/dev.b
  soniah/dev.c
  soniah/dev.d
  soniah/master

% git branch -rd soniah/dev.a
Deleted remote branch soniah/dev.a (was deadbeef).

% git branch -rd soniah/dev.b
Deleted remote branch soniah/dev.b (was deadbeef).

# now remote branches is cleaner:
% git branch -r
  soniah/dev.c
  soniah/dev.d
  soniah/master
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2013/01/23/git-delete-local-tracking-branches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>git pull -f (git force pull)</title>
		<link>http://www.snowfrog.net/2012/12/03/git-pull-f-git-force-pull/</link>
		<comments>http://www.snowfrog.net/2012/12/03/git-pull-f-git-force-pull/#comments</comments>
		<pubDate>Mon, 03 Dec 2012 02:11:50 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1763</guid>
		<description><![CDATA[Git has a &#8220;force push&#8221; option (git push -f remote branch), but it doesn&#8217;t have a &#8220;force pull&#8221; option (like git pull -f remote branch). This works: Or, as a function for your bash/zsh config file: <a href="http://www.snowfrog.net/2012/12/03/git-pull-f-git-force-pull/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<p>Git has a &#8220;force push&#8221; option (<strong>git push -f remote branch</strong>), but it doesn&#8217;t have a &#8220;force pull&#8221; option (like <strong>git pull -f remote branch</strong>).</p>
<p>This works:</p>
<pre class="brush: bash; title: ; notranslate">
% git fetch remote branch
% git reset --hard FETCH_HEAD
% git clean -df
</pre>
<p>Or, as a function for your bash/zsh config file:</p>
<pre class="brush: bash; title: ; notranslate">
gpuf () {
   # git pull -f $1
   remote=${1:?&quot;need remote to force pull from&quot;}

   current_branch=$(git symbolic-ref -q HEAD)
   current_branch=${current_branch##refs/heads/}
   current_branch=${current_branch:-HEAD}
   if [ $current_branch = 'HEAD' ] ; then
       echo
       echo &quot;On a detached head. Exiting...&quot;
       exit 1
   fi  

   git fetch $remote $current_branch
   git reset --hard FETCH_HEAD
   git clean -df 
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2012/12/03/git-pull-f-git-force-pull/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linux filename suffixes</title>
		<link>http://www.snowfrog.net/2012/11/30/linux-filename-suffixes/</link>
		<comments>http://www.snowfrog.net/2012/11/30/linux-filename-suffixes/#comments</comments>
		<pubDate>Fri, 30 Nov 2012 10:32:15 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1760</guid>
		<description><![CDATA[When creating files in Linux (and other OS&#8217;s) there&#8217;s the usual convention of .txt for text files, .c for C files, etc &#8211; you just pick them up as you go along. But there&#8217;s actually a manpage that lists the common conventions &#8211; &#8220;who knew&#8221;?… <a href="http://www.snowfrog.net/2012/11/30/linux-filename-suffixes/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<p>When creating files in Linux (and other OS&#8217;s) there&#8217;s the usual convention of <strong>.txt</strong> for text files, <strong>.c</strong> for C files, etc &#8211; you just pick them up as you go along.</p>
<p>But there&#8217;s actually a <a href="https://www.kernel.org/doc/man-pages/online/pages/man7/suffixes.7.html">manpage</a> that lists the common conventions &#8211; &#8220;who knew&#8221;?</p>
<pre>% man suffixes
SUFFIXES(7)                           Linux Programmer's Manual                           SUFFIXES(7)

NAME
       suffixes - list of file suffixes

DESCRIPTION
       It  is  customary to indicate the contents of a file with the file suffix, which consists of a
       period, followed by one or more letters.  Many standard utilities, such as compilers, use this
...
        .asm         │ (GNU) assembler source file
        .au          │ Audio sound file
        .aux         │ LaTeX auxiliary file
...</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2012/11/30/linux-filename-suffixes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Brawl Video &#8211; Self Defence Lessons</title>
		<link>http://www.snowfrog.net/2012/11/30/brawl-video-self-defence-lessons/</link>
		<comments>http://www.snowfrog.net/2012/11/30/brawl-video-self-defence-lessons/#comments</comments>
		<pubDate>Fri, 30 Nov 2012 01:24:54 +0000</pubDate>
		<dc:creator>Sonia Hamilton</dc:creator>
				<category><![CDATA[Martial Arts]]></category>
		<category><![CDATA[Balintawak]]></category>
		<category><![CDATA[BJJ]]></category>

		<guid isPermaLink="false">http://www.snowfrog.net/?p=1755</guid>
		<description><![CDATA[This brawl video shows some good self defence lessons. Chest pushing -&#62; wild punching -&#62; shirt,hair,standup grappling -&#62; ground grappling ie Muay Thai -&#62; Wrestling -&#62; BJJ. But that you don&#8217;t want to get stuck grappling &#8211; someone else can then come and punch/kick you… <a href="http://www.snowfrog.net/2012/11/30/brawl-video-self-defence-lessons/" rel="bookmark">more...</a>]]></description>
			<content:encoded><![CDATA[<p>This brawl video shows some good self defence lessons. Chest pushing -&gt; wild punching -&gt; shirt,hair,standup grappling -&gt; ground grappling ie Muay Thai -&gt; Wrestling -&gt; BJJ. But that you don&#8217;t want to get stuck grappling &#8211; someone else can then come and punch/kick you in the head&#8230;</p>
<p>Lot&#8217;s of people were hurt, but imagine if improvised weapons (beer bottles, bricks) had been used &#8211; even worse&#8230; :-( And like most fights, any of them could have just &#8220;counted to 10&#8243; and walked away &#8211; always the best approach :-)</p>
<p><a href="http://www.youtube.com/watch?v=mMv27u0JIUs">http://www.youtube.com/watch?v=mMv27u0JIUs</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.snowfrog.net/2012/11/30/brawl-video-self-defence-lessons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
