<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GNU/LNX</title>
	<atom:link href="http://www.gnulnx.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gnulnx.net</link>
	<description>Freedom, with their exception.</description>
	<lastBuildDate>Sun, 05 Feb 2012 04:03:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Linux 802.1q VLAN Trunking</title>
		<link>http://www.gnulnx.net/2012/01/05/linux-802-1q-vlan-trunking/</link>
		<comments>http://www.gnulnx.net/2012/01/05/linux-802-1q-vlan-trunking/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 20:19:23 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[How To]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=247</guid>
		<description><![CDATA[This is mostly for future reference, but maybe you will find it useful. This is on an Ubuntu 10.04.3 LTS box. Cisco Setup All I am doing here is trunking one interface (G2/0/18) and restricting access to two vlans (101 and 102). switch#configure terminal Enter configuration commands, one per line. End with CNTL/Z. switch01(config)#interface G1/0/18 ]]></description>
			<content:encoded><![CDATA[<p>This is mostly for future reference, but maybe you will find it useful. This is on an Ubuntu 10.04.3 LTS box.</p>
<h2>Cisco Setup</h2>
<p>All I am doing here is trunking one interface (G2/0/18) and restricting access to two vlans (101 and 102).</p>
<pre>switch#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
switch01(config)#interface G1/0/18
switch01(config-if)#switchport trunk encapsulation dot1q
switch01(config-if)#switchport mode trunk
switch01(config-if)#switchport trunk allowed vlan 101,102
switch01(config-if)#exit
switch01(config)#exit
switch01#show running-config interface G1/0/18
Building configuration...

Current configuration : 167 bytes
!
interface GigabitEthernet1/0/18
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 101,102
 switchport mode trunk
end

switch01#</pre>
<h2>Linux Setup</h2>
<ol>
<li>Add the 8021q module to the kernel
<pre># modprobe 8021q</pre>
</li>
<li>Add the module to the /etc/modules file, so that it loads at next startup
<pre># echo 8021q &gt;&gt; /etc/modules</pre>
</li>
<li>Install the appropriate package
<pre># apt-get install vlan</pre>
</li>
<li>Configure the network. In my example, eth0 is connected to a trunk port on a Cisco switch, with vlans 101 and 102 trunked to it. eth1 is connected to a separate network and switch.
<pre># cat /etc/network/interfaces.

auto eth0.101
iface eth0.101 inet static
	address 172.17.101.9
	netmask 255.255.255.0
	network 172.17.101.0
	broadcast 172.17.101.255
	gateway 172.17.101.1
	vlan_raw_device eth0

auto eth0.102
iface eth0.102 inet static
	address 172.17.102.9
	netmask 255.255.255.0
	network 172.17.102.0
	broadcast 172.17.102.255
	vlan_raw_device eth0

auto eth1
iface eth1 inet static
	address 172.17.100.9
	netmask 255.255.255.0
	network 172.17.100.0
	broadcast 172.17.100.255</pre>
</li>
<li>Restart networking. I came across inconsistent results by using /etc/init.d/networking restart and the ifup and ifdown commands. While your mileage may vary, I just rebooted the box.</li>
<li>Make sure things are working. As you can see, eth0 does not have an ip address, though the vlan interfaces, eth0.101 and eth0.102, do.
<pre>kmjohnson@squid:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 14:fe:b5:2c:15:86
          inet6 addr: fe80::16fe:b5ff:fe2c:1586/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:23763 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10485 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3481376 (3.4 MB)  TX bytes:2500480 (2.5 MB)
          Interrupt:36 Memory:d6000000-d6012800 

eth1      Link encap:Ethernet  HWaddr 14:fe:b5:2c:15:88
          inet addr:172.17.100.9  Bcast:172.17.100.255  Mask:255.255.255.0
          inet6 addr: fe80::16fe:b5ff:fe2c:1588/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:973 errors:0 dropped:0 overruns:0 frame:0
          TX packets:257 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:75737 (75.7 KB)  TX bytes:29086 (29.0 KB)
          Interrupt:48 Memory:d8000000-d8012800 

eth0.101  Link encap:Ethernet  HWaddr 14:fe:b5:2c:15:86
          inet addr:172.17.101.9  Bcast:172.17.101.255  Mask:255.255.255.0
          inet6 addr: fe80::16fe:b5ff:fe2c:1586/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17260 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10350 errors:0 dropped:4 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2445291 (2.4 MB)  TX bytes:2400114 (2.4 MB)

eth0.102  Link encap:Ethernet  HWaddr 14:fe:b5:2c:15:86
          inet addr:172.17.102.9  Bcast:172.17.102.255  Mask:255.255.255.0
          inet6 addr: fe80::16fe:b5ff:fe2c:1586/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6503 errors:0 dropped:0 overruns:0 frame:0
          TX packets:101 errors:0 dropped:3 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:513299 (513.2 KB)  TX bytes:8438 (8.4 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:277 errors:0 dropped:0 overruns:0 frame:0
          TX packets:277 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:25230 (25.2 KB)  TX bytes:25230 (25.2 KB)

kmjohnson@squid:~$ ping 172.17.101.1
PING 172.17.101.1 (172.17.101.1) 56(84) bytes of data.
64 bytes from 172.17.101.1: icmp_seq=1 ttl=64 time=0.124 ms
^C
--- 172.17.101.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.124/0.124/0.124/0.000 ms
kmjohnson@squid:~$ ping 172.17.102.1
PING 172.17.102.1 (172.17.102.1) 56(84) bytes of data.
64 bytes from 172.17.102.1: icmp_seq=1 ttl=64 time=9.39 ms
^C
--- 172.17.102.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 9.391/9.391/9.391/0.000 ms
kmjohnson@squid:~$</pre>
</li>
</ol>
<h2>Issues</h2>
<p>I ran into an issue where when connecting to an interface that did not have a gateway defined (eth0.102), the packet was being dropped by the kernel.  To fix this, the following two lines were needed in /etc/sysctl.conf:</p>
<pre>
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2012/01/05/linux-802-1q-vlan-trunking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Environmental temperature monitoring with 1-Wire and Linux Part 1</title>
		<link>http://www.gnulnx.net/2011/12/21/environmental-temperature-monitoring-with-1-wire-and-linux-part-1/</link>
		<comments>http://www.gnulnx.net/2011/12/21/environmental-temperature-monitoring-with-1-wire-and-linux-part-1/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 04:32:40 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=238</guid>
		<description><![CDATA[After toying with the idea for a couple of years, I finally got started on setting up a 1-Wire network in my house to collect temperatures in each of my rooms.  The long delay in getting started with this project is almost entirely from having trouble in finding definitive information regarding what I needed, so ]]></description>
			<content:encoded><![CDATA[<p>After toying with the idea for a couple of years, I finally got started on setting up a 1-Wire network in my house to collect temperatures in each of my rooms.  The long delay in getting started with this project is almost entirely from having trouble in finding definitive information regarding what I needed, so I hope to accomplish that here.</p>
<h2>Overview</h2>
<p>A 1-Wire network is pretty simple: Connect a 1-Wire adapter to a PC, and connect that adapter to the network, be it a hub which connects multiple 1-Wire network segments, or a single 1-Wire run, as you can have multiple 1-Wire devices on a single run.</p>
<p>My setup looks like this:</p>
<p>Server &#8211; <a href="http://www.hobby-boards.com/catalog/product_info.php?products_id=28">1-Wire Serial Adapter</a> &#8211; <a href="http://www.hobby-boards.com/catalog/product_info.php?products_id=1561">6 Channel Hub</a> &#8211; Two <a href="http://www.hobby-boards.com/catalog/product_info.php?products_id=93">DS18S20</a>s (one on two of the 6 channels of the hub, this leaves me room to expand 4 more channels.  You can also daisy-chain multiple sensors on a single run).</p>
<p>I am using standard CAT5e Eithernet cable for my 1-Wire network; the DS18S20 has 3 pins, two of which are used.  The first pin connects to the white-green wire, and the second to the blue wire.  I will add some more info here later, but it is really that simple.</p>
<h2>Connecting it to your PC</h2>
<p>I am running Linux on my server.  After wiring up the network and connecting it to the serial adapter, and the adapter to my PC, it was time to get started.</p>
<h3>Install digitemp</h3>
<p>Digitemp is used to communicate with 1-Wire networks, it has been around for a while, and it works.</p>
<pre>sudo apt-get install digitemp</pre>
<h3>Make sure everything works</h3>
<ol>
<li>We&#8217;re using a DS9097U serial adapter, so I symlinked the binary for ease of use.
<pre>ln -s /usr/bin/digitemp_DS9097U /usr/local/bin/digitemp</pre>
</li>
<li>Setup the initial config file. My serial adapter was on /dev/ttyS0, your&#8217;s may be on /dev/ttyS1.
<pre>digitemp -i -s /dev/ttyS0 -c /usr/local/etc/digitemp.conf</pre>
</li>
<li>Get some actual data.
<pre>digitemp -c /usr/local/etc/digitemp.conf -a</pre>
</li>
</ol>
<p>That third line should produce output similar to this:</p>
<pre>kjohnson@zm:~$ digitemp -c /usr/local/etc/digitemp.conf -a
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Dec 21 23:09:35 Sensor 0 C: 15.44 F: 59.79
Dec 21 23:09:36 Sensor 1 C: 23.75 F: 74.75</pre>
<h3>Automate it</h3>
<p>Super! Things work.  Now I&#8217;d like to start storing this data in a database, so that I can do neat things with it later (like trending graphs).  Make sure mysql is installed (apt-get install mysql-server).  I am using cron to call a perl script which calls digitemp and stores the data in a database (apt-get install libdbi-perl libdbd-mysql-perl)</p>
<pre>#!/usr/bin/perl

use strict;
use warnings;
use DBI;

my $dbh = DBI-&gt;connect('DBI:mysql:temperature', 'temp', 'password') or die "Could not connect to db: $DBI::errstr";

my @sensors = ( # Digitemp returns sensors numerically, so I am naming them here; the array index matches up to that which digitemp returns.
 'Workshop',
 'Computer Room'
);
my $dt = '/usr/local/bin/digitemp -q -c /usr/local/etc/digitemp.conf';
my $s = 0;      # Start at sensor 0

foreach my $sensor (@sensors) { # For each sensor
 my $date = time;               # Get the current date
 my $temp = get_temp($s);       # Assign the return value of get_temp subroutine to $temp

 insert($s, $sensor, $date, $temp);     # Call the insert subroutine with the relevant data

 $s++;  # Move on the next sensor
}

sub get_temp {
 my $sensor = $_[0];    # Sensor ID
 my $temp = "$dt -t $sensor -o 3"; # Digitemp command to call
 chomp($temp = `$temp | awk '{print \$2}'`);    # Actually call the command.  Chomp removes the new line.
 return $temp;  # Return the temperature to whatever called this subroutine.
}

sub insert {
 my $sensor_id = $_[0];
 my $sensor_name = $_[1];
 my $date = $_[2];
 my $temp = $_[3];
 my $sth = $dbh-&gt;prepare("INSERT INTO temperature (sensor_id, sensor_name, time, temperature) VALUES ($sensor_id, '$sensor_name', '$date', $temp)");
 $sth-&gt;execute();
}</pre>
<p>Now just put this in a cronjob to be called every 5 minutes, and you&#8217;re golden!</p>
<pre>kjohnson@zm:~$ crontab -l
*/5 * * * * /home/kjohnson/1wire.pl
kjohnson@zm:~$</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2011/12/21/environmental-temperature-monitoring-with-1-wire-and-linux-part-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scraping Amazon S3 files with Ruby</title>
		<link>http://www.gnulnx.net/2011/06/13/scraping-amazon-s3-files-with-ruby/</link>
		<comments>http://www.gnulnx.net/2011/06/13/scraping-amazon-s3-files-with-ruby/#comments</comments>
		<pubDate>Mon, 13 Jun 2011 15:56:16 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[How To]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=231</guid>
		<description><![CDATA[Below is a pretty simple ruby script for parsing files uploaded to an Amazon S3 bucket and inserting the file&#8217;s information into a MySQL database. #!/usr/local/bin/ruby require 'rubygems' require 'aws/s3' require 'mysql' require 'lockfile' begin Lockfile.new('/tmp/scraper.lock', :retries => 0) do # Setup the lock file my = Mysql::new("localhost", "nfssupport", "password", "upload_files") # Setup the MySQL ]]></description>
			<content:encoded><![CDATA[<p>Below is a pretty simple ruby script for parsing files uploaded to an Amazon S3 bucket and inserting the file&#8217;s information into a MySQL database.</p>
<pre>
#!/usr/local/bin/ruby

require 'rubygems'
require 'aws/s3'
require 'mysql'
require 'lockfile'

begin
 Lockfile.new('/tmp/scraper.lock', :retries => 0) do # Setup the lock file

         my = Mysql::new("localhost", "nfssupport", "password", "upload_files") # Setup the MySQL connection
         q = my.query("Select FileName, FileModified from files") # Setup the MySQL query
         db = Array.new # Create the array for the MySQL file list
         q.each_hash do |f| # For each file in the DB
                 db << "#{f['FileName']} - #{f['FileModified']}" # Put it into the array
         end

         AWS::S3::Base.establish_connection!( # Create the S3 connection
                 :access_key_id      => 'access_key_id',
                 :secret_access_key  => 'secret_access_key'
         )
         files = AWS::S3::Bucket.objects( # Put the S3 files into the files array
                 'domain-tld',
                 :prefix => 'uploads/user@domain.tld/uuid'
         )

         files.each do |file| # For each S3 file
                 t = Time.parse(file.about['last-modified'])
                 file_date = "#{t.year}#{sprintf('%02d',t.month)}#{sprintf('%02d',t.day)}"
                 file_name = file.key.split('/',4).last.gsub(/^(\d+\-)/,'')
                 file_modified = file.about['last-modified'].split(' ',5).last

                if !db.include? "#{file_name} - #{file_modified}" # If file not in DB
                         st = my.prepare("insert into files (FileName, FileDate, FileModified, FileLink, FileDescription, FileSize) VALUES (?, ?, ?, ?, ?, ?)
")
                         st.execute(file_name, file_date, file_modified, "https://uploads.domain.com/download/#{file.key.split('/',3).last}", file.metada
ta['x-amz-meta-description'], file.about['content-length']) # Insert it
                         st.close
                end
         end
 end

rescue Lockfile::MaxTriesLockError => e
        puts "Scraper is already running!"
end
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2011/06/13/scraping-amazon-s3-files-with-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To: Download files from Amazon S3 using perl and Amazon::S3</title>
		<link>http://www.gnulnx.net/2011/03/04/how-to-download-files-from-amazon-s3-using-perl-and-amazons3/</link>
		<comments>http://www.gnulnx.net/2011/03/04/how-to-download-files-from-amazon-s3-using-perl-and-amazons3/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 14:24:47 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[How To]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=222</guid>
		<description><![CDATA[After having such a hard time finding (m)any good examples online, this article is going to explain how to use perl to connect to Amazon&#8217;s S3 service to download files. I am by no means a perl expert, so take the below code with a pound of salt. This example assumes that you have already ]]></description>
			<content:encoded><![CDATA[<p>After having such a hard time finding (m)any good examples online, this article is going to explain how to use perl to connect to Amazon&#8217;s S3 service to download files.  I am by no means a perl expert, so take the below code with a pound of salt.  This example assumes that you have already a working Amazon S3 service, and the appropriate keys.</p>
<p>This code is used to download files which our customer&#8217;s upload to our support site.  The files are downloaded and stored in a directory by date (YYYYMMDD).  We have a number of different users and as such only want to download the files for a specific user ($prefix).</p>
<p>The first thing that you will need to do is to install the Amazon::S3 CPAN module with a command similar to:</p>
<pre>cpan -i Amazon::S3</pre>
<p>Now for the code:</p>
<pre>
#!/usr/bin/perl

use strict;
use warnings;
use Amazon::S3;

## Amazon S3 Stuff ##
my $aws_access_key_id     = 'aws_access_key_id';
my $aws_secret_access_key = 'aws_secret_access_key';
my $bucket = 'bucket-name';  # The bucket name that files are uploaded to.
my $prefix = 'uploads/bucket-name@domain.tld/uuid';  # We only want to get the files that were uploaded for a specific user.
my $http_prefix = 'https://uploads.domain.tld/download/uuid/';  # I use this string to build the URL
## Amazon S3 Stuff ##

## Script Variables ##
my $directory = '/zstore/uploads/';  # Top level of where to save files to
my $logfile = $directory . "scrape.log";  # Where to log the file downloads to.
## Script Variables ##

open(my $fh, "+>>", $logfile);  # Open the file handle for writing logs

my $s3 = Amazon::S3->new({  # This sets up the Amazon S3 connection.
 aws_access_key_id      => $aws_access_key_id,
 aws_secret_access_key  => $aws_secret_access_key
});

print $fh localtime() . ": Getting file list...\n";

my $files = $s3->list_bucket({  # This gets the entire list of files under the $prefix in the $bucket, or dies with an error.  $files is a multidimensional hash.
 bucket => $bucket,
 prefix => $prefix
}) or die $s3->err . ": " . $s3->errstr;

print $fh localtime() . ": Got file list...\n";                 # If we have made it this far, we now have the entire list of files.

foreach my $file ( @{ $files->{keys} } ) {                      # $file is a hash of arrays of hashes, AKA multidimensional hash.
 my $file_name = substr($file->{key}, 69);                      # 20110224110053-file.tar.gz
 my $file_true_name = substr($file->{key}, 84);                 # file.tar.gz
 my $file_date = substr($file->{key}, 69, 8);                   # 20110224
 my $sub_directory = $directory . $file_date;                   # /zstore/uploads/20110224
 my $file_path = $sub_directory . '/' . $file_true_name;        # /zstore/uploads/20110224/file.tar.gz
 my $url = $http_prefix . $file_name;                           # $url is the actual url to the file

 unless (-d $sub_directory){                                    # Unless the directory is already created
  print $fh localtime() . ": Creating $sub_directory...\n";     # Log that we are creating the directory
  mkdir($sub_directory);                                        # And create that directory
 }

 unless (-e $file_path) {                                       # Unless the file has already been downloaded
  print $fh localtime() . ": Fetching $file_name...\n";         # Log that we are fetching the file
  my $line = system("fetch -mq -o '$file_path' '$url'");        # Actually download the file, assigning the return code of `fetch` to $line
  if ($line == 0) {                                             # If the file is successfully downloaded
   print $fh localtime() . ": Succesfully got $file_path...\n"; # Log it
  } else {                                                      # Else
   print $fh localtime() . ": Problem getting $file_path...\n"; # Could not fetch it for whatever reason.  Move on.
  }
 }
}
print $fh localtime() . ": Exiting!\n\n";                       # We've went through the entire file list.  Log it.
close($fh);                                                     # Close the file handle.
</pre>
<p>If you spot any errors or have any questions, comments or feedback, please post a comment!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2011/03/04/how-to-download-files-from-amazon-s3-using-perl-and-amazons3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Improvements to ZoneMinder&#8217;s infinite scroll events list: pagemarks</title>
		<link>http://www.gnulnx.net/2010/09/09/improvements-to-zoneminders-infinite-scroll-events-list-pagemarks/</link>
		<comments>http://www.gnulnx.net/2010/09/09/improvements-to-zoneminders-infinite-scroll-events-list-pagemarks/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 13:38:16 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=203</guid>
		<description><![CDATA[I&#8217;ve been spending a lot of time working on my new ZoneMinder skin lately, specifically the Events page. While I implemented infinite scrolling a while back, I felt like the results (&#8220;events&#8221;) were missing context, and that the lack of pages was taking something away from navigation. Luckily, I came across Travis B. Isaacs&#8217; Improving ]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been spending a lot of time working on my new ZoneMinder skin lately, specifically the Events page.  While I implemented infinite scrolling a while back, I felt like the results (&#8220;events&#8221;) were missing context, and that the lack of pages was taking something away from navigation.  Luckily, I came across Travis B. Isaacs&#8217; <a href="http://travisisaacs.com/2008/02/24/improving-on-infinite-scrolling">Improving on Infinite Scrolling</a> idea.  Here is the result:</p>
<p><img  src="/images/events_is_pagemark.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2010/09/09/improvements-to-zoneminders-infinite-scroll-events-list-pagemarks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Beware of Velociraptor</title>
		<link>http://www.gnulnx.net/2010/09/02/beware-of-velociraptor/</link>
		<comments>http://www.gnulnx.net/2010/09/02/beware-of-velociraptor/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 16:44:16 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=196</guid>
		<description><![CDATA[So I was nearing completion of the privacy fence that I was building for my back yard. I have a dog, and instead of going the the traditional &#8220;Beware of Dog&#8221; route, I wanted to do something a little bit more creative, so I went over to buildasign.com and designed my own sign: I couldn&#8217;t ]]></description>
			<content:encoded><![CDATA[<p>So I was nearing completion of the privacy fence that I was building for my back yard.  I have a dog, and instead of going the the traditional &#8220;Beware of Dog&#8221; route, I wanted to do something a little bit more creative, so I went over to buildasign.com and designed my own sign:</p>
<p><img src="/images/BoV.jpg" alt="Beware of Velociraptor" /><br />
I couldn&#8217;t find any silhouetted-pictures of a Velociraptor, so I found nice side-view picture and edited it myself.</p>
<p>Well, the sign arrived yesterday:</p>
<p><img src="/images/bov_fence.jpg" alt="Beware of Velociraptor sign on my fence" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2010/09/02/beware-of-velociraptor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diskless XBMC HTPC with FreeBSD, NFS, pfSense and PXE</title>
		<link>http://www.gnulnx.net/2010/08/17/diskless-xbmc-htpc-with-freebsd-nfs-pfsense-and-pxe/</link>
		<comments>http://www.gnulnx.net/2010/08/17/diskless-xbmc-htpc-with-freebsd-nfs-pfsense-and-pxe/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 18:37:43 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=84</guid>
		<description><![CDATA[I have just finished setting up a new XMBC HTPC for my living room; I will walk you through this step-by-step so that you can set one up for yourself.  At over 1,700 words, this is a fairly lengthy tutorial; I have separated the steps into the correct order and have made them as easy ]]></description>
			<content:encoded><![CDATA[<p><img style="display: inline; width: 75%;" src="/wp-content/gallery/xbmc_confluence_skin-512x288.jpg" alt="XBMC Confluence Skin" /> I have just finished setting up a new XMBC HTPC for my living room; I will walk you through this step-by-step so that you can set one up for yourself.  At over 1,700 words, this is a fairly lengthy tutorial; I have separated the steps into the correct order and have made them as easy to follow as possible.</p>
<ol>
<li><a href="#intro">Introduction</a></li>
<li><a href="#setupbios">Setup BIOS</a></li>
<li><a href="#setupdhcp">Setup DHCP Server</a></li>
<li><a href="#setupfbsd">Setup FreeBSD Server</a></li>
<li><a href="#install">Install XBMC-Live (Linux)</a></li>
<li><a href="#copy">Copy XBMC to NFS Server</a></li>
<li><a href="#setupxbmc">Setup XBMC</a></li>
<li><a href="#caveats">Caveats</a></li>
</ol>
<p>This will be broken down into a number of smaller steps.  First, we will setup the BIOS of the HTPC.  Next, we will want to setup your DHCP server for PXE / Network booting and then setup your FreeBSD server.  Once your &#8216;backends&#8217; are setup, it is time to configure your HTPC (frontend).  This will consist of installing XBMC-Live, copying XBMC to your NFS server (FreeBSD), and then configuring a small number of XBMC options.  Finally, there are a number of caveats to address.</p>
<h3><a name="intro">Introduction</a></h3>
<p>I decided to go with XBMC instead of MythTV as I 1) do not have cable and thus have no need for live TV recording and 2) have only one frontend, so I do not need the master / slave setup that MthTV has.</p>
<p>After about a week of research, I decided to go with the following hardware:</p>
<ol>
<li><a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16813131653">ASUS AT3IONT-I</a><br />
This is an amazing little board.  I have always had good experiences with Asus.  It should be noted that the heatskin gets very hot even when the system is idling.  You may opt to place a 40mm fan on the heatsink, as I did.</li>
<li><a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16820134718">Kingston KVR1066D3N7K2/4G</a><br />
I have always had good experiences with Kingston RAM.</li>
<li><a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16811108222">IN WIN IW-BQ656 Black Mini-ITX</a><br />
If you are used to HTPCs the size of a Revo, than this box will seem huge.  But for what you&#8217;re packing, it is nicely sized.  It should be noted that this case has an extra inch or so of height for a 2.5&#8243; HDD and slim CDROM.  Since we&#8217;ll be using neither, feel free to find a case that better suits your environment, if appropriate.</li>
</ol>
<h3><a name="setupbios">Setup BIOS of HTPC</a></h3>
<ol>
<li>Advanced -&gt; CPU Configuration -&gt; Hyper Threading Technology: Disabled<br />
I decided to disable Hyper Threading to further reduce the power requirements and heat generation of the box.  Watching Avatar in 1080p, <strong>without Hyper Threading, my CPU load was at 0.01</strong>.  You neither need nor will miss this feature.</li>
<li>Advanced -&gt; Chipset -&gt; MCP7A Configuration -&gt; iGPU Frame Buffer Detect: Disabled</li>
<li>Advanced -&gt; Chipset -&gt; MCP7A Configuration -&gt; iGPU Frame buffer Size: 512MB</li>
<li>Advanced -&gt; Onboard Devices Configration -&gt; Front Panel Select: HD Audio<br />
While I use HDMI for both audio and video, this feature may be useful to you.</li>
<li>Advanced -&gt; Onboard Devices Configration -&gt;LAN Option ROM: Enabled</li>
<li>Advanced -&gt; PCIPnP -&gt; Plug And Play O/S: Yes</li>
<li>Power -&gt; ACPI 2.0 Support: Enabled</li>
<li>Power -&gt; ACPI APIC support: Enabled</li>
<li>Tools -&gt; Express Gate: Disabled</li>
</ol>
<p>You may notice that, with the above settings and 4GB installed RAM, POST will report &#8220;<strong>RAM:  3072 OK</strong>&#8220;.  This is because the BIOS is allocating ~1GB RAM to the GPU.  Linux will also report 3072MB of RAM.  <strong>This is normal</strong>.</p>
<h3><a name="setupdhcp">Configure DHCP for PXE / Network Booting</a></h3>
<p>You will need to configure your DHCP server for PXE / Network booting.  This will allow your front end to obtain an IP address and load the appropriate files to allow the system to boot the operating system over your network.  While the instructions below are for PFSense, the setup should be very similar for other systems.</p>
<ol>
<li>Services -&gt; DHCP Server</li>
<li>Click &#8220;Advanced &#8211; Show Network Booting&#8221;</li>
<li>Check &#8220;Enable Network Booting&#8221;</li>
<li>Enter the IP address of your file server into the first box.</li>
<li>Enter &#8220;PXEClient/pxelinux.0&#8243; into the second box.</li>
<li>Click &#8220;Save&#8221;</li>
</ol>
<h3><a name="setupfbsd">Setup FreeBSD</a></h3>
<p>I use FreeBSD for my home file / database / web / whatever server.  FreeBSD has an amazing technology called ZFS.  ZFS is a combined file system and logical volume manager which allows you to dynamically create filing systems, snapshots, rollbacks, and a whole slew of other neat things.  If you&#8217;re generally a GNU/Linux guy and am used to using LVM  and / or MDADM, I recommend you try out FreeBSD with ZFS.</p>
<p>ANYWAY, Here we will setup our tftp server (tftpd) and share out some folders with NFS.  While you do not need to use a FreeBSD backend, this tutorial assumes that you are, and that you have already created your filing systems.</p>
<h4>Setup NFS shares</h4>
<p>The home for our XBMC install will be /tank/xbmc.  tftpd will serve  files from /tftpboot.  Our media will be stored in /tank/media.</p>
<ol>
<li>echo &#8216;nfs_server_enable=&#8221;YES&#8221;&#8216; &gt;&gt; /etc/rc.conf</li>
<li>echo &#8216;rpcbind_enable=&#8221;YES&#8221;&#8216; &gt;&gt; /etc/rc.conf</li>
<li>echo &#8216;mountd_enable=&#8221;YES&#8221;&#8216; &gt;&gt; /etc/rc.conf</li>
<li>echo &#8216;mountd_flags=&#8221;-r&#8221;&#8216; &gt;&gt; /etc/rc.conf</li>
<li>vi /etc/exports
<pre>/tank/xbmc -maproot=root
/tank/media -maproot=root</pre>
</li>
<li>/etc/rc.d/mountd start<br />
<strong>Protip:</strong> If you are using FreeBSD 7.3 or 8.1, you may use &#8220;service&#8221; in place of &#8220;/etc/rc.d&#8221;, so the above command would look like &#8220;service nfsd start&#8221;</li>
<li>/etc/rc.d/rpcbind start</li>
<li>/etc/rc.d/nfsd start</li>
</ol>
<p>Executing &#8220;<strong>showmount -e</strong>&#8221; should now display your NFS-exported folders.</p>
<h4>Setup tftp server</h4>
<p>If you recall in the previous step of setting up the PXE server, we  had to enter a path to &#8220;PXEClient/pxelinux.0&#8243;.  This file is served via  tftp and is what instructs the PXE-booting (in this case, our HTPC)  system to load the appropriate GNU/Linux files and correctly boot.</p>
<ol>
<li>Edit <strong>vi /etc/inetd.conf</strong> and uncomment the following line:<br />
<code>tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot</code></li>
<li><strong>echo &#8216;ftpd_enable=&#8221;YES&#8221;&#8216; &gt;&gt; /etc/rc.conf</strong></li>
<li>Start ftpd<br />
<strong>/etc/rc.d/ftpd start</strong></li>
</ol>
<p>You should now be able to test that your tftp server is running by executing &#8220;<strong>ftp localhost</strong>&#8221; from the command line.</p>
<h4>Configure tftp files</h4>
<p>When we are finished, the directory structure of our tftp server will look like this:</p>
<pre>cosmos# ll -RF /tftpboot/
total 2
drwxr-xr-x  3 root  wheel  512 Aug  7 10:25 PXEClient/

/tftpboot/PXEClient:
total 11730
-rw-r--r--  1 root  wheel  8047310 Aug  7 10:25 initrd.img
-rw-r--r--  1 root  wheel    14776 Jan 22  2010 pxelinux.0
drwxr-xr-x  2 root  wheel      512 Jan  5  2002 pxelinux.cfg/
-rw-r--r--  1 root  wheel  3892032 Aug  7 10:25 vmlinuz

/tftpboot/PXEClient/pxelinux.cfg:
total 2
-rw-r--r--  1 root  wheel  139 Aug 13 23:31 default</pre>
<ol>
<li>mkdir -p /tftpboot/PXEClient</li>
<li>cd /tftpboot/PXEClient</li>
<li>fetch http://archive.ubuntu.com/ubuntu/dists/karmic/main/installer-amd64/current/images/netboot/pxelinux.0</li>
<li>mkdir pxelinux.cfg</li>
<li>cd pxelinux.cfg</li>
<li>vi default
<pre>LABEL linux
KERNEL vmlinuz
APPEND xbmc=autostart root=/dev/nfs initrd=initrd.img vga=788 nfsroot=192
.168.9.10:/tank/xbmc ip=dhcp ro</pre>
</li>
</ol>
<p><strong>Be sure to replace 192.168.9.10 with the IP address of your FreeBSD Server!</strong></p>
<h3><a name="install">Install XBMC-Live</a></h3>
<p>A hard disk is required for this step.  After the system is installed, we&#8217;ll be copying the files off to our NFS server, at which point you can remove the hard disk and disable the controller.  If you have ever installed Ubuntu, the XBMC-Live install will seem very familiar.  If you haven&#8217;t, the install will seem very easy!</p>
<ol>
<li>Download and burn CD.<br />
I am using the xbmc-9.11-live-repack version for this tutorial, which is linked from the &#8220;Live&#8221; link at http://xbmc.org/download/</li>
<li>Boot from CD</li>
<li>From CD menu, choose &#8220;<strong>Install XBMCLive to Disk</strong>&#8221;<br />
We must first install to the hard disk.  Later we will move the system to a NFS share for diskless PXE booting.</li>
<li>Follow the prompts to progress through setup&#8230;</li>
<li>When you reach the partition disks part of the setup, choose &#8220;<strong>Guided &#8211; use entire disk</strong>&#8221;<br />
The disk layout does not matter as it is only temporary.</li>
<li>Choose &#8220;Yes&#8221; to &#8220;Write the changes to disks?&#8221;.</li>
<li>Create your user account.  You&#8217;ll be using this account if / when you need to SSH into your media center for remote (read: couch) administration.</li>
<li>Remove CD and reboot</li>
</ol>
<p>At this point, XBMC should boot and you should have a fully-functional HTPC.  The next step is to copy the operating system to a remote server so that we can remove the local hard drive and network boot.</p>
<h3><a name="copy">Copy XBMC to Server</a></h3>
<p>This part of this how-to is based off of the guide at <a href="http://hype-o-thetic.com/2009/09/20/diskless-htpc-using-dd-wrt-pxe-xbmc-and-freenas-tftp-nfs/">http://hype-o-thetic.com/2009/09/20/diskless-htpc-using-dd-wrt-pxe-xbmc-and-freenas-tftp-nfs/</a>, with some modifications.</p>
<h4>Copy the files to the server</h4>
<p>Perform this step on the HTPC.</p>
<ol>
<li>sudo -s</li>
<li>apt-get update</li>
<li>apt-get install nfs-common portmap</li>
<li>mkdir /mnt/tmp</li>
<li>mkdir /mnt/nfs</li>
<li>mount /dev/sda1 /mnt/tmp</li>
<li>mount 192.168.9.10:/tank/xbmc /mnt/nfs<br />
<strong>Make sure to change the IP address!</strong></li>
<li>cp -a /mnt/tmp/* /mnt/nfs/<br />
This will take up to 10 or so minutes, so be patient.</li>
</ol>
<h4>Change root directory</h4>
<p>Perform this step on the HTPC.</p>
<ol>
<li>chroot /mnt/nfs</li>
<li>mount -t proc proc proc<br />
This command may cause your SSH / terminal session to &#8216;hang&#8217;.  That is OK &#8211; just open a new SSH or terminal connection to the box and proceed.</li>
</ol>
<h4>Edit some files</h4>
<p>Perform this step on the HTPC</p>
<ol>
<li>chroot /mnt/nfs</li>
<li>Change BOOT=local to BOOT=nfs<br />
<strong>vi etc/initramfs-tools/initramfs.conf</strong></li>
<li>Updated initrd.img<br />
<strong>update-initramfs -u</strong></li>
<li>Edit etc/fstab to point to the new NFS root.
<ol>
<li><strong>vi /etc/fstab</strong><br />
Replace the &#8220;/&#8221; line with this one:</li>
<li><strong>/dev/nfs    /    nfs    defaults    0    0</strong></li>
</ol>
</li>
</ol>
<h4>Copy the new kernel image files to the tftp server</h4>
<p>Perform this step on the FreeBSD server</p>
<ol>
<li><strong>cp /tank/xbmc/vmlinuz /tftpboot/PXEClient/</strong></li>
<li><strong>cp /tank/xbmc/initram.img /tftpboot/PXEClient/</strong></li>
</ol>
<p>Now go ahead and turn off your frontend, remove the hard disk, and set your network card to be the first boot device.  With any luck, XBMC should boot right up, over the network!</p>
<h3><a name="setupxbmc">Configure XBMC</a></h3>
<p>The first thing that I recommend you do is to snapshot your system so that you can easily revert back in the future.  I have had bad experiences in upgrading xbmc and the underlying OS and have been fortunate enough to have snapshots to roll back to.</p>
<h4>Snapshot your OS</h4>
<p>Perform this step on the FreeBSD server</p>
<ol>
<li>snapshot -r tank/xbmc@postinstall</li>
</ol>
<h4>Mount NFS Shares</h4>
<p>We have already setup our NFS shares on the FreeBSD box &#8211; now we will mount them on our frontend so that we can access our media content.  This step can be performed either by SSH to the frontend, or by opening a terminal (after XBMC boots up, press CTRL+ALT+F2).</p>
<ol>
<li>sudo -s</li>
<li>mkdir /media/movies</li>
<li>vi /etc/fstab
<pre>192.168.9.10:/tank/media        /media/movies   nfs     default 0       0</pre>
</li>
<li>mount -a</li>
</ol>
<h3><a name="caveats">Caveats</a></h3>
<p>While the majority of this setup goes without issue, there are a couple things to address.</p>
<h4>smbus error</h4>
<p>While booting, or in dmesg, you will see a message similar to &#8220;nForce2_smbus conflicts with ACPI region.&#8221;  The proposed fix for this is to add &#8220;acpi_enforce_resources=lax&#8221; as a kernel boot parameter.  While this will change the error message, it will not fix the problem.  I am working on a fix for this.</p>
<h4>Fan</h4>
<p>Even with Hyper Threading disabled, the passively-cooled CPU still runs very hot.  You may or may not require a fan.  I screwed a 40mm fan to the heat sink, which did the job.</p>
<h3>In closing,</h3>
<p>This tutorial was written in the hope that it will help others, as the information for such a setup is spread around many places, and also requires a lot of trial-and-error.  If you find that I have overlooked something, or if you have any ideas for improvement, feel free to leave some feedback!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2010/08/17/diskless-xbmc-htpc-with-freebsd-nfs-pfsense-and-pxe/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Four reasons why DuckDuckGo is better than Google at Search</title>
		<link>http://www.gnulnx.net/2010/08/17/four-reasons-why-duckduckgo-is-better-than-google-at-search/</link>
		<comments>http://www.gnulnx.net/2010/08/17/four-reasons-why-duckduckgo-is-better-than-google-at-search/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 14:21:24 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=108</guid>
		<description><![CDATA[In light of the recent concern over Google&#8217;s now apparent stance on privacy, which is reflected in both Eric Schmidt being quoted as saying &#8220;If you have something that you don&#8217;t want anyone to know, maybe you shouldn&#8217;t be doing it in the first place&#8221;, and in their Verizon-Google Net Neutrality Deal, I think now ]]></description>
			<content:encoded><![CDATA[<p>In light of the recent concern over Google&#8217;s now apparent stance on privacy, which is reflected in both Eric Schmidt being quoted as saying &#8220;If you have something that you don&#8217;t want anyone to know, maybe you shouldn&#8217;t be doing it in the first place&#8221;, and in their Verizon-Google Net Neutrality Deal, I think now is a better time than ever to consider the possibility that there are search engines other than Google out there.</p>
<p>One of them is <a href="http://duckduckgo.com/">DuckDuckGo</a>.  I have been using DuckDuckGo as my primary search engine for over two  weeks and I can honestly say that for all of my web searching, Google is  being outperformed.</p>
<p>Why should you try DuckDuckGo?</p>
<ul>
<li>Zero-click info — useful info above the links.</li>
<li>Privacy — we do not track you. Google does.</li>
<li>Goodies — keyboard shortcuts, answers &amp; more</li>
<li>Less spam &amp; ads — no ads above results.</li>
<li>Official sites — labeled and on top.</li>
<li>Customization — change the fonts and much more.</li>
<li>Search other sites — check out !bang syntax.</li>
</ul>
<p>While these are all great, I want to highlight my biggest reasons for using DuckDuckGo.</p>
<h3>Privacy First</h3>
<p>DuckDuckGo <a href="https://duckduckgo.com/privacy.html">does not track you</a>.  Google does.  The creator of DuckDuckGo, <a href="http://gabrielweinberg.com/">Gabriel Weinberg</a>, puts it clearly: &#8220;By default, DuckDuckGo does not collect or share personal information. That is our privacy policy in a nutshell.&#8221;  DuckDuckGo brings the issue or privacy to the forefront, offering it by default.</p>
<p>Google tracks everything that you do.  They track your search results, your web browsing history, they analyze your email to display targeted advertisement.  They have tracked your WiFi signals, flu outbreaks and earthquake reports.  And this touches on a good point &#8211; that tracking is not always a bad thing.  However, when they&#8217;re tracking and analyzing your personal searches and emails, it is.</p>
<p>While both DuckDuckGo and Google offer SSL encryption, which will keep your searches private from anyone in the middle &#8211; say your ISP or the rouge employee with a packet sniffer &#8211; DuckDuckGo also offers a way to prevent your search results from being shared with sites that you visit, which is enabled by default.</p>
<h3>Feature-Rich</h3>
<p>DuckDuckGo has an awesome number of features, not only via it&#8217;s !bang syntax, but also in the way that it displays results.  Need a random password?  Search for &#8220;pw&#8221;.  Want to know your IP address?  Search for &#8220;ip&#8221;.  A much more complete list of features can be found on their <a href="http://duckduckgo.com/goodies.html">goodies page</a>.</p>
<p>Google&#8217;s search settings page pales in comparison to DuckDuckGo&#8217;s.  With DuckDuckGo, you can customize your privacy settings, look and feel settings, result settings and interface settings.  You can even use <a href="http://duckduckgo.com/params.html">URL parameters</a> instead of cookies for your settings.</p>
<h3>Time is money, friend</h3>
<p>DuckDuckGo is optimized for speed.  If you&#8217;re looking for the characters from Stargate, why not have your search engine give you the <strong>results</strong>, instead of simply linking you to a page with the results?</p>
<p>Compare the following images:</p>
<ul>
<li><a href="/wp-content/gallery/ddg/ddg1.png"><img src="/wp-content/gallery/ddg/thumbs/ddg1.png" alt="" /></a></li>
<li><a href="/wp-content/gallery/ddg/goog1.png"><img src="/wp-content/gallery/ddg/thumbs/goog1.png" alt="" /></a></li>
</ul>
<p>With DuckDuckGo, you do not have to go to the information &#8211; it comes to you.</p>
<ul>
<li><a href="/wp-content/gallery/ddg/ddg2.png"><img src="/wp-content/gallery/ddg/thumbs/ddg2.png" alt="" /></a></li>
<li><a href="/wp-content/gallery/ddg/goog2.png"><img src="/wp-content/gallery/ddg/thumbs/goog2.png" alt="" /></a></li>
</ul>
<p>Look, Ma &#8211; no adds.</p>
<h3>Feedback</h3>
<p>DuckDuckGo listens to <a href="http://duckduckgo.com/feedback.html">your feedback</a>.  While few companies should cater to the needs of every client, it is nice to know that requests are not falling on deaf ears.  They even have a nice, big &#8220;Give Feedback&#8221; image on their main search page.</p>
<p>So why not give DuckDuckGo a try?  Wouldn&#8217;t you like to know what an advertisement-free, private web experience feels like?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2010/08/17/four-reasons-why-duckduckgo-is-better-than-google-at-search/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>XBMC HTPC</title>
		<link>http://www.gnulnx.net/2010/08/04/xbmc-htpc/</link>
		<comments>http://www.gnulnx.net/2010/08/04/xbmc-htpc/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 14:17:02 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=78</guid>
		<description><![CDATA[A few months back, I finally got around to setting up a proper HTPC solution.  I originally planned on using MythTV, but with only one frontend, and no cable subscription, I found XBMC to be more appropriate, and ultimately went that route.  I had an extra small form factor core2duo with HDMI lying around, so ]]></description>
			<content:encoded><![CDATA[<p>A few months back, I finally got around to setting up a proper HTPC solution.  I originally planned on using MythTV, but with only one frontend, and no cable subscription, I found XBMC to be more appropriate, and ultimately went that route.  I had an extra small form factor core2duo with HDMI lying around, so I choose that for my hardware.  My setup went something like this:</p>
<ol>
<li>Installed XBMC-Live onto the HTPC</li>
<li>Updated the system</li>
<li>Copied / over to a NFS share</li>
<li>Removed hard drive</li>
<li>Netboot from NFS share</li>
</ol>
<p>And this all works pretty well.  However, the box has an intel chipset, and a lot of trouble playing back 1080p content.  So two days ago, I ordered a new motherboard, 4GB RAM, and a new case, for a new frontend that I plan on building.  And the parts are Out for Delivery as of 9AM this morning.</p>
<p>So over the next few days and this weekend, I am going to create a writeup for a netboot XBMC system.  The backend (where the system and media files reside) will be a FreeBSD 8.1 box.</p>
<p>Stay tuned.</p>
<p>UPDATE:  I&#8217;ve <a href="http://www.gnulnx.net/2010/08/17/diskless-xbmc-htpc-with-freebsd-nfs-pfsense-and-pxe/">written my tutorial</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2010/08/04/xbmc-htpc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I don&#8217;t need a bag</title>
		<link>http://www.gnulnx.net/2010/06/21/i-dont-need-a-bag/</link>
		<comments>http://www.gnulnx.net/2010/06/21/i-dont-need-a-bag/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 16:07:18 +0000</pubDate>
		<dc:creator>Kyle Johnson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gnulnx.net/?p=71</guid>
		<description><![CDATA[This seems to be one of my most commonly said phrases.  I was at Walmart earlier today to buy a new griddle and a bottle of laundry detergent.  Two items, both with strong, durable handles that were designed for moving, carrying or otherwise transporting said objects.  How many arms do I have? 2.  Sounds like ]]></description>
			<content:encoded><![CDATA[<p>This seems to be one of my most commonly said phrases.  I was at Walmart earlier today to buy a new griddle and a bottle of laundry detergent.  Two items, both with strong, durable handles that were designed for moving, carrying or otherwise transporting said objects.  How many arms do I have? 2.  Sounds like a match made in heaven, no?</p>
<p>So as I am checking out, the cashier proceeds to double bag the detergent, and single bag the griddle.  Three unneeded bags for 2 items?</p>
<p>&#8220;I don&#8217;t need a bag&#8221;, though apparently I did need a dirty look.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gnulnx.net/2010/06/21/i-dont-need-a-bag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

