<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>AntonLindstrom.com</title>
 <link href="http://antonlindstrom.com/atom.xml" rel="self"/>
 <link href="http://antonlindstrom.com/"/>
 <updated>2018-05-29T09:20:37+00:00</updated>
 <id>http://antonlindstrom.com/</id>
 <author>
   <name>AntonLindstrom.com</name>
   <email>me@antonlindstrom.com</email>
 </author>

 
 <entry>
   <title>What I like about estimations</title>
   <link href="http://antonlindstrom.com/2018/02/18/what-i-like-about-estimations.html"/>
   <updated>2018-02-18T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2018/02/18/what-i-like-about-estimations</id>
   <content type="html">&lt;p&gt;Sometimes when you step into a room saying, &quot;have you tried doing
estimations?&quot; you get laughed at. The people in that room does not like
estimations, thinks it is a horrible idea and wants you to leave.&lt;/p&gt;

&lt;p&gt;Everyone seems to have opinions about estimations in Scrum. Many of the
opinions are strongly held and most of the time they are negative. However,
I have come to enjoyed the process of estimating. Not because the estimation
is ever correct but because of the discussion that arises when someone
estimates a task to 24 and another to 8.&lt;/p&gt;

&lt;p&gt;In software engineering, we need to make the collaboration and communication
work as good as possible and the discussions around how we estimate tasks are
valuable to get insight into how people perceive the complexity of the system
and if there are unknowns that another team member has not thought about. Does
the task need further specification? Is the task to open ended?&lt;/p&gt;

&lt;p&gt;The main thing that I think that you receive from an estimation is: &quot;Did we
miss anything?&quot;&lt;/p&gt;

&lt;p&gt;When using estimation it is good to always discuss the task that is proposed
for a while to get a feeling of if someone is unsure of how something is
implemented or how it is going to be implemented. After that is done, checking
to see if the estimated numbers differ, if they differ, ask what it is about
and what the people with the most different numbers perceive as the biggest
hurdles and what the task means to them.&lt;/p&gt;

&lt;p&gt;If the numbers estimated are really high, decide if it is too big and too
loosely specified. If the task is too big, it have to be further specified and
further broken down into smaller parts so that the parts can be parallelised
and easier to get done in a reasonable time.&lt;/p&gt;

&lt;p&gt;To wrap up, I really enjoy working with estimations since they provide value
in the discussions and also spread knowledge between team members. Estimations
may be wrong most of the time but the format provides a framework to discuss and
learn from team members.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Go func: Reducing cognitive load</title>
   <link href="http://antonlindstrom.com/2017/06/29/go-func-reducing-cognitive-load.html"/>
   <updated>2017-06-29T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2017/06/29/go-func-reducing-cognitive-load</id>
   <content type="html">&lt;!-- Tags: golang, go, development, readability, maintainability --&gt;


&lt;p&gt;I have been maintaining several fairly large Go projects for a while. Some of
these projects have been for web services (APIs as well as backend workers)
and some have been command line tools. A few of these projects have been new
projects (green field) where I led the design and implementation, some have
been taking over maintenance and some have been projects where I contributed.&lt;/p&gt;

&lt;p&gt;One major thing that I have learned across these projects is that even though
the code format (&lt;a href=&quot;https://blog.golang.org/go-fmt-your-code&quot;&gt;go fmt&lt;/a&gt;) is set, the layout and design have been quite
different. This is perfectly fine where the requirements differ. However I
want to cover some things that I have noticed that makes it easier for
developers to pick up and read code.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;This post will cover a part that makes it hard for me to understand where
configuration comes from. Reading the code path is essential for me to
understand how a program functions and how to debug it.&lt;/p&gt;

&lt;p&gt;Good code for me is code that is easy to read, that is the number one
property. Writing abstractions to make it easier to write code fast and
efficiently becomes unimportant when comparing to readability.&lt;/p&gt;

&lt;p&gt;To reduce cognitive load, I want to be able to read a function/method without
having to think about where some variable comes from. The input and output
should be well defined (essentially a &lt;a href=&quot;https://en.wikipedia.org/wiki/Pure_function&quot;&gt;pure function&lt;/a&gt;). Let me give an example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;package example

import &quot;config&quot;

func hasSomeFile() bool {
    if _, err := os.Stat(config.MyFile) {
        return os.IsNotExist(err)
    }

    return false
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The most common pattern I have seen is that a &lt;code&gt;config&lt;/code&gt; package is defined
and is imported in many different packages, changed by either flags or
somewhere else (or in the worst of cases, both).&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;When I read the code above, my first question is: What is &lt;code&gt;config.MyFile&lt;/code&gt;?&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;From this example, I can probably check the value and type from the editor.
However, this adds extra cognitive load. Is it set manually from a flag or file?&lt;/p&gt;

&lt;p&gt;One example of getting rid of these questions is to define the signature to
get rid of the config package and call the function with the filename as an
argument. This way we know that we have to provide the value ourselves:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;package example

func hasSomeFile(file string) bool {
    if _, err := os.Stat(file) {
        return os.IsNotExist(err)
    }

    return false
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The documentation will be more clear and we know what to call the function
with.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;In order to reduce cognitive load and make it easier for new developers to
understand and read your code, be explicit of what you use in your signatures.
Code readability should be your top priority.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit: This post has been updated to provide better examples.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;See also&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://peter.bourgon.org/blog/2017/06/09/theory-of-modern-go.html&quot;&gt;Peter Bourgon: Theory of modern Go&lt;/a&gt; (2017-06-09).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dave.cheney.net/2017/06/11/go-without-package-scoped-variables&quot;&gt;Dave Cheney: Go without package scoped variables&lt;/a&gt; (2017-06-11).&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Year 2016 in review</title>
   <link href="http://antonlindstrom.com/2017/01/03/year-2016-in-review.html"/>
   <updated>2017-01-03T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2017/01/03/year-2016-in-review</id>
   <content type="html">&lt;p&gt;While 2016 seems to have been a year that I have not written a single blog
post a lot of stuff happened on a personal and professional level. Here are
a few words on what I did last year.&lt;/p&gt;

&lt;p&gt;I moved my infrastructure to &lt;a href=&quot;http://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt;. This was
a decision that was made due to the fact that I could not keep up with the
development of the Mesosphere Marathon API for my internal tools and after
trying Kubernetes it was a better fit for what I was doing. &lt;code&gt;kubectl&lt;/code&gt; has
helped in more ways I thought was possible.&lt;/p&gt;

&lt;p&gt;Since I write a lot of Go at work, I feel that I have become a better
&lt;a href=&quot;://golang.org&quot;&gt;Go&lt;/a&gt; programmer.  Hopefully this will reflect on this blog so
that you will get some good things about Go here.&lt;/p&gt;

&lt;p&gt;On a personal level, we bought a house in beautiful Gothenburg. This has meant
that work at home has shifted into doing other things.&lt;/p&gt;

&lt;p&gt;I also read a few
&lt;a href=&quot;https://www.goodreads.com/user/show/29228799-anton-lindstr-m&quot;&gt;books&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/books-2016.png&quot; alt=&quot;summary from Goodreads&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Limit processes with cgexec</title>
   <link href="http://antonlindstrom.com/2015/11/22/limit-processes-with-cgexec.html"/>
   <updated>2015-11-22T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2015/11/22/limit-processes-with-cgexec</id>
   <content type="html">&lt;p&gt;When running multiple processes it can sometimes be useful to limit the
resource usage  of one or many process groups. In this post I'll describe how
to limit the CPU and memory of a process with the help of Linux Control
Groups.&lt;/p&gt;

&lt;p&gt;Say that you're compiling a program or doing some heavy computing with a
program which uses 100% of all CPUs available. If you now were to run another
program, for instance checking your mail, it would be really slow. This is
where resource limiting would come into use.&lt;/p&gt;

&lt;p&gt;To be able to use resource limiting with cgroups I usually use the
&lt;code&gt;cgroup-bin&lt;/code&gt; package. The following commands will limit the process
&lt;code&gt;./compute&lt;/code&gt; to only use 128 (of a total of 1024) CPU shares and 32MB of
memory:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Install cgroup-bin
apt-get install cgroup-bin

# Create a cgroup for memory and cpu called &quot;mygroup&quot;
cgcreate -g memory,cpu:mygroup

# Add 128 CPU shares (about 12% CPU).
echo 128 &amp;gt; /sys/fs/cgroup/cpu/mygroup/cpu.shares

# Add 32MB of memory to the limit.
echo 32000000 &amp;gt; /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes

# Do not allow the process to use swap (if the limit is reached the
# process will be killed instead).
echo 0 &amp;gt; /sys/fs/cgroup/memory/build/memory.swappiness

# Run the command in the specified group.
cgexec -g cpu,memory:mygroup ./compute
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above commands describe how to limit resources for a command which I'm
using quite often to limit commands such as compiling (&lt;code&gt;./configure &amp;amp;&amp;amp; make&lt;/code&gt;)
to be able to keep some extra resources for processes such as email and IRC.&lt;/p&gt;

&lt;p&gt;To be able to write add a non root owner of a control group, the following
flags are useful:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-t user:group # User that can add tasks to the cgroup.
-a user:group # User that can add and modify tasks in the cgroup.

# Create a cgroup for user anton in group anton which is able to use and
# modify the cgroup &quot;mygroup&quot;.
cgcreate -t anton:anton -a anton:anton memory,cpu:mygroup
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are a lot of other things that can be done with Control Groups such as
monitoring and introspection. I recommend reading in on cgroups to learn more
about it.&lt;/p&gt;

&lt;h2&gt;Links&lt;/h2&gt;

&lt;p&gt;To read more about cgroups, the following links helped me understand more
about it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt&quot;&gt;Kernel.org cgroups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lwn.net/Articles/604609/&quot;&gt;LWN.net cgroups series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.linux-kongress.org/2010/slides/seyfried-cgroups-linux-kongress-2010-presentation.pdf&quot;&gt;cgroups linux kongress 2010 presentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Introduction to Apache Mesos</title>
   <link href="http://antonlindstrom.com/2015/03/29/introduction-to-apache-mesos.html"/>
   <updated>2015-03-29T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2015/03/29/introduction-to-apache-mesos</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://mesos.apache.org/&quot;&gt;Apache Mesos&lt;/a&gt; has been an interest of mine for
quite some time and the potential of the Mesos project and the ecosystem is
huge. The project has gotten a lot of attention from bigger companies
such as Amazon, eBay and Netflix. Mesos has also been sponsored and used
by Twitter for quite some time.&lt;/p&gt;

&lt;h3&gt;Introduction and concepts&lt;/h3&gt;

&lt;p&gt;Mesos is a cluster manager, handling workloads in a distributed environment.
For instance, to increase resource allocation in clusters, Mesos provides
dynamic allocation of resources which means that you won't have to allocate
one machine for Hadoop, one for the web server and another one for a
database. All the resources that exists on the machines in the cluster will
be put in a single pool which everything you would like to run on it can
draw from. The database, Hadoop jobs and web server may run on any of the
machines that have resources available.&lt;/p&gt;

&lt;p&gt;A machine in the cluster may have multiple processes running and to keep them
from interfering with each other, Mesos provides isolators that keep
processes from disturbing each other. Examples of isolators are
&lt;code&gt;CGroupsMemIsolator&lt;/code&gt; and &lt;code&gt;NetworkIsolator&lt;/code&gt;. A disk qouta isolator was
introduced in &lt;a href=&quot;https://mesosphere.com/2015/03/27/mesos-0-22-0-released/&quot;&gt;Mesos
0.22.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are also containerizers that implements isolators to add a container
around a process. The most prominent examples are Cgroups and Docker. Docker
may be used to isolate and run tasks and this is a model that simplifies
the operability of a large scale infrastructure that runs in Docker.&lt;/p&gt;

&lt;p&gt;Mesos has several components and the three most important bits
are the &lt;em&gt;masters&lt;/em&gt;, &lt;em&gt;slaves&lt;/em&gt; and &lt;em&gt;frameworks&lt;/em&gt;. The masters work to
coordinate and manage the slave daemons. It's the master that decides how many
resources it has to offer to the framework. The master knows how much
resources it can offer by the amount that the slaves report to have freely
available.&lt;/p&gt;

&lt;p&gt;A master is a singular entity that coordinates the work, there are however
multiple masters in a high availability set up. Only one master should be leader at
any time and &lt;a href=&quot;https://zookeeper.apache.org/&quot;&gt;Zookeeper&lt;/a&gt; is being used for leader
elections.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mesosmasterquorum-al-150324-w1024_1x.png&quot; alt=&quot;Mesos architecture&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the diagram above, &lt;em&gt;Framework A&lt;/em&gt; wants to run a process (in Mesos called
task) on the cluster. It
first sends a request to the &lt;em&gt;Master&lt;/em&gt; which in turn will get the resource
information from the slaves. The master will then send an offer to &lt;em&gt;Framework
A&lt;/em&gt; and allow it to run on the slave that has resources available, in this case
&lt;em&gt;Slave 1&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In the architecture diagram, the following occurs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The slave sends the amount of resources it has available to the master.&lt;/li&gt;
&lt;li&gt;The master may then send out an offer with resources to the framework which
it may accept or reject.&lt;/li&gt;
&lt;li&gt;If the framework accepts the offer, it sends a list of tasks it wants to
run on the Mesos cluster.&lt;/li&gt;
&lt;li&gt;Tasks are being forwarded to the slave which runs the framework executor
that will execute the tasks in the list received from the master.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;The roles of masters and slaves can be summarized by the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Masters coordinate the work and gives it to the slave that has the
resources to do it.&lt;/li&gt;
&lt;li&gt;Slaves do the work and report how much more work they can do.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Frameworks&lt;/h3&gt;

&lt;p&gt;The frameworks is probably the component that you as a user will
interface with the most. The framework is responsible for a few different things and
there are a few different parts to the framework as well. Frameworks must
consist of at least two things, a &lt;em&gt;scheduler&lt;/em&gt; and an &lt;em&gt;executor&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The scheduler is responsible for registering to the Mesos master and handles
the offers. The executor is a program or command on the slaves which runs the
tasks. If you have some constraints on your tasks that should be run, for
instance you only want to run &lt;em&gt;task X&lt;/em&gt; in &lt;em&gt;datacenter Y&lt;/em&gt;, this is done in the
framework. The scheduler in the framework knows the most about your task and
may deny any offer it receives. To be able to know which slaves are in
datacenter Y, Mesos slaves can be started with &lt;em&gt;attributes&lt;/em&gt;. This is a
key/value property list that are added to the slave. In the framework
it's then possible to deny offers that doesn't have the &lt;em&gt;datacenter Y&lt;/em&gt;
attribute.&lt;/p&gt;

&lt;p&gt;When the framework accepts an offer it sends the details of a task
back to Mesos which will dispatch it to the slave.&lt;/p&gt;

&lt;p&gt;There are several big frameworks at the time of this writing. The major ones
being &lt;a href=&quot;http://aurora.incubator.apache.org/&quot;&gt;Apache Aurora&lt;/a&gt;,
&lt;a href=&quot;https://spark.apache.org/&quot;&gt;Apache Spark&lt;/a&gt;,
&lt;a href=&quot;http://mesos.github.io/chronos/&quot;&gt;Chronos&lt;/a&gt; and
&lt;a href=&quot;https://mesosphere.github.io/marathon/&quot;&gt;Mesosphere Marathon&lt;/a&gt;. Apache Aurora
and Mesosphere Marathon aims both to be used with long-running services, for
instance running your web server. For batch jobs, Apache Spark provides
both standalone and Mesos powered cluster computing. Chronos does distributed
cron.&lt;/p&gt;

&lt;p&gt;There are many more frameworks out there, for instance to run Cassandra and
Elasticsearch on Mesos. The high availability and self healing
capabilities of Mesos makes it perfect to manage resources in the datacenter.
See the framework as the application that runs on the Mesos cluster.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Framework schedulers take responsibility of offers to the Mesos master, the
offers can be accepted or denied.&lt;/li&gt;
&lt;li&gt;Framework executors run commands on the slaves.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Operating Apache Mesos&lt;/h3&gt;

&lt;p&gt;Most people reading this will probably come in contact with Mesos by operating
it. Some of the people I've talked to have been a bit afraid of running and
operating Mesos in their infrastructure. Most of the time this seems to be the
lack of understanding about how the system works and not trusting the &quot;magic&quot;
of how tasks are being run.&lt;/p&gt;

&lt;p&gt;Key points that's the strength of the Mesos system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fault tolerance, when set up in high availability any individual part can
break without bringing down the system.&lt;/li&gt;
&lt;li&gt;Almost everything can be done from a web browser, no need to give everyone
in the organization access to servers.&lt;/li&gt;
&lt;li&gt;Using frameworks it's very easy to deploy applications.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I've got a &lt;a href=&quot;http://www.antonlindstrom.com/2014/09/03/moving-onto-mesos.html&quot;&gt;very small
cluster&lt;/a&gt;
that I've been using for some time now. The
entire time the cluster only went down partially one or two times. The
downtime was caused by bugs in the Mesosphere Marathon framework which was due
to a release that wasn't 100% mature and caused deploys to be locked.
Currently I've upgraded the components successfully a few times and it's still
stable and no downtime. As my cluster is very small, the failures will cause
more impact (too many tasks and some won't get offers if a slave goes down).&lt;/p&gt;

&lt;p&gt;The operability of Mesos itself is according to my experience good. It has
been easy to set up and run, I spend less time on the infrastructure now than
I did before I implemented it. Creating new tasks to try something out is very
fast, thanks to Mesos, Marathon and Docker. The hardest part to operate is in
my experience, Zookeeper. Since operating Mesos doesn't involve doing any
particular operation directly to Zookeper yourself, it works very well.&lt;/p&gt;

&lt;p&gt;As Twitter has been using Mesos for quite some time and are running a huge
amount of their infrastructure on it, it's both battle-tested and proven
stable in a demanding infrastructure.&lt;/p&gt;

&lt;h3&gt;Conclusions&lt;/h3&gt;

&lt;p&gt;Apache Mesos is a cluster manager that's robust, battle tested and designed
for failures. The cluster will simplify and save money with dynamic
allocations and you won't have to dedicate hardware to different systems. To
provide security, Mesos will use isolators to keep processes from interfering
with each other.&lt;/p&gt;

&lt;p&gt;When a system is set up, it will need Zookeeper, Mesos
master processes, slave processes and a framework. Masters coordinate the work
and decides what resources to give the frameworks. The framework then decides if it
wants to accept or reject an offer with resources. If the framework decides to
accept the offer, it sends a list of tasks it wants to run to the master which
then sends it through to the slave which will run the executor defined by the
framework.&lt;/p&gt;

&lt;h3&gt;Related papers&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://research.microsoft.com/pubs/64604/osr2007.pdf&quot;&gt;Autopilot: Automatic Data Center Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cs.berkeley.edu/~alig/papers/mesos.pdf&quot;&gt;Mesos: A Platform for Fine-Grained Resource Sharing in the Data Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://static.googleusercontent.com/media/research.google.com/en/us/pubs/archive/41684.pdf&quot;&gt;Omega: flexible, scalable schedulers for large compute clusters&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</content>
 </entry>
 
 <entry>
   <title>Monitoring Mesos tasks with Prometheus</title>
   <link href="http://antonlindstrom.com/2015/02/24/monitoring-mesos-tasks-with-prometheus.html"/>
   <updated>2015-02-24T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2015/02/24/monitoring-mesos-tasks-with-prometheus</id>
   <content type="html">&lt;p&gt;I run an infrastructure for my own hobby projects and tests. The environment
is currently running on &lt;a href=&quot;https://www.digitalocean.com/&quot;&gt;DigitalOcean&lt;/a&gt;
with &lt;a href=&quot;http://mesos.apache.org/&quot;&gt;Mesos&lt;/a&gt;
and &lt;a href=&quot;https://mesosphere.github.io/marathon/&quot;&gt;Mesosphere Marathon&lt;/a&gt;
on top which runs all applications. The need for simple yet powerful monitoring
without too much setup, maintenance and configuration has been high in that
environment. I wanted to both know when applications failed or what the load
and the performance of the system was.&lt;/p&gt;

&lt;p&gt;My previous monitoring system comprised of a few different ones, I used a simple
&lt;a href=&quot;https://uptimerobot.com/&quot;&gt;Uptime Robot&lt;/a&gt; to collect external alerts and
&lt;a href=&quot;http://influxdb.com/&quot;&gt;InfluxDB&lt;/a&gt; with a custom dashboard and metrics
collector to look at performance graphs. That system was unfortunately not
good enough. It got complex and the automatic deployment of it was not
configured properly, it did not get enough attention to make it work as
good as it could've been.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/prometheus_800x526.jpeg&quot; alt=&quot;Prometheus crystal ball&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Enter the crystal ball: &lt;a href=&quot;http://prometheus.io&quot;&gt;Prometheus&lt;/a&gt;.
It got some attention lately and I decided to
try it out. The easiest way to install it is via Docker which is listed on
their &lt;a href=&quot;http://prometheus.io/docs/introduction/install/&quot;&gt;installation&lt;/a&gt; page. I
hooked that up to my &lt;a href=&quot;http://www.antonlindstrom.com/2014/09/03/moving-onto-mesos.html&quot;&gt;deployment
system&lt;/a&gt; and
started looking at it. I was met by a simple but powerful configuration,
query language and user interface. However, once started I needed a way to
get some useful data into it.&lt;/p&gt;

&lt;p&gt;I knew about the &lt;code&gt;/monitor/statistics.json&lt;/code&gt; endpoint for Mesos slaves and have
been using that endpoint successfully a few times to find out CPU or memory
usage for running tasks. The endpoint would be a good place to fetch information from with a simple
program that does a GET request, parses the data and displays it in the format
Prometheus wants.&lt;/p&gt;

&lt;p&gt;To get Mesos data into the system it was as easy as building a small Go app
that used the client provided by Prometheus and serve HTTP. The Mesos exporter
can be found on my &lt;a href=&quot;https://github.com/antonlindstrom/mesos_exporter&quot;&gt;Github&lt;/a&gt;
and any feedback to get it better is welcome. The installation instructions
are available in the README.&lt;/p&gt;

&lt;p&gt;After I had built the exporter, the Prometheus configuration was just a few
lines to add the exporter endpoint and graphs started showing.&lt;/p&gt;

&lt;p&gt;Previously, my relationship towards monitoring systems have always been a bit on the
complicated side. I love &lt;a href=&quot;http://sensuapp.org&quot;&gt;Sensu&lt;/a&gt; when I have &lt;a href=&quot;/2013/03/17/adventures-with-puppet-and-sensu.html&quot;&gt;machines running entire stacks&lt;/a&gt;
but with Docker, it is not a perfect fit. If I use Puppet, Sensu also requires a lot of
infrastructure to be set up in a small environment where there is high velocity
but not that much resources it is far from ideal.&lt;/p&gt;

&lt;p&gt;Prometheus sits right in the perfect spot where the simplicity and the
extensibility of
&lt;a href=&quot;http://prometheus.io/docs/instrumenting/exporters/&quot;&gt;exporters&lt;/a&gt; makes it
easy to run. That it also comes packaged in a Docker container makes it even
more so.&lt;/p&gt;

&lt;p&gt;Alerting in Prometheus is done on the data collected which is then sent off to
another system, &lt;a href=&quot;https://github.com/prometheus/alertmanager&quot;&gt;alertmanager&lt;/a&gt;.
Simple and very powerful.&lt;/p&gt;

&lt;p&gt;So far Prometheus has been everything I wanted and provides a really good
way to monitor my infrastructure and alert on any anomalies in it. Once
you start learning the query language, it is amazing how intuitive it
feels.&lt;/p&gt;

&lt;p&gt;A query against the data in Prometheus to find the top 3 highest consumers of
CPU in Mesos for example, looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;topk(3, sum(rate(mesos_task_cpus_user_time_secs[5m])) by (app))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: Mesos and Prometheus are great, here's a
&lt;a href=&quot;https://github.com/antonlindstrom/mesos_exporter&quot;&gt;mesos_exporter&lt;/a&gt; to get
Mesos task statistics into Prometheus.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Note: Image is probably copyrighted and owned by 20th Century Fox.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Operating systems: Introduction to processes</title>
   <link href="http://antonlindstrom.com/2014/12/15/operating-systems-introduction-to-processes.html"/>
   <updated>2014-12-15T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2014/12/15/operating-systems-introduction-to-processes</id>
   <content type="html">&lt;p&gt;I've wanted to write this for a long time but always had an excuse not to.
Operating systems are a big part of my every day work, especially GNU/Linux
which will be the focus of this post.&lt;/p&gt;

&lt;p&gt;The topic of processes is huge so I'm not sure how to cover all of the pieces.
This post will hopefully contain enough code so you'll be able to understand
how to interact with a process. These code examples will focus on GNU/Linux as
it is the operating system I'm most familiar with.&lt;/p&gt;

&lt;p&gt;So, what is a process? &lt;a href=&quot;http://www.linfo.org/process.html&quot;&gt;The Linux Information
Project&lt;/a&gt; defines a process as &quot;an
executing (i.e., running) instance of a program&quot;. So, to define a process we
need to define what a program is. Again, according to The Linux Information
Project, &quot;A program is an executable file that is held in storage&quot;.&lt;/p&gt;

&lt;p&gt;So, what we know is that a process is some part of a program that is running.
Does that mean that a process must be running? Well, not quite.&lt;/p&gt;

&lt;h4&gt;Process states&lt;/h4&gt;

&lt;p&gt;In order to understand what it means that a process is running, we need to
visit the different states of a process. A process can have several states (in
the Linux kernel, a process is sometimes called a task).&lt;/p&gt;

&lt;p&gt;In the file
&lt;a href=&quot;https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L130-L143&quot;&gt;&lt;code&gt;fs/proc/array.c&lt;/code&gt;&lt;/a&gt;
the following is defined:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/*
* The task state array is a strange &quot;bitmap&quot; of
* reasons to sleep. Thus &quot;running&quot; is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
        &quot;R (running)&quot;,          /*   0 */
        &quot;S (sleeping)&quot;,         /*   1 */
        &quot;D (disk sleep)&quot;,       /*   2 */
        &quot;T (stopped)&quot;,          /*   4 */
        &quot;t (tracing stop)&quot;,     /*   8 */
        &quot;X (dead)&quot;,             /*  16 */
        &quot;Z (zombie)&quot;,           /*  32 */
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running does not however mean that the process is running, it denotes that the
process is either running or on the run queue. Sleeping means that the process
is waiting for an event to complete (the sleep here is also sometimes called
interruptible sleep). Disk sleep is sometimes called uninterruptible sleep,
and the process is usually waiting for IO to finish.&lt;/p&gt;

&lt;p&gt;A process can be stopped (&lt;code&gt;T&lt;/code&gt;) by sending a process a &lt;code&gt;SIGSTOP&lt;/code&gt; signal. This
pauses the process and can be continued by sending the &lt;code&gt;SIGCONT&lt;/code&gt; signal.&lt;/p&gt;

&lt;p&gt;For example, stopping and continuing a process can be done in the following
manner:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kill -SIGSTOP &amp;lt;pid&amp;gt;
kill -SIGCONT &amp;lt;pid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tracing stop can be done by using &lt;code&gt;gdb&lt;/code&gt; to stop a process. If I recall
correctly, this state is basically the same as stopped state.&lt;/p&gt;

&lt;p&gt;The dead state is a state that is returned when the kernel is running the
&lt;code&gt;do_exit()&lt;/code&gt; function in &lt;code&gt;kernel/exit.c&lt;/code&gt;. This is just to return a status but
the state should not be seen in your task list.&lt;/p&gt;

&lt;p&gt;Zombies is a state that is a bit peculiar. Some think of it as a state that
happens when the process parent dies and the child process is left. This is
not the case. The parent may die but the child could still live on, the parent
process of that child will be the &lt;code&gt;init&lt;/code&gt; process, &lt;code&gt;pid 1&lt;/code&gt;. A zombie process
occurs when the process exits and the return code hasn't been read by the
parent process (using the &lt;code&gt;wait()&lt;/code&gt; system call). It remains in the process
table as terminated but is waiting for the parent to read the exit status.&lt;/p&gt;

&lt;p&gt;Here's a simple example that creates a zombie process for 30 seconds:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

/*
* A program to create a 30s zombie
* The parent spawns a process that isn't reaped until after 30s.
* The process will be reaped after the parent is done with sleep.
*/
int main(int argc, char **argv[])
{
        int id = fork();

        if ( id &amp;gt; 0 ) {
                printf(&quot;Parent is sleeping..\n&quot;);
                sleep(30);
        }

        if ( id == 0 )
                printf(&quot;Child process is done.\n&quot;);

        exit(EXIT_SUCCESS);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The post &lt;a href=&quot;https://idea.popcount.org/2012-12-11-linux-process-states/&quot;&gt;Linux process
states&lt;/a&gt; is an
excellent post describing the process states with code examples and &lt;code&gt;ptrace&lt;/code&gt; to
control it.&lt;/p&gt;

&lt;h4&gt;What does a process contain?&lt;/h4&gt;

&lt;p&gt;I briefly mentioned the process table, here I'll explain what it is. A process
table is a data structure in the Linux kernel that is loaded into RAM and
contains information about processes.&lt;/p&gt;

&lt;p&gt;Every process has information in the data structure, &lt;code&gt;task_struct&lt;/code&gt; and
contains amongst other:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State (task state, exit code, exit signal..)&lt;/li&gt;
&lt;li&gt;Priority&lt;/li&gt;
&lt;li&gt;PID&lt;/li&gt;
&lt;li&gt;PPID&lt;/li&gt;
&lt;li&gt;Children&lt;/li&gt;
&lt;li&gt;Usage (cpu time, open files..)&lt;/li&gt;
&lt;li&gt;Tracing information&lt;/li&gt;
&lt;li&gt;Scheduling information&lt;/li&gt;
&lt;li&gt;Memory management information&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The data structure holding the process information is called &lt;code&gt;task_struct&lt;/code&gt;
and can be found in
&lt;a href=&quot;https://github.com/torvalds/linux/blob/master/include/linux/sched.h#L1274-L1704&quot;&gt;&lt;code&gt;include/linux/sched.h&lt;/code&gt;&lt;/a&gt;.
All processes that are running in the system are represented in the kernel as a
linked list of &lt;code&gt;task_struct&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Information about a process can be queried via the &lt;code&gt;/proc&lt;/code&gt; system. To get
information about the process with pid 400, you should be able to look into
the &lt;code&gt;/proc/400&lt;/code&gt; directory. Most of the information can also be found using
user land tools such as &lt;code&gt;top&lt;/code&gt; and &lt;code&gt;ps&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;Process execution&lt;/h4&gt;

&lt;p&gt;When a process is executed, it is loaded into the virtual memory, allocates
the space for program variables and adds the information into the &lt;code&gt;task_struct&lt;/code&gt;
data structure.&lt;/p&gt;

&lt;p&gt;The process contains a memory layout of four different segments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text, contains source instructions of the program&lt;/li&gt;
&lt;li&gt;Data, contains static variables&lt;/li&gt;
&lt;li&gt;Heap is the area for dynamic memory allocations&lt;/li&gt;
&lt;li&gt;Stack is of dynamic size and grows and shrinks as the process is running,
this is the storage for local variables.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There are two ways to create a process, &lt;code&gt;fork()&lt;/code&gt; and &lt;code&gt;execve()&lt;/code&gt;. These are
both system calls but works slightly different.&lt;/p&gt;

&lt;p&gt;To create a child process the &lt;code&gt;fork()&lt;/code&gt; system call can be executed. The child
process then inherits a copy of the parent data, stack and heap memory
segments. The child process can then modify these segments independently. The
text segment is also shared with the child process but can not be modified.&lt;/p&gt;

&lt;p&gt;A new process is created with &lt;code&gt;execve()&lt;/code&gt;. This system call destroys all the
memory segments to create new ones. &lt;code&gt;execve()&lt;/code&gt; does however take an executable
or script as an argument which is also different from &lt;code&gt;fork()&lt;/code&gt;. &lt;code&gt;execve()&lt;/code&gt;
does however take an executable or script as an argument which is also
different from &lt;code&gt;fork()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Note that both &lt;code&gt;execve()&lt;/code&gt; and &lt;code&gt;fork()&lt;/code&gt; creates a process that is a child
process of the executing process.&lt;/p&gt;

&lt;p&gt;There's a lot of more to process execution than this. There's scheduling,
permissions, resource limits, library linking, memory mapping.. However, this
post will unfortunately be too long to cover everything. Perhaps this will be
something to revisit later on.&lt;/p&gt;

&lt;h4&gt;Interprocess communication (IPC)&lt;/h4&gt;

&lt;p&gt;For processes to communicate with each other, a couple of methods exist such
as shared memory or message passing.&lt;/p&gt;

&lt;p&gt;In the case of shared memory, a shared region is created so that several
processes can communicate. The region can then be accessed simultaneously by
multiple processes. This is commonly used when working with threads. This is
the fastest form of IPC because it's only writing and reading memory involved.
However, this requires the processes involved to agree on accessing the memory
segment as restrictions on accessing other processes memory is implemented by
the kernel.&lt;/p&gt;

&lt;p&gt;Shared memory segments in use can be found with the command &lt;a href=&quot;http://man7.org/linux/man-pages/man1/ipcs.1.html&quot;&gt;&lt;code&gt;ipcs
-m&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Implementing a server for shared memory, looks something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;sys/ipc.h&amp;gt;
#include &amp;lt;sys/shm.h&amp;gt;

#define SEGMENT_SIZE 64

int main(int argc, char **argv[])
{
        int shmid;
        char *shmaddr;

        /* Create or get the shared memory segment */
        if ((shmid = shmget(555, SEGMENT_SIZE, 0644 | IPC_CREAT)) == -1) {
                printf(&quot;Error: Could not get memory segment\n&quot;);
                exit(EXIT_FAILURE);
        }

        /* Attach to the shared memory segment */
        if ((shmaddr = shmat(shmid, NULL, 0)) == (char *) -1) {
                printf(&quot;Error: Could not attach to memory segment\n&quot;);
                exit(EXIT_FAILURE);
        }

        /* Write a character to the shared memory segment */
        *shmaddr = 'a';

        /* Detach the shared memory segment */
        if (shmdt(shmaddr) == -1) {
                printf(&quot;Error: Could not close memory segment\n&quot;);
                exit(EXIT_FAILURE);
        }

        exit(EXIT_SUCCESS);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By substituting &lt;code&gt;*shmaddr = 'a';&lt;/code&gt; with &lt;code&gt;printf(&quot;Segment: %s\n&quot;, shmaddr)&lt;/code&gt; you
will get a client instead and be able to read the data in the shared memory
segment.&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;ipcs -m&lt;/code&gt; will output the following information about the segment set
with the server:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;anton@shell:~$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x0000022b 0          anton      644        64         0   
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The segment can be removed with
&lt;a href=&quot;http://man7.org/linux/man-pages/man1/ipcrm.1.html&quot;&gt;&lt;code&gt;ipcrm&lt;/code&gt;&lt;/a&gt;. To learn more
about implementing shared memory IPC read Beej's fantastic guide, &lt;a href=&quot;http://beej.us/guide/bgipc/output/html/multipage/shm.html&quot;&gt;Shared
memory segments&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Other approaches to IPC are files, signals, sockets, message queues, pipes,
semaphores and message passing. I'm not able to dive into all of the
approaches but I think that signals and pipes should provide some interesting
examples.&lt;/p&gt;

&lt;h5&gt;Signals&lt;/h5&gt;

&lt;p&gt;In process states, we saw an example of signals with the help of &lt;code&gt;kill&lt;/code&gt;. A
signal is a software interrupt that informs processes of events or exceptions
that occurs.&lt;/p&gt;

&lt;p&gt;A signal is identified by an integer but is often described with &lt;code&gt;SIGXXX&lt;/code&gt;, for
example &lt;code&gt;SIGSTOP&lt;/code&gt; or &lt;code&gt;SIGCONT&lt;/code&gt;. Signals are used by the kernel to inform
processes of events but can also be sent from a process with the &lt;code&gt;kill()&lt;/code&gt; system
call. A process that receives a signal may ignore it, be killed by it or be
suspended by it. It is possible to handle signals via a signal handler and the
process may do whatever it pleases when the signal occurs. The special signal
&lt;code&gt;SIGKILL&lt;/code&gt; cannot be trapped (handled), this is used when killing for example
a hung process. &lt;code&gt;SIGKILL&lt;/code&gt; should not be confused with &lt;code&gt;SIGTERM&lt;/code&gt; which is sent
by default when using &lt;code&gt;Ctrl+C&lt;/code&gt; or &lt;code&gt;kill &amp;lt;PID&amp;gt;&lt;/code&gt;. &lt;code&gt;SIGTERM&lt;/code&gt; doesn't forcibly
kill the process and the signal can be trapped and often a process is allowed
to clean up.&lt;/p&gt;

&lt;h5&gt;Pipes&lt;/h5&gt;

&lt;p&gt;A pipe is used to connect one process output to another process input. This is
one of the oldest methods of IPC. An ordinary pipe is a one-way communication,
it has a unidirectional flow. A pipe can be created with &lt;code&gt;pipe()&lt;/code&gt; and is
similarly to other objects in Linux, treated as a file. The &lt;code&gt;read()&lt;/code&gt; and
&lt;code&gt;write()&lt;/code&gt; operations apply to pipes as well as files.&lt;/p&gt;

&lt;p&gt;Named pipes is an improvement of ordinary pipes, the communication can flow
bidirectionally and several writers and readers can use the pipe. This is not
possible in ordinary pipes. Named pipes can also exist even if no writers or
readers are using it. The named pipes are created as a special device in the
file system, in GNU/Linux named pipes are also referred to as FIFOs (First In
First Out).&lt;/p&gt;

&lt;p&gt;Here's an example of creating a named pipe:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;
#include &amp;lt;sys/stat.h&amp;gt;

int main(int argc, char **argv[])
{
        if (mknod(&quot;myfifo&quot;, S_IFIFO|0666, 0) == -1) {
                printf(&quot;Failed to mknod\n&quot;);
                exit(EXIT_FAILURE);
        }

        exit(EXIT_SUCCESS);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In the executing directory, we'll see the file &lt;code&gt;myfifo&lt;/code&gt;. It will look
something like the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;prw-rw-r--  1 anton anton    0 Dec 16 16:14 myfifo
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That was the basic introduction into processes. The more I started to write
the more I realized that there's so much to cover. I had a hard time knowing
where to start and also where to draw the line of what not to cover. Shared
memory segments is something I haven't done that much of and it was really fun
to revisit that part of interprocess communication. Also, by having a lot of
good resources such as &lt;a href=&quot;http://man7.org/tlpi&quot;&gt;The Linux Programming Interface&lt;/a&gt;
and &lt;a href=&quot;http://os-book.com/&quot;&gt;Operating System Concepts&lt;/a&gt; made it easier to get
back into the concepts.&lt;/p&gt;

&lt;h4&gt;References&lt;/h4&gt;

&lt;p&gt;The following resources has been used in order to gain more understanding of
the field. If you want to learn more about operating systems,
make sure to check these books out, they are pretty thick but a good read.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.linfo.org/process.html&quot;&gt;The Linux Information Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://man7.org/tlpi&quot;&gt;The Linux Programming Interface&lt;/a&gt;, chapter 6&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://os-book.com/&quot;&gt;Operating System Concepts&lt;/a&gt;, chapter 3&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Visual block inserting in Vim</title>
   <link href="http://antonlindstrom.com/2014/12/04/visual-block-inserting-in-vim.html"/>
   <updated>2014-12-04T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2014/12/04/visual-block-inserting-in-vim</id>
   <content type="html">&lt;p&gt;I've recently started using the
&lt;a href=&quot;http://vimdoc.sourceforge.net/htmldoc/visual.html&quot;&gt;visual&lt;/a&gt; features of the
Vim editor. One of the features is visual block inserting. There's a lot of use cases
for visual block inserting. Since being introduced to it, I've been mostly
using it to prepend multiple rows with comment signs.&lt;/p&gt;

&lt;p&gt;An example may provide a better overview, this is the example we have:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1  #include &amp;lt;stdio.h&amp;gt;
2  #include &amp;lt;stdlib.h&amp;gt;
3
4  int main(int argc, char **argv[])
5  {
6          printf(&quot;Hello World\n&quot;);
7
8          if (argc &amp;gt; 1)
9                  exit(EXIT_FAILURE);
10
11          exit(EXIT_SUCCESS);
12 }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In this case, we have a simple program that returns the exit code 1 when we
supply some arguments to the program.&lt;/p&gt;

&lt;p&gt;Let's decide we don't what to use that, we'll fire up Vim and comment out
the &lt;code&gt;if&lt;/code&gt; block (row 8-9).&lt;/p&gt;

&lt;p&gt;Go to the 8:th row, press &lt;code&gt;Ctrl-V&lt;/code&gt; to go into Visual Block mode. Use &lt;code&gt;j&lt;/code&gt; to
mark row 9 as well. Then Press &lt;code&gt;Shift-i&lt;/code&gt; and insert &lt;code&gt;//&lt;/code&gt; before row 8. Press
&lt;code&gt;Esc&lt;/code&gt; and you will see that row 8 and 9 will look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7
8  //         if (argc &amp;gt; 1)
9  //                exit(EXIT_FAILURE);
10
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;a href=&quot;http://vimdoc.sourceforge.net/htmldoc/visual.html&quot;&gt;documentation&lt;/a&gt; gives
some examples and there's also &lt;code&gt;:help v&lt;/code&gt; inside Vim to get more information.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Standalone checks with Sensu</title>
   <link href="http://antonlindstrom.com/2014/11/23/standalone-checks-with-sensu.html"/>
   <updated>2014-11-23T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2014/11/23/standalone-checks-with-sensu</id>
   <content type="html">&lt;p&gt;The monitoring framework &lt;a href=&quot;http://sensuapp.org/&quot;&gt;Sensu&lt;/a&gt; as I've written
about &lt;a href=&quot;/2013/03/17/adventures-with-puppet-and-sensu.html&quot;&gt;before&lt;/a&gt; is being
implemented at my new gig. We've been investigating some fun things about it
and looked into something that's not very well documented, &lt;a href=&quot;http://sensuapp.org/docs/latest/adding_a_standalone_check&quot;&gt;standalone
checks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A standalone check is a &lt;a href=&quot;http://sensuapp.org/docs/latest/checks&quot;&gt;check&lt;/a&gt; that's
not defined in the server but is defined and executed on the client. The
standalone checks can be defined in two ways, either use the &lt;a href=&quot;http://sensuapp.org/docs/latest/clients&quot;&gt;Sensu
client&lt;/a&gt; or send the definition to the
Sensu port. What's described below is how we send checks to the server with
standard Linux utilities.&lt;/p&gt;

&lt;p&gt;Here's the simplest way to send a check to the Sensu server:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;echo '{
  &quot;handlers&quot;: [&quot;default&quot;],
  &quot;name&quot;: &quot;check_name&quot;,
  &quot;output&quot;: &quot;error message&quot;,
  &quot;status&quot;: 2
}' | nc -w1 sensu-server.example.com 3030
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The command above sends a check that has an error, this means it will error
and throw an alert.&lt;/p&gt;

&lt;p&gt;To provide some client context of the alert, we can send the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;echo '{
  &quot;client&quot;: {
    &quot;name&quot;: &quot;localhost&quot;,
    &quot;address&quot;: &quot;127.0.0.1&quot;
  },
  &quot;handlers&quot;: [&quot;default&quot;],
  &quot;name&quot;: &quot;check_name&quot;,
  &quot;output&quot;: &quot;error message&quot;,
  &quot;status&quot;: 2
}' | nc -w1 sensu-server.example.com 3030
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The alerts can be sent in a blocking or non-blocking way (TCP/UDP). Use
&lt;code&gt;nc -w1 -u sensu-server.example.com 3030&lt;/code&gt; for UDP.&lt;/p&gt;

&lt;p&gt;Metrics can be sent into Sensu by using the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;echo '{
  &quot;client&quot;: {
    &quot;name&quot;: &quot;localhost&quot;,
    &quot;address&quot;: &quot;127.0.0.1&quot;
  },
  &quot;handlers&quot;: [&quot;graphite&quot;],
  &quot;name&quot;: &quot;localhost-metrics&quot;,
  &quot;output&quot;: &quot;localhost.disk_usage.lolcats.used   9000000    1411131484&quot;,
  &quot;status&quot;: 0,
  &quot;type&quot;: &quot;metric&quot;
}' | nc -w1 sensu-server.example.com 3030
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;All the settings that are used in the configuration and check files can also
be used with standalone external checks. This means that it's possible to use
the standard Linux toolchain to send alerts or metrics from shell scripts
without any extra dependencies. The examples should provide an introduction to
use &lt;a href=&quot;http://sensuapp.org/&quot;&gt;Sensu&lt;/a&gt; with &lt;a href=&quot;http://linux.die.net/man/1/nc&quot;&gt;nc
(1)&lt;/a&gt; and &lt;a href=&quot;http://linux.die.net/man/1/echo&quot;&gt;echo
(1)&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Capture stdout in Golang</title>
   <link href="http://antonlindstrom.com/2014/11/17/capture-stdout-in-golang.html"/>
   <updated>2014-11-17T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2014/11/17/capture-stdout-in-golang</id>
   <content type="html">&lt;p&gt;Working with &lt;a href=&quot;http://docker.io&quot;&gt;Docker&lt;/a&gt; and &lt;a href=&quot;http://golang.org&quot;&gt;Golang&lt;/a&gt; for a
hobby project, I needed to get the output from &lt;code&gt;docker build&lt;/code&gt; into my own
log function. To do this, it's pretty easy do some redirections to solve this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;func RedirectOutput(id string) {
        oldStdout := os.Stdout
        readFile, writeFile, err := os.Pipe()
        if err != nil {
                return err
        }

        os.Stdout = writeFile

        go func() {
                scanner := bufio.NewScanner(r)
                for scanner.Scan() {
                        line := scanner.Text()

                        // Log the stdout line to my event logger
                        event.Log(event.Event{Id: id, Msg: line})
                }
        }()

        fmt.Printf(&quot;This will be logged to our event logger\n&quot;)

        // Reset the output again
        writeFile.Close()
        os.Stdout = oldStdout
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The function will log everything printed to stdout line by line to our
event logger. This can be used to override
&lt;a href=&quot;http://golang.org/pkg/fmt/#Printf&quot;&gt;&lt;code&gt;fmt.Printf&lt;/code&gt;&lt;/a&gt; and sending it to your
own logger without having to import a package in every file.&lt;/p&gt;

&lt;p&gt;My event logger stores events in a simple &lt;a href=&quot;http://redis.io&quot;&gt;Redis&lt;/a&gt; database
so I can look at them later. This was a really simple way to solve that.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Moving onto Mesos</title>
   <link href="http://antonlindstrom.com/2014/09/03/moving-onto-mesos.html"/>
   <updated>2014-09-03T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2014/09/03/moving-onto-mesos</id>
   <content type="html">&lt;p&gt;Instead of using Heroku for this site for a while but decided to build
something to host it for myself. There are some apps I use that wasn't fast
enough on Heroku so I wanted to try the stability and features of
&lt;a href=&quot;http://mesos.apache.org/&quot;&gt;Mesos&lt;/a&gt; and
&lt;a href=&quot;https://mesosphere.github.io/marathon/&quot;&gt;Marathon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What I wanted from the platform:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fault tolerant&lt;/li&gt;
&lt;li&gt;Easy to deploy&lt;/li&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;li&gt;Minimum maintenance&lt;/li&gt;
&lt;li&gt;Isolated&lt;/li&gt;
&lt;li&gt;Work with a lot of different apps&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Mesos is something I've been eyeballing for quite some time and decided it was
time to use it to host something I really care about. Mesos also satisfies
goal 1, 3, 4, 5 (with Docker isolators) and 6 (also with Docker).&lt;/p&gt;

&lt;p&gt;Marathon basically meets all the goals with the help of Mesos.&lt;/p&gt;

&lt;p&gt;There's a lot of information about how to run Mesos and Marathon so I'm not
going to get into much details about the installation more than the pitfalls I
have discovered so far with my three node cluster.&lt;/p&gt;

&lt;p&gt;The pipeline to deploy this site is the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a new file into git&lt;/li&gt;
&lt;li&gt;Make sure I have a Dockerfile and a file called .build.json&lt;/li&gt;
&lt;li&gt;Push it to my private git repository&lt;/li&gt;
&lt;li&gt;A git hook takes care of building the Docker image&lt;/li&gt;
&lt;li&gt;The hook also pushes the image to a private docker repository&lt;/li&gt;
&lt;li&gt;also, pushing the app definition to Marathon&lt;/li&gt;
&lt;li&gt;Marathon pulls the image and runs the instance&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/QubitProducts/bamboo&quot;&gt;Bamboo&lt;/a&gt; is used and listens to
Marathon events.&lt;/li&gt;
&lt;li&gt;Everything is staged and ready to serve requests&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;The only thing I built myself for this is a git hook that takes a file,
&lt;code&gt;.build.json&lt;/code&gt; and interacts with Docker and Marathon. What it does is that it
builds the Dockerfile provided, pushes the image to the private docker
repository and then sends a POST to Marathon to create or update the
application.&lt;/p&gt;

&lt;p&gt;The only things that have been problematic for me has been that I didn't read
enough about Zookeeper, so I forgot to purge old logs (this caused some
interesting failures with Zookeeper). And then also that I've been a bit too
fast on upgrading Mesos. When I used Mesos 0.20.0, Marathon and Bamboo did not
support it, so I had to run on experimental branches for a while, which has
worked so-so.&lt;/p&gt;

&lt;p&gt;Another advice is to put a master cluster, with Mesos masters and Zookeeper
separate from the slaves so that it wont interfere with the services running.&lt;/p&gt;

&lt;p&gt;So far I am really happy with the setup and will continue to run it in
an experimental phase until I feel that I'm comfortable running it in a
somewhat production environment and trust it's stability.&lt;/p&gt;

&lt;p&gt;The pipeline works really good and it's almost as fast as Heroku to deploy new
applications. If I were to add some more caching in the build steps I'm sure I
can speed this up a bit more.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Speeding up</title>
   <link href="http://antonlindstrom.com/2014/08/30/speeding-up.html"/>
   <updated>2014-08-30T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2014/08/30/speeding-up</id>
   <content type="html">&lt;p&gt;Improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added Rack::Deflate.&lt;/li&gt;
&lt;li&gt;Reduced minimum requests from 4 to 1.&lt;/li&gt;
&lt;li&gt;Page size has been reduced from 30.6kB to 3.7kB.&lt;/li&gt;
&lt;li&gt;From ~12 to ~260 requests per second.&lt;/li&gt;
&lt;li&gt;98th percentile of responses within 100ms.&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>tcpdump OSPF</title>
   <link href="http://antonlindstrom.com/2013/07/23/tcpdump-ospf.html"/>
   <updated>2013-07-23T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2013/07/23/tcpdump-ospf</id>
   <content type="html">&lt;p&gt;Just because I always forget the syntax for dumping OSPF packets:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo tcpdump -Xv -i eth0 ip[9] == 89
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So, that's hex and verbose on the eth0 interface.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Into Docker</title>
   <link href="http://antonlindstrom.com/2013/06/01/into-docker.html"/>
   <updated>2013-06-01T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2013/06/01/into-docker</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.docker.io/&quot;&gt;Docker&lt;/a&gt; is a really sweet piece of tech. It is built on
top of LXC and provides an abstraction to be able to easily build images for
deployment.&lt;/p&gt;

&lt;p&gt;I've been playing with Docker for a few hours and can definitely recommend it
for easy deployments. What it does provide from traditional deployment
strategies and configuration management is mostly speed and a standardized way
to deploy different types of applications. Think of Docker as your own private
PaaS.&lt;/p&gt;

&lt;p&gt;When I first started out there was one thing I wanted to do, I wanted to deploy
a Sinatra application written in Ruby. To get started I decided to go with a
&lt;code&gt;Dockerfile&lt;/code&gt; and write the steps to build the image and create a snapshot of it.&lt;/p&gt;

&lt;p&gt;I'll be building this from an Ubuntu base box, so define that in the
&lt;code&gt;Dockerfile&lt;/code&gt; and install &lt;code&gt;ruby&lt;/code&gt; and &lt;code&gt;rubygems&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;FROM ubuntu
RUN apt-get install -y ruby rubygems
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I felt that getting the artifact into the image  was the tricky part, the
&lt;a href=&quot;http://docs.docker.io/en/latest&quot;&gt;documentation&lt;/a&gt; describes a way to
&lt;a href=&quot;http://docs.docker.io/en/latest/use/builder.html#insert&quot;&gt;insert&lt;/a&gt; a file from
a URL and also a way to
&lt;a href=&quot;http://docs.docker.io/en/latest/use/builder.html#add&quot;&gt;add&lt;/a&gt; a path from the
local filesystem into the LXC container. Both of these commands however, did
unfortunately not work in this version (it works if you specify add or insert
via the CLI interface).&lt;/p&gt;

&lt;p&gt;What I did was download it from a URL with &lt;code&gt;wget&lt;/code&gt; and untar it at a known
location.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RUN wget http://example.com/sinatra-app.tar -O /opt/sinatra-app.tar
RUN mkdir /opt/sinatra-app
RUN tar xf /opt/sinatra-app.tar -C /opt/sinatra-app
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I installed the dependencies with bundler and exported the port which Sinatra
was going to run on:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RUN cd /opt/sinatra-app &amp;amp;&amp;amp; bundle install
ENV PORT 5000
EXPOSE PORT 5000
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To build and run this Sinatra application, the following commands are being
used:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker build &amp;lt; Dockerfile
# outputs the steps and hash, for example 9de15c84a9a1

docker run -d 9de15c84a9a2 foreman start -d /opt/sinatra-app
# runs the newly built image and starts the app with foreman
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To view the app, run &lt;code&gt;docker ps&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ID            IMAGE         COMMAND                CREATED       STATUS           PORTS
96147c4d2090  9de15c84a9a1  foreman start -d /op   Up 22 minutes 22 minutes ago   49171-&amp;gt;5000
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The port specified is the one that is forwarded on your host server, so if your
host server is &lt;code&gt;docker.example.com&lt;/code&gt; you'll see the app on
&lt;code&gt;docker.example.com:49171&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Docker seems like a great way to start out with nicer and better deployments for
applications and services. I'm really looking forward to see what we can do with
it and what others come up with to make it faster and easier to build new
applications.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Apache rewrite maps</title>
   <link href="http://antonlindstrom.com/2013/03/17/apache-rewrite-maps.html"/>
   <updated>2013-03-17T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2013/03/17/apache-rewrite-maps</id>
   <content type="html">&lt;p&gt;At $WORK we have a couple of domains for our clients and need to redirect them to a specific sub-URL. Previously we've done this with a script which required some manual work and unfortunately app downtime.&lt;/p&gt;

&lt;p&gt;We wanted to implement SSL terminators in front of our app servers and decided that Apache would be a good fit. Hearing that &lt;a href=&quot;http://fastly.com&quot;&gt;Fastly&lt;/a&gt; praises Apache for it's speed, it was decided to be put up to a test. By using Apache we also got a nifty little function called &lt;a href=&quot;http://httpd.apache.org/docs/current/rewrite/rewritemap.html&quot;&gt;RewriteMaps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, a customer domain can look like &lt;code&gt;http://antonlindstrom.com&lt;/code&gt; and should redirect to &lt;code&gt;http://example.com/anton&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To enforce this for over 100 domains we used the following Rewrite semantics:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RewriteEngine   On

RewriteMap      exampledomain           txt:/etc/apache2/domains.txt
RewriteRule     ^/$                     ${exampledomain:%{HTTP_HOST}}

RewriteLog      /var/log/apache2/rewrite.log
RewriteLogLevel 5
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In the file &lt;code&gt;/etc/apache2/domains.txt&lt;/code&gt; we can add the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;antonlindstrom.com   http://example.com/anton
exampledomain.com    http://example.com/exampledomain
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When using RewriteMaps it's possible to add domains on the fly without restarting or reloading services. It's a simple solution on a simple problem. I'm really happy about solving it with a simple and off the shelf solution with having room to grow with database backends.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Adventures with Puppet and Sensu</title>
   <link href="http://antonlindstrom.com/2013/03/17/adventures-with-puppet-and-sensu.html"/>
   <updated>2013-03-17T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2013/03/17/adventures-with-puppet-and-sensu</id>
   <content type="html">&lt;p&gt;I took some time to play around with the &lt;a href=&quot;https://github.com/sensu/sensu-puppet&quot;&gt;Sensu Puppet module&lt;/a&gt; this weekend. It's isn't the most mature module but it's working terrific. Once I did some diving into the module it was pretty easy to get around to using. This will be somewhat a description of what I did to get &lt;a href=&quot;http://sensuapp.org&quot;&gt;Sensu&lt;/a&gt; up and running in my own infrastructure.&lt;/p&gt;

&lt;p&gt;The readme will probably get you up and running, the thing I missed however was that the default handler isn't included (I really should make a pull request).&lt;/p&gt;

&lt;p&gt;Note that the module might change a lot so this will probably be some faults in this config in a few days/weeks/months.&lt;/p&gt;

&lt;p&gt;Current README example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;node 'sensu-server.foo.com' {
  class { 'sensu':
    rabbitmq_password =&amp;gt; 'secret',
    server            =&amp;gt; true,
    plugins           =&amp;gt; [
      'puppet:///data/sensu/plugins/ntp.rb',
      'puppet:///data/sensu/plugins/postfix.rb'
    ]
  }

  sensu::check { 'check_ntp':
    command     =&amp;gt; 'PATH=$PATH:/usr/lib/nagios/plugins check_ntp_time -H pool.ntp.org -w 30 -c 60',
    handlers    =&amp;gt; 'default',
    subscribers =&amp;gt; 'sensu-test'
  }

  sensu::check { '...':
    ...
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What we'll have to add is the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sensu::handler { 'default':
  type      =&amp;gt; 'set',
  command   =&amp;gt; 'true',
  handlers  =&amp;gt; [ 'mailer' ],
}

sensu::handler { 'mailer':
  type        =&amp;gt; 'pipe',
  source      =&amp;gt; 'puppet:///modules/data/sensu/handlers/notification/mailer.rb',
  config      =&amp;gt; {
    mail_from     =&amp;gt; 'sensu+alert@example.com',
    mail_to       =&amp;gt; 'ops+alerts@example.com',
    smtp_address  =&amp;gt; 'localhost',
    smtp_port     =&amp;gt; 25,
    smtp_domain   =&amp;gt; 'example.com',
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The example above will create a default handler that is a set, which means that it's passing information to other handlers, in this case mailer. I have a separate module called data where I put the handlers and plugins, so that's where &lt;code&gt;mailer.rb&lt;/code&gt; is. The &lt;code&gt;config&lt;/code&gt; is a hash which is generated into json as the config for the handler. It'll be called &lt;code&gt;mailer.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's add a new check to better explain how it works. You can either add it in the &lt;code&gt;class { 'sensu': }&lt;/code&gt; block or by defining it as a plugin.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sensu::plugin { 'puppet:///modules/data/sensu/plugins/http/check-http.rb': }

sensu::check { 'http_antonlindstrom_com':
  command     =&amp;gt; '/etc/sensu/plugins/check-http.rb -u &quot;http://antonlindstrom.com/&quot;',
  handlers    =&amp;gt; 'mailer',
  subscribers =&amp;gt; 'sensu-test',
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By using a little hiera magic we can make a pretty clean node definition and it's pretty awesome.&lt;/p&gt;

&lt;p&gt;I've been running sensu for a few hours now and can say that it's the easiest thing to get running when you have a dynamic and configuration management controlled environment. The adventure has been great as it alerts pretty smooth and works faster than Nagios. There aren't that much of reports and GUI fanciness but it does really what it should do. Sensu alerts when it should. The only problem I found was that it didn't alert that fast when nodes became unresponsive (for instance when shutting down a machine).&lt;/p&gt;

&lt;p&gt;The problem could be solved by running checks that alerts on the services on the node and do real service metrics instead of host metrics. By running checks on your service and checking load and metrics for how it is performing, a host should not really be important if the service still responds well.&lt;/p&gt;

&lt;p&gt;Conclusion: I really found Sensu great as it pinpointed the most troublesome parts of Nagios. Configuration. In Sensu it really works great with the supported configuration management modules.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Out of the Crisis</title>
   <link href="http://antonlindstrom.com/2012/11/21/out-of-the-crisis.html"/>
   <updated>2012-11-21T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2012/11/21/out-of-the-crisis</id>
   <content type="html">&lt;p&gt;Currently reading the book &lt;a href=&quot;http://www.amazon.com/Out-Crisis-W-Edwards-Deming/dp/0262541157&quot;&gt;Out of the Crisis&lt;/a&gt; by &lt;a href=&quot;http://en.wikipedia.org/wiki/W._Edwards_Deming&quot;&gt;W. Edwards Deming&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Deming's key principles&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create constancy of purpose toward improvement of product and service, with the aim to become competitive, stay in business and to provide jobs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adopt the new philosophy. We are in a new economic age. Western management must awaken to the challenge, must learn their responsibilities, and take on leadership for change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cease dependence on inspection to achieve quality. Eliminate the need for massive inspection by building quality into the product in the first place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;End the practice of awarding business on the basis of a price tag. Instead, minimize total cost. Move towards a single supplier for any one item, on a long-term relationship of loyalty and trust.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve constantly and forever the system of production and service, to improve quality and productivity, and thus constantly decrease costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Institute training on the job.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Institute leadership (see Point 12 and Ch. 8 of &quot;Out of the Crisis&quot;). The aim of supervision should be to help people and machines and gadgets do a better job. Supervision of management is in need of overhaul, as well as supervision of production workers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drive out fear, so that everyone may work effectively for the company. (See Ch. 3 of &quot;Out of the Crisis&quot;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Break down barriers between departments. People in research, design, sales, and production must work as a team, in order to foresee problems of production and usage that may be encountered with the product or service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eliminate slogans, exhortations, and targets for the work force asking for zero defects and new levels of productivity. Such exhortations only create adversarial relationships, as the bulk of the causes of low quality and low productivity belong to the system and thus lie beyond the power of the work force.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol type=&quot;a&quot;&gt;
&lt;li&gt;&lt;p&gt;Eliminate work standards (quotas) on the factory floor. Substitute with leadership.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eliminate management by objective. Eliminate management by numbers and numerical goals. Instead substitute with leadership.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;ol type=&quot;a&quot;&gt;
&lt;li&gt;&lt;p&gt;Remove barriers that rob the hourly worker of his right to pride of workmanship. The responsibility of supervisors must be changed from sheer numbers to quality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove barriers that rob people in management and in engineering of their right to pride of workmanship. This means, inter alia, abolishment of the annual or merit rating and of management by objectives (See Ch. 3 of &quot;Out of the Crisis&quot;).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Institute a vigorous program of education and self-improvement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Put everybody in the company to work to accomplish the transformation. The transformation is everybody's job.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;hr /&gt;

&lt;p&gt;The list is copied from &lt;a href=&quot;http://en.wikipedia.org/wiki/W._Edwards_Deming&quot;&gt;Wikipedia&lt;/a&gt;, 2012-11-21 and originates from the book Out of the Crisis.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Starting out with grok in Logstash</title>
   <link href="http://antonlindstrom.com/2012/09/24/starting-out-with-grok-in-logstash.html"/>
   <updated>2012-09-24T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2012/09/24/starting-out-with-grok-in-logstash</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://logstash.net/docs/1.1.1/filters/grok&quot;&gt;grok&lt;/a&gt; seems to be the default
way to filter events in &lt;a href=&quot;http://logstash.net&quot;&gt;Logstash&lt;/a&gt;. I got in contact
with it last week and found some great documentation that I thought I'd save for
a &lt;a href=&quot;http://i.imgur.com/gov6h.gif&quot;&gt;rainy day&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First thing to read is the excellent documentation about grok on the Logstash
&lt;a href=&quot;http://logstash.net/docs/1.1.1/filters/grok&quot;&gt;website&lt;/a&gt;. Then,
&lt;a href=&quot;http://jpmens.net/2012/08/06/my-logstash-and-graylog2-notes/&quot;&gt;jpmens&lt;/a&gt; has
written some awesome and very informative posts, especially this one about
&lt;a href=&quot;http://jpmens.net/2012/08/09/i-grok-how-to-mutate-a-file-with-logstash/&quot;&gt;grok&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In my example we're matching the following string:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1999-02-19 20:59:59 Hi, Peter. What's happening? We need to talk about your TPS reports.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A simple example of the grok filter can be seen below.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;filter {
  grok {
    type    =&amp;gt; 'innotech'
    pattern =&amp;gt; &quot;%{DATE} %{TIME} Hi, %{USERNAME:name}. What's happening\? We need to talk about your %{DATA:report_type} reports.&quot;
    add_tag =&amp;gt; &quot;to_%{name}&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This matches the our string and we can collect the name in the &lt;code&gt;%{name}&lt;/code&gt;
variable, and TPS will be in the variable &lt;code&gt;%{report_type}&lt;/code&gt;. The important thing
to notice here is that the filter will only act on the input with the type set
to &lt;code&gt;innotech&lt;/code&gt;. If the input is not set to &lt;code&gt;innotech&lt;/code&gt; it will be ignored by this
filter.&lt;/p&gt;

&lt;p&gt;Now, why do I use &lt;code&gt;%{USERNAME}&lt;/code&gt; and &lt;code&gt;%{DATA}&lt;/code&gt;? What do they match? In Logstash
there are predefined patterns which are defined
&lt;a href=&quot;https://github.com/logstash/logstash/blob/master/patterns/grok-patterns&quot;&gt;here&lt;/a&gt;.
The easiest way to test grok out is to use the excellent &lt;a href=&quot;http://grokdebug.herokuapp.com/&quot;&gt;grok
debugger&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That's the quick introduction of how to get started with grok filters in
Logstash. Below is a complete example of a shipper:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;input {
  file {
    type   =&amp;gt; 'innotech'
    path   =&amp;gt; [ '/home/pgibbons/memoirs' ]
    format =&amp;gt; 'plain'
  }
}

filter {
  grok {
    type    =&amp;gt; 'innotech'
    pattern =&amp;gt; &quot;%{DATE} %{TIME} Hi, %{USERNAME:name}. What's happening\? We need to talk about your %{DATA:report_type} reports.&quot;
    add_tag =&amp;gt; &quot;to_%{name}&quot;
  }
}

output {
  stdout { }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;http://logstash.net&quot;&gt;Log&lt;/a&gt; on &lt;code&gt;%{name}&lt;/code&gt;!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>hostedmunin.com and Puppet</title>
   <link href="http://antonlindstrom.com/2012/07/22/hostedmunin-com-and-puppet.html"/>
   <updated>2012-07-22T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2012/07/22/hostedmunin-com-and-puppet</id>
   <content type="html">&lt;p&gt;Found out about &lt;a href=&quot;http://hostedmunin.com&quot;&gt;hostedmunin.com&lt;/a&gt; a few days ago and decided
it would be nice to implement for my own few hosts. Earlier I have used Munin
with a MQ (RabbitMQ) to send metrics to Graphite. A few weeks ago I decided to
remove those extra servers to save me a few bucks.&lt;/p&gt;

&lt;p&gt;As I have all my hosts in Puppet it would be the easiest way to deploy munin
through it. I wrote a damn simple module for munin-node and added the IPs listed
on hostedmunin as pollers. All I did after that was to add the hosts in the web interface
of the service and the data started to show up.&lt;/p&gt;

&lt;p&gt;If you want to use the &lt;a href=&quot;https://github.com/antonlindstrom/puppet-munin&quot;&gt;munin puppet
module&lt;/a&gt;, all you have to do is
add these lines for your nodes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# hostedmunin.com
class { 'munin::config':
  pollers =&amp;gt; [
    '^2001:67c:27ec:249::.+$',
    '^2a02:20c8:1670:249::.+$',
    '^91\.227\.249\.12$',
    '^91\.227\.249\.13$',
    '^91\.227\.249\.20$',
  ],
}

include munin::package
include munin::service
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, the next step is to add support to the module to add your own plugins to munin.
So, check out the awesome &lt;a href=&quot;http://hostedmunin.com&quot;&gt;hostedmunin.com&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>SPDY on Nginx development release</title>
   <link href="http://antonlindstrom.com/2012/07/01/spdy-on-nginx-development-release.html"/>
   <updated>2012-07-01T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2012/07/01/spdy-on-nginx-development-release</id>
   <content type="html">&lt;p&gt;Just had to test &lt;a href=&quot;http://en.wikipedia.org/wiki/SPDY&quot;&gt;SPDY&lt;/a&gt; on the development version of Nginx as it is now supported by &lt;a href=&quot;http://barry.wordpress.com/2012/06/16/nginx-spdy-and-automattic/&quot;&gt;Automattic&lt;/a&gt;. This is how I did to get it running.&lt;/p&gt;

&lt;p&gt;Download the latest development version (currently &lt;a href=&quot;http://nginx.org/en/download.html&quot;&gt;1.3.2&lt;/a&gt;) and apply the patch from &lt;a href=&quot;http://nginx.org/patches/spdy/&quot;&gt;spdy patches page&lt;/a&gt; by using &lt;code&gt;patch -p1 &amp;lt; spdy.patch&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Install&lt;/h2&gt;

&lt;p&gt;Configure and compile as usual (with SSL support):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./configure --with-http_ssl_module
make &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Create a self signed (or a real) certificate and add in &lt;code&gt;/usr/local/conf&lt;/code&gt; and add the following settings to get it running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;listen 443 ssl spdy default;

ssl_certificate      /usr/local/nginx/conf/cert.pem;
ssl_certificate_key  /usr/local/nginx/conf/cert.key;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Run&lt;/h2&gt;

&lt;p&gt;Start it up (&lt;code&gt;sbin/nginx&lt;/code&gt;) and go to the site, everything should now work as expected.&lt;/p&gt;

&lt;p&gt;Sources for checking SPDY status in Chrome:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;chrome://net-internals/#spdy&quot;&gt;chrome://net-internals/#spdy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;chrome://net-internals/#events&amp;amp;q=type:SPDY_SESSION%20is:active&quot;&gt;chrome://net-internals/#events&amp;amp;q=type:SPDY_SESSION%20is:active&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>MongoDB Replica Sets</title>
   <link href="http://antonlindstrom.com/2012/05/25/mongodb-replica-sets.html"/>
   <updated>2012-05-25T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2012/05/25/mongodb-replica-sets</id>
   <content type="html">&lt;p&gt;This blog post demonstrates how to set up Replica Sets in MongoDB. Replica Sets
is a way to get High Availability (HA) in MongoDB without much hassle. To be
able to use a slave for reads, backups or as a standby master we use the MongoDB
Replica Sets.&lt;/p&gt;

&lt;p&gt;This post is mostly for my own future reference.&lt;/p&gt;

&lt;h2&gt;Upgrade to replica sets&lt;/h2&gt;

&lt;p&gt;First, we have to &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Upgrading+to+Replica+Sets&quot;&gt;upgrade to replica sets&lt;/a&gt;. This is done by doing the following on a single node configuration.&lt;/p&gt;

&lt;p&gt;On the MongoDB nodes, shut down the MongoDB service and start it with the following command (&lt;code&gt;fooReplicaSet&lt;/code&gt; is the replica set name):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mongod --replSet fooReplicaSet
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Config files&lt;/h4&gt;

&lt;p&gt;To add &lt;code&gt;replSet&lt;/code&gt; in configuration files, add &lt;code&gt;replSet = fooReplicaSet&lt;/code&gt; into configuration (such as &lt;code&gt;/etc/mongodb.conf&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;Check Status&lt;/h2&gt;

&lt;p&gt;Check replica set status by running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rs.status();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Information about states is located in the &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Replica+Set+Commands#ReplicaSetCommands-state&quot;&gt;MongoDB documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Adding members&lt;/h2&gt;

&lt;p&gt;To add members in the replica set we can do it by adding all the nodes via &lt;code&gt;rs.initiate()&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; c = {
... _id : &quot;setName&quot;,
... members : [
... { _id : 0, host : &quot;rs1.alley.se&quot; },
... { _id : 1, host : &quot;rs2.alley.se&quot; },
... { _id : 2, host : &quot;rs3.alley.se&quot; } ] }
&amp;gt; rs.initiate(c)
&amp;gt; rs.status()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will initiate and add the nodes rs1.alley.se, rs2.alley.se and rs3.alley.se.&lt;/p&gt;

&lt;h3&gt;Why can't I query the slave?&lt;/h3&gt;

&lt;p&gt;The error, &lt;code&gt;error: { &quot;$err&quot; : &quot;not master&quot;, &quot;code&quot; : 10107 }&lt;/code&gt; may occur when reading from a slave, in that case you have to enable &lt;a href=&quot;http://www.mongodb.org/display/DOCS/slaveOk&quot;&gt;slaveOk&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rs.slaveOk();
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;When using replica sets, we are able to do backups or store a database for DR.&lt;/p&gt;

&lt;p&gt;If the master gets unavailable a new master will be elected. This will be a way to support automated failover and HA.&lt;/p&gt;

&lt;p&gt;Not using Replica Sets is a dangerous business but is of course no silver bullet. As the &lt;a href=&quot;http://en.wikipedia.org/wiki/CAP_theorem&quot;&gt;CAP theorem&lt;/a&gt; states:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;According to the theorem, a distributed system can satisfy any two of these [Consistency, Availability, Partition Tolerance] guarantees at the same time, but not all three.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;The MongoDB replica sets will only satisfy Availability and Partition Tolerance (AP) but should be good enough for many systems.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Updating rack gems on Heroku</title>
   <link href="http://antonlindstrom.com/2012/04/13/updating-rack-gems-on-heroku.html"/>
   <updated>2012-04-13T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2012/04/13/updating-rack-gems-on-heroku</id>
   <content type="html">&lt;p&gt;Running my blog on Heroku is great. It's stable, it's cheap and it's powerful.
Recently I have been pretty bad at updating this blog. As a result I have not
updated the gems involved.&lt;/p&gt;

&lt;p&gt;Today I was about to update the blog and move from the old &lt;code&gt;.gems&lt;/code&gt; file to
Bundler. That made me update all the Rubygems involved and resulted in failure.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;`raise_if_conflicts': Unable to activate rack-jekyll-0.3.7, because
rack-1.4.1 conflicts with rack (~&amp;gt; 1.2.1) (Gem::LoadError)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Due to this problem I decided to search for alternative ways of deploying
&lt;a href=&quot;https://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; on Heroku. As I've been working a
lot with &lt;a href=&quot;http://www.sinatrarb.com/&quot;&gt;Sinatra&lt;/a&gt; lately the approach I decided to
use was the one described by &lt;a href=&quot;http://twitter.com/jstorimer&quot;&gt;@jstorimer&lt;/a&gt; in his
post &lt;a href=&quot;http://jstorimer.com/2009/12/29/jekyll-on-heroku.html&quot;&gt;Jekyll On Heroku&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To make it compatible with Ruby 1.9.2 you have to include the current directory
in &lt;code&gt;config.ru&lt;/code&gt;. So, in the top of the file, add &lt;code&gt;$: &amp;lt;&amp;lt; '.'&lt;/code&gt;. That will do it and
everything &lt;em&gt;should&lt;/em&gt; work as intended.&lt;/p&gt;

&lt;p&gt;So, I replaced rack-jekyll with sinatra and it works like a charm.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DNSSEC implementation in Sweden</title>
   <link href="http://antonlindstrom.com/2012/01/02/dnssec-implementation-in-sweden.html"/>
   <updated>2012-01-02T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2012/01/02/dnssec-implementation-in-sweden</id>
   <content type="html">&lt;p&gt;The single biggest web hosting company in Sweden, &lt;a href=&quot;http://binero.se&quot;&gt;Binero&lt;/a&gt; signed
all their domains and made a big impact on total signed domains. The signing frenzy
caused that about &lt;a href=&quot;http://www.sacbee.com/2012/01/02/4157474/dnssec-one-in-ten-swedish-domains.html&quot;&gt;1 in 10 domains in Sweden are now
secured&lt;/a&gt;
with DNSSEC.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://antonlindstrom.com/images/dnssec_stats.png&quot; title=&quot;.SE DNSSEC Stats&quot; alt=&quot;DNSSEC Statistics for .se&quot; /&gt;
Source: &lt;a href=&quot;https://www.iis.se/en/domaner/statistik/tillvaxt?chart=per-type&quot;&gt;.SE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I realized today that I was using Binero's nameservers for my domain
&lt;a href=&quot;http://antonlindstrom.com&quot;&gt;antonlindstrom.com&lt;/a&gt; which they also signed. So, the
domain was signed but there were no DS-records that would make the domain valid.
This also meant that while the RRSIG was there but not the DS-record it
caused the domain name to be invalid. I had the domain name at another registrar
and decided to change both name servers and registrar to
&lt;a href=&quot;http://dnsimple.com&quot;&gt;DNSimple&lt;/a&gt; which I have heard much good about. It is not
very advanced but for this domain it will suffice. For more advance usage and
labs I will use my &lt;a href=&quot;http://alley.se&quot;&gt;alley.se&lt;/a&gt; domain which I am using
with my own name servers.&lt;/p&gt;

&lt;p&gt;In the recent few weeks I have been signing over 10k domains for another
domain name host in Sweden, which I am very proud to say turned out very well.
There was a really smooth transition and I really felt like contributing to
something which was also really nice. As I had just a little knowledge of DNSSEC
at the start of the project I had to learn about it in just a few weeks and then
implementing it.&lt;/p&gt;

&lt;p&gt;The first problem was that some parts were not very good documented and it was a
lot to grasp in a short time. I needed to upgrade nameservers, research common
problems and how to implement in a way that would not interfere with the
original implementation. In the end it worked out very well without any major
problems. Some parts are still left to complete the project but over all I am
very pleased with how it turned out.&lt;/p&gt;

&lt;p&gt;From this project I learned that persistence is the key and I'm sure that some
weeks were more than mere 40 hours of work to get a grasp of everything. Legacy
implementations can sometimes bite you in the ass. Technical debt should be
prevented by having good documentation, commented code and what I would prefer,
configuration management. So, by documenting well and using configuration
management the implementation phase would have gone faster ans smoother. The
DNSSEC learning however were some well spent hours and in the end DNSSEC is very
similar to other techniques used for validating in a chain of trust.&lt;/p&gt;

&lt;p&gt;A great way to start 2012!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Varnish and JenkinsCI</title>
   <link href="http://antonlindstrom.com/2011/10/22/varnish-and-jenkinsci.html"/>
   <updated>2011-10-22T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/10/22/varnish-and-jenkinsci</id>
   <content type="html">&lt;p&gt;
  I have been playing around some with Continous Integration (CI) recently.
  The software I have tried is &lt;a href=&quot;http://jenkins-ci.org/&quot;&gt;Jenkins&lt;/a&gt;.
  Unfortunately, untuned on a 512MB RAM virtual server it has got some slow
  moments.
&lt;/p&gt;
&lt;p&gt;
  &lt;a href=&quot;http://antonlindstrom.com/images/jenkins-ci-request.png&quot;&gt;
    &lt;img width=&quot;80%&quot; src=&quot;http://antonlindstrom.com/images/jenkins-ci-request.png&quot; alt=&quot;Requests by Jenkins CI&quot;&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  I ran Jenkins with &lt;a href=&quot;http://nginx.org/&quot;&gt;nginx&lt;/a&gt; but decided to try
  &lt;a href=&quot;https://www.varnish-cache.org/&quot;&gt;Varnish&lt;/a&gt; instead to get some
  caching in place. I also decided to find out what the requests made by 
  Jenkins were. Turns out it does some requests to /static/, well that is
  good. Let us just cache /static/ and try to hit refresh.
&lt;/p&gt;
&lt;p&gt;
  Add the following to /etc/varnish/default.vcl, on top of your other tweaks:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sub vcl_recv {
    # Cache everything static
    if (req.url ~ &quot;^/static/&quot;) {
      remove req.http.cookie;
      return (lookup);
    }
}

sub vcl_fetch {
    if ( req.url ~ &quot;^/static/&quot; ) {
      remove beresp.http.Set-Cookie;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  The result is that most of the static files gets cached and the dynamic content
  gets collected from the CI. Hits are shown as &quot;|&quot; and misses as &quot;#&quot;.
&lt;/p&gt;
&lt;p&gt;
  &lt;a href=&quot;http://antonlindstrom.com/images/jenkins-ci-varnishhist.png&quot;&gt;
    &lt;img width=&quot;80%&quot; src=&quot;http://antonlindstrom.com/images/jenkins-ci-varnishhist.png&quot; alt=&quot;Hits versus misses in Varnish&quot;&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  This has unfortunately not been tested on a large environment with many users and
  better hardware but I assume it would be a great difference in speed on better
  hardware as well.  
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using the Glesys beta API with Fog</title>
   <link href="http://antonlindstrom.com/2011/09/18/using-the-glesys-beta-api-with-fog.html"/>
   <updated>2011-09-18T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/09/18/using-the-glesys-beta-api-with-fog</id>
   <content type="html">&lt;p&gt;
  Currently &lt;a href=&quot;http://glesys.com&quot;&gt;Glesys&lt;/a&gt; is developing an almost 
  finished &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; for 
  the Cloud-services. Currently only the compute interface is done and beta 
  access for it can be enabled by contacting Glesys support.
&lt;/p&gt;
&lt;p&gt;
  The Ruby cloud computing library, &lt;a href=&quot;http://github.com/geemus/fog&quot;&gt;Fog&lt;/a&gt; 
  now also supports Glesys and as this is being written the next release will include 
  the support into the Ruby gem. This post will show how to use the Glesys services with Fog.
&lt;/p&gt;
&lt;p&gt;
  As mentioned, the API is currently in beta and by contacting Glesys access can be enabled 
  for your account. When enabled, an API key must be created. That is done by going to the 
  API tab then &quot;API Keys&quot; and click, &quot;Create new key&quot;. The default access for the key is not 
  to allow anything, change this by clicking &quot;None&quot; under &quot;Allowed Hosts&quot; and under &quot;Permissions&quot;. 
  If you want to enable the key for all hosts and give them access to all parts, set 0.0.0.0/0 in 
  Allowed Hosts and Allow all in Permissions.
&lt;/p&gt;
&lt;p&gt;
  After creating an API key, if the version of Fog is over v0.11.0 then just install the Ruby gem, 
  otherwise pull Fog from Github. Edit the file ~/.fog and make it look like the file below with 
  your login and your API key you just created.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;default:
  :glesys_username: 'CLXXXXX'
  :glesys_api_key: 'secret2g3zX72kXq1w31MXRzkRfxLMjXJL9Q6X6X'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  To test Fog out, the interactive prompt is a great way to get started. Type &lt;code&gt;fog&lt;/code&gt; 
  or if you pulled the source code from git, use &lt;code&gt;./bin/fog&lt;/code&gt; to get a prompt running. 
  It is then possible to start interacting with Glesys. Below are a few examples on commands 
  and how to use them:
&lt;/p&gt;
&lt;p&gt;&lt;script src=&quot;https://gist.github.com/1225014.js&quot;&gt; &lt;/script&gt;&lt;/p&gt;
&lt;p&gt;
  As this is a beta, some of the functionality might change but over all this would 
  stay the same. &lt;code&gt;Fog::SSH&lt;/code&gt; will be changed as soon as I get the 
  opportunity to make use of &lt;code&gt;xm.ssh(commands)&lt;/code&gt;, currently the password 
  is not saved in the session and to access the IP we will have to go through the 
  &quot;iplist&quot;, this will probably be aliased to from :public_ip_address.
&lt;/p&gt;
&lt;p&gt;
  Now, go on and create some servers and provision them with Puppet or Chef to make the
  process repeatable and choose several compute providers to make your service solid in
  case of failures. It is not a question of if, it is a question of when a server will
  fail.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bridged IPv6 network on Hetzner box</title>
   <link href="http://antonlindstrom.com/2011/09/05/bridged-ipv6-network-on-hetzner-box.html"/>
   <updated>2011-09-05T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/09/05/bridged-ipv6-network-on-hetzner-box</id>
   <content type="html">&lt;p&gt;
  A while back I found out about cheap dedicated servers in Germany from 
  &lt;a href=&quot;http://hetzner.de&quot;&gt;Hetzner&lt;/a&gt;. I decided to give it a shot as 
  they had native IPv6 and customers are given /64 subnets. This was the 
  ideal testbed for me to try out IPv6 and Xen together. 
&lt;/p&gt;
&lt;p&gt;
  As I did not intended to use a public IPv4 subnet for my Xen domUs I was
  going to give them RFC1918 addresses and put them in another network.
  I concluded that my setup would use the topology described in the Xen
  wiki as &lt;a href=&quot;http://wiki.xensource.com/xenwiki/XenNetworking#head-1fc8531de90f02e42e6fdccc30232cf8f0254ad0&quot;
  &gt;Virtual Network&lt;/a&gt;. This will be the easiest way to combine both NAT for
  the IPv4 addresses and plain routing for the IPv6 addresses.
&lt;/p&gt;
&lt;p&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/lindztrom/6116296905/&quot; 
  title=&quot;Xen Topology by lindztrom, on Flickr&quot;&gt;
    &lt;img src=&quot;http://farm7.static.flickr.com/6191/6116296905_ff88b71313.jpg&quot; 
    width=&quot;500&quot; height=&quot;320&quot; alt=&quot;Xen Topology&quot;&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  Before you start any of the other steps, make sure you can reach your
  dom0 from IPv6 and install Xen and some domUs to test things out on.
&lt;/p&gt;
&lt;p&gt;
  First off, just include the dummy kernel module, either by modprobe dummy or
  editing /etc/modules. Then add the interface (if Debian) into /etc/network/interfaces
  just as a regular interface with the RFC1918 address (ex. 192.168.0.1). Then to
  enable it as a bridging interface in Xen, modify your /etc/xen/xend-config.sxp
  to enable the following network settings.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# -*- sh -*-

## Bridged
(network-script 'network-bridge netdev=dummy0')
(vif-script vif-bridge)

(dom0-min-mem 196)
(dom0-cpus 0)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
 Add the following into /etc/sysctl.conf:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp=1
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  After that just boot your Xen domU up and assign an IPv6 address to it.
  The IPv6 address could be any IP in your /64 subnet. I chose ::20. Check if
  you can ping6 the address assigned to the domU from within the dom0.
  After that it is just a matter of advertising the address to the Hetzner boxes,
  this is done by using:
&lt;/p&gt;  
&lt;pre&gt;&lt;code&gt;ip -6 neigh add proxy 2002:dead::beef::20 dev eth0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check your neighbors with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ip -6 neigh show&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Notes on Keepalived and DNS</title>
   <link href="http://antonlindstrom.com/2011/07/22/notes-on-keepalived-and-dns.html"/>
   <updated>2011-07-22T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/07/22/notes-on-keepalived-and-dns</id>
   <content type="html">&lt;p&gt;
  Following the &lt;abbr title=&quot;High Availability&quot;&gt;HA&lt;/abbr&gt; trend I created with
  the last post I though I would write down some notes on high availability
  DNS with &lt;a href=&quot;http://www.keepalived.org/&quot;&gt;Keepalived&lt;/a&gt;. When
  implementing this I found out that it was poorly documented when using
  both UDP and TCP traffic. It seems like some people refer to DNS as UDP
  only. This would disable features like zone transfers and queries over
  512 bytes.
&lt;/p&gt;

&lt;p&gt;
  Keepalived is a load balancer with HA features such as &lt;abbr 
  title=&quot;Virtual Router Redundancy Protocol&quot;&gt;VRRP&lt;/abbr&gt; (RFC 3768). 
  VRRP is a protocol that enables the two gateways (or in this case load 
  balancers) to share an IP. Keepalived has also got checks for service
  availability. What this means is that if a server, in this case a DNS
  server stops responding it will be removed from the load balancer and
  will not be sent any queries.
&lt;/p&gt;  

&lt;p&gt;
  The two load balancers are sharing the IP address of 10.0.2.16
  (VIP). The two DNS servers has the IP addresses 10.0.2.20 and 10.0.2.21. 
  These will be DNS servers responding on TCP and UDP and could be any DNS like
  Bind, PowerDNS or Unbound..
&lt;/p&gt;

&lt;p&gt;
  So, the /etc/keepalived/keepalived.conf is configured as follows:
&lt;/p&gt;

&lt;p&gt;
  &lt;script src=&quot;https://gist.github.com/1099202.js?file=keepalived.conf&quot;&gt;&lt;/script&gt;
&lt;/p&gt;

&lt;p&gt;
  As it seems like Keepalived does not officially support UDP there is no
  specified check like the TCP_CHECK I dug out a MISC_CHECK that 
  &lt;a href=&quot;http://code.google.com/u/huangmingyou/&quot;&gt;huangmingyou&lt;/a&gt; had
  created. The script does a lookup in the DNS for a specified serial number
  that is in a TXT record. If it is not found the server will be removed from
  the load balancer until the script returns OK.
&lt;/p&gt;

&lt;p&gt;
  &lt;script src=&quot;https://gist.github.com/1099202.js?file=dnscheck&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DRDB on VirtualBox</title>
   <link href="http://antonlindstrom.com/2011/07/10/drbd-on-virtualbox.html"/>
   <updated>2011-07-10T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/07/10/drbd-on-virtualbox</id>
   <content type="html">&lt;p&gt;
  When you use the cloud as hardware for your services it does not mean
  that the cloud should be any better at keeping your hardware working.
  The cloud can provide high availability measures as hot migration but
  that is not a guarantee that your systems will have 100% uptime.
&lt;/p&gt;
&lt;p&gt;
  I have heard many stories on companies losing a lot of money due to
  downtime because the server provider is experiencing hardware 
  problems. Some are yelling at the server provider for not keeping their
  hardware up at all times. Those are the ones that have not managed
  hardware and has to know that hardware does fail.
&lt;/p&gt;
&lt;p&gt;
  Issues needs to be solved by building your own uptime and building your 
  own redundancy. By using techniques such as load balancers and
  &lt;abbr title=&quot;High-Availability&quot;&gt;HA&lt;/abbr&gt; tools such as
  &lt;a href=&quot;http://haproxy.1wt.eu&quot;&gt;HAProxy&lt;/a&gt; you can keep your system up
  even though some systems fail. Use the
  &lt;a href=&quot;http://www.codinghorror.com/blog/2011/04/working-with-the-chaos-monkey.html&quot;&gt;Chaos Monkey&lt;/a&gt;
  to test it. I decided to implement my own redundancy using &lt;a href=&quot;http://www.drbd.org/&quot;&gt;DRBD&lt;/a&gt;
  on two MySQL servers in VirtualBox.
&lt;/p&gt;
&lt;h3&gt;DRBD&lt;/h3&gt;
&lt;p&gt;
  I found &lt;a href=&quot;http://www.de-maria.it/2011/01/10/playing-with-drbd-and-virtualbox/&quot;&gt;this guide&lt;/a&gt;
  on Virtualbox and DRBD but it did not work for me. I followed the first steps and created a loop 
  block device with dd.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dd if=/dev/zero of=/opt/drbd-test.loop bs=1M count=200
losetup /dev/loop1 /opt/drbd-test.loop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  The resource, is then configured with two clients, 192.168.1.10 and 192.168.1.11.
  These are configured to use the loop device we created with dd and losetup. The
  file /etc/drbd.conf is configured as follows.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;common { 
  protocol C; 
}
resource test {
  on drbd1 {
    device    /dev/drbd1;
    disk      /dev/loop1;
    address   192.168.1.10:7789;
    meta-disk internal;
  }
  on drbd2 {
    device    /dev/drbd1;
    disk      /dev/loop1;
    address   192.168.1.11:7789;
    meta-disk internal;
  }
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  Load the kernel module, drbd with &lt;code&gt;modprobe drbd&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
  I restarted the services and ended up with error code 10. That seemed to be
  issues with the syncing between the two clients and I had to
  reinitialize the metadata of the resource which caused me to do the commands
  below. The first one is initializing the metadata, the second is bringing the
  resource back up and the third is making the node primary. The last command
  should only be executed on the primary node (for example drbd1).
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;drbdadm create-md test
drbdadm up test
drbdsetup /dev/drbd1 primary -o
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  Then you can check the status of drbd by using &lt;code&gt;cat /proc/drbd&lt;/code&gt;.
  Hopefully it will say something like the following. If it looks like that,
  drbd is successfully running.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: 8.3.7 (api:88/proto:86-91)
GIT-hash: ea9e28dbff98e331a62bcbcc63a6135808fe2917 build by root@drbd1, 2011-07-10 02:26:35

 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
    ns:56267 nr:9 dw:6112 dr:51106 al:8 bm:8 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  Then, on the primary I ran the following to create an ext3 filesystem and mount it under
  /mnt/mysql.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkfs.ext3 /dev/drbd1
mkdir -p /mnt/mysql &amp;&amp; mount /dev/drbd1 /mnt/mysql
touch /mnt/mysql/syncing_drbd
umount /mnt/mysql &amp;&amp; drbdadm secondary all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  To see that it all works, run the following on the secondary and see the file
  syncing_drbd in the directory.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;drbdadm primary all
mkdir -p /mnt/mysql &amp;&amp; mount /dev/drbd1 /mnt/mysql 
ls -l /mnt/mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  And finally, add drbd to /etc/modules to get the module running at boot.
&lt;/p&gt;

&lt;h3&gt;Heartbeat&lt;/h3&gt;
&lt;p&gt;
  To be able to automatically make the secondary primary when the primary goes down
  we have to use something like &lt;a href=&quot;http://linux-ha.org/wiki/Heartbeat&quot;&gt;heartbeat&lt;/a&gt;.
  Heartbeat sends messages between two servers and if one of them stops responding the
  other one is taking over.
&lt;/p&gt;
&lt;p&gt;
  To configure heartbeat, specify, port and nodes in the file /etc/ha.d/ha.cf
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
initdead 120
bcast eth1
udpport 694
auto_failback on
node drbd1 drbd2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  To create a shared key between the two clients create a shell script with the 
  following content and copy the contents in /etc/ha.d/authkeys from the node 
  where the script was executed to the other. 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat &lt;&lt;-!AUTH &gt;/etc/ha.d/authkeys
    # Automatically generated authkeys file
    auth 1
    1 sha1 `dd if=/dev/urandom count=4 2&gt;/dev/null | md5sum | cut -c1-32`
!AUTH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  Heartbeat needs to be configured with the services that it should control when
  the primary or secondary server hits the floor. This is done in the 
  /etc/ha.d/haresources file. The contents of this file is described very well
  at the &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/ha-heartbeat-drbd.html
  &quot;&gt;MySQL documentation&lt;/a&gt;. The file will mount our drbd disk in /mnt/mysql and
  start mysql when the active node is lost.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;drbd1 drbddisk Filesystem::/dev/drbd1::/mnt/mysql::ext3 mysql&lt;/pre&gt;&lt;/code&gt;

&lt;h3&gt;MySQL&lt;/h3&gt;
&lt;p&gt;
  To make MySQL use the directory, the easiest way is just to link the configuration
  file from /mnt/mysql/my.cnf to /etc/mysql/my.cnf so that configurations are changed
  between all servers. Then in the configuration set the datadir to your drbd directory.
  This will cause all data to be synced. 
&lt;/p&gt;
&lt;p&gt;
  I got the error &quot;operation=&quot;mknod&quot; pid=12802 parent=3974 profile=&quot;/usr/sbin/mysqld&quot; 
  requested_mask=&quot;c::&quot; denied_mask=&quot;c::&quot; fsuid=106 ouid=106&quot;, just remove apparmor or
  check its configuration. I still got some errors because I moved the directory, then
  I used:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql_install_db --user=mysql --ldata=/mnt/mysql&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  This is one way to make your service a bit more resistant from failure and keep your
  uptime a bit higher.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Airport Express and FreeRadius</title>
   <link href="http://antonlindstrom.com/2011/06/05/airport-express-and-freeradius.html"/>
   <updated>2011-06-05T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/06/05/airport-express-and-freeradius</id>
   <content type="html">&lt;p&gt;
  I have been experimenting some with &lt;a href=&quot;http://freeradius.org/&quot;&gt;FreeRadius&lt;/a&gt; recently.
  &lt;a href=&quot;http://en.wikipedia.org/wiki/RADIUS&quot;&gt;RADIUS&lt;/a&gt; is a protocol for &lt;abbr 
  title=&quot;Authentication, Authorization and Accounting&quot;&gt;AAA&lt;/abbr&gt; and can be used for authentication
  in amongst other Cisco and HP network equipment.
&lt;/p&gt;
&lt;p&gt;
  We recently bought an Apple Airport Express to be able to bridge the Internet connection from one
  part of our apartment to another. As they are rather cheap and works very well with other Apple
  products it is a pretty good choice. To be strengthen the security I am using &lt;abbr 
  title=&quot;Media Access Control&quot;&gt;MAC&lt;/abbr&gt; filtering with WPA2.
&lt;/p&gt;
&lt;p&gt;
  While it is simple to add more MAC addresses in the Airport it is not as scalable and simple as
  using a script to update a row in a file, MySQL or LDAP. An issue related to the Airport is that 
  it has to restart each time the configuration is updated. With these things in mind I decided
  to implement RADIUS and use it with the Airport Express. The free implementation FreeRadius is
  a big, modular pretty recognizable RADIUS-server which I have been researching for a few weeks
  is the server I am going to use. 
&lt;/p&gt;
&lt;p&gt;
  When searching for the MAC address access control for the Airport it was not very easy to find
  good material, at last I found &lt;a href=&quot;http://lawrencechen.net/freeradius-aamp-dhcp-failover&quot;&gt;this&lt;/a&gt;
  which I am going to use. Using what the author did there worked well. I am pasting them in
  here as well. First, install FreeRadius:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install freeradius
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Add (or replace existing examples with) this in /etc/freeradius/clients.conf&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;client 10.10.10.1 {
    secret = yourShareds3cret
    shortname = airport
    nastype = other
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  After adding the client, client 10.10.10.1, is the IP of your access point next step is to
  add the MAC addresses in the users file. Add the following in /etc/freeradius/users and 
  use the same secret as you did in the clients.conf file. The first part is the MAC address
  of your clients (laptops etc.).
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;00FF00-FF00FF  Cleartext-Password := &quot;yourShareds3cret&quot;&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  In the Airport, choose &quot;Access Control&quot; and then under MAC Address Access Control, use RADIUS.
  Supply the IP address of your FreeRadius server and under &quot;Primary Shared Secret&quot; add the same
  secret you added in clients.conf and users, in this example it would be &quot;yourShareds3cret&quot;.
&lt;/p&gt;
&lt;p&gt;
  If you want to verify your configuration, use &quot;freeradius -X&quot; to go into debug mode. Then check
  for lines like: Calling-Station-Id = &quot;00-FF-00-FF-00-FF&quot;. That should be the MAC address of the
  client you want to authenticate.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>London</title>
   <link href="http://antonlindstrom.com/2011/05/07/london.html"/>
   <updated>2011-05-07T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/05/07/london</id>
   <content type="html">&lt;p&gt;
  Me and Sophia were in London for a few days this week. Just to get some
  time off, not thinking about work or anything. It was really, really fun
  and we had not planned to much to do. Much of the things we did were
  really spontaneous, we had a clue about some of the things we wanted to
  do but mostly decided in the last minute.
&lt;/p&gt;
&lt;p&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/lindztrom/5695741047/&quot; 
  title=&quot;Taxi by lindztrom, on Flickr&quot;&gt;&lt;img 
  src=&quot;http://farm6.static.flickr.com/5189/5695741047_f622780914.jpg&quot; 
  width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Taxi&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  We managed to take a few more photos, some are on my
  &lt;a href=&quot;http://www.flickr.com/photos/lindztrom/sets/72157626666683482/&quot;&gt;flickr&lt;/a&gt;.
  And maybe &lt;a href=&quot;http://omsocker.blogspot.com/&quot;&gt;Sophia&lt;/a&gt; will
  post some later as well.
&lt;/p&gt;
&lt;p&gt;
 &lt;a href=&quot;http://www.flickr.com/photos/lindztrom/5695740537/&quot; 
 title=&quot;Barrett Street by lindztrom, on Flickr&quot;&gt;&lt;img 
 src=&quot;http://farm6.static.flickr.com/5189/5695740537_13468e956d.jpg&quot; 
 width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Barrett Street&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  After the wedding in the UK there were a lot of flags in the city. It also
  seemed like they waited to clean up until the bank holiday was
  over.
&lt;/p&gt;
&lt;p&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/lindztrom/5696315342/&quot; 
  title=&quot;Shark gathering by lindztrom, on Flickr&quot;&gt;&lt;img 
  src=&quot;http://farm6.static.flickr.com/5308/5696315342_7b79e546a2.jpg&quot; 
  width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Shark gathering&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  We went to the &lt;a href=&quot;http://www.visitsealife.com/London/&quot;&gt;Aquarium&lt;/a&gt;
  to see some fish and sea life. We saw turtles, sharks, corals, crocodiles
  and many many more cool things living in the water.
&lt;/p&gt;
&lt;p&gt;
  I quite like London, it is a huge city with a lot of stuff to do and
  there are always things to look at.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Downtime in the Cloud</title>
   <link href="http://antonlindstrom.com/2011/04/22/downtime-in-the-cloud.html"/>
   <updated>2011-04-22T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/04/22/downtime-in-the-cloud</id>
   <content type="html">&lt;p&gt;
  Yesterday my website went down a few times. As it is hosted on &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt; it is
  always a possibility that it goes up and down without me being able to fix this. Heroku in turn is using 
  &lt;a href=&quot;http://aws.amazon.com/ec2/&quot;&gt;Amazon EC2&lt;/a&gt; and is therefor vulnerable to any problems occurring at 
  their datacenters.
&lt;/p&gt;
&lt;p&gt;
  Amazon apparently had some problems with their &lt;abbr title=&quot;Elastic Block Storage&quot;&gt;EBS&lt;/abbr&gt; service which caused
  Heroku to get some hiccups. There are several great posts that have discussed whether or not to trust 
  cloud services or to build own datacenters. To be secure in the cloud I think you should, as with everything,
  spread the services on different providers. Putting all your money in one stock is risky business, 
  spreading the money in several stocks will make you more resistant to failure if one of the stocks plummets.
&lt;/p&gt;
&lt;p&gt;
  Of course my website is not that critical and there is now way that I state that it should have 100% 
  uptime (or even five nines). 98-99% is good enough for me. 98% will be about a week of downtime, hopefully
  this would not occur at the same time. If I had a service that would lose money each time it went away 
  from the Internet it would be a completely different matter.
&lt;/p&gt;
&lt;p&gt;
  I would recommend these posts about the Amazon issues and availability:
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://agilesysadmin.net/ec2-outage-lessons&quot;&gt;Today’s EC2 / EBS Outage: Lessons learned&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://backdrift.org/coping-with-cloud-downtime&quot;&gt;Coping with Cloud Downtime&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://lusislog.blogspot.com/2011/04/who-owns-my-availability.html&quot;&gt;Who owns my availability?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://invalidlogic.com//2011/04/22/amazon-and-what-it-means-to-you/&quot;&gt;Amazon and what it means to you&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>CloudFoundry and PaaS</title>
   <link href="http://antonlindstrom.com/2011/04/18/cloudfoundry-and-paas.html"/>
   <updated>2011-04-18T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/04/18/cloudfoundry-and-paas</id>
   <content type="html">&lt;p&gt;
  Recently &lt;a href=&quot;http://www.vmware.com/company/news/releases/cloud-foundry-apr2011.html&quot;&gt;VMware&lt;/a&gt; 
  announced Cloud Foundry, an open &lt;abbr title=&quot;Plattform as a Service&quot;&gt;PaaS&lt;/abbr&gt;. 
  It works quite like &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt; but has the possibility to host other 
  frameworks than Rails, Sinatra and Logo. Frameworks like &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt;, 
  &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; are some that exists in Cloud Foundry currently.
  &lt;a href=&quot;http://www.vmware.com/company/news/releases/cloud-foundry-apr2011.html&quot;&gt;VMware News Release&lt;/a&gt; states:
&lt;/p&gt;
&lt;p&gt;&lt;blockquote&gt;
  &quot;VMware Delivers &lt;a href=&quot;http://cloudfoundry.org&quot;&gt;Cloud Foundry&lt;/a&gt;, The Industry’s First Open PaaS&quot; 
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;
  I think the best part is that the project is &lt;a href=&quot;http://cloudfoundry.org/&quot; 
  title=&quot;Cloud Foundry Project&quot;&gt;Open Source&lt;/a&gt;. It also means that developers can add their specific 
  plattform to the PaaS (like PHP), which will make it really useful. Another
  good thing is that hosting companies are able to install Cloud Foundry without paying a single dime.
  Modifications can also be made to build custom extensions to suite the company.
&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://cl.ly/64Xg/vmc_apps_stats.png&quot; alt=&quot;vmc CLI interface towards Cloud Foundry&quot; /&gt;&lt;/p&gt;
&lt;p&gt;
  There are also Services, which currently are databases (Redis, MongoDB and MySQL). These can be provisioned
  and used within the &lt;abbr title=&quot;Command Line Interface&quot;&gt;CLI&lt;/abbr&gt;. The idea of this is quite nice, when 
  the developer needs a service he just provisions it and it starts up with zero configuration. The simplist
  in me loves this kind of abstraction. There is one word for this, awesome.
&lt;/p&gt;
&lt;p&gt;
  I have not tried the PaaS to the fully, just checked it out. For now I think it is great. 
  &lt;a href=&quot;http://cloudfoundry.com&quot;&gt;Cloud Foundry&lt;/a&gt; uses a CLI which can be installed from a Ruby Gem. It
  does everything I want. I can change password, add services, add applications and more.
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem install vmc&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  What is my verdict? I think this is a quite nice idea and so far neat executed. The more organizations that
  adopt the Cloud Foundry plattform, the more it will grow. With some open source spirit it will grow even
  more. So far it is only in beta and there is a free signup at &lt;a href=&quot;http://cloudfoundry.com&quot;&gt;CloudFoundry.com&lt;/a&gt;.
  Are there any possible downsides? Sure, it could break. But as it is open source I think that it is highly
  unlikely.
&lt;/p&gt;
&lt;p&gt;
  PaaS in general are great for abstraction and software developers has the opportunity to just get things going.
  Although for more specific things and configuration options I think the use of a 
  &lt;abbr title=&quot;Virtual Private Server&quot;&gt;VPS&lt;/abbr&gt; is more useful. I think this mostly depends on the user and 
  the scale of the application. Is the application big, well then it would be better to use raw hardware. If
  it is small, the PaaS fits quite well if no customizations should be done.
&lt;/p&gt;
&lt;p&gt;
  I have accually used PaaS for a while with this site and &lt;a href=&quot;http://alley.se&quot;&gt;Alley.se&lt;/a&gt; and it works
  well. I do not program that much and the usage is quite low. Blog posts and a few small applications works fine.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Building for repeatability</title>
   <link href="http://antonlindstrom.com/2011/03/15/building-for-repeatability.html"/>
   <updated>2011-03-15T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/03/15/building-for-repeatability</id>
   <content type="html">&lt;p&gt;
  When building or configuring something I am always thinking about whether it is possible to 
  repeat the process of installing this in a large scale. Do I remember each step? Is it possible
  to do all the steps created in an easier way?
&lt;/p&gt;
&lt;p&gt;
  Configuration management like &lt;a href=&quot;http://puppetlabs.com&quot; title=&quot;Puppet Labs&quot;&gt;Puppet&lt;/a&gt; or 
  &lt;a href=&quot;http://www.opscode.com/chef/&quot; title=&quot;Opscode Chef&quot;&gt;Chef&lt;/a&gt; are ways to cope with this.
  But there are also ways to do this without having a fully automated environment. When I install and
  setup my main computer I use &lt;a href=&quot;http://git-scm.com/&quot; title=&quot;Git Source Control&quot;&gt;git&lt;/a&gt; to 
  get settings and dot files I have.
&lt;/p&gt;
&lt;p&gt;
  Another really smart thing to create an easy setup on &lt;a href=&quot;http://www.apple.com/mac/&quot; title=&quot;Apple Mac&quot;&gt;Mac&lt;/a&gt; 
  is the &lt;a href=&quot;http://www.apple.com/mac/app-store/&quot; title=&quot;Apple Mac App Store&quot;&gt;Mac App Store&lt;/a&gt;, this ensures that
  favorite applications are stored in one place and if moving to another computer this will make
  it easier to just fire the application up and download and install the software you bought and
  chosen.
&lt;/p&gt;
&lt;p&gt;
  If using repeatability it is also easy to get the state of a computer without any hassle when a crash should
  occur (provided that you have backup of those dot files in another location).
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Viewing binary files in hex</title>
   <link href="http://antonlindstrom.com/2011/02/25/viewing-binary-files-in-hex.html"/>
   <updated>2011-02-25T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/02/25/viewing-binary-files-in-hex</id>
   <content type="html">&lt;p&gt;
  When writing rules in &lt;a href=&quot;http://www.snort.org/&quot;&gt;Snort&lt;/a&gt; or otherwise get information about binary files 
  it can be helful to view them in hex format. Like capturing binary data from tcpdump. For a school 
  asignment in Intrusion detection we were asked to write rules in Snort to match defined binary files. To view 
  binary in hex or hex in binary we can use xxd:

&lt;/p&gt;
  &lt;pre&gt;&lt;code&gt;$ xxd binary.bin
0000000: 616e 746f 6ef2 2a7b 4180 a713 c9eb 1da2  anton.*{A.......
0000010: d236 19eb bd7a 80a7 13c9 fa07 dc80 1924  .6...z.........$
0000020: 29ba dc1f c0ea 886b 0462 56f1 7246 350a  )......k.bV.rF5.
0000030: 5980 a713 c905 d101 0a                   Y........
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  When editing in &lt;a href=&quot;http://www.vim.org/&quot;&gt;VIm&lt;/a&gt; it is possible to use the command
  &lt;code&gt;:%!xxd&lt;/code&gt; and reversing &lt;code&gt;:%!xxd -r&lt;/code&gt;.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pingdom and SSH</title>
   <link href="http://antonlindstrom.com/2011/01/28/pingdom-and-ssh.html"/>
   <updated>2011-01-28T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/01/28/pingdom-and-ssh</id>
   <content type="html">&lt;p&gt;
  Some days ago I noticed a huge amount of errors in &lt;a href=&quot;http://www.manpagez.com/man/5/syslog.conf/&quot;&gt;auth.log&lt;/a&gt; 
  with identification strings. The error often occurs when the packets received by sshd are malformed and does 
  not meet the usual format of the protocol. In my case this happened with a regular interval of about 5 minutes and
  was not spammed at the port. I decided to wait further and analyze the data.
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Jan 23 06:10:57 qward sshd[15399]: Did not receive identification string from 83.170.113.102
Jan 23 06:15:57 qward sshd[3722]: Did not receive identification string from 95.211.87.85
Jan 23 06:20:58 qward sshd[25690]: Did not receive identification string from 207.218.231.170
Jan 23 06:25:57 qward sshd[13899]: Did not receive identification string from 207.97.207.200
Jan 23 06:31:01 qward sshd[3523]: Did not receive identification string from 67.192.120.134
Jan 23 06:35:58 qward sshd[24067]: Did not receive identification string from 78.136.27.223
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
  I decided to block all the IP addresses that sent the data to the port. This became interesting,
  my phone began to buzz and I heard emails drop to my inbox. &lt;a href=&quot;http://pingdom.com&quot;&gt;Pingdom&lt;/a&gt;
  sent me a notice that my SSH service was down on my server, at that point I got it. Pingdom
  sends pings to my port but of course it does not send SSH packets and that will result in an
  error in auth.log. The strange part was that it was not just one IP that sent this, it was about 15-20
  addresses which made it seem like there were several servers sending attacks on the port.
&lt;/p&gt;

&lt;p&gt;
  If you find these errors and is using &lt;a href=&quot;http://pingdom.com&quot;&gt;Pingdom&lt;/a&gt; to monitor the status
  of the SSH port, bare in mind that it might cause these errors in auth.log.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>wroopia DNS API</title>
   <link href="http://antonlindstrom.com/2011/01/24/wroopia-dns-api.html"/>
   <updated>2011-01-24T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/01/24/wroopia-dns-api</id>
   <content type="html">&lt;p&gt;
  I have been searching with lights and compass to find a &lt;abbr title=&quot;Domain Name System&quot;
  &gt;DNS&lt;/abbr&gt; provider that has an &lt;abbr title=&quot;Application Programmable Interface&quot;&gt;API&lt;/abbr&gt;
  to be able to update the records.
&lt;/p&gt;

&lt;p&gt;
  When having an API to update the domain records it is then possible to use custom interfaces
  such as command line or a desktop application. Every provider I have tested before this has
  an awful AJAX interface which is both slow and does not support batch updating. With the API
  I can do batch or even dynamic updates. This makes everything a bit easier and more smooth.
&lt;/p&gt;

&lt;p&gt;
  Recently I have been working in &lt;a href=&quot;http://www.ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt; and decided to
  write a wrapper for the &lt;a href=&quot;https://www.loopia.se/api/&quot;&gt;Loopia API&lt;/a&gt; to make it easier
  to write applications and command line tools against the API. It is called
  &lt;a href=&quot;https://github.com/antonlindstrom/wroopia&quot;&gt;wroopia&lt;/a&gt; (wrapper, ruby, loopia) and
  is available at Github. It is not fully tested and just quickly hacked together.
  Improvements are welcome!
&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/793074.js&quot;&gt; &lt;/script&gt;&lt;/p&gt;

&lt;p&gt;
  More examples will be added later on as I will test it more. Currently it is not even in alpha version.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Practice of System and Network Admin</title>
   <link href="http://antonlindstrom.com/2011/01/16/the-practice-of-system-and-network-administration.html"/>
   <updated>2011-01-16T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/01/16/the-practice-of-system-and-network-administration</id>
   <content type="html">&lt;p&gt;
  A while back I decided to buy &lt;a href=&quot;http://www.amazon.com/Practice-System-Network-Administration-Second/dp/0321492668&quot;
  &gt;The Practice of System and Network Administration&lt;/a&gt; and had some time off today and decided to read a few chapters.
&lt;/p&gt;

&lt;p&gt;
  The book is good, having relevant points and explains things that are not that much technical but instead using
  an approach mindset which is easing the &lt;abbr title=&quot;System Administrator&quot;&gt;SA&lt;/abbr&gt;s all tasks. As it is a job
  that requires time management to solve issues with customers waiting there are several points on saving valuable
  time and trying to avoid outtakes in the infrastructure. Configuration details and technical issues are not covered
  and this is not that kind of book. The book is about management and how to avoid troubles in configuration.
&lt;/p&gt;

&lt;p&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/lindztrom/5326091431/&quot; 
  title=&quot;Practice of SA by lindztrom, on Flickr&quot;&gt;&lt;img 
  src=&quot;http://farm6.static.flickr.com/5244/5326091431_6568324e61.jpg&quot; 
  width=&quot;384&quot; height=&quot;500&quot; alt=&quot;Practice of SA&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  As I have not read the entire book I can not say how good the entire book is. The first chapters are very good
  and inspired me to read more in it. As I find more time off I will indeed read the entire book.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Skype</title>
   <link href="http://antonlindstrom.com/2011/01/07/skype.html"/>
   <updated>2011-01-07T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2011/01/07/skype</id>
   <content type="html">&lt;p&gt;
  When using international (or national) calls, Skype is the way to go. I have been using it to talk
  to my parents for a while (on and off) but it is a major player. It is very cheap, costs nothing
  more than the Internet connection if you use it computer-computer or computer-iphone app.
&lt;/p&gt;
&lt;p&gt;
  I have been talking to a hotel room in Thailand from my home here in Sweden and the voice quality
  was exceptional and even the video quality was pretty decent. Skype is also 
  &lt;a href=&quot;http://blogs.skype.com/en/2011/01/qik.html&quot;&gt;aquiring Qik&lt;/a&gt; which is a video company and
  might make the video calls even better.
&lt;/p&gt;
&lt;p&gt;&lt;blockquote&gt;
  &quot;Skype and Qik share a common purpose of enriching communications with video, and the acquisition of 
  Qik will help to accelerate our leadership in video by adding recording, sharing and storing 
  capabilities to our product portfolio.&quot; - &lt;a href=&quot;http://blogs.skype.com/en/2011/01/qik.html&quot;&gt;Skype blog&lt;/a&gt;
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;
  It also seems that Skype is able to &lt;a href=&quot;http://www.skype.com/intl/en-us/business/sip/overview/&quot;&gt;connect&lt;/a&gt; 
  to &lt;a href=&quot;http://en.wikipedia.org/wiki/Session_Initiation_Protocol&quot;&gt;SIP&lt;/a&gt; 
  &lt;abbr title=&quot;Private Branch Exchange&quot;&gt;PBX&lt;/abbr&gt;es. This will give the opportunity to connect Skype to both
  soft- and hardphones in a company.
&lt;/p&gt;
&lt;p&gt;
  While having some trouble with a &quot;&lt;a href=&quot;http://www.bbc.co.uk/news/technology-12064394&quot;&gt;global blackout&lt;/a&gt;&quot;
  a while ago it is still a very good product and is based on a 
  &lt;a href=&quot;http://en.wikipedia.org/wiki/Peer-to-peer&quot;&gt;peer-to-peer&lt;/a&gt; technology which means that there are
  no centralized servers that the system depends on. Skype uses supernodes that basically are clients with more
  &quot;power&quot;. Skype is also good in 
  &lt;a href=&quot;http://www.theregister.co.uk/2003/10/08/how_does_skype_get_through/&quot;&gt;couping with NAT and firewalls&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
  I am going to start using Skype a bit more now and will be trying to integrate Skype with an
  &lt;a href=&quot;http://www.asterisk.org/&quot;&gt;Asterisk&lt;/a&gt; PBX to be able to use the extensions for 
  it and build a VoIP infrastructure with both Skype and SIP. Then also use existing hardware 
  and software for both protocols.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Virtualization</title>
   <link href="http://antonlindstrom.com/2010/11/25/virtualization.html"/>
   <updated>2010-11-25T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/11/25/virtualization</id>
   <content type="html">&lt;p&gt;
  I have tested out a few different &lt;a href=&quot;http://en.wikipedia.org/wiki/Virtualization&quot;&gt;virtualization techniques&lt;/a&gt; 
  in the latest year. I have since this summer used &lt;a href=&quot;http://www.vmware.com/products/vsphere-hypervisor/index.html&quot;&gt;VMware ESXi&lt;/a&gt;
  to virtualize my lab environment and a server for my own webserver. Unfortunately I would like to try out some of the more advanced
  features and those are not included in the free version of ESXi. I am a fan of Open Source and want to support it as much as possible
  and I have chosen to change plattform from ESXi to &lt;a href=&quot;http://xen.org&quot;&gt;Xen&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
  Xen does, in &lt;a href=&quot;http://en.wikipedia.org/wiki/Xen#Paravirtualization.2C_requiring_porting_of_guest_systems&quot;&gt;paravirtualization&lt;/a&gt;,
  not support virtualization of systems like Windows or BSD if you are using a Linux host as a 
  &lt;a href=&quot;http://wiki.xensource.com/xenwiki/Dom0&quot;&gt;Dom0&lt;/a&gt;. That means that my Windows server either has to be migrated to a separate 
  host or it is possible to use 
  &lt;a href=&quot;http://en.wikipedia.org/wiki/Xen#Hardware-assisted_virtualization.2C_allowing_for_unmodified_guests&quot;&gt;Hardware-assisted&lt;/a&gt;
  virtualization.
&lt;/p&gt;
&lt;p&gt;
  When using Xen I am able to do easy backups and do live migration of virtual guests. It does require some extra time in building the
  Xen templates but after that it is as fast as copying and booting up a new, freshly installed server. I have used 
  &lt;a href=&quot;http://www.dsj.za.net/create-an-ubuntu-10-04-xen-guest-image-via-debootstrap/&quot;&gt;debootstrap&lt;/a&gt; to install an Ubuntu server
  on a CentOS one. It works as a charm and is quite fast. Next step is to use an iSCSI target and a secondary fail-over Dom0.
  The definition of a VM looks like the following:
&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;name = &quot;ubuntu&quot;
uuid = &quot;053b0ed9-e985-82b7-0659-fc9f4c8b3aef&quot;
maxmem = 512
memory = 512
vcpus = 1
on_poweroff = &quot;destroy&quot;
on_reboot = &quot;restart&quot;
on_crash = &quot;destroy&quot;
disk = [ &quot;tap:aio:/srv/xen/ubuntu.img,xvda1,w&quot; ]
vif = [ &quot;mac=00:16:36:ff:ff:ff,bridge=xenbr0,script=vif-bridge&quot; ]
bootloader = &quot;/usr/bin/pygrub&quot;&lt;/code&gt;
&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>mc-auth Auth.log Scanner for MCollective</title>
   <link href="http://antonlindstrom.com/2010/11/21/mc-auth-auth-log-scanner-for-mcollective.html"/>
   <updated>2010-11-21T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/11/21/mc-auth-auth-log-scanner-for-mcollective</id>
   <content type="html">&lt;p&gt;
  I have tried to make my own MCollective plugin and decided to make a plugin that checks all the nodes
  auth.log for authentication failures. Instead of using 
  &lt;a href=&quot;http://en.wikipedia.org/wiki/Fail2ban&quot;&gt;Fail2ban&lt;/a&gt;, I wanted to have more control and see
  which IPs that are brute forcing my servers and to see how many attempts they are trying against them.
&lt;/p&gt;
&lt;p&gt;
  The writing of an agent was fairly easy but there were some bumps. I do not really know how to send
  multiple values as a hash in MCollective. I instead used a join method and then in the client a 
  split method. It works but I do not know if that is the best method.
&lt;/p&gt;
&lt;p&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/lindztrom/5194118659/&quot; 
  title=&quot;mc-auth sample output by lindztrom, on Flickr&quot;&gt;&lt;img 
  src=&quot;http://farm5.static.flickr.com/4144/5194118659_e2ac5294d0.jpg&quot; 
  width=&quot;300&quot; height=&quot;156&quot; alt=&quot;mc-auth sample output&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  The later plan is to integrate my 
  &lt;a href=&quot;https://github.com/antonlindstrom/mcollective-plugins/tree/master/agent/auth/&quot;&gt;mc-auth&lt;/a&gt;
  plugin with the
  &lt;a href=&quot;https://github.com/antonlindstrom/mcollective-plugins/tree/master/agent/iptables-junkfilter/&quot;&gt;mc-iptables&lt;/a&gt;
  plugin to block the failed authentications over some sort of threshold value to be able to keep it
  even better. Some sort of YAML export function in mc-auth would be nice as well.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jekyll on Heroku</title>
   <link href="http://antonlindstrom.com/2010/11/20/jekyll-on-heroku.html"/>
   <updated>2010-11-20T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/11/20/jekyll-on-heroku</id>
   <content type="html">&lt;p&gt;
  I have been writing about the move of my blog and several other components of my 
  domain to the cloud. I moved the website to &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt;
  and is now using &lt;a href=&quot;https://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; as a
  blog plattform which caused some new issues.
&lt;/p&gt;
&lt;p&gt;
  The problem was that I used other name conventions for files, as: 
  &lt;a href=&quot;http://antonlindstrom.com/journal&quot;&gt;/journal&lt;/a&gt;. Now the pages are named as
  &lt;a href=&quot;http://antonlindstrom.com/journal.html&quot;&gt;/journal.html&lt;/a&gt; and the rewrites
  are using 302 HTTP responses (permanently moved) to support the old links.
  This is used with the help of a plugin called 
  &lt;a href=&quot;https://github.com/jtrupiano/rack-rewrite&quot;&gt;rack-rewrite&lt;/a&gt;
  and imported into &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt; with a &lt;a
  href=&quot;http://docs.heroku.com/gemmanifest&quot;&gt;gem manifest&lt;/a&gt;. Then in the config.ru
  file just type the following:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;require &quot;rack/jekyll&quot;
require &quot;rack/rewrite&quot;

use Rack::Rewrite do
  r302 '/journal', '/journal.html'
  r302 '/moved_from', '/moved_to'
end

run Rack::Jekyll.new
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  Then it is just a push away from rewriting paths in Jekyll on Heroku. The readme
  on the &lt;a href=&quot;https://github.com/jtrupiano/rack-rewrite&quot;&gt;rack-rewrite&lt;/a&gt; page
  is very useful for writing rewrites like in the Apache mod_rewrite way.
&lt;/p&gt; 
&lt;p&gt;
  For more information about the 
  &lt;a href=&quot;https://github.com/bry4n/rack-jekyll#readme&quot;&gt;rack/jekyll&lt;/a&gt; 
  gem check out the readme on
  &lt;a href=&quot;https://github.com/bry4n/rack-jekyll&quot;&gt;Github&lt;/a&gt;. 
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Puppet Problem</title>
   <link href="http://antonlindstrom.com/2010/11/18/puppet-problem.html"/>
   <updated>2010-11-18T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/11/18/puppet-problem</id>
   <content type="html">&lt;p&gt;
  I have been working on a minor problem with one of my &lt;a href=&quot;http://www.puppetlabs.com/&quot;&gt;Puppet&lt;/a&gt; 
  clients. The problem occured after the domain switching and I was wondering why because I removed 
  all of the certificates several times and purged the package several times. One thing I did not 
  do though; remove the &lt;abbr title=&quot;Certificate Authority&quot;&gt;CA&lt;/abbr&gt;. After doing that it worked 
  like a charm. 
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;info: Retrieving plugin
err: /File[/var/lib/puppet/lib]: Failed to generate additional resources using 
  'eval_generate': undefined method `closed?' for nil:NilClass
err: /File[/var/lib/puppet/lib]: Failed to retrieve current state of resource: 
  undefined method `closed?' for nil:NilClass Could not retrieve file metadata for 
  puppet://puppet/plugins: undefined method `closed?' for nil:NilClass
err: Could not retrieve catalog from remote server: undefined method `closed?' for nil:NilClass
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  Puppet is working very well in my environment and it does actually ease the work very much.
  Together with the &lt;a href=&quot;https://github.com/ripienaar/mcollective-plugins/tree/master/agent/puppetd/&quot;&gt;
  puppetd mcollective plugin&lt;/a&gt; it provides even more control over the environment.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>When API does not help</title>
   <link href="http://antonlindstrom.com/2010/11/17/when-api-does-not-help.html"/>
   <updated>2010-11-17T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/11/17/when-api-does-not-help</id>
   <content type="html">&lt;p&gt;
  &lt;abbr title=&quot;Application Programmable Interface&quot;&gt;API&lt;/abbr&gt;s are built to help programmers build their applications around data
  provided by another part. Our school assignment is to build JavaScript webapplications and to write functions around data from
  an API build by our teacher. Problem is that the API is undocumented (apart from some examples that mostly complicates things)
  and the interface is quite weird. I have been stuck all day (or at least half a day, my phone died and refused to wake us up)
  trying to solve a problem I am having. It would be easier to use a cleaner API with some more documentation but I guess this
  is the way we are going to do it.
&lt;/p&gt;
&lt;p&gt;
  Other things I have done today includes updating my (now three) &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; servers and 
  rearranging my domains and servers. I have also moved my 
  &lt;a href=&quot;http://en.wikipedia.org/wiki/Streaming_Text_Oriented_Messaging_Protocol&quot;&gt;STOMP&lt;/a&gt; server to ensure faster 
  lookups with &lt;a href=&quot;http://marionette-collective.org/&quot;&gt;Marionette Collective&lt;/a&gt;. I have also studied &lt;abbr 
  title=&quot;Wireless Local Area Network&quot;&gt;WLAN&lt;/abbr&gt; technologies and read a few pages in new book I have picked up. It is
  nice to feel that there is time to study in the class instead of just doing things as fast as possible.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Breaking a leg</title>
   <link href="http://antonlindstrom.com/2010/11/15/breaking-a-leg.html"/>
   <updated>2010-11-15T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/11/15/breaking-a-leg</id>
   <content type="html">&lt;p&gt;
  Yesterday when climbing &lt;a href=&quot;http://omsocker.blogspot.com&quot;&gt;Sophia&lt;/a&gt; broke her foot. It happened when she jumped down and unfortunately missed the mattress and hit
  the cement floor. After about 3 hours at the emergency we could go home with just a bandage. Wait 3 hours for about 5 people to say just about the same thing. I had no
  idea that the medical care were so slow, I know that we were the most prioritized case but they could just have sent us to the x-ray immediately and then just tell us
  to go home and rest.
&lt;/p&gt;
&lt;p&gt;
  Now I am waiting to leave for school, listening to &lt;a href=&quot;http://www.youtube.com/watch?v=68ugkg9RePc&quot; title=&quot;Blue on Youtube&quot;&gt;Blue&lt;/a&gt; on MTV. It is not that great,
  not at all actually. I have also been writing a &lt;abbr title=&quot;Command Line Interface&quot;&gt;CLI&lt;/abbr&gt; for &lt;a href=&quot;http://www.posten.se/c/godsok_xmlresponse&quot;&gt;Posten's Package search&lt;/a&gt;.
  That is mostly because I am waiting for a delivery again.
&lt;/p&gt;
&lt;p&gt;
  Soon time for school but I rather want to spend the day working at home, I have been working pretty much to get as much as possible done to concentrate on more SysAdmin
  centric tasks. Experiments with &lt;a href=&quot;http://marionette-collective.org/&quot;&gt;mcollective&lt;/a&gt; and &lt;a href=&quot;http://www.puppetlabs.com/&quot;&gt;Puppet&lt;/a&gt; is on the run. I have realized
  that my STOMP-server is a bit slow which results in slow queries and answers from the mcollective servers. Also, I have been outsourcing my DNS-server and will soon make the
  move from my own PHP-webserver to a &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt; &lt;a href=&quot;http://rubyonrails.org&quot;&gt;rails&lt;/a&gt; server.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Sinestro, EC2 and Xen</title>
   <link href="http://antonlindstrom.com/2010/11/12/sinestro-ec2-and-xen.html"/>
   <updated>2010-11-12T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/11/12/sinestro-ec2-and-xen</id>
   <content type="html">&lt;p&gt;
  I decided to connect my old server today while showering. It is just an EEE Box but I think it will work OK just to try out Xen
  and to check it out. I thought I would edit the domain from &lt;a href=&quot;http://antonlindstrom.com&quot;&gt;antonlindstrom.com&lt;/a&gt; to a 
  more suitable laboration domain name. But I do not really know if it would cause any disruptions in the current services
  running.
&lt;/p&gt;
&lt;p&gt;
  I am currently (and has been all night) compiling Xen with kernel on an Ubuntu 10.10 server. If I had more time with the
  physical hardware I would have installed Debian as a &lt;a href=&quot;http://wiki.xensource.com/xenwiki/Dom0&quot;&gt;Dom0&lt;/a&gt;. Hopefully
  it will work quite well and I am able to use it more extensive. I would also like to get rid of VMware ESXi and use Xen
  instead, that would make it a lot easier to script and backup.
&lt;/p&gt;
&lt;p&gt;
  Yeah, I have been testing out a few things on EC2 and I am thinking of getting a permanent EC2 instance for offloading and
  mostly testing.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A test of Jekyll</title>
   <link href="http://antonlindstrom.com/2010/11/11/test-of-jekyll.html"/>
   <updated>2010-11-11T00:00:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/11/11/test-of-jekyll</id>
   <content type="html">&lt;p&gt;I am testing Jekyll as new blog and website plattform. Am a bit tired of using my own servers as I cannot guarantee a 100% (or at least 5 9s)  uptime when I am laborating with virtualization plattforms and such.&lt;/p&gt;

&lt;p&gt;Usally I write my posts at Tumblr in plain HTML, that is how I like it. Now I am using &lt;a href=&quot;http://en.wikipedia.org/wiki/Textile_%28markup_language%29&quot; title=&quot;Textile Markup Language at Wikipedia&quot;&gt;Textile&lt;/a&gt; and I am not satisfied. Mostly because I am not that familiar with Textile but also that I feel that I write plain HTML faster (mainly due to the first thing, lack of knowledge in Textile). I have also noticed that &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt; is a bit slower than my own server but it costs less and is hopefully more stable than my own.&lt;/p&gt;

&lt;p&gt;The decision of moving to another host came mainly from the fact that my &lt;a href=&quot;http://en.wikipedia.org/wiki/Internet_service_provider&quot; title=&quot;ISP at Wikipedia&quot;&gt;ISP&lt;/a&gt; decides to shut down all of the subscribers connections because they want us to go to their meeting. Well, that is not going to happen. That also causes trouble for people that are unable to attend the meeting and in some way rely on their Internet connection (&lt;abbr title=&quot;Virtual Private Network&quot;&gt;VPN&lt;/abbr&gt; &lt;abbr title=&quot;et cetera&quot;&gt;etc&lt;/abbr&gt;). I have complained about this ISP before. They are cheap and provide a fast connection but are not at all stable and I feel that they could improve in many ways if they just put their mind to it. It seems as they use the network as their own lab. network.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Best thing setup</title>
   <link href="http://antonlindstrom.com/2010/11/09/Best-thing-setup.html"/>
   <updated>2010-11-09T12:22:08+00:00</updated>
   <id>http://antonlindstrom.com/2010/11/09/Best-thing-setup</id>
   <content type="html">&lt;p&gt;I just realized, after a lot of tests and different servers in my virtualized setup that the best thing I have setup is my Git-server. Building the server on &lt;a href=&quot;https://github.com/res0nat0r/gitosis#readme&quot;&gt;Gitosis&lt;/a&gt;, all the repositories are working great and my code is gaining much more structure and it is easier to see changes and to rollback or test new functions.&lt;/p&gt;

&lt;p&gt;The server is in use so much that I consider moving it from the virtual server to a real hardware server to get rid of any overhead and to get it a bit faster. If I had a faster infrastructure I would consider having it in the &lt;a href=&quot;http://www.vmware.com/products/vsphere/esxi-and-esx/index.html&quot;&gt;VMware ESX&lt;/a&gt;-server but as I know it is a bit too pricey to upgrade my &lt;abbr title=&quot;Storage Area Network&quot;&gt;SAN&lt;/abbr&gt; to become faster, more scalable, flexible and redundant. The alternative is to use either a &lt;abbr title=&quot;Serial attached SCSI&quot;&gt;SAS&lt;/abbr&gt; or &lt;abbr title=&quot;Direct-attached storage&quot;&gt;DAS&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Currently the infrastructure is sometimes dragging with high latency due to slow storage connections. While having a 1Gb/s connection to the SAN it is using a backup 100Mb/s connection because it was more stable at implementation. Now the &lt;abbr title=&quot;Virtual Machines&quot;&gt;VMs&lt;/abbr&gt; have become so many and disk intensive that it requires upgrades. If I had several 1Gb/s &lt;abbr title=&quot;Network Interface Cards&quot;&gt;NICs&lt;/abbr&gt; I would use &lt;a href=&quot;http://www.cyberciti.biz/faq/freebsd-network-link-aggregation-trunking/&quot; title=&quot;FreeBSD: NIC Bonding / Link Aggregation / Trunking / Link Failover Tutorial&quot;&gt;NIC bonding&lt;/a&gt; to provide a more fail-safe solution. With the use of &lt;a href=&quot;http://www.puppetlabs.com/&quot;&gt;Puppet&lt;/a&gt;, the disk writes has become more frequent and also the syslog messages sent over the network are increasing.&lt;/p&gt;

&lt;p&gt;As I tested out &lt;a href=&quot;http://aws.amazon.com/ec2/&quot;&gt;Amazon EC2&lt;/a&gt; last week I saw that they seem to use &lt;a href=&quot;http://en.wikipedia.org/wiki/Xen&quot;&gt;Xen&lt;/a&gt; as virtualization technology I thought it would be cool to test that out. As it feels that on ESX, it is hard to script and program against while Xen on the other hand is more open and after seeing &lt;a href=&quot;http://www.rottenbytes.info/?p=291&quot;&gt;this&lt;/a&gt; it feels even more usable. The function of being able to transfer live &lt;abbr title=&quot;Virtual Machines&quot;&gt;VMs&lt;/abbr&gt; is a license feature of ESX and is a bit pricey for my private budget. By using open software it is also possible to transfer the data as I want.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Movements</title>
   <link href="http://antonlindstrom.com/2010/10/29/Movements.html"/>
   <updated>2010-10-29T18:37:07+00:00</updated>
   <id>http://antonlindstrom.com/2010/10/29/Movements</id>
   <content type="html">&lt;p&gt;Complaining about the classes at the University will not get me far even though the classes are mostly about legacy stuff. Not enough about new and exciting protocols (read &lt;a href=&quot;http://en.wikipedia.org/wiki/IPv6&quot;&gt;IPv6&lt;/a&gt;) and ways to solve things and most of all, not enough relevant stuff. Those things you have to learn on your spare time. Well some of the things learned are just great and I am happy to have gotten the knowledge but some things have just been a waste of time.&lt;/p&gt;

&lt;p&gt;Well, I am posting right now because I have been checking out on the latest Twitter chatter about &lt;a href=&quot;http://search.twitter.com/search?q=%23devops&quot;&gt;#DevOps&lt;/a&gt;. That is really interesting and looks like a new movement in the SysAdmin area, that and virtualization.&lt;/p&gt;

&lt;p&gt;I will make sure to do some tests in &lt;a href=&quot;http://www.puppetlabs.com/&quot;&gt;Puppet&lt;/a&gt; and &lt;a href=&quot;http://opscode.com/chef/&quot;&gt;Chef&lt;/a&gt;. I will happily post it here later as well. I thought I would check out &lt;a href=&quot;http://rubyonrails.org/&quot;&gt;Rails 3&lt;/a&gt;, &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt; as well as some IPv6 testing to be able to score some future job opportunity.&lt;/p&gt;

&lt;p&gt;About job opportunities, I am looking for a job in the Systems Administration area but is currently studying and would like to write a Bachelor&amp;#8217;s Thesis in the field and if anyone knows a company that would like to work with me that would be a pleasure.&lt;/p&gt;

&lt;p&gt;And I find this video hilarious; &lt;a href=&quot;http://www.youtube.com/watch?v=Fx8OBeNmaWw&quot;&gt;Velocity 2010 - Adam Jacob on DevOps&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>HP2140 files lost</title>
   <link href="http://antonlindstrom.com/2010/10/22/HP2140-files-lost.html"/>
   <updated>2010-10-22T13:47:18+00:00</updated>
   <id>http://antonlindstrom.com/2010/10/22/HP2140-files-lost</id>
   <content type="html">&lt;p&gt;Sorry! I just realized that I do not have the make.conf and xorg.conf files for HP2140 as referenced in &lt;a href=&quot;/2009/07/02/Gentoo-on-HP-2140.html&quot;&gt;Gentoo on HP 2140&lt;/a&gt; avaliable for download anymore. For that I am terrible sorry, I think I have them saved somewhere in a backup and I will try to retrieve them as soon as possible.&lt;/p&gt;

&lt;p&gt;As I do not have the HP2140 in my possession anymore I will not continue to research Gentoo on it. It is now owned by my &lt;a href=&quot;http://twitter.com/Ann_Hakan&quot;&gt;father&lt;/a&gt; which uses &lt;a href=&quot;http://ubuntu.com&quot;&gt;Ubuntu&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I truly regret not taking a &lt;a href=&quot;http://clonezilla.org/&quot;&gt;Clonezilla&lt;/a&gt; image of the harddrive in the laptop before installing Ubuntu on it. But hey, I hope I have learned something from that. So, if you read this. Please make a backup of all your files and do Clonezilla images of your harddisks. It gets a bit easier reinstalling your system when you have an image.&lt;/p&gt;

&lt;p&gt;Now, back to exam studies for me.&lt;/p&gt;

&lt;p&gt;[Update]: Found a more or less updated make.conf in my Gists on &lt;a href=&quot;http://github.com/&quot;&gt;GitHub&lt;/a&gt;, check it out here; &lt;a href=&quot;http://gist.github.com/322782&quot;&gt;make.conf&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Time = t</title>
   <link href="http://antonlindstrom.com/2010/10/19/Time-t.html"/>
   <updated>2010-10-19T14:09:12+00:00</updated>
   <id>http://antonlindstrom.com/2010/10/19/Time--t</id>
   <content type="html">&lt;p&gt;Ever since Sophia went to work this morning I have been studying non stop. Writing on a lab report about Kerberos, reading in on a few RFC&amp;#8217;s, VoIP, Optic-fiber and much, much more. Finally got the activation codes for a software that should help us forward in a course I am taking (although it does not always help).&lt;/p&gt;
&lt;p&gt;The thing with the software was that I had it installed on an Windows XP client that ended up in a corrupt filesystem which made it impossible to start it. Weird part is that the ZFS pool is still reporting errors even after deletion and scrubs. Hopefully there are not more errors in other &lt;abbr title=&quot;Virtual Machine&quot;&gt;VM&lt;/abbr&gt;s. Thankfully there are backups of most of the VMs on the server. &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/lindztrom/5096622254/&quot; title=&quot;Corrupt ZFS Pool by lindztrom, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4144/5096622254_c74ea88721.jpg&quot; width=&quot;448&quot; height=&quot;101&quot; alt=&quot;Corrupt ZFS Pool&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now I guess it is time to end the break and start working again. Have to read some more and then it is time for another break. There are not that much time left before the exams and then there are at least three reports that has to be sent in the same day. And a presentation after that. This university has the weirdest planning of all.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Current state</title>
   <link href="http://antonlindstrom.com/2010/09/20/Current-state.html"/>
   <updated>2010-09-20T12:10:26+00:00</updated>
   <id>http://antonlindstrom.com/2010/09/20/Current-state</id>
   <content type="html">&lt;p&gt;I thought I would give a status quick state report. I am currently moving files around my &lt;abbr title=&quot;Local Area Network&quot;&gt;LAN&lt;/abbr&gt;, there are several changes going on in the storage infrastructure. A slight increase in speed will also be seen.&lt;/p&gt;

&lt;p&gt;I thought I would do a backup routine with &lt;a href=&quot;http://en.wikipedia.org/wiki/Git_%28software%29&quot; title=&quot;Git at Wikipedia&quot;&gt;Git&lt;/a&gt; when changing configuration files. other Files like photos, music, movies and data with more size will use an &lt;abbr title=&quot;Server Message Block&quot;&gt;SMB&lt;/abbr&gt;/&lt;abbr title=&quot;Network File System&quot;&gt;NFS&lt;/abbr&gt; share with &lt;a href=&quot;http://en.wikipedia.org/wiki/Rsync&quot; title=&quot;rsync on Wikipedia&quot;&gt;rsync&lt;/a&gt; for clients and just &lt;a href=&quot;http://en.wikipedia.org/wiki/Rsync&quot; title=&quot;rsync on Wikipedia&quot;&gt;rsync&lt;/a&gt;/&lt;abbr title=&quot;Secure Shell&quot;&gt;SSH&lt;/abbr&gt; with servers. The main problem with backups are the connection reliability and speed. A mobile connection will take ages to finish and might corrupt data. Currently I am using checksums to verify the data but the speed will still be a problem.&lt;/p&gt;

&lt;p&gt;I have been experimenting with &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenLDAP&quot; title=&quot;OpenLDAP on Wikipedia&quot;&gt;OpenLDAP&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Kerberos_%28protocol%29&quot; title=&quot;Kerberos on Wikipedia&quot;&gt;Kerberos&lt;/a&gt; as well lately. It is a nice combination which will ease the administration of users in the system. Everything will be nicely integrated between Windows and Unix/Unix-like systems to get a nice consistency when opening the VPN to my end users. I am going to publish a help document on Kerberos and OpenLDAP soon to get a system to work as quick as possible.&lt;/p&gt;

&lt;p&gt;I think some of my end users might read this, so I thought I would briefly explain Kerberos and OpenLDAP. Kerberos is a system for authentication which in the log in phase gives the user a ticket to the services in the domain. This gives the user access to all the services without having to supply the password more than once. This is called Single Sign-On (SSO). Kerberos is implemented in Windows since Windows 2000.&lt;/p&gt;

&lt;p&gt;OpenLDAP is an open implementation of &lt;abbr title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/abbr&gt; which is a directory service. A directory service can hold information about users, computers, printers and more. In this system it will be used to hold user information such as user names, contact information et cetera. When using this it is possible to enter the information about users just once at the server and then it is possible to access that information across all the configured clients.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Alley.se</title>
   <link href="http://antonlindstrom.com/2010/08/28/Alleyse.html"/>
   <updated>2010-08-28T13:40:52+00:00</updated>
   <id>http://antonlindstrom.com/2010/08/28/Alleyse</id>
   <content type="html">&lt;p&gt;This Tuesday was a really, really good day. Lovely morning, took a walk to get my car and print some papers. Then ate a really good breakfast and in the midst of that, my phone rang. It was a woman offering to buy my domain name; &lt;a href=&quot;http://alley.se&quot;&gt;Alley.se&lt;/a&gt;. The rest of the day consisted of lying in the sofa, watching TV and studies.&lt;/p&gt;

&lt;p&gt;Domain trading is a common thing in the Internet world, though I did not think it would happen to me. I know that there are people that use this as a bad thing, then it is called &lt;a href=&quot;http://en.wikipedia.org/wiki/Cybersquatting&quot;&gt;Cybersquatting&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&amp;#8220;The term is derived from &amp;#8220;squatting,&amp;#8221; which is the act of occupying an abandoned or unoccupied space or building that the squatter does not own, rent or otherwise have permission to use. Cybersquatting, however, is a bit different in that the domain names that are being &amp;#8220;squatted&amp;#8221; are (sometimes but not always) being paid for through the registration process by the cybersquatters. Cybersquatters usually ask for prices far greater than that at which they purchased it. Some cybersquatters put up derogatory remarks about the person or company the domain is meant to represent in an effort to encourage the subject to buy the domain from them. Others post paid links via Google, Yahoo, Ask.com  and other paid advertising networks to the actual site that the user likely wanted, thus monetizing their squatting. Some argue that the dividing line of cybersquatting is difficult to draw, or that the practice is consistent with a capitalistic and free market ethos.&amp;#8221; - &lt;a href=&quot;http://en.wikipedia.org/wiki/Cybersquatting&quot;&gt;Cybersquatting&lt;/a&gt; article, &lt;a href=&quot;http://wikipedia.org&quot;&gt;Wikipedia&lt;/a&gt;.&lt;/blockquote&gt;

&lt;p&gt;As I have had &lt;a href=&quot;http://alley.se&quot;&gt;Alley.se&lt;/a&gt; for about 5 years I can not class myself as a cybersquatter as I did not buy it for selling, I was a little doubtful whether to sell the domain or not since I really enjoy it and use it very much internally and for friends. It is a short and good domain name. It is not without a tear in my eye I sell it, it was the first domain I bought and has been really good.&lt;/p&gt;
&lt;p&gt;Outside the rain was pouring and I could not have been happier enough to be indoors, enjoying &lt;a href=&quot;http://mysql.com&quot;&gt;MySQL&lt;/a&gt; queries while listening to the thunder rumbling, closer and closer. The good day was in me, all day long.&lt;/p&gt;
&lt;p&gt;This was written on that Tuesday but updated later and not published until the domain trade had gone through. Sadly enough the trade did not go through. They made the impression of being ready to buy the domain but after I gave my OK they had to check with some lawyers to be on dry land. Then they said that they were not completely sure of the name as well.&lt;/p&gt;

&lt;p&gt;So I still have my lovely &lt;a href=&quot;http://alley.se&quot;&gt;Alley.se&lt;/a&gt; domain.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Masquerade</title>
   <link href="http://antonlindstrom.com/2010/08/28/Masquerade.html"/>
   <updated>2010-08-28T13:35:20+00:00</updated>
   <id>http://antonlindstrom.com/2010/08/28/Masquerade</id>
   <content type="html">&lt;p&gt;Tonight there is a masquerade, or carnival called &lt;a href=&quot;http://wragardskalaset.se&quot;&gt;Wrågårdskalaset&lt;/a&gt;. I am going to spoil what I am going to be dressed as. First I was a bit into being the Batman but &lt;a href=&quot;http://omsocker.blogspot.com&quot; title=&quot;Sophia&quot;&gt;someone&lt;/a&gt; did not want to be Robin. It would be a bit funny to be Batman when I guess there will be a few Joker&amp;#8217;s there. After watching the old Batman movies on the telly, especially &lt;a href=&quot;http://www.imdb.com/title/tt0103776/&quot; title=&quot;Batman Returns on IMDB&quot;&gt;Batman Returns&lt;/a&gt; and &lt;a href=&quot;http://www.imdb.com/title/tt0118688/&quot; title=&quot;Batman &amp;amp; Robin&quot;&gt;Batman &amp;amp; Robin&lt;/a&gt; we thought of being Batman villains.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://antonlindstrom.com/images/penguin-man-dress.jpg&quot; alt=&quot;The Penguin dress&quot;/&gt;&lt;/p&gt;

&lt;p&gt;There are a few Batman villains to choose from, after &lt;a href=&quot;http://www.imdb.com/name/nm0634240/&quot; title=&quot;Christopher Nolan on IMDB&quot;&gt;Nolan&lt;/a&gt;&amp;#8217;s exceptionally good &lt;a href=&quot;http://www.imdb.com/title/tt0468569/&quot; title=&quot;The Dark Knight on IMDB&quot;&gt;The Dark Knight&lt;/a&gt;. Many masquerades has had visits from the Joker etc. Now it is time to bring out the old villains such as the &lt;a href=&quot;http://www.superherodb.com/profile.php?hero=Penguin&quot; title=&quot;The Penguin on Superhero DB&quot;&gt;Pinguin&lt;/a&gt; and &lt;a href=&quot;http://www.superherodb.com/profile.php?hero=Poison.Ivy&quot; title=&quot;Poison Ivy on SuperheroDB&quot;&gt;Poison Ivy&lt;/a&gt;. Yes, we are going to go as the &lt;a href=&quot;http://antonlindstrom.com/images/penguin-man-face.jpg&quot; title=&quot;Picture of the Penguin, face&quot;&gt;Penguin&lt;/a&gt; and Poison Ivy from Batman Returns and Batman &amp;amp; Robin. Photos will be tagged to this post later on.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Deployment</title>
   <link href="http://antonlindstrom.com/2010/08/27/Deployment.html"/>
   <updated>2010-08-27T00:11:43+00:00</updated>
   <id>http://antonlindstrom.com/2010/08/27/Deployment</id>
   <content type="html">&lt;p&gt;As I am more of a Linux man I tend to have less knowledge about the Windows side of things. Well, no more. I decided to do some experimenting on Windows to get more knowledge and get some control over what is happening in that not-so-good operating system. So today, I have been studying and installing &lt;abbr title=&quot;Active Directory&quot;&gt;AD&lt;/abbr&gt; and some Windows clients. Then I came across a &lt;a href=&quot;http://www.frontmotion.com/Firefox/&quot;&gt;Firefox MSI&lt;/a&gt; to deploy across these clients.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/lindztrom/4930635758/&quot; title=&quot;Active Directory by lindztrom, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4142/4930635758_75fda67f36.jpg&quot; width=&quot;440&quot; height=&quot;349&quot; alt=&quot;Active Directory&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I sure like the idea of &lt;abbr title=&quot;Active Directory&quot;&gt;AD&lt;/abbr&gt; and it is very nice to use across multiple clients. I would love to see an &lt;abbr title=&quot;Active Directory&quot;&gt;AD&lt;/abbr&gt; for Linux, say Ubuntu that would use &lt;abbr title=&quot;Advanced Packaging Tool&quot;&gt;APT&lt;/abbr&gt; to download packages marked from a server. Maybe it will be a new project to work on. Integration with Kerberos and &lt;abbr title=&quot;Lightweight Directory Access Protocol&quot;&gt;LDAP&lt;/abbr&gt; is of course a plus.&lt;/p&gt;
&lt;p&gt;Remote desktop is one nice thing as well, it works like a charm and plays nice with my MacBook. It is also pretty efficient as it is possible to run on my slow 3G connection.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Nostalgia</title>
   <link href="http://antonlindstrom.com/2010/08/20/Nostalgia.html"/>
   <updated>2010-08-20T15:34:04+00:00</updated>
   <id>http://antonlindstrom.com/2010/08/20/Nostalgia</id>
   <content type="html">&lt;p&gt;When I and &lt;a href=&quot;http://omsocker.blogspot.com&quot;&gt;Sophia&lt;/a&gt; were out checking out 3D TV&amp;#8217;s, hair dryers and hard drives we started talking about things from the past. You know the good old stuff like those red things that you could view dinosaurs in 3D (&lt;a href=&quot;http://en.wikipedia.org/wiki/View-Master&quot; title=&quot;View-Master article on Wikipedia&quot;&gt;View-Master&lt;/a&gt;) or the books that came with cassette tapes that made a sound when it was time to turn the page.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/ansik/2396297199/&quot; title=&quot;Robin launched himself at a catman - ZAP! by ansik, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3285/2396297199_4d60d9b8b5.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Robin launched himself at a catman - ZAP!&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo from &lt;a href=&quot;http://www.flickr.com/photos/ansik/&quot; title=&quot;ansik on Flickr&quot;&gt;ansik&lt;/a&gt; on &lt;a href=&quot;http://flickr.com&quot;&gt;Flickr&lt;/a&gt; licensed under &lt;a href=&quot;http://creativecommons.org/licenses/by/2.0/deed.en&quot;&gt;Creative Commons Attribution 2.0 Generic&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Remote worker</title>
   <link href="http://antonlindstrom.com/2010/08/19/Remote-worker.html"/>
   <updated>2010-08-19T16:50:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/08/19/Remote-worker</id>
   <content type="html">&lt;p&gt;Well, I told you about having a mobile connection to the Internet. As I got a new server it means a lot of configuring. Even when I am away. This is something I must say, I enjoy. With a &lt;abbr title=&quot;Virtual Private Network&quot;&gt;VPN&lt;/abbr&gt; implemented it is easy to do the stuff like I was sitting right next to the server.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/nuzz/254955992/&quot; title=&quot;virtual office on the island by nuzz, on Flickr&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/82/254955992_ba99f4b9ac.jpg&quot; width=&quot;500&quot; height=&quot;334&quot; alt=&quot;virtual office on the island&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a problem now that I would like to have some more lab hardware. A rack case, an &lt;abbr title=&quot;Uninterruptible Power Supply&quot;&gt;UPS&lt;/abbr&gt;, an &lt;a href=&quot;http://en.wikipedia.org/wiki/KVM_switch#KVM_over_IP_.28iKVM.29&quot;&gt;iKVM&lt;/a&gt;, a new &lt;abbr title=&quot;gigabit&quot;&gt;Gbit&lt;/abbr&gt; switch and an &lt;a href=&quot;http://en.wikipedia.org/wiki/ISCSI&quot;&gt;iSCSI&lt;/a&gt; &lt;abbr title=&quot;Storage Area Network&quot;&gt;SAN&lt;/abbr&gt;. A few more items would be nice. The only problem is the price of course, so if anyone would like to sponsor me that would be really great.&lt;/p&gt;

&lt;p&gt;The hardware that I use are mostly for fun and for learning purposes. It is great to have something to test new things on and it is good to practice things before you can manage a system in a corporate environment.&lt;/p&gt;

&lt;p&gt;Now, remote access is great to use when you need to check things in the system or get access to resources behind a firewall. It would be really difficult to manage my network if I would not be able to access it from a remote location.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Home network</title>
   <link href="http://antonlindstrom.com/2010/08/12/Home-network.html"/>
   <updated>2010-08-12T12:29:34+00:00</updated>
   <id>http://antonlindstrom.com/2010/08/12/Home-network</id>
   <content type="html">&lt;p&gt;Bandwidth is not all, I say. Even though today would be a good day with a little bit more bandwidth and stability. My mobile 3G connection has a bit to go to have that stability and speed of a nice &lt;abbr title=&quot;Local Area Network&quot;&gt;LAN&lt;/abbr&gt; connection. I would rather have a static IP with VPN to my real home network at &lt;a href=&quot;http://antonlindstrom.com&quot;&gt;AntonLindstrom.com&lt;/a&gt; which may see a real upgrade in the near future.&lt;/p&gt;

&lt;p&gt;I have been talking about virtualization for a few months and I would really like to see that realized and implemented into my home/lab network. The backbone LAN network is quite stable and has been configured to maximize performance as well as optimize data flow. The issue is the server hardware at the moment, a new server might come in place this autumn and the old one will serve as a media server. At the moment I have seven virtualized servers on my MacBook and two of them is running most of the time I am using the computer. If/when the new server is implemented, these &lt;abbr title=&quot;Virtual Machines&quot;&gt;VM&lt;/abbr&gt;s will be transferred to the server and will free my laptop from the heavy usage it faces today.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Frankenjura</title>
   <link href="http://antonlindstrom.com/2010/06/21/Frankenjura.html"/>
   <updated>2010-06-21T06:24:22+00:00</updated>
   <id>http://antonlindstrom.com/2010/06/21/Frankenjura</id>
   <content type="html">&lt;p&gt;This week has been really great, lots of fantastic climbing and wonderful scenery. I have been plotting down some notes from every day that we were down there and I thought I would share them with you here. In the tent we called it &amp;#8220;captains log&amp;#8221; and I guess it was.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/lindztrom/4720811632/&quot; title=&quot;DSC_0057 by lindztrom, on Flickr&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1043/4720811632_1081e314a6.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;DSC_0057&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Monday 14/6&lt;/em&gt;; cloudy, some sun in Denmark but mostly cloudy when waiting for the &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=rostock&amp;amp;sll=58.391154,13.847268&amp;amp;sspn=0.798923,2.458191&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Rostock,+Mecklenburg-West+Pommerania,+Germany&amp;amp;z=11&quot;&gt;Rostock&lt;/a&gt; ferry. Tight squeeze on the ferry parking deck, had to climb in and out of the car. In Germany no one takes VISA! &lt;i&gt;Chased&lt;/i&gt; (or rather followed a short distance) by police in &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Kritzkow&amp;amp;sll=54.090235,12.13295&amp;amp;sspn=0.22351,0.614548&amp;amp;g=rostock&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Kritzkow+Laage,+G%C3%BCstrow,+Mecklenburg-West+Pommerania,+Germany&amp;amp;ll=53.884916,12.252502&amp;amp;spn=0.898458,2.458191&amp;amp;z=9&quot;&gt;Kritzkow&lt;/a&gt;. Found a speeding camera in &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Pritzwalk&amp;amp;sll=53.884916,12.252502&amp;amp;sspn=0.898458,2.458191&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Pritzwalk,+Prignitz,+Brandenburg,+Germany&amp;amp;ll=53.393157,12.683716&amp;amp;spn=1.817999,4.916382&amp;amp;z=8&quot;&gt;Pritzwalk&lt;/a&gt; and saw a police escort close to &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Leipzig&amp;amp;sll=53.393157,12.683716&amp;amp;sspn=1.817999,4.916382&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Leipzig,+Saxony,+Germany&amp;amp;ll=51.330612,12.392578&amp;amp;spn=7.621627,19.665527&amp;amp;z=6&quot;&gt;Leipzig&lt;/a&gt;. Hot and sweaty night in the car south of Leipzig.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tuesday 15/6&lt;/em&gt;; My sisters birthday, congratulations! A yogurt for breakfast and then back on track. Found our way to &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Wolfsberg+43,+91286+Obertrubach,+Germany&amp;amp;sll=50.705591,10.988731&amp;amp;sspn=0.120672,0.307274&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Wolfsberg+43,+Wolfsberg+91286+Obertrubach,+Forchheim,+Bavaria,+Germany&amp;amp;ll=49.691842,11.316948&amp;amp;spn=0.061631,0.153637&amp;amp;z=13&quot;&gt;Wolfsberg&lt;/a&gt;, tent was smoothly assembled and a powernap to get the power back after our drive. The hostess at &lt;a href=&quot;http://www.gasthof-eichler.de/&quot;&gt;Gasthof Eichler&lt;/a&gt; was very, very kind to us and showed us around. Talked to an Australian man who seemed like a really good climber. Climbed at two nice places close to the camping, the crags are pretty different from Sweden and so fun! Saw a mouse, fireflies and strawberries. Great day, a bit tired though.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/lindztrom/4777065936/&quot; title=&quot;DSC_0202 by lindztrom, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4123/4777065936_898b578986.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;DSC_0202&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Wednesday 16/6&lt;/em&gt;; Captains log: Eaten a really good breakfast. Far distance between the bolts. Bought stoppers in &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Forchheim,+Germany&amp;amp;sll=49.726255,11.085033&amp;amp;sspn=0.061588,0.153637&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Forchheim,+Bavaria,+Germany&amp;amp;ll=49.719818,11.058426&amp;amp;spn=0.061596,0.153637&amp;amp;z=13&quot;&gt;Forchheim&lt;/a&gt; and belayed from a doubtful bolt. Talked about writing about Frankenjura for the swedish climbing magazine &lt;a href=&quot;http://www.klatterforbundet.se/skf_info.php?id=53&amp;amp;subsida=6&quot;&gt;Bergsport&lt;/a&gt;. Drank pretty good (and cheap) beer, Fortuna Hell. They have many beautiful churches and there are a lot of crosses with Jesus next to the road. Very cozy villages.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/lindztrom/4776433361/&quot; title=&quot;DSC_0144 by lindztrom, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4073/4776433361_51de2d78db.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;DSC_0144&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thursday 17/6&lt;/em&gt;; Been at a castle, poop in their toilette. The man there was very special. Climbed at a crag called &lt;a href=&quot;http://www.climb.frankenjura.com/php3/select_fels.php3?id=4-16-8&quot;&gt;Schlosszwergwand&lt;/a&gt;, very nice climbing and a great overhang which tired me out. The schnitzel at the castle was not better than Benidorm&amp;#8217;s. Have been very cultural. &lt;a href=&quot;http://maps.google.se/maps?f=q&amp;amp;source=s_q&amp;amp;hl=sv&amp;amp;geocode=&amp;amp;q=G%C3%B6%C3%9Fweinstein&amp;amp;sll=49.770402,11.337018&amp;amp;sspn=0.246125,0.614548&amp;amp;g=G%C3%B6%C3%9Fweinstein&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=G%C3%B6%C3%9Fweinstein,+Forchheim,+Bayern,+Tyskland&amp;amp;ll=49.770622,11.337891&amp;amp;spn=0.492247,1.229095&amp;amp;z=10&quot;&gt;Gößweinstein&lt;/a&gt; is incredible beautiful. A few good photos have been taken. A few beers this night as well.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Friday 18/6&lt;/em&gt;; Day for rest, rain. Bought a gift. Drove to &lt;a href=&quot;http://maps.google.se/maps?f=q&amp;amp;source=s_q&amp;amp;hl=sv&amp;amp;geocode=&amp;amp;q=Erlangen,+Tyskland&amp;amp;sll=49.770622,11.337891&amp;amp;sspn=0.492247,1.229095&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Erlangen,+Bayern,+Tyskland&amp;amp;ll=49.813176,11.719666&amp;amp;spn=0.983624,2.458191&amp;amp;z=9&quot;&gt;Erlangen&lt;/a&gt; and &lt;a href=&quot;http://maps.google.se/maps?f=q&amp;amp;source=s_q&amp;amp;hl=sv&amp;amp;geocode=&amp;amp;q=Egloffstein&amp;amp;sll=49.701835,11.344757&amp;amp;sspn=0.246474,0.614548&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Egloffstein,+Forchheim,+Bayern,+Tyskland&amp;amp;ll=49.703612,11.258926&amp;amp;spn=0.123233,0.307274&amp;amp;z=12&quot;&gt;Egloffstein&lt;/a&gt; to go to some climbing shops, they were pretty so-so. Bought a t-shirt. Met some other swedes from &lt;a href=&quot;http://maps.google.se/maps?f=q&amp;amp;source=s_q&amp;amp;hl=sv&amp;amp;geocode=&amp;amp;q=malm%C3%B6&amp;amp;sll=49.770402,11.337018&amp;amp;sspn=0.246125,0.614548&amp;amp;g=G%C3%B6%C3%9Fweinstein&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Malm%C3%B6,+Sk%C3%A5ne+L%C3%A4n&amp;amp;ll=55.603178,13.000946&amp;amp;spn=0.430567,1.229095&amp;amp;z=10&quot;&gt;Malmö&lt;/a&gt; which we were going to climb with the next day. Ate old fish sticks that could have given us a serious case of bad stomach, Jägermeister heals stomachs. In Erlangen we also met a couple that were climbing in Schlosszwergwand the day before. A lot of cheap beer. Is going to be great to climb Saturday. Two worn out climbers in a tent.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/lindztrom/4777066370/&quot; title=&quot;DSC_0235 by lindztrom, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4100/4777066370_82363c4bea.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;DSC_0235&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Saturday 19/6&lt;/em&gt;; Went to a place with &lt;a href=&quot;http://en.wikipedia.org/wiki/Via_ferrata&quot;&gt;Via Ferrata&lt;/a&gt; but did not do that, we were out for the wall. Took a pretty bad fall which might have lightly sprained my ankle. We were out there with the two Malmö-guys. Accidentally hit a German car, had to wait for the police for a little dent. The Polizei was really nice and we just signed a few papers and it was all good. Had barbecue and beer-drinking with our fellow swedes. Pretty cold at night.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/lindztrom/4720313958/&quot; title=&quot;Deer by lindztrom, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4021/4720313958_36bd0bdfb8.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Deer&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sunday 20/6&lt;/em&gt;; Going home. Slow morning, said goodbye to Cristopher, Daniel (the two other swedes) and Martha (hostess). The way home went pretty smooth but we missed the Rostock-&lt;a href=&quot;http://maps.google.se/maps?f=q&amp;amp;source=s_q&amp;amp;hl=sv&amp;amp;geocode=&amp;amp;q=gedser&amp;amp;sll=55.603178,13.000946&amp;amp;sspn=0.430567,1.229095&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Gedser,+Danmark&amp;amp;ll=54.576145,11.928683&amp;amp;spn=0.027611,0.076818&amp;amp;z=14&quot;&gt;Gedser&lt;/a&gt; ferry with 10 minutes, had to wait 2 hours for the next. Leaving my climbing partner in Malmö and heading home. Taking a coffee and hot dog in &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=ljungby&amp;amp;sll=58.391154,13.847268&amp;amp;sspn=0.798923,2.458191&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Ljungby,+Kronoberg,+Sweden&amp;amp;ll=56.833436,13.94039&amp;amp;spn=1.66786,4.916382&amp;amp;z=8&quot;&gt;Ljungby&lt;/a&gt;, a few kilometers after that I hit a deer. Car looks like scraps from the front, hopefully it will be fixed soon.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wireless in Gentoo on HP2140</title>
   <link href="http://antonlindstrom.com/2010/05/25/Wireless-in-Gentoo-on-HP2140.html"/>
   <updated>2010-05-25T23:06:00+00:00</updated>
   <id>http://antonlindstrom.com/2010/05/25/Wireless-in-Gentoo-on-HP2140</id>
   <content type="html">&lt;p&gt;The last time I was tinkering with Gentoo on HP 2140 there was a problem with wireless and dhcpcd. Today I found a fix at the &lt;a href=&quot;https://forums.gentoo.org/viewtopic-p-5903279.html#5903279&quot; title=&quot;Broadcom 4322 a/b/g/n with WPA &amp;amp; WPA2 working on 2.6.30-r4&quot;&gt;Gentoo Forums&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Device Drivers  &amp;#8212;-&amp;gt;&lt;/li&gt;
         &lt;ul&gt;
&lt;li&gt;Network device support  &amp;#8212;-&amp;gt;&lt;/li&gt;
             &lt;ul&gt;
&lt;li&gt;Wireless LAN  &amp;#8212;-&amp;gt;&lt;/li&gt;
                            &lt;li&gt;[*] Wireless LAN (IEEE 802.11)&lt;/li&gt;
                                 &lt;li&gt;.&lt;/li&gt;
                                 &lt;li&gt;.&lt;/li&gt;
                                 &lt;li&gt;.&lt;/li&gt; 
                           &lt;li&gt;&amp;lt;M&amp;gt;   IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)&lt;/li&gt;
                            &lt;li&gt;[ ]     Support downloading firmware images with Host AP driver&lt;/li&gt;  
                           &lt;li&gt;&amp;lt;M&amp;gt;     Host AP driver for Prism2/2.5/3 in PLX9052 PCI adaptors&lt;/li&gt;
                           &lt;li&gt;&amp;lt;M&amp;gt;     Host AP driver for Prism2.5 PCI adaptors&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;As it takes a while to compile the kernel if you have not optimized it well. I have not so when you compile, it is a good idea to take a cup of coffee or if you prefer, a cup of tea. &lt;/p&gt;
&lt;p&gt;After adding these as modules in the kernel you are probably safe to go. Remember to use ACCEPT_LICENSE in /etc/make.conf for broadcom-sta. As the author says;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;#8220;Re-emerge broadcom-sta and it should work with Network Manager.&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;
When I compiled broadcom-sta I got some error about a few entries in the .config file. Just comment them out and recompile, after that it should work fine. The entries I had were&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CONFIG_B43&lt;/li&gt;
&lt;li&gt;CONFIG_SSB&lt;/li&gt;
&lt;li&gt;CONFIG_MAC80211&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Previous configuration with Gentoo on the HP 2140 can be read in &amp;#8220;&lt;a href=&quot;/2009/07/02/Gentoo-on-HP-2140.html&quot;&gt;Gentoo on HP 2140&lt;/a&gt;&amp;#8221;. Best of luck to you. After all it pays off to have a snappy machine when you put some effort in it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Steve Jobs on Flash</title>
   <link href="http://antonlindstrom.com/2010/04/29/Steve-Jobs-on-Flash.html"/>
   <updated>2010-04-29T16:59:41+00:00</updated>
   <id>http://antonlindstrom.com/2010/04/29/Steve-Jobs-on-Flash</id>
   <content type="html">&lt;p&gt;Just read the &lt;a href=&quot;http://www.apple.com/hotnews/thoughts-on-flash/&quot;&gt;open letter&lt;/a&gt; Steve Jobs has written about Flash.&lt;/p&gt;
&lt;p&gt;I can say that I fully agree on the aspects of why Flash is bad. It just feels like it has served it&amp;#8217;s purpose, let the new technologies, like HTML5, JavaScript and more, take over. There is a greatness in letting things go, open standards will be easier to adapt and use.&lt;/p&gt;
&lt;p&gt;Please Adobe, focus on your other products of creativity.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Docs and Google Docs</title>
   <link href="http://antonlindstrom.com/2010/04/18/Docs-and-Google-Docs.html"/>
   <updated>2010-04-18T11:22:06+00:00</updated>
   <id>http://antonlindstrom.com/2010/04/18/Docs-and-Google-Docs</id>
   <content type="html">&lt;p&gt;I have a certain loath for &lt;a href=&quot;http://office.microsoft.com/en-us/word/FX100487981033.aspx&quot;&gt;Microsoft Word&lt;/a&gt;, not because it is Microsoft software but more because it is so expensive and does not support open standards. Word uses its .doc and .docx formats which is pretty much proprietary and is expected to be some sort of industry standard. If you get a document from someone you can be at least 80% sure that it is a .doc or .docx format. The software does not support .odt which is an open format for these types of documents.&lt;/p&gt;

&lt;p&gt;So, does that mean I love &lt;a href=&quot;http://openoffice.org/&quot;&gt;OpenOffice.org&lt;/a&gt; (OO.org)? No, it does not. I dislike OO.org just as much. Not because of the lack of support for open formats, that is working great. It is because of the time it takes to load a document and then process it. On a Mac it is pretty sluggish and I feel like it is a nightmare to use.&lt;/p&gt;

&lt;p&gt;As I often write short texts and want to be able to quickly go into the text, write a few more words and then close it, it gets pretty slow. I do not want to have a program that I do not regularly use, in the background. Especially when it is not optimized (as OO.org is not) for my computer. I have a program that is almost always running, my web browser.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://docs.google.com/&quot;&gt;Google Docs&lt;/a&gt; is a word processor that is optimized for the web and has had a rewrite just a couple of days ago. I thought I would write what differs from the old code base.&lt;/p&gt;

&lt;p&gt;First of all, my workflow is destroyed. The shortcuts has been edited, the text formats is one example. Also some functions have been moved and it feels like it is more practical and smarter now. There is now a ruler which controls your indents better and it might be a few more tools added. The most important thing is that everything is so much faster! Before it was a little bit slow and sluggish and I complained a lot about it but now it is really, really improved.&lt;/p&gt;

&lt;p&gt;There are many things that Google Docs does not have, like support for templates etc. So I have to write texts in the desktop word processors for essays and reports at the University but would like to see that Docs became even better so I can use it for work as well.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The importance of backup</title>
   <link href="http://antonlindstrom.com/2010/03/08/The-importance-of-backup.html"/>
   <updated>2010-03-08T20:04:04+00:00</updated>
   <id>http://antonlindstrom.com/2010/03/08/The-importance-of-backup</id>
   <content type="html">&lt;p&gt;Think about the data stored on our computers. I store my photos, school assignments and a lot of code projects. What if they get lost, someone could steal my computer or the hard drive may fail. What am I supposed to do? The data could be lost forever. This is where &lt;a href=&quot;http://en.wikipedia.org/wiki/Backup&quot; title=&quot;Backup article on Wikipedia&quot;&gt;backup&lt;/a&gt; is really important, if a hard drive fails you are able to get the backup from another place and get it back. Many people I know have a lot of data on their computers that they are afraid to loose but does not take action to prevent it.&lt;/p&gt;

&lt;p&gt;How to backup? One way to solve this is to get an external hard drive and copy all the files that you have on your computer onto that one, remember to keep copies on your computer so it is stored on more than one place. There are also solutions like &lt;a href=&quot;http://dropbox.com&quot;&gt;Dropbox&lt;/a&gt; where you can store your documents, Dropbox will also sync your files with your other computers if you install a small piece of software. Other services are &lt;a href=&quot;http://mozy.com&quot;&gt;Mozy&lt;/a&gt;, &lt;a href=&quot;http://backblaze.com&quot;&gt;Backblaze&lt;/a&gt; and the more advanced alternative &lt;a href=&quot;http://aws.amazon.com/s3&quot;&gt;Amazon S3&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is how I run my backups:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Photos and music are backed up via a &lt;a href=&quot;http://en.wikipedia.org/wiki/Bash&quot; title=&quot;Bash article on Wikipedia&quot;&gt;bash&lt;/a&gt;-script to my local server&lt;/li&gt;
&lt;li&gt;Documents are stored on &lt;a href=&quot;http://dropbox.com&quot;&gt;Dropbox&lt;/a&gt; for &lt;a href=&quot;http://en.wikipedia.org/wiki/Revision_control&quot; title=&quot;Revision Control article on Wikipedia&quot;&gt;revision control&lt;/a&gt; and high availability&lt;/li&gt;
&lt;li&gt;Documents are also stored on &lt;a href=&quot;http://google.com/docs&quot;&gt;Google Docs&lt;/a&gt; as I am often using that as primary writing platform&lt;/li&gt;
&lt;li&gt;Code projects are saved on &lt;a href=&quot;http://github.com/&quot;&gt;Github&lt;/a&gt;, also with revision control&lt;/li&gt;
&lt;li&gt;My laptop is using &lt;a href=&quot;http://www.apple.com/macosx/what-is-macosx/time-machine.html&quot;&gt;TimeMachine&lt;/a&gt; to an external drive which is connected about once a week and does a full copy of the laptop&lt;/li&gt;
&lt;li&gt;The most important files are uploaded to &lt;a href=&quot;http://aws.amazon.com/s3&quot;&gt;Amazon S3&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my backup plan there is one thing I want to improve right now. The local server does not have mirrored disks which is something I have to improve to get a little bit higher fault tolerance. I really take care of my data and truly want to save it. I hope you do the same!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Information and convergence.</title>
   <link href="http://antonlindstrom.com/2009/11/26/Information-and-convergence.html"/>
   <updated>2009-11-26T12:23:00+00:00</updated>
   <id>http://antonlindstrom.com/2009/11/26/Information-and-convergence</id>
   <content type="html">&lt;p&gt;
&lt;object height=&quot;328&quot; width=&quot;554&quot; data=&quot;http://www.youtube.com/v/6ILQrUrEWe8&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&quot; type=&quot;application/x-shockwave-flash&quot;&gt;
&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;
&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;
&lt;param name=&quot;src&quot; value=&quot;http://www.youtube.com/v/6ILQrUrEWe8&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&quot;&gt;
&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot;&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;Had a discussion with my friend &lt;a href=&quot;http://twitter.com/TjiffTjoff&quot;&gt;@TjiffTjoff&lt;/a&gt; about emails and how much of the emails sent being spam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Linux CLI tips.</title>
   <link href="http://antonlindstrom.com/2009/10/08/Linux-CLI-tips.html"/>
   <updated>2009-10-08T12:39:00+00:00</updated>
   <id>http://antonlindstrom.com/2009/10/08/Linux-CLI-tips</id>
   <content type="html">&lt;p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-a&lt;/b&gt; - Move to the start of the line.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-e&lt;/b&gt; - Move to the end of the line.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Alt-] &lt;/b&gt;&lt;i&gt;&lt;b&gt;x&lt;/b&gt; &lt;/i&gt;-&lt;i&gt; &lt;/i&gt;Moves the cursor forward to the next occurrence of x.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Alt-Ctrl-] &lt;i&gt;x&lt;/i&gt;&lt;/b&gt; -Â Moves the cursor backwards to the previous occurrence of x.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-u&lt;/b&gt; - Delete from the cursor to the beginning of the line.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-k&lt;/b&gt; - Delete from the cursor to the end of the line.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-w&lt;/b&gt; - Delete from the cursor to the start of the word.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-y&lt;/b&gt; - Pastes text from the clipboard.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-l&lt;/b&gt; - Clear the screen leaving the current line at the top of the screen.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-x - Ctrl-u&lt;/b&gt; - Undo the last changes. &lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-_Alt-r&lt;/b&gt; - Undo all changes to the line.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Alt-Ctrl-e&lt;/b&gt; - Expand command line.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Ctrl-r&lt;/b&gt; - Incremental reverse search of history.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Alt-p&lt;/b&gt; - Non-incremental reverse search of history.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;!! &lt;/b&gt;- Execute last command in history&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;!abc&lt;/b&gt; - Execute last command in history beginning with abc&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;!&lt;/b&gt;&lt;i&gt;&lt;b&gt;n&lt;/b&gt; - &lt;/i&gt;ExecuteÂ &lt;i&gt;n&lt;/i&gt;th command in history&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;^abc^xyz&lt;/b&gt; - Replace first occurrence of abc with xyz in last command and execute it&lt;/li&gt;
&lt;/ul&gt;Re-blog fromÂ &lt;a href=&quot;http://www.makeuseof.com/tag/15-great-tips-for-ubuntu-power-users/&quot;&gt;&lt;a href=&quot;http://www.makeuseof.com/tag/15-great-tips-for-ubuntu-power-users/&quot;&gt;http://www.makeuseof.com/tag/15-great-tips-for-ubuntu-power-users/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Gentoo on HP 2140</title>
   <link href="http://antonlindstrom.com/2009/07/02/Gentoo-on-HP-2140.html"/>
   <updated>2009-07-02T23:53:00+00:00</updated>
   <id>http://antonlindstrom.com/2009/07/02/Gentoo-on-HP-2140</id>
   <content type="html">&lt;p&gt;I bought myself an HP 2140 and I thought I should install Gentoo 2008.0 on it. I just followed the &lt;a href=&quot;http://www.gentoo.org/doc/en/handbook/handbook-x86.xml&quot;&gt;Gentoo Installation Docs&lt;/a&gt;, and the &lt;a title=&quot;Anton's HP2140 .config&quot; href=&quot;http://code.antonlindstrom.com/hp2140/config&quot;&gt;.config&lt;/a&gt; file for my kernel (2.6.29) was just about configured on feeling. If you think something can be added or removed, please contact me. My &lt;a title=&quot;Anton's HP2140 make.conf&quot; href=&quot;http://code.antonlindstrom.com/hp2140/make.conf&quot;&gt;/etc/make.conf&lt;/a&gt; was partly taken from the Gentoo Wiki on the HP 2133 and MSI Wind (which has the same Intel Atom processor). Two problems arose, Xorg.conf and the Broadcom BCM4322&amp;#160;802.11a/b/g/n WLAN Controller.&lt;/p&gt;

&lt;p&gt;I solved the Xorg.conf by installing xf86-video-intel. With some help from the &lt;a title=&quot;Intel GMA on Gentoo Wiki&quot; href=&quot;http://en.gentoo-wiki.com/wiki/Intel_GMA&quot;&gt;Gentoo Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;emerge xf86-video-intel&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then it worked with this &lt;a title=&quot;Anton's HP2140 xorg.conf&quot; href=&quot;http://code.antonlindstrom.com/hp2140/xorg.conf&quot;&gt;/etc/xorg.conf&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;Section &quot;Device&quot;
Identifier &quot;Intel Corporation Mobile 945GME Express Graphics Controller&quot;
Driver &quot;intel&quot;
Option &quot;AccelMethod&quot; &quot;UXA&quot;
VendorName &quot;Intel(R) DEG&quot;
BoardName &quot;Embedded Graphics&quot;
BusID &quot;0:2:0&quot;
Screen 0
EndSection

Section &quot;Screen&quot;
Identifier &quot;Default Screen&quot;
Device &quot;Intel Corporation Mobile 945GMEExpress Graphics Controller&quot;
Monitor &quot;Generic Monitor&quot;
DefaultDepth 24
Subsection &quot;Display&quot;
Depth 24
Modes &quot;1024x600&quot; &quot;800x600&quot;
ViewPort 0 0
# Virtual 1024 768
EndSubsection
EndSection
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;The Wireless is yet to be fixed.&lt;/p&gt;
&lt;h3&gt;Update (26/7-09): Wireless is fixed!&lt;/h3&gt;
&lt;p&gt;Use: &lt;code&gt;emerge net-wireless/broadcom-sta&lt;/code&gt; and it will download the drivers for the NIC, there are some bugs and some problems (like dhcpcd for me..). Then there is one thing in the kernel that needs to be added, right now I dont remember which it was but I am going to find out soon. You also have to install &lt;i&gt;unzip&lt;/i&gt; so &lt;i&gt;broadcom-sta&lt;/i&gt; will work.&lt;/p&gt; 
&lt;p&gt;According to &lt;a href=&quot;http://en.gentoo-wiki.com/wiki/HP_Pavilion_DV3_1075US&quot;&gt;http://en.gentoo-wiki.com/&lt;/a&gt;: &lt;blockquote&gt;&amp;#8220;You need to have wireless setup in your kernel (tkip support as well) modules or built in works.&amp;#8221;&lt;/blockquote&gt;&lt;/p&gt;
&lt;h3&gt;Old make.conf&lt;/h3&gt;
&lt;script src=&quot;https://gist.github.com/322782.js&quot;&gt; &lt;/script&gt;
&lt;p&gt;As about all of the config files are unavailable (unfortunately lost) these are all the files I have got.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>History of the Internet</title>
   <link href="http://antonlindstrom.com/2009/01/09/History-of-the-Internet.html"/>
   <updated>2009-01-09T11:32:00+00:00</updated>
   <id>http://antonlindstrom.com/2009/01/09/History-of-the-Internet</id>
   <content type="html">&lt;iframe src=&quot;http://player.vimeo.com/video/2696386&quot; width=&quot;558&quot; height=&quot;315&quot; frameborder=&quot;0&quot; webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;http://vimeo.com/2696386&quot;&gt;History of the Internet&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/lonja&quot;&gt;Melih Bilgil&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
</feed>
