<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:og="http://ogp.me/ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:schema="http://schema.org/" xmlns:sioc="http://rdfs.org/sioc/ns#" xmlns:sioct="http://rdfs.org/sioc/types#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" version="2.0" xml:base="https://www.linuxjournal.com/">
  <channel>
    <title>HOWTOs</title>
    <link>https://www.linuxjournal.com/</link>
    <description/>
    <language>en</language>
    
    <item>
  <title>Running GNOME in a Container</title>
  <link>https://www.linuxjournal.com/content/running-gnome-container</link>
  <description>  &lt;div data-history-node-id="1340759" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/adam-verslype" lang="" about="https://www.linuxjournal.com/users/adam-verslype" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Adam Verslype&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;Containerizing the GUI separates your work and play.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
Virtualization has always been a rich man's game, and more frugal
enthusiasts—unable to afford fancy server-class components—often
struggle to keep up. Linux provides free high-quality hypervisors, but when
you start to throw real workloads at the host, its resources become
saturated quickly. No amount of spare RAM shoved into an old Dell desktop
is going to remedy this situation. If a properly decked-out host is out of
your reach, you might want to consider containers instead.
&lt;/p&gt;

&lt;p&gt;
Instead of virtualizing an entire computer, containers allow parts of the Linux
kernel to be portioned into several pieces. This occurs without the
overhead of emulating hardware or running several identical kernels. A full
GUI environment, such as GNOME Shell can be launched inside a container,
with a little gumption.
&lt;/p&gt;

&lt;p&gt;
You can accomplish this through namespaces, a feature built in to the Linux
kernel. An in-depth look at this feature is beyond the scope of this
article, but a brief example sheds light on how these features can create
containers. Each kind of namespace segments a different part of the kernel.
The PID namespace, for example, prevents processes inside the namespace
from seeing other processes running in the kernel. As a result, those
processes believe that they are the only ones running on the computer. Each
namespace does the same thing for other areas of the kernel as well. The
mount namespace isolates the filesystem of the processes inside of it. The
network namespace provides a unique network stack to processes running
inside of them. The IPC, user, UTS and cgroup namespaces do the same for
those areas of the kernel as well. When the seven namespaces are combined,
the result is a container: an environment isolated enough to believe it is
a freestanding Linux system.
&lt;/p&gt;

&lt;p&gt;
Container frameworks will abstract the minutia of configuring namespaces
away from the user, but each framework has a different emphasis. Docker is
the most popular and is designed to run multiple copies of identical
containers at scale. LXC/LXD is meant to create containers easily that
mimic particular Linux distributions. In fact, earlier versions of LXC
included a collection of scripts that created the filesystems of popular
distributions. A third option is libvirt's lxc driver. Contrary to how
it may sound, libvirt-lxc does not use LXC/LXD at all. Instead, the
libvirt-lxc driver manipulates kernel namespaces directly. libvirt-lxc
integrates into other tools within the libvirt suite as well, so the
configuration of libvirt-lxc containers resembles those of virtual machines
running in other libvirt drivers instead of a native LXC/LXD container. It
is easy to learn as a result, even if the branding is confusing.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/running-gnome-container" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Wed, 07 Aug 2019 19:00:00 +0000</pubDate>
    <dc:creator>Adam Verslype</dc:creator>
    <guid isPermaLink="false">1340759 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Digital Will, Part I: Requirements</title>
  <link>https://www.linuxjournal.com/content/digital-will-part-i-requirements</link>
  <description>  &lt;div data-history-node-id="1340574" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/kyle-rankin" lang="" about="https://www.linuxjournal.com/users/kyle-rankin" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Kyle Rankin&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;Digital assets are becoming as important as physical assets, so how do you manage them after you die?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
When you lose a member of your family, you may find yourself at some point
thinking about your own mortality, which then may lead you to think through
preparations for your own death. I lost my father recently, but years
before his death, he set up a will that described how to manage his
estate, but he also made sure to share with me login details for his important
financial accounts so I would have access when the time came. When the time
did come to put his plans into practice, those details were
invaluable.
&lt;/p&gt;

&lt;p&gt;
All of this made me realize just how complicated it would be for someone to
manage my own accounts in the event of my death, especially considering how
much effort I've gone through to secure my computers and accounts. After
all, unlike my dad, I don't use the same password for everything. What I
realized I needed was the equivalent of a digital will: instructions and
credentials so my next of kin had everything they needed to access my
accounts and manage my affairs. In this first article of what will be a two-part
series, I describe the requirements and plans to create a digital
will in a way that would be manageable for my next of kin while also not
negatively affecting the security of my accounts. The second part of the
article will describe how I implemented these plans.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
Defining Terms&lt;/span&gt;

&lt;p&gt;
This digital will is based on many of the ideas behind a traditional will,
and I intend on borrowing a lot of the framework and terms instead of
"re-inventing the will". To get started, let me define a few terms, but I
should make it clear that I'm not an attorney, so these are just loose
definitions to describe how some common terms used in a will might be
applied to this digital will:
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/digital-will-part-i-requirements" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Fri, 07 Jun 2019 12:30:00 +0000</pubDate>
    <dc:creator>Kyle Rankin</dc:creator>
    <guid isPermaLink="false">1340574 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Build Your Own Internet Radio Receiver</title>
  <link>https://www.linuxjournal.com/content/build-your-own-internet-radio-receiver</link>
  <description>  &lt;div data-history-node-id="1340545" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/nick-tufillaro" lang="" about="https://www.linuxjournal.com/users/nick-tufillaro" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Nick Tufillaro&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;&lt;em&gt;Tune in to communities around the world with the push of a button.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
When I get home at night, I like to tune into the world with the push
of a button. I've lived in lots of different places—from Dunedin,
New Zealand, to Santa Fe, New Mexico—and in each town, I've come to love
a radio station (usually a community radio station) that embodies
the spirit of the place. With the push of a button, I can get a bit back
in sync with each of these places and also visit new communities, thanks
to internet radio.
&lt;/p&gt;

&lt;p&gt;
Why build your own internet radio receiver? One option, of course, is
simply to use an app for a receiver. However, I've found that the most common
apps don't keep their focus on the task at hand, and are increasingly
distracted by offering additional social-networking services. And besides,
I want to listen now. I don't want to check into my computer or phone,
log in yet again, and endure the stress of recalling YAPW (Yet Another
PassWord). I've also found that the current offering of internet radio
boxes falls short of my expectations. Like I said, I've lived in a lot
of places—more than two or four or eight. I want a lot of buttons, so I can
tune in to a radio station with just one gesture. Finally, I've noticed
that streams are increasingly problematic if I don't go directly to
the source. Often, streams chosen through a "middle man" start with
an ad or blurb that is tacked on as a preamble. Or sometimes the "middle man" might
tie me to a stream of lower audio quality than the best being served up.
&lt;/p&gt;

&lt;p&gt;
So, I turned to building my own internet radio receiver—one with lots
of buttons that allow me to "tune in" without being too pushy. In this
article,
I share my experience. In principle, it should be easy—you just need a Linux distro, a ship to sail her on and an external
key pad for a rudder. In practice, it's not too hard, but there are a
few obstacles along the course that I hope to help you navigate.
&lt;/p&gt;

&lt;p&gt;
My recipe list included the following:
&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;
A used notebook with an ultra low voltage
(Core 2 Duo) processor.&lt;/li&gt;

&lt;li&gt;
An audio interface with an optical TOSLINK.&lt;/li&gt;

&lt;li&gt;
pyradio: an open-source Python radio program.&lt;/li&gt;

&lt;li&gt;
An external keypad.&lt;/li&gt;&lt;/ol&gt;&lt;img src="https://www.linuxjournal.com/sites/default/files/styles/max_650x650/public/u%5Buid%5D/12693f1smaller.png" width="600" height="572" alt="""" class="image-max_650x650" /&gt;&lt;p&gt;
&lt;em&gt;Figure 1. My Hardware Setup&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
Why a notebook and not a Raspberry Pi or ship of a similar ilk? Mostly
due to time—my time in particular. It's not too hard to find a high quality
notebook about ten years old for about $50, so the cost is really not
that different, and I find the development platform to be much
quicker.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/build-your-own-internet-radio-receiver" hreflang="en"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 27 May 2019 11:00:00 +0000</pubDate>
    <dc:creator>Nick Tufillaro</dc:creator>
    <guid isPermaLink="false">1340545 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Testing Models</title>
  <link>https://www.linuxjournal.com/content/testing-models</link>
  <description>  &lt;div data-history-node-id="1339428" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/reuven-m-lerner" lang="" about="https://www.linuxjournal.com/users/reuven-m-lerner" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Reuven M. Lerner&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
In my last few articles, I've been dipping into the
waters of "machine learning"—a powerful idea that has been moving
steadily into the mainstream of computing, and that has the potential
to change lives in numerous ways. The goal of machine learning is
to produce a "model"—a piece of software that can make predictions
with new data based on what it has learned from old data.
&lt;/p&gt;

&lt;p&gt;
One common type of problem that machine learning can help solve
is classification. Given some new data, how can you categorize it? For
example, if you're a credit-card company, and you have data about a
new purchase, does the purchase appear to be legitimate or fraudulent?
The degree to which you can categorize a purchase accurately depends
on the quality of your model. And, the quality of your model will
generally depend on not only the algorithm you choose, but also the
quantity and quality of data you use to "train" that model.
&lt;/p&gt;

&lt;p&gt;
Implied in the above statement is that given the same input data,
different algorithms can produce different results. For this reason,
it's not enough to choose a machine-learning algorithm. You also
must test the resulting model and compare its quality against other
models as well.
&lt;/p&gt;

&lt;p&gt;
So in this article, I explore the notion of testing models. I show how
Python's scikit-learn package, which you can use to build and
train models, also provides the ability to test them. I also describe how
scikit-learn provides tools to compare model
effectiveness.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
Testing Models&lt;/span&gt;

&lt;p&gt;
What does it even mean to "test" a model? After all, if you have built
a model based on available data, doesn't it make sense that the model
will work with future data?
&lt;/p&gt;

&lt;p&gt;
Perhaps, but you need to check, just to be sure. Perhaps the algorithm
isn't quite appropriate for the type of data you're examining, or
perhaps there wasn't enough data to train the model well. Or, perhaps
the data was flawed and, thus, didn't train the model effectively.
&lt;/p&gt;

&lt;p&gt;
But, one of the biggest problems with modeling is that of
"overfitting". Overfitting means that the model does a great job of
describing the training data, but that it is tied to the training
data so closely and specifically, it cannot be generalized
further.
&lt;/p&gt;

&lt;p&gt;
For example, let's assume that a credit-card company wants to model
fraud. You know that in a large number of cases, people use credit
cards to buy expensive electronics. An overfit model wouldn't just
give extra weight to someone buying expensive electronics in its
determination of fraud; it might look at the exact price, location
and type of electronics being bought. In other words, the model will
precisely describe what has happened in the past, limiting its ability
to generalize and predict the future.
&lt;/p&gt;

&lt;p&gt;
Imagine if you could read letters that were only from a font you had
previously learned, and you can further understand the limitations of
overfitting.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/testing-models" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 29 Jun 2017 11:20:14 +0000</pubDate>
    <dc:creator>Reuven M. Lerner</dc:creator>
    <guid isPermaLink="false">1339428 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Is the Moon Waxing or Waning?</title>
  <link>https://www.linuxjournal.com/content/moon-waxing-or-waning</link>
  <description>  &lt;div data-history-node-id="1339414" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/dave-taylor" lang="" about="https://www.linuxjournal.com/users/dave-taylor" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Dave Taylor&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
In my &lt;a href="http://www.linuxjournal.com/content/current-phase-moon"&gt;last
article&lt;/a&gt;, I talked about the complications of
calculating the phase of the moon and decided simply to scrape the same &lt;a href="http://www.moongiant.com"&gt;website&lt;/a&gt; that Google uses.
&lt;/p&gt;

&lt;p&gt;
That site provides the current moon illumination level, which lets you break it
down into the phases of new moon, crescent, quarter, gibbous and full.
Amateur astronomers know that the fun part of tracking the moon's
phase is to understand whether it's "waxing" (growing more
illuminated) or "waning" (growing less illuminated).
&lt;/p&gt;

&lt;p&gt;
Although at any given moment the moon is illuminated based on its location,
and your location, relative to the sun, the full cycle of a moon phase
starts and ends with a new (0% illuminated) moon, and the full moon (100%
illuminated) is the mid-point of the journey.
&lt;/p&gt;

&lt;p&gt;
Therefore, to ascertain waxing or waning, all you need to do is know the
moon's illumination level today and either yesterday or tomorrow.
Fortunately, the Moon Giant website obligingly has the ability for you to ascertain
the illumination level for a specific date.
&lt;/p&gt;

&lt;p&gt;
A quick visit to the site with a regular web browser reveals that it works
using a date-based URL format like this:
http://www.moongiant.com/phase/11/6/2016.
&lt;/p&gt;

&lt;p&gt;
So, you can build the date URL for the day before today with a call to
the &lt;code&gt;date&lt;/code&gt; program. If you've got the GNU version of
&lt;code&gt;date&lt;/code&gt;, it's easy
to back up a day:


&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
$ date
Mon Nov  7 11:40:31 MST 2016
$ date -v -1d
Sun Nov  6 11:40:15 MST 2016
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
It turns out that you also can specify that you want to back up 24 hours,
although, of
course, the net result is the same:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
$ date -v -24H
Sun Nov  6 11:40:24 MST 2016
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
More important, you can pass &lt;code&gt;date&lt;/code&gt; a format string that you then
can evaluate with the &lt;code&gt;eval&lt;/code&gt; function, so you can set month, day and year for
yesterday in one easy step:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
$ eval $( date -v -1d +"mon=%m day=%d year=%Y" )
$ echo month = $mon, day = $day and year $year
month = 11, day = 06 and year 2016
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
It's quite a handy trick when you need to work with extracting specific elements
from date and 10x that when it also involves date math.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
Older Date Programs Are More Complicated&lt;/span&gt;

&lt;p&gt;
But, what if your version of &lt;code&gt;date&lt;/code&gt; doesn't include the
&lt;code&gt;-v&lt;/code&gt; flag and
doesn't have all these fancy features? Then, my friend, you are facing
a definite challenge. Date math is pretty easy, except for the edge
cases.
&lt;/p&gt;

&lt;p&gt;
That is, it's easy to extract the current month, day and year from even
the most rudimentary Linux version of &lt;code&gt;date&lt;/code&gt;, and it's obviously easy to
subtract one from the day, but what if it's the first of the month? Or
the first of the year?
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/moon-waxing-or-waning" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 13 Jun 2017 12:53:30 +0000</pubDate>
    <dc:creator>Dave Taylor</dc:creator>
    <guid isPermaLink="false">1339414 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>William Rothwell and Nick Garner's Certified Ethical Hacker Complete Video Course (Pearson IT Certification)</title>
  <link>https://www.linuxjournal.com/content/william-rothwell-and-nick-garners-certified-ethical-hacker-complete-video-course-pearson-it-</link>
  <description>  &lt;div data-history-node-id="1339319" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/james-gray" lang="" about="https://www.linuxjournal.com/users/james-gray" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;James Gray&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
Watch William Rothwell and Nick Garner's new &lt;em&gt;Certified Ethical
Hacker&lt;/em&gt;
(CEH) Complete Video Course and learn everything you need to know to ace the
CEH exam in less than 11 hours. 
&lt;/p&gt;

&lt;p&gt;
Divided into five modules and containing a complete
overview of the topics in the EC-Council Blueprint, Rothwell and Garner's
intermediate-level video-training course helps viewers master the essentials
needed to pass the exam. 
&lt;/p&gt;
&lt;img src="http://www.linuxjournal.com/files/linuxjournal.com/ufiles/imagecache/large-550px-centered/u1000009/12150f5.jpg" alt="" title="" class="imagecache-large-550px-centered" /&gt;&lt;p&gt;
The course commences with a general overview of
security essentials, followed by an exploration of system, network and web
services security, and a dive in to wireless and internet security. To test
one's chops, the course offers quizzes, exercises and two full practice
exams. By providing the breadth of coverage necessary to learn the full
security concepts behind the CEH exam, this video course helps prepare
viewers for a career as a security professional.
&lt;/p&gt;

&lt;p&gt;
The video course is published by &lt;a href="http://informit.com"&gt;Pearson IT Certification&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/william-rothwell-and-nick-garners-certified-ethical-hacker-complete-video-course-pearson-it-" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 20 Mar 2017 13:49:33 +0000</pubDate>
    <dc:creator>James Gray</dc:creator>
    <guid isPermaLink="false">1339319 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Flash ROMs with a Raspberry Pi</title>
  <link>https://www.linuxjournal.com/content/flash-roms-raspberry-pi</link>
  <description>  &lt;div data-history-node-id="1339301" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/kyle-rankin" lang="" about="https://www.linuxjournal.com/users/kyle-rankin" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Kyle Rankin&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
I previously wrote a series of articles about my experience flashing
a ThinkPad X60 laptop with Libreboot. After that, the Libreboot project
expanded its hardware support to include the ThinkPad X200 series,
so I decided to upgrade. The main challenge with switching over to the
X200 was that unlike the X60, you can't perform the initial Libreboot
flash with software. Instead, you actually need to disassemble the laptop
to expose the BIOS chip, clip a special clip called a Pomona clip to it
that's wired to some device that can flash chips, cross your fingers
and flash.
&lt;/p&gt;

&lt;p&gt;
I'm not generally a hardware hacker, so I didn't have any of the
special-purpose hardware-flashing tools that you typically would use to
do this right. I did, however, have a Raspberry Pi (well, many Raspberry
Pis if I'm being honest), and it turns out that both it and the Beaglebone
Black are platforms that have been used with flashrom successfully. So in
this article,
I describe the steps I performed to turn a regular
Raspberry Pi running Raspbian into a BIOS-flashing machine.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
The Hardware&lt;/span&gt;

&lt;p&gt;
To hardware-flash a BIOS chip, you need two main pieces of hardware: a
Raspberry Pi and the appropriate Pomona clip for your chip. The Pomona
clip actually clips over the top of your chip and has little teeth that
make connections with each of the chip's pins. You then can wire up the
other end of the clip to your hardware-flashing device, and it allows you
to reprogram the chip without having to remove it. In my case, my BIOS
chip had 16 pins (although some X200s use 8-pin BIOS chips), so I ordered
a 16-pin Pomona clip on-line at almost the same price as a Raspberry Pi!
&lt;/p&gt;

&lt;p&gt;
There is actually a really good guide on-line for flashing a number of
different ThinkPads using a Raspberry Pi and the NOOBS distribution; see
Resources if you want more
details. Unfortunately, that guide didn't exist when I first wanted to
do this, so instead I had to piece together what to do (specifically
which GPIO pins to connect to which pins on the clip) by combining
a general-purpose article on using flashrom on a Raspberry Pi with an
article on flashing an X200 with a Beaglebone Black. So although the guide I
link to at the end of this article goes into more depth and looks correct, I can't directly
vouch for it since I haven't followed its steps. The steps I list here
are what worked for me.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
Pomona Clip Pinouts&lt;/span&gt;

&lt;p&gt;
The guide I link to in the Resources section has a great graphic that goes into detail
about the various pinouts you may need to use for various chips. Not all
pins on the clip actually need to be connected for the X200. In my case,
the simplified form is shown in Table 1 for my 16-pin Pomona clip.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/flash-roms-raspberry-pi" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Mon, 06 Mar 2017 10:18:50 +0000</pubDate>
    <dc:creator>Kyle Rankin</dc:creator>
    <guid isPermaLink="false">1339301 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Mars Lander, Take II: Crashing onto the Surface</title>
  <link>https://www.linuxjournal.com/content/mars-lander-take-ii-crashing-surface</link>
  <description>  &lt;div data-history-node-id="1339298" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/dave-taylor" lang="" about="https://www.linuxjournal.com/users/dave-taylor" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Dave Taylor&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
&lt;a href="http://www.linuxjournal.com/content/lets-go-mars-martian-lander"&gt;In 
my last article&lt;/a&gt;, I spent almost the entire piece exploring gravitational
physics, of all unlikely topics. The focus was on writing a version of the
classic arcade game &lt;em&gt;Lunar Lander&lt;/em&gt;, but this time, it
would be landing a craft
on the red planet Mars rather than that pockmarked lump of rock orbiting
the Earth.
&lt;/p&gt;

&lt;p&gt;
Being a shell script, however, it was all about the physics, not about the
UI, because vector graphics are a bit tricky to accomplish within Bourne
Shell—to say the least!
&lt;/p&gt;

&lt;p&gt;
To make the solution a few dozen lines instead of a few thousand, I
simplify the problem to two dimensions and assume safe, flat landing
spaces. Then it's a question of forward velocity, which is easy to
calculate, and downward velocity, which is tricky because it has the
constant pull of gravity as you fire your retro rockets to compensate and
thereby avoid crashing onto the planet's surface.
&lt;/p&gt;

&lt;p&gt;
If one were working with Space X or NASA, there would be lots of factors to
take into account with a real Martian lander, notably the mass of the
spacecraft: as it burns fuel, the mass decreases, a nuance that the
gravitational calculations can't ignore.
&lt;/p&gt;

&lt;p&gt;
That's beyond the scope of this project, however, so I'm going to
use some highly simplified mathematics instead, starting with the one-dimensional problem of descent:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
speed = speed + gravity

altitude = altitude - speed
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
Surprisingly, this works pretty well, particularly when there's
negligible atmosphere. Landing on the Earth's surface has lots more
complexity with atmospheric drag and weather effects, but looking
at Mars, and not during its glory days as Barsoom, it's
atmosphere-free.
&lt;/p&gt;

&lt;p&gt;
In my last article, I presented figures using feet as a unit of measure, but
it's time to switch to metric, so for the simulation game, I'm using
Martian gravity = 3.722 meters/sec/sec. The spaceship will enter the
atmosphere at an altitude of 500 meters (about 1/3 mile), and players have
just more than 15 seconds to avoid crashing onto the Martian surface, with a
terminal velocity of 59m/s.
&lt;/p&gt;

&lt;p&gt;
Since I'm making game out of it, the calculations are
performed in one-second increments, meaning that you actually can use the
retro rockets at any point to compensate for the tug of gravity and
hopefully land, rather than crash into Mars!
&lt;/p&gt;

&lt;p&gt;
The equation changes only a tiny bit:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
speed = speed + gravity + thrust
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
Again, there are complex astro-mechanical formulas to figure out force
produced in a retro rocket burn versus fuel expended, but to simplify,
I'm assuming that fuel is measured in output force: meters of counter
thrust per second.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/mars-lander-take-ii-crashing-surface" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Thu, 02 Mar 2017 15:04:13 +0000</pubDate>
    <dc:creator>Dave Taylor</dc:creator>
    <guid isPermaLink="false">1339298 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Secret Agent Man</title>
  <link>https://www.linuxjournal.com/content/secret-agent-man</link>
  <description>  &lt;div data-history-node-id="1339297" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/kyle-rankin" lang="" about="https://www.linuxjournal.com/users/kyle-rankin" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;Kyle Rankin&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
It used to be that only the paranoid among us focused on strict security
practices, yet these days, it seems like people are stepping up their games
with respect to encryption, password policy and how they
approach their computers in general. Although I always have considered myself more inside
that paranoid camp than outside of it, I even have found myself stepping up
my game lately. Security is often at odds with convenience, yet whenever I
need a good example of better security practices that are
&lt;em&gt;more&lt;/em&gt; convenient than the alternative, I turn to SSH keys.
&lt;/p&gt;

&lt;p&gt;
With SSH keys, you generate a private and public key pair with the
&lt;code&gt;ssh-keygen&lt;/code&gt; command and distribute the public key to
servers to which you want to
connect. SSH keys use your private key to authenticate yourself instead
of a password on the remote server, so if you are one of those people who
are worried about SSH brute-forcing, if you use SSH keys, you can disable
password SSH authentication altogether and not care about those SSH
brute-force attempts you see in your logs. When I used to set up SSH key pairs, I
wouldn't provide a passphrase to unlock the key. Without a passphrase, I
could just &lt;code&gt;ssh&lt;/code&gt; in to a machine without typing any
sort of password—a case
where you can increase security against brute-force SSH attacks while also
increasing your convenience.
&lt;/p&gt;

&lt;p&gt;
Of course, the problem with skipping the passphrase when you generate SSH
keys is that all of your security relies on keeping your private key
(usually found at ~/.ssh/id_rsa or ~/.ssh/id_dsa) secret. If others were
able to get a copy of that file, they could log in to any machine to which you
distributed the public key. Lately I decided I didn't like that kind
of risk, so when I generate SSH keys, I now use a passphrase. This means
if others got my private key, they couldn't immediately use it, but it also
means I now have to type in a passphrase to use my SSH key. This is less
convenient, but I've found that by using SSH agent, I can get back to a similar
level of convenience but with a few added bonuses that I discuss in this
column.
&lt;/p&gt;

&lt;span class="h3-replacement"&gt;
SSH Agent&lt;/span&gt;

&lt;p&gt;
On most systems that use sudo, after you type in your sudo password, it is
cached for some period of time, so if you run a few sudo commands in a row,
you don't have to keep typing in your password. SSH agent works in a
similar way for SSH passphrases, caching your unlocked key in memory for a
defined period of time. This is particularly useful if, like me, you use
Git on a routine basis with SSH—it would be a pain to have to type in your
passphrase every time you do a git push or git pull. So for instance, if I
wanted to cache my passphrase for 15 minutes, I could type:

&lt;/p&gt;&lt;pre&gt;
&lt;code&gt;
$ ssh-add -t 15m
&lt;/code&gt;
&lt;/pre&gt;


&lt;p&gt;
Then after I provide my password a single time, it would be cached for the
remainder of SSH commands I run within that 15 minutes, after which it
would expire.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/secret-agent-man" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Tue, 28 Feb 2017 13:50:44 +0000</pubDate>
    <dc:creator>Kyle Rankin</dc:creator>
    <guid isPermaLink="false">1339297 at https://www.linuxjournal.com</guid>
    </item>
<item>
  <title>Natalie Rusk's Scratch Coding Cards (No Starch Press)</title>
  <link>https://www.linuxjournal.com/content/natalie-rusks-scratch-coding-cards-no-starch-press</link>
  <description>  &lt;div data-history-node-id="1339287" class="layout layout--onecol"&gt;
    &lt;div class="layout__region layout__region--content"&gt;
      
            &lt;div class="field field--name-node-author field--type-ds field--label-hidden field--item"&gt;by &lt;a title="View user profile." href="https://www.linuxjournal.com/users/james-gray" lang="" about="https://www.linuxjournal.com/users/james-gray" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;James Gray&lt;/a&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"&gt;&lt;p&gt;
The phrase "Learn to Program One Card at a Time" plays the role
of subtitle and friendly invitation from &lt;em&gt;Scratch Coding
Cards&lt;/em&gt;, a
colorful collection of activities that introduce children to creative
coding. 
&lt;/p&gt;

&lt;p&gt;
Developed by Natalie Rusk, research scientist in the Lifelong
Kindergarten Group at the MIT Media Lab, the resource consists of
illustrated activity cards that provide a playful entry point into
Scratch, the graphical programming language used by millions of children
around the world. The cards make it easy for kids to learn how to
create a variety of interactive projects, such as a racing game, an
animated interactive story, a virtual pet and much more. 
&lt;/p&gt;
&lt;img src="http://www.linuxjournal.com/files/linuxjournal.com/ufiles/imagecache/large-550px-centered/u1000009/12131f4.jpg" alt="" title="" class="imagecache-large-550px-centered" /&gt;&lt;p&gt;
Each card
features step-by-step instructions for beginners to start coding. The
front of the card shows an activity kids can do with Scratch, such as
animating a character or keeping score in a game. The back shows how to
snap together blocks of code to make the projects come to life. Along the
way, kids learn key coding concepts, such as sequencing, conditionals and
variables. Publisher &lt;a href="http://nostarch.com"&gt;No Starch Press&lt;/a&gt; recommends the coding activity
cards for sharing among small groups in homes, schools and after-school
programs.
&lt;/p&gt;&lt;/div&gt;
      
            &lt;div class="field field--name-node-link field--type-ds field--label-hidden field--item"&gt;  &lt;a href="https://www.linuxjournal.com/content/natalie-rusks-scratch-coding-cards-no-starch-press" hreflang="und"&gt;Go to Full Article&lt;/a&gt;
&lt;/div&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;

</description>
  <pubDate>Fri, 17 Feb 2017 17:02:19 +0000</pubDate>
    <dc:creator>James Gray</dc:creator>
    <guid isPermaLink="false">1339287 at https://www.linuxjournal.com</guid>
    </item>

  </channel>
</rss>
