<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Greg Taylor</title><link href="http://gc-taylor.com/" rel="alternate"></link><link href="http://gc-taylor.com/feeds/all.atom.xml" rel="self"></link><id>http://gc-taylor.com/</id><updated>2013-04-16T14:40:00-04:00</updated><entry><title>EMDR Map Sheds its Snake Skin</title><link href="http://gc-taylor.com/blog/2013/04/16/emdr-map-sheds-its-snake-skin/" rel="alternate"></link><updated>2013-04-16T14:40:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-04-16:blog/2013/04/16/emdr-map-sheds-its-snake-skin/</id><summary type="html">&lt;p&gt;As a fun exercise, I set out to re-write the WebSocket server behind
&lt;a class="reference external" href="http://map.eve-emdr.com/"&gt;&lt;span class="caps"&gt;EMDR&lt;/span&gt; Map&lt;/a&gt; in &lt;a class="reference external" href="http://golang.org/"&gt;GoLang&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="the-python-version"&gt;
&lt;h2&gt;The Python&amp;nbsp;version&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://github.com/dliverman/eve-market-ping-map/blob/727a43a4660af72ddd037ad0bec9e9bfc249f969/ws_server.py"&gt;initial version&lt;/a&gt;
of the WebSocket server powering the map was developed
with Python, gevent-websockets, and ZeroMQ. While the original Python version
was pretty simple, it was much heavier on memory and didn&amp;#8217;t free resources
very quickly after disconnections. My biggest gripe was that I wasn&amp;#8217;t entirely
happy with how the Greenlets interacted with one another. Time to
needlessly re-invent the wheel for fun and&amp;nbsp;profit!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-golang-version"&gt;
&lt;h2&gt;The GoLang&amp;nbsp;version&lt;/h2&gt;
&lt;p&gt;After &lt;a class="reference external" href="https://github.com/dliverman/eve-market-ping-map/tree/master/server"&gt;cobbling something together&lt;/a&gt;,
I found that some resources were saved, but nothing earth-shattering. More
importantly, I feel that the channels and goroutines pattern makes a lot more
sense for this particular project than my coroutines and internal ZeroMQ&amp;nbsp;sockets.&lt;/p&gt;
&lt;p&gt;I apologize for the lack of build instructions or documentation of any sort,
but such is the norm for my experiments like&amp;nbsp;this!&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;See the &lt;a class="reference external" href="http://map.eve-emdr.com/"&gt;&lt;span class="caps"&gt;EMDR&lt;/span&gt; Map&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;View the &lt;a class="reference external" href="https://github.com/dliverman/eve-market-ping-map"&gt;project on GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</summary><category term="GoLang"></category></entry><entry><title>Linode NextGen</title><link href="http://gc-taylor.com/blog/2013/04/09/linode-nextgen/" rel="alternate"></link><updated>2013-04-09T14:40:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-04-09:blog/2013/04/09/linode-nextgen/</id><summary type="html">&lt;p&gt;As of today, Linode announced the completion of their upgrade effort, dubbed
&amp;#8220;&lt;a class="reference external" href="http://blog.linode.com/2013/04/09/linode-nextgen-ram-upgrade/"&gt;Linode NextGen&lt;/a&gt;&amp;#8220;. Upgrading an internaitonal fleet of servers is nothing to
sneeze at, but they succeeded with flying&amp;nbsp;colors.&lt;/p&gt;
&lt;p&gt;In the last few months, we saw&amp;nbsp;Linode:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Double the amount of &lt;span class="caps"&gt;RAM&lt;/span&gt; per&amp;nbsp;instance&lt;/li&gt;
&lt;li&gt;Bump all instances up to eight virtual cores (from&amp;nbsp;four)&lt;/li&gt;
&lt;li&gt;Invested heavily in improving their&amp;nbsp;network&lt;/li&gt;
&lt;li&gt;Bump instance outbound cap by&amp;nbsp;5x&lt;/li&gt;
&lt;li&gt;Increased outbound monthly transfer by&amp;nbsp;10x&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They have allowed much higher usage of their resources without compromising on
performance. This wasn&amp;#8217;t a matter of just upping the quotas and calling it
a&amp;nbsp;day.&lt;/p&gt;
&lt;div class="section" id="why-does-it-matter"&gt;
&lt;h2&gt;Why does it&amp;nbsp;matter?&lt;/h2&gt;
&lt;p&gt;One only need take a look at &lt;a class="reference external" href="http://www.lowendbox.com/"&gt;lowendbox&lt;/a&gt; or &lt;a class="reference external" href="http://serverbear.com/"&gt;ServerBear&lt;/a&gt; to see that there
are plenty of affordable options for &lt;span class="caps"&gt;VPS&lt;/span&gt; providers. Linode is still nowhere
close to being the cheapest, but that&amp;#8217;s not really Linode&amp;#8217;s game. They&amp;#8217;re going
to give you something a little faster, a little more roomy, and they&amp;#8217;re going
to keep you happy wth their support. While it&amp;#8217;s entirely possible you&amp;#8217;ll find
someone with similar specs, you&amp;#8217;ll be hard pressed to find a competitor with
the strength of this offering from top to bottom (price, hardware, network,&amp;nbsp;service/support).&lt;/p&gt;
&lt;p&gt;Linode has traditionally been a little more expensive, very developer-centric,
and has (in my experience) had a pretty good customer service story.
These latest round of upgrades don&amp;#8217;t push Linode down into the &amp;#8220;budget&amp;#8221;
category (nor should they), but they do make a good chunk of their competitors in
the same category/price range look inadequate. For example, I&amp;#8217;m not sure
how I could justify using &lt;a class="reference external" href="http://www.rackspace.com/cloud/servers/pricing/"&gt;Rackspace&lt;/a&gt; after these adjustments for &lt;em&gt;my own&lt;/em&gt;&amp;nbsp;purposes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="we-all-win"&gt;
&lt;h2&gt;We all&amp;nbsp;win&lt;/h2&gt;
&lt;p&gt;Regardless of whether you use Linode or even &lt;em&gt;like&lt;/em&gt; them, let&amp;#8217;s be clear
about one thing: When upgrades and bigger jumps like this happen, we all win.
Other providers are going to look at this and will have to decide whether their
current offerings need a shot in the arm. Linode is no industry
juggernaut, but they are well known enough for this to cause a few&amp;nbsp;ripples.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s sit back and see who makes the next big&amp;nbsp;jump.&lt;/p&gt;
&lt;/div&gt;
</summary><category term="Cloud"></category></entry><entry><title>Amazon Route 53 DNS failover</title><link href="http://gc-taylor.com/blog/2013/04/02/amazon-route53-failover/" rel="alternate"></link><updated>2013-04-02T00:03:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-04-02:blog/2013/04/02/amazon-route53-failover/</id><summary type="html">&lt;p&gt;While it is no longer shiny and new, I just recently got a chance to sit down and
play with &lt;a class="reference external" href="http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html"&gt;Amazon Route 53&amp;#8217;s &lt;span class="caps"&gt;DNS&lt;/span&gt; failover&lt;/a&gt;
feature. So far, I have found it to be simple and very useful for simple
cases where &lt;span class="caps"&gt;DNS&lt;/span&gt; fail-over is&amp;nbsp;acceptable.&lt;/p&gt;
&lt;div class="section" id="my-usage-case"&gt;
&lt;h2&gt;My usage&amp;nbsp;case&lt;/h2&gt;
&lt;p&gt;I run &lt;a class="reference external" href="http://www.eve-emdr.com/"&gt;&lt;span class="caps"&gt;EVE&lt;/span&gt; Market Data Relay&lt;/a&gt; (&lt;span class="caps"&gt;EMDR&lt;/span&gt;), which
is a distributed &lt;span class="caps"&gt;EVE&lt;/span&gt; Online market data distribution system. All pieces of
the infrastructure have at least one redundant copy, and the only single
point of failure is the &lt;span class="caps"&gt;DNS&lt;/span&gt; service itself. We can afford to lose a little
bit of data during fail-over, but a complete outage is something we can&amp;#8217;t&amp;nbsp;have.&lt;/p&gt;
&lt;p&gt;Sitting at the top of the system are two &lt;span class="caps"&gt;HTTP&lt;/span&gt; gateways on different
machines at different ISPs. These are set up as a weighted record set, with
each gateway weighing in at 50/50 (requests are divided&amp;nbsp;evenly).&lt;/p&gt;
&lt;p&gt;We introduce the Route 53 magic by adding in a health check and associating
it with each of the two resource record sets. The health check involves
Route 53 servers around the world periodically calling a pre-determined
&lt;span class="caps"&gt;URL&lt;/span&gt; on the two &lt;span class="caps"&gt;HTTP&lt;/span&gt; gateways in search for a non-error &lt;span class="caps"&gt;HTTP&lt;/span&gt; status code.
If any of the entries fails more than three times (they check roughly
every 30 seconds), said entry is removed from the weighted&amp;nbsp;set.&lt;/p&gt;
&lt;p&gt;By the time that Route 53 picks up on the failure, yanks the entry from
the weighted set, and most fast &lt;span class="caps"&gt;ISP&lt;/span&gt; &lt;span class="caps"&gt;DNS&lt;/span&gt; servers notice the change, about
two minutes have&amp;nbsp;elapsed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="why-this-is-a-good-fit-for-emdr"&gt;
&lt;h2&gt;Why this is a good fit for&amp;nbsp;&lt;span class="caps"&gt;EMDR&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;With &lt;a class="reference external" href="http://www.eve-emdr.com/"&gt;&lt;span class="caps"&gt;EVE&lt;/span&gt; Market Data Relay&lt;/a&gt;, it&amp;#8217;s not the end of
the world if 50% of user-submitted data gets lost over the minute and a half
it takes for Route 53 to remove the unhealthy gateway. It&amp;#8217;s highly likely that
another user will re-submit the very same data that was lost. Even if we never
see the data, the loss of a few data points here and there doesn&amp;#8217;t hurt us much
in our&amp;nbsp;case.&lt;/p&gt;
&lt;p&gt;With that said, &lt;span class="caps"&gt;DNS&lt;/span&gt; failover in general can be sub-optimal in a few basic&amp;nbsp;cases:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;You don&amp;#8217;t want to leave failover up to the many crappy &lt;span class="caps"&gt;ISP&lt;/span&gt; &lt;span class="caps"&gt;DNS&lt;/span&gt; servers
around the net. Not all will pick up the change in a timely&amp;nbsp;manner.&lt;/li&gt;
&lt;li&gt;You can&amp;#8217;t afford to lose some requests here and there. &lt;span class="caps"&gt;DNS&lt;/span&gt; failover isn&amp;#8217;t
seamless, so your application would need to be smart enough on both
ends if data loss is&amp;nbsp;unacceptable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more simple cases like mine, it&amp;#8217;s&amp;nbsp;wonderful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="price"&gt;
&lt;h2&gt;Price&lt;/h2&gt;
&lt;p&gt;In my case, Route 53 is health checking two servers that are external to
&lt;span class="caps"&gt;AWS&lt;/span&gt;, which means I spend a whopping $1.50/month on Route 53&amp;#8217;s &lt;span class="caps"&gt;DNS&lt;/span&gt;&amp;nbsp;failover.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="assorted-useful-bits-of-documentation"&gt;
&lt;h2&gt;Assorted useful bits of&amp;nbsp;documentation&lt;/h2&gt;
&lt;p&gt;More details on how the health checks work can be found on the
&lt;a class="reference external" href="http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html"&gt;Route 53 documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a class="reference external" href="http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html"&gt;Amazon Route 53 &lt;span class="caps"&gt;DNS&lt;/span&gt; failover&lt;/a&gt;
documentation for the full&amp;nbsp;run-down.&lt;/p&gt;
&lt;/div&gt;
</summary><category term="Cloud"></category><category term="Programming"></category></entry><entry><title>Patwright mentioned in the Greenville Journal</title><link href="http://gc-taylor.com/blog/2013/04/01/pathwright-mentioned-in-the-greenville-journal/" rel="alternate"></link><updated>2013-04-01T23:30:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-04-01:blog/2013/04/01/pathwright-mentioned-in-the-greenville-journal/</id><summary type="html">&lt;p&gt;The Greenville Journal just did a neat &lt;a class="reference external" href="http://greenvillejournal.com/business/2122-pathwright-tackles-the-course-of-education.html"&gt;interview&lt;/a&gt; piece on Pathwright with
Paul. This may or may not be interesting to others here, but I figured
I&amp;#8217;d&amp;nbsp;share.&lt;/p&gt;
</summary><category term="Pathwright"></category></entry><entry><title>namecheap.com EssentialSSL and Amazon ELB</title><link href="http://gc-taylor.com/blog/2013/03/29/namecheap-essentialssl-cert-chain-aws-elb/" rel="alternate"></link><updated>2013-03-29T13:30:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-03-29:blog/2013/03/29/namecheap-essentialssl-cert-chain-aws-elb/</id><summary type="html">&lt;p&gt;For those using the &lt;span class="caps"&gt;SSL&lt;/span&gt; capabilities of Amazon Elastic Load Balancer (&lt;span class="caps"&gt;ELB&lt;/span&gt;),
you often need to upload a &lt;em&gt;Certificate Chain&lt;/em&gt; to avoid &lt;span class="caps"&gt;SSL&lt;/span&gt; errors in some&amp;nbsp;browsers.&lt;/p&gt;
&lt;p&gt;We use &lt;a class="reference external" href="http://www.namecheap.com/"&gt;Namecheap&lt;/a&gt; and their Comodo &lt;a class="reference external" href="http://www.namecheap.com/ssl-certificates/comodo.aspx"&gt;EssentialSSL&lt;/a&gt; wildcard certs. If you
specify &amp;#8220;Other&amp;#8221; as your server type, you&amp;#8217;ll get a collection of files
that comprise the Certificate Chain/&lt;span class="caps"&gt;CA&lt;/span&gt; Bundle, instead of a single file
(like you&amp;#8217;d get if you specified Apache during the &lt;span class="caps"&gt;CSR&lt;/span&gt; submission process).
If you haven&amp;#8217;t purchased your cert yet, save yourself some trouble and
just say you&amp;#8217;re using Apache. If you specified &amp;#8220;Other&amp;#8221; or have found yourself
with a bunch of *.crt files, read&amp;nbsp;on.&lt;/p&gt;
&lt;p&gt;I am going to assume that you are using OpenSSL. I am also going to assume
that you have the same files I do. If this isn&amp;#8217;t the case, you could try
downloading their &lt;a class="reference external" href="https://support.comodo.com/index.php?_m=downloads&amp;amp;_a=viewdownload&amp;amp;downloaditemid=66&amp;amp;nav=0,1,20"&gt;&lt;span class="caps"&gt;CA&lt;/span&gt; Bundle&lt;/a&gt;, but this may or may not work (or be up to&amp;nbsp;date).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;cat EssentialSSLCA_2.crt ComodoUTNSGCCA.crt UTNAddTrustSGCCA.crt &lt;span class="se"&gt;\&lt;/span&gt;
    AddTrustExternalCARoot.crt &amp;gt; ca-chain.crt
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is all you need to paste into the &amp;#8220;Certificate Chain&amp;#8221; field in the
&lt;span class="caps"&gt;SSL&lt;/span&gt; Cert selection dialog on the &lt;span class="caps"&gt;AWS&lt;/span&gt; Management&amp;nbsp;Console.&lt;/p&gt;
&lt;p&gt;While you&amp;#8217;re here, have another tip: If the dialog complains about an
invalid Private Key or Public Key Certificate, you probably need to &lt;span class="caps"&gt;PEM&lt;/span&gt;
encode it. My key was &lt;span class="caps"&gt;RSA&lt;/span&gt;, so this is what &lt;span class="caps"&gt;PEM&lt;/span&gt;-encoding looked like for&amp;nbsp;me:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;openssl rsa -in mycert.com.key -out mycert.com.pem
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is then safe to paste into the &amp;#8220;Private key&amp;#8221; field. If for whatever
reason your *.crt file came back in another format, you could also use this
same set of steps to encode it (though, my was sent to me &lt;span class="caps"&gt;PEM&lt;/span&gt; encoded&amp;nbsp;already).&lt;/p&gt;
</summary><category term="Cloud"></category></entry><entry><title>Your knowledge is valuable</title><link href="http://gc-taylor.com/blog/2013/02/14/your-knowledge-is-valuable/" rel="alternate"></link><updated>2013-02-14T04:00:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-02-14:blog/2013/02/14/your-knowledge-is-valuable/</id><summary type="html">&lt;p&gt;Most people have something that they are truely passionate about. When they
think of whatever this happens to be, their day brightens, perhaps they feel
excited, or maybe they talk the ear off of friends about it. This kind of
calling, hobby, or special interest is such a positive motivator to&amp;nbsp;have.&lt;/p&gt;
&lt;p&gt;Some of us feel the urge to get out and share, spread, and teach our special
thing to others. We are fortunate to live in a time where there are many
ways to do this. Perhaps we schedule Meetups with other interested people.
Some of us establish flourishing online communities to discuss our beloved
subject. Maybe some still post informative Youtube videos with How-To&amp;#8217;s and&amp;nbsp;instructions.&lt;/p&gt;
&lt;p&gt;To this motivated, enthusiastic group of individuals, I&amp;#8217;ve got a message
for you: You have got something valuable in a number of ways. Not only do you
have something that enriches your life, you potentially have something that
could make some money for yourself on the&amp;nbsp;side.&lt;/p&gt;
&lt;p&gt;If you have knowledge to share, I&amp;#8217;d like you to check out &lt;a class="reference external" href="http://www.pathwright.com"&gt;Pathwright&lt;/a&gt;, which
is geared towards letting you spread and share what you know with others. You
can create your very own School of Guitar, or perhaps you&amp;#8217;d like to share
what you know about restoring Classic Cars. Maybe you&amp;#8217;d like to teach others
how to program, or offer training for particular software products. All of this
is possible, and it&amp;#8217;s priced to be affordable to individuals like you and I.
In fact, you can play around with &lt;a class="reference external" href="http://www.pathwright.com"&gt;Pathwright&lt;/a&gt; without paying a&amp;nbsp;dime.&lt;/p&gt;
&lt;p&gt;Whatever your passion, I hope that you&amp;#8217;ll take a look at &lt;strong&gt;our&lt;/strong&gt; passion
(&lt;a class="reference external" href="http://www.pathwright.com"&gt;Pathwright&lt;/a&gt;) and let us know how we can help you share&amp;nbsp;yours.&lt;/p&gt;
&lt;p&gt;A few example ideas for things I personally would love to&amp;nbsp;see:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;An organized, moderated school of&amp;nbsp;Photoshop&lt;/li&gt;
&lt;li&gt;A school for user interface&amp;nbsp;design&lt;/li&gt;
&lt;li&gt;A school of whatever programming&amp;nbsp;language&lt;/li&gt;
&lt;li&gt;A school for guitar&amp;nbsp;players&lt;/li&gt;
&lt;li&gt;A school of&amp;nbsp;Rowing&lt;/li&gt;
&lt;li&gt;A school of dog&amp;nbsp;training&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shoot us an &lt;a class="reference external" href="mailto:hello&amp;#64;pathwright.com"&gt;email&lt;/a&gt;. We&amp;#8217;d love to hear how we can help share what brightens
your&amp;nbsp;day.&lt;/p&gt;
</summary><category term="Education"></category><category term="Pathwright"></category></entry><entry><title>We all wear many hats, and it’s great!</title><link href="http://gc-taylor.com/blog/2013/02/12/we-all-wear-many-hats-and-its-great/" rel="alternate"></link><updated>2013-02-12T22:02:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-02-12:blog/2013/02/12/we-all-wear-many-hats-and-its-great/</id><summary type="html">&lt;p&gt;Something that I had hoped for and have found in working at a small business
(&lt;a class="reference external" href="http://www.pathwright.com/"&gt;Pathwright&lt;/a&gt;) is the variability I see from day to day. You have
a general idea of what you need to be doing, what your goals are in the immediate,
mid, and longer term, but it&amp;#8217;s hard to predict exactly how each day will
shake out. Let&amp;#8217;s look a hypothetical 8-5 as a co-founder at &lt;a class="reference external" href="http://www.pathwright.com/"&gt;Pathwright&lt;/a&gt;,
for&amp;nbsp;example:&lt;/p&gt;
&lt;p&gt;Perhaps you start the day working on triaging and fixing a bug. But now
you see that you&amp;#8217;re going to need to switch over to customer support while
your colleague meets with a prospective client. In the afternoon, you&amp;#8217;re
back to figuring out how to optimize a slow page load. Then you&amp;#8217;re scheming
ways to attract new customers. Maybe you even do some sales work to help
drum up new&amp;nbsp;business.&lt;/p&gt;
&lt;p&gt;The great thing about being in before all of the structure and
compartmentalization is that if you have an itch, you can scratch it. You don&amp;#8217;t
do any one thing long enough to get tired of it, and new challenges are
constantly being thrown at&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;This is probably not appealing to everyone. Some would think of a day like
this as a nightmarish stream of interruptions. It very well &lt;em&gt;can&lt;/em&gt; be, in some
cases on some days. However, more often than not it&amp;#8217;s fun to work on the many
parts of the business you&amp;#8217;re working to build. My primary responsibility is
backend development and infrastructure, but I sometimes put on the support
hat, or the sales hat, or the marketing&amp;nbsp;hat.&lt;/p&gt;
&lt;p&gt;Jack of all trades, wearer of many hats. That&amp;#8217;s the way it is, and that&amp;#8217;s
the way I like&amp;nbsp;it.&lt;/p&gt;
</summary><category term="Programming"></category></entry><entry><title>Fabric task for notifying New Relic of a code deploy</title><link href="http://gc-taylor.com/blog/2013/02/11/fabric-task-for-notifying-new-relic-code-deploy/" rel="alternate"></link><updated>2013-02-11T22:52:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-02-11:blog/2013/02/11/fabric-task-for-notifying-new-relic-code-deploy/</id><summary type="html">&lt;p&gt;We&amp;#8217;ve been doing some playing around with &lt;a class="reference external" href="https://newrelic.com/"&gt;New Relic&lt;/a&gt; lately at &lt;a class="reference external" href="http://www.pathwright.com"&gt;Pathwright&lt;/a&gt;.
One of the neat things it does is track when code deploys happen, and how
they affect responsiveness and resource&amp;nbsp;consumption.&lt;/p&gt;
&lt;p&gt;In order to notify New Relic when a deploy happens, you simply &lt;span class="caps"&gt;POST&lt;/span&gt; to their
web-based &lt;span class="caps"&gt;API&lt;/span&gt; with the information you&amp;#8217;d like to include (change logs, commit
hashes,&amp;nbsp;etc).&lt;/p&gt;
&lt;p&gt;We currently do this via a Fabric task, which I figured I&amp;#8217;d share. We tend
to run this from our &lt;tt class="docutils literal"&gt;deploy&lt;/tt&gt; task.&amp;nbsp;Enjoy!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;fabric.api&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cd&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;notify_newrelic_of_deploy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old_commit_hash&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    New Relic tracks deploy events. Send a notification via their &lt;span class="caps"&gt;HTTP&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/span&gt;

&lt;span class="sd"&gt;    :param str old_commit_hash: The previously deployed git hash. This is&lt;/span&gt;
&lt;span class="sd"&gt;        easily retrieved on a remote machine by running &amp;#39;git rev-parse &lt;span class="caps"&gt;HEAD&lt;/span&gt;&amp;#39;.&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;REMOTE_CODEBASE_PATH&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;new_commit_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;git rev-parse &lt;span class="caps"&gt;HEAD&lt;/span&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;changes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;git --no-pager log &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;..&lt;span class="caps"&gt;HEAD&lt;/span&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;old_commit_hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;# Adjust this to reflect your &lt;span class="caps"&gt;API&lt;/span&gt; key.&lt;/span&gt;
        &lt;span class="s"&gt;&amp;#39;x-api-key&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;&amp;#39;deployment[app_name]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Your App Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c"&gt;# This is also very important to update with your own value.&lt;/span&gt;
        &lt;span class="s"&gt;&amp;#39;application_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;1234567&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;&amp;#39;deployment[description]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Fabric deploy is fun deploy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;&amp;#39;deployment[revision]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;new_commit_hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;&amp;#39;deployment[changelog]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;&amp;#39;deployment[user]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOCAL_USERNAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gethostname&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://rpm.newrelic.com/deployments.xml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</summary><category term="Python"></category><category term="Programming"></category></entry><entry><title>Switched to Pelican</title><link href="http://gc-taylor.com/blog/2013/02/10/switched-to-pelican/" rel="alternate"></link><updated>2013-02-10T11:42:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-02-10:blog/2013/02/10/switched-to-pelican/</id><summary type="html">&lt;p&gt;For the last four years, my blog has been powered by Django. As I have found
myself becoming more and more busy, I have stopped wanting to hassle with
keeping things up to date on the server and the&amp;nbsp;application.&lt;/p&gt;
&lt;p&gt;After a weekend of tinkering and conversions, I&amp;#8217;m now up and running on
&lt;a class="reference external" href="http://docs.getpelican.com/"&gt;Pelican&lt;/a&gt;. Generation is relatively quick, I like that it uses Jinja, and
blogging in Restructured Text is strangely&amp;#8230; relaxing? The only downside
is that the documentation, while reasonably complete, has some unclear
spots (custom page generation and &lt;span class="caps"&gt;RSS&lt;/span&gt;/Atom feed settings in&amp;nbsp;particular).&lt;/p&gt;
</summary><category term="Python"></category></entry><entry><title>Ansible first impressions</title><link href="http://gc-taylor.com/blog/2013/02/08/ansible-first-impressions/" rel="alternate"></link><updated>2013-02-08T06:22:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-02-08:blog/2013/02/08/ansible-first-impressions/</id><summary type="html">&lt;p&gt;After brief visits with&amp;nbsp;&lt;a class="reference external" href="https://puppetlabs.com/"&gt;Puppet&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a class="reference external" href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt;&amp;nbsp;for config management,
I&amp;#8217;ve set my sights on&amp;nbsp;&lt;a class="reference external" href="http://ansible.cc/"&gt;Ansible&lt;/a&gt;. It&amp;#8217;s late and I&amp;#8217;ve been staring at
this stuff for way too long today, but here are some early&amp;nbsp;observations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I really like that it is written in Python. Puppet and Chef are great
pieces of software, but I spend my days staring at Python. It&amp;#8217;s nice
not having to context switch&amp;nbsp;away.&lt;/li&gt;
&lt;li&gt;The&amp;nbsp;&lt;a class="reference external" href="http://ansible.cc/docs/"&gt;documentation&lt;/a&gt;, while organized somewhat weirdly, is
surprisingly thorough and helpful. I found myself much less
frustrated and overwhelmed in comparison to my forays into Puppet and&amp;nbsp;Chef.&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s just&amp;nbsp;&lt;span class="caps"&gt;SSH&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;The playbook organization and format make a lot of sense to me. It
feels a whole lot less complex than Chef in&amp;nbsp;particular.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As far as&amp;nbsp;negatives:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The documentation is very good but it could use some organizational
tweaking. The related links at the bottom of some of the pages are
very erratic and sometimes&amp;nbsp;incomplete.&lt;/li&gt;
&lt;li&gt;If you&amp;#8217;re wanting to use Ansible as a Python &lt;span class="caps"&gt;API&lt;/span&gt;, the&amp;nbsp;&lt;a class="reference external" href="http://ansible.cc/docs/api.html"&gt;docs&lt;/a&gt;&amp;nbsp;for
this are pretty&amp;nbsp;incomplete.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So far, Ansible looks very promising. I think this is going to be a
great fit for us at&amp;nbsp;&lt;a class="reference external" href="http://www.pathwright.com"&gt;Pathwright&lt;/a&gt;. Perhaps we&amp;#8217;ll even have some time
to contribute improved&amp;nbsp;docs.&lt;/p&gt;
</summary><category term="Cloud"></category><category term="Programming"></category><category term="Python"></category></entry><entry><title>Amazon Elastic Transcoder Review</title><link href="http://gc-taylor.com/blog/2013/01/30/amazon-elastic-transcoder-review/" rel="alternate"></link><updated>2013-01-30T20:37:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-01-30:blog/2013/01/30/amazon-elastic-transcoder-review/</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://aws.amazon.com/elastictranscoder/"&gt;Amazon Elastic Transcoder&lt;/a&gt;&amp;nbsp;was released just a few short days ago.
Given that we do a lot of encoding at&amp;nbsp;&lt;a class="reference external" href="http://www.pathwright.com"&gt;Pathwright&lt;/a&gt;, this was of high
interest to us. A year or two ago, we wrote&amp;nbsp;&lt;a class="reference external" href="https://media-nommer.readthedocs.org"&gt;media-nommer&lt;/a&gt;&amp;nbsp;which is
similar to Amazon&amp;#8217;s Transcoder, and it has worked well for us. However,
as a small company with manpower constraints we&amp;#8217;ve had issues finding
time to continue maintaining and improving&amp;nbsp;media-nommer.&lt;/p&gt;
&lt;p&gt;With the hope that we could simplify and reduce engineering overhead, we
took the new Elastic Transcoder service for a spin at&amp;nbsp;Pathwright.&lt;/p&gt;
&lt;div class="section" id="web-based-management-console-impressions"&gt;
&lt;h2&gt;Web-based management console&amp;nbsp;impressions&lt;/h2&gt;
&lt;p&gt;One of the strongest points of the &lt;span class="caps"&gt;AWS&lt;/span&gt; Elastic Transcoder is its web
management console. It makes it &lt;em&gt;very&lt;/em&gt; easy for those that don&amp;#8217;t have
the time or capability to work with the &lt;span class="caps"&gt;API&lt;/span&gt; to fire off some quick
transcoding jobs. With that said, I will make a few&amp;nbsp;points:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;At the time of this article&amp;#8217;s writing (Jan 30, 2013), it is extremely
tedious to launch multiple encoding jobs. There&amp;#8217;s a lot of typing and
manual labor involved. For one-off encodings, it&amp;#8217;s&amp;nbsp;great.&lt;/li&gt;
&lt;li&gt;Transcoding presets are easy to set up. I appreciate&amp;nbsp;that!&lt;/li&gt;
&lt;li&gt;Some of the form validation Javascript is just outright broken. You
may end up typing a value that isn&amp;#8217;t &lt;span class="caps"&gt;OK&lt;/span&gt;, hitting &amp;#8220;Submit&amp;#8221;, only to
find nothing happen. The probable intended behavior is to show an
error message, but they are very inconsistently rendered
(particularly on the job submission&amp;nbsp;page).&lt;/li&gt;
&lt;li&gt;The job status information could be a lot more detailed. I&amp;#8217;d really
like to see a numerical figure for how many minutes &lt;span class="caps"&gt;AWS&lt;/span&gt; calculates
the video to be, even if this is only available once a job is
completed. This lets you know exactly how much you&amp;#8217;re being billed
for on a per-video basis. Currently, you just get a lump sum bill,
which isn&amp;#8217;t helpful. It&amp;#8217;d also be nice to see when an encoding job
was started/finished on the summary (you can do this by listening to
an &lt;span class="caps"&gt;SNS&lt;/span&gt; topic, but you probably aren&amp;#8217;t doing that if you&amp;#8217;re using the
web&amp;nbsp;console).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="web-api-impressions"&gt;
&lt;h2&gt;Web &lt;span class="caps"&gt;API&lt;/span&gt;&amp;nbsp;impressions&lt;/h2&gt;
&lt;p&gt;For the purpose of working Elastic Transcoder into&amp;nbsp;&lt;a class="reference external" href="http://www.pathwright.com"&gt;Pathwright&lt;/a&gt;, we
turned to the excellent&amp;nbsp;&lt;a class="reference external" href="http://boto.cloudhackers.com/"&gt;boto&lt;/a&gt;&amp;nbsp;(which we are regular contributors
to). For the most part, this was a very straightforward process, with
some&amp;nbsp;caveats:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The transcoding job state &lt;span class="caps"&gt;SNS&lt;/span&gt; notifications contain zero information
about the encoding minutes you were billed for that particular job.
In our case, we bill our users for media management in Pathwright, so
we must know how much each encoding job is costing us, and who it
belonged to. Each customer gets a bill at the end of the month,
without needing to hassle with an &lt;span class="caps"&gt;AWS&lt;/span&gt; account (these aren&amp;#8217;t technical
users, for the most part). Similarly, the &amp;#8220;get job&amp;#8221; &lt;span class="caps"&gt;API&lt;/span&gt; request shows
no minutes figure,&amp;nbsp;either.&lt;/li&gt;
&lt;li&gt;If you&amp;#8217;re writing something that uses external &lt;span class="caps"&gt;AWS&lt;/span&gt; credentials to
manage media, you&amp;#8217;ve got some setup work to do. Before you can submit
job #1, you&amp;#8217;re going to need to create an &lt;span class="caps"&gt;SNS&lt;/span&gt; topic, an &lt;span class="caps"&gt;IAM&lt;/span&gt; role, a
Transcoder Pipeline, and any presets you need (if the defaults aren&amp;#8217;t
sufficient). If you make changes to any of these pieces, you need to
sync the changes out to every account that you &amp;#8220;manage&amp;#8221;. These are
all currently required to use Transcoder. This is only likely to be a
stumbling block for services and applications that manage external
&lt;span class="caps"&gt;AWS&lt;/span&gt; accounts (for example, we encode videos for people, optionally
using their own &lt;span class="caps"&gt;AWS&lt;/span&gt; account instead of&amp;nbsp;ours).&lt;/li&gt;
&lt;li&gt;At the time of this article&amp;#8217;s writing, the documentation for the web
&lt;span class="caps"&gt;API&lt;/span&gt; is severely limited. There is a lack of example request/response
cycles with anything but one or two of the most common scenarios. I&amp;#8217;d
like to see some of the more complex&amp;nbsp;request/responses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="some-general-struggles-pain-points"&gt;
&lt;h2&gt;Some general struggles/pain&amp;nbsp;points&lt;/h2&gt;
&lt;p&gt;While this article has primarily focused on the issues we ran into,
we&amp;#8217;ll criticize a little more before offering&amp;nbsp;praise:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;As is the case for anyone not paying money for premium support, &lt;strong&gt;&lt;span class="caps"&gt;AWS&lt;/span&gt;
has terrible customer support&lt;/strong&gt;. If you want help with the
Transcoding service, the&amp;nbsp;&lt;a class="reference external" href="https://forums.aws.amazon.com/forum.jspa?forumID=147&amp;amp;start=0"&gt;forums&lt;/a&gt;&amp;nbsp;are basically your only option.
The responses seen in there so far haven&amp;#8217;t been very good or timely.
However, it is important to note that this support model is not
limited to Elastic Transcoder. It is more of an organizational
problem. I am sure this is on their minds, and if there is a group
that can figure out how to offer decent support affordably, it&amp;#8217;d
be Amazon. Just be aware that you&amp;#8217;re not going to get the best,
fastest support experience without paying&amp;nbsp;up.&lt;/li&gt;
&lt;li&gt;We do low, medium, and high quality transcodings for each video we
serve at Pathwright. Our lower quality encoding is smaller (in terms
of dimensions) than the medium and high quality encodings. With
media-nommer and ffmpeg, we were able to specify a fixed width and
let ffmpeg determine the height (while preserving aspect ratio). The
Amazon Transcoder currently requires height &lt;strong&gt;and&lt;/strong&gt; width for each
preset, if you want to specify a dimension. Given that our master
video files are all kinds of dimensions and aspect ratios, this is a
non-starter for&amp;nbsp;us.&lt;/li&gt;
&lt;li&gt;If you submit an encoding job with an output S3 key name that already
exists, the job fails. While you do open yourself up to some issues
in doing so, we would appreciate the ability to say &amp;#8220;I want to
over-write existing files in the output bucket&amp;#8221;. There is probably a
technical reason for this, but I think this fails the practicality
test. A solution can and should be found to allow&amp;nbsp;this.&lt;/li&gt;
&lt;li&gt;Because of the aforementioned poor support, I still don&amp;#8217;t have a good
answer to this, but it doesn&amp;#8217;t appear that you can do two-pass
encodings. This is a bummer for us, as we&amp;#8217;ve been able to get some
great compression and quality doing&amp;nbsp;this.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="overall-verdict"&gt;
&lt;h2&gt;Overall&amp;nbsp;verdict&lt;/h2&gt;
&lt;p&gt;For Pathwright, the Amazon Transcoder isn&amp;#8217;t capable enough to get the
nod just yet. However, the foundation that has been laid is very solid.
The encodings themselves execute quickly, and it&amp;#8217;s great not having to
worry about the state of your own in-house encoding&amp;nbsp;infrastructure.&lt;/p&gt;
&lt;p&gt;The prices are very fair, and are a large savings over Zencoder and
Encoding.com at the lower to moderate volumes. The price advantage does
taper off as your scale gets very large, and those two services do offer
a lot more capabilities. If your needs are basic, Amazon Transcoder is
likely to be cheaper and &amp;#8220;good enough&amp;#8221; for you. If you need live
streaming, close captioning, or anything more elaborate, shell out and
go with a more full-featured&amp;nbsp;service.&lt;/p&gt;
&lt;p&gt;Once some of the gaping feature gaps are filled and the platform has
time to mature and stabilize, this could be a good service. If the
customer support improves with the features, this could be an excellent&amp;nbsp;service.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verdict: Wait and see, but so far, so&amp;nbsp;good.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
</summary><category term="Cloud"></category><category term="Programming"></category><category term="Python"></category></entry><entry><title>MUD tech is fun/cool, but…</title><link href="http://gc-taylor.com/blog/2013/01/08/mud-tech-funcool-dont-forget-ship-damned-thing/" rel="alternate"></link><updated>2013-01-08T04:26:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2013-01-08:blog/2013/01/08/mud-tech-funcool-dont-forget-ship-damned-thing/</id><summary type="html">&lt;p&gt;As software development evolves, there are an ever-expanding number of
ways to put together very complex, elaborate systems that are fun to
geek out on. Multi-processing is becoming increasingly&amp;nbsp;prevalent,
distributed systems are a boon to cases with massive scalability or
reliability requirements, and there are all kinds of neat data stores
available. These are all definitely things that have a place in&amp;nbsp;software.&lt;/p&gt;
&lt;div class="section" id="but-what-does-this-mean-in-the-context-of-a-mud"&gt;
&lt;h2&gt;But what does this mean, in the context of a&amp;nbsp;&lt;span class="caps"&gt;MUD&lt;/span&gt;?&lt;/h2&gt;
&lt;p&gt;Honestly, very little. Even a very large &lt;span class="caps"&gt;MUD&lt;/span&gt; with hundreds of connected
players can be ran on a very pedestrian machine with a modest amount
&lt;span class="caps"&gt;RAM&lt;/span&gt;, and very little bandwidth. Multi-threading is not a requirement for
performance (and can often work against it). Highly distributed,
multi-server setups are hitting nails with jackhammers. After all, we&amp;#8217;re
talking about a genre that primarily features smaller (&amp;lt;100 connected
players)&amp;nbsp;games.&lt;/p&gt;
&lt;p&gt;An important thing to keep in mind when developing a &lt;span class="caps"&gt;MUD&lt;/span&gt; is that simple,
well-thought-out &lt;span class="caps"&gt;MUD&lt;/span&gt; architectures have a huge advantage over those
their more complex kin: &lt;em&gt;They are easier to develop, and they are a lot
more likely to ever see the light of day&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="muds-are-a-labor-of-love"&gt;
&lt;h2&gt;MUDs are a labor of&amp;nbsp;love&lt;/h2&gt;
&lt;p&gt;Although you&amp;#8217;ll hear people crying about the demise of the text-based
genre, there will always be a niche out there for our kind. However, the
vast majority of the games in our space are going to remain
non-commercial, and mostly developed by volunteers on their spare&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;By making simplicity a high priority, we make sure that it&amp;#8217;s easier to
make progress when you &lt;em&gt;do&lt;/em&gt; have a few moments to sit down and work on
your game. While you could write a super-distributed,
super-fault-tolerant &lt;span class="caps"&gt;MUD&lt;/span&gt; server, it&amp;#8217;s probably going to make future
development more complicated, &lt;em&gt;and you may run out of steam before you
get anywhere close to being &amp;#8220;done&amp;#8221;&lt;/em&gt;. As someone who would love to see
more great MUDs out there, this makes me&amp;nbsp;sad!&lt;/p&gt;
&lt;p&gt;Developing and launching a &lt;span class="caps"&gt;MUD&lt;/span&gt; is a labor of love, and it has to be fun
and interesting to you. You have a finite amount of time to get your
game launched before you probably lose interest and move on to other
things. This &amp;#8220;time limit&amp;#8221; varies from person to person, and some possess
the rare ability to regularly, routinely work on a game for years before
going public, but those types are very rare now. Your goal should be to
open to the public before your &amp;#8220;ok, time to move on&amp;#8221; timer goes off.
Simplicity is one of your biggest allies while pursuing this&amp;nbsp;goal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="but-there-are-always-caveats"&gt;
&lt;h2&gt;But&amp;#8230; there are always&amp;nbsp;caveats&lt;/h2&gt;
&lt;p&gt;A very valid counter-point to this argument for simplicity is that MUDs
are a great way to learn new technologies, to experiment, to do things
one might not normally do. If one&amp;#8217;s goal is to tinker more so than to
actually release a game to the world, you can throw this all out the
window. Get as complex/geeky/sexy as you&amp;#8217;d like, and have a blast. Who
cares if you never ship? That&amp;#8217;s not the point for you,&amp;nbsp;anyway.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="for-those-that-are-most-concerned-with-actually-shipping"&gt;
&lt;h2&gt;For those that are most concerned with actually&amp;nbsp;&amp;#8220;shipping&amp;#8221;&lt;/h2&gt;
&lt;p&gt;Focus on your core functionality. What is your &amp;#8220;minimum viable product?&amp;#8221;
What is the most direct way to get to your opening day? Avoid
unnecessary complexity, and remember that you can always refactor and
improve performance/scalability as you grow. Nothing is set in&amp;nbsp;stone.&lt;/p&gt;
&lt;p&gt;Avoid traps like multi-threading (unless you really have to have it),
super scalability, and elaborate distributed setups unless you just
really want to play. You&amp;#8217;re designing a Gocart, not an&amp;nbsp;IndyCar.&lt;/p&gt;
&lt;p&gt;Simplicity. Clarity. Focus. Oh, and ship the damned&amp;nbsp;thing!&lt;/p&gt;
&lt;/div&gt;
</summary><category term="Gaming"></category><category term="Mud"></category><category term="Programming"></category></entry><entry><title>Why I won’t be gifting this Christmas</title><link href="http://gc-taylor.com/blog/2012/12/10/why-i-wont-be-gifting-this-christmas/" rel="alternate"></link><updated>2012-12-10T20:48:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2012-12-10:blog/2012/12/10/why-i-wont-be-gifting-this-christmas/</id><summary type="html">&lt;p&gt;As I slogged through December 2010 with a one eye on the wallet, and the
other on my Christmas shopping list, I arrived at an important
realization: I had stopped enjoying what Christmas had become. As a
child, the stressful, time-consuming, expensive parts were hidden away;
it was fun and full of excitement. As I grew, I gradually came to
realize that Christmas is an industry, a Hallmark holiday. I didn&amp;#8217;t care
for the time away from family shopping, the constant stress to get
everyone &lt;em&gt;something&lt;/em&gt;, or the fear of gifting something that the
recipient didn&amp;#8217;t&amp;nbsp;like.&lt;/p&gt;
&lt;p&gt;I arrived at the realization that I was playing along because it was
expected of me. I also realized that I had started dreading this song
and dance every&amp;nbsp;year.&lt;/p&gt;
&lt;p&gt;2010 was my last &amp;#8220;regular&amp;#8221; Christmas. Starting with 2011, I laid out my
desires going forward: Do not buy a gift for me. I will not buy a gift
for you. However, I will gladly donate to a charity of your choice, if
you&amp;#8217;ll do the same for&amp;nbsp;me.&lt;/p&gt;
&lt;p&gt;As expected, I received a very mixed reaction to this. Some were happy
that they could cross me off their list, some really understood my
reasoning, and others pressured me to re-join the commercialized mosh
pit. I ended up donating to six different charities, and spent more time
with family (instead of shopping). Financially, there was no difference,
since I donated what I would have normally spent (which is great). Best
of all, my conscious was clear, and I sailed through December with zero&amp;nbsp;regrets.&lt;/p&gt;
&lt;p&gt;This year, I will be doing the same. I will gladly donate to a charity
of your choice if you will donate to mine:&amp;nbsp;&lt;a class="reference external" href="http://www.shrinershospitalsforchildren.org/"&gt;Shriner&amp;#8217;s Hospital for
Children&lt;/a&gt;. Simply shoot me an email letting me know that you donated
(no need to tell me how much), and which charitable organization you&amp;#8217;d
like me to donate&amp;nbsp;to.&lt;/p&gt;
&lt;p&gt;As far as why I chose Shriner&amp;#8217;s, pull up a chair for story&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;When I was in highschool, the band would send a small detachment to
Shriner&amp;#8217;s on Christmas Eve to play for the children who were too far
from, or too sick to go home. Wanting to help brighten their day, I
volunteered in December&amp;nbsp;2003.&lt;/p&gt;
&lt;p&gt;We arrived, got set up, and were ready to greet the children, who then
started to filter in. Some were wheeled in on gurneys, others walked,
some were in wheelchairs. I was surrounded by scared, sick kids who
wanted nothing more than to be well and back at home with their families
for Christmas. We played our set, and for a brief moment, the kids were
happy and all smiles. As we left, I imagined the smiles fading, and the
patients being carted back to their rooms. It really put things in
perspective for me, and made sure I didn&amp;#8217;t take what I had for&amp;nbsp;granted.&lt;/p&gt;
&lt;p&gt;This Christmas, I&amp;#8217;d like to help those children smile and get well
instead of buying you a gift card or a trinket. I do not chastise or
look down on those who choose to do otherwise, nor will you hear
anything further on this from me. I figured I&amp;#8217;d explain why I won&amp;#8217;t be
gift swapping (indefinitely) and wanted to make sure friends and family
understood&amp;nbsp;why.&lt;/p&gt;
&lt;p&gt;Keep in mind what Christmas is all about this holiday, and have a great&amp;nbsp;one!&lt;/p&gt;
</summary><category term="General"></category></entry><entry><title>python-route53 released!</title><link href="http://gc-taylor.com/blog/2012/11/14/python-route53-released/" rel="alternate"></link><updated>2012-11-14T01:19:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2012-11-14:blog/2012/11/14/python-route53-released/</id><summary type="html">&lt;p&gt;After some more time in the cooker, &lt;a class="reference external" href="https://python-route53.readthedocs.org/"&gt;python-route53&lt;/a&gt; 1.0 has landed on
&lt;a class="reference external" href="http://pypi.python.org/pypi/route53"&gt;PyPi&lt;/a&gt;. This is a stand-alone &lt;a class="reference external" href="http://aws.amazon.com/route53/"&gt;Route 53&lt;/a&gt; package, independent from the
one in boto. The major hilights&amp;nbsp;are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Python 2.7 and 3.x&amp;nbsp;compatibility.&lt;/li&gt;
&lt;li&gt;Extremely simple&amp;nbsp;&lt;span class="caps"&gt;API&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Powered by &lt;a class="reference external" href="http://docs.python-requests.org/en/latest/"&gt;requests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Read the &lt;a class="reference external" href="https://python-route53.readthedocs.org/"&gt;documentation&lt;/a&gt;, see the &lt;a class="reference external" href="https://github.com/gtaylor/python-route53"&gt;source&lt;/a&gt;, and yell at me on the
&lt;a class="reference external" href="https://github.com/gtaylor/python-route53/issues"&gt;issue tracker&lt;/a&gt;&amp;nbsp;or &lt;a class="reference external" href="https://twitter.com/gctaylor"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
</summary><category term="Cloud"></category><category term="Programming"></category><category term="Python"></category></entry><entry><title>python-route53 feedback wanted</title><link href="http://gc-taylor.com/blog/2012/11/08/python-route53-feedback-wanted/" rel="alternate"></link><updated>2012-11-08T16:17:00-05:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2012-11-08:blog/2012/11/08/python-route53-feedback-wanted/</id><summary type="html">&lt;p&gt;Late last night (or early this morning), I finished the draft of
&lt;a class="reference external" href="https://python-route53.readthedocs.org"&gt;python-route53&lt;/a&gt;, a stand-alone &lt;a class="reference external" href="http://aws.amazon.com/route53/"&gt;Route 53&lt;/a&gt; module with Python 3.x and
Python 2.7 compatibility. &lt;a class="reference external" href="http://aws.amazon.com/route53/"&gt;Route 53&lt;/a&gt; is an excellent &lt;span class="caps"&gt;DNS&lt;/span&gt; service
offered by Amazon Web Services. It exposes everything through an&amp;nbsp;&lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;My intentions with python-route53 are&amp;nbsp;two-fold:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;There were no Python 3 compatible Route 53 modules that I knew of. I
had a need for&amp;nbsp;one.&lt;/li&gt;
&lt;li&gt;I didn&amp;#8217;t feel like any of the existing Route 53 modules were as
simple and easy-to-use as they could&amp;nbsp;be.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I&amp;#8217;d like to do is reach out and get some feedback on whether I have
succeeded or not in both regards. I&amp;#8217;d like to get a packaged release out
later this week, but hoped to get some eyeballs on the documentation and
the source before it lands on&amp;nbsp;PyPi.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;d like to take a look, see the &lt;a class="reference external" href="https://python-route53.readthedocs.org"&gt;python-route53 documentation&lt;/a&gt;
and the &lt;a class="reference external" href="https://github.com/gtaylor/python-route53"&gt;project at Github&lt;/a&gt;. Feel free to leave issues on the &lt;a class="reference external" href="https://github.com/gtaylor/python-route53/issues"&gt;issue
tracker&lt;/a&gt; with feedback, or &lt;a class="reference external" href="https://twitter.com/gctaylor"&gt;tweet&lt;/a&gt; at&amp;nbsp;me.&lt;/p&gt;
</summary><category term="Programming"></category><category term="Python"></category></entry><entry><title>Evennia MUD server gets BSD’d</title><link href="http://gc-taylor.com/blog/2012/11/02/evennia-mud-server-gets-bsdd/" rel="alternate"></link><updated>2012-11-02T03:35:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2012-11-02:blog/2012/11/02/evennia-mud-server-gets-bsdd/</id><summary type="html">&lt;p&gt;As of a few days ago, the &lt;a class="reference external" href="http://evennia.com/"&gt;Evennia &lt;span class="caps"&gt;MUD&lt;/span&gt; server&lt;/a&gt; has been re-licensed
under the &lt;span class="caps"&gt;BSD&lt;/span&gt; License. We feel like this will knock down another barrier
for those considering running a game with Evennia. I can&amp;#8217;t recommend
this codebase enough for anyone who may have caught the &lt;span class="caps"&gt;MUD&lt;/span&gt; development
itch (hey, they still exist!). Griatch has been doing an awesome job
making improvements and building a&amp;nbsp;community.&lt;/p&gt;
&lt;p&gt;Evennia is an advanced Python+Django &lt;span class="caps"&gt;MUD&lt;/span&gt; server, with all sorts of
goodies (like a web-based client). While the project has been going on
for a number of years, the community has been growing a bit faster over
the last year or two. We hope this will help continue that&amp;nbsp;trend.&lt;/p&gt;
&lt;p&gt;Feel free to stop by #evennia on FreeNode &lt;span class="caps"&gt;IRC&lt;/span&gt; to lurk, hang out, or ask&amp;nbsp;questions.&lt;/p&gt;
</summary><category term="Django"></category><category term="Python"></category></entry><entry><title>python-fedex and colormath re-licensed under BSD</title><link href="http://gc-taylor.com/blog/2012/10/23/python-fedex-and-python-colormath-re-licensed-under-bsd/" rel="alternate"></link><updated>2012-10-23T05:07:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2012-10-23:blog/2012/10/23/python-fedex-and-python-colormath-re-licensed-under-bsd/</id><summary type="html">&lt;p&gt;I am happy to announce that &lt;a class="reference external" href="http://pypi.python.org/pypi/fedex/"&gt;python-fedex&lt;/a&gt; and &lt;a class="reference external" href="http://pypi.python.org/pypi/colormath/"&gt;python-colormath&lt;/a&gt; have
been re-licensed under the &lt;span class="caps"&gt;BSD&lt;/span&gt; License. At the time these two packages
were created, there were reasons for &lt;span class="caps"&gt;GPL&lt;/span&gt;&amp;#8217;ing these. However, said
reasons have long since been removed, so it&amp;#8217;s &lt;span class="caps"&gt;BSD&lt;/span&gt;&amp;nbsp;time!&lt;/p&gt;
&lt;p&gt;My involvement with both of these projects has been minimal since I
joined &lt;span class="caps"&gt;DUO&lt;/span&gt; Interactive, since we don&amp;#8217;t have a use for either. However,
my hope is that a more permissive license will encourage contributions.
I still review pull requests for both of these when they appear, and
would be very much open to capable individuals taking over
maintainership of&amp;nbsp;either.&lt;/p&gt;
</summary><category term="Programming"></category><category term="Python"></category></entry><entry><title>python-bluefin 1.3 released</title><link href="http://gc-taylor.com/blog/2012/10/16/python-bluefin-13-released/" rel="alternate"></link><updated>2012-10-16T20:55:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2012-10-16:blog/2012/10/16/python-bluefin-13-released/</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://pypi.python.org/pypi/bluefin/"&gt;python-bluefin&lt;/a&gt; 1.3 has been released, now with improved error
handling. The major feature in this release is that we have smoothed
over some inconsistencies in Bluefin&amp;#8217;s error&amp;nbsp;handling.&lt;/p&gt;
&lt;p&gt;Instead of setting an &lt;span class="caps"&gt;HTTP&lt;/span&gt; status code indicating an error like they do
for most of the Bluefin &lt;span class="caps"&gt;API&lt;/span&gt; errors, we get an &lt;span class="caps"&gt;HTTP&lt;/span&gt; 200 back, and a
rarely used attribute in the response contains an error flag, with
another rarely used attribute containing a cryptic error message. Since
you need to handle invalid credit card numbers and authorization
failures gracefully, we now return a different exception (that still
inherits from what was previously returned). We also provide a more
friendly error message for the authorization-related errors, that are
not user-friendly, or&amp;nbsp;human-friendly.&lt;/p&gt;
&lt;p&gt;Of course, you can still access the original exception message through
&lt;tt class="docutils literal"&gt;Exception.raw_message&lt;/tt&gt;. See the &lt;a class="reference external" href="https://raw.github.com/duointeractive/python-bluefin/master/CHANGES.txt"&gt;changelog&lt;/a&gt; for full&amp;nbsp;details.&lt;/p&gt;
&lt;p&gt;This release is backwards compatible, it&amp;#8217;ll just give you better
granularity in your error&amp;nbsp;handling.&lt;/p&gt;
&lt;p&gt;Get it from the &lt;a class="reference external" href="http://pypi.python.org/pypi/bluefin/"&gt;PyPi&lt;/a&gt; page, or by installing &amp;#8216;bluefin&amp;#8217; from&amp;nbsp;pip/easy_install.&lt;/p&gt;
</summary><category term="Programming"></category><category term="Python"></category></entry><entry><title>python-bluefin 1.2 released, sans urllib2</title><link href="http://gc-taylor.com/blog/2012/09/19/python-bluefin-12-released-sans-urllib2/" rel="alternate"></link><updated>2012-09-19T21:36:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2012-09-19:blog/2012/09/19/python-bluefin-12-released-sans-urllib2/</id><summary type="html">&lt;p&gt;python-bluefin 1.2 has been released. python-bluefin is a very thin
wrapper around the &lt;a class="reference external" href="http://www.bluefin.com/"&gt;Bluefin&lt;/a&gt; payment gateway&amp;#8217;s &lt;span class="caps"&gt;API&lt;/span&gt;. The two major
changes&amp;nbsp;are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;urllib2 has been removed, with the excellent &lt;a class="reference external" href="http://docs.python-requests.org/"&gt;requests&lt;/a&gt; taking its&amp;nbsp;place.&lt;/li&gt;
&lt;li&gt;We now check directmode&amp;#8217;s status_code for known failure codes and
raise exceptions based on what we find. Previously, no exception was
raised, which would result in a silent failure if you weren&amp;#8217;t looking
at status_code&amp;nbsp;yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To install, either easy_install/pip install bluefin, or download
directly from its &lt;a class="reference external" href="http://pypi.python.org/pypi/bluefin/"&gt;PyPi page&lt;/a&gt;.&lt;/p&gt;
</summary><category term="Programming"></category><category term="Python"></category></entry><entry><title>Mountain Lion observations so far</title><link href="http://gc-taylor.com/blog/2012/08/04/mountain-lion-observations-so-far/" rel="alternate"></link><updated>2012-08-04T18:28:00-04:00</updated><author><name>Greg Taylor</name></author><id>tag:gc-taylor.com,2012-08-04:blog/2012/08/04/mountain-lion-observations-so-far/</id><summary type="html">&lt;p&gt;As some of the software I use on my Macbook Pro now requires at least
10.7, I had to retire my trusty Snow Leopard a few weeks ago. After a
few weeks of using Mountain Lion, I&amp;#8217;ve got things mostly straightened
out to where I&amp;#8217;m productive again. A few random&amp;nbsp;observations:&lt;/p&gt;
&lt;div class="section" id="the-good"&gt;
&lt;h2&gt;The&amp;nbsp;Good&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I appreciate being able to download the 10.8 upgrade digitally, and
open it directly on the desktop like any other application. This is
easy enough for most people to figure out quite&amp;nbsp;easily.&lt;/li&gt;
&lt;li&gt;Things do seem a little more snappy on my mid-2010 &lt;span class="caps"&gt;MBP&lt;/span&gt;. Nothing
drastic, but less&amp;nbsp;beachball-of-despair.&lt;/li&gt;
&lt;li&gt;After getting spoiled by Ubuntu&amp;#8217;s Unity notifications, it&amp;#8217;s really
nice to see Apple implement something similar. Gave me an excuse to
uninstall&amp;nbsp;Growl.&lt;/li&gt;
&lt;li&gt;Being able to grab the XCode suite from the App store is more
convenient than having to mess around with Apple&amp;#8217;s funky developer&amp;nbsp;site.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="the-bad"&gt;
&lt;h2&gt;The&amp;nbsp;Bad&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The reversal of the default scroll direction upgrading an existing
10.6 install, was very abrupt and unnecessary. For upgrades, they
should probably preserve the old settings when possible. Sometimes
software companies do stuff just to be different for the hell of it.
I get the sense that this was one such example of this behavior. It
doesn&amp;#8217;t make life better or easier. This got &lt;a class="reference external" href="http://howto.cnet.com/8301-11310_39-20081421-285/how-to-change-lions-scroll-direction/"&gt;set back to the
original behavior&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The auto-hiding of scrollbars was similarly unecessary. Vertical
space is at a premium with these laptop monitors, but there is loads
of horizontal space. I really like being able to see how far into
something I am without doing any goofy finger tapping, so this ended
up getting set back to &amp;#8220;Scrollbars always visible.&amp;#8221; Here&amp;#8217;s &lt;a class="reference external" href="http://osxdaily.com/2011/08/03/show-scroll-bars-mac-os-x-lion/"&gt;how to
make them stay visible&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &amp;#8220;overscroll&amp;#8221; bouncing when scrolling past a page&amp;#8217;s top or bottom
limits is strangely disconcerting on a desktop &lt;span class="caps"&gt;OS&lt;/span&gt; for me. I&amp;#8217;m not
sure why I dislike it so much, but I find it jarring. Maybe if it
bounced less. Here&amp;#8217;s &lt;a class="reference external" href="http://osxdaily.com/2012/05/10/disable-elastic-rubber-band-scrolling-in-mac-os-x/"&gt;how to disable it&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="the-ugly"&gt;
&lt;h2&gt;The&amp;nbsp;Ugly&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The 10.8 install completely flips its shit when encountering Linux
partitions, to the point where you can&amp;#8217;t proceed with installation.
There are various ways to attempt to fix this, but I eventually ended
up sacrificing the Linux partitions temporarily. Bummer. Some people
have figured out how to correct the various errors you get here, but
this wasn&amp;#8217;t quite worked around on day 1 when I&amp;nbsp;upgraded.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</summary><category term="General"></category><category term="Mac"></category></entry></feed>