Local Conspiracy (less scary than the global kind!)http://localconspiracy.com/2023-03-29T18:05:00-07:00Read To Me - epub to TTS mp3s2023-03-29T18:05:00-07:002023-03-29T18:05:00-07:00Christopher Aedotag:localconspiracy.com,2023-03-29:/2023/03/read-to-me.html<p>For a long time I've wanted to start knitting, but I never end up putting
in the time to learn and practice. One thing that held me back was that I
knew I couldn't do anything else during all the hours I would spend getting
the hang of it. Recently …</p><p>For a long time I've wanted to start knitting, but I never end up putting
in the time to learn and practice. One thing that held me back was that I
knew I couldn't do anything else during all the hours I would spend getting
the hang of it. Recently I thought it would be a perfect time to listen to
audio books! Then almost immediately I realized the audio version of the book
I was reading had a long wait at the library, and I didn't want to spend
$15+ for a different version of a book I already purchased. What if I could
make my own audiobook version?</p>
<p>I had heard some pretty amazing speech synthesisers that used machine
learning to develop the voices. I was especially impressed with <a href="https://github.com/coqui-ai/TTS">Coqui AI
TTS</a>, so I started playing around with the
sample voices that were already developed. I did look into building my own
voice model, but it does take a fair bit of effort. After listining to text
read by the included VITS models, I thought this could really work out well.</p>
<p>I threw together a <a href="https://github.com/aedocw/epub2tts">simple python script, epub2tts</a>
and pointed it at an epub I had. Initially I ran into lots of little problems
that were pretty easy to sort out. For instance some chapters were just too
long and would cause Coqui to crash, so I picked a size that I knew was
consistently causing issues, and just split that into a new "chapter". Other
than a few other minor tweaks, there wasn't much left to do before it was
working reliably well.</p>
<p>I'm really happy with the result, and find it does sound great. Of course
it's not at the level of having a real human read, but it's far better than
I expected. It's been really easy to listen to and forget that it was all
entirely computer generated.</p>
<p>Also it's made it even more fun now to practice knitting!</p>Helpful tools for organization2022-06-03T13:40:00-07:002022-06-03T13:40:00-07:00Christopher Aedotag:localconspiracy.com,2022-06-03:/2022/06/staying-organized.html<p>Lately I've been feeling really good about the tools I'm using to keep my
work (and occasionally personal) information and tasks organized. As both a
reminder to myself if I ever need to recreate everything from scratch, and
something I can share with others who might find this useful, I …</p><p>Lately I've been feeling really good about the tools I'm using to keep my
work (and occasionally personal) information and tasks organized. As both a
reminder to myself if I ever need to recreate everything from scratch, and
something I can share with others who might find this useful, I thought I
should write about it.</p>
<p>First off is using a calendar religiously. We use gmail at work, and I try
to be really good about putting in ALL appointments and time-specific
reminders, not just work meetings. For instance on the home front, I have a
recurring entry every year that reminds me to call the roof cleaner (we
live in the PNW and it's pretty important to keep your roof healthy if you
don't want it to need an early replacement). I'm also careful to put in the
location for any appointments I've got so when I get in the car the
directions will automatically pop up on CarPlay when the time for the
appointment nears.</p>
<p>The second most useful tool I've been using for a while is
<a href="https://taskwarrior.org/">TaskWarrior</a>. It has become absolutely
invaluable for me both for keeping track of the things I need to do, and
for keeping a record of the things I've been up to. To make it easier I've
got a few aliases set up:</p>
<div class="highlight"><pre><span></span><code>alias ta="task add"
alias taw="task add +work "
alias td="task done"
alias tl="task list"
alias tlw="clear;task list +work"
alias ts="task sync"
</code></pre></div>
<p>I tag anything work-specific with "+work" so my "tlw" alias shows me all
the outstanding work tasks I have. I don't even use a tiny fraction of the
capabilities of this tool to be honest. You can use it as a full featured
project management tool with sub-tasks, dependencies, due dates,
prioritization, etc. For me I just use it as a place to hold relatively
short term reminders like "Check in with Joe re repo access" or
"Follow up with HR re bonuses".</p>
<p>When I want to remind myself of what I've done in the past I just use "task
completed +work" and I get a detailed list of what I marked as done and
when it was completed.</p>
<p>Since I occasionally switch between two computers, I wanted to keep the
task list synchronized, that's the alias "task sync". For that I set up a
<a href="https://taskwarrior.org/docs/taskserver/why.html">Taskserver</a> with
docker-compose. The <a href="https://gothenburgbitfactory.github.io/taskserver-setup/">Taskserver Setup
Guide</a> was super
helpful for this.</p>
<p>The last thing I've been doing that has been incredibly valuable is making
it really easy to keep notes and search my notes for keywords or phrases. I
know there are a TON of fancy approaches to this, for instance SaS options
like Evernote and several open source self-hosted note-taking apps that are
similar. The thing is I just don't need to create or check notes from my
phone or an iPad or some random computer. I just want to be able to quickly
jump into a note from my terminal when I'm in a meeting or need to write
out something too long for a TaskWarrior task. To that end I've got the
following functions in my .zshrc:</p>
<div class="highlight"><pre><span></span><code>function notegitpush {
pushd $HOME/Documents/notes
git pull
git add <span class="gs">*</span>
<span class="gs"> git commit -m "Autocommit due to edit of $FILE"</span>
<span class="gs"> #do lame check to see if we are online before git push</span>
<span class="gs"> if ping -c 1 gitlab.com &>/dev/null</span>
<span class="gs"> then git push origin main</span>
<span class="gs"> else echo "Offline, not pushing changes up"</span>
<span class="gs"> fi</span>
<span class="gs"> popd</span>
<span class="gs">}</span>
<span class="gs">function notegitpull {</span>
<span class="gs"> pushd $HOME/Documents/notes</span>
<span class="gs"> #do lame check to see if we are online before git pull</span>
<span class="gs"> if ping -c 1 gitlab.com &>/dev/null</span>
<span class="gs"> then git pull</span>
<span class="gs"> else echo "Offline, not pulling changes"</span>
<span class="gs"> fi</span>
<span class="gs"> popd</span>
<span class="gs">}</span>
<span class="gs">function note {</span>
<span class="gs"> DATE=`date +"%Y%m%d"`</span>
<span class="gs"> TS=`date +"%Y%m%d %H:%M:%S"`</span>
<span class="gs"> FILE=$HOME/Documents/notes/$DATE.txt</span>
<span class="gs"> notegitpull</span>
<span class="gs"> echo $TS >> $FILE</span>
<span class="gs"> vi $FILE</span>
<span class="gs"> notegitpush</span>
<span class="gs">}</span>
<span class="gs">function search {</span>
<span class="gs"> egrep -i $1 ~/Documents/notes/*</span>
task list +work | egrep -i $1
echo "(e)dit with vim, (l)f, or (q): "
read -k x
if [[ $x == 'e' ]]
then
vi <span class="sb">`egrep -il $1 ~/Documents/notes/*`</span>
elif [[ $x == 'l' ]]
then
lf ~/Documents/notes
else
fi
}
</code></pre></div>
<p>Typing "note" jumps me into a new note with the filename of today's date,
with a date and time-stamp line inserted at the bottom. Then I can start
typing immediately below that and take down whatever I need to. When I exit
the file it's automatically committed to git and pushed to a private repo.</p>
<p>The alias "search" lets me search for a word or phrase and see which files
or open tasks contain what I'm looking for. That's been really helpful so
many times when I have a vague recollection of something and I want to find
more details.</p>
<p>Using these three tools (google calendar, TaskWarrior and a simple function
for creating notes with vim) has made it really easy for me to stay on top
of the things I need to do, and occasionally look back and see what I've
done. If you ever have trouble staying organized, give it a try!</p>Migrating from a hosted google domain2022-02-20T20:00:00-08:002022-02-20T20:00:00-08:00Christopher Aedotag:localconspiracy.com,2022-02-20:/2022/02/migrate-from-gmail.html<p>These instructions are specifically intended for folks moving from a
domain hosted by Google (Google Suite, set up back in 2006 when it was
free). In this case we have a bunch of email addresses at a specific
domain (mydomain.com will be used in the example bewlow), and we …</p><p>These instructions are specifically intended for folks moving from a
domain hosted by Google (Google Suite, set up back in 2006 when it was
free). In this case we have a bunch of email addresses at a specific
domain (mydomain.com will be used in the example bewlow), and we want
to continue using email addresses such as me@mydomain.com. The easiest
way to do this will be by using email forwarding from namecheap.com,
and forwarding the email to regular gmail accounts. Gmail will also
let you send mail as though it came FROM that address as long as you
are able to confirm you are in control of that address.</p>
<ol>
<li>
<p>First off, Set up 2-factor-auth on your EXISTING mydomain.com account</p>
<ol>
<li>Click Manage your Google Account</li>
<li>Click Security on the left</li>
<li>Under "Signing in to Google", click 2-Step Verification</li>
</ol>
</li>
<li>
<p>If you do not already have a gmail account, set one up. It's free
and easy, just LOG OUT OF ALL YOUR GOOGLE ACCOUNTS, then <a href="https://gmail.com">go to
gmail.com</a> and click "Create Account". When setting up
that account, be sure to enable 2-factor authentication (you will need this
to be enabled later).</p>
</li>
<li>
<p>On your NEW gmail account (which you will have your mydomain.com
email forwarded to), you will need to Create an "App
Password" <a href="https://support.google.com/accounts/answer/185833">(follow these steps)</a> and <strong>SAVE
THIS PASSWORD SOMEWHERE</strong>. You will need it later.</p>
</li>
<li>
<p>Set up your NEW gmail account to send mail as your custom email
address (me@mydomain.com for this example). </p>
<ol>
<li>In Gmail, click the gear icon in upper-right area (it will say
"Settings" when you hover over it)</li>
<li>Click "See all settings" </li>
<li>Select "Accounts and Import" tab</li>
<li>In "Send mail as" section, click "Add another email address"</li>
<li>In the "Add another email address you own" window that opens, enter
your custom email address (me@mydomain.com), leave "Treat as an alias"
checked, then click "Next Step"</li>
<li>For SMTP information, use:<ol>
<li>SMTP Server: smtp.gmail.com</li>
<li>Port: 587</li>
<li>Username: (your NEW gmail account from step 1)</li>
<li>Password: (the "App Password" you created in step 2)</li>
<li>Choose "Secured connection using TLS"</li>
</ol>
</li>
<li>When you click "Add Account", a code will be sent to your @mydomain.com
account. Enter that code in the box then click "Verify"</li>
<li>In "Accounts and Import/Send mail as:" section, click "Make default"
next to your me@mydomain.com email.</li>
<li>Scroll to the bottom and click "Save Settings"</li>
</ol>
</li>
<li>
<p>Forward mail from your old account to your new account</p>
<ol>
<li>In your mydomain.com account, click the gear icon and go to "See all settings"</li>
<li>Select "Forwarding and POP/IMAP" tab</li>
<li>Next to "Forwarding", click the "Add a forwarding address" button</li>
<li>Enter your NEW gmail.com address in the "Add a forwarding address" popup</li>
<li>A new window will open titled "Confirm forwarding address", click "Proceed"</li>
<li>Check your mydomain.com email for a verification code, and enter that in the "confirmation code" box, then click Verify.</li>
<li>In the forwarding section now, click the button next to "Forward a copy of incoming mail" to your new gmail address, and select "archive old domain Mail's copy"</li>
<li>Scroll to the bottom and click "Save Settings"</li>
</ol>
</li>
</ol>
<p>At this point, you can use your NEW gmail account exclusively!</p>
<p>What about transferring your old mail to your new account? There are
a few different ways to do this but the safest thing to do first is to
go to use Google Takeout to download a copy of your mail, contacts and
calendar. You can also download photos that you have saved on Google
but you should get those through their own Takeout request.</p>
<ol>
<li>Go to <a href="https://takeout.google.com">Google Takeout</a></li>
<li>Ensure you are using the correct account - click the circle icon in
the upper-right corner and choose a different account if your mydomain.com
account is not selected.</li>
<li>Under "CREATE A NEW EXPORT" click "Deselect All"</li>
<li>Scroll down and check the box for the following:</li>
<li>Calendar</li>
<li>Contacts</li>
<li>Mail</li>
<li>Click "Next step"</li>
<li>Click "Create export"</li>
</ol>Reverse SSH tunnel with SOCKS proxy2020-08-19T17:57:00-07:002020-08-19T17:57:00-07:00Christopher Aedotag:localconspiracy.com,2020-08-19:/2020/08/reverse-tunnel.html<p><img alt="image" src="/images/tunnel-diagram.png" title="network diagram showiing workstation connection to bastion host, then a firewall and a secret VM behind the firewall"></p>
<p>(I'm writing this mostly for myself so if/when some day in the future I
want to set this up again and can't remember how, I've got something
to reference.)</p>
<p>If you have a scenario where you'd like to access machines behind a
corporate firewall without getting on their VPN …</p><p><img alt="image" src="/images/tunnel-diagram.png" title="network diagram showiing workstation connection to bastion host, then a firewall and a secret VM behind the firewall"></p>
<p>(I'm writing this mostly for myself so if/when some day in the future I
want to set this up again and can't remember how, I've got something
to reference.)</p>
<p>If you have a scenario where you'd like to access machines behind a
corporate firewall without getting on their VPN, this might work for
you. For instance if you occasionally need to access things behind the
firewall from a machine running an OS (like linux) that is not
supported by the IT overlords at your $JOB, you can set up a reverse
SSH tunnel to connect a machine behind the firewall to a machine at
home (or a VM on a cloud provider).</p>
<p>First off, get a VM up and running on the office network, install
autossh, copy your SSH id to your bastion host, and then start a
reverse tunnel. This would be done on "SECRETVM".</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>autossh
$<span class="w"> </span>ssh-copy-id<span class="w"> </span>bastion
$<span class="w"> </span>autossh<span class="w"> </span>-M<span class="w"> </span><span class="m">10984</span><span class="w"> </span>-o<span class="w"> </span><span class="s2">"PubkeyAuthentication=yes"</span><span class="w"> </span>-o<span class="w"> </span><span class="s2">"PasswordAuthentication=no"</span><span class="w"> </span>-i<span class="w"> </span>/home/username/.ssh/id_rsa<span class="w"> </span>-R<span class="w"> </span><span class="m">2224</span>:localhost:22<span class="w"> </span>username@bastion<span class="w"> </span>-p<span class="w"> </span><span class="m">22</span>
</code></pre></div>
<p>Now on your home machine (in the diagram above thats "Workstation") you
need to add an entry to ~/.ssh/config</p>
<div class="highlight"><pre><span></span><code>host secretvm
User username
ProxyCommand ssh bastion -W localhost:2224
</code></pre></div>
<p>Now, to get to the VM inside the office, you can just "ssh secretvm"!</p>
<p>To proxy your web traffic through that VM (so you can reach things
like JIRA easily), use a SOCKS proxy. Run the following:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>ssh<span class="w"> </span>secretvm<span class="w"> </span>-D<span class="w"> </span><span class="m">9932</span><span class="w"> </span>-N
</code></pre></div>
<p>Then in Firefox, go to Preferences, General, Network Settings and
select "Manual proxy configuration", set SOCKS Host to localhost with
port 9932, and check the box for "Proxy DNS when using SOCKS v5".</p>
<p><img alt="image" src="/images/socks-config.png" title="sample SOCKS configuration screen"></p>
<p>Enjoy! Also don't tell IT as this could be a real security problem if
your bastion host is not well secured. So be sure to do everything you
can to lock that node down and keep it up to date.</p>
<p>EDIT: Adding a link to this excellent <a href="https://robotmoon.com/ssh-tunnels/">visual guide to SSH tunnels</a>
as it's SUPER useful!</p>
<p>EDIT: Adding a link to a MUCH faster SOCKS-over-SSH method, <a href="https://github.com/Snawoot/rsp">Rapid SSH
Proxy</a></p>No Innocent Bystanders2020-07-07T08:15:00-07:002020-07-07T08:15:00-07:00Christopher Aedotag:localconspiracy.com,2020-07-07:/2020/07/no-innocent-bystanders.html<p>Systemic racism impacts every person in this country. For some it
means they’re more likely to get a job interview just because of their
name. For others it means they’re more likely to be shot during a
traffic stop just because of the color of their skin. Sociologists …</p><p>Systemic racism impacts every person in this country. For some it
means they’re more likely to get a job interview just because of their
name. For others it means they’re more likely to be shot during a
traffic stop just because of the color of their skin. Sociologists
have been studying and documenting systemic, or institutional racism
in this country for over 100 years. There is no legitimate debate any
longer as to whether or not it exists. Ignorance of the problem can
not be claimed as an excuse, and we all take sides - either actively
working to dismantle broken systems, or passively accepting the
benefit in support of fundamentally unjust systems. There are no
innocent bystanders in this fight.</p>
<p>On May 25th, 2020, George Floyd, a black man, was murdered by police
in Minneapolis Minnesota. Accused of using counterfeit money to buy
cigarettes, police attempted to arrest him. He was handcuffed and
wrestled to the ground where three officers sat on him. One on his
legs, another on his body, while officer Derek Chauvin, hands held
casually in his pockets, knelt on his neck for eight minutes. George
Floyd struggled to breath, called out for his mom as he lay dying,
while other police officers stood by and watched. They watched calmly
while he took his last breath, watched while he died.</p>
<p>His murder was caught on video. The video went viral and sparked
outrage around the world. The police department took no action until
people started protesting. Initially the officers were merely fired,
which only encouraged more protests, and especially in Minnesota there
were angry riots.</p>
<p>Protests were organized in all major cities across the country,
demanding justice for George Floyd. Demanding accountability from
police officers, demanding violent officers be not just given a
temporary suspension but that they be removed from their jobs and face
charges.</p>
<p>The attention on George Floyd’s murder also shined a bright light on
other black people who had been murdered by police or former police.
Incidents that were rarely investigated, and when they were, the
guilty officers were acquitted in highly questionable trials. Trayvon
Marton. Elijah McClain. Breonna Taylor. Sandra Bland Ahmoud Arbery.
I could go on for a while, but even 8 to 10 minutes would not be
enough time.</p>
<p>Like I assume all of you, I was upset, and wanted my demands for
justice to be heard. I wanted our elected officials to know I demanded
accountability for law enforcement misconduct, and a redirection of
some police funding to social services that provide better benefit to
the citizens.</p>
<p>I believed there were at least a dozen or two like-minded individuals
in Tigard. In fact I was surprised that I hadn’t heard about or seen
any protests in our immediate area. There had been protests in
Beaverton, Lake Oswego and Tualatin but nothing in Tigard.</p>
<p>I felt I had to do something, because doing nothing literally supports
the institutionalized racism that surrounds us. There are no innocent
bystanders in this fight.</p>
<ul>
<li>On a Saturday I posted on nextdoor to see if people would be
interested in a peaceful family march, and a handful of people said
yes.</li>
<li>I proposed we meet the following Monday, and the route we would
follow to city hall, and more people said they would be there.</li>
<li>I contacted the Tigard newspaper to let them know, and the editor
said he would post it on their facebook page</li>
<li>I sent an email to the mayor to let him know, and he called me within
half an hour. He and his family planned to attend and march with us.</li>
<li>The police called me Sunday morning and said they had heard about the
march, and asked what my intentions were. I explained we would be
keeping to sidewalks and not blocking traffic, so would not need a
permit or permission. They were happy to hear what we planned, and
didn’t expect any problems.</li>
<li>I looked for local black business owners in Tigard and could find
only one. I contacted a woman named Kasha and learned she’d had to
close her business in February, but she would come to the march.</li>
<li>Kasha knew the chief of police and said she would ask her to join in.</li>
<li>I made a sign, and we headed down to the meeting place.</li>
<li>I thought if 50 people showed up that would be a fantastic turnout.
By the time we started walking there were over 500 people!</li>
<li>It was mostly families, and everyone I saw was wearing a mask and
each group was maintaining distance from other groups.</li>
<li>Kasha gave an impassioned speech about the racism she has lived with
her whole life, and how we all needed to come together to make a
positive change</li>
<li>As we all walked, I participated in and overheard amazing
conversations about addressing systemic racism, about holding police
accountable, about ending qualified immunity.</li>
<li>When the whole crowd made it to Tigard City Hall, Kasha took a few
more minutes to give an impromptu speech and get the crowd fired up,
then we headed back to where we started.</li>
<li><a href="https://twitter.com/onelonelens/">Local videographer @onelonelens</a>
<a href="https://www.pscp.tv/w/1PlKQNvrPdnGE">documented the march on
periscope</a>.</li>
</ul>
<p>If it seems like I’m somehow well connected and a brilliant organizer,
I apologize for misleading you. The relatively huge turnout was a
reflection of what’s happening on a global scale. People in Tigard, in
fact people everywhere, want our country to do better. People are
looking for ways to join in and show their support. My suggesting we
march on that Monday was more than anything lucky timing. The people
were ready to do something, they just needed someone to say when and
where to be.</p>
<p>When it was all over and I had a minute to reflect and breath, I
realized how much hope the experience gave me. Until this June, it was
incredibly rare to hear random white people talking openly about
police brutality, systemic racism, or white supremacy. You might run
into that sort of thing on a liberal college campus, or at a benefit
concert for instance. But the Black Lives Matter protests that cropped
up in cities around the world after George Floyd’s murder brought
these issues to the forefront of our collective consciousness. It used
to be easy to be a white person and wave away these issues that didn’t
affect you and may have been entirely invisible to you depending on
how you were raised. We are beyond that today. Everyone is choosing a
side whether you realize it or not. </p>
<p>What can you do to help?
There are lots of things you can do to affect change. The easiest is
to educate yourself. There are short youtube clips explaining systemic
racism. There are longer documentaries you could watch, like “The
13th”, about the 13th amendment. You can read books. Two great titles
I can personally suggest are “<a href="https://smile.amazon.com/You-Want-Talk-About-Race/dp/1580058825/">So You Want To Talk About
Racism</a>”,
and “<a href="https://smile.amazon.com/Warmth-Other-Suns-Americas-Migration/dp/0679763880/">The Warmth of Other
Suns</a>”.</p>
<p>You should spend some time getting to know more about your local
elected officials and learn where they stand. Join your community town
hall meetings, and don’t be afraid to ask some hard questions.</p>
<p>You can join a protest march, or organize one on your own - it’s not
that hard.</p>
<p>Most importantly though, talk about this. Racism thrives when people
are afraid to discuss it. There’s nothing shameful or scary in talking
about it. The sooner we can drag it out into the light, the sooner we
will see real change in our world.</p>
<p>You want positive change and an end to systemic racism, or you remain
silent, and your silence supports the broken status quo. There are no
innocent bystanders in this fight.</p>Scandir errors with scripted backups on OSX2020-06-02T12:00:00-07:002020-06-02T12:00:00-07:00Christopher Aedotag:localconspiracy.com,2020-06-02:/2020/06/backup-update.html<p>A few years ago I <a href="/2017/10/backup-everything.html">documented how I automatically back up my
computer, plus my family members'
machines</a> and the process
has been working really well. Recently however I noticed
some directories were not getting backed up on OSX machines.
Turns out since I updated to Catalina, the stricter security …</p><p>A few years ago I <a href="/2017/10/backup-everything.html">documented how I automatically back up my
computer, plus my family members'
machines</a> and the process
has been working really well. Recently however I noticed
some directories were not getting backed up on OSX machines.
Turns out since I updated to Catalina, the stricter security
was preventing borg from accessing all the directories it
was able to previously.</p>
<p>I was seeing errors like this:</p>
<div class="highlight"><pre><span></span><code>/Users/myuser/Documents: scandir: [Errno 1] Operation not permitted: '/Users/myuser/Documents'
</code></pre></div>
<p>A few searches on duckduckgo showed me other borg users (along with
lots of other users of things running from bash on OSX) were hitting
the same problem. With OSX security you can grant full-disk access to
binary applications, but you can't do it very easily or safely to a
shell script. General consensus though was that if you wrap a call to
your shell script in a simple compiled binary, OSX will gladly let you
grant full disk access to that binary.</p>
<p><a href="https://n8henrie.com/2018/11/how-to-give-full-disk-access-to-a-binary-in-macos-mojave/">This page had a good
example</a>
that I started from. With a little help from a coworker (I don't know
golang at all!) I adjusted the example to ensure it sends output from
the scripts to stdout.</p>
<div class="highlight"><pre><span></span><code><span class="n">package</span> <span class="n">main</span>
<span class="kn">import</span> <span class="p">(</span>
<span class="s2">"log"</span>
<span class="s2">"os"</span>
<span class="s2">"os/exec"</span>
<span class="s2">"path/filepath"</span>
<span class="p">)</span>
<span class="n">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
<span class="n">ex</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Executable</span><span class="p">()</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
<span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="p">}</span>
<span class="nb">dir</span> <span class="o">:=</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Dir</span><span class="p">(</span><span class="n">ex</span><span class="p">)</span>
<span class="n">script</span> <span class="o">:=</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="nb">dir</span><span class="p">,</span> <span class="s2">"backup.sh"</span><span class="p">)</span>
<span class="n">cmd</span> <span class="o">:=</span> <span class="n">exec</span><span class="o">.</span><span class="n">Command</span><span class="p">(</span><span class="s2">"/bin/sh"</span><span class="p">,</span> <span class="n">script</span><span class="p">)</span>
<span class="n">output</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">cmd</span><span class="o">.</span><span class="n">CombinedOutput</span><span class="p">()</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
<span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="p">}</span>
<span class="n">log</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">string</span><span class="p">(</span><span class="n">output</span><span class="p">))</span>
<span class="p">}</span>
</code></pre></div>
<p>After saving that to backup.go and compiling with "go build
backup.go", I had a tiny go binary that called the backup script.
I copied backup and backup.sh to /Applications, then updated
~/Library/LaunchAgents/net.aedo.backup.plist to point to
/Applications/backup. Then all I had to do was grant full disk access
to /Applications/backup!</p>
<p>Now things are back to normal, and once again I'm getting everything
backed up to a local disk as well as an S3 bucket on Wasabi. Hopefully
if you're running into a similar issue this helps!</p>
<p>NOTE: Good to set an event to wake the computer up every night when
you want to run the backup. <a href="https://www.macos.utah.edu/documentation/administration/pmset.html">Use pmset to do
that</a>.</p>Best Headphones Ever2019-06-20T17:12:00-07:002019-06-20T17:12:00-07:00Christopher Aedotag:localconspiracy.com,2019-06-20:/2019/06/best-headphones-ever.html<p><img alt="image" src="/images/phones.jpg" title="bluetooth audio device and earbud headphones with custom ear molds"></p>
<p>Around 10 years ago I was traveling enough to where I thought I
deserved some fancy noise-cancelling heaphones. At the time, Bose was
the king of that space so I bought the <a href="https://amzn.to/2WHVO9k">QuietComfort
2</a> headphones. I loved them, but I could only
keep them on for maybe two hours at …</p><p><img alt="image" src="/images/phones.jpg" title="bluetooth audio device and earbud headphones with custom ear molds"></p>
<p>Around 10 years ago I was traveling enough to where I thought I
deserved some fancy noise-cancelling heaphones. At the time, Bose was
the king of that space so I bought the <a href="https://amzn.to/2WHVO9k">QuietComfort
2</a> headphones. I loved them, but I could only
keep them on for maybe two hours at a time at the very most. The
pressure on my ears bothered me, but I also found the sound pressure
of the cancellation noise got to me after a while... Maybe that wasn't
it exactly? Though they worked great on planes, even if I just had
them on with no audio going that kind of quiet hiss that was always
going on became unpleasant. </p>
<p>Recently I wanted to find new headphones that sounded great and
that I could use for a few hours (or a whole day) without issues. A
conversation with a friend led me to these <a href="https://amzn.to/2XevZCa">Etymotic
ER23-HF3</a> earbuds coupled with custom-molded
inserts for my ears. I made them myself with this <a href="https://amzn.to/2WTbpTT">Radians Earplugs
kit</a>, and I was shocked at how amazing they
sounded.</p>
<p>Making the molds actually took me two tries - the first attempt I just
did not get it down into my ear canal enough for it to work well. The
second ones worked out really well and sounded incredible. I used this
set for six or seven months and at least a dozen flights. It was
great, though I suspected the fit could still be better.</p>
<p>I went to a local audiologist and had professional molds made
(pictured above). These were a big step up from the home-made molds I
was using. I finally had what were by a long shot the best sounding
and most comfortable headphones/earbuds I had ever owned. The only
drawback was the fact that they were wired. Most of the time plugging
them into my computer (for music or webex) or my phone in my pocket
(for music or phone calls) was fine, but I still snagged the wire
often enough for it to be annoying.</p>
<p>There are lots of Bluetooth adapters I could use but not surprisingly
the cheap one I bought for $12 did not sound great. It was certainly
acceptable for conference calls but beyond that, it kind of sucked.
The problem was the audio codec, and none of the cheap ones support
APT-X. Also I hadn't really thought about Bluetooth audio codecs until
after I got that cheapie and found the quality sucked.</p>
<p>I had heard of adapters from Fiio and thought <a href="https://www.audiophile-heaven.com/2019/01/fiio-bluetooth-freedom-review.html">this comparison/review
of several Bluetooth audio
adapters</a>
was really good. I had already seen the <a href="https://amzn.to/2MMjfyL">Fiio BTR1K</a>
recommended multiple places and was happy to see it stood up well in
the comparison. </p>
<p>When I first tried it out though, I could not get my machine (OSX) to
use aptX codec, it kept only connecting with the SCO codec (on OSX you
can see what codec a Bluetooth device is using by holding down option
while clicking the Bluetooth dropdown in your menu-bar, then hovering
over whichever device you want to see). Turns out because the BTR1K
has a built-in microphone there was not enough bandwidth for the
better codec. Switching the sound-input device to "Internal
Microphone" was all it took, a few seconds later it switched to the
better codec and suddenly the audio sounded nearly as good as being
directly plugged in.</p>
<p>Including the custom ear molds (and some discounts here and there) the
whole setup including Bluetooth adapter cost about $300. It's not
cheap, but I don't expect to replace them any time soon. Honestly
they're so comfortable and great sounding I feel like it was a pretty
worthy investment.</p>Whats On Tap, April 20192019-04-29T21:15:00-07:002019-04-29T21:15:00-07:00Christopher Aedotag:localconspiracy.com,2019-04-29:/2019/04/on-tap-apr2019.html<p><img alt="image" src="/images/on-tap-190429.jpg" title="four beer taps"></p>
<p>Quick update to the blog about what's on tap these days!</p>
<p>It's been quite a while since the last update. That is mostly
because I've been drinking a less lately. Busy, and watching my
calories pretty closely while I try to drop a few pounds.
Usually that means I don't …</p><p><img alt="image" src="/images/on-tap-190429.jpg" title="four beer taps"></p>
<p>Quick update to the blog about what's on tap these days!</p>
<p>It's been quite a while since the last update. That is mostly
because I've been drinking a less lately. Busy, and watching my
calories pretty closely while I try to drop a few pounds.
Usually that means I don't have room in the intake budget for the
extra 200kcal or so. Just the same, it seems criminal to not
have beer on tap!</p>
<p>There's still some of that excellent xmas beer left, but probably
only a few pints left - it will be gone soon but I will
definitely brew that one again when winter comes back around.</p>
<p>The beer on the far left is a little obscured, but it's a N.E.
IPA. Sort of. I was experimenting with Imperial's "Juicy"
yeast, and dumped a ridiculous amount of hops in during high
krausen. At first I thought it turned out great, then a few
weeks later I changed my mind. Then a month or two later, and
having had a few other NE IPAs, I reconsidered - this beer is
really not too bad.</p>
<p>Next is a batch of <a href="https://sierranevada.com/beer/resilience-butte-county-proud-ipa/">Sierra Nevada
Resilience</a>,
a beer they created as a fundraiser for rebuilding after the Camp
Fire. They shared the recipe with brewers large and small, and
lots of other brewers made their own version. I've never tried
one, but I'm going to see if I can find some to sample, and see
how close my version turned out.</p>
<p>Finally, my frankenpils - a non-traditional pilsner made with ale
yeast. I used Imperial Dry Hop yeast for this batch so it would
serve as a yeast starter for the Resilience IPA (which I just
pitched right on top of the yeast cake after racking the
frankenpils). This one turned out really good, even though it's
got a little too high of an ABV to be a reasonable pilsner.
Still very drinkable and tasty though!</p>Whats On Tap, November 20182018-11-18T13:00:00-08:002018-11-18T13:00:00-08:00Christopher Aedotag:localconspiracy.com,2018-11-18:/2018/11/on-tap-nov2018.html<p><img alt="image" src="/images/on-tap-nov2018.jpg" title="four beer taps"></p>
<p>Sticking with my promise to update the blog when I rotate what's
on tap, here comes November's entry.</p>
<p>The last round of beer lasted pretty long. That's due to only
having one bbq party, and me drinking less beer these last few
months.</p>
<p>First up is another pale ale. Basically …</p><p><img alt="image" src="/images/on-tap-nov2018.jpg" title="four beer taps"></p>
<p>Sticking with my promise to update the blog when I rotate what's
on tap, here comes November's entry.</p>
<p>The last round of beer lasted pretty long. That's due to only
having one bbq party, and me drinking less beer these last few
months.</p>
<p>First up is another pale ale. Basically same recipe as last time
except no clarifying agents (usually I throw a whirlfloc tab in),
and I threw the dry hops in while the yeast was at high krausen.
As expected it came out very hazy (NE IPA style), and has really
good hop aroma. I love this one!</p>
<p>The porter is a toasty malty wonderful beer to have on tap for
the winter season. It could handle aging a while, but it's pretty
good fresh out of the fermenter.</p>
<p>Finally I've got the holiday ale, your classic winter warmer. Not
much to say about this one other than I expect it to be a big
help getting me through the rainy winter months ahead.</p>
<p>Here's the recipe:</p>
<div class="highlight"><pre><span></span><code><span class="mf">9</span><span class="w"> </span><span class="n">lbs</span><span class="w"> </span><span class="mf">8.0</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Pale</span><span class="w"> </span><span class="n">Malt</span><span class="w"> </span><span class="p">(</span><span class="mf">2</span><span class="w"> </span><span class="n">Row</span><span class="p">)</span><span class="w"> </span><span class="n">US</span><span class="w"> </span><span class="p">(</span><span class="mf">2.0</span><span class="w"> </span><span class="n">SRM</span><span class="p">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mf">1</span><span class="w"> </span><span class="mf">76.0</span><span class="w"> </span><span class="err">%</span><span class="w"> </span>
<span class="mf">1</span><span class="w"> </span><span class="n">lbs</span><span class="w"> </span><span class="mf">8.0</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Caramel</span><span class="o">/</span><span class="n">Crystal</span><span class="w"> </span><span class="n">Malt</span><span class="w"> </span><span class="o">-</span><span class="mf">120</span><span class="n">L</span><span class="w"> </span><span class="p">(</span><span class="mf">120.0</span><span class="w"> </span><span class="n">SRM</span><span class="p">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mf">2</span><span class="w"> </span><span class="mf">12.0</span><span class="w"> </span><span class="err">%</span><span class="w"> </span>
<span class="mf">1</span><span class="w"> </span><span class="n">lbs</span><span class="w"> </span><span class="n">Caramel</span><span class="o">/</span><span class="n">Crystal</span><span class="w"> </span><span class="n">Malt</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">80</span><span class="n">L</span><span class="w"> </span><span class="p">(</span><span class="mf">80.0</span><span class="w"> </span><span class="n">SRM</span><span class="p">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mf">3</span><span class="w"> </span><span class="mf">8.0</span><span class="w"> </span><span class="err">%</span><span class="w"> </span>
<span class="mf">4.0</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Cara</span><span class="o">-</span><span class="n">Pils</span><span class="o">/</span><span class="n">Dextrine</span><span class="w"> </span><span class="p">(</span><span class="mf">2.0</span><span class="w"> </span><span class="n">SRM</span><span class="p">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mf">4</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="err">%</span><span class="w"> </span>
<span class="mf">4.0</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Roasted</span><span class="w"> </span><span class="n">Barley</span><span class="w"> </span><span class="p">(</span><span class="mf">300.0</span><span class="w"> </span><span class="n">SRM</span><span class="p">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mf">5</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="err">%</span><span class="w"> </span>
<span class="mf">1.00</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Galena</span><span class="w"> </span><span class="err">[</span><span class="mf">12.50</span><span class="w"> </span><span class="err">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">First</span><span class="w"> </span><span class="n">Wort</span><span class="w"> </span><span class="mf">60.0</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">6</span><span class="w"> </span><span class="mf">46.2</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="mf">0.50</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Cascade</span><span class="w"> </span><span class="err">[</span><span class="mf">5.50</span><span class="w"> </span><span class="err">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">First</span><span class="w"> </span><span class="n">Wort</span><span class="w"> </span><span class="mf">60.0</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">7</span><span class="w"> </span><span class="mf">10.2</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="mf">0.50</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Willamette</span><span class="w"> </span><span class="err">[</span><span class="mf">5.50</span><span class="w"> </span><span class="err">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">First</span><span class="w"> </span><span class="n">Wort</span><span class="w"> </span><span class="mf">60.0</span><span class="w"> </span><span class="n">mi</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">8</span><span class="w"> </span><span class="mf">10.2</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="mf">1.00</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Tettnang</span><span class="w"> </span><span class="err">[</span><span class="mf">4.50</span><span class="w"> </span><span class="err">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Boil</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">9</span><span class="w"> </span><span class="mf">11.6</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="mf">0.50</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="kr">Go</span><span class="n">ldings</span><span class="p">,</span><span class="w"> </span><span class="n">East</span><span class="w"> </span><span class="n">Kent</span><span class="w"> </span><span class="err">[</span><span class="mf">5.00</span><span class="w"> </span><span class="err">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Boil</span><span class="w"> </span><span class="mf">0.0</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">10</span><span class="w"> </span><span class="mf">0.0</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="mf">1.50</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="kr">Go</span><span class="n">ldings</span><span class="p">,</span><span class="w"> </span><span class="n">East</span><span class="w"> </span><span class="n">Kent</span><span class="w"> </span><span class="err">[</span><span class="mf">5.00</span><span class="w"> </span><span class="err">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Dry</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">3</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">12</span><span class="w"> </span><span class="mf">0.0</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="mf">1.00</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Cascade</span><span class="w"> </span><span class="err">[</span><span class="mf">5.50</span><span class="w"> </span><span class="err">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Dry</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">3.0</span><span class="w"> </span><span class="n">Days</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">13</span><span class="w"> </span><span class="mf">0.0</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
</code></pre></div>Whats On Tap, August 20182018-08-10T13:00:00-07:002018-08-10T13:00:00-07:00Christopher Aedotag:localconspiracy.com,2018-08-10:/2018/08/on-tap-aug2018.html<p><img alt="image" src="/images/on-tap-aug2018.jpg" title="four beer taps"></p>
<p>I <a href="/2018/02/on-tap-feb2018.html">promised to do this whenever something on tap
changed</a> but I completely failed to
stay on top of that. Instead maybe I'll just do it when ALL the
taps have rotated, as I am doing this time!</p>
<p>The Saison is tasty, but came out a little higher gravity than …</p><p><img alt="image" src="/images/on-tap-aug2018.jpg" title="four beer taps"></p>
<p>I <a href="/2018/02/on-tap-feb2018.html">promised to do this whenever something on tap
changed</a> but I completely failed to
stay on top of that. Instead maybe I'll just do it when ALL the
taps have rotated, as I am doing this time!</p>
<p>The Saison is tasty, but came out a little higher gravity than
intended. That was the result of a (lucky? unfortunate?)
confluence of a higher than expected mash plus really happy
yeast.</p>
<p>The Pale was a huge hit, perhaps the best thing on tap this time
around. This will probably be the next thing I brew, just to be
sure it's on tap at all times.</p>
<p>The ESB was a fun one, brewed in a 10g batch with a friend so he
could take a keg with him to an event. It turned out really good
and is probably the most easy drinking thing on tap right now.</p>
<p>The last one (C.J.) is my "Conceited Jerk" recipe, which is a
clone of Arrogant Bastard that I've been making changes to for
ten years. On the taste front it's pretty close, but it's still
too dark. This time around I got a lot closer though, except it
came out higher ABV than the real thing. Still tastes great and
really hits the spot sometimes.</p>Publish WordPress to static GitLab Pages site2018-08-06T18:00:00-07:002018-08-06T18:00:00-07:00Christopher Aedotag:localconspiracy.com,2018-08-06:/2018/08/wp-on-gitlab.html<p>A long time ago I set up a WordPress blog for a family member. Though
there are lots of other options these days, back then there were few
decent choices if your requirement was a web-based CMS with a WYSIWYG
editor. An unfortunate side effect of things working well was …</p><p>A long time ago I set up a WordPress blog for a family member. Though
there are lots of other options these days, back then there were few
decent choices if your requirement was a web-based CMS with a WYSIWYG
editor. An unfortunate side effect of things working well was that
quite a lot of content for that blog has been generated over time.
That means I've also been in the business of regularly updating
WordPress to protect against the exploits that are always popping up.</p>
<p>Recently I wanted to convince the family member that switching to Hugo
would be relatively easy, and the blog could then be hosted on
<a href="https://gitlab.com">GitLab</a> (just like this one!) Trying to extract
all that content and convert it to markdown turned into a huge hassle.
There were some automated scripts that got me 95% there but nothing
worked perfectly. Manually updating all the posts was not something
I wanted to do, so eventually I gave up the dream of moving that blog.</p>
<p>Recently I started thinking about this again, and realized there was a
solution I hadn't considered. I could continue maintaining the
WordPress server but set it up to publish a static mirror and serve
that with GitLab Pages (or Github Pages if you like). This would
allow me to automate LetsEncrypt certificate renewals as well as
eliminating the security concerns associated with hosting a WordPress
site. This WOULD however mean comments would stop working, but that
feels like a minor loss in this case because the blog did not garner
many comments.</p>
<p>Here's the solution I came up with and so far it seems to be working
pretty well.</p>
<ul>
<li>Host WordPress site at URL that is not linked to from anywhere else
to reduce the odds of it being exploited - in this example we'll use
http://private.localconspiracy.com (even though this site is actually
built with Pelican)</li>
<li><a href="https://about.gitlab.com/2016/04/07/gitlab-pages-setup/">Set up hosting on GitLab
Pages</a> for
the public URL, https://localconspiracy.com</li>
<li>Add a cron job that determines when the last-built date differs
between the two URLs - if the build-dates differ, mirror the
WordPress version</li>
<li>After mirroring with wget, update all links from "private" version
to "public" version</li>
<li>Do a git push to publish the new content</li>
</ul>
<p>These are the two scripts I use:</p>
<p>check-diff.sh (called by cron every 15 minutes)</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="nv">ORIGINDATE</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>curl<span class="w"> </span>-v<span class="w"> </span>--silent<span class="w"> </span>http://private.localconspiracy.com/feed/<span class="w"> </span><span class="m">2</span>><span class="p">&</span><span class="m">1</span><span class="p">|</span>grep<span class="w"> </span>lastBuildDate<span class="k">)</span><span class="s2">"</span>
<span class="nv">PUBDATE</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>curl<span class="w"> </span>-v<span class="w"> </span>--silent<span class="w"> </span>https://www.localconspiracy.com/feed/<span class="w"> </span><span class="m">2</span>><span class="p">&</span><span class="m">1</span><span class="p">|</span>grep<span class="w"> </span>lastBuildDate<span class="k">)</span><span class="s2">"</span>
<span class="k">if</span><span class="w"> </span><span class="o">[</span><span class="w"> </span><span class="s2">"</span><span class="nv">$ORIGINDATE</span><span class="s2">"</span><span class="w"> </span>!<span class="o">=</span><span class="w"> </span><span class="s2">"</span><span class="nv">$PUBDATE</span><span class="s2">"</span><span class="w"> </span><span class="o">]</span>
<span class="k">then</span>
<span class="w"> </span>/home/doc/repos/localconspiracy/mirror.sh
<span class="k">fi</span>
</code></pre></div>
<p>mirror.sh:</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/sh</span>
<span class="nb">cd</span><span class="w"> </span>/home/doc/repos/localconspiracy
wget<span class="w"> </span><span class="se">\</span>
--mirror<span class="w"> </span><span class="se">\</span>
--convert-links<span class="w"> </span><span class="se">\</span>
--adjust-extension<span class="w"> </span><span class="se">\</span>
--page-requisites<span class="w"> </span><span class="se">\</span>
--retry-connrefused<span class="w"> </span><span class="se">\</span>
--exclude-directories<span class="o">=</span>comments<span class="w"> </span><span class="se">\</span>
--execute<span class="w"> </span><span class="nv">robots</span><span class="o">=</span>off<span class="w"> </span><span class="se">\</span>
http://private.localconspiracy.com
git<span class="w"> </span>rm<span class="w"> </span>-rf<span class="w"> </span>public/*
mv<span class="w"> </span>private.localconspiracy.com/*<span class="w"> </span>public/.
rmdir<span class="w"> </span>private.localconspiracy.com
find<span class="w"> </span>./public/<span class="w"> </span>-type<span class="w"> </span>f<span class="w"> </span>-exec<span class="w"> </span>sed<span class="w"> </span>-i<span class="w"> </span>-e<span class="w"> </span><span class="s1">'s|http://private.localconspiracy|https://www.localconspiracy|g'</span><span class="w"> </span><span class="o">{}</span><span class="w"> </span><span class="se">\;</span>
find<span class="w"> </span>./public/<span class="w"> </span>-type<span class="w"> </span>f<span class="w"> </span>-exec<span class="w"> </span>sed<span class="w"> </span>-i<span class="w"> </span>-e<span class="w"> </span><span class="s1">'s|http://www.localconspiracy|https://www.localconspiracy|g'</span><span class="w"> </span><span class="o">{}</span><span class="w"> </span><span class="se">\;</span>
git<span class="w"> </span>add<span class="w"> </span>public/*
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">"new snapshot"</span>
git<span class="w"> </span>push<span class="w"> </span>origin<span class="w"> </span>master
</code></pre></div>
<p>That's it! Now when the blog is changed, within 15 minutes the site
will be mirrored to a static version and then pushed up to the repo
where it will be reflected in GitLab pages.</p>
<p>This concept could be extended a little further if you wanted to
<a href="https://codex.wordpress.org/Installing_WordPress_Locally_on_Your_Mac_With_MAMP">run WordPress locally</a>.
In that case you would not need a server to host your WordPress blog,
you could just run it on your local machine. In that scenario there's
no chance of your blog getting exploited. As long as you can run wget
against it locally you could use the same approach outlined above to
have a WordPress site hosted on GitLab Pages.</p>Whats On Tap, February 20182018-02-08T20:16:00-08:002018-02-08T20:16:00-08:00Christopher Aedotag:localconspiracy.com,2018-02-08:/2018/02/on-tap-feb2018.html<p><img alt="image" src="/images/on-tap-feb2018.jpg" title="four beer taps"></p>
<p>I am going to start putting up a little post whenever what's on
tap at home changes. I will also make an effort to post when I
brew something as well. To that end, here's the first post on
that subject!</p>
<p>The Porter I brewed came out really nice. When …</p><p><img alt="image" src="/images/on-tap-feb2018.jpg" title="four beer taps"></p>
<p>I am going to start putting up a little post whenever what's on
tap at home changes. I will also make an effort to post when I
brew something as well. To that end, here's the first post on
that subject!</p>
<p>The Porter I brewed came out really nice. When I first kegged it
I was kind of disappointed, but I really should have just
remembered it was REALLY green, and give it a little time.
Within a few weeks it started to mellow and taste really good.
The only thing I would do different is a little more yeast (no
starter and I pulled it off thee yeast early so FG was 1.020) and
it could use a little vanilla.</p>
<p>The Belgian Dubbel is good! It tastes a little better every week,
but it's really tasty as is. Next time I'm going to use some oak
chips, and I'm going to try natural carbonation in the keg
instead of force-carbing.</p>
<p>Schwartbier is easy drinking and smooth. Not much more to say
other than it's pretty refreshing and has some nice malt notes.</p>
<p>The Pale Ale turned out great - this one probably won't last that
long. Next time I might put in a little flaked rye for a touch
more mouthfeel? Maybe not though, as it stands up well as-is.</p>
<p>Fermenting right now is my copy of Arrogant Bastard which I call
"Conceited Jerk". It will be ready to be kegged this weekend,
and will wait patiently in the keggerator for a free tap. Recipe
below!</p>
<div class="highlight"><pre><span></span><code><span class="n">Recipe</span><span class="o">:</span><span class="w"> </span><span class="n">Conceited</span><span class="w"> </span><span class="n">Jerk</span><span class="w"> </span><span class="o">(</span><span class="mi">5</span><span class="n">g</span><span class="o">)</span>
<span class="n">Ingredients</span><span class="o">:</span>
<span class="o">------------</span>
<span class="n">Amt</span><span class="w"> </span><span class="n">Name</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="o">%/</span><span class="n">IBU</span><span class="w"> </span>
<span class="mi">12</span><span class="w"> </span><span class="n">lbs</span><span class="w"> </span><span class="n">Pale</span><span class="w"> </span><span class="n">Malt</span><span class="w"> </span><span class="o">(</span><span class="mi">2</span><span class="w"> </span><span class="n">Row</span><span class="o">)</span><span class="w"> </span><span class="n">US</span><span class="w"> </span><span class="o">(</span><span class="mf">2.0</span><span class="w"> </span><span class="n">SRM</span><span class="o">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="mf">76.2</span><span class="w"> </span><span class="o">%</span><span class="w"> </span>
<span class="mi">1</span><span class="w"> </span><span class="n">lbs</span><span class="w"> </span><span class="mf">4.0</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Roasted</span><span class="w"> </span><span class="n">Barley</span><span class="w"> </span><span class="o">(</span><span class="mf">300.0</span><span class="w"> </span><span class="n">SRM</span><span class="o">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="mf">7.9</span><span class="w"> </span><span class="o">%</span><span class="w"> </span>
<span class="mi">1</span><span class="w"> </span><span class="n">lbs</span><span class="w"> </span><span class="n">Caramunich</span><span class="w"> </span><span class="n">Malt</span><span class="w"> </span><span class="o">(</span><span class="mf">56.0</span><span class="w"> </span><span class="n">SRM</span><span class="o">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="mf">6.3</span><span class="w"> </span><span class="o">%</span><span class="w"> </span>
<span class="mi">1</span><span class="w"> </span><span class="n">lbs</span><span class="w"> </span><span class="n">Oats</span><span class="o">,</span><span class="w"> </span><span class="n">Flaked</span><span class="w"> </span><span class="o">(</span><span class="mf">1.0</span><span class="w"> </span><span class="n">SRM</span><span class="o">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="mf">6.3</span><span class="w"> </span><span class="o">%</span><span class="w"> </span>
<span class="mf">8.0</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Special</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">Malt</span><span class="w"> </span><span class="o">(</span><span class="mf">180.0</span><span class="w"> </span><span class="n">SRM</span><span class="o">)</span><span class="w"> </span><span class="n">Grain</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mf">3.2</span><span class="w"> </span><span class="o">%</span><span class="w"> </span>
<span class="mf">1.50</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Chinook</span><span class="w"> </span><span class="o">[</span><span class="mf">13.00</span><span class="w"> </span><span class="o">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">First</span><span class="w"> </span><span class="n">Wort</span><span class="w"> </span><span class="mf">60.0</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="mf">60.7</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="mf">0.75</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Chinook</span><span class="w"> </span><span class="o">[</span><span class="mf">13.00</span><span class="w"> </span><span class="o">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Boil</span><span class="w"> </span><span class="mf">15.0</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="mf">13.7</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="mf">0.75</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Chinook</span><span class="w"> </span><span class="o">[</span><span class="mf">13.00</span><span class="w"> </span><span class="o">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Steep</span><span class="o">/</span><span class="n">Whirlpool</span><span class="w"> </span><span class="mi">15</span><span class="o">.</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="mf">6.8</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="mf">2.0</span><span class="w"> </span><span class="n">pkg</span><span class="w"> </span><span class="n">Safale</span><span class="w"> </span><span class="n">American</span><span class="w"> </span><span class="o">(</span><span class="n">DCL</span><span class="o">/</span><span class="n">Fermentis</span><span class="w"> </span><span class="err">#</span><span class="n">US</span><span class="o">-</span><span class="mi">05</span><span class="o">)</span><span class="w"> </span><span class="n">Yeast</span><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="o">-</span><span class="w"> </span>
<span class="mf">1.00</span><span class="w"> </span><span class="n">oz</span><span class="w"> </span><span class="n">Chinook</span><span class="w"> </span><span class="o">[</span><span class="mf">13.00</span><span class="w"> </span><span class="o">%]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Dry</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mf">5.0</span><span class="w"> </span><span class="n">Days</span><span class="w"> </span><span class="n">Hop</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="mf">0.0</span><span class="w"> </span><span class="n">IBUs</span><span class="w"> </span>
<span class="n">Mash</span><span class="w"> </span><span class="n">Schedule</span><span class="o">:</span><span class="w"> </span><span class="n">HERMS</span><span class="w"> </span><span class="mi">151</span>
</code></pre></div>Peanut Butter Banana Pancakes2018-01-07T14:31:00-08:002018-01-07T14:31:00-08:00Christopher Aedotag:localconspiracy.com,2018-01-07:/2018/01/pbpancakes.html<p>Over the last year I've been making small tweaks to my <a href="/2011/08/pancakes.html">Aedo Family
Secret Pancake Recipe</a>, and I think I've
finally perfected it. Rather than update the original post I thought
it would be better to make a new one for reference. Ultimately the
modifications were pretty small (less olive …</p><p>Over the last year I've been making small tweaks to my <a href="/2011/08/pancakes.html">Aedo Family
Secret Pancake Recipe</a>, and I think I've
finally perfected it. Rather than update the original post I thought
it would be better to make a new one for reference. Ultimately the
modifications were pretty small (less olive oil, almond milk
substitution, peanut butter and a process change). Adding in the
powdered peanut butter gives it a little more protein and it's just
enough to give it a little bit of peanut butter and banana taste. The
end result though is pretty damn great!</p>
<p>Regarding that process change - the recipe uses 1.5c dry oatmeal.
I've started blending that into a powder before adding any other
ingredients. It makes a nice difference in terms of smoothing the
texture and keeping it consistent from batch to batch.</p>
<blockquote>
<p>UPDATED Aedo Family Secret Pancake Recipe:<br>
1 and a 1/2 cup dry quick-cook oatmeal (blended to flour consistency)<br>
1/2 cup almond milk<br>
1 cup cottage cheese<br>
6 eggs<br>
1/4c PBFit powdered peanut butter<br>
1/2 tsp salt<br>
2 tbsp olive oil<br>
2 bananas </p>
</blockquote>
<ol>
<li>Place oats in blender and process until powdered</li>
<li>Add remaining ingredients </li>
<li>Blend until smooth consistency is reached</li>
<li>Pour 4" cakes on griddle at medium-low heat</li>
</ol>
<p>Nutritional information (<a href="https://myfitnesspal.com">from MyFitnessPal.com</a>):</p>
<p><img alt="PBPancaks Nutrition" src="/images/pbpancakes-nutri.png"></p>Backing up your machines2017-10-11T18:05:00-07:002017-10-11T18:05:00-07:00Christopher Aedotag:localconspiracy.com,2017-10-11:/2017/10/backup-everything.html<p>UPDATE: OSX Catalina introduced new security around disk
access which prevented borg from accessing some directories. I
<a href="/2020/06/backup-update.html">documented a fix for that here</a>.</p>
<p><strong>TL;DR</strong> After CrashPlan discontinued their home plan I found a
good solution using open source software and an inexpensive yet
reliable cloud storage provider. I've got …</p><p>UPDATE: OSX Catalina introduced new security around disk
access which prevented borg from accessing some directories. I
<a href="/2020/06/backup-update.html">documented a fix for that here</a>.</p>
<p><strong>TL;DR</strong> After CrashPlan discontinued their home plan I found a
good solution using open source software and an inexpensive yet
reliable cloud storage provider. I've got automated replicated
backups now using <a href="https://www.borgbackup.org/">Borg</a>,
<a href="https://rclone.org/">Rclone</a> and <a href="https://wasabi.com/">Wasabi cloud
storage</a> - details below.</p>
<p>Several years ago I started using CrashPlan to back up one of my
machines at home. Soon after, I signed up for the family plan and
added more machines, including computers belonging to my siblings
and my wife. The fact that it was essentially "always on" and
doing frequent backups without ever having to think about it was
fantastic. Additionally, the ability to do point-in-time
restores came in handy on several occasions. Since I'm generally
the IT guy for the family, I loved that the user interface was so
easy to use. There were several times when someone in the family
needed to recover all their data and they didn't need my help.</p>
<p>Recently <a href="https://www.crashplan.com/en-us/consumer/nextsteps/">CrashPlan
announced</a>
that they were dropping the consumer customers and focusing on
their enterprise customers. It makes sense I suppose, they were
not making a lot of money off folks like me, and across our
family plan we were using a whole lot of storage on their system.</p>
<p>In looking for a suitable replacement, there were several
features any solution needed to have:</p>
<ul>
<li>Cross-platform support for Linux and Mac</li>
<li>Automated, so there's no need to remember to click "backup"</li>
<li>Point-in-time recovery (or something close) so if you
accidentally delete a file but don't notice until later, it's
still recoverable</li>
<li>Inexpensive</li>
<li>Replicated data store for backup sets, so data exists in more
than one place (i.e. not just backing up to a local USB drive)</li>
<li>Encrypted in case the backup files should fall into the wrong
hands</li>
</ul>
<p>As I looked for services similar to CrashPlan I googled around and
asked my friends. One said he was using <a href="https://www.arqbackup.com/">Arq
Backup</a> and was really happy with
them, but no Linux support meant it was no good for me.
<a href="https://www.carbonite.com/">Carbonite</a> is similar to CrashPlan
but would be expensive for my case since I've got multiple
machines to backup. <a href="https://www.backblaze.com/">Backblaze</a>
offers unlimited backup at a good price ($5/month) but doesn't
support Linux for their backup client, or at least they did not
as of this writing. There were a few other options I looked at
but none of them matched everything I was looking for. That
meant I got to figure out a good approach to replicating what
CrashPlan delivered for me and my family. I think what I worked
out came out pretty close.</p>
<p>I knew there were lots of good options for backing up files on
Linux systems. In fact I've been using
<a href="http://www.nongnu.org/rdiff-backup/">rdiff-backup</a> for at least
ten years. This was usually for saving snapshots of remote
filesystems locally. I had hopes of finding something that would
do a better job of deduplicating backup data though, since I knew
there were going to be some things (like music libraries and
photos) that would potentially be duplicated on multiple
computers.</p>
<p><a href="http://backuppc.sourceforge.net/BackupPCServerStatus.html">BackupPC</a>
was also a really strong contender, but to be honest I had
already gone a ways down the road of testing with my chosen
solution before I was reminded of BackupPC.</p>
<p><img alt="backup diagram" src="/images/backup-diagram.png"></p>
<p>Ultimately I landed on using <a href="https://www.borgbackup.org/">Borg
Backup</a> and couldn't be happier with
my decision. It fit all the criteria I listed above, and has a
pretty healthy <a href="https://github.com/borgbackup/borg/">community of users and
contributors</a>. Borg offers
de-duplication and compression, and works great on PC, Mac and
Linux. Then I use <a href="https://rclone.org/">Rclone</a> to synchronize
the backup repositories from the Borg host up to S3 compatible
storage on <a href="https://wasabi.com">Wasabi</a>. Any S3-compatible
storage will work for this, but I chose Wasabi because their
price can't be beat and they out-perform Amazon's S3. With this
setup I can restore files from the local Borg host or from
Wasabi.</p>
<p>Installing Borg on my machine was as simple as "sudo apt install
borgbackup". For the backup host I have one Linux machine that's
always on, and a 1.5TB USB drive attached to it. This backup host
could be something as lightweight as a Raspberry Pi if you don't
already have a machine available for this. Just make sure all the
client machines are able to reach this server over SSH.</p>
<p>It's important to limit which commands the client machines are
able to execute when they connect to your backup server. The
easiest way to do this is to set this in the .ssh/authorized_keys
file by prepending each host with a "command" setting such as:</p>
<div class="highlight"><pre><span></span><code><span class="n">command</span><span class="o">=</span><span class="ss">"cd /mnt/backup/mycomputer; borg serve --restrict-to-path</span>
<span class="ss">/mnt/backup/mycomputer/"</span><span class="w"> </span><span class="n">ssh</span><span class="o">-</span><span class="n">rsa</span><span class="w"> </span><span class="n">AAAAB3NzaC1yc2EAA</span><span class="o">[</span><span class="n">...</span><span class="o">]</span><span class="w"> </span><span class="n">me</span><span class="nv">@mycomputer</span>
</code></pre></div>
<p>On the backup host, you can initialize a new backup repository
with:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>borg<span class="w"> </span>init<span class="w"> </span>/mnt/backup/repo1
</code></pre></div>
<p>Depending on what you're backing up, you might choose to make
multiple repositories per machine, or possibly one big repository
for all your machines. Since Borg de-duplicates, if you have
identical data on many computers it might make sense to send
backups from all those machines to the same repository.</p>
<p>Installing Borg on the Linux client machines was very
straightforward. On OSX I needed to install XCode and Homebrew
first. I followed <a href="http://osxdaily.com/2014/02/12/install-command-line-tools-mac-os-x/">this
how-to</a>
to install the command line tools, and then used "homebrew install
borgbackup". On the Apple machines I used a LaunchAgent to
kick off the backup runs on schedule each night. That requires
a plist file and then running "launchctl load <file>" to load
the service. ALSO, use pmset to make sure the computer powers up
for the backup whenever you're doing it. For instance "pmset
repeat wakeorpoweron MTWRFSU 1:40:00"</p>
<p>Each of the machines have a backup.sh script (contents below)
that is kicked off by cron at regular intervals. It will only
make one backup set per day, so it doesn't hurt to try a few
times in the same day. The laptops are set to try every two
hours because there's no guarantee they will be on at a certain
time, but it's very likely they'll be on during ONE of those
times. This could be improved by writing a daemon that's always
running and triggers a backup attempt any time the laptop wakes
up. For now though I'm happy with the way things are working.</p>
<p>I could skip the cron job and provide a relatively easy way for
each user to trigger a backup using
<a href="https://github.com/borgbackup/borgweb">BorgWeb</a> but I really
don't want anyone to have to remember to back things up. In my
personal experience I tend to forget to click that backup button
until I'm in dire need of a restoration (at which point it's way
too late!)</p>
<p>The backup script I'm using came from the <a href="https://borgbackup.readthedocs.io/en/stable/quickstart.html">Borg docs
quickstart</a>,
plus I added a little check at the top to see if borg is already
running, so the script will exit if the previous backup run is
still in progress. This script makes a new backup set and labels
it with the hostname and current date. It then prunes old backup
sets with an easy to understand retention schedule.</p>
<p>backup.sh:</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/sh</span>
<span class="nv">REPOSITORY</span><span class="o">=</span>borg@borgserver:/mnt/backup/repo1
<span class="nv">borgpid</span><span class="o">=</span><span class="k">$(</span>ps<span class="w"> </span>aux<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-v<span class="w"> </span>grep<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>borg<span class="w"> </span><span class="p">|</span><span class="w"> </span>wc<span class="w"> </span>-l<span class="k">)</span>
<span class="c1">#Bail if borg is already running, maybe previous run didn't finish</span>
<span class="k">if</span><span class="w"> </span><span class="o">[</span><span class="w"> </span><span class="nv">$borgpid</span><span class="w"> </span>-gt<span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="o">]</span><span class="p">;</span><span class="w"> </span><span class="k">then</span>
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Backup already running"</span><span class="w"> </span>
<span class="w"> </span><span class="nb">exit</span>
<span class="k">fi</span>
<span class="c1"># Setting this, so you won't be asked for your repository passphrase:</span>
<span class="nb">export</span><span class="w"> </span><span class="nv">BORG_PASSPHRASE</span><span class="o">=</span><span class="s1">'This is not the real passphrase'</span>
<span class="c1"># Backup all of /home/doc except a few</span>
<span class="c1"># excluded directories</span>
borg<span class="w"> </span>create<span class="w"> </span>-v<span class="w"> </span>--stats<span class="w"> </span><span class="se">\</span>
<span class="w"> </span><span class="nv">$REPOSITORY</span>::<span class="s1">'{hostname}-{now:%Y-%m-%d}'</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>/home/doc<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--exclude<span class="w"> </span><span class="s1">'/home/doc/.cache'</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--exclude<span class="w"> </span><span class="s1">'/home/doc/.local'</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--exclude<span class="w"> </span><span class="s1">'/home/doc/.mozilla'</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--exclude<span class="w"> </span><span class="s1">'/home/doc/.config/google*'</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--exclude<span class="w"> </span><span class="s1">'/home/doc/.minikube'</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--exclude<span class="w"> </span><span class="s1">'/home/doc/Downloads'</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--exclude<span class="w"> </span><span class="s1">'/home/doc/Videos'</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--exclude<span class="w"> </span><span class="s1">'/home/doc/Music'</span><span class="w"> </span>
<span class="c1"># Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly</span>
<span class="c1"># archives of THIS machine. The '{hostname}-' prefix is very important to</span>
<span class="c1"># limit prune's operation to this machine's archives and not apply to</span>
<span class="c1"># other machine's archives also.</span>
<span class="nb">echo</span><span class="w"> </span><span class="s2">"Pruning expired archives"</span>
borg<span class="w"> </span>prune<span class="w"> </span>-v<span class="w"> </span>--list<span class="w"> </span><span class="nv">$REPOSITORY</span><span class="w"> </span>--prefix<span class="w"> </span><span class="s1">'{hostname}-'</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--keep-daily<span class="o">=</span><span class="m">7</span><span class="w"> </span>--keep-weekly<span class="o">=</span><span class="m">4</span><span class="w"> </span>--keep-monthly<span class="o">=</span><span class="m">6</span>
</code></pre></div>
<p>The output from a backup run looks like this:</p>
<div class="highlight"><pre><span></span><code><span class="nb">------------------------------------------------------------------------------</span>
<span class="c">Archive name: x250</span><span class="nb">-</span><span class="c">2017</span><span class="nb">-</span><span class="c">10</span><span class="nb">-</span><span class="c">05</span>
<span class="c">Archive fingerprint: xxxxxxxxxxxxxxxxxxx</span>
<span class="c">Time (start): Thu</span><span class="nt">,</span><span class="c"> 2017</span><span class="nb">-</span><span class="c">10</span><span class="nb">-</span><span class="c">05 03:09:03</span>
<span class="c">Time (end): Thu</span><span class="nt">,</span><span class="c"> 2017</span><span class="nb">-</span><span class="c">10</span><span class="nb">-</span><span class="c">05 03:12:11</span>
<span class="c">Duration: 3 minutes 8</span><span class="nt">.</span><span class="c">12 seconds</span>
<span class="c">Number of files: 171150</span>
<span class="nb">------------------------------------------------------------------------------</span>
<span class="c"> Original size Compressed size Deduplicated size</span>
<span class="c">This archive: 27</span><span class="nt">.</span><span class="c">75 GB 27</span><span class="nt">.</span><span class="c">76 GB 323</span><span class="nt">.</span><span class="c">76 MB</span>
<span class="c">All archives: 3</span><span class="nt">.</span><span class="c">08 TB 3</span><span class="nt">.</span><span class="c">08 TB 262</span><span class="nt">.</span><span class="c">76 GB</span>
<span class="c"> Unique chunks Total chunks</span>
<span class="c">Chunk index: 1682989 24007828</span>
<span class="nb">------------------------------------------------------------------------------</span>
<span class="k">[</span><span class="nt">...</span><span class="k">]</span>
<span class="c">Keeping archive: x250</span><span class="nb">-</span><span class="c">2017</span><span class="nb">-</span><span class="c">09</span><span class="nb">-</span><span class="c">17 Sun</span><span class="nt">,</span><span class="c"> 2017</span><span class="nb">-</span><span class="c">09</span><span class="nb">-</span><span class="c">17 03:09:02</span>
<span class="c">Pruning archive: x250</span><span class="nb">-</span><span class="c">2017</span><span class="nb">-</span><span class="c">09</span><span class="nb">-</span><span class="c">28 Thu</span><span class="nt">,</span><span class="c"> 2017</span><span class="nb">-</span><span class="c">09</span><span class="nb">-</span><span class="c">28 03:09:02</span>
</code></pre></div>
<p>Once I had all the machines backing up to the host, I followed
<a href="https://rclone.org/install/">the instructions for installing a precompiled rclone
binary</a>, and set it up to access my
<a href="https://wasabi.com">wasabi</a> account. You can find <a href="https://rclone.org/s3/#wasabi">details on
using rclone with Wasabi here</a>.</p>
<p>This script runs each night to synchronize any changes to the
backup sets. It checks to make sure the directory it is
attempting to sync is actually using a reasonable amount of space
and will exit entirely if not. This should prevent the script
from accidentally wiping out a remote storage bucket if it
accdentally tries to synchronize an empty directory. It also
skips that test for one really small backup repository. Finally,
it emails a summary report of the backup activity:</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="c1">#set -e</span>
<span class="nv">repos</span><span class="o">=(</span><span class="w"> </span>repo1<span class="w"> </span>repo2<span class="w"> </span>repo3<span class="w"> </span>webserver80<span class="w"> </span><span class="o">)</span>
<span class="nb">export</span><span class="w"> </span><span class="nv">BORG_PASSPHRASE</span><span class="o">=</span><span class="s1">'This is not the real passphrase'</span>
<span class="c1">#Bail if rclone is already running, maybe previous run didn't finish</span>
<span class="k">if</span><span class="w"> </span>pidof<span class="w"> </span>-x<span class="w"> </span>rclone<span class="w"> </span>>/dev/null<span class="p">;</span><span class="w"> </span><span class="k">then</span>
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Process already running"</span>
<span class="w"> </span><span class="nb">exit</span>
<span class="k">fi</span>
<span class="k">for</span><span class="w"> </span>i<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="s2">"</span><span class="si">${</span><span class="nv">repos</span><span class="p">[@]</span><span class="si">}</span><span class="s2">"</span>
<span class="k">do</span>
<span class="w"> </span><span class="nv">REPOSITORY</span><span class="o">=</span>borg@borgserver:/mnt/backup/<span class="nv">$i</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span>borg<span class="w"> </span>check<span class="w"> </span><span class="nv">$REPOSITORY</span><span class="w"> </span><span class="p">&</span>><span class="w"> </span>/dev/null
<span class="w"> </span><span class="k">then</span>
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Borg check passed for </span><span class="nv">$REPOSITORY</span><span class="s2">"</span><span class="w"> </span>>><span class="w"> </span>/tmp/wasabi-mail.log
<span class="w"> </span>/usr/bin/rclone<span class="w"> </span>-v<span class="w"> </span>sync<span class="w"> </span>/mnt/backup/<span class="nv">$i</span><span class="w"> </span>wasabi:<span class="nv">$i</span><span class="w"> </span>><span class="w"> </span>/tmp/wasabi-sync.log<span class="w"> </span><span class="m">2</span>><span class="p">&</span><span class="m">1</span>
<span class="w"> </span>cat<span class="w"> </span>/tmp/wasabi-sync.log<span class="w"> </span>>><span class="w"> </span>/home/borg/wasabi-sync.log
<span class="w"> </span>/usr/bin/borg<span class="w"> </span>list<span class="w"> </span><span class="nv">$REPOSITORY</span><span class="w"> </span>><span class="w"> </span>/tmp/borg-list<span class="w"> </span><span class="m">2</span>><span class="p">&</span><span class="m">1</span>
<span class="w"> </span>tail<span class="w"> </span>-n<span class="w"> </span><span class="m">5</span><span class="w"> </span>/tmp/borg-list<span class="w"> </span>>><span class="w"> </span>/tmp/wasabi-mail.log
<span class="w"> </span>head<span class="w"> </span>-n<span class="w"> </span><span class="m">1</span><span class="w"> </span>/tmp/wasabi-sync.log<span class="w"> </span>>><span class="w"> </span>/tmp/wasabi-mail.log
<span class="w"> </span>tail<span class="w"> </span>-n<span class="w"> </span><span class="m">6</span><span class="w"> </span>/tmp/wasabi-sync.log<span class="w"> </span>>><span class="w"> </span>/tmp/wasabi-mail.log
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Problems found with consistency check on </span><span class="nv">$REPOSITORY</span><span class="s2">"</span><span class="w"> </span>>><span class="w"> </span>/tmp/wasabi-mail.log
<span class="w"> </span><span class="k">fi</span>
<span class="k">done</span>
cat<span class="w"> </span>/tmp/wasabi-mail.log<span class="w"> </span><span class="p">|</span><span class="w"> </span>mail<span class="w"> </span>-s<span class="w"> </span><span class="s2">"Backup report"</span><span class="w"> </span>doc@aedo.net
rm<span class="w"> </span>-f<span class="w"> </span>/tmp/wasabi-mail.*
</code></pre></div>
<p>The first synchronization of the backup set up to
<a href="https://wasabi.com">Wasabi</a> with rclone took several days, but
that was because it was around 400gb of new data and my outbound
connection is not super fast. Since then the daily delta is very
small and completes in just a few minutes.</p>
<p>Restoring files is NOT as easy as it was with CrashPlan, but it
is relatively straightforward. The fastest approach is to
restore from the backup stored on the Borg backup server.
Here are some example commands used to restore.</p>
<div class="highlight"><pre><span></span><code><span class="n">#List</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="k">backup</span><span class="w"> </span><span class="k">sets</span><span class="w"> </span><span class="k">are</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">repo</span>
<span class="err">$</span><span class="w"> </span><span class="n">borg</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="n">borg</span><span class="nv">@borgserver</span><span class="err">:</span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span><span class="k">backup</span><span class="o">/</span><span class="n">repo1</span>
<span class="nl">Remote</span><span class="p">:</span><span class="w"> </span><span class="n">Authenticated</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="k">partial</span><span class="w"> </span><span class="n">success</span><span class="p">.</span>
<span class="n">Enter</span><span class="w"> </span><span class="n">passphrase</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="k">key</span><span class="w"> </span><span class="nl">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">borg</span><span class="nv">@borgserver</span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span><span class="k">backup</span><span class="o">/</span><span class="nl">repo1</span><span class="p">:</span><span class="w"> </span>
<span class="n">x250</span><span class="o">-</span><span class="mi">2017</span><span class="o">-</span><span class="mi">09</span><span class="o">-</span><span class="mi">17</span><span class="w"> </span><span class="n">Sun</span><span class="p">,</span><span class="w"> </span><span class="mi">2017</span><span class="o">-</span><span class="mi">09</span><span class="o">-</span><span class="mi">17</span><span class="w"> </span><span class="mi">03</span><span class="err">:</span><span class="mi">09</span><span class="err">:</span><span class="mi">02</span>
<span class="n">#List</span><span class="w"> </span><span class="n">contents</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="k">backup</span><span class="w"> </span><span class="k">set</span>
<span class="err">$</span><span class="w"> </span><span class="n">borg</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="n">borg</span><span class="nv">@borgserver</span><span class="err">:</span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span><span class="k">backup</span><span class="o">/</span><span class="nl">repo1</span><span class="p">:</span><span class="err">:</span><span class="n">x250</span><span class="o">-</span><span class="mi">2017</span><span class="o">-</span><span class="mi">09</span><span class="o">-</span><span class="mi">17</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">less</span>
<span class="n">#Restore</span><span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="k">file</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">repo</span>
<span class="err">$</span><span class="w"> </span><span class="n">borg</span><span class="w"> </span><span class="k">extract</span><span class="w"> </span><span class="n">borg</span><span class="nv">@borgserver</span><span class="err">:</span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span><span class="k">backup</span><span class="o">/</span><span class="nl">repo1</span><span class="p">:</span><span class="err">:</span><span class="n">x250</span><span class="o">-</span><span class="mi">2017</span><span class="o">-</span><span class="mi">09</span><span class="o">-</span><span class="mi">17</span><span class="w"> </span><span class="n">home</span><span class="o">/</span><span class="n">doc</span><span class="o">/</span><span class="n">somefile</span><span class="p">.</span><span class="n">jpg</span>
<span class="n">#Restore</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">whole</span><span class="w"> </span><span class="n">directory</span>
<span class="err">$</span><span class="w"> </span><span class="n">borg</span><span class="w"> </span><span class="k">extract</span><span class="w"> </span><span class="n">borg</span><span class="nv">@borgserver</span><span class="err">:</span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span><span class="k">backup</span><span class="o">/</span><span class="nl">repo1</span><span class="p">:</span><span class="err">:</span><span class="n">x250</span><span class="o">-</span><span class="mi">2017</span><span class="o">-</span><span class="mi">09</span><span class="o">-</span><span class="mi">17</span><span class="w"> </span><span class="n">home</span><span class="o">/</span><span class="n">doc</span>
</code></pre></div>
<p>If something happens to the local Borg server or the USB drive
holding all the backup repositories, I can also easily restore
directly from <a href="https://wasabi.com">Wasabi</a>. The machine needs to have rclone
installed, and then using <a href="https://rclone.org/commands/rclone_mount/">rclone
mount</a> I can mount the remote
storage bucket as though it were a local filesystem.</p>
<div class="highlight"><pre><span></span><code>#Mount the S3 store and run in the background
$ rclone mount wasabi:repo1 /mnt/repo1 &
#List archive contents
$ borg list /mnt/repo1
#Extract a file
$ borg extract /mnt/repo1::x250-2017-09-17 home/doc/somefile.jpg
</code></pre></div>
<p>Now that I've been using this backup approach for a few weeks I
can say I'm really happy with it. Setting everything up and
getting it running was a lot more complicated than just
installing CrashPlan of course, but that's the difference between
rolling your own solution and using a service. I will have to
watch this more closely to be sure backups continue to run and
the data gets properly synchronized up to <a href="https://wasabi.com">Wasabi</a>. But in
general replacing CrashPlan with something offering comparable backup coverage
at a really reasonable price turned out to be a little easier than I expected.
If you see room for improvement please let me know!</p>Speaking, streaming and brewing2017-09-08T16:05:00-07:002017-09-08T16:05:00-07:00Christopher Aedotag:localconspiracy.com,2017-09-08:/2017/09/happenings-sept2017.html<p><img alt="Science Hack Day PDX" src="/images/shd2017banner.png"></p>
<p>Tomorrow and Sunday PSU is hosting <a href="http://portland.sciencehackday.org/">Science Hack Day
PDX</a>. This free to attend
avent is going to be a blast, I'm really looking forward to it.
I will be there checking out what people are working on, and
<a href="https://www.twitch.tv/ibmcode">interviewing them on Twitch</a>. We
will likely end up editing together …</p><p><img alt="Science Hack Day PDX" src="/images/shd2017banner.png"></p>
<p>Tomorrow and Sunday PSU is hosting <a href="http://portland.sciencehackday.org/">Science Hack Day
PDX</a>. This free to attend
avent is going to be a blast, I'm really looking forward to it.
I will be there checking out what people are working on, and
<a href="https://www.twitch.tv/ibmcode">interviewing them on Twitch</a>. We
will likely end up editing together the highlights for later use
on
<a href="https://developer.ibm.com/code/">https://developer.ibm.com/code/</a>.
I expect there will be a bunch of interesting projects in
progress so should be super fun.</p>
<p><strong>UPDATE:</strong> All the interviews went really well and were super fun,
the whole list <a href="https://www.youtube.com/watch?v=Q5bxA3wttQs&index=1&list=PLpryjkO3KF2zD1tnTNvr9deOe45UGHGG5">can be found on YouTube
here</a>.
I have to admit I had such a good time doing this I am going to
try to make a habit of it!</p>
<p>On Monday 9/11 at 9am PDT <a href="https://www.twitch.tv/events/89852">I will brew beer and talk brewing on
Twitch</a>. I'm still a little
bit surprised about this one but hopefully it goes well and I
have an excuse to do it again one day. Getting paid to brew has
always been kind of a dream - maybe I'm not going pro but for one
day, it feels pretty close! I decided to brew a Cascadian Dark
Ale for the event; I put <a href="/images/cda.pdf">the recipe</a> up if you
want to see what I'm making.</p>
<p><strong>UPDATE:</strong> the session went great, and <a href="https://youtu.be/Xabt-klFv90?t=5m45s">can be found on YouTube
here</a></p>
<p><img alt="SeaGL Logo" src="/images/seagl-logo.svg"></p>
<p>Finally, I'm super excited to be <a href="https://osem.seagl.org/conferences/seagl2017/program/proposals/278">speaking at SeaGL
2017</a>
in a little more than a month! I also <a href="http://seagl.org/news/2017/09/08/QA-caedo.html">answered a little
Q&A</a> about the
talk. It should be a lot of fun to talk about my brewing system,
and how using a Raspberry Pi has changed how I make beer (and in
my opinion gone a long way to improve it).</p>
<p>Hopefully I'll see you at PSU, SeaGL, or online for one of the
Twitch streams!</p>Brewing Beer for IBM2017-09-05T15:56:00-07:002017-09-05T15:56:00-07:00Christopher Aedotag:localconspiracy.com,2017-09-05:/2017/09/brewing-for-ibm.html<p><img alt="TwitchTV logo" src="/images/new-twitchtv-logo.png"></p>
<p>On Monday, September 11th at 9am PDT I'm going to brew beer <a href="https://www.twitch.tv/events/89852">live
on twitchTV</a>! I'm as
surprised as anyone that I get to do this during working hours
and as part of my job. Really looking forward to this :)</p>
<p>My employer (IBM) is trying to draw attention to some …</p><p><img alt="TwitchTV logo" src="/images/new-twitchtv-logo.png"></p>
<p>On Monday, September 11th at 9am PDT I'm going to brew beer <a href="https://www.twitch.tv/events/89852">live
on twitchTV</a>! I'm as
surprised as anyone that I get to do this during working hours
and as part of my job. Really looking forward to this :)</p>
<p>My employer (IBM) is trying to draw attention to some
unconventional things us IBMers do with open source software and
I think this definitely counts. I've talked about <a href="/2016/12/electric-brewery.html">my electric
brewery</a> here before. This time
I'm going to demonstrate it live, talk a bit about the design,
and demonstrate in a generic way how you can use GPIO pins on a
Raspberry Pi to switch relays on an off.</p>
<p>Hopefully you can <a href="https://www.twitch.tv/events/89852">join me</a>
on 9/11, 9am PDT!</p>Making Beer with Linux, Python and a Raspberry Pi2017-07-13T12:00:00-07:002017-07-13T12:00:00-07:00Christopher Aedotag:localconspiracy.com,2017-07-13:/2017/07/openwest-make-beer.html<p><img alt="taps" src="/images/taps.png"></p>
<p>I was lucky to have a talk about brewing beer with
Linux, Python and a Respberry Pi chosen for <a href="http://openwest.org">OpenWest
2017</a>. As part of that talk I wanted
to put up a quick post with the slides from the talk and
links to some of the resources I used. It's …</p><p><img alt="taps" src="/images/taps.png"></p>
<p>I was lucky to have a talk about brewing beer with
Linux, Python and a Respberry Pi chosen for <a href="http://openwest.org">OpenWest
2017</a>. As part of that talk I wanted
to put up a quick post with the slides from the talk and
links to some of the resources I used. It's also worth
taking a look at a previous post about <a href="/2016/12/electric-brewery.html">my electric
brewery</a> as I include some
details and links there as well.</p>
<p>In preparation for the talk <a href="https://opensource.com/article/17/7/brewing-beer-python-and-raspberry-pi">I wrote about the system for
opensource.com</a>.
That turned out to be really popular, and was then
<a href="http://hackaday.com/2017/07/09/making-a-small-scale-brewery-with-a-raspberry-pi-and-python/">mentioned on
Hackaday</a>
and
<a href="https://www.raspberrypi.org/blog/homebrew-beer-brewing-pi/">raspberrypi.org</a>
as well. It's probably worth reminding folks to follow me
on twitter <a href="https://twitter.com/docaedo/">@docaedo</a> if you
want any updates on the next things I'll be doing with the
system. It's also a pretty convenient way to reach me if
you have questions :)</p>
<p>Resources:</p>
<ul>
<li><a href="/images/beer-linux-pi.pdf">Slides</a></li>
<li><a href="https://brewtronix.com">Hosehead</a></li>
<li><a href="http://www.theelectricbrewery.com/">The Electric Brewery</a></li>
<li><a href="http://www.instructables.com/id/Electric-Brewery-Control-Panel-on-the-Cheap/">Control Panel on the Cheap</a></li>
<li><a href="https://github.com/Manuel83/craftbeerpi/">CraftBeerPi Github</a></li>
<li><a href="http://craftbeerpi.com">CraftBeerPi</a></li>
</ul>Delivering a keynote at OSCON 20172017-05-27T14:30:00-07:002017-05-27T14:30:00-07:00Christopher Aedotag:localconspiracy.com,2017-05-27:/2017/05/oscon-2017-keynote.html<p>Working as a developer advocacy program director for IBM,
improving how the world of developers perceive our company is my
top priority. One of the ways I believe we can make a huge impact
is by using our time in front of developers wisely. That means
no product pitches at …</p><p>Working as a developer advocacy program director for IBM,
improving how the world of developers perceive our company is my
top priority. One of the ways I believe we can make a huge impact
is by using our time in front of developers wisely. That means
no product pitches at tech conferences; out of respect for the
time of attendees, we need to talk about things that matter.</p>
<p><img alt="on stage at OSCON" src="/images/on-stage-oscon3.png"></p>
<p>At this years <a href="https://conferences.oreilly.com/oscon-tx">OSCON 2017 in Austin,
TX</a> I had a pretty
great opportunity to give a talk and do something consistent with
these ideals. I got to deliver <a href="https://www.youtube.com/watch?v=uG2_6rjL_KI">a 10 minute
keynote</a> on the
importance of choosing open platforms when building open source
software (#OpenInfra).</p>
<p>Though I'd attended several OSCON's in the past, this was my
first time taking the big stage. The whole experience was a ton
of fun, and I hope I have a chance to do something like that
again. Everyone involved with the planning and production was
super professional and buttoned up. Getting ready backstage felt
kind of like being behind the scenes at a really polished rock
concert. I am not sure the picture I took (below) captures it
well enough but there was a lot going on, but everyone was so
calm and relaxed you would never have known it.</p>
<p><img alt="OSCON backstage" src="/images/oscon-backstage.jpg"></p>
<p>The slides and abstract of the talk are <a href="https://conferences.oreilly.com/oscon/oscon-tx/public/schedule/detail/61296">available
here</a>.
I used baroque paintings so it would be easy to keep the slides
consistent and also not sweat any copyright violations. Looking
through all that art was a lot of fun. There were a great many
really weird paintings that made me wonder who the hell stood
still long enough for the artist to capture that! One of my
slides used this amazing painting of two kids posing for their
portrait, but the boy has a kitten over on arm and is holding an
eel in his other hand. What the hell?</p>
<p><img alt="gitlab, gitea and gogs" src="/images/choose-gitlab.png"></p>
<p>The talk (about open infrastructure) was meant to draw attention
to the underlying infrastructure we use when building open
software collaboratively. Not just the "I" in IaaS (compute,
storage and networking), but the other tools, platforms and
technologies we rely on. Things like repository management
platforms, asynchronous and synchronous communications, testing
systems, etc. These are all things we tend to forget about, or
at least not think about them as core parts of open source
projects. There's a lot of risk though to not choosing
carefully. The heart of the talk was about making platform and
technology choices based on three open principles: Transparency,
Interoperability and Influence.</p>
<p><img alt="open principles" src="/images/open-principles.png"></p>
<p>Transparency: does the platform or project you are using operate
in a transparent manner? Do you have a clear sense of what
they're planning, and if there's a company behind the effort how
healthy is it? <a href="https://www.gitlab.com">Gitlab</a> is a great
example of how to do this right. They're a privately run
startup, but they operate completely in the open.</p>
<p>Interoperability: if you choose a platform, what's the risk of
being locked in? Can you take your data elsewhere if you decide
to make a different choice? Are they based on (and even
contributing to) open standards? I used the example of IRC in my
talk, as it's hard to choose a more open and interoperable
standard for team communications.</p>
<p>Influence: can we (open source community, generally non-paying
users) influence them? Do they have an open and easy way to
report bugs or request features? Do they accept code
contributions from outsiders? How well do they listen to their
users, especially the non-paying ones? <a href="https://travis-ci.com/">Travis
CI</a> is a really great example here - they
go out of their way to work with the open source communities
using their testing infrastructure to make sure they service they
are offering for free is working well for them.</p>
<p>The feedback I got in person at the conference was amazingly
positive. It was a message that resonated with a lot of
attendees. A bunch of people also took pictures and quoted the
talk in tweets, which was really gratifying.</p>
<p>I thoroughly enjoyed the experience, and I'm glad a lot of folks
were on the same page as me on this topic. Hopefully I'll get to
talk about something equally important to the community next year
when OSCON returns to Portland!</p>Next Few Talks in 20172017-04-21T18:38:00-07:002017-04-21T18:38:00-07:00Christopher Aedotag:localconspiracy.com,2017-04-21:/2017/04/nextfewtalksin2017.html<p><img alt="image" src="/images/pdx-aus-ewr.png" title="map of united states showing route from portland to new york to dallas to austin to san francisco then back to portland"></p>
<p>I'm sitting here on a plane headed home, finally, after what has been
a pretty long week of travel for work. All of it has been good stuff,
and even included the opportunity to share the stage with IBMs Chief
Digital Officer Bob Lord. During his quarterly "all hands" town …</p><p><img alt="image" src="/images/pdx-aus-ewr.png" title="map of united states showing route from portland to new york to dallas to austin to san francisco then back to portland"></p>
<p>I'm sitting here on a plane headed home, finally, after what has been
a pretty long week of travel for work. All of it has been good stuff,
and even included the opportunity to share the stage with IBMs Chief
Digital Officer Bob Lord. During his quarterly "all hands" town hall
meeing, I was invited up to talk to him about what we are doing with
respect to developer advocacy at IBM. It's pretty gratifying to be
part of such a massive company but realize I still have a voice and am
actually empowered to make changes.</p>
<p><img alt="image" src="/images/townhall.png" title="christopher aedo sitting with bob lord during an IBM town hall"></p>
<p>Anyway, on this plane right now it has occured to me that I do a pretty
terrible job of mentioning when I'm going to be speaking somewhere, or
doing something else really interesting relating to my job. So I'm
going to do a better job at that starting now!</p>
<p>The first thing to share is that I get to do <a href="https://conferences.oreilly.com/oscon/oscon-tx/public/schedule/detail/61296">a keynote at OSCON
2017</a>!
True, it's a sponsored keynote, but it's kind of a neat deal. IBM has
been sponsoring <a href="https://conferences.oreilly.com/oscon/">OSCON</a> for a
long time. As part of that sponsorship they get a 10 minute
"sponsored" keynote slot. Previous talks have been met with mixed
reactions, largely because they tend to be very product focused.
As part of our work to improve the way the world of developers sees
IBM, I have been given the opportunity to take that keynote slot this
year. I'm super happy to have the chance, and I'm also really excited
to talk about something that's got nothing to do with any IBM
products. I think folks will enjoy it, and I really hope I get the
chance to do more talks like it. I'm going to post something soon on
the same topic I'll be speaking about, but here's the abstract if you
didn't feel like following the link above:</p>
<blockquote>
<p>Why choose open infrastructure?
Open Source isn’t winning, it’s won. In the last decade, we’ve seen an
incredible explosion in open source software. Massive projects have
been developed in the open, on open operating systems, using open
languages and compilers. But, Christopher Aedo asks, was all the
infrastructure open as well?</p>
<p>Source code management, CI pipelines, chat services, and IaaS all have
open alternatives, but the majority of projects are developed on
closed and proprietary infrastructure. Christopher explains how to
make open choices with greater community impact.</p>
</blockquote>
<p>I also recently had a talk submission accepted at the <a href="https://www.openwest.org/">OpenWest 2017
Conference</a>. The topic of my talk is
"Brewing Beer with Linux, Python and a RaspberryPi". It's a topic that
is near and dear to my heart, and I'm really looking forward to taking
the stage and sharing the cool stuff I've been using to make beer
lately.</p>
<p>Hope to see you at OSCON and OpenWest!</p>10 Bills You Should Read2017-03-06T18:45:00-08:002017-03-06T18:45:00-08:00Christopher Aedotag:localconspiracy.com,2017-03-06:/2017/03/recent-interesting-bills.html<p>I try not to post too much political stuff here unless I think it's
something useful and interesting. In this case, I've seen this list
of bills proposed in the US house of representatives several places.
All the times I've seen it however, it's just text (and often on
twitter …</p><p>I try not to post too much political stuff here unless I think it's
something useful and interesting. In this case, I've seen this list
of bills proposed in the US house of representatives several places.
All the times I've seen it however, it's just text (and often on
twitter it's an IMAGE of text). No links, no more information, just
basically "here are some numbers and scary titles of bills!"</p>
<p>For my own information I wanted to find the actual bills and their
titles, initially expecting the titles to be less scary, or the
numbers not actually matching up. I guess I expect "fake news"
everywhere I look these days. As it turned out, the numbers and
titles matched up. The content is pretty scary in my opinion, and
represents a push to create an America that is not consistent with the
constitution we were founded upon. At least these efforts are in the
public and are being recorded for the sake of history. What follows
is the list I came across plus links to the actual bill on
congress.gov. If for some reason that content is later removed I will
update these links to point to their archived versions at <a href="https://web.archive.org">the internet
archive</a>.</p>
<ul>
<li><a href="https://www.congress.gov/bill/115th-congress/house-bill/861/text">HR 861 - Termination of the Environmental Protection Agency</a></li>
<li><a href="https://www.congress.gov/bill/115th-congress/house-bill/610/text">HR 610 - Choices In Education Act</a> (vouchers for public education)</li>
<li><a href="https://www.congress.gov/bill/115th-congress/house-bill/899/text">HR 899 - Termination of the Department of Education</a></li>
<li><a href="https://www.congress.gov/bill/115th-congress/house-joint-resolution/69/text">HJR 69 - Repeal department of interior rule protecting wildlife</a></li>
<li><a href="https://www.congress.gov/bill/115th-congress/house-bill/370/text">HR 370 - Repeal the Patient Protection and Affordable Care Act</a></li>
<li><a href="https://www.congress.gov/bill/115th-congress/house-bill/354/text">HR 354 - Discontinue Funding for Planned Parenthood</a></li>
<li><a href="https://www.congress.gov/bill/115th-congress/house-bill/785/text">HR 785 - National Right-to-Work Act</a> (ends or disables unions)</li>
<li><a href="https://www.congress.gov/bill/115th-congress/house-bill/83/text">HR 83 - Prohibit the receipt of Federal financial assistance by sanctuary cities</a></li>
<li><a href="https://www.congress.gov/bill/115th-congress/house-bill/147/text">HR 147 - Prenatal Nondiscrimination Act</a>
(bans abortions based on sex - i.e. if you wanted a boy but are
pregnant with a girl instead, an abortion on that basis alone would be
illegal.)</li>
<li><a href="https://www.congress.gov/bill/115th-congress/house-bill/808/text">HR 808 - Sanctions Against Iran</a></li>
</ul>Live on Gitlab2017-02-02T18:23:00-08:002017-02-02T18:23:00-08:00Christopher Aedotag:localconspiracy.com,2017-02-02:/2017/02/live-on-gitlab.html<p>Last year when <a href="https://about.gitlab.com/">gitlab</a> announced they
would offer free site hosting with custom domains (similar to github
pages) I decided it was about time I looked into moving this blog.
Until today, it had been hosted on a VM running on either Google
Compute, OVH, Vexxhost or AWS. I think …</p><p>Last year when <a href="https://about.gitlab.com/">gitlab</a> announced they
would offer free site hosting with custom domains (similar to github
pages) I decided it was about time I looked into moving this blog.
Until today, it had been hosted on a VM running on either Google
Compute, OVH, Vexxhost or AWS. I think that covers all the places
I've had random VMs running, but there are probably a few others mixed
in there. I've never been too shy about moving to a new provider to
give their services a try, and switching this blog to a site that gets
built and deployed upon commit seemed like a pretty good idea.</p>
<p>It was super easy to do, and <a href="https://docs.gitlab.com/ee/user/project/pages/index.html">the doc on their
site</a> covered
everything you would need to know. I hadn't been keeping <a href="https://gitlab.com/aedocw/localconspiracy">this site
in a git repo</a> (I know,
shame on me!) so having one more reason to do that was also a big
plus.</p>
<p>Making this happen didn't require anything other than following along
with their instructions, and looking at <a href="https://gitlab.com/pages/pelican">the example for running CI for
a Pelican site</a>.</p>
<p>I'm really happy to have this site hosted on Gitlab, and I have a
feeling this is the last time I'll move it - looking forward to having
the site here for as long as I feel like keeping up with it!</p>A Typical Brewday2016-12-30T12:00:00-08:002016-12-30T12:00:00-08:00Christopher Aedotag:localconspiracy.com,2016-12-30:/2016/12/typical-brewday.html<p>While writing about <a href="/2016/12/electric-brewery.html">my electric brewing
system</a> I thought it would be helpful
to outline what a typical brew day looks like with that setup. Since
that post was already getting too long I decided to put this in it's
own relatively small post.</p>
<p>The FIRST step is to figure …</p><p>While writing about <a href="/2016/12/electric-brewery.html">my electric brewing
system</a> I thought it would be helpful
to outline what a typical brew day looks like with that setup. Since
that post was already getting too long I decided to put this in it's
own relatively small post.</p>
<p>The FIRST step is to figure out what I'm going to brew. Since I've
moved up to 10gal batches and have the all electric system, I'm
brewing more than I can reasonably drink. I guess it turns out I like
making beer even more than I like drinking it. That means even when
I've got four kegs on tap, I'm still thinking about what to brew next.
I keep <a href="https://www.brewtoad.com/users/4059/recipes">all my recipes</a>
on <a href="https://www.brewtoad.com">Brewtoad</a>, so when I finally have room
for another batch of beer I pick one of my favorite recipes and then
go shopping. A few days before I plan to brew, I visit <a href="http://atr-homebreweast.com/">my local
homebrew shop, Above The Rest</a> to pick
up the necessary ingredients so on brew day I've got everything I'm
going to need.</p>
<p>On brew day (or the night before) I go back to the recipe on BrewToad
and use the mash water calculator, choosing the mash profile for
"Single Infusion, Sparge Rinse (BIAB)". Even though I'm not doing a
brew-in-a-bag brew, the water calculation works out really well for
my setup. I fill the HLT to the top measurement mark and then
transfer the right amount for the strike water into the mash tun.
Then I top the HLT back up. (If I want to get an early start on my
brewing, I'll do this the night before). Once the water levels are
right I set one pump to circulate the water in the HLT, and the other
pump to circulate the water from the mash, through the coil, and back
to the top of the mash tun.</p>
<p>When the pumps are running, I go to the
<a href="http://craftbeerpi.com/">CraftBeerPi</a> URL on the RaspberryPi and set
the HLT to hold at 140. It usually takes an hour or so to hit this
temp so I've got plenty of time to go do other stuff without needing
to watch the system. The mash tun lags behind by around five minutes,
so I wait for the mash to stabilize at 140 before mashing in.</p>
<p><img alt="mash prep" src="/images/mash-prep.jpg"></p>
<p>Next I shut off the mash pump and start to stir in my grains. I've
got a big mash paddle and go relatively slow to make sure they're
thoroughly wetted and there are no dough balls. Once all the grains
are in I stir for another minute or two just for good measure. Then I
make sure the mash return/sparge valve is open all the way and I turn
on the mash pump. If I were less lazy I would vorlauf first, but the
pump seems to do a really good job of it. When it's running clear, I
close the valve down so it's moving slower and not spraying the mash
too much. I know I run the risk of hot-side aeration with this but I
really haven't noticed any flavor impact (then again I haven't gone
through <a href="http://www.bjcp.org/index.php">the BJCP</a> yet so maybe there's
some off flavors slipping in that I don't notice?)</p>
<p>Once the mash is recirculating through the coil in the HLT, I set the
target temp to 151 (or higher if the style/recipe calls for it). It
usually takes 20 minutes or so for the mash to hit 151, during which
time I keep a close eye on it to make sure it's still circulating nicely
and not stuck or anything.</p>
<p>When I reach the target temp I start a timer for 70 minutes, and go do
other stuff. When the timer goes off I set the HLT temp to 173 and
reset the timer for 20 minutes. This starts a slow-ish ramp up to
mash out temp while the grain is still recirculating so the grain bed
will reach mash out temp and the sparge water will be ready as well.
(<a href="http://craftbeerpi.com/">CraftBeerPi</a> does have the functionality for
setting multiple steps to automate a step-mash but I haven't gotten
that to work right, and since the only step is to mash out I haven't
tried to figure out what I'm doing wrong.)</p>
<p>Now I shut down both pumps and change the connections. The mash-out
goes to the inlet on one pump with the outlet going to the boil
kettle. The other pump was recirculating the water in the HLT, so I
move the output of that pump to the inlet on the coil. The outlet of
the coil still goes to the lid of the mash tun as it was doing while
recirculating the mash.</p>
<p><img alt="mash prep" src="/images/mash-out.jpg"></p>
<p>When the connections are ready I turn the pumps back on and start
pumping out the mash tun into the boil kettle while fly-sparging with
the water from the HLT. I watch to make sure I transfer the right
amount for the sparge and shut that pump off (and close the valves)
when complete. Meanwhile the mash is still transferring slowly into
the boil kettle. As soon as the heating element in the boil kettle is
completely submerged, I turn on that element to get the wort up to
boil.</p>
<p>When the mash is drained I turn off that pump and close the valves.
At this point I keep a close eye on the boil kettle to watch for boil
overs. Generally I just shut off the heating element when the hot
break begins (and sometimes skim off some of the foam to help it
along). Depending on the grain bill I sometimes have to cycle the
heating element for a while until the foaming stops. Then I put in my
bittering hops and start the timer for other additions.</p>
<p>While the brew is boiling, I remove the spent grains from the mash tun
and then clean it out. When the brew is getting near the end I empty
any remaining hot water from the HLT and pack it full of ice and cold
water. I also make sure my fermenter is sanitized and ready to go.</p>
<p>When the brew is complete, I shut off the heating element and connect
the boil kettle to the inlet of the mash pump. The outlet then goes
to the coil, and the output of the coil goes to the lid I use for
sparging (which has <a href="http://www.northernbrewer.com/fermenters-favorites-fighter-jet-sparge">this fly sparge attachment from Northern
Brewer</a> in it.)
Pumping the wort slowly through the coil in the HLT that's filled with
ice water has worked out great for chilling the wort quickly, and the
fly sparge fitting oxygenates the wort nicely.</p>
<p><img alt="to fermenter" src="/images/to-fermenter.jpg"></p>
<p>After the wort has transferred to the fermenter, it's time to clean.
At this point the mash tun and HLT are already clean, but the inside
of the coil and the boil kettle both need to attention. I first rinse
out most of the trub from the boil kettle with a hose. Then I
transfer four gallons of the chiller water from the HLT into the
kettle and raise the temp to 140. Recirculating that hot water
through the coil, I dump in 4oz of "powdered beer wash" aka PBW. This
solution recirculates for 30 minutes, with the HLT holding the temp
steady. When the time is almost up I use a brush to make sure the
heating element is clean and free of debris. Then I pump out the PBW
solution (and dump whatever can't be pumped out of the boil kettle.)
Then I transfer the remaining water from the HLT into the boil kettle
and recirculate that for another 30 minutes. When that's done I pump
it all out and I'm ready to brew again!</p>
<p>I haven't watched the time too closely on these brew days to be
honest because I have so much extra time during the process to do
other stuff. I haven't had any issues with temperature overshoots
during the mash, and once things are running I can walk away until the
next step. It's pretty convenient to check in on things on my phone
in fact! BUT it also means I can't say for sure that this is a 5 hour
brew day, or more (or less). Regardless, it's been pretty awesome for
consistency and convenience. Switching to all electric is a decision
I'm really happy with, would definitely recommend it.</p>The Electric Brewery2016-12-25T13:00:00-08:002016-12-25T13:00:00-08:00Christopher Aedotag:localconspiracy.com,2016-12-25:/2016/12/electric-brewery.html<p>One of my best friends (bones!) sent me an email asking if I'd ever
heard of <a href="https://brewtronix.com/">this thing called Hosehead</a> (it's a
control system for an electric brewery using <a href="https://github.com/DougEdey/SB_Elsinore_Server">open source software
called Strangebrew
Elsinore</a>). I had
never heard of it, but had been thinking on and off for some …</p><p>One of my best friends (bones!) sent me an email asking if I'd ever
heard of <a href="https://brewtronix.com/">this thing called Hosehead</a> (it's a
control system for an electric brewery using <a href="https://github.com/DougEdey/SB_Elsinore_Server">open source software
called Strangebrew
Elsinore</a>). I had
never heard of it, but had been thinking on and off for some years
about converting my brew setup to be all electric. I knew the
efficiency was a big positive, plus the potential of being able to
brew inside made the idea a lot more attractive (even if I don't have
a good indoor spot to brew right now).</p>
<p>As could have been predicted, I started researching the concept and
fell deep down that rabbit hole. A few hours later I was convinced
converting my system to all electric was not just a sound idea, but
the only rational choice I could make. I decided to put together a
HERMS (<a href="https://byo.com/hops/item/1325-rims-and-herms-brewing-advanced-homebrewing">Heat Exchanger Recirculating Mash
System</a>).
By keeping the hot liquor tank at a temp just slightly above my target
temp I could recirculate the mash and raise to, or hold at, any temp I
wanted. Also recirculating the mash through the grain bed would lead
to clearer wort and greater efficiency. Knowing all this I was sure
only a fool would pass up the opportunity to build out a system like
this!</p>
<p>I had started brewing 10 gallon all grain batches about two years ago
using a large rectangular cooler for the mash and an <a href="http://amzn.to/2ihrDTK">80qt stainless
pot</a> from Amazon. (That's an affiliate link by
the way). I would heat the mash water to roughly 10 degrees over
strike temp, siphon the water into the cooler, and then mash in. I
had mixed results with efficiency, but the beers were generally
decent. Still, the whole process was a bit of a hassle and I was
eager to improve my system.</p>
<p>I set to work sorting out what I had and what I would need. For the
controller I decided to use a RaspberryPi (first generation) that I
had sitting around. The only use it got was an occasional MAME
emulator so my boys could experience the joy of Super Mario World or
Donkey Kong Country now and then. Making beer with it seemed like a
better use, all things considered. Then I took an inventory of what I
currently had so I could get my shopping list started. I already had
one 20 gallon kettle I could use, and realized I could re-purpose my
retired 13 gallon "keggle" as a hot liquor tank. That meant I would
only need to purchase another kettle (for boil or mash), plus "a few"
other odds and ends. Like a bunch of stainless valves, cam-lock
connectors, hoses, 50' of 1/2" stainless steel tubing, two pumps,
heating elements, wire, a project box, a 240v circuit somewhere, and a
dozen other things I would come to find need for along the way.</p>
<p>On the controller front, there are <a href="http://www.instructables.com/id/Electric-Brewery-Control-Panel-on-the-Cheap/">easier ways to do
it</a>
vs putting a RaspberryPi in charge, but I really loved the idea of being able
to set it up to do a step-mash and know I could go do other stuff
while the controller managed things for me. It will also make neat
graphs of the temperature rise (and hold) through the process (even if
those graphs are not really too valuable for anything). On top
of that I'd always been on the lookout for something good to use the
GPIO pins on the pi for and this seemed perfect.</p>
<p>Speaking of components, I've added links for most of the stuff I
ordered, though it's not an exhaustive list. I'm trying to avoid
making a complete list of every component I purchased for this project
because then I'll see the whole cost in one place and I won't be able
to trick myself into believing I did this on the cheap somehow.</p>
<p><img alt="Control Box" src="/images/control-box.jpg"></p>
<p>The first thing I started working on was the box to hold all the
components. Because this would all be on a rolling cart I wanted it
to be relatively portable rather than permanently mounted. If I had a
spot (inside a garage, utility room or basement) I would have just
used a larger electrical box mounted on the wall. Instead I found a
decent size <a href="http://amzn.to/2hupFCr">waterproof project box</a> that I
expected I could shoehorn everything into. In the end it turned out
to be a little bit of a tight fit but it worked out. In the bottom
left corner is the pi with a breakout board for connecting the GPIO to
the onewire temperature probes and the <a href="http://amzn.to/2hL8JDS">solid state
relays</a>. To keep the 240v SSRs cool I cut
holes in the case and stacked <a href="http://amzn.to/2i4DYwy">copper shims</a>
with CPU cooling grease between them and heat sinks mounted on the
outside of the box. It worked out well and there haven't been any
cooling issues inside the box. On the cover I put two switches for
120v outlets, plus two 240v LEDs to show which heating element was
energized. I used dryer plugs and outlets for all connections so it's
easy to disconnect a kettle from everything. Everything worked right
on the first try too (making a wiring diagram first definitely pays
off).</p>
<p><img alt="Control Box Inside" src="/images/control-box-inside.jpg"></p>
<p>The next phase of the project involved drilling holes in my kettles
for the heating elements and the valves. This took longer than it
should have due to me starting with a dull drill bit. Eventually I
wised up and got a new carbide tipped bit; combined with some oil and
more pressure than usual it made quick work. I drilled 1/2" pilot
holes and then used a titanium step bit to widen the holes from there
as needed.</p>
<p>For heating I purchased <a href="http://amzn.to/2ihSGR1">these 5500w stainless 240v
elements</a> from Amazon. They've been working
great, and the one in the boil kettle gets a pretty violent boil
going, easily as vigorous as I used to get with gas and a big banjo
burner.</p>
<p><img alt="Ready to mash" src="/images/ready-to-mash-in.jpg"></p>
<p>The mash tun was pretty easy, I would just need to find a decent false
bottom. The <a href="http://www.northernbrewer.com/titan-universal-false-bottom-17-diameter">Fermenter's Favorites
Titan</a>
from Northern Brewer was a perfect fit for the kettles I had. It's
really well made and nearly eliminates dead space. You'll see in the
picture below that I'm recirculating the mash through a fly-sparge
attachment. In theory I am at risk of introducing off flavors through
hot-side aeration, but I haven't noticed anything yet.</p>
<p><img alt="Recirculating" src="/images/recirc-mash.jpg"></p>
<p>When it came time to add the stainless coil in the HLT I thought I'd
be clever and thrifty by coiling the tubing myself. I purchased 50'
of 1/2" stainless tube on Amazon and got to work trying to bend it up.
I eventually made a coil but it was not pretty and it took WAY more
effort than I anticipated. Along the way I kinked it up too much and
basically turned out something that was unusable. I still have the
tubing and expect I might use it some day for fixed runs in a more
permanent brew setup. (I'm too ashamed to include a photo of that
disaster...)</p>
<p>Seeing prices around $200 for a coil like this is what initially put
me off from buying one pre-made. Then I stumbled across <a href="http://www.stainlessbrewing.com/">Stainless
Brewing</a> and was shocked to find I
could get a perfectly coiled 50' run of stainless for almost the same
price as the raw material. It happened to be my lucky day too as
there was a 20% sale going on, so I immediately placed my order. It
was <a href="http://www.stainlessbrewing.com/HERMS-10-Coil-with-2-bends-50-x-12-OD-Tubing-304-HERMS_p_30.html">a beautiful piece of
work</a>
and installed easily.</p>
<p><img alt="herms" src="/images/herms.jpg"></p>
<p>One other great side effect of having a setup like this is that when
I'm ready to crash-cool the brew while transferring for fermentation I
just pack the HLT with ice and water and keep that circulating while
the brew is pumped out through the coil. This has worked awesome and
I've been able to easily drop the temp to 70 at the end of the brew.</p>
<p><img alt="Cooling" src="/images/crash-cool.jpg"></p>
<p>The last thing I needed were pumps, and again those are pretty
expensive. I got lucky and found a <a href="http://amzn.to/2ihQJSi">Chugger SS center-inlet
pump</a> that had been returned to amazon and
could be mine for $111! The second one was more expensive than that,
but I knew I was going to need two pumps for this system. During mash
I would need one to recirculate the wort through the stainless coil
and back on top of the mash while a second pump recirculated the water
in the HLT to keep that temperature steady. Then during mash out I
would need one to pump the wort into the boil kettle while the other
was pumping sparge water on top of the mash.</p>
<p><img alt="Kettles2" src="/images/kettles2.jpg"></p>
<p>(Don't be confused by how the pumps and hoses are connected in this
picture. I was moving cleaning solution from the boil kettle into the
mash tun, and had been recirculating the water in the HLT. I'll
include better pictures in my <a href="/2016/12/typical-brewday.html">typical
brewday</a> post.)</p>
<p>For the hoses I used high temp clear silicon. I purchased the hose
from the same place I got my stainless camlock fittings and the valves
as well. <a href="http://www.bargainfittings.com/">Bargain Fittings</a> seemed
to have the best deals I could find for most of this stuff. I got
bulkheads from them as well, along with a few miscellaneous fittings
to get everything connected properly.</p>
<p>The only other thing I needed that was a little tricky to find was a
compression fitting for the temperature probes. The probes were
mounted in T fittings before the valve on the lowest bulkhead in both
the HLT and the mash tun. As long as the liquid is flowing past the
temp sensor, it's going to be accurate. I thought about adding a
thermowell into the kettles as well but realized that's not going to
be really useful to me based on my brewing process. Anyway, I
purchased <a href="https://www.brewershardware.com/CF1412.html">these 1/4" compression
fittings</a> from <a href="https://www.brewershardware.com">Brewers
Hardware</a> and they worked out
perfectly.</p>
<p>I think that about covers everything I had to piece together to make
this system. My next post will cover a <a href="/2016/12/typical-brewday.html">typical
brewday</a> with this setup. Even from
the first run, I was really happy with it. I've been hitting 85% to a
touch over 90% efficiency with this, and the brews are ending up
higher ABV than I intended. Once I get more used to this I'll be able
to cut back on my grain bill a bit and still end up with good beer!</p>
<p>Helpful links:</p>
<ul>
<li><a href="http://www.craftbeerpi.com/">CraftBeerPi</a></li>
<li><a href="http://www.theelectricbrewery.com/">The Electric Brewery</a></li>
<li><a href="http://www.instructables.com/id/Electric-Brewery-Control-Panel-on-the-Cheap/">Electric Control Panel on the Cheap</a></li>
<li><a href="https://www.reddit.com/r/Homebrewing">Reddit Homebrewing</a></li>
<li><a href="https://www.reddit.com/r/StrangeBrew">Strangebrew Elsinore subreddit</a></li>
<li><a href="https://github.com/DougEdey/SB_Elsinore_Server">Strangebrew Elsinore</a></li>
<li><a href="https://brewtronix.com/">Hosehead</a></li>
<li><a href="http://www.stainlessbrewing.com/">Stainless Brewing</a></li>
<li><a href="http://www.bargainfittings.com/">Bargain Fittings</a></li>
<li><a href="https://www.brewershardware.com">Brewers Hardware</a> </li>
</ul>The Skunks2016-08-07T17:31:00-07:002016-08-07T17:31:00-07:00Christopher Aedotag:localconspiracy.com,2016-08-07:/2016/08/the-skunks.html<p><img alt="image" src="/images/pepelepew.jpeg" title="cartoon skunk"></p>
<p>One night a few months after we moved into our place in Portland
we noticed a bit of a skunk smell. It wasn't too strong, and we just
assumed there was a skunk in the woods and something had scared
it. It didn't take too long for the smell to …</p><p><img alt="image" src="/images/pepelepew.jpeg" title="cartoon skunk"></p>
<p>One night a few months after we moved into our place in Portland
we noticed a bit of a skunk smell. It wasn't too strong, and we just
assumed there was a skunk in the woods and something had scared
it. It didn't take too long for the smell to go away, and we
didn't think about it again. A few weeks later we took
a vacation and had a relative stay in our house while we were
gone. She told us that a few nights after we left there was a REALLY
strong skunk odor in the house suddenly, and it was enough to
stink up the whole place. She said she opened all the windows
and it took another day or two before the smell was gone. At the
same time our beagle had gone a little crazy and was trying to
dig through the floor in our bathroom.</p>
<p>That was definitely not a good sign.</p>
<p>Within a few days of our return we got a whiff of skunk again,
and the beagle was doing her best to get under the house through
the bathroom floor. We calmed her down, and eventually went to
bed. Around 2am we heard some scratching and rustling sounds
coming from an air conditioning duct in the floor of our room. The beagle
leaped off the bed and started frantically scratching at the
vent. Eventually the noises stopped, the dog calmed down, and we
went back to sleep. At this point I was still trying to convince
myself it might not be a skunk...</p>
<p>The noises continued a few days later, and by then I was sure we
had a problem. Looking everywhere around the exterior of the house I found the
only place they could have been getting in. Under the deck at the
front door it looked like something had dug a little hole to get
under the deck, and from there they were getting under the house.
I tried putting cinder blocks and river rocks where it looked
like they were coming and going but they just dug new holes.</p>
<p>I searched around the 'net for suggestions on how to keep the
skunks away. I still thought they were just visiting under our
house for some reason (maybe we had tasty grubs or something),
because I honestly did not want to believe there was a skunk
trying to live under our house. Turns out they nest in big
groups, as many as 14! Reading that had me really worried that
maybe we had a dozen skunks living under the house. By now I was
ready to seek a pro, and we found a guy who said he would come by
and see if it was a job he was willing to do.</p>
<p>When Jeff came over I showed him where I thought they were coming
and going, and he was pretty sure we had skunks. We agreed on a
price (which was totally reasonable!) and he was hired. Turns out
I was lucky and caught him on a good day; normally he turns down
skunk removal jobs (same with "angry raccoon in my attic" jobs). I
think it's a pretty sensible policy, I would do the same.</p>
<p>That day he left a trap by the deck baited with a granola bar.
Before it even got dark, we had our first capture! Of a
squirrel. When I opened the trap that thing shot out like a
rocket. I reset the trap, put some new bait in and crossed my
fingers.</p>
<p>Sure enough, by 10pm or so I noticed the trap was sprung and
inside was an unhappy skunk. Surprisingly it hadn't sprayed or
anything, so at least we did not have to deal with a stink like
that. The next morning Jeff came to fetch the critter and left a
new trap. He drove the skunk about 60 miles away and released
it into the woods.</p>
<p>The next night we had a repeat, except whatever got trapped was
making a whole lot more noise. Lots of scratching sounds and
even sounds of the trap being moved around. From inside the
house we shined a light on the trap and saw one big skunk in the
trap plus one smaller adolescent skunk scratching all around the
base of it trying to help free the captive one. Eventually the
smaller one left, and the next day Jeff collected the trapped
skunk and repeated the release process.</p>
<p>The third night we caught one more skunk, but caught no others
for a few more nights. We actually might have caught four in
total but I can't really remember for sure.</p>
<p><img alt="image" src="/images/deck-opened-up.jpg" title="wooden deck with section removed"></p>
<p>As soon as I thought the skunk situation was sorted out, I opened
up the deck and filled in the gap the skunks were using. I
used several cinder blocks plus two bags of cement to be sure
they did not have another shot at it. </p>
<p><img alt="image" src="/images/skunk-hole-plugged.jpg" title="foundation with cement poured"></p>
<p>I also lined the
perimeter of the deck with a thick layer of river rocks so
any further attempts to get under there would be difficult
and obvious. Since then, we haven't had a single problem with
animals (unfriendly or otherwise) trying to nest under our house.
Hopefully that never changes!</p>IRC, the secret to open source success2015-12-19T14:03:00-08:002015-12-19T14:03:00-08:00Christopher Aedotag:localconspiracy.com,2015-12-19:/2015/12/irc-secret-success.html<p>[Yes, this is another IRC post - this one was written for <a href="https://developer.ibm.com/opentech/2015/12/20/irc-the-secret-to-success-in-open-source/">IBM's
OpenTech blog</a>, but I thought I'd add it here since my blog tends to be thin on
updates ;) Anyway, hope you enjoy it!]</p>
<p>Effective communication is key when collaborating on an open source
project and being reachable is …</p><p>[Yes, this is another IRC post - this one was written for <a href="https://developer.ibm.com/opentech/2015/12/20/irc-the-secret-to-success-in-open-source/">IBM's
OpenTech blog</a>, but I thought I'd add it here since my blog tends to be thin on
updates ;) Anyway, hope you enjoy it!]</p>
<p>Effective communication is key when collaborating on an open source
project and being reachable is the first step. For many open source
projects the two key communication channels used are email and IRC.
Email tends to be used for longer conversations on topics that might
span weeks or even months of back and forth, and IRC is the medium of
choice when you need to gather information or come to a consensus
quickly. Everybody has an email address, but not nearly as many
people manage to stay connected on IRC. Being available on IRC makes a
huge difference if you want to be a truly effective member of the open
source community.</p>
<p>The best thing about IRC is that it can really bring a distributed
community together. For instance, with
<a href="http://openstack.org">OpenStack</a> many projects have <a href="https://wiki.openstack.org/wiki/IRC">their own IRC
channel</a> where those involved
hang out. Additionally there are a few other channels that span
multiple projects (like #openstack-infra) where you can find a huge
number of active contributors. Hanging out on those channels is a
great way to get to know the people involved and is essential if you
want to receive or provide help quickly. Hopping on one of these IRC
channels can feel like wandering into a room filled with a bunch of
great friends.</p>
<p>If you are interested in becoming an OpenStack contributor having a
persistent IRC presence might be one of the most important secrets to
success. Anyone who spends time in one of the more active project
channels will immediately see the value of synchronous communication
here where problems are sometimes solved in minutes.</p>
<p>The challenge with a synchronous communication channel like IRC is
that not everyone is awake and online at the same time. If you're
using an IRC client that goes offline when you aren't around you are
often missing part of the conversation. It also makes it difficult
for people to find you if you're going on and off-line several times a
day. This issue can be solved by running your IRC client (like
<a href="https://irssi.org/">irssi</a>) in a screen or tmux session on a machine
that's always online and then connecting to that machine as needed.
The biggest problem with this approach is that it makes it hard to
catch a notification if you're not connected to the remote session.</p>
<p>To solve this some people configure an IRC bouncer like
<a href="http://wiki.znc.in/ZNC">ZNC</a>. This is essentially an IRC proxy,
which buffers messages when you're not connected to it and plays the
messages back when you return. With most bouncers you can configure a
notification to alert you via email if your IRC nickname is mentioned
while you're offline. If you have a bouncer set up, you can then
connect to it with any IRC client that runs on your platform of
choice. Sean Dague wrote a really good doc on <a href="https://dague.net/2014/09/13/my-irc-proxy-setup/">his IRC proxy
setup</a>, and even
included a puppet manifest to automate the setup. This works
reasonably well, but can get pretty complicated when you want to
connect from multiple IRC clients at the same time, like your desktop
and your phone for instance.</p>
<p>What if you also have cause to use <a href="http://slack.com">Slack</a>? Many
teams are using Slack as essentially a hosted IRC server and client.
If you are anything like me, you've already been invited to join
several different Slack orgs, which means in addition to paying
attention to a dozen (or a few dozen) IRC channels you also have to
keep several browser tabs open for all the Slacks.</p>
<p>If you are looking for some way to unify all these messaging platforms
(as I was), I've found the perfect solution -
<a href="https://weechat.org/">WeeChat</a>, an IRC client with a built in relay
that makes it incredibly easy to stay connected in a terminal session,
a web app and your phone, all at the same time. You get a consistent
view across all your devices, and can catch up on any conversation by
scrolling back up. If you run the Android client you'll get a
notification on your phone when someone mentions your nick. If you
use Glowing-Bear web client, you'll get a notification on your desktop
too! It's lightweight and easy to install, and has an excellent
modular architecture with <a href="https://weechat.org/scripts/">a great many scripts and plugins
available</a> including one called
<a href="https://github.com/rawdigits/wee-slack">WeeSlack</a> that allows you to
bring several slack organizations and all their channels under one
roof.</p>
<p><img alt="weechat terminal scrrenshot" src="/images/weechat-term.png"></p>
<p>Installing <a href="https://weechat.org/">WeeChat</a> is very straightforward,
though the steps to take depend on your platform of choice. I decided
to install <a href="https://weechat.org/">WeeChat</a> on an Ubuntu VM running on
a public OpenStack cloud - installation was as simple as typing "sudo
apt-get install weechat". Once installed, <a href="https://weechat.org/doc/">their
docs</a> are excellent. DON'T FORGET to start
WeeChat in <a href="http://www.gnu.org/software/screen/">a screen session</a> so
you can disconnect without shutting it down!</p>
<p>Once WeeChat is running you can enable an encrypted relay and get
connected from the <a href="https://play.google.com/store/apps/details?id=com.ubergeek42.WeechatAndroid&hl=en">WeeChat Android
Client</a>.
It might not be your first choice (at least for me, I do not type
incredibly fast or error-free on my phone!) but it sure does come in
handy when you are following along with an ongoing conversation. It's
also great when someone pings you, and you can quickly respond with
"away from the computer, but I'll ping you when I return in half an
hour!"</p>
<p><img alt="weechat android client screenshot" src="/images/weechat-android.png"></p>
<p>You can also get connected from your browser with <a href="https://github.com/glowing-bear/glowing-bear">Glowing
Bear</a>, which is my
personal favorite. I'll get a quick notification on the desktop if
I'm mentioned somewhere and all the IRC channels and Slack
organization I'm connected to are in one convenient tab.</p>
<p><img alt="Glowing-bear.org" src="/images/gb-screen.png"></p>
<p>Details on setting up the encrypted relay can be found in the WeeChat
docs, or even easier, by visiting
<a href="http://www.glowing-bear.org">http://www.glowing-bear.org</a> and
clicking "Encryption instructions". It will take less than a minute,
and SHOULD be your connection method of choice.</p>
<p>Along the way you'll want to get connected to
<a href="http://freenode.net">freenode.net</a>. When you do, be sure to pick a
nickname you like, and <a href="https://freenode.net/faq.shtml#userregistration">don't forget to register
it!</a>!</p>
<p>I really believe being available on IRC can make a tremendous
difference if you are involved in the open source community, and my
personal experience definitely supports this. There are several
different ways to achieve a persistent presence on IRC but hopefully
you'll agree WeeChat is the best option around. If you happen to get
connected to a freenode server please say hello, it's as easy as
"/msg docaedo Hi there!"</p>Regarding IRC2015-08-17T19:26:00-07:002015-08-17T19:26:00-07:00Christopher Aedotag:localconspiracy.com,2015-08-17:/2015/08/regarding-irc.html<p>All the work I do with <a href="http://www.openstack.org">OpenStack</a> is
coordinated through mailing lists, IRC and design summits every
six months. For quite a while I handled IRC by just keeping a
screen up running <a href="http://www.irssi.org/">Irssi</a> on a VM on some
cloud or another. That approach was quick and easy, and kept …</p><p>All the work I do with <a href="http://www.openstack.org">OpenStack</a> is
coordinated through mailing lists, IRC and design summits every
six months. For quite a while I handled IRC by just keeping a
screen up running <a href="http://www.irssi.org/">Irssi</a> on a VM on some
cloud or another. That approach was quick and easy, and kept my
identity online at all times. I could get connected from
anywhere, and scroll-back to see what I had missed.</p>
<p>That left a lot to be desired though. It meant I had
no easy way to get connected from my phone or basically anything
other than via SSH (from a machine that had a private key I could
use to connect). It also meant getting notified when someone
wanted my attention on IRC was not easy. It was possible in a
limited fashion anyway - I just logged everything in Irssi and
then used tail, grep and notify-message like this: "tail -n 1 -q
-f ~/irclog/<em>/</em>.log|grep -i --line-buffered docaedo"|while read
line;do notify-send "IRC Message" "${line}";done</p>
<p>I stuck with this method almost entirely because it was quick
and easy and worked well enough for the last year or so.
In the last few months though keeping connected with folks via
IRC has become a lot more important to me, which meant I needed
to step it up a little bit and find a better solution.</p>
<p>Most of the people I know use an IRC bouncer, and the popular
choice is <a href="http://wiki.znc.in/ZNC">ZNC</a>. That IRC proxy
maintains your presence online, and makes it easy to connect from
different devices, with different IRC clients. Sean Dague wrote
a really good doc on <a href="https://dague.net/2014/09/13/my-irc-proxy-setup/">his IRC proxy setup</a>.
If you are planning to take that route, you would have a hard
time finding a better guide (he even includes a puppet manifest
to automate the setup!)</p>
<p>He also mentions <a href="https://www.irccloud.com/">IRCCloud</a> as an
alternative approach. For $5/month, they provide a web interface
to IRC along with an app for iOS or Android. The app is pretty
decent, the web UI is easy to understand and use, and if you are
lazy, it's about the quickest and easiest way to get up and
running. No VM required, nothing to maintain. Just create an
account, sign in and you're good to go. I gave it a try for a
bit and was impressed. Someone who has been using it for
a while though warned there are connectivity problems that crop
up (DDoS's and such), and it's ugly when they do.</p>
<p>That same conversation (on IRC of course!) led me to
<a href="https://weechat.org/">WeeChat</a>, which embarrassingly I had never
heard of. (I feel like that happens too often even though I
seriously do my best to stay on top of all things nerdlife!) This
turned out to be the perfect solution for staying connected on
IRC from multiple clients easily.</p>
<p>On my Ubuntu VM getting up and running was as easy as "apt-get
install weechat". Moments later, I was back online with a very
powerful shell client. One or two commands later I had enabled
the relay and connected the <a href="https://play.google.com/store/apps/details?id=com.ubergeek42.WeechatAndroid">free Android
client</a>
from <a href="https://republicwireless.com">my phone</a>. It was working
beautifully, and alerting me for any messages mentioning me (or
anything else that I specified as watch-words). Next up I tried
<a href="http://www.glowing-bear.org/">Glowing Bear</a>, a browser-based
front-end for WeeChat and found it looked great, was easy to use,
and gave me one more easy way to get connected to my IRC
identity. The <a href="https://github.com/glowing-bear/glowing-bear">Glowing Bear
source</a> is open and
available, and you can run it locally as a Firefox or Chrome app, hosted on
github pages, or served by your own web server.</p>
<p>After playing around for a few minutes, I set up a cert so I
could connect to my WeeChat relay over SSL following <a href="https://4z2.de/2014/07/06/weechat-trusted-relay">these
quick and easy
instructions</a>.</p>
<p>So in short, if you have any reason to use IRC with any
regularity I honestly think <a href="https://weechat.org/">WeeChat</a> is
the best option available assuming you have access to an
always-on VM and just a tiny bit of technical ability.</p>
<p>If you're on IRC by the way, look me up and say hi! (I'm docaedo on
<a href="http://freenode.net">Freenode</a>).</p>The $1k IPA2015-08-03T11:15:00-07:002015-08-03T11:15:00-07:00Christopher Aedotag:localconspiracy.com,2015-08-03:/2015/08/the-1k-ipa.html<p><img alt="1k IPA on tap" src="/images/1kipa-on-tap.jpg"></p>
<p>I have been brewing for a while now (around 10 years I think?),
and have always done 5 gallon batches, and kegged into corny kegs
rather than bottling. (Mainly because I love brewing, love beer,
and really like having beer on tap in the kitchen.) I have been
interested in …</p><p><img alt="1k IPA on tap" src="/images/1kipa-on-tap.jpg"></p>
<p>I have been brewing for a while now (around 10 years I think?),
and have always done 5 gallon batches, and kegged into corny kegs
rather than bottling. (Mainly because I love brewing, love beer,
and really like having beer on tap in the kitchen.) I have been
interested in stepping up to 10 gallon batches though, as the
time/effort are the same though you end up with double the beer.
Finally this year I thought I would up my game and start making
10 gallon batches.</p>
<p>To that end I figured the only thing I was going to need was a
bigger mash tun and a bigger carboy. My brew kettle was a keg
with the top cut open and a valve at the bottom. It served me
well for many years and seemed like it would be big enough. I
bought a big cooler from costco and set it up with a screen and
valve, and thought I was good to go.</p>
<p>For my first 10 gallon batch I decided I would adjust one of my
favorite recipes, my single-hop Citra IPA. With a few tweaks, I
had what looked like it would be a pretty good beer - my <a href="https://www.brewtoad.com/recipes/citra-single-10g">Citra
Single 10 gallon</a>.</p>
<p>During the brew the mash tun was perfect. But somewhere along the
way I failed to notice something pretty important. My
keg-turned-kettle had a maximum volume of 50L. The pre-boil
volume for this batch was going to be 14 gallons, or likely even
a little over that. According to <em>math</em>, 50L == 13.2gal. Doing a
little more math, I discovered 13.2gal is less than 14gal, which
meant I was not going to have room for all the wort. It really
would have been nice if I'd done this maths before I started the
brew...</p>
<p>Unfortunately I did not think about the numbers until I was
draining the second runnings from the mash and noticed my kettle
was already pretty full. Ultimately I ended up dumping a gallon
of wort. I suppose I probably could have boiled the extra wort in
a second kettle with a few of the bittering hops and combined
that as I boiled the main batch, but at that point I thought the
only drawback would be lower alcohol volume for the finished
product, and all things considered that's nothing to be worried
about.</p>
<p>I had not picked up a large carboy for fermentation yet, so I
planned to use two 7gal glass carboys to do the primary
fermentation with the intention of buying a large food-grade
plastic barrel before it was time to transfer to secondary. One
of the glass carboys I had was a <a href="http://www.northernbrewer.com/shop/brewing/brewing-equipment/fermenting-equipment/big-mouth-bubbler">big mouth
bubbler</a>
my wife had given me for my birthday. It's an excellent choice if
you are in the market for a big glass carboy. Once the beer was
boiling, I got to work sanitizing my fermenters.</p>
<p>I transferred about 3 gallons of starsan-solution to the big
mouth bubbler, and gave it a few minutes (while swirling it up
the sides a bit too). Intending to soak the top half in sanitizer
as well, I picked the carboy up to turn it upside down. Sadly,
this was when disaster struck. The thing slipped from my hand and
the bottom fell just a few inches onto the counter, which caused
it to basically explode. Shards of glass flew everywhere landing
as far as twelve feet away. All that sanitizer poured across the
counter, over the cooktop, onto the floor and down the steps into
the living room.</p>
<p>As the glass broke it cut my hand too (not badly, but enough to
need at least a little attention.) Our kids were drawing at the
kitchen table, and the dogs were curious about all the
commotion. So I grabbed a paper towel for my hand and then rushed
off to grab some towels for the sanitizer that was still running
town the steps, under the fridge, and across the kitchen floor.</p>
<p>Around the time I felt I finally had the situation under control
with towels all over the floor and the kids and dogs maintaining
a reasonable distance, I noticed how much water was on the
counter top. It was a lot of water still. There was also a bunch
of stuff ON the counter. Some paperwork (bills and stuff), and a
few library books. Oh look, my wife's macbook was also there -
oops!</p>
<p>In case you were not aware, macbooks are not water proof. Or
water resistant. In fact, they don't even like moisture, let
alone sitting in half an inch of water. As I picked it up off the
counter, a disturbing amount of water ran out of it. Really not
good.</p>
<p><em>Relating this story to a friend, he responded:</em></p>
<blockquote>
<p>"wow. a day like that would end home brewing in my house."</p>
</blockquote>
<p>Eventually I got everything cleaned up, and MOSTLY paid attention
to the beer that was still in-process. I cleaned and sanitized
two carboys and got the beer transferred and ready for the yeast.
Then I turned back to cleaning and drying stuff out. One library
book took a pretty bad hit, and was definitely water damaged. The
worst was the laptop though, and I had little hope of getting it
running again. I did open it up and dry it out but I was never
able to get it to fire up again. No data was lost (everything was
backed up with crashplan) but I definitely owed my wife a new
computer. AND the library made us replace the book I ruined
too.</p>
<p>Ultimately the beer turned out really good, so I'm looking
forward to brewing it again. With any luck the next batch will
not be quite so costly!</p>Not Quite Abandoned2015-07-13T12:40:00-07:002015-07-13T12:40:00-07:00Christophertag:localconspiracy.com,2015-07-13:/2015/07/not-quite-abandoned.html<p>Holy smoke it's been almost a year since the last time I added
something new here! That is not at all because I haven't had
anything new to talk about. Rather, there's been too much going
on and I haven't had even half a chance to circle back and write …</p><p>Holy smoke it's been almost a year since the last time I added
something new here! That is not at all because I haven't had
anything new to talk about. Rather, there's been too much going
on and I haven't had even half a chance to circle back and write
up a blog post.</p>
<p>I do wonder where those folks who write constantly find time. I
know when I end up with extra time it either means I can finish
doing something I've needed to do to the house (add a new
outlet, make a frame for a mirror, build a retaining wall, etc.)
or else do something with the kids. Usually that means go
exploring with them. Sometimes I have "spare" time at the end of
the day but usually if I'm awake, then I'll read.</p>
<p>I DID finally take a little time to convert this blog to Pelican
(away from Blogger). Some links might be broken, and I still have
a little housekeeping I want to do (like put the content in a git
repo and set it to build and publish automatically on each commit
for instance). But so far, I think the transition is looking
pretty good!</p>
<p>In general though, I'm sorry to say adding new things to the blog
is pretty low priority at the moment. Maybe I need to set aside
some time once a week to write up some of the interesting stuff I
ran across the previous week :)</p>Setup update2014-07-21T22:14:00-07:002014-07-21T22:14:00-07:00Christopher Aedotag:localconspiracy.com,2014-07-21:/2014/07/setup-update.html<p>I'm posting this mostly for my own benefit, but I also realize it's been
SO LONG since I last posted, it will prove this blog is not entirely
abandoned!* </p>
<p>I outlined <a href="/2014/02/the-setup.html">my
setup</a> at home in
February, and since then the only significant change has been firewall
tuning. For months …</p><p>I'm posting this mostly for my own benefit, but I also realize it's been
SO LONG since I last posted, it will prove this blog is not entirely
abandoned!* </p>
<p>I outlined <a href="/2014/02/the-setup.html">my
setup</a> at home in
February, and since then the only significant change has been firewall
tuning. For months, I had intermittently difficulties with our internet
connection. Chalking it up to a bad ISP, I didn't really bother to try
to make it better. Occasionally I'd adjust the traffic shaping rules in
hopes of improving the situation, but it was never clear whether or not
the changes had a lasting positive impact. </p>
<p>Then the other day I was reading about community mesh networks and was
reminded of "<a href="https://en.wikipedia.org/wiki/Bufferbloat">buffer
bloat</a>)". Checking my
connection with the <a href="http://netalyzr.icsi.berkeley.edu/">ICSI Netalyzer</a>
showed there was some significant bloat going on, AND the ISP was
fragmenting traffic without properly reporting it. Switching my PFSense
queues to Codel and <a href="http://www.dslreports.com/faq/695">tuning my MTU</a>
has resulted immediately in tremendously improved connectivity. </p>
<p>All along I think the biggest issue was the fragmentation two hops away.
Should have tested for that the first time I got connected! Hopefully
writing this little post up will remind me next time. </p>
<p>ALSO, under the topic of "the setup" and "things I hope I won't forget
again"... When I set up my workstation at home I added a mac mini for
development work. Recently I installed Ubuntu 14, and am absolutely
loving it. Coupling that with <a href="http://www.synergy-project.org/">Synergy
Project</a> for keyboard/mouse control
leaves me with a perfect setup. I've got a decent monitor connected to
the min with my laptop next to it, and any time I want to control that
computer I just swing the mouse over. It's like extending you desktop
onto a full-screen VNC session, except it's much smoother and cleaner.
Good stuff! </p>
<p>[*] In fairness, since the last post we did some major renovations on
the house, sold it, moved to <a href="https://en.wikipedia.org/wiki/Graeagle">Graeagle
CA</a>, I got a new job, and we
bought a house in Portland. Last step will be moving up there. Maybe
once we settle in, I'll find time to write stuff here now and then!</p>Linux ecosystem thriving in SoCal!2014-02-22T20:24:00-08:002014-02-22T20:24:00-08:00Christopher Aedotag:localconspiracy.com,2014-02-22:/2014/02/linux-ecosystem-thriving-in-socal.html<p><img alt="scale12x" src="/images/scale_12x_dodecahedron.png"></p>
<p>I'm heading back to the <a href="http://www.socallinuxexpo.org/scale12x">12th Annual Southern California Linux
Expo</a> and really looking forward
to another round of great sessions and mingling with the other nerds I
run into at the meetups. </p>
<p>This conference has brought something to mind that I'd considered in
passing previously, but now I'm thinking …</p><p><img alt="scale12x" src="/images/scale_12x_dodecahedron.png"></p>
<p>I'm heading back to the <a href="http://www.socallinuxexpo.org/scale12x">12th Annual Southern California Linux
Expo</a> and really looking forward
to another round of great sessions and mingling with the other nerds I
run into at the meetups. </p>
<p>This conference has brought something to mind that I'd considered in
passing previously, but now I'm thinking much more seriously about it.
That would be the role of "part time CTO". </p>
<p>In the last six months I've been helping a few small companies fill gaps
with their sysadmin needs or devops/techops leadership. It's surprising
how quickly we've been able to shore up their networks, straighten out
their disaster recovery plans, address critical security concerns, etc.
Having 20+ years of experience under my belt makes much of this stuff
seem crazily obvious to me - it's easy to forget there was a time when I
didn't know everything I know today :) </p>
<p>For the vast majority of small and growing companies (established shops
and startups alike), it can be way less expensive to have me or someone
like me on staff part-time. You can get all the value of a veteran
CIO/CTO at a fraction of the expense. </p>
<p>I have the spare cycles right now to expand what I have to offer, so if
you could use someone with deep expertise in TechOps, DevOps, cloud and
scalability, let's talk - contact me at <a href="mailto:doc@aedo.net">doc@aedo.net</a>!</p>The Setup2014-02-05T16:30:00-08:002014-02-05T16:30:00-08:00Christopher Aedotag:localconspiracy.com,2014-02-05:/2014/02/the-setup.html<p>Over the years I have been continually refining my home technology
stack. It's in the best state it's ever been, so I figured I should
document it. I'm looking forward to looking back at this post in a few
years to see what's evolved, and what's still the same. </p>
<p>External …</p><p>Over the years I have been continually refining my home technology
stack. It's in the best state it's ever been, so I figured I should
document it. I'm looking forward to looking back at this post in a few
years to see what's evolved, and what's still the same. </p>
<p>External connection - Verizon FiOS. It's usually pretty good.
Unfortunately it seems like they keep edging the price up a few dollars
at a time. But there's no alternative if I want reasonable speed.
Wouldn't it be nice if there were more options? <a href="http://www.dataroads.org/blog/">There should
be</a>! </p>
<p>Firewall/WAP - <a href="/2014/02/you-need-better-firewall.html">Home-built
ALIX/pfSense</a>.
It's just plain awesome. </p>
<p>Cell phone - We're using <a href="https://republicwireless.com/phones/moto-x">Republic Wireless with the
Moto-X</a>. Also just plain
awesome. The phone is the best I've ever used. The service isn't
perfect, but it's close, and it gets better all the time. The price is
unbeatable. </p>
<p>Land-line - Cancelled it so many years ago I don't even remember when.
We do have phones in the house that are fantastic, and the service is
free. I've had a google voice number since the early early days, and
bridge it with an <a href="http://www.obitalk.com/">OBiTalk</a> VoIP adapter. This
<a href="http://www.amazon.com/OBi100-Telephone-Adapter-Service-Bridge/dp/B004LO098O/ref=sr_1_1?ie=UTF8&qid=1391447948&sr=8-1&keywords=obitalk">\$38 adapter from
Amazon</a>
works beautifully. </p>
<p>TV/Video - <a href="/2009/05/tivo-is-for-suckers.html">Cancelled satellite
subscription</a>
six or seven years ago and have been using a <a href="/2011/02/watching-tv.html">2nd gen
AppleTV</a> for
quite a while. It's bad for your brain but I just can't quit it. </p>
<p>Video content and automation - The non-Netflix content is served off a
RaspberryPI with a 1.5tb USB drive attached to it. I'm pretty sure it's
close to the most energy efficient solution. In the past I've run
full-size PCs with lots of internal disks, or once (for a year?) the
content lived on a Drobo. Operating systems experimented with included
OpenSolaris, FreeBSD and Linux. Always lots of moving parts, and over
time, usually a hassle of one sort of another. Since moving to the pi,
I've also added an X10 USB dongle (so a simple script turns on the
outside light at sunset, turns it back off at midnight - christmas
lights were similarly managed, etc.) </p>
<p>Retrieving content - OK, this part is being shared solely for academic
purposes. (I am sure it's against the rules to grab torrent content
because that's what pirates do, obviously. Even if it's just a show
that was broadcast over the open airwaves, and could have been delivered
to you nearly identically by a neighbor with a VCR.) I am <a href="https://github.com/aedocw/TVShowGrabber">running this
script</a> on the raspberry pi,
which regularly checks for new episodes of any show we specify, and if
found, automatically starts up the download. </p>
<p>Backups - I used to back the laptops up to the file server, which was
why I always had a box set up with raid-5 or raid-z. Once upon a time
though, two drives in the drobo failed at the same time and it took me
way longer than it should have to get that data back. After that, I
switch to <a href="http://www.code42.com/crashplan/">CrashPlan</a>. It's been
awesome, and has been used to recover all content from lost hard drives
twice. Because it saves incremental snapshots as well, I've even used
it to pull back a previous version of a file on a few occasions. We
have a family plan shared with my family and a friend, so the actual
cost per machine being backed up is about \$2/month. </p>
<p>All together, it's a very simple setup, and the hardware components
should last a good long time. It's also completely portable (only
requirement is an internet connection). The TV side is also easily
expanded - if you have multiple TVs, you still have a central repository
of content (just need additional AppleTVs!) Grabbing shows is
completely automated just like with a fancy DVR (though I'll admit it's
not as convenient - but maybe the next step will be for me to bolt a
web-UI in front of the show grabber!) </p>You need a better firewall2014-02-03T19:47:00-08:002014-02-03T19:47:00-08:00Christopher Aedotag:localconspiracy.com,2014-02-03:/2014/02/you-need-a-better-firewall.html<p><img alt="picture" src="/images/pfsense-logo.png"></p>
<p>A long long time ago I had Verizon FiOS installed at my home, and with
it they supplied an Actiontec router and wireless access point. It
worked reasonably well, but it needed a power cycle every now and then
and any custom configuration was difficult. I could never get it …</p><p><img alt="picture" src="/images/pfsense-logo.png"></p>
<p>A long long time ago I had Verizon FiOS installed at my home, and with
it they supplied an Actiontec router and wireless access point. It
worked reasonably well, but it needed a power cycle every now and then
and any custom configuration was difficult. I could never get it to
prioritize traffic properly, and to be honest I just plain missed
<a href="http://www.pfsense.org/">pfSense</a>. I expected one day I would get
around to replacing the router/WAP they supplied, and I finally did at
the end of December. </p>
<p><img alt="picture" src="/images/fbsd.png"></p>
<p>The real question was what do I replace the default gear with? One of
the guys I worked with many years ago had suggested we try
<a href="http://www.pfsense.org/">pfSense</a> for the office and after spending a
few days testing it, I was in love. It's based on
<a href="http://www.freebsd.org/">FreeBSD</a>, uses <a href="http://openbsd.org/faq/pf/">OpenBSD's pf packet
filter</a>, and provides an excellent web
interface. It can be run from a USB memory stick, run from a live-cd, or
installed on just about any common hardware that can run
<a href="http://www.freebsd.org/">FreeBSD</a>. After running multiple pfSense
firewalls for years, I can say it's the most reliable and easiest to use
that I've experienced. </p>
<p>Alternatively, at least for home, I could just buy a Netgear WAP.
They're not half bad, <a href="https://github.com/elvanderb/TCP-32764">except for the
backdoors</a> and generally poor
performance if you have more than a small handful of clients connecting
to them. </p>
<p>An aside: on occasion the weak security of these commodity WAPs can be a
benefit as long as you're not using it on your own network. Once on
vacation, the hotel we stayed in provided free wifi. Unfortunately they
had far more users than their access point could handle. They "solved"
this problem by adding additional access points and suggesting that when
visitors had trouble with "hotel-wifi-1" they try "hotel-wifi-2", and so
on. There were three or four APs, and once you could get connected to
one, your session would work for about two minutes. Suspecting they
were just getting overwhelmed with connections, I thought I would check
to see if I could help by adjusting the configuration. These particular
AP's had never been updated, and there was a known vulnerability I could
exploit. By visiting a specific URL (without authenticating), the unit
would dump it's config file which included the admin password, in
plaintext. Once I had that, whenever I needed the internet for a few
minutes I would just add my mac address to one of the units and limit
access to authorized devices only. Suddenly the WAP performed
beautifully! When I was done, I returned the config to default and the
other patrons could continue using it for a few minutes at a time. </p>
<p>If you're sticking with a commodity wireless AP/firewall, at least try
to install <a href="https://en.wikipedia.org/wiki/OpenWrt">OpenWRT</a> on it,
though you might be starved for ram and cpu if you want to do traffic
shaping and manage VPN connections. But at least you'll have superior
security, and a much more usable interface. </p>
<p>In general though I still maintain you're better off spinning up your
own box using pfSense. It's absolutely "enterprise grade" stuff. It
will easily support OpenVPN for site-to-site tunnels, or just for your
own machine (so when you're on an unfriendly/unknown network you can
encrypt all your traffic over that tunnel back to your home, and out to
the 'net from there!) If you need redundancy, it's trivial to set up a
second pfSense box and using CARP with shared state tables, you can have
invisible failover. </p>
<p>Are you sold on <a href="http://www.pfsense.org/">pfSense</a> yet? You can
certainly spin it up on just about any piece of commodity equipment you
may have lying around, but the power consumption could be a little silly
for home if you happened to use an older PC for this. Unless you have
an unusually beefy link at home you will not need a TON of nic or cpu
horsepower - a small fan-less computer is likely your best best. If you
fear that will not cut it, there are some <a href="http://www.pfsense.org/hardware/index.html#sizing">good sizing recommendations
on the pfSense</a> site
to help guide you. </p>
<p>Assuming you're like me (and I know I am!) the best hardware choice is
an ALIX. You can <a href="http://store.netgate.com/Search.aspx?k=pfsense">buy ALIX kits from the US through
Netgate</a>. You can also
<a href="http://www.pcengines.ch/">buy directly from the manufacturer
(PCEngines)</a>. Using this hardware I had three
NICs plus a Wistron wifi card, all in a tiny aluminum enclosure that
sips tiny amounts of power. Here's exactly what I ordered from
PCEngines for about $175 including fast shipping from Switzerland: </p>
<ul>
<li>alix2d3 ALIX.2D3 system board (500mhz AMD Geode LX CPU)**</li>
<li>case1d2redu Enclosure 3 LAN, red, USB</li>
<li>ac12vus AC adapter 12V US plug for IT equipment</li>
<li>cf2slc CompactFlash card 2GB SLC</li>
<li>(2) pigsma Pigtail cable I-PEX -> reverse SMA</li>
<li>(2) antsmadb Antenna reverse SMA dual band</li>
<li>dnma92 Wistron DNMA92 miniPCI card</li>
<li>(2) Antennas (you will need them, I already had some)</li>
</ul>
<p>Since <a href="https://encrypted.google.com/search?hl=en&q=set%20up%20pfsense%20on%20ALIX">there are already a ton of how-to's on setting up pfSense on an
ALIX</a>,
I won't go through my steps. It was easy to do though, and I'm superbly
satisfied. The box is now directly connected to the ONT (<a href="http://www.dd-wrt.com/wiki/index.php/Verizon_FiOS_-_Using_Your_Own_Router">tips on that
here</a>),
and my network at home is healthier than it's ever been. So what are
you waiting for? Get on it! (Shoot me an email if you get stuck!)</p>Awesome Paper Airplanes2014-02-01T18:08:00-08:002014-02-01T18:08:00-08:00Christopher Aedotag:localconspiracy.com,2014-02-01:/2014/02/awesome-paper-airplanes.html<p><img alt="plane" src="/images/IMG_20140127_130454235.jpg"></p>
<p>When I was growing up, I loved making paper airplanes. I also used to
spend a lot of time at <a href="http://www.msichicago.org/">Chicago's Museum of Science and
Industry</a>. One time when I was there I saw
a kit full of amazing looking plans for planes. They were <a href="http://whitewings.com/">"Whitewings"
model kits</a>, and I …</p><p><img alt="plane" src="/images/IMG_20140127_130454235.jpg"></p>
<p>When I was growing up, I loved making paper airplanes. I also used to
spend a lot of time at <a href="http://www.msichicago.org/">Chicago's Museum of Science and
Industry</a>. One time when I was there I saw
a kit full of amazing looking plans for planes. They were <a href="http://whitewings.com/">"Whitewings"
model kits</a>, and I absolutely loved them. The
plans for the plane were printed on card-stock, and you were meant to
very carefully cut out all the pieces, then glue them together in the
right order. Ultimately you would end up with a fuselage that was
several pieces glued together, then a wing (two or three sheets thick)
and horizontal stabilizer. </p>
<p><img alt="plane" src="/images/plane-plans.png"></p>
<p>A few years ago I <a href="http://goo.gl/bXAc5y">ordered a new kit from Amazon</a>
when we had our first son, thinking I would build them and we would fly
them together one day. Fast forward five years, and the kit was still
sitting on the bookshelf next to what remained from the first kit I got
as a child. I would occasionally notice them and think "man, I should
build some of those!" Then I would remember how long the cutting-out
part took, and the box would stay on the shelf to be saved for "some
other day". </p>
<p>This year for christmas I got my wife a computer-driven die-cutter.
Basically it's a vector printer except with a little xacto blade
instead of a print head. It's the <a href="http://www.silhouetteamerica.com/shop/machines/item-number/silhouette+portrait">Silhouette
Portrait</a>,
and it's pretty freaking awesome. In addition to using it for various
crafts, one thing we knew we would use it a lot for would be making
shadow puppets for the boys (for story time and for their own play). </p>
<p>Almost immediately after she opened it, I started thinking of things <em>I</em>
could do with it. Moments later I thought "this might be the most
ultimate paper airplane maker EVER!" </p>
<p><img alt="plane" src="/images/plane-parts.jpg"></p>
<p>As
soon as we came back home I grabbed the kit, and scanned my first plane.
The software the Silhouette comes with is easy to use, and with
relatively little effort I imported the scan and detected the shapes of
the model components. We had some appropriately thick paper lying
around, so I loaded the machine and set it to work. It was fun to watch
it quickly and carefully cut out all the shapes on the page. </p>
<p>Glueing the components together was quick and easy (don't forget to pile
some books on top to make sure your fuselage dries perfectly straight!)
The finished product is beautiful, and if you ask me it's the best use
we've come up with yet for the "Portrait"! (I'm still thinking of other
cool things we can use it for to cut and glue, and of course I'll post
here when I come up with more uses...) </p>
<p><img alt="plane" src="/images/paperplanes.jpg"></p>Pirates!2013-06-02T04:29:00-07:002013-06-02T04:29:00-07:00Christophertag:localconspiracy.com,2013-06-02:/2013/06/pirates.html<p>The treehouse needed one last thing...</p>
<p><img alt="pirate wheel" src="/images/blogger-image-955210905.jpg"></p>Treehouse2013-05-27T15:37:00-07:002013-05-27T15:37:00-07:00Christophertag:localconspiracy.com,2013-05-27:/2013/05/treehouse.html<p><img alt="moonrise kingdom treehouse" src="/images/moonrise-treehouse.png"></p>
<p>When I was little, we had a tree house we could play in. It was a
fantastic place to hang out for long stretches, and provided an
excellent foundation for countless games of imagination. I'm pretty
sure it was mostly a space ship, but it was probably also a pirate …</p><p><img alt="moonrise kingdom treehouse" src="/images/moonrise-treehouse.png"></p>
<p>When I was little, we had a tree house we could play in. It was a
fantastic place to hang out for long stretches, and provided an
excellent foundation for countless games of imagination. I'm pretty
sure it was mostly a space ship, but it was probably also a pirate ship,
a submarine and who knows how many other things. </p>
<p><img alt="treehouse" src="/images/IMG_1663.JPG"></p>
<p>The yard where we live now doesn't have any decent sized trees. None of
them are big enough to climb, let alone support a tree house. Since
we're also raising two young boys (2.5yrs and 5yrs), something had to be
done. After thinking about it for a while, I decided to get some
redwood and build an elevated platform NEXT to a tree (so technically
it's not a treehouse but it's pretty close!) If I kept it at or under
64 square feet, I wouldn't have to get a permit for it - but it HAD to
be big enough for the boys and I to camp out occasionally, so I figured
8'x8' would do it. I made a very rough sketch of the vague plan so I
would minimize any mistakes (in years past I would tackle something like
this without writing down a thing, and I ALWAYS ended up cutting a
critical piece a few inches short!) </p>
<p><img alt="in progress" src="/images/IMG_1597.JPG"></p>
<p>I started out by digging two post-holes a little less than eight feet
apart, and about a foot from the back wall. I dropped in the posts,
rigged them plumb and poured in cement. After they set, I took some
measurements and started digging the next set of holes. As luck would
have it, I dug straight into a buried sprinkler pipe (and of course
broke the pipe with the post-hole digger). Then I got to spend some
time digging out enough space around the pipe to repair it. </p>
<p>Because of the sprinkler pipe I had to move the second set of posts
closer than planned to the first two - only four feet apart instead of
the five I had planned. It still seemed like it should be sufficiently
sturdy, so I wasn't too worried. I nudged the next two posts into
position so they were more or less square, then cemented those in as
well. </p>
<p><img alt="picture" src="/images/IMG_1630.JPG"></p>
<p>The next weekend I added two 2x6 beams on each post, and then 2x6's
across the front and back, finishing the base of the platform.
Everything still measured square and was coming together nicely.
Joists were added, then corner braces. After that, it was time to put
the decking down. </p>
<p><img alt="picture" src="/images/IMG_1632.JPG"></p>
<p>Of course any decent treehouse needs a hatch for entry, so as I was
putting down the 1x6 flooring, I cut four planks even with the joist. </p>
<p><img alt="picture" src="/images/IMG_1634.JPG"></p>
<p>After I had half the floor nailed down, and the rest of the planks up on
the frame ready to be lined up and nailed, the work site was deemed
"safe" for early trials. The boys carefully joined me, and helped.
They both had a chance to shoot a few nails with the nail gun :) </p>
<p><img alt="picture" src="/images/IMG_1641.JPG"></p>
<p>I added the last posts and started the railings, then got to work on the
hatch and finishing off the railings by adding 3/4" square uprights. </p>
<p><img alt="picture" src="/images/IMG_1649.JPG"></p>
<p>After the hatch, I built the stairs from two 12' 2x6's, and was done!
(For about a day...) </p>
<p><img alt="picture" src="/images/IMG_1654.JPG"></p>
<p>I thought it looked pretty good, but it didn't look like a house. It
also only had shade over half the platform, so on a hot summer day it
was unlikely to see much use. I also expected to spend a lot of time
here on my work from home days, so it was going to need some shade. </p>
<p><img alt="picture" src="/images/IMG_1662.JPG"></p>
<p>The addition of about 40' of 1" PVC and a sail shade we had left over
from a previous incarnation of our back yard solved the problem. It's
probably not sturdy enough to stand up to the santa anas we get, but
luckily it can be easily removed in the event of heavy weather. </p>
<p>So far the boys have only sustained one injury. Anderson was climbing
up or down when I had the aluminum ladder there, and managed to get down
to the ground without using his hands. Or his feet. <a href="https://picasaweb.google.com/lh/photo/pHMI7i5lVzRItZBbH12x7OxKuV7MvOnzPAkBb7lmeKE?feat=directlink">Mostly he just
used his
head</a>
:( But he was none the worse for wear the next day, and it hasn't
deterred him at all - hopefully it's just made him a tiny bit more
careful on the ladder! </p>
<p><img alt="picture" src="/images/IMG_1661.JPG"></p>
<p>It's already a popular choice for reading stories, and they're both pros
at getting up and down and opening and closing the hatch. We're looking
forward to spending a lot of time up there in the years to come - I'm
especially excited to see them having new adventures up there on their
own just like I did when I was growing up! </p>
<p><a href="https://picasaweb.google.com/christopheraedo/Treehouse?authuser=0&feat=directlink">(All the pictures are
here)</a></p>Jeremy Grantham and the stats behind the end of the world2013-05-26T21:35:00-07:002013-05-26T21:35:00-07:00Christophertag:localconspiracy.com,2013-05-26:/2013/05/jeremy-grantham-and-the-stats-behind-the-end-of-the-world.html<p>OK, that's a sensationalist title and was not the topic of this
interview, but resource scarcity and the unbounded growth of world
population was discussed. It's absolutely worth putting this on and
paying attention. You will immediately be more informed on the stats
around the global economy than likely anyone …</p><p>OK, that's a sensationalist title and was not the topic of this
interview, but resource scarcity and the unbounded growth of world
population was discussed. It's absolutely worth putting this on and
paying attention. You will immediately be more informed on the stats
around the global economy than likely anyone else you know :) </p>
<p>Find <a href="http://www.charlierose.com/view/interview/12812">the video here</a>
and <a href="http://www.scribd.com/doc/130919690/Charlie-Rose-Jeremy-Grantham-Transcript">the transcript
here</a>. </p>
<p>Interesting quote: </p>
<blockquote>
<p>When the price of resources are going down it makes getting -- getting
wealthy much easier. And in total the typical commodity dropped by 70
percent over a hundred years. And then it turned on a dime and gave
the whole 100 years back between 2002 and 2008. In six years it gave
back a hundred years of decline. It went up more steeply than it did
in World War II. It's quite amazing no one talked about it, there was
no fuss, there was no World War III. </p>
<p>But suddenly we seem to be running out of cheap resources. And when we
look for the reason, incidentally, it seems to be steady population
growth and perhaps more importantly, the enormous surge in China, 1.3
billion trying to grow faster than the 20 million South Koreans did 20
years ago, growing their demand for resources at 10 percent a year.
And pretty soon you end up with numbers that don`t seem to compute
very easily.</p>
<p>China uses 53 percent of all the cement used on the planet -- not
traded, just used. They use 47 percent of all the coal, 46 percent of
all the iron ore. These are unimaginable numbers. And if they mean to
even slow down to seven percent, itmeans 10 years from now we`ve got
to find another 47 percent coal, just for China.</p>
</blockquote>
</p>From Glance to Boot-From-Volume in 2 minutes flat2013-05-10T23:05:00-07:002013-05-10T23:05:00-07:00Christophertag:localconspiracy.com,2013-05-10:/2013/05/from-glance-to-boot-from-volume-in-2-minutes-flat.html<p>Here’s
a quick list of the steps necessary to pull an image or snapshot from
<a href="http://www.openstack.org/projects/image-service/">Glance</a>, copy it to a
<a href="http://docs.openstack.org/developer/cinder/">Cinder</a> volume, and then
boot from that volume. In an OpenStack environment using local storage
for VMs this is a convenient way to run a VM with a need …</p><p>Here’s
a quick list of the steps necessary to pull an image or snapshot from
<a href="http://www.openstack.org/projects/image-service/">Glance</a>, copy it to a
<a href="http://docs.openstack.org/developer/cinder/">Cinder</a> volume, and then
boot from that volume. In an OpenStack environment using local storage
for VMs this is a convenient way to run a VM with a need for an
unusually large root volume. It also makes VM migration significantly
quicker and easier (vs. KVM block-migration for instance). Used
judiciously, this can also help you get the most out of all your
available resources by combining both local and remote instance
storage.</p>
<p>The following steps were performed inside an
<a href="http://openstack.org/">OpenStack</a> environment on an Ubuntu 12.04
VM.</p>
<ol>
<li>
<p>Get the latest Glance and Nova clients:</p>
<blockquote>
<p>aptitude install python-pip<br>
pip install python-glanceclient<br>
pip install python-novaclient </p>
</blockquote>
</li>
<li>
<p>Find the image (or snapshot) you want:</p>
<blockquote>
<p>glance indexID Name Disk Format <br>
[...]------------------------------------ ------------------------------ -------------------- <br>
[...]3747647c-e43e-4f48-a5b5-59163a45db17 Ubuntu 12.04.1 qcow2 <br>
[...] </p>
</blockquote>
</li>
<li>
<p>Download the image to a local file:</p>
<blockquote>
<p>glance image-download 3747647c-e43e-4f48-a5b5-59163a45db17 --file ubuntu1204.img</p>
</blockquote>
</li>
<li>
<p>Provision a volume and attach to this VM:</p>
<blockquote>
<p>nova volume-create --display-name MyVMVolume 20<br>
+---------------------+--------------------------------------+<br>
| Property | Value |<br>
+---------------------+--------------------------------------+<br>
| status | creating |<br>
| display_name | MyVMVolume |<br>
| attachments | [] |<br>
| availability_zone | nova |<br>
| created_at | 2013-05-08T02:27:51.611264 |<br>
| display_description | None |<br>
| volume_type | None |<br>
| snapshot_id | None |<br>
| size | 20 |<br>
| id | 733a336a-0f68-48f5-91c7-f4f8f4369a63 |<br>
| metadata | {} |<br>
+---------------------+--------------------------------------+ </p>
<p>nova list<br>
+--------------------------------------+--------------------------+--------+------------------------------------+<br>
| ID | Name | Status | Networks |<br>
+--------------------------------------+--------------------------+--------+------------------------------------+<br>
| 48603fde-05a4-4bf9-bd3d-be947f97b29d | cwa1 | ACTIVE | novanetwork=10.12.0.7, 10.50.12.67 |<br>
+--------------------------------------+--------------------------+--------+------------------------------------+ </p>
<p>nova volume-attach 48603fde-05a4-4bf9-bd3d-be947f97b29d 733a336a-0f68-48f5-91c7-f4f8f4369a63 /dev/vdc<br>
+----------+--------------------------------------+<br>
| Property | Value |<br>
+----------+--------------------------------------+<br>
| device | /dev/vdc |<br>
| serverId | 48603fde-05a4-4bf9-bd3d-be947f97b29d |<br>
| id | 733a336a-0f68-48f5-91c7-f4f8f4369a63 |<br>
| volumeId | 733a336a-0f68-48f5-91c7-f4f8f4369a63 |<br>
+----------+--------------------------------------+ </p>
</blockquote>
</li>
<li>
<p>Convert the image from qcow2 to raw and send the output to the attached
volume:</p>
<blockquote>
<p>qemu-img convert -f qcow2 -O raw ubuntu1204.img /dev/vdc</p>
</blockquote>
</li>
<li>
<p>Detach the volume</p>
<blockquote>
<p>nova volume-detach 48603fde-05a4-4bf9-bd3d-be947f97b29d 733a336a-0f68-48f5-91c7-f4f8f4369a63</p>
</blockquote>
</li>
<li>
<p>Launch the VM from that volume (NOTE: you have to specify an image,
but nova won’t actually USE that image, your VM will boot from the
volume you just created)</p>
<blockquote>
<p>nova boot --image=3747647c-e43e-4f48-a5b5-59163a45db17 --flavor 2 --block_device_mapping vda=733a336a-0f68-48f5-91c7-f4f8f4369a63:::0 --key_name caedo VM-on-Volume<br>
+-------------------------------------+--------------------------------------+<br>
| Property | Value |<br>
+-------------------------------------+--------------------------------------+<br>
| status | BUILD |<br>
| updated | 2013-05-08T02:38:56Z |<br>
| OS-EXT-STS:task_state | scheduling |<br>
| OS-EXT-SRV-ATTR:host | None |<br>
| key_name | caedo |<br>
| image | Ubuntu 12.04.1 |<br>
| hostId | |<br>
| OS-EXT-STS:vm_state | building |<br>
| OS-EXT-SRV-ATTR:instance_name | instance-00000066 |<br>
| OS-EXT-SRV-ATTR:hypervisor_hostname | None |<br>
| flavor | m1.small |<br>
| id | 783f3f13-a595-4aed-affa-012cedbe7897 |<br>
| security_groups | [{u'name': u'default'}] |<br>
| user_id | dcb614827c79456d8f95150b393632b3 |<br>
| name | VM-on-Volume |<br>
| adminPass | y2PbhKDPYWjp |<br>
| tenant_id | e89935d735304e79bc39a8835b42d20e |<br>
| created | 2013-05-08T02:38:56Z |<br>
| OS-DCF:diskConfig | MANUAL |<br>
| accessIPv4 | |<br>
| accessIPv6 | |<br>
| progress | 0 |<br>
| OS-EXT-STS:power_state | 0 |<br>
| metadata | {} |<br>
| config_drive | |<br>
+-------------------------------------+--------------------------------------+ </p>
</blockquote>
</li>
</ol>
<p>And that’s it - now your VM base image is running from a volume!</p>Create an OpenStack machine image inside an OpenStack environment2013-03-19T02:02:00-07:002013-03-19T02:02:00-07:00Christopher Aedotag:localconspiracy.com,2013-03-19:/2013/03/create-an-openstack-machine-image-inside-an-openstack-environment.html<p>(Alternate title: make booting from an ISO image in OpenStack useful) </p>
<p>If you have access to a server with plenty of disk space and CPU that
supports the same hypervisor your cloud uses, it’s relatively easy to
<a href="http://docs.openstack.org/trunk/openstack-compute/admin/content/creating-custom-images.html">create an OpenStack machine
image</a>.
You can also pretty easily do this …</p><p>(Alternate title: make booting from an ISO image in OpenStack useful) </p>
<p>If you have access to a server with plenty of disk space and CPU that
supports the same hypervisor your cloud uses, it’s relatively easy to
<a href="http://docs.openstack.org/trunk/openstack-compute/admin/content/creating-custom-images.html">create an OpenStack machine
image</a>.
You can also pretty easily do this on a desktop/laptop machine using
VirtualBox (though it can be a little more complicated). In either
case, you have to make sure you’ve got the right drivers for your target
environment, and sometimes you’ll find you made a slight mistake early
on only after you’ve gone all the way down the path of converting and
importing an image of anywhere from a few hundred megs up to several
gigs. </p>
<p>An alternative approach is to create the machine image within the
environment itself. OpenStack allows you to import and boot from an
ISO, though the work is <a href="https://wiki.openstack.org/wiki/BootFromISO">not yet
complete</a>. The ephemeral
disk that is attached to the instance can’t be snapshotted, so even
after the OS install there’s no way to save or use the disk you
installed to. This will probably be addressed soon (likely fixed in
Grizzly, as long as <a href="https://bugs.launchpad.net/nova/+bug/914484">this
bug</a> gets resolved). When
fixed, it should allow you to boot from ISO with a local writable disk
attached. Then you could install the OS on that disk, snapshot it, and
you’re done! </p>
<p>While you’re waiting for that to be resolved, here’s something you can
do right now if you have access to an OpenStack environment with block
storage available. This relatively easy approach allows you to boot
from ISO, install an OS on the attached volume, and then create an image
based on that volume. You’ll also need to launch an “image prep” VM in
that environment so you have a place to install the Nova, Glance and the
Qemu utils. After you install the OS on the block storage volume,
you’ll attach that volume to this image prep VM where you’ll convert it
to qcow2 format and import into the environment. The whole process from
start to finish is less than an hour, and most of that time is either
waiting for the OS install or the zero-fill. </p>
<ol>
<li>
Import the ISO into your OpenStack environment
</li>
<li>
Launch a VM using that ISO
</li>
<li>
Provision and attach a volume to that VM
</li>
- Be sure to make the volume large enough to support your OS install
<li>
Launch the VNC console for the VM
</li>
<li>
Install OS on iSCSI-attached volume
</li>
<li>
Detach that volume from the ISO-booted VM
</li>
<li>
**[OPTIONAL]** Launch a VM from that volume if you want to do any prep
here
</li>
- To boot from volume you’ll need to find the volume ID (nova
volume-list), and the ID of a valid image - Nova won’t boot that
image, but there’s a bug that requires you to specify an image even
when booting from volume. The command looks like:
<span style="font-family: Courier New, Courier, monospace;">nova
boot --image \<IMAGE ID\> --flavor 2 \\
--block\_device\_mapping vda=\<VOLUME ID\>:::0 vm-from-volume</span>
- Add cloud-init or something similar if you want it to grab hostname,
SSH keys, etc. from the metadata server
- Remove any files you don’t want to see in every image (any temp
files you might have created during prep, etc.)
- Zero-fill the free space on the disk so the qcow image will be as
small as possible (something like “dd if=/dev/zero of=/junk; rm -f
/junk”)
- Shutdown the VM and detach the volume when done
<li>
Launch a VM for image preparation (I prefer an [Ubuntu UEC VM
image](http://cloud-images.ubuntu.com/) for this) and install the
necessary tools:
<span style="font-family: Courier New, Courier, monospace;">apt-get
install qemu-utils glance-client python-novaclient</span>
</li>
<li>
Attach the volume that has your new OS to the image prep VM (note which
device it was attached to, in this example it was /dev/vdc)
</li>
<li>
Convert the image:
<span style="font-family: Courier New, Courier, monospace;">qemu-img
convert -c -f raw -O qcow2 /dev/vdc newmachine-qcow.img</span>
</li>
<li>
Import your image:
<span style="font-family: Courier New, Courier, monospace;">glance add
name=”New Image” container\_format=bare \\
disk\_format=qcow2 is\_public=1 \< newmachine-qcow.img</span>
</li>
</ol>
<p>All done! You should see that image in glance now, and you’ll be able
to launch as many as you need. In my experience this was quicker than
building on a remote machine and importing, and a major advantage was
that my prep and testing was all in the same environment so I could be
sure all the right drivers were there before importing into glance. </p>
<p>Coming soon, <a href="https://review.openstack.org/#/c/19808/">this Cinder patch by Avishay
Traeger</a> will automate the
process of putting the machine image on an iSCSI volume directly into
glance (obviating steps 8-11). It will also make it easy to copy an
image directly from glance onto a volume (combine that with
boot-from-volume and you’ve got the analog of an EBS root volume on
AWS!) </p>
<p><a href="mailto:doc@aedo.net">Let me know</a> if this was helpful, or if you find
any ways to improve the process! </p>Sitting on your ass is killing you2012-10-21T19:36:00-07:002012-10-21T19:36:00-07:00Christopher Aedotag:localconspiracy.com,2012-10-21:/2012/10/sitting-on-your-ass-is-killing-you.html<p>This is not the first time I've said <a href="/2012/09/no-news-is-good-news.html">don't watch
TV</a>,
or <a href="/2010/08/get-up-stand-up.html">don't sit at
work</a>. But
<a href="http://well.blogs.nytimes.com/2012/10/17/get-up-get-out-dont-sit/">this new article from NY
times</a>
references some new studies that make the dangers of lethargy all the
more vivid. </p>
<blockquote>
<p>"Every single hour of television watched after the age of 25 reduces
the …</p></blockquote><p>This is not the first time I've said <a href="/2012/09/no-news-is-good-news.html">don't watch
TV</a>,
or <a href="/2010/08/get-up-stand-up.html">don't sit at
work</a>. But
<a href="http://well.blogs.nytimes.com/2012/10/17/get-up-get-out-dont-sit/">this new article from NY
times</a>
references some new studies that make the dangers of lethargy all the
more vivid. </p>
<blockquote>
<p>"Every single hour of television watched after the age of 25 reduces
the viewer’s life expectancy by 21.8 minutes. By comparison, smoking
a single cigarette reduces life expectancy by about 11 minutes, the
authors said."</p>
</blockquote>
<p>Of course that prompts me to quote again from one of my favorite old
articles <a href="http://www.strike-the-root.com/3/russell/russell4.html">"Turn It Off" by Craig
Russel</a> (read
the whole article, it'll only take you a minute and it's well worth
it!) </p>
<blockquote>
<p>"Each of us only has so much time allotted to him. We glow but a short
while upon this earth, and then the flame dies. Why would we spend
even a second of it in the fatal radiation of an infernal device that
promises 'entertainment,' that promises 'enlightenment,' but delivers
only weak facsimiles?"</p>
</blockquote>
</p>No news is good news2012-09-26T03:26:00-07:002012-09-26T03:26:00-07:00Christophertag:localconspiracy.com,2012-09-26:/2012/09/no-news-is-good-news.html<blockquote>
<p>"Chances are you have one of the most insidiously dangerous objects
ever created ' and one of the State's most powerful tools of
domination ' in your living room right now. You may very well have one
in your bedroom, too, and in your basement.<br>
It's insidious because most Americans don't think …</p></blockquote><blockquote>
<p>"Chances are you have one of the most insidiously dangerous objects
ever created ' and one of the State's most powerful tools of
domination ' in your living room right now. You may very well have one
in your bedroom, too, and in your basement.<br>
It's insidious because most Americans don't think of them as
dangerous, nor do they think of them as tools of State domination;
otherwise they wouldn't have them in their homes. In fact, most
Americans love them. Most can't go a single day without them. You
might even say they were addicted to them." (<a href="http://www.strike-the-root.com/3/russell/russell4.html">Craig Russel, "Turn It
Off"</a>)</p>
<p>"The trouble with the news is that everybody knows everything too fast
and too often and too many times. News had always been bad. The tiger
that lives in the forest just ate your wife and kids, Joe. There are
no fat grub worms under the rotten logs this year, Al. Those sickies
in the village on the other side of the mountain are training hairy
mammoths to stomp us flat, Pete. They nailed up two thieves and one
crackpot, Mary. So devote wire service people and network people and
syndication people to gathering up all the bad news they can possibly
dredge and comb and scrape out of a news-tired world and have them
spray it back at everybody in constant streams of electrons, and two
things happen. First, we all stop listening, so they have to make it
even more horrendous to capture our attention. Secondly we all become
even more convinced that everything has gone rotten, and there is no
hope at all, no hope at all. In a world of no hope the motto is
<em>semper fidleis</em>, which means in translation, "Every week is
screw-your-buddy week and his wife too, if he's out of town." (John D.
MacDonald/A Tan and Sandy Silence)</p>
</blockquote>
</p>Better living through chemistry2012-09-26T03:24:00-07:002012-09-26T03:24:00-07:00Christopher Aedotag:localconspiracy.com,2012-09-26:/2012/09/better-living-through-chemistry.html<p>It's absolutely amazing what big pharma gets away with, but it seems
like so few people are aware or the least bit concerned. We might never
know <a href="http://www.theweek.co.uk/us/46535/when-half-million-americans-died-and-nobody-noticed">how many people Merck & Co. killed with
Vioxx</a>
(maybe half a million?). The more you read, the more you find one scary
story …</p><p>It's absolutely amazing what big pharma gets away with, but it seems
like so few people are aware or the least bit concerned. We might never
know <a href="http://www.theweek.co.uk/us/46535/when-half-million-americans-died-and-nobody-noticed">how many people Merck & Co. killed with
Vioxx</a>
(maybe half a million?). The more you read, the more you find one scary
story after another, with no end in sight. <a href="http://www1.cs.columbia.edu/~unger/articles/safety.html">The FDA won't do anything
about it (safety last is their
motto!)</a>, our
only hope is that people like Ben Goldacre will get more recognition and
exposure.</p>
<p><a href="http://en.wikipedia.org/wiki/Ben_Goldacre">Ben Goldacre</a> (a writer,
doctor and psychologist) knows medicine. He's trying to shine a bright
light on the deadly safety issues surrounding the failed regulatory
processes meant to ensure the pharmaceutical industry stays honest. <a href="http://www.guardian.co.uk//business/2012/sep/21/drugs-industry-scandal-ben-goldacre/print?mobile-redirect=false">In
a recent article in The
Guardian</a>
he tells an incredible story about prescribing a drug he thought was
safe, when in fact the manufacturer knew not only did it NOT help
children battle depression, it actually made them more likely to commit
suicide! </p>
<blockquote>
<p>"In October 2010, a group of researchers was finally able to bring
together all the data that had ever been collected on reboxetine, both
from trials that were published and from those that had never appeared
in academic papers. When all this trial data was put together, it
produced a shocking picture. Seven trials had been conducted comparing
reboxetine against a placebo. Only one, conducted in 254 patients, had
a neat, positive result, and that one was published in an academic
journal, for doctors and researchers to read. But six more trials were
conducted, in almost 10 times as many patients. All of them showed
that reboxetine was no better than a dummy sugar pill. None of these
trials was published. I had no idea they existed."</p>
</blockquote>
<p>He <a href="http://www.amazon.co.uk/dp/0007350740/ref=nosim?tag=bs0b-21">wrote a
book</a> on
this topic that's already getting rave reviews. It's also getting panned
by industry shills who would much rather the public keep their heads in
the sand when it comes to safety and efficacy of the drugs they're
trying to sell us. In his intro to the book, he sums up the premise in a
single (horrifying) paragraph "that will seem so absurd – so ludicrously
appalling – that when you read it, you’ll probably assume I’m
exaggerating." </p>
<blockquote>
<p>"Drugs are tested by the people who manufacture them, in poorly
designed trials, on hopelessly small numbers of weird,
unrepresentative patients, and analysed using techniques which are
flawed by design, in such a way that they exaggerate the benefits of
treatments. Unsurprisingly, these trials tend to produce results that
favour the manufacturer. When trials throw up results that companies
don’t like, they are perfectly entitled to hide them from doctors and
patients, so we only ever see a distorted picture of any drug’s true
effects. Regulators see most of the trial data, but only from early on
in its life, and even then they don’t give this data to doctors or
patients, or even to other parts of government. This distorted
evidence is then communicated and applied in a distorted fashion. In
their forty years of practice after leaving medical school, doctors
hear about what works through ad hoc oral traditions, from sales reps,
colleagues or journals. But those colleagues can be in the pay of drug
companies – often undisclosed – and the journals are too. And so are
the patient groups. And finally, academic papers, which everyone
thinks of as objective, are often covertly planned and written by
people who work directly for the companies, without disclosure.
Sometimes whole academic journals are even owned outright by one drug
company. Aside from all this, for several of the most important and
enduring problems in medicine, we have no idea what the best treatment
is, because it’s not in anyone’s financial interest to conduct any
trials at all. These are ongoing problems, and although people have
claimed to fix many of them, for the most part, they have failed; so
all these problems persist, but worse than ever, because now people
can pretend that everything is fine after all."</p>
</blockquote>
<p>Start up a conversation with your friends, the only way to get more
people thinking about this stuff is to get more people talking about it!</p>1984, surveillance framework and your permanent record2012-08-16T19:40:00-07:002012-08-16T19:40:00-07:00Christopher Aedotag:localconspiracy.com,2012-08-16:/2012/08/1984-surveillance-framework-and-your-permanent-record.html<p>Now THIS one definitely sounds appropriate for a blog with "conspiracy"
in the title! I've been collecting a bunch of related stories for
several months now with the intention of turning it into a blog post.
Sadly I've had way too much other stuff to do lately, so I thought …</p><p>Now THIS one definitely sounds appropriate for a blog with "conspiracy"
in the title! I've been collecting a bunch of related stories for
several months now with the intention of turning it into a blog post.
Sadly I've had way too much other stuff to do lately, so I thought I
might as well just throw this out there for the two or three people who
check out my blog now and then. </p>
<p>For the tl;dr folks: the confluence of social networking and big data
means all those people sharing every bit of their private lives with the
world at large (or even when they think they're only sharing with a
small group of friends) are giving corporations and governments a whole
ton of data they should not have. For the people giving up the data,
it's going to mean what they though was private will be scrutinized by
employers, insurers, marketers and governments. </p>
<blockquote>
<p>"Why should I care about surveillance if I have nothing to hide?"
(<a href="http://www.aclu.org/blog/technology-and-liberty-national-security/plenty-hide">from ACLU
blog</a>)</p>
<p>"One can usually think of something that even the most open person
would want to hide. As a commenter to my blog post noted, "If you have
nothing to hide, then that quite literally means you are willing to
let me photograph you naked? And I get full rights to that
photograph—so I can show it to your neighbors?"" (<a href="http://chronicle.com/article/Why-Privacy-Matters-Even-if/127461/">from
Chronicle</a>)</p>
<p>"...he visited Disneyland, and went on a ride, the theme park offered
him the photo of himself and his girlfriend to buy – with his credit
card information already linked to it. He noted that he had never
entered his name or information into anything at the theme park, or
indicated that he wanted a photo, or alerted the humans at the ride to
who he and his girlfriend were – so, he said, based on his
professional experience, the system had to be using facial recognition
technology. He had never signed an agreement allowing them to do so,
and he declared that this use was illegal. He also claimed that Disney
had recently shared data from facial-recognition technology with the
United States military.<br>
Yes, I know: it sounds like a paranoid rant.<br>
Except that it turned out to be true." (<a href="http://www.guardian.co.uk/commentisfree/2012/aug/15/new-totalitarianism-surveillance-technology">from The
Guardian</a>)</p>
</blockquote>
<p>Insurance companies already review what you're sharing publicly to
determine whether or not you're a risk worth taking on. (That facebook
pic of you eating a krispy-kreme probably means you're an unhealthy
slob, better charge you double for that health insurance!) </p>
<blockquote>
<p>"A SWISS life-settlements firm called Rigi Capital Partners (RCP)
recently considered buying the life-insurance policy of an elderly
woman apparently suffering from dementia. RCP would take over payment
of the policy premiums and receive the full death benefit when she
passed away. Her medical records revealed that she had forgotten even
her son's birthday. But Robin Willi, RCP's owner, searched Facebook to
find out more about her. Her profile suggested she had a vibrant
social life, not dementia. Reckoning that she was much healthier than
she wanted to appear, Mr Willi did not offer to buy her policy."
(<a href="http://www.economist.com/node/21556263">from The Economist</a>)</p>
</blockquote>
<p>Speaking of facebook, <a href="http://www.technologyreview.com/featured-story/428150/what-facebook-knows/">they know way more about you than would
imagine</a>,
and they are keeping it forever. Eventually <a href="http://face.com/blog/facebook-acquires-face-com/">any video or picture you
show up in</a> even
briefly will be linked back to you. It won't require your approval, and
it won't even be made public, but the link is there for them to use as
they please. Combined with the location data tied to that stuff, it
will get harder and harder to leave your house without every thing you
do being logged and analyzed. Gathering all this information about you
and linking it all together helps the people with that info determine
all kinds of stuff you would probably rather they not know. Where do
you like to spend your time? Who do you hang out with? Are you sick?
Pregnant? This is just scratching the surface... </p>
<blockquote>
<p>"The piece described how Target identifies customers who are pregnant
(sometimes before their own family members know) by tracking
customers’ purchases and identifying patterns in their behavior. It
then uses that insight to sell them baby-related goods." (<a href="http://www.aclu.org/blog/technology-and-liberty/eight-problems-big-data">from ACLU
blog</a>)</p>
</blockquote>
<p>The schools can't afford to pay for the same level of access as the
advertisers and governments, but that doesn't stop them from <a href="http://redtape.nbcnews.com/_news/2012/05/18/11747289-school-officials-facebook-rummaging-prompts-moms-privacy-crusade">trying to
force their way in
anyhow</a>. </p>
<p>Finally, one of the most important videos you should watch with your
family. Why you should not talk to the police, even if you think you
are completely innocent and have nothing to hide. Explained by a
fantastic attorney, and confirmed by a seasoned police detective. <a href="http://www.youtube.com/watch?v=i8z7NC5sgik">Part
1</a>, and <a href="http://www.youtube.com/watch?v=08fZQWjDVKE">Part
2</a>.</p>Inspired by our founders2012-08-14T04:40:00-07:002012-08-14T04:40:00-07:00Christophertag:localconspiracy.com,2012-08-14:/2012/08/inspired-by-our-founders.html<blockquote>
<p>"AMERICA has a proud history of drinking on the job. Craftsmen who built
the first government buildings in the 17th century were sometimes paid
in brandy. The 19th-century railroaders who laid the foundations of
modern America were notoriously thirsty." </p>
</blockquote>
<p><a href="http://www.economist.com/node/21560265">The Economist</a></p>
<p>Obviously for the sake of our country I need …</p><blockquote>
<p>"AMERICA has a proud history of drinking on the job. Craftsmen who built
the first government buildings in the 17th century were sometimes paid
in brandy. The 19th-century railroaders who laid the foundations of
modern America were notoriously thirsty." </p>
</blockquote>
<p><a href="http://www.economist.com/node/21560265">The Economist</a></p>
<p>Obviously for the sake of our country I need to make a kegerator for the
office and start brewing more often!</p>Best home-made play-doh EVER2012-05-26T23:18:00-07:002012-05-26T23:18:00-07:00Christopher Aedotag:localconspiracy.com,2012-05-26:/2012/05/best-home-made-play-doh-ever.html<p>If you have kids, you probably love playing with them and making things
together. One of the best things you can do for them is to encourage
imaginative play, and few things enable imagination in a young mind
better than a nice lump of play-doh. </p>
<p>After experimenting with several different …</p><p>If you have kids, you probably love playing with them and making things
together. One of the best things you can do for them is to encourage
imaginative play, and few things enable imagination in a young mind
better than a nice lump of play-doh. </p>
<p>After experimenting with several different variations, my wife found
this simple yet excellent play-doh recipe. It is the best version of
home made play-doh by a long shot. Have fun with it! </p>
<p>In a medium pot, combine and stir the following: </p>
<ul>
<li>1 cup warm water</li>
<li>1 cup white flour</li>
<li>1/4 cup salt</li>
<li>2 tsp cream of tartar</li>
<li>1 tbsp vegetable oil</li>
<li>1 packet of kool aid (optional, adds color and a nice scent too)</li>
</ul>
<p>Now heat pot over low-medium heat while stirring constantly. Eventually
the dough will combine into a ball. Remove from heat, and make sure
it's all well combined. Flatten the ball out on a piece of wax paper to
cool, and start playing whenever you think it's ready for those little
hands! </p>
<p>Be sure to store in an air-tight bag or container when done, to prevent
drying out. If a batch does dry a bit, it can be revived by kneading in
a little water and a little vegetable oil. </p>
<p>There you have it, the best home-made play-doh EVER!</p>Google voice, Asterisk, and free US phone service2012-05-13T17:12:00-07:002012-05-13T17:12:00-07:00Christopher Aedotag:localconspiracy.com,2012-05-13:/2012/05/google-voice-asterisk-and-free-us-phone-service.html<p>[<strong>EDIT 20120-05-13</strong>: You can follow these steps (though by now they're
already fairly outdated), and end up with a mostly functional home phone
system connected to a free Google Voice number. It will break often, as
Google makes changes, and your Asterisk box needs updating, and who
knows what else …</p><p>[<strong>EDIT 20120-05-13</strong>: You can follow these steps (though by now they're
already fairly outdated), and end up with a mostly functional home phone
system connected to a free Google Voice number. It will break often, as
Google makes changes, and your Asterisk box needs updating, and who
knows what else. OR, you can skip all that, spend \$45 and be done with
it. That's what I did. This little box (<a href="http://www.amazon.com/OBi110-Service-Bridge-Telephone-Adapter/dp/B0045RMEPI">OBi110 VoIP service
bridge</a>)
is one of the best purchases I've ever made. HIGHLY recommend it. One
trips abroad (Europe and Manila) I used free hotel wifi to make calls
over my iPhone with the free OBiTALK client, and as long as the
connection was moderately decent, the quality was excellent!] </p>
<p>In 2009 Google purchased a company offering VoIP phone numbers called
GrandCentral. That allowed Google to start giving away US phone numbers.
The idea was that you would get this new phone number and you could keep
it forever - and any calls to that phone number would forward to the
phone(s) of your choosing. It also offers voice mail service, and when
you get a message, you can have a transcript of that message sent to you
via email (as well as the message itself, as an audio attachment.) One
of the most powerful features was that you could set up several phone
numbers to forward the call to (your cell phone, home phone and office
phone). Any incoming call to your Google Voice number would ring on ALL
phones at the same time, and the call would be routed to whichever phone
you picked up first! </p>
<p>It's a great idea, but it is kind of a hassle to use it for making
outbound calls from a regular phone- and if you're not making calls from
that number, it's much less likely people will remember to use that one
when trying to reach you. You CAN make phone calls from your computer
(right in your web browser when connected to gmail), but not too many
people like to do that - and it's certainly not convenient for visitors
or others in the house who need to use the phone. There was another
company (Gizmo5) that allowed you to connect to your GrandCentral number
via "voice over IP", so using the two systems was a good alternative to
VoIP services like Vonage. Unfortunately Google bought Gizmo5 and
suspended new signups while they worked on integrating their
technology. </p>
<p>There were some workarounds that let you use the free open-source phone
switching system Asterisk to connect to your GV number from a VoIP
phone, but they still required phone service through another provider,
so it was going to cost you a subscription one way or another. </p>
<p>Lucky for us, the latest version of <a href="http://www.asterisk.org/">Asterisk
(v1.8)</a> included a module to connect directly
to your GV number, giving you a free phone number, potentially for
life! </p>
<p>There is already an <a href="http://nerdvittles.com/?p=705">"everything included"
installer</a> available from NerdVittles,
but it has WAY more than you need if all you want is to connect your GV
number to a regular phone at home. To that end, I'll outline the steps I
followed to get a regular wireless phone connected to my Google Voice
number for making and receiving calls.<br>
<strong>[UPDATE: The NerdVittles package is pretty much awesome. It's got a
lot included, but it's all good. The install is fast and painless, and
a little easier than what I outlined... I switched to this one at home,
and suggest you do the same if you want to tie your Google Voice account
to a phone.]</strong> </p>
<p>You'll need a spare computer (but it does NOT need to be powerful or
have a ton of RAM or disk space - you might even be able to use a free
Amazon EC2 instance). You'll also need a SIP/POTS adapter, <a href="http://www.voipsupply.com/grandstream-gs-286">like this
\$30 unit from
Grandstream</a>. You'll also
need to be nerdy enough to have installed Linux once or twice before,
though you do NOT need to be an expert to do this... What follows are
all the steps you'll need to set up and configure an absolutely minimal
Asterisk installation. </p>
<p>Install <a href="http://centos.org/">CentOS 5.5</a> - choose the "Server" install.
After installation, run the following commands: </p>
<blockquote>
<div class="highlight"><pre><span></span><code><span class="n">yum</span><span class="w"> </span><span class="o">-</span><span class="n">y</span><span class="w"> </span><span class="n">updateyum</span><span class="w"> </span><span class="o">-</span><span class="n">y</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">bison</span><span class="w"> </span><span class="n">bison</span><span class="o">-</span><span class="n">devel</span><span class="w"> </span><span class="n">ncurses</span><span class="w"> </span><span class="n">ncurses</span><span class="o">-</span><span class="n">devel</span><span class="w"> </span>\<span class="n">zlib</span><span class="w"> </span><span class="n">zlib</span><span class="o">-</span><span class="n">devel</span><span class="w"> </span><span class="n">openssl</span><span class="w"> </span><span class="n">openssl</span><span class="o">-</span><span class="n">devel</span><span class="w"> </span><span class="n">gnutls</span><span class="o">-</span><span class="n">devel</span><span class="w"> </span>\<span class="n">subversion</span><span class="w"> </span><span class="n">automake</span><span class="w"> </span><span class="n">gcc</span><span class="w"> </span><span class="n">gcc</span><span class="o">-</span><span class="n">c</span><span class="o">++</span><span class="w"> </span><span class="n">libtool</span><span class="w"> </span><span class="n">gnutls</span><span class="w"> </span>\<span class="n">gnutls</span><span class="o">-</span><span class="n">devel</span><span class="w"> </span><span class="n">texinfo</span><span class="w"> </span><span class="n">kernel</span><span class="o">-</span><span class="n">devel</span>
</code></pre></div>
</blockquote>
<p>Download Iksemel from <a href="http://code.google.com/p/iksemel/">http://code.google.com/p/iksemel/</a>, expand in
/usr/src, then run:<br>
<span style="font-family: 'courier new';"></span> </p>
<blockquote>
<div class="highlight"><pre><span></span><code>./configure --prefix=/usrmakemake check [be sure all tests pass!]make install
</code></pre></div>
</blockquote>
<p><a href="http://downloads.asterisk.org/pub/telephony/asterisk/">Download the newest version of
Asterisk</a>, expand
in /usr/src, then run: </p>
<blockquote>
<div class="highlight"><pre><span></span><code>./configure --prefix=/usrmakemake install
</code></pre></div>
</blockquote>
<p>Add the following files in /etc/asterisk:<br>
logger.conf: </p>
<blockquote>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">logfiles</span><span class="o">]</span><span class="n">console</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">warning</span><span class="p">,</span><span class="n">notice</span><span class="p">,</span><span class="n">error</span>
</code></pre></div>
</blockquote>
<p>modules.conf: </p>
<blockquote>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">modules</span><span class="o">]</span><span class="n">autoload</span><span class="o">=</span><span class="n">yes</span>
</code></pre></div>
</blockquote>
<p>gtalk.conf: </p>
<blockquote>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">general</span><span class="o">]</span><span class="n">context</span><span class="o">=</span><span class="n">google</span><span class="o">-</span><span class="ow">in</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">Context</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="k">dump</span><span class="w"> </span><span class="k">call</span><span class="w"> </span><span class="n">intoallowguest</span><span class="o">=</span><span class="n">yes</span><span class="o">[</span><span class="n">guest</span><span class="o">]</span><span class="n">disallow</span><span class="o">=</span><span class="n">allallow</span><span class="o">=</span><span class="n">ulaw</span><span class="o">[</span><span class="n">myaccount-gtalk</span><span class="o">]</span><span class="n">username</span><span class="o">=[</span><span class="n">YOUR GMAIL USER</span><span class="o">]</span><span class="nv">@gmail</span><span class="p">.</span><span class="n">comdisallow</span><span class="o">=</span><span class="n">allallow</span><span class="o">=</span><span class="n">ulawcontext</span><span class="o">=</span><span class="n">google</span><span class="o">-</span><span class="n">inconnection</span><span class="o">=</span><span class="n">gtalkconnection</span>
</code></pre></div>
</blockquote>
<p>jabber.conf:<br>
<span style="font-size: 85%;"><span
style="font-family: 'courier new';"></span></span> </p>
<blockquote>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">gtalkconnection</span><span class="o">]</span><span class="w"> </span><span class="n">type</span><span class="o">=</span><span class="n">clientserverhost</span><span class="o">=</span><span class="n">talk</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">comusername</span><span class="o">=[</span><span class="n">YOUR GMAIL USER</span><span class="o">]</span><span class="nv">@gmail</span><span class="p">.</span><span class="n">com</span><span class="o">/</span><span class="n">asterisksecret</span><span class="o">=[</span><span class="n">YOU GMAIL PASSWORD</span><span class="o">]</span><span class="n">statusmessage</span><span class="o">=</span><span class="ss">"I am asterisk"</span><span class="n">status</span><span class="o">=</span><span class="n">xaway</span>
</code></pre></div>
</blockquote>
<p>sip.conf:<br>
<span style="font-family: 'courier new'; font-size: 85%;"></span> </p>
<blockquote>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">general</span><span class="o">]</span><span class="n">port</span><span class="o">=</span><span class="mi">5060</span><span class="n">bindaddr</span><span class="o">=</span><span class="mf">0.0.0.0</span><span class="n">disallow</span><span class="o">=</span><span class="n">allallow</span><span class="o">=</span><span class="n">ulaw</span><span class="o">[</span><span class="n">101</span><span class="o">]</span><span class="n">type</span><span class="o">=</span><span class="n">peerhost</span><span class="o">=</span><span class="n">dynamicsecret</span><span class="o">=</span><span class="n">asecretpasswordcontext</span><span class="o">=</span><span class="n">users</span>
</code></pre></div>
</blockquote>
<p>extensions.conf: </p>
<blockquote>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">default</span><span class="o">]</span><span class="n">exten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">s</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="k">Set</span><span class="p">(</span><span class="n">CALLERID</span><span class="p">(</span><span class="n">name</span><span class="p">)</span><span class="o">=</span><span class="err">${</span><span class="n">DB</span><span class="p">(</span><span class="n">cidname</span><span class="o">/</span><span class="err">${</span><span class="n">CALLERID</span><span class="p">(</span><span class="n">num</span><span class="p">)</span><span class="err">}</span><span class="p">)</span><span class="err">}</span><span class="p">)</span><span class="n">exten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">s</span><span class="p">,</span><span class="n">n</span><span class="p">,</span><span class="n">Dial</span><span class="p">(</span><span class="n">SIP</span><span class="o">/</span><span class="mi">101</span><span class="p">,</span><span class="mi">10</span><span class="p">)</span><span class="n">exten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">s</span><span class="p">,</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="n">Hangupexten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="mi">101</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">Dial</span><span class="p">(</span><span class="n">SIP</span><span class="o">/</span><span class="mi">101</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span><span class="o">[</span><span class="n">google-in</span><span class="o">]</span><span class="n">exten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="o">[</span><span class="n">YOUR GMAIL USER</span><span class="o">]</span><span class="nv">@gmail</span><span class="p">.</span><span class="n">com</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">Dial</span><span class="p">(</span><span class="n">SIP</span><span class="o">/</span><span class="mi">101</span><span class="p">,</span><span class="w"> </span><span class="mi">180</span><span class="p">,</span><span class="w"> </span><span class="n">D</span><span class="p">(</span><span class="err">:</span><span class="mi">1</span><span class="p">))</span><span class="o">[</span><span class="n">stations</span><span class="o">]</span><span class="n">exten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="mi">101</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">Macro</span><span class="p">(</span><span class="n">phone</span><span class="p">);</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">Route</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="k">call</span><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">google</span><span class="w"> </span><span class="n">voice</span><span class="w"> </span><span class="n">bridge</span><span class="o">[</span><span class="n">gv-outbound</span><span class="o">]</span><span class="p">;</span><span class="n">append</span><span class="w"> </span><span class="n">an</span><span class="w"> </span><span class="n">area</span><span class="w"> </span><span class="n">code</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">necessaryexten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">_NXXXXXX</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="k">Set</span><span class="p">(</span><span class="n">CALLERID</span><span class="p">(</span><span class="n">dnid</span><span class="p">)</span><span class="o">=</span><span class="mi">1323</span><span class="err">${</span><span class="n">CALLERID</span><span class="p">(</span><span class="n">dnid</span><span class="p">)</span><span class="err">}</span><span class="p">)</span><span class="n">exten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">_NXXXXXX</span><span class="p">,</span><span class="n">n</span><span class="p">,</span><span class="k">Goto</span><span class="p">(</span><span class="mi">1323</span><span class="err">${</span><span class="n">EXTEN</span><span class="err">}</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span><span class="n">append</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">necessaryexten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">_NXXNXXXXXX</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="k">Set</span><span class="p">(</span><span class="n">CALLERID</span><span class="p">(</span><span class="n">dnid</span><span class="p">)</span><span class="o">=</span><span class="mi">1</span><span class="err">${</span><span class="n">CALLERID</span><span class="p">(</span><span class="n">dnid</span><span class="p">)</span><span class="err">}</span><span class="p">)</span><span class="n">exten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">_NXXNXXXXXX</span><span class="p">,</span><span class="n">n</span><span class="p">,</span><span class="k">Goto</span><span class="p">(</span><span class="mi">1</span><span class="err">${</span><span class="n">EXTEN</span><span class="err">}</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span><span class="n">do</span><span class="w"> </span><span class="n">our</span><span class="w"> </span><span class="nc">real</span><span class="w"> </span><span class="n">dialingexten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">_1NXXNXXXXXX</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">Dial</span><span class="p">(</span><span class="n">Gtalk</span><span class="o">/</span><span class="n">gtalkconnection</span><span class="o">/</span><span class="err">${</span><span class="n">EXTEN</span><span class="err">}</span><span class="nv">@voice</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">)</span><span class="n">exten</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">_</span><span class="o">+</span><span class="mi">1</span><span class="n">NXXNXXXXXX</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">Dial</span><span class="p">(</span><span class="n">Gtalk</span><span class="o">/</span><span class="n">gtalkconnectionEXTEN</span><span class="err">}</span><span class="nv">@voice</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">)</span><span class="o">[</span><span class="n">users</span><span class="o">]</span><span class="k">include</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">stationsinclude</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">gv</span><span class="o">-</span><span class="n">outbound</span>
</code></pre></div>
</blockquote>
<p>You can now start up asterisk (in a sort of test mode) with
"/usr/sbin/asterisk -vvvgc". Keep that console connection open until
you've confirmed everything works as planned. (When it's all good,
you'll find appropriate init scrips in the contrib directory of the
asterisk source.) Check to see if you're connected to your Google Voice
account with "jabber show connected" from the asterisk console. If
you're not connected, then something went wrong... </p>
<p>The only other thing you have to do at this point is configure your SIP
client (whether it's a soft-phone or an adapter like the Grandstream
device I linked to above.) Then try dialing out, and call your GV number
from another phone to test the in-bound calling! </p>
<p>You can do a LOT more with Asterisk, but if you just want to get your GV
number linked to a phone at home, this is all you need to do! </p>
<p><span style="font-size: 85%;">Thanks to these folks for their
information, what they had to share helped me sort this all out:<br>
</span> </p>
<ul>
<li><span
style="font-size: 85%;">http://supermario-world.blogspot.com/2010/11/asterisk-18-and-native-google-voice.html</span></li>
<li><span
style="font-size: 85%;">http://www.voip-info.org/wiki/view/Asterisk+Speaks+with+Google+Talk</span></li>
<li><span
style="font-size: 85%;">http://www.asteriskguru.com/tutorials/asterisk_installation_compilation_centos.html</span></li>
<li><span
style="font-size: 85%;">http://jeremy-mcnamara.com/asterisk/how-to-configure-asterisk/</span></li>
<li><span
style="font-size: 85%;">http://blog.polybeacon.com/2010/10/17/asterisk-1-8-and-google-voice/</span></li>
</ul>
</p>All the pieces matter2012-04-29T15:24:00-07:002012-04-29T15:24:00-07:00Christopher Aedotag:localconspiracy.com,2012-04-29:/2012/04/all-the-pieces-matter.html<p>This David Foster Wallace speech (<a href="http://moreintelligentlife.com/story/david-foster-wallace-in-his-own-words">read
here</a>,
or <a href="http://www.youtube.com/watch?v=M5THXa_H_N8">watch here</a>) is one of
the most inspirational things I've ever read. It's great to be reminded
to be mindful, to be aware of those knee-jerk reactions and consider
whether or not they're completely off base.</p>
<blockquote>
<p>"The
point is that petty, frustrating …</p></blockquote><p>This David Foster Wallace speech (<a href="http://moreintelligentlife.com/story/david-foster-wallace-in-his-own-words">read
here</a>,
or <a href="http://www.youtube.com/watch?v=M5THXa_H_N8">watch here</a>) is one of
the most inspirational things I've ever read. It's great to be reminded
to be mindful, to be aware of those knee-jerk reactions and consider
whether or not they're completely off base.</p>
<blockquote>
<p>"The
point is that petty, frustrating crap like this is exactly where the
work of choosing is gonna come in. Because the traffic jams and
crowded aisles and long checkout lines give me time to think, and if I
don't make a conscious decision about how to think and what to pay
attention to, I'm gonna be pissed and miserable every time I have to
shop. Because my natural default setting is the certainty that
situations like this are really all about me."</p>
</blockquote>
<p>On the same topic (making a
conscious choice about what and how you'll think), <a href="http://davidsimon.com/i-meant-this/">this amazing essay
by David Simon</a> talks about missing
the point - like if watching The Wire inspires you to bet on who the
coolest character is (rather than discuss social injustice and the decay
of humanity). Or talking about a vigilante in Florida without
considering the astounding legal precedent being set in the Trayvon v.
Zimmerman case... It's an amazing read, and should get you thinking
(and talking).</p>
<blockquote>
<p>"A
week or month or a year from now, someone else is going to walk up to
a fresh victim in Florida or some other state burdened with
stand-your-ground absurdity and we’ll have a new body over which to
argue. Which is just fine, because does anyone really believe that our
instant-assessment, instant-gratification media world is capable of
anything beyond the ad hominem? Let them begin again and do what they
do best: Which one was the asshole? Who is the bigger dickhead? He
deserved it. No, he didn’t. Which one am I rooting for? Which one
gets my vote? Who wins? Who loses?"</p>
</blockquote>Fix your brain!2012-04-29T15:23:00-07:002012-04-29T15:23:00-07:00Christophertag:localconspiracy.com,2012-04-29:/2012/04/fix-your-brain.html<p>Can you make yourself smarter? There's a lot of evidence you can, but
it takes a little effort on your part (15 minutes a day is enough to
yield pretty significant improvements.) You can no doubt find something
each day that you're spending 15 minutes (or more on) that you …</p><p>Can you make yourself smarter? There's a lot of evidence you can, but
it takes a little effort on your part (15 minutes a day is enough to
yield pretty significant improvements.) You can no doubt find something
each day that you're spending 15 minutes (or more on) that you can drop,
in favor of fixing your brain and making your life a little easier :) </p>
<p>"[...] young adults who practiced a stripped-down, less cartoonish
version of the game also showed improvement in a fundamental cognitive
ability known as “fluid” intelligence: the capacity to solve novel
problems, to learn, to reason, to see connections and to get to the
bottom of things. The implication was that playing the game literally
makes people smarter."<br>
<a href="http://www.nytimes.com/2012/04/22/magazine/can-you-make-yourself-smarter.html?_r=2&hpw=&pagewanted=all#">Can you make yourself
smarter?</a> </p>
<p>If you have an iPhone, there's a <a href="http://itunes.apple.com/us/app/iq-boost/id286574399?mt=8">great FREE Dual N-Back game
here</a>. </p>
<p>If you want to try it on your computer, <a href="http://brainworkshop.sourceforge.net/">the best one out there is also
free</a>. </p>Don't trust the marketing!2012-04-29T01:07:00-07:002012-04-29T01:07:00-07:00Christopher Aedotag:localconspiracy.com,2012-04-29:/2012/04/dont-trust-the-marketing.html<p>The harder someone tries to sell you something, the more suspicious you
should be. Why don't more people realize that? When something is truly
great it sells itself. When it doesn't, throw marketing at it! Got
milk? Seen a McDonalds add lately? </p>
<p>If you've ever wondered why food makers switched …</p><p>The harder someone tries to sell you something, the more suspicious you
should be. Why don't more people realize that? When something is truly
great it sells itself. When it doesn't, throw marketing at it! Got
milk? Seen a McDonalds add lately? </p>
<p>If you've ever wondered why food makers switched from using animal fats
in cooking to using factory-produced abominations, now you know.
Profit, pure and simple. </p>
<blockquote>
<p>"Convincing homemakers to swap butter and lard for a new fat created
in a factory would be quite a task, so the new form of food needed a
new marketing strategy. Never before had Procter & Gamble -- or any
company for that matter -- put so much marketing support or
advertising dollars behind a product. They hired the J. Walter
Thompson Agency, America's first fullservice advertising agency
staffed by real artists and professional writers. Samples of Crisco
were mailed to grocers, restaurants, nutritionists, and home
economists. Eight alternative marketing strategies were tested in
different cities and their impacts calculated and compared.<br>
Health claims on food packaging were then unregulated, and the
copywriters claimed that cottonseed oil was healthier than animal fats
for digestion. Advertisements in the Ladies' Home Journal encouraged
homemakers to try the new fat and "realize why its discovery will
affect every family in America." (<a href="http://www.theatlantic.com/health/archive/2012/04/how-vegetable-oils-replaced-animal-fats-in-the-american-diet/256155/">from The
Atlantic</a>)</p>
</blockquote>
<p>This new fat discovery certainly did affect every family in America!
Here we are 100 years later and we're <a href="http://www.huffingtonpost.com/2012/02/22/obesity-rates-rising-developed-fattest-world_n_1294212.html#s716476&title=1_United_States">the fattest nation in the
world</a>.
We're number one! GO TEAM!</p>
</p>How the f**k do magnets work?!?2012-04-27T15:37:00-07:002012-04-27T15:37:00-07:00Christophertag:localconspiracy.com,2012-04-27:/2012/04/how-the-fk-do-magnets-work.html<p>I LOVE this excerpt from a Richard Feynman interview (<a href="http://lesswrong.com/r/discussion/lw/99c/transcript_richard_feynman_on_why_questions/#thingrow_t3_99c">transcribed
here</a>)
where he responds to a question about the "feeling" of magnets
repelling: </p>
<blockquote>
<p>"Of course, it's an excellent question. But the problem, you see, when
you ask why something happens, how does a person answer why something
happens? For example …</p></blockquote><p>I LOVE this excerpt from a Richard Feynman interview (<a href="http://lesswrong.com/r/discussion/lw/99c/transcript_richard_feynman_on_why_questions/#thingrow_t3_99c">transcribed
here</a>)
where he responds to a question about the "feeling" of magnets
repelling: </p>
<blockquote>
<p>"Of course, it's an excellent question. But the problem, you see, when
you ask why something happens, how does a person answer why something
happens? For example, Aunt Minnie is in the hospital. Why? Because she
went out, slipped on the ice, and broke her hip. That satisfies
people. It satisfies, but it wouldn't satisfy someone who came from
another planet and who nothing about why when you break your hip do
you go to the hospital. How do you get to the hospital when the hip is
broken? Well, because her husband, seeing that her hip was broken,
called the hospital up and sent somebody to get her. All that is
understood by people. And when you explain a why, you have to be in
some framework that you allow something to be true. Otherwise, you're
perpetually asking why."</p>
</blockquote>
<p>It reminds me of nearly every conversation I have with my older son.
Lacking a deep knowledge base with which to form a frame of reference
(though he does pretty well for a 3.5 year old), every answer leads to
yet another question. Eventually, the chain always ends with something
like "well, that's just the way molecules work." He hasn't started
asking "What's a molecule?" just yet, but I'm sure that one is right
around the corner... </p>
<p>I hope he never stops trying to understand everything!</p>
</p>Your to-do list2012-04-27T15:34:00-07:002012-04-27T15:34:00-07:00Christophertag:localconspiracy.com,2012-04-27:/2012/04/your-to-do-list.html<p>It's easy to lose sight of your dreams when you're neck-deep in the day
to day stuff you need to do just to survive. If you are at least taking
time to make lists of things you need to get done, and prioritizing them
at that, Paul Graham makes a …</p><p>It's easy to lose sight of your dreams when you're neck-deep in the day
to day stuff you need to do just to survive. If you are at least taking
time to make lists of things you need to get done, and prioritizing them
at that, Paul Graham makes a great suggestion for what should be at the
top of your list every time: </p>
<blockquote>
<p>"I would like to avoid making these mistakes. But how do you avoid
mistakes you make by default? Ideally you transform your life so it
has other defaults. But it may not be possible to do that completely.
As long as these mistakes happen by default, you probably have to be
reminded not to make them. So I inverted the 5 regrets, yielding a
list of 5 commands:<br>
Don't ignore your dreams; don't work too much; say what you think;
cultivate friendships; be happy."</p>
</blockquote>
<p>(From <a href="http://paulgraham.com/todo.html">Paul Graham's to-do list</a>,
commenting on <a href="http://www.inspirationandchai.com/Regrets-of-the-Dying.html">"Regrets of the
Dying"</a>)</p>Use your brain; lose your religion2012-04-27T15:30:00-07:002012-04-27T15:30:00-07:00Christopher Aedotag:localconspiracy.com,2012-04-27:/2012/04/use-your-brain-lose-your-religion.html<p>Those who know me well will not be surprised to see me share a few
articles on this topic. I've said for years that the most dangerous
thing about leading a "faith based" life is that it dulls critical
thinking. In order to live that way, you need to actively …</p><p>Those who know me well will not be surprised to see me share a few
articles on this topic. I've said for years that the most dangerous
thing about leading a "faith based" life is that it dulls critical
thinking. In order to live that way, you need to actively train your
brain to NOT think about some things. These two articles reference a
related study, finding that analytic thinking leads to a a loss of faith
(who would be surprised by that?) </p>
<blockquote>
<p>"Analytic thinking undermines belief because, as cognitive
psychologists have shown, it can override intuition. And we know from
past research that religious beliefs—such as the idea that objects and
events don't simply exist but have a purpose—are rooted in intuition.
"Analytic processing inhibits these intuitions, which in turn
discourages religious belief," Norenzayan explains." (<a href="http://www.scientificamerican.com/article.cfm?id=losing-your-religion-analytic-thinking-can-undermine-belief">from Scientific
American</a>)</p>
<p>"Charles Darwin and Albert Einstein famously did not believe in a
supernatural God, and neither do some scientists today. It now appears
there may be a good reason for this: thinking analytically dims
supernatural beliefs, apparently by opposing the intuitive thought
processes that underpin them." (<a href="http://www.newscientist.com/article/dn21749-analytical-thinking-erodes-belief-in-god.html">from New
Scientist</a>)</p>
</blockquote>
<p>In a very related series "<a href="http://francishunt.blogspot.de/2011/04/confessions-of-ex-priest-1.html">Confessions of an
Ex-Priest</a>"
and "<a href="http://francishunt.blogspot.com/2012/04/dismantling-vatican-ii.html">Dismantling the
Vatican</a>", a
man who spent eight years being trained for his position only to leave
the church after a single year as an ordained priest reflects on
religion and the power structure the church relies on. In part 2 he
talks about an exciting moment in the catholic church, when a feeling of
openness and empowerment almost swept through the organization. Luckily
the bishops and priests managed to shut it down, lest their followers be
encouraged to actually read the book their faith is based on. </p>
<blockquote>
<p>"That the Catholic Church, or, rather, those who lead it and exercise
power within it, prefer a message dominated by pessimism, fear, and
control, rather than one inspired by openness, trust, and hope seems
to me to show a weakness of faith in the life and message of the
man/God they claim as their foundation and inspiration."</p>
</blockquote>
</p>Work requirement2012-02-23T16:01:00-08:002012-02-23T16:01:00-08:00Christopher Aedotag:localconspiracy.com,2012-02-23:/2012/02/work-requirement.html<p>If you have a job, you need to read this. </p>
<blockquote>
<p>"Although
some meetings are inevitable, even necessary, the principle he's
advocating here is an important one. </span><strong>Meetings should be
viewed skeptically from the outset, as risks to productivity</strong><span
style="background-color: white; color: #333333; font-family: calibri, tahoma, arial, sans-serif; font-size: 16px; line-height: 20px;">.
We have meetings because we think we need them, but all too …</span></p></blockquote><p>If you have a job, you need to read this. </p>
<blockquote>
<p>"Although
some meetings are inevitable, even necessary, the principle he's
advocating here is an important one. </span><strong>Meetings should be
viewed skeptically from the outset, as risks to productivity</strong><span
style="background-color: white; color: #333333; font-family: calibri, tahoma, arial, sans-serif; font-size: 16px; line-height: 20px;">.
We have meetings because we think we need them, but all too often,
meetings are where work ends up going to die."</p>
</blockquote>
<p><a href="http://www.codinghorror.com/blog/2012/02/meetings-where-work-goes-to-die.html">Meetings, where work goes to die</a></p>Christopher Aedo's Resume (doc@aedo.net)2012-01-01T10:00:00-08:002012-01-01T10:00:00-08:00Christopher Aedotag:localconspiracy.com,2012-01-01:/2012/01/christopher-aedo-resume.html<h1>Summary</h1>
<p>Empathetic and people-first Technology Executive, dedicated to fostering a safe, inclusive environment that drives curiosity, candor, and continuous learning. Recognized for my ability to structure and align teams, accelerating delivery timelines and establishing transparent product roadmaps. Product-led engineering approach with a strong capacity for strategic decision making, tactical planning …</p><h1>Summary</h1>
<p>Empathetic and people-first Technology Executive, dedicated to fostering a safe, inclusive environment that drives curiosity, candor, and continuous learning. Recognized for my ability to structure and align teams, accelerating delivery timelines and establishing transparent product roadmaps. Product-led engineering approach with a strong capacity for strategic decision making, tactical planning, and closing customer deals. Proud to lead with kindness, leveraging comprehensive insight from across the organization to improve inter-departmental cooperation and strategic direction.</p>
<h1>Skills</h1>
<p>Strategic Planning
// Team Collaboration
// Mentorship and Hiring
// Performance Evaluation and Optimization
// Agile Development
// Software Engineering Leadership
// Config and Infrastructure as Code
// Automation
// Cloud Computing
// Kubernetes, Docker
// Infrastructure Deployment, CI/CD
// GraphQL
// Terraform, Ansible
// Process Optimization
// DevOps
// AWS, Azure, GCP
// Keynote Speaker</p>
<h1>Experience</h1>
<h3>VP of Software Engineering</h3>
<p>Pandemic Response Labs/Opentrons Labworks Inc. - NY</p>
<p>04/2022 - 03/2023</p>
<ul>
<li>Restructured 20 person SW engineering team & established career ladder, increased team capacity by 20% by instituting pragmatic prioritization and drastically reducing unplanned work.</li>
<li>Accelerated release cycle from 6w to 2w by reducing scope and improving planning and prioritizing, resulting in fewer bugs and eliminating the need for quick-fix releases.</li>
<li>Mentored and worked hand in hand with the product management team to build and publish the organizational roadmap, ensuring engineering priorities and timelines served business needs and reducing time to feature delivery by 15%.</li>
<li>Outlined and sustained a technology strategy to support highly automated lab processes to maximize operational efficiency with the lowest possible turnaround times.</li>
<li>Cultivated an empowering engineering culture providing inclusiveness and safety, enabling team members to express and harness their full creative abilities.</li>
</ul>
<h3>Director, Project Management // Open Source</h3>
<p>Teradata - Rancho Bernardo, CA</p>
<p>11/2017 - 04/2022</p>
<ul>
<li>Headed product management for Teradata's Extract/Transform/Load suite and overall data management tools.</li>
<li>Wore multiple hats as an infrastructure/provisioning product manager and technical product owner of the foundational provisioning and deployment tools, a key aspect in Teradata's critical pivot to a subscription-based SaaS model.</li>
<li>Supervised transparent roadmaps of multiple integrated projects, juggling engineering priorities to best meet the needs of both internal and external customers, with the organization's needs at the forefront.</li>
<li>Instituted an Open Source Program Office within Teradata, a designated locale where open source was nurtured, shared, explained, and grown.</li>
<li>Bridged the gap between legal, marketing, and engineering teams to share useful internal projects with the wider world by open sourcing them.</li>
<li>Joined forces with internal engineering teams benefiting from open source software to enhance their integration with upstream communities and foster greater involvement.</li>
</ul>
<h3>Developer Advocacy Program Manager</h3>
<p>IBM - Armonk, NY</p>
<p>11/2016 - 11/2017</p>
<ul>
<li>Oversaw an 18 person team of open source developers dedicated to transforming IBM's global developer community perception by becoming vanguards for cutting-edge technologies.</li>
<li>Interfaced with marketing and events teams to optimize sponsorship and marketing around IBM’s developer-focused initiatives.</li>
<li>Boosted IBM’s presence and relevance in developer communities by securing sponsorship and organizing multiple conferences where IBM previously had minimal presence.</li>
</ul>
<h3>OpenStack Innovation Team</h3>
<p>IBM - Armonk, NY</p>
<p>08/2015 - 11/2016</p>
<ul>
<li>Deployed a distributed, scalable cloud based on OpenStack, continuously updated from upstream master to underpin IBM’s cloud compute offering.</li>
<li>Leveraged Gerrit for code review, and automated sync of local changes with upstream commits to increase contribution and minimize stability issues.</li>
<li>Accelerated the development velocity of 200 globally distributed engineers by implementing and training them on a revolutionary platform utilizing modern CI/CD, code review and automation.</li>
</ul>
<h3>Product Architect</h3>
<p>Mirantis - Mountain View, CA</p>
<p>03/2014 - 07/2015</p>
<ul>
<li>Partnered with product management team, engineering teams, Mirantis' customers, and OpenStack contributors to provide strategic leadership, aligning short and long-term product goals with market needs and code/community directions.</li>
<li>Conducted analysis of competitive and complementary products and technologies, critical for product, sales, and marketing teams' decision-making.</li>
<li>Collaborated closely with documentation and training teams to create a robust user and contributor base.</li>
<li>Fostered the local developer community by not only contributing to OpenStack but also organizing the Portland OpenStack User Group.</li>
</ul>
<h3>Chief Technology Officer</h3>
<p>Morphlabs - Manhattan Beach, CA</p>
<p>08/2011 - 01/2014</p>
<ul>
<li>Built and directed remote distributed engineering and support teams (8 US, 50+ international)</li>
<li>Provided insightful technical stewardship to sales and delivery teams.</li>
<li>Negotiated and fostered strategic partnerships and solution certification agreements with Ubuntu, Dell, NEC, Hitachi, and Media Temple.</li>
<li>Championed the product owner’s perspective and steered the engineering team towards anticipatory industry needs.</li>
<li>Instilled agile development and navigated the team towards fully automated Puppet-based deployments and updates, and continuous integration with Jenkins.</li>
<li>Conceived a 24/7 customer support product and orchestrated a globally distributed support team.</li>
<li>Shared industry insights by presenting at conferences and meetups from Los Angeles to Tokyo, Okinawa, and several OpenStack design summits.</li>
</ul>
<h1>EDUCATION</h1>
<ul>
<li>University of Illinois at Chicago, Mathematics/Computer Science</li>
</ul>
<h1>VOLUNTEER & OPEN SOURCE</h1>
<ul>
<li>Court-Appointed Special Advocate (CASA), appointed by the court to advocate for the best interests of children in foster care.</li>
<li>Created <a href="https://github.com/aedocw/epub2tts">https://github.com/aedocw/epub2tts</a>, which creates an audio book from an epub or text file using generative AI for text-to-speech.</li>
</ul>Social networking is anti-social2011-12-11T19:00:00-08:002011-12-11T19:00:00-08:00Christophertag:localconspiracy.com,2011-12-11:/2011/12/social-networking-is-anti-social.html<p>For a brief time, I was bullish on social networking. I blame it on my
natural human need to maintain consistency, since I was working at a
company that was tangentially involved with social networking (i.e. if
you don't make yourself believe at least a little bit in what …</p><p>For a brief time, I was bullish on social networking. I blame it on my
natural human need to maintain consistency, since I was working at a
company that was tangentially involved with social networking (i.e. if
you don't make yourself believe at least a little bit in what you're
doing, you're going to be miserable.) Before that time, and after, I've
been pretty thoroughly anti all things "social networking". My views on
the matter are definitely not just a result of being an old curmudgeon -
I just read two good articles on this very subject, thought you might
enjoy them as well... </p>
<p>What's wrong with the idea of "frictionless" sharing, where every action
is automatically broadcast to your network of friends? </p>
<blockquote>
<p>Facebook's "frictionless" sharing doesn't enhance sharing; it makes
sharing meaningless. Let's go back to music: It is meaningful if I
tell you that I really like the avant-garde music by Olivier Messiaen.
It's also meaningful to confess that I sometimes relax by listening to
Pink Floyd. But if this kind of communication is replaced by a
constant pipeline of what's queued up in Spotify, it all becomes
meaningless. There's no "sharing" at all. Frictionless sharing isn't
better sharing; it's the absence of sharing. There's something about
the friction, the need to work, the one-on-one contact, that makes the
sharing real, not just some cyber phenomenon.
(<a href="http://radar.oreilly.com/2011/12/the-end-of-social.html">http://radar.oreilly.com/2011/12/the-end-of-social.html</a>)</p>
</blockquote>
<p>An excellent perspective on the meaning of friendship throughout
history, and the tragic direction it's heading these days: </p>
<blockquote>
<p>As for getting back in touch with old friends—yes, when they're people
you really love, it's a miracle. But most of the time, they're not.
They're someone you knew for a summer in camp, or a midlevel friend
from high school. They don't matter to you as individuals anymore,
certainly not the individuals they are now, they matter because they
made up the texture of your experience at a certain moment in your
life, in conjunction with all the other people you knew. Tear them out
of that texture—read about their brats, look at pictures of their
vacation—and they mean nothing. Tear out enough of them and you ruin
the texture itself, replace a matrix of feeling and memory, the deep
subsoil of experience, with a spurious sense of familiarity. Your
18-year-old self knows them. Your 40-year-old self should not know
them. (<a href="http://chronicle.com/article/Faux-Friendship/49308/">http://chronicle.com/article/Faux-Friendship/49308/</a>)</p>
</blockquote>
</p>Pancakes2011-08-21T17:06:00-07:002011-08-21T17:06:00-07:00Christopher Aedotag:localconspiracy.com,2011-08-21:/2011/08/pancakes.html<p>UPDATE: There's an updated version of the recipe that is even tasier
and slightly healthier too, check out <a href="/2018/01/pbpancakes.html">the updated
recipe here</a>!</p>
<p>When I was growing up, almost every weekend my mom would cook these
awesome pancakes for breakfast. They were a little different (and way
better) than the standard …</p><p>UPDATE: There's an updated version of the recipe that is even tasier
and slightly healthier too, check out <a href="/2018/01/pbpancakes.html">the updated
recipe here</a>!</p>
<p>When I was growing up, almost every weekend my mom would cook these
awesome pancakes for breakfast. They were a little different (and way
better) than the standard variety, being made with more eggs than usual,
and cottage cheese. She never looked at a written recipe when making
them, so I always assumed these were from some old family recipe either
from Germany or Lithuania. </p>
<p>When I moved out of the house and was living on my own for the first
time, I was looking forward to making these pancakes myself. She read
the recipe to me (from memory) over the phone, and I wrote it on some
scrap of paper. A year or three later I lost the scrap, and hadn't made
them often enough to have memorized the recipe, so I asked for the
recipe again. </p>
<p>This time, in the course of the conversation I asked where the recipe
had come from, wondering if it had been her own mother. Hilariously, she
told me "Oh I got the recipe from the top of a tub of cottage cheese a
long time ago." </p>
<p>Secret family recipe my ass! </p>
<p>They ARE fantastic pancakes though; I made them again for breakfast this
morning, and thought I should share the recipe with my friends, so here
you go! (This version is slightly modified from the one my Mom used to
make, I substitute oats for flour and add bananas for improved awesomeness).</p>
<blockquote>
<p>Aedo Family Secret Pancake Recipe:<br>
1 cup cottage cheese<br>
6 eggs<br>
1 and a 1/2 cup dry quick-cook oatmeal<br>
1/2 teaspoon salt<br>
1/4 cup olive oil<br>
1/2 cup rice milk<br>
1/2 tsp. vanilla extract<br>
2 bananas </p>
</blockquote>
<p>Place ingredients in blender, blend until smooth, then cook like reglar
pancakes.</p>
<p>Enjoy!</p>
</p>Watching TV2011-02-15T07:06:00-08:002011-02-15T07:06:00-08:00Christopher Aedotag:localconspiracy.com,2011-02-15:/2011/02/watching-tv.html<p>So as much as I wish I didn't want to watch TV, sometimes I just can't
help it (it generally feels like I'm shutting my brain down when I watch
TV and sometimes I just need that). We <a href="/2009/05/tivo-is-for-suckers.html">cancelled satellite a few years
ago</a>,
though we still downloaded a few …</p><p>So as much as I wish I didn't want to watch TV, sometimes I just can't
help it (it generally feels like I'm shutting my brain down when I watch
TV and sometimes I just need that). We <a href="/2009/05/tivo-is-for-suckers.html">cancelled satellite a few years
ago</a>,
though we still downloaded a few TV shows each week because quitting
cold turkey was just too hard. Back then the system was basically a
computer downloading TV shows via bittorrent, and a hacked AppleTV
streaming the content on our TV. </p>
<p>It's about time for a quick update on the system, because it's really
been pretty great. The only real change since my last post is that we've
replaced the first generation AppleTV with a cheaper, more powerful, and
significantly smaller second generation AppleTV. </p>
<p>The new AppleTV is <a href="http://support.firecore.com/entries/387605">easy to
hack</a>, and now that the fine
folks behind<a href="http://wiki.xbmc.org/index.php?title=Install_XBMC_on_ATV2">XBMC have ported their
software</a> to
this hardware, you can do everything you would want to do with the
AppleTV. </p>
<p>What's the best new thing I've found? Adding the <a href="http://www.ted.com/pages/198">TED Talks RSS
feed</a>. Now we can "flip channels" when we
feel like watching TV, and we're NOT really shutting down our brains! </p>
<p>Write me if you have any questions about "adjusting" your AppleTV to
better suit your own needs!</p>Reading2011-01-04T00:03:00-08:002011-01-04T00:03:00-08:00Christophertag:localconspiracy.com,2011-01-04:/2011/01/reading.html<p>I've been meaning to post little links more often, to interesting sites
I find or books I really like (instead of saving up for one really big
post every few months). This one will be a little bit long just because
I've got a few things to note - in the …</p><p>I've been meaning to post little links more often, to interesting sites
I find or books I really like (instead of saving up for one really big
post every few months). This one will be a little bit long just because
I've got a few things to note - in the future, most additions to Local
Conspiracy will probably be pretty short and consist of stuff like "I
just finished this book and loved it! You should read it!"</p>
<p>Before I mention any specific books though, I have got to give a giant
shout out to the <a href="http://goo.gl/xLNQD">Kindle</a>. I got my wife one for a
late birthday gift, and immediately realized I was going to need to get
my own. It's not super fancy, allowing you to play games and watch
movies like an iPad, but it is a LOT nicer to your eyes. Keep in mind
when you're staring at ANY LCD screen, you're staring into a dim light.
Your eyes don't like doing that, so the more time you spend staring a
screen (your laptop, TV or iPad), the more strain you put on your eyes.
The Kindle uses an e-ink display that relies on purely reflective light
(exactly like reading a regular book). It's a LOT easier on your eyes.
If you spend much of your day in front of a computer screen at work, and
then go home and spend a few more hours staring at your TV, you should
do your eyes a kindness and give them a break by reading a book
(physical, or digital on your Kindle).</p>
<p>There are lots of advantages to using a Kindle to read books (and
believe me, the ability to get a book RIGHT NOW is pretty intoxicating!)
One advantage I hadn't thought about until I was using it though was the
fact that you can easily hold the book and turn pages without making a
sound or shifting around, or even using two hands. That comes in
EXTREMELY handy when you've got a sleeping baby in your arms.</p>
<p>OK, enough of that. On to a few books I've read recently, which I highly
recommend...</p>
<p><a href="http://goo.gl/rjLuV">Unbroken: A World War II Story of Survival, Resilience, and
Redemption</a> (by Laura Hillenbrand) - Excellently
written, a fascinating story of WWII as seen (primarily) from the eyes
of a man who was captured by Japanese soldiers. This book was hard to
put down.</p>
<p><a href="http://goo.gl/wooLC">WRONG: Why experts keep failing us -- and how to know when not to trust
them</a> (by David H. Freedman) - This book should be
required reading for EVERYONE. If you're not familiar with how medical
studies (or many other scientific studies for that matter) are
documented and published, this book will be a real eye opener. There's a
ton of useful information in this book, and it goes a long way towards
inspiring some necessary critical thinking.</p>
<p><a href="http://goo.gl/jEYNF">Packing for Mars: The Curious Science of Life in the
Void</a> (by Mary Roach) - a fun read detailing a
great many of the interesting considerations that go into preparing men
(and animals) for space travel. </p>tivo is for suckers2010-09-21T00:02:00-07:002010-09-21T00:02:00-07:00Christopher Aedotag:localconspiracy.com,2010-09-21:/2010/09/tivo-is-for-suckers.html<p>OK, that title is unfair. TiVo is pretty great, I bought a series 1 in
2000, and within the first year added a giant hard drive (120gb WAS
pretty big in 2001!) and a network card. A year later I got DirecTV and
the Philips TiVo that worked with DirecTV …</p><p>OK, that title is unfair. TiVo is pretty great, I bought a series 1 in
2000, and within the first year added a giant hard drive (120gb WAS
pretty big in 2001!) and a network card. A year later I got DirecTV and
the Philips TiVo that worked with DirecTV. That was when I started
experimenting with archiving and offloading content. None of the
experiments went really well. </p>
<p>My goal was to keep my own archive of recorded shows, for as long as I
wanted, and be able to play them on any TV or computer in the house. I
also wanted to convert all our DVDs to mp4 and be able to scroll through
the movies and play them, like a pay-per-view system at a hotel. That
meant I would need a "back end" to store and deliver the content, and a
"front end" to browse and play the content. </p>
<p>The first pass was marginally successful: I started ripping all my DVDs
to mp4, and storing them on a file server at home (the adventures in
file serving will be the subject of another nerdtastic post...) To
browse and play the content, I hacked an XBox and installed <a href="http://en.wikipedia.org/wiki/XBMC">Xbox Media
Center</a>. It worked reasonably well,
but since the XBox had limited memory and horsepower, it couldn't handle
decoding movies encoded with some of the better codecs (like
<a href="http://en.wikipedia.org/wiki/H.264">h.264</a> which was at the time
gaining popularity, and improving rapidly.) </p>
<p>The TiVo was a pretty poor primary source for capturing shows since it
encoded everything in MPEG2, so for long term storage and reasonable
tranfer rates you had to transcode everything, which just took too long.
It was also a bad choice for the front-end because you couldn't use it
to play media from an external source (like the file server that had all
my movies) unless it was mpeg2 (AND you had to transfer it to the tivo,
it wouldn't stream directly from the source.) </p>
<p>I played around with <a href="http://www.mythtv.org/">MythTV</a> for a while, but I
think the "myth" part of the name refers to the myth that it actually
works. (I know I know, it DOES work, just not reliably or easily.) In
theory it would have been a pretty great system, as they used the
backend/frontend model from the beginning, and they offered players on
multiple platforms, so it should have been relatively easy to build up a
PC for however many TV's I wanted to play the content on. As I started
working on it though, things just got too complicated. Ideally I would
have three DirecTV tuners connected to it, and be able to capture three
shows or movies at the same time. I got it working well enough with one,
but the whole thing seemed to flaky and fragile, and I needed something
that would always just work, and that my wife and friends could use with
little or no training. MythTV was not the answer. </p>
<p>Ironically, the approach that answered all my questions was prompted by
me taking the first steps towards getting rid of TV altogether. I
convinced my wife to go along with me on canceling our DirecTV
subscription by promising we would still be able to get the handful of
shows that we wanted to watch, and she would not have to sit in front of
a computer to watch them. </p>
<p>While learning about MythTV and the community of people working
diligently (and without pay) to improve it, I discovered that a great
many of them were sharing the shows they captured via
<a href="http://en.wikipedia.org/wiki/BitTorrent">bittorrent</a>. Though an
argument can be made that it's stealing, if you're just talking about
watching over-the-air shows it's no different than watching it after
capture on your tivo, and using the 30-second-skip trick to jump past
commecials. (If you're talking about pay-tv stuff, like HBO shows, etc.,
well, then you are stealing... But maybe it's OK if you ultimately buy
the DVD's when they're available?) </p>
<p>So the shows were out there, but was there an easy way to grab them as
they became available? Absolutely! The bittorrent client Vuze is the
best one out there, and there are <a href="http://azureus.sourceforge.net/plugin_list.php">hundreds of
plugins</a> written to
extend it's usability. One plugin, <a href="http://azureus.sourceforge.net/plugin_details.php?plugin=rssfeed">RSS Feed
Scanner</a>,
specifically addressed my needs, and worked beautifully. Then you just
have to find your RSS feeds, though you can probably find everything you
need from <a href="http://eztv.it/">EZTV</a>.
[EDIT: I withdraw my support of Vuze after a
forced upgrade wiped out all my RSS settings! I replaced it with
<a href="http://www.utorrent.com/downloads">utorrent</a> and found it's far better,
faster, and has RSS support built right in!]</p>
<p>With the content side sorted out, what was the best way to watch it? The
XBox worked for some stuff, but not always. It was also occasionally
crashy, and would sometimes lock up right in the middle of a show. Thats
no bueno... </p>
<p>The answer turned out to be
<a href="http://store.apple.com/us/browse/home/shop_ipod/family/apple_tv?mco=MTE4MTU">AppleTV</a>!
It required a slight modification since Apple would rather you watch
things you get from the iTunes store, but there's really nothing to it.
There are a ton of things you can do to the AppleTV and there's <a href="http://www.appletvhacks.net/">lots of
information</a> out there on the subject. All
you really need to do is enable SSH (for easy remote access), then
install the divx and xvid codecs and a file browser. <a href="http://www.engadget.com/2007/04/10/how-to-play-divx-and-xvid-on-your-apple-tv/">Engadget had a
good article about
it</a>,
and I found other sites/guides as well (email me if you have any
questions, I'll be happy to help!) </p>
<p>We've been using this setup for almost two years now, and it's worked
almost without incident. You can get AppleTV's on ebay pretty cheap, so
there's no big barrier to adding players to multiple TV's throughout
your house. As long as you don't mind waiting a few hours until after it
airs to catch a show, your only ongoing cost is the bandwidth. There
might be problems down the road (ISP's don't like bittorrent because
they promised you more bandwidth than they have, and bittorrent has a
habit of using up the bandwidth available...) </p>
<p>-Christopher</p>Get up, stand up!2010-08-19T05:09:00-07:002010-08-19T05:09:00-07:00Christophertag:localconspiracy.com,2010-08-19:/2010/08/get-up-stand-up.html<p><img alt="image" src="/images/3-standups.JPG" title="three stand up desks"></p>
<p>Last year a coworker and friend (<a href="http://www.privetera.com/">Rocco</a>) set
up his workspace so he could use the computer standing up. It wasn't the
first time I'd heard of people doing that, but he was the first person I
knew who was giving it a try. After a few days, he swore …</p><p><img alt="image" src="/images/3-standups.JPG" title="three stand up desks"></p>
<p>Last year a coworker and friend (<a href="http://www.privetera.com/">Rocco</a>) set
up his workspace so he could use the computer standing up. It wasn't the
first time I'd heard of people doing that, but he was the first person I
knew who was giving it a try. After a few days, he swore by it. He's a
smart guy, so I started to give it some serious thought. </p>
<p>A few months later another coworker and friend
(<a href="http://studiosoh.com/">Carol</a>) said she wanted to get a stand-up desk,
and she thought I would be into it too. She was right. I started reading
more about it and found lots of good information in support of this
(links below) and I was sold. It's been about three months now since I
switched, and I'll never go back to sitting down at the computer - this
is biggest positive health change I've made this year (last year it was
<a href="/2009/08/shoes-are-bad.html">ditching my
shoes</a>). </p>
<p>My core is stronger than it's ever been, I haven't had any back issues
since the switch, and I've definitely got more energy than ever. </p>
<p>We are using the <a href="http://bit.ly/3V5GJF">FREDRIK desk from IKEA</a> (\$149),
and <a href="http://amzn.to/9oRJJU">GelPro Chef's Mats</a> from Amazon (\$99). The
desk is perfect because it makes it easy to get the monitor up at eye
level (keeps your head up which means the blood flows more easily to the
brain and you'll have less eye and neck strain). You probably need a
nice gel mat to stand on as well, and the GelPro mat is PERFECT, makes
all the difference in the world. </p>
<p>This is definitely catching on at work (that picture up top is three
standups in a row, and there are another three people here also using
the same setup!) I'm hoping more of my friends give it a try too.
Honestly, this is the kind of stuff that makes your whole life better!
(Also, get more Vitamin-D while you're at it!) </p>
<p>The links:<br>
* Longer you sit, the shorter your life: <a href="http://yhoo.it/d80NWl">http://yhoo.it/d80NWl</a>
* Rethinking the desk: <a href="http://blog.trailmeme.com/2010/04/rethinking-the-desk/">http://blog.trailmeme.com/2010/04/rethinking-the-desk/</a>
* NY Times: <a href="http://nyti.ms/crnR9A">http://nyti.ms/crnR9A</a></p>More people finally catching up!2010-05-02T04:59:00-07:002010-05-02T04:59:00-07:00Christopher Aedotag:localconspiracy.com,2010-05-02:/2010/05/more-people-finally-catching-up.html<p>I just wanted to gloat a little bit. In 2007 we told DirecTV to suck it.
We cut back on our TV watching anyway (because watching less is good for
you, seriously!) What we did want to watch, we were able to <a href="/2009/05/tivo-is-for-suckers.html">get from
the
Internet</a>. </p>
<p>LA Times pointed out …</p><p>I just wanted to gloat a little bit. In 2007 we told DirecTV to suck it.
We cut back on our TV watching anyway (because watching less is good for
you, seriously!) What we did want to watch, we were able to <a href="/2009/05/tivo-is-for-suckers.html">get from
the
Internet</a>. </p>
<p>LA Times pointed out more people were doing that <a href="http://www.latimes.com/business/la-fi-notv26-2009oct26,0,3559474.story">in this article from
October
2009</a>. </p>
<p>Just yesterday, <a href="http://money.cnn.com/2010/04/30/technology/dropping_cable_tv/">CNN Money said one in eight people will drop their
cable this
year</a> in
favor of using the 'net... </p>
<p>Hopefully we'll break our ridiculous TV habit this year. Good reading on
why we should do that here...
<a href="http://www.strike-the-root.com/3/russell/russell4.html">http://www.strike-the-root.com/3/russell/russell4.html</a></p>Week 2 (redux) - 3 for 32010-04-24T21:39:00-07:002010-04-24T21:39:00-07:00Christophertag:localconspiracy.com,2010-04-24:/2010/04/week-2-redux-3-for-3.html<p><a href="/2010/04/excuses-excuses.html">Last week</a>
I got a cold that totally kicked my ass. I was only able to ride on
Monday, and the week went downhill for me after that - so I say this
week is a do-over for last week and will stand as my official "week
2"... </p>
<p>It's definitely getting …</p><p><a href="/2010/04/excuses-excuses.html">Last week</a>
I got a cold that totally kicked my ass. I was only able to ride on
Monday, and the week went downhill for me after that - so I say this
week is a do-over for last week and will stand as my official "week
2"... </p>
<p>It's definitely getting easier to get out the door for the ride. I know
the route well enough to never have to think about it, and have figured
out the quickest way through a few tricky intersections. Not having to
pay attention to the route is nice, I get to space out and think about
other stuff and before I know it I'm home! </p>
<p>Monday was tough this week - it was cold (at least cold for me, low
50's). Thursday was cold too but not quite as bad. By Friday the weather
had gotten beautiful again, that helps a lot. </p>
<p>With two weeks left I think this is going to be an easy habit to get
into. 210 miles commuted so far. I think my next goal will be to commute
(by bike) 1000 miles. How many miles should I ride before I treat myself
to a new bike :D ? </p>
<ul>
<li><a href="http://connect.garmin.com/activity/30640454">To work (4/19)</a></li>
<li>Back home (4/19) - no data :( Forgot to charge the garmin so battery
only lasted for the ride in</li>
<li><a href="http://connect.garmin.com/activity/30936692">To work (4/22)</a></li>
<li><a href="http://connect.garmin.com/activity/30936699">Back home (4/22)</a></li>
<li><a href="http://connect.garmin.com/activity/31080482">To work (4/23)</a></li>
<li><a href="http://connect.garmin.com/activity/31080493">Back home (4/23)</a></li>
</ul>
</p>Excuses, excuses...2010-04-19T21:23:00-07:002010-04-19T21:23:00-07:00Christopher Aedotag:localconspiracy.com,2010-04-19:/2010/04/excuses-excuses.html<p>Last week (4/12 - 4/16) I only managed to ride one day: </p>
<ul>
<li><a href="http://connect.garmin.com/activity/29895034">To work</a></li>
<li><a href="http://connect.garmin.com/activity/29895036">Back home</a></li>
</ul>
<p>It was not fun times. It had rained the night before, so the morning was
cold and wet (though I know it's nothing compared to the weather you
peeps in Chicago get to …</p><p>Last week (4/12 - 4/16) I only managed to ride one day: </p>
<ul>
<li><a href="http://connect.garmin.com/activity/29895034">To work</a></li>
<li><a href="http://connect.garmin.com/activity/29895036">Back home</a></li>
</ul>
<p>It was not fun times. It had rained the night before, so the morning was
cold and wet (though I know it's nothing compared to the weather you
peeps in Chicago get to ride in!) On the way home it was raining for the
beginning of the ride, and then I had a headwind for the rest of the
ride. I think it was my slowest riding yet. </p>
<p>The next day I woke up with a cold (Heather and Nate had a cold the week
before and I though I'd escaped, but I guess not!) Wednesday I felt even
worse and ended up taking a sick day. By then I realized there was no
chance of putting in three rides this week, so I scrapped it. Looks like
I'll be going into May just to make sure I get in four weeks of 3-a-week
rides to work :) </p>
<p>At least I rode today - I'm pretty sure this week will be 3 for 3.</p>
</p>Week 1 - 3 for 32010-04-11T04:10:00-07:002010-04-11T04:10:00-07:00Christophertag:localconspiracy.com,2010-04-11:/2010/04/week-1-3-for-3.html<p><img alt="elevation profile" src="http://3.bp.blogspot.com/_culjsMKCHb4/S8FEdM-7M7I/AAAAAAAAWjQ/TrcKdHzurSI/s1600/elevation+profile.png"><br>
This was the first week to put up or shut up - I committed myself to
riding my bike to work at least three days a week in April. It was
raining cats and dogs Monday morning and I'd only gotten half a nights
sleep due to a vomiting toddler, so …</p><p><img alt="elevation profile" src="http://3.bp.blogspot.com/_culjsMKCHb4/S8FEdM-7M7I/AAAAAAAAWjQ/TrcKdHzurSI/s1600/elevation+profile.png"><br>
This was the first week to put up or shut up - I committed myself to
riding my bike to work at least three days a week in April. It was
raining cats and dogs Monday morning and I'd only gotten half a nights
sleep due to a vomiting toddler, so I talked myself into driving instead
of riding. That meant I was going to be riding two days in a row - I was
a little scared... </p>
<p>All in all, it was not half bad. My ride time improved bit by bit
(except I took it easy on myself on Friday but was still only like two
minutes slower than Thursday!) </p>
<p>With Heather's help I also found my Garmin ANT stick, so if you want to
see the gory details the links are below. It was a pretty fun week of
riding, and I'm looking forward to riding my bike to work a whole lot
more this year. (By the way the bike path along the Orange Line is
fantastic!) </p>
<p>Anyone else riding their bike to work? What's it like for you? </p>
<ul>
<li><a href="http://connect.garmin.com/activity/29236839">To Work (4/6)</a> </li>
<li><a href="http://connect.garmin.com/activity/29236841">Back Home (4/6)</a> </li>
<li><a href="http://connect.garmin.com/activity/29425497">To Work (4/8)</a> </li>
<li><a href="http://connect.garmin.com/activity/29425500">Back Home (4/8)</a> </li>
<li><a href="http://connect.garmin.com/activity/29509355">To Work (4/9)</a> </li>
<li><a href="http://connect.garmin.com/activity/29509364">Back Home (4/9)</a> </li>
</ul>Bon Jovi would be proud2010-04-04T20:00:00-07:002010-04-04T20:00:00-07:00Christophertag:localconspiracy.com,2010-04-04:/2010/04/bon-jovi-would-be-proud.html<p>I know people think it was about something else, but Bon Jovi's "Wanted
Dead Or Alive" was all about bicycles. Steel horse? What else could he
have been talking about? That dude is seriously into bikes... </p>
<p>So I'm ready to kick off my "ride three days a week in April …</p><p>I know people think it was about something else, but Bon Jovi's "Wanted
Dead Or Alive" was all about bicycles. Steel horse? What else could he
have been talking about? That dude is seriously into bikes... </p>
<p>So I'm ready to kick off my "ride three days a week in April" plan this
Monday. The "test ride" to work last Monday wasn't half as bad as I
feared. It took longer than I expected (1:12), but I'll get faster. This
weekend I got panniers so I'll have enough room for clothes and the
computer. I also swapped the pedals, as the bearings were starting to go
in one of the old ones. Light is charged up in case I'm caught in the
dark, and everything is good to go. </p>
<p>I'm using a Garmin 405 to log the mileage, but haven't found the USB key
that transfers the data up to the garmin site... I think I know exactly
which bag it's in, only problem is I have no idea where that bag is.
I'll search for another week before I break down and buy a replacement
(but if you've got an extra, please send it my way!) </p>
<p>Oh by the way, thanks LA weather for getting chilly and rainy for my
first day riding to work :( </p>
<p><img alt="picture" src="/images/Screen+shot+2010-04-04+at+10.59.56+AM.png"></p>Shaming myself into fitness2010-03-18T03:37:00-07:002010-03-18T03:37:00-07:00Christophertag:localconspiracy.com,2010-03-18:/2010/03/shaming-myself-into-fitness.html<p>A few years ago I would occasionally ride my bike to work (25 miles each
way). I stopped when we had Nate because there was no way I could get
home in time to have dinner with him if I rode. I also got pretty damn
lazy the first year …</p><p>A few years ago I would occasionally ride my bike to work (25 miles each
way). I stopped when we had Nate because there was no way I could get
home in time to have dinner with him if I rode. I also got pretty damn
lazy the first year after we (well, Heather) had him (and I sure put on
my fair share of baby weight!) </p>
<p>Now that I've got a new job it's easier to shift my schedule around a
bit so heading for home on the early side won't be conspicuous and
frowned upon. It's also closer to home (15 miles each way), and the way
back home has a lot less uphill. That means the only real barrier is me.
Damn. </p>
<p>THAT'S why I'm going to start talking about it here, and probably on
facebook and twitter (or maybe I'll just always talk about it here and
post links elsewhere...) The more people who know about it, the more
people there will be to give me crap if I don't follow through! </p>
<p>Here's the deal: I'm going to start riding my bike to work in April. I'm
going to do it three days a week. With any luck, by the end of April
I'll be so used to it, riding my bike to work will have become a regular
habit. </p>
<p>Wish me luck! </p>
<p>-Christopher</p>Barefoot running on the radio2010-03-18T03:35:00-07:002010-03-18T03:35:00-07:00Christopher Aedotag:localconspiracy.com,2010-03-18:/2010/03/barefoot-running-on-the-radio.html<p>On national radio, the editor-in-chief of Runner's World (David Willey)
shills for the shoe companies while spreading misinformation. This piece
on NPR from last week started promisingly, but the guy doing the story
didn't bother to question this statement:<br>
"If you are a very efficient and biomechanically gifted runner, running …</p><p>On national radio, the editor-in-chief of Runner's World (David Willey)
shills for the shoe companies while spreading misinformation. This piece
on NPR from last week started promisingly, but the guy doing the story
didn't bother to question this statement:<br>
"If you are a very efficient and biomechanically gifted runner, running
barefoot could probably work for you." </p>
<p>I was not surprised that the editor of a running magazine (which makes
nearly all of it's money from shoe ads) was dismissive of barefoot
running. I WAS surprised that the guy from NPR presented Willey as the
expert on all things running, and didn't question a single thing he
said. </p>
<p>The worst quote, when asked what would happen if everyone chucked their
shoes, Willey replies "If a lot of runners - or all the runners out
there in America - did that tomorrow, the vast majority of them would
get hurt very quickly and would have to stop running for a very long
time." </p>
<p>The audio and print story is online at:<br>
<a href="http://www.npr.org/templates/story/story.php?storyId=112995970">http://www.npr.org/templates/story/story.php?storyId=112995970</a> </p>
<p>-Christopher</p>About Christopher Aedo2010-02-26T01:30:00-08:002010-02-26T01:30:00-08:00Christopher Aedotag:localconspiracy.com,2010-02-26:/2010/02/about-christopher-aedo.html<p>For the longest time, this site has had no "about" page. It's
Christopher Aedo's personal blog, so it's not very professional or
career oriented. Just the same, there are plenty of useful tech-related
posts sprinkled in here and there (so there's definite bleed-over
between private and professional stuff). In addition …</p><p>For the longest time, this site has had no "about" page. It's
Christopher Aedo's personal blog, so it's not very professional or
career oriented. Just the same, there are plenty of useful tech-related
posts sprinkled in here and there (so there's definite bleed-over
between private and professional stuff). In addition to the tech stuff,
I love to brew beer, mountain bike, run, lift, do adventure races, camp,
dive, build things and fly airplanes. All of THAT stuff tends to keep
my mind pretty open and active, so at work I am good at thinking around
corners and bringing a unique perspective. </p>
<p>Considering the fact that the search engines are indexing the goods, I
might as well throw in something to address the professional side of me.
So how about an abrupt transition to a professional-profile to cover
the old "what's this guy all about on the work side of life?" </p>
<p>Professionally, in every position I’ve held (full-time, contract based
or even advisory), I’ve become the nexus between nearly all departments.
I have a talent for presenting extremely complicated concepts in an easy
to digest manner for even the most non-technical folk. I believe more
communication is often better than less, and I always try to make sure
people understand WHY we are doing something first and foremost. As a
talented communicator, I’ve been invited to speak at multiple
conferences both in the US as well as internationally. Most recently in
Okinawa I learned the true spirit of “omotenashi” at what was probably
my most exciting speaking engagement yet. (It is very difficult to
translate into english, but it has to do with perfect hospitality -
every time I visit Japan I am reminded again of how friendly and
welcoming their culture is!) </p>
<p>When it comes to management, I see the people I’m in charge of as humans
with amazing talents rather than simply a group of interchangeable or
easily replaced assets. The most important thing I can do is try to
foster their strengths and improve their weaknesses, and make sure we’re
striking the best possible balance of mutual benefit. Building fantastic
teams is not easy, but it’s probably been the best part of every
position I’ve held. I’m proud of what I’ve accomplished to date, but I’m
far more thankful for all the incredibly talented people I’ve been able
to work with so far. </p>
<p>If you do find any of this to be interesting, feel free to contact me at
<a href="mailto:doc@aedo.net">doc@aedo.net</a>, or <a href="http://www.linkedin.com/in/aedo/">via
LinkedIn</a>.</p>Mashing with steam2009-08-20T04:10:00-07:002009-08-20T04:10:00-07:00Christopher Aedotag:localconspiracy.com,2009-08-20:/2009/08/mashing-with-steam.html<p>I've been brewing beer for a little while now, and have been having a
lot of fun with it. As it seems to go with all my hobbies I just kept
escalating, expecting to eventually have a huge crazy brewing setup (aka
"<a href="http://www.alenuts.com/Alenuts/brutus.html">brew sculpture</a>") with
three computer controlled burners, multiple …</p><p>I've been brewing beer for a little while now, and have been having a
lot of fun with it. As it seems to go with all my hobbies I just kept
escalating, expecting to eventually have a huge crazy brewing setup (aka
"<a href="http://www.alenuts.com/Alenuts/brutus.html">brew sculpture</a>") with
three computer controlled burners, multiple pumps with plumbing and
solenoid-valves to move the liquid from stage to stage along the way,
etc. My plan was to work up to that when I started all-grain brewing,
but luckily those plans were derailed. (I say luckily because it would
have ended up costing me hundreds, if not a few grand!) </p>
<p>As I started to learn about all-grain brewing, the concept of using a
<a href="http://www.homebrewtalk.com/f11/rims-vs-herms-8448/">HERMS</a> looked like
a great approach to me. I expected I could set everything up indoors,
using electric (and would only need to pull a new 220v circuit, wouldn't
need anything else.) Since I was going to use a heating element, I might
as well control it with a computer. In the process of looking into
whether anyone else was using an <a href="http://www.arduino.cc/">Arduino</a> to
control a HERMS setup (and <a href="http://www.brewboard.com/index.php?showtopic=77935">there are people using an Arduino in the
brew process</a>), I
came across a pretty interesting setup. <a href="http://iam.homebrewtalk.com/Yuri_Rage">Yuri
Rage</a> on homebrewtalk.com had
taken a 5 gallon keg, replaced the fittings, and was using it as a
pressurized steam vessel! <a href="http://www.homebrewtalk.com/f51/diy-steam-mash-system-yuri-27070/">Check out the
results!</a> </p>
<p>I thought it was a really neat idea, and using steam was pretty
appealing since it's an incredibly efficient way to transfer energy. The
problem I kept seeing with using HERMS is that it takes way too long to
raise your mash temp. You can go with a RIMS approach and potentially
move the temp up faster, but then you still run the risk of scorching
your wort and or having a really watery wort if you're going to pump
high volume quickly. All the approaches I saw looked overly complex and
expensive, and it started to look to me like people were putting this
stuff together not to brew better beer, but just to build a really
impressive system. </p>
<p>I went back to the forums for info on steam, and saw everything I
needed. These posts from <a href="http://www.homebrewtalk.com/f51/easy-steam-infusion-mash-system-25974/">Fly
Guy</a>
and <a href="http://www.homebrewtalk.com/f11/mash-steamer-2-a-21888/">Beerman</a>
sealed the deal for me. They were both using a plain old stove-top
pressure cooker with a valve at the top, and sending the steam down to a
simple manifold made from copper tubing, into a classic Igloo cooler
mash tun! Using this setup I've been able to raise the mash temp 10
degrees in just over 5 minutes (that was with 9lbs of grain I think.) No
risk of scorching the grain since the highest temp you'll get into the
grain will be under 240 - just make sure you stir the hell out of it
while applying heat and all should be good. </p>
<p>I put <a href="http://picasaweb.google.com/christopheraedo/BeerStuff#">pictures of my setup
online</a>, feel
free to email me if you have any questions at all. I'm extremely happy
with this setup, and believe I'm equipped to do just about anything I
need to with brewing, all for probably about \$200! </p>
<p>(As an aside: I found a great writeup someone had done about why he was
not a fan of using HERMS. The guy laid out details on how fast you could
raise the mash, and why it was not the best way to brew; basically he
said you can NOT do it fast enough with a HERMS. I think he went on to
discuss using steam for mash temp control and showed how much more
efficient it was - but I'll be damned if I can find it now! Too bad, it
was really interesting, can't believe I didn't bookmark it...) </p>
<p>More links on the topic: </p>
<ul>
<li><a href="http://www.spykman.com/simm/what.html">This one</a> is probably <a href="http://www.spykman.com/simm/simm.html">the
most elaborate setup</a> I've
seen, looks like it works great!</li>
<li><a href="http://www.mtbrewing.com/2009/03/25/choosing-heating-technique-for-single-infusion-mashing/">Choosing your heating
method</a></li>
<li>Greg at <a href="http://www.brewsupply.com/">Culver City Homebrew</a> pointed
me at <a href="http://www.brewingtechniques.com/library/backissues/issue2.4/jones.html">this article on the subject at Brewing
Techniques</a>,
good reading. </li>
</ul>
</p>shoes are bad!2009-08-19T21:52:00-07:002009-08-19T21:52:00-07:00Christopher Aedotag:localconspiracy.com,2009-08-19:/2009/08/shoes-are-bad.html<p>EXCELLENT book, probably one of the best I've read recently:<br>
<a href="http://www.amazon.com/gp/product/0307266303?ie=UTF8&tag=httplocalcons-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0307266303">Born to Run: A Hidden Tribe, Superathletes, and the Greatest Race the
World Has Never
Seen</a><img alt="book" src="http://www.assoc-amazon.com/e/ir?t=httplocalcons-20&l=as2&o=1&a=0307266303"> </p>
<p>Good article (shoes are bad!), <a href="http://www.popularmechanics.com/outdoors/sports/4314401.html">Popular Mechanics says
so</a>! </p>
<p>Another good article (seriously, shoes are bad!), <a href="http://www.popsci.com/entertainment-amp-gaming/article/2009-05/running-barefoot">Popular Science
agrees</a>! </p>
<p>-Christopher<br>
[UPDATE: Some interesting links …</p><p>EXCELLENT book, probably one of the best I've read recently:<br>
<a href="http://www.amazon.com/gp/product/0307266303?ie=UTF8&tag=httplocalcons-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0307266303">Born to Run: A Hidden Tribe, Superathletes, and the Greatest Race the
World Has Never
Seen</a><img alt="book" src="http://www.assoc-amazon.com/e/ir?t=httplocalcons-20&l=as2&o=1&a=0307266303"> </p>
<p>Good article (shoes are bad!), <a href="http://www.popularmechanics.com/outdoors/sports/4314401.html">Popular Mechanics says
so</a>! </p>
<p>Another good article (seriously, shoes are bad!), <a href="http://www.popsci.com/entertainment-amp-gaming/article/2009-05/running-barefoot">Popular Science
agrees</a>! </p>
<p>-Christopher<br>
[UPDATE: Some interesting links below] </p>
<ul>
<li><a href="http://www.quickswood.com/my_weblog/2006/08/athletic_footwe.html">Podiatrist advocates going
barefoot</a></li>
<li><a href="http://www.ft.com/cms/s/2/fd929f02-2d75-11de-9eba-00144feabdc0.html">U.K.s first barefoot
trail</a></li>
<li><a href="http://www.barefooters.org/">Barefooters.org</a></li>
<li><a href="http://discovermagazine.com/2006/may/tramps-like-us">Great article at Discover.com (from
2006)</a></li>
<li><a href="http://www.thedailyshow.com/watch/tue-august-18-2009/christopher-mcdougall">Christopher McDougall, author of Born to Run on the Daily
Show</a></li>
<li><a href="http://www.whyy.org/podcast/051809_110630.mp3">McDougall interview on
WHYY</a></li>
<li><a href="http://borntorun.org">Born To Run website</a></li>
</ul>Homebrew Primer2009-08-19T21:51:00-07:002009-08-19T21:51:00-07:00Christopher Aedotag:localconspiracy.com,2009-08-19:/2009/08/homebrew-primer.html<p>I wrote this up for my friend Moshe, and have since forwarded it to
probably five or six people who are interested in brewing their own
beer. I thought I might as well put it up here, should make it a lot
easier for me to share! </p>
<p>WOW, here's my …</p><p>I wrote this up for my friend Moshe, and have since forwarded it to
probably five or six people who are interested in brewing their own
beer. I thought I might as well put it up here, should make it a lot
easier for me to share! </p>
<p>WOW, here's my home brew primer. It's long, but if you read it all you
will have all the info you need to get started. You could get most of
this same information from the book <a href="http://www.amazon.com/gp/product/0380763664?ie=UTF8&tag=httplocalcons-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0380763664">The New Complete Joy of Home
Brewing</a>,
which is a pretty good book to start with. You could also just go to
<a href="http://www.homebrewtalk.com/">http://www.homebrewtalk.com/</a> and check out their forum where you can
find a few good starter guides.... One other good book I could suggest:
<a href="http://www.amazon.com/gp/product/0937381888?ie=UTF8&tag=httplocalcons-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0937381888">How to Brew: Everything You Need To Know To Brew Beer Right The First
Time</a>.</p>
<p>BREWING STEP ONE:<br>
The three main methods of home-brewing are "extract", "partial-mash" and
"all grain". </p>
<p>Extract brewing uses malt extract (either liquid or dried malt extract
[aka DME]). This malt extract is a syrup-like (or powdered)
concentration of the sugars contained in the grain. It's extracted from
the grain and concentrated under pressure, and sold by the pound.
Brewing with extract is easy, and requires a smaller brew pot (because
you only need to boil 3 gallons or so of liquid since the malt is highly
concentrated - you add water to bring your total volume up to 5 gallons
AFTER you've done all the brewing...) The only drawback is that it's not
considered "pure" brewing, since someone else has done some of the work
for you. SOME people claim they can taste the difference between an
extract and all-grain brew, but most people would never know the
difference. Extract brewing is AOK... You need a brew pot at least 4 or
5 gallons for this. </p>
<p>Partial-mash uses extract plus a small amount of specialty grains used
to influence the beers flavor to match the particular style. For
instance, a recipe might call for six pounds of pale malt extract, plus
another pound of some specific grains. These grains will be steeped in
160 degree water for 20-30 minutes, and then that liquid will be poured
through a strainer into your beer. For best results, those leftover
grains would then have 170-200 degree water poured over them to rinse
the last of the sugars off the grain (this process is called sparging).
Some recipe kits come with a mesh sock to put the grains in, so you
would not need to strain the grains out, just pull out the sock. This
method makes it a little harder to "sparge" the grains, but you're
really not getting much sugar out of such a small amount of grain
anyway, so it probably doesn't matter. You need a brew pot at least 4 or
5 gallons for this. </p>
<p>Finally, there is "all grain" brewing, where you start with a big bag of
ground grain (10lbs up to 20lbs depending on the beer, though the more
grain the higher the gravity/alcohol content), extract all the sugars
yourself, and then proceed from there the same as you would have with
any other method. Getting the sugars out is called "mashing", and can
seem complicated and daunting at first. In short though, you need to
control the temperature of the grain at two different temperatures, and
possibly three or more depending on the type of grain and the specific
recipe you are using. There are entire books about this process, so I
don't think I can give it justice here in a paragraph or two, so I won't
even really try. The main consideration for someone just getting started
is that all-grain brewing requires more (and larger) equipment. First
off, you need a boil kettle that can handle at least 7 gallons, or
possibly more. Many people convert a half-barrel keg (like the kind you
would rent for a party) into a brew kettle, since they're about 15
gallons in size. That also means you probably have to boil your beer
outside unless you have a really large cooktop. People use the burner
setup that comes with a turkey fryer (available from home depot most
commonly.) So you need at least one large kettle, possibly two. One will
be your Hot Liquor Tank (HLT), where you heat up the water for the
grains. The other would be your brew kettle where you boil your wort
(the sweet liquor you extracted from the grains, pronounced "wurt"). I
just have one large kettle, and find that to be pretty easy. Then you
need a large (7-10 gallon) water cooler to hold the grain and water
during the mash. These coolers work pretty well since they hold the
temperature for a long time. If you don't want to use a cooler, and have
a large pot available, you can keep the grains in the large pot and heat
them directly. This can be tricky though, as you risk scorching the
grains while applying heat - this can give your beer some off flavors. </p>
<p>Wow, that's already a lot about all-grain, I think I'll let it rest
there. I can talk for a while about this in person, and show you the
setup I'm using (<a href="/2009/08/mashing-with-steam.html">where you use steam to heat the
grain</a>),
it works really well and was not terribly expensive.<br>
<span style="font-weight: bold;"><br>
BREWING STEP TWO</span>:<br>
Now you've got your wort and it's either 3 gallons or 6 (or more if
you're doing a large batch or brewing a high gravity beer that has a lot
of volume you need to concentrate.) Let's assume you're doing an extract
brew as that's the easiest. You want a vigorous rolling boil during this
hour, and the timer starts once you hit the boiling point. Most recipes
call for a one hour boil during which time you will add hops to the wort
according to a schedule. You'll usually add some hops at the beginning,
then after 45 minutes add more, and finally there will be your bittering
hops added right at the end after you've turned off the heat.<br>
<span style="font-weight: bold;"><br>
BREWING STEP THREE</span>:<br>
You've boiled your wort for an hour, now you need to cool it down to
about 70 degrees, add water to bring it up to the necessary volume, add
your yeast, and then wait! There are a few different methods you can use
to cool the wort. Simplest (and I've done this many times) is to
transfer from your boil pot into a fermentation bucket that already has
a bunch of ice in it. The boiling wort will melt the ice and if you're
lucky, it will stabilize around 70 degrees. I usually would just cover
it up and let it sit until it got to the right temperature at this
point. I also made a "chiller", which is a coil of copper tubing through
which you pump cold water. You put the tubing in the wort, and keep
recirculating cold water through it while occasionally stirring the
wort. You can also buy a counter-flow chiller, a chillerator or a
chillzilla.... There are many options, and most of them get pretty
expensive. </p>
<p>OH, before pitching the yeast, it's really important to oxygenate the
beer. You can do this by shaking the hell out of the bucket or carboy,
or by pumping oxygen through a small stone with either an oxygen tank or
an aquarium pump. </p>
<p>Anyway, once it's chilled, you put it in a bucket or glass bottle (aka
carboy) for fermentation. Pitch your yeast into the mixture, and seal it
with an airlock so the gas the yeast creates can escape without allowing
air from the outside to get back in (which can contaminate your brew.)
After a week or so of fermenting, I usually transfer to another carboy
using a siphon. This is so you can leave the now dead yeast at the
bottom of the first vessel, and let it sit for another week or two in a
new vessel, allowing all the suspended grains and yeast to settle to the
bottom. This helps you get a clear beer, so there won't be any sediment
in the bottom of the glass when you're drinking it a few weeks later.
During fermentation, every strain of yeast will have a specific
temperature range that it performs best in. The recipe will usually
suggest a yeast or two, and will also usually say what the optimum
fermentation temperature is. I've been using a small wine fridge for
fermentation, it's convenient and keeps the beer at whatever temp you
set on the front. </p>
<p>After fermentation is all done, you can either bottle the beer, or put
it into a keg. If you are going to bottle, you need to add some sugar to
the beer again. Once the beer is sealed in a bottle, the small
additional sugar will wake up the yeast again and carbonate your beer.
If you put too much sugar, you might end up with bottles that explode
due to excessive pressure. </p>
<p>If you're going to keg (by far the easiest way) you just transfer the
beer into the keg, and seal it up. Then you cool it to 40 degrees, and
pressurize with your CO2 canister. After three days to a week, the beer
will have absorbed the CO2 and will be carbonated and ready to drink!
Some beers are ready at this point (roughly three weeks from when you
brewed), other beers can take 3 to 6 months to properly condition (they
won't taste quite right if you don't wait long enough with some of the
more complicated beers.) ECONOMY: You can expect to spend from \$70 to
\$500 on your initial investment. Spending a lot up front probably means
you won't need to buy anything but ingredients for a while. </p>
<p>Good sources for starter kits:</p>
<ul>
<li><a href="http://makebeer.net/item.asp?idProduct=1&idCategory=1&idSubCategory=0">Coopers complete starter
kit</a></li>
<li><a href="http://www.northernbrewer.com/starterkits.html">http://www.northernbrewer.com/starterkits.html</a></li>
</ul>
<p>At the bottom of that Northern Brewer page, their ultimate kit would get
you started with everything you need, including keg. You might be able
to piece things together for less, or work your way up to having all the
pieces over time. I guess it depends on how much you want to invest in
the beginning. </p>
<p>One gallon is 128 fluid ounces, which means a five gallon keg contains
53 12oz beers. Assume \$10 for 12 "premium" beers, that's about \$44
worth of premium beer in a keg. The ingredients would cost around \$30,
so the more beer you drink, the more money you save! You can spend more
(\$40-\$45) on ingredients, but that's for a pretty serious brew, and
then you're talking about copying a beer like Arrogant Bastard Ale which
I think costs \$10 for just a six pack! That means your keg would hold
roughly \$90 worth of beer!! </p>
<p>A good starting point would be the extract recipe kits they sell at
Northern Brewer, take a look at them on their site. Another good
alternative is to come in to the brew shop in Culver City and use one of
their recipes. They have all the ingredients there, and help put the kit
together if you're using one of their recipe packages.</p>a start2009-08-19T17:05:00-07:002009-08-19T17:05:00-07:00Christopher Aedotag:localconspiracy.com,2009-08-19:/2009/08/a-start.html<p>I've had a few different blogs over the years, but I've never paid much
attention to them, and eventually abandoned them generally due to lack
of (personal) interest. With luck, I won't give up on this one! </p>
<p>I don't imagine there will be an overriding theme, I'm just hoping I'll …</p><p>I've had a few different blogs over the years, but I've never paid much
attention to them, and eventually abandoned them generally due to lack
of (personal) interest. With luck, I won't give up on this one! </p>
<p>I don't imagine there will be an overriding theme, I'm just hoping I'll
post some interesting things now and then without seeming narcissistic
(I draw the line at a blog, and steadfastly refuse to participate in
tweets and other madness; honestly, the world at large does not need to
know you're on your way to starbucks. If you're concerned with letting
your friends know where you're headed, THEN F*ING CALL THEM!) </p>
<p>Uh oh, I better stop here. Maybe my first real post will be about how
things like twitter make me feel sad for the participants... </p>
<p>-Christopher</p>