<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>You don&apos;t want to read this.</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/" />
    <link rel="self" type="application/atom+xml" href="http://geeklair.net/~pratzsch/blog/atom.xml" />
    <id>tag:geeklair.net,2008-03-10:/~pratzsch/blog/14</id>
    <updated>2010-06-25T05:12:28Z</updated>
    <subtitle>Or maybe you do.  I can&apos;t make all your decisions for you.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.34-en</generator>

<entry>
    <title>Cisco Networkers, Las Vegas</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2010/06/cisco-networkers-las-vegas.html" />
    <id>tag:geeklair.net,2010:/~pratzsch/blog//14.1261</id>

    <published>2010-06-25T05:04:19Z</published>
    <updated>2010-06-25T05:12:28Z</updated>

    <summary>This Sunday, I leave the recently-rainy land of Chicago to go to Cisco Networkers at the Mandalay Bay casino in Las Vegas for a week. While I realize it&apos;s wildly improbable, it is nonetheless possible that some of you will...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Misc" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cisco" label="cisco" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cisconetworkers" label="cisco networkers" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>This Sunday, I leave the recently-rainy land of Chicago to go to Cisco Networkers at the Mandalay Bay casino in Las Vegas for a week.  While I realize it's wildly improbable, it is nonetheless possible that some of you will be there as well.  If so, leave a comment and we'll say hello.</p>

<p>I have to admit that Cisco seems to have put together a pretty impressive list of talks, seminars, labs, and whatever other conference terms are appropriate.  Just trying to figure out which ones to attend was quite a task.  At any rate, I hope to see some of you there!</p>]]>
        
    </content>
</entry>

<entry>
    <title>Intro to BGP route-maps</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2010/05/intro-to-bgp-route-maps.html" />
    <id>tag:geeklair.net,2010:/~pratzsch/blog//14.1258</id>

    <published>2010-05-19T23:47:02Z</published>
    <updated>2010-05-21T19:47:40Z</updated>

    <summary>I&apos;ve been fooling around with BGP recently, and the subject of route-maps came up. For those of you playing along at home (and by now, you all should be), route-maps allow one to filter the routing updates that BGP sends....</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Network" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bgp" label="bgp" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="routemap" label="route-map" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>I've been fooling around with BGP recently, and the subject of route-maps came up.  For those of you playing along at home (and by now, you all should be), route-maps allow one to filter the routing updates that BGP sends.  Suppose you are doing something simple like redistributing connected networks into BGP.  That works fine, as long as none of them are RFC 1918 space or internal networks that shouldn't be advertised to the outside world.  If you decide to hang an internal network off one of your routers (or multi-layer switches) then the default behavior of BGP that's having connected routes redistributed into it would be to advertise those as well.  Clearly, this isn't desired behavior.</p>

<p>By using a route-map, you can in effect tell BGP to ignore some networks and not advertise them.  </p>

<p>To start, let's get two BGP-speakers up and exchanging connected routes.  RouterA has been configured with an IP of 10.0.0.2 and RouterB with 10.0.0.3.</p>

<p><strong><br />
RouterA(config)#router bgp 100<br />
RouterA(config-router)#neighbor 10.0.0.3 remote-as 200</p>

<p>RouterB(config)#router bgp 200<br />
RouterB(config-router)#neighbor 10.0.0.2 remote-as 100<br />
</strong><br />
As you can see, RouterA has been placed into AS 100 and RouterB is in AS 200.  This is a lab environment so the only reason I used these ASNs is to avoid having to type and re-type the ones allocated in RFC 5398 which are at the higher end of the ASN spectrum.</p>

<p>Anyway, once this has been done, we'll see a log message like this one taken from RouterA:<br />
<strong><br />
*May 22 10:40:52.455: %BGP-5-ADJCHANGE: neighbor 10.0.0.3 Up <br />
</strong><br />
So the routers are talking BGP to each other but so far no routes are being advertised.  To give them something to talk about, we'll add some loopbacks and tell the routers to redistribute those into BGP.<br />
<strong><br />
RouterA(config)#int lo0<br />
RouterA(config-if)#ip address 10.100.0.1 255.255.255.255<br />
</strong><br />
The RouterA sees loopbacks as directly connected networks, and adds them to the routing table as shown:<br />
<strong><br />
RouterA(config-if)#do sh ip ro<br />
C       10.0.0.2/31 is directly connected, GigabitEthernet1/1<br />
C       10.100.0.1/32 is directly connected, Loopback0<br />
</strong><br />
The route hasn't yet been redistributed into BGP - we've got to tell it to do that:<br />
<strong><br />
RouterA(config)#router bgp 100<br />
RouterA(config-router)#redistribute connected<br />
</strong><br />
There are other parameters that can modify the behavior of routes redistributed into BGP, but that simple command will get the job done.  Now we wait a few seconds for the updates to be pushed to RouterB and then look at it's routing table:<br />
<strong><br />
RouterB#sh ip ro bgp<br />
     10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks<br />
B       10.100.0.1/32 [20/0] via 10.0.0.2, 00:00:28<br />
</strong><br />
Success!  RouterB has learned a route to 10.100.0.1 from RouterA via BGP.  Let's add another loopback:<br />
<strong><br />
RouterA(config-router)#int lo1<br />
RouterA(config-if)#ip address 10.200.0.1 255.255.255.255<br />
</strong><br />
Sure enough, it shows up on RouterB as well:<br />
<strong><br />
RouterB#sh ip ro bgp<br />
     10.0.0.0/8 is variably subnetted, 3 subnets, 2 masks<br />
B       10.200.0.1/32 [20/0] via 10.0.0.2, 00:00:37<br />
B       10.100.0.1/32 [20/0] via 10.0.0.2, 00:06:47<br />
</strong><br />
That's fine and dandy assuming we want all the connected networks on RouterA to be pushed to RouterB.  If we want to keep 10.200.0.1/32 from being advertised by BGP we can create a route-map to filter it from the list of updates to be sent.</p>

<p>The first thing we have to do is define the route-map:<br />
<strong><br />
RouterA(config)#route-map TESTMAP permit 10<br />
</strong><br />
Easy enough.  10 is just a sequence number like in regular firewall access-lists and for our purposes doesn't mean anything.  The next thing we have to do is tell the router which network we want to permit (the rest will be blocked):<br />
<strong><br />
RouterA(config-route-map)#match ip address 1<br />
</strong><br />
This tells the router to look at access-list 1 and check the addresses against it before advertising them.  Since access-list 1 doesn't yet exist, let's write it:<br />
<strong><br />
RouterA(config)#access-list 1 permit 10.100.0.0 0.0.255.255<br />
</strong><br />
The only tricky thing, for those of you coming from the world of firewall access-lists is that the netmask is a wildcard mask, not a standard one.  Looking at this access-list entry, networks starting with 10.100 are okay to advertise.  Everything has been defined with the exception of applying to route-map to BGP's redistribution of connected routes.<br />
<strong><br />
RouterA(config)#router bgp 100<br />
RouterA(config-router)#redistribute connected route-map TESTMAP<br />
</strong><br />
Just like before, we're telling BGP to redistribute routes for connected networks but we're also telling it to only do so if the routes pass successfully through the TESTMAP route-map.  Now that everything is in place, let's look at RouterB again:<br />
<strong><br />
RouterB#sh ip ro bgp<br />
     10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks<br />
B       10.100.0.1/32 [20/0] via 10.0.0.2, 00:19:10<br />
</strong><br />
As you can see, the route for 10.200.0.1/32 has been dropped from RouterB's routing table since it was filtered out by the route-map.  There are many, many other things that can be done with a route-map, but this is intended to be more of a quick intro than anything resembling a complete guide.</p>]]>
        
    </content>
</entry>

<entry>
    <title>OSPF Area Types and LSAs</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2010/04/ospf-area-types-and-lsas.html" />
    <id>tag:geeklair.net,2010:/~pratzsch/blog//14.1252</id>

    <published>2010-04-23T02:10:02Z</published>
    <updated>2010-04-23T03:14:05Z</updated>

    <summary>OSPF area types and LSAs seem to be somewhat misunderstood concepts. If you&apos;ve read this far, you&apos;re probably already aware that OSPF makes use of areas to break up the potential administrative nightmare of running an IGP in a network....</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Network" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cisco" label="cisco" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ospf" label="ospf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ospfarea" label="ospf area" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ospflsa" label="ospf lsa" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>OSPF area types and LSAs seem to be somewhat misunderstood concepts.  If you've read this far, you're probably already aware that OSPF makes use of areas to break up the potential administrative nightmare of running an IGP in a network.  If you've read THIS far, you're probably also aware that area 0, the backbone area, has a special significance to OSPF.  The other area types and the link state advertisements used to toss information around between the routers are where a lot of people get confused.  </p>

<p><strong>Standard Areas</strong><br />
<p><br />
A standard area is often described with a phrase like "A standard area is the most basic type of area".  Well great - 'standard' in what way?  Standard areas can be thought of as being the "equal opportunity employer" of OSPF areas as every router in the area knows about every route.  This is just fine if the routers are high-powered enough to store every route and run the SPF calculations without getting bogged down.  Type 1 and 2 LSAs are passed between routers to convey information regarding their own interfaces and their neighbors.  Internal routes, communicated by type 3 LSAs, and external routes, communicated by type 5 LSAs are sent through all standard areas as well as the backbone area, which is a type of standard area.  Type 3 LSAs can be sourced by any OSPF router whereas type 5 LSAs only ever come from autonomous system border routers.  Autonomous system border routers are also responsible for generating type 4 LSAs.  An area border router that has an interface in that area and an interface in the backbone area will inject the type 4 LSA into the backbone area to ensure the route to the autonomous system border router is known.  Type 4 LSAs are only passed internally.  </p>

<p>In summary, a standard area can contain LSAs of type 1,2,3,4, and 5.<br />
</p></p>

<p><strong>Stub Areas</strong><br />
<p><br />
If an area can be thought of as a leaf node on a network then a stub area may be appropriate.  A stub area can be handy if devices in it are low-powered, or simply have no need to know about every route.  A stub area is similar to a standard area, but routers in it are not aware of externally-sourced routes directly.  In terms of LSAs, that means that type 5 LSAs are not permitted in a stub area.  A type 3 LSA is injected into the area by an area border router to act as a default route, allowing connectivity outside the stub area.  The type 3 LSA provides the equivalent of an "All Points East" sign for stub area routers.  Type 4 LSAs are not forwarded into a stub area, as the default route is used.</p>

<p>For a router to be in a stub area, the area must be configured as such on all routers involved:</p>

<p><span style="background-color:#ccc">Weasel(config-router)# area 3 <strong>stub</strong></span></p>

<p>In summary, a stub area can contain LSAs of type 1,2, and 3.<br />
</p></p>

<p><strong>Totally Stubby Areas</strong><br />
<p><br />
Totally stubby areas are a Cisco invention designed to take the concept of a stub area one step further.  In addition to the lack of type 4 and 5 LSAs, type 3 LSAs, which carry information about internal routes are also prohibited.  The concept of an injected default route still applies (the only instance of a type 3 LSA in a stub or totally stubby area) but it also covers internal routes.  All traffic leaving the area does so using this default route.  While I've never tried this in a lab, I've been told that one can have multiple 'default routes' (in stub, totally stubby, and not-so-stubby areas) and internal metrics will be used to select the least-cost route.  If you've tried this, let me know.</p>

<p>To configure an area as a totally stubby area, use the <strong>no-summary</strong> argument when defining the area:</p>

<p><span style="background-color:#ccc">Vole(config-router)# area 4 stub <strong>no-summary</strong></span></p>

<p>In summary, a totally stubby area can contain LSAs of type 1 and 2 as well as a type 3 LSA for the default route.<br />
</p></p>

<p><strong>Not-so-stubby Areas</strong><br />
<p><br />
Yet another Cisco-concocted area type, the NSSA is a variant of the stub area type but is allowed to contain an autonomous system border router.  Since type 5 LSAs are not permitted in stub areas of any type, a type 7 LSA is used.  For the record, there is a type 6 LSA that is used by Multicast OSPF.  MOSPF is an extension of OSPF designed to support (surprise!) multicast.  At any rate, a type 7 LSA is essentially a type 5 LSA with a fake beard and glasses on.  It performs the same function as a type 5, but is permitted through NSSAs.  A hard-learned lesson for me was that by default an NSSA does NOT have a default route injected into it by an area border router.  To have one (yes, please) the <strong>default-information-originate</strong> argument must be used:</p>

<p><span style="background-color:#ccc">Marmoset(config-router)# area 5 nssa <strong>default-information-originate</strong></span></p>

<p>This comes in handy if one wishes to route traffic out of an NSSA.</p>

<p>If totally stubby area functionality is desired, all area border routers must be configured appropriately:</p>

<p><span style="background-color:#ccc">Marmoset(config-router)# area 5 nssa <strong>no-summary</strong></span></p>

<p>Note that if an NSSA is configured to behave like a totally stubby area, a default route IS injected by the area border routers so the <strong>default-information-originate</strong> parameter is not necessary.</p>

<p>In summary, a not-so-stubby area can contain LSAs of type 1,2,7 and if configured for it, a type 3 for a default route.<br />
</p></p>

<p><strong>Bonus Fact</strong><br />
<p><br />
Type 8 LSAs are very rarely used, but can carry BGP information over OSPF.  I haven't the faintest idea how to use them, so don't ask.</p>

<p>LSA types 9 - 11 are called 'opaque LSAs' and are reserved for future growth.  I plan to make use of them in my proposed "Kinda-stubby-but-only-if-you-squint-right" area.<br />
</p></p>

<p>While I'm pretty sure all of this is correct, it's possible that I either missed something or made a type somewhere.  If you spot an error, please let me know so I can correct it.<br />
</p></p>]]>
        
    </content>
</entry>

<entry>
    <title>IPv6 and OSPFv3</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2010/04/ipv6-and-ospfv3.html" />
    <id>tag:geeklair.net,2010:/~pratzsch/blog//14.1251</id>

    <published>2010-04-12T20:23:44Z</published>
    <updated>2010-04-12T20:27:33Z</updated>

    <summary>Like most of you out there, I think about OSPFv3 and IPv6 regularly. Looking up &apos;regularly&apos; in the Philip-English Dictionary we see it defined as &quot;the day before yesterday while I was on my way home from work&quot;. Specifically, I...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Network" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ipv6" label="ipv6" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ospfv3" label="ospfv3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>Like most of you out there, I think about OSPFv3 and IPv6 regularly.  Looking up 'regularly' in the Philip-English Dictionary we see it defined as "the day before yesterday while I was on my way home from work".  Specifically, I was thinking "Huh - I don't know much about OSPFv3, and even less about IPv6".</p>

<p>IPv6 as I'm sure you're aware, was first proposed several years ago to put some of our out-of-work bits back to work.  We've got bits everywhere with nothing to do, and here we are using a measly 32 of them in an IPv4 address.  Cranking that number up to 128-bits allows us to take some of these bits off the street and make the internet more confusing to boot.  It's really win-win.</p>

<p>With these two thoughts in mind, I decided to set up a little IPv6/OSPFv3 lab.  Grabbing a spare 6504 and a couple of 4948s I set to work.</p>

<p><strong>Lesson The First:</strong> any IOS version that has "ipbase" in it's name will not work.  You'll be able to put an IPv6 address on a routed interface, but the command to enable IPv6 routing device-wide is missing.  Go for "ipservices".</p>

<p><strong>ipv6 unicast-routing</strong> is the universal command to enable (surprise!) IPv6 unicast routing.  <strong>ipv6 cef</strong> could also be enable if you want to use uRPF (Unicast Reverse Path Forwarding).</p>

<p>Putting an IPv6 address on an interface is as straight-forward as it is in IPv4:</p>

<p><strong><br />
IPv6Lab1(config-if)#no switchport<br />
IPv6Lab1(config-if)#no ip address<br />
IPv6Lab1(config-if)#ipv6 address 2001:410:0:5::1/64<br />
IPv6Lab1(config-if)#ipv6 ospf 1 area 0<br />
</strong></p>

<p>Notice that the last command explicitly places the interface into OSPF area 0.  Rather than say "All interfaces in network x.x.x.x/y go into area z" it's on an interface by interface basis.  Personally, I think this makes it much clearer, but if there's any confusion there's always the fall-back command:</p>

<p><strong><br />
IPv6Lab1#sh ipv ospf int b<br />
Interface    PID   Area            Intf ID    Cost  State Nbrs F/C<br />
Gi1/47       1     0               58         1     DR    1/1<br />
Gi1/48       1     0               56         1     BDR   1/1<br />
</strong></p>

<p>The bulk of the commands related to IPv6 differ only from their IPv4 counterparts in that one uses "ipv6" instead of "ip".  A major gripe I have with Cisco (other than those currently displayed at dearcisco.com) is that <strong>sh ip int b</strong> shows nothing related to IPv6.  Not even an indicator that the interface HAS an IPv6 address.  <strong>sh ipv int b</strong> shows this information but in a much more vertical format rendering it easy to scroll off the screen.  I recommend using <strong>sh ipv int b | e do|una</strong> as it filters out all the 'down' or 'unassigned' interfaces.</p>

<p>Getting back to configuring IPv6 addresses, the <strong>ipv6 address &lt;blah&gt;</strong> command can take an additional parameter of <strong>eui-64</strong>.  This seems to work the MAC address into the IPv6 address which can be a bit confusing; suddenly there are a bunch of hex characters that weren't typed in.  Anyway, on with the show.</p>

<p>OSPFv3 has some other little quirks that are handy to know.  In previous versions, there was a hierarchy that OSPF would go through to select the router ID used by the device.  First, it would check for a hard-set router ID.  In the absence of a hard-set RID, the highest IP address on the loopbacks would be used.  If no loopbacks are set, the highest IP anywhere on the device is selected.  Obviously it doesn't make sense to have an OSPF process running if there isn't a layer 3 configuration on the device.  With IPv6 and OSPFv3 one might think that the same logic would apply.  It does.  Identically.  IPv6 addresses are not used for RIDs (possibly for sanity reasons) in OSPFv3.  If no hard-set RID or IPv4 address is configured anywhere on the device OSPF will simply refuse to start.  The day will come (if it hasn't already) when someone new to a configuration will remove the "pointless" IPv4 loopback on a device.  It won't be a problem at first, but when either the chassis or the OSPF process reloads OSPF won't come back up.  Brace for impact.</p>

<p>The moral of the story is the the output of <strong>sh ipv ospf nei</strong> will look shockingly similar to that of IPv4 and earlier versions of OSPF:</p>

<p><strong><br />
IPv6Lab1#sh ipv o n   </p>

<p>Neighbor ID     Pri   State           Dead Time   Interface ID    Interface<br />
10.0.0.4          1   FULL/BDR        00:00:36    7               GigabitEthernet1/47<br />
10.0.0.3          1   FULL/DR         00:00:35    54              GigabitEthernet1/48<br />
</strong></p>

<p>While I won't bother repeating the commands of adding an IP address to an interface and adding an interface to an OSPF area, below are the end results of my fiddling.  The topology is three devices arranged in a triangle, all IPed interfaces in area 0.</p>

<p><strong><br />
IPv6Lab1#sh ipv route<br />
IPv6 Routing Table - Default - 8 entries<br />
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route<br />
       B - BGP, R - RIP, I1 - ISIS L1, I2 - ISIS L2<br />
       IA - ISIS interarea, IS - ISIS summary, D - EIGRP, EX - EIGRP external<br />
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2<br />
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2<br />
C   2001:410:0:1::/64 [0/0]<br />
     via GigabitEthernet1/48, directly connected<br />
L   2001:410:0:1::1/128 [0/0]<br />
     via GigabitEthernet1/48, receive<br />
LC  2001:410:0:2::2/128 [0/0]<br />
     via Loopback0, receive<br />
OE1 2001:410:0:3::2/128 [110/21]<br />
     via FE80::8A43:E1FF:FE08:7C3F, GigabitEthernet1/48<br />
C   2001:410:0:5::/64 [0/0]<br />
     via GigabitEthernet1/47, directly connected<br />
L   2001:410:0:5::1/128 [0/0]<br />
     via GigabitEthernet1/47, receive<br />
O   2001:410:0:6::/64 [110/2]<br />
     via FE80::226:CBFF:FE30:8980, GigabitEthernet1/47<br />
     via FE80::8A43:E1FF:FE08:7C3F, GigabitEthernet1/48<br />
L   FF00::/8 [0/0]<br />
     via Null0, receive<br />
</strong></p>

<p>As mentioned in other attempts at tutorials, I am by no means an expert.  According to Cisco, I'm merely an "associate".  No guarantees are made as to the accuracy of this information. I may be wrong - in fact, I probably am.  Consult a physician before changing your dose.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Command &amp; Conquer 4: Tiberian Twilight Review</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2010/03/command-conquer-4-tiberian-twi.html" />
    <id>tag:geeklair.net,2010:/~pratzsch/blog//14.1247</id>

    <published>2010-03-29T13:12:16Z</published>
    <updated>2010-04-05T21:25:27Z</updated>

    <summary>This past weekend, I purchased the latest installment of the Command &amp; Conquer franchise, &quot;Tiberian Twilight&quot;. As a long-time fan of this series, I looked forward to playing what is said to be the final installment. It seems that Electronic...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Misc" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="commandconquer4tiberiantwilight" label="Command &amp; Conquer 4: Tiberian Twilight" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="review" label="review" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>This past weekend, I purchased the latest installment of the Command & Conquer franchise, "Tiberian Twilight".  As a long-time fan of this series, I looked forward to playing what is said to be the final installment.</p>

<p>It seems that Electronic Arts has decided that it no longer cares about producing a quality product and instead has taken the George Lucas strategy of "who cares if they like it, I'll still make money" to heart.  Several facets of basic gameplay have changed from previous incarnations, not in the slightest for the better.</p>

<p>The first major difference in purely a UI change, but the time-vetted sidebar control has been replaced by one at the bottom of the screen.  Many times while playing this game I've started to move the mouse to the side, but that's not a huge deal.</p>

<p>Tiberium harvesting, one of the critical tasks of earlier version has been replaced by a system involving "command points".  Tiberium is still present in the game, but instead of fields to be harvested they're now single crystals that must be returned to player-controlled land to get points that can be spent on upgrades.  Every unit, rather than having a monetary cost, costs a certain number of command points, almost always in multiples of three.  This would be tolerable if one was given a number of command points that was divisible by three.  Instead, one is typically left with a few worthless points that can't be used for anything.  The command points limit equates to a population limit which is a familiar concept to gamers.  However, since any unit of real value costs at least six points, one maxes out the population with 15 or so units - the days of fielding a massive army are over.</p>

<p>Base design used to be a major strategic decision, as one needed to place critical buildings in protected areas so they wouldn't be vulnerable to engineers or combat units.  No more.  Bases have been replaced by the "crawler", a single unit that packs and unpacks like the MCV in days gone by.  It produces infantry, vehicles, planes, and base defenses (based on your class - more on that later) and can be moved at will.  Part of the excitement in previous games was losing buildings and having to compensate while you rebuilt, and the fun of taking out an enemy's power plants, shutting down their base defenses.  Your crawler can be destroyed, but you can immediately drop another one from space and you're back in business.  Crippling attacks on an enemy's infrastructure simply can't be done.</p>

<p>Crawlers fall into one of three classes, offense, defense, and support.  Clearly this game was designed to be played exclusively in the multi-player arena.  The offensive class fields vehicles like tanks and walkers.  Defense allows one to build base defenses like turrets and SAM sites, but limits your ground units to infantry and a vehicles or two.  Support class weapons are predominantly aircraft.  Why I can't have both tanks and planes is beyond me.</p>

<p>The graphics are a throw-back to the original "Warcraft" where it was impossible to tell different infantry types apart.  While it can be done here, it seems that the graphics budget was instead blown on the neighborhood community theater from whence they apparently sourced their actors.  Grainy and pixelated, they simply serve to detract from the already awful game play.</p>

<p>I mentioned the acting a moment ago, but just in case theirs any confusion I'll talk about it a bit more.  I've seen better acting from extras in Godzilla movies, but given the quality of the plot I imagine they would have had trouble getting someone as talented as the people in the Doritos "Friendchip" commercials.  For example, the apparently awesomely-skilled sniper in campaign mode is an aging black female who could have been edged out of the role by a bottle of shampoo.  The person who in the role of the player's wife is a 30-something white female capable of making Keanu Reeves look like the genius thespian of our time.  Her delivery of "What's the sound?" made me consider euthanizing my speakers out of pity.  The plot, which I stopped paying attention to three minutes into the game, apparently involved something about the Scrin (see C&C III) who apparently decided Earth wasn't worth invading after all but graciously left some of their technology behind.  "Dick and Jane At The Seashore" is a taut thriller in comparison.</p>

<p>What I miss the most though, is the the way skirmish mode used to work.  One could choose a map, a number of computer-controlled opponents and their skill, and play any number of different combinations of games.  The gameplay now is directed solely at multi-player  (in fact, you have to be on-line to even play it).  The AI is dreadful and the only game mode is a variant of "king of the hill" wherein one must control "tiberium control nodes" to gain victory points.  When one amasses 2500 points (which can't be changed) one (surprise!) wins.  Every games plays out identically - there's an early land-grab and then it's just about becoming a turtle and waiting for the enemy to come to you (which may or may not happen).</p>

<p>All told, this game is simply awful.  Were I on the project team, I would be truly ashamed to have my name associated with this piece of software.  Terrible graphics, awful story, abysmal acting, dreadfully predictable AI, and atrocious gameplay make this one sorry excuse for a Command & Conquer product.  I have never played a more poorly-written RTS game in my life.  </p>

<p>A final thought.  This game strikes me almost as an attempt to recapture some aspect of gaming in the days of yore.  I'm not sure what they were trying to recapture, but I sincerely hope that whatever it is is protected by the Geneva Convention.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Google Reader</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/09/google-reader.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1219</id>

    <published>2009-09-21T15:39:13Z</published>
    <updated>2009-09-21T17:25:27Z</updated>

    <summary>As part of my periodic process of looking through my server&apos;s logs and seeing who I should block (UFW is a fantastic iptables wrapper, incidentally), I ran across an IP that apparently belongs to Google Reader. I did some digging...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Network" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="googlereader" label="google reader" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ufw" label="ufw" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>As part of my periodic process of looking through my server's logs and seeing who I should block (UFW is a fantastic iptables wrapper, incidentally), I ran across an IP that apparently belongs to Google Reader.  I did some digging around on the Google Reader site, and it seems that this particular blog of mine has somehow acquired 23 subscribers.  This is not to say that this blog is hosted on a server I own - this blog is generously hosted by <a href="http://www.geeklair.net/~dluke">DLuke</a>.  I haven't the faintest idea who these subscribers are, but hell, I'll take 'em!</p>

<p>Speaking of Google Reader, there's apparently a Facebook application that claims to allow you to use Google Reader form your Facebook account.  As a former English teacher of mine recently discovered, using this application will summarily get your IP address blacklisted by Google.  So you might want to stay away from that; or don't - I can't make all your decisions for you.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Further Information Fail</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/06/further-information-fail.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1202</id>

    <published>2009-06-07T18:43:02Z</published>
    <updated>2009-06-07T18:46:20Z</updated>

    <summary> Don&apos;t you want to know what kind of TV it was? How about what floor it was on? This is important information to track!...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Misc" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="fail" label="fail" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://geeklair.net/~pratzsch/blog/assets_c/2009/06/poker-442.html" onclick="window.open('http://geeklair.net/~pratzsch/blog/assets_c/2009/06/poker-442.html','popup','width=558,height=442,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://geeklair.net/~pratzsch/blog/assets_c/2009/06/poker-thumb-200x158-442.png" width="200" height="158" alt="poker.png" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span></p>

<p>Don't you want to know what kind of TV it was?  How about what floor it was on?  This is important information to track!</p>]]>
        
    </content>
</entry>

<entry>
    <title>Fun Random Linguistic Tidbits</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/05/fun-random-linguistic-tidbits.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1199</id>

    <published>2009-06-01T00:00:01Z</published>
    <updated>2009-06-07T16:37:53Z</updated>

    <summary>Periodically while studying some aspect or other of linguistics, I come across factoids regarding the etymology of a word or phrase. While they&apos;re not usually of any great significance, I think they&apos;re fascinating. The word &apos;cattle&apos; comes from the Old...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Linguistics" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="etymology" label="etymology" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="linguistics" label="linguistics" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>Periodically while studying some aspect or other of linguistics, I come across factoids regarding the etymology of a word or phrase.  While they're not usually of any great significance, I think they're fascinating.</p>

<p>The word 'cattle' comes from the Old French <em>chattels</em> referring to all things a person owns.</p>

<p>'Spree' comes from a Scottish word meaning "cattle raid".</p>

<p>'Eulogy' originated in Ancient Greek.  The original meaning was 'good word'.</p>

<p>The Gaelic word for 'war cry' was 'slogan'.</p>

<p>During a British military operation in India, the city of Sind was under siege.  A message was sent from headquarters to the general leading the attack asking how the battle was going.  His response was a single Latin word; <em>Peccavi</em>.  The translation is "I have sinned".</p>

<p>If you've got any you'd like to share, be all means do so.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Yet another extensive thought that dawned on me in the shower</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/04/yet-another-extensive-thought.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1192</id>

    <published>2009-04-10T01:47:11Z</published>
    <updated>2009-04-10T02:24:25Z</updated>

    <summary>It&apos;s well and widely known that languages evolve over time. Sometimes they change if words fall into disuse (&apos;haberdasher&apos; in English), a word takes on a new meaning (historically, the Arabic word for &apos;house&apos; meant &apos;tent&apos;), proximity to another culture...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Linguistics" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="english" label="english" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="german" label="german" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="linguistics" label="linguistics" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>It's well and widely known that languages evolve over time.  Sometimes they change if words fall into disuse ('haberdasher' in English), a word takes on a new meaning (historically, the Arabic word for 'house' meant 'tent'), proximity to another culture (the British Isles being repeatedly overrun helped produce English as we know it today) or sometimes for no clear reason at all (the so-called Great Vowel Shift responsible for the English 'burning' versus the German 'brennend').</p>

<p>Periodically though, pronunciations will change simply because they're easier to say.  Euphonic assimilation is responsible for 'goodog' as opposed to 'good dog' in English, but sometimes the change will actually alter a letter.  Eventually it may be accepted as the common spelling.  Typically though it seems to be confined to 'classes' of letters.  A 't' may evolve into a 'd' for example, as they are both 'dental' letters, produced through a similar process involving the speech organs.</p>

<p>While listening to the song 'Vergissmeinnicht' by Eisbrecher recently, it dawned on me that 'vergissmeinnicht' meant 'forget-me-not' ('eisbrecher' incidentally, means 'ice breaker').  It's a fairly obvious conclusion even if one (such as myself) doesn't speak German.</p>

<p>F and V are both labiodental fricative (I've also seen them referred to as 'plosive') letters.  The difference between the two of them being that V is voiced and F is not.  It's easy to see how over time one letter could gradually be replaced by the other.  The major limiting factor as I see it in English is that there are English words that already are 'place holders', prohibiting some changes from taking place.  'Very' would have a hard time becoming 'fery' as 'fairy' and 'ferry' already exist.  Not that it's impossible, but it would seem to me to be easier to transition if there were no sound collection already existing.</p>

<p>Language is a very time-sensitive subject.  Some researchers think that spoken language evolved out of a need to warn others in the pack about impending dangers.  Clearly there's an advantage to being able to warn others quickly.  As such, it makes sense that spoken language would, like electrons in an atom, seek a 'low-energy' state where the least amount of energy was exerted to communicate the message.</p>

<p>This implies perhaps that some transliterations are more likely to happen than others.  A Z is more likely to evolve into an S than vice versa as an S is easier to say.  Hence the name 'euphonic'.</p>

<p>Anyway, it seems that an F is a more 'natural' letter than a V as a voiced letter should always require more effort than it's unvoiced alternative.  Since the English equivalent of vergissmeinnicht starts with an F, it seems to suggest that perhaps the original shared root started with an F which was the sounds maintained by English.  The questions then arises as to why a language would intentionally adopt a sound that requires more effort?  The alternative is that the original root contained a V sound and while English has settled on an F German maintains the original sound.  </p>

<p>The second syllable consonant, G, is shared by both languages.  </p>

<p>The puzzle for me is the third syllable.  English uses a palatal T sound whereas German has an unvoiced sibilant (or palatoalveolar fricative).  The sister letter of T is D and that of S, Z.  Were German to use a D here or English a Z the resemblance would be clear but I'm at a loss to explain why we're left with the two sounds we have.  It's possible I suppose that S evolved out of a now lost palatal sound similar to an open 'sh' sound.</p>

<p>Looking at the two sounds we have to work with, the S seems to me to be the winner in terms of ease of pronunciation.  Could it be that in the ages before Germanic split into upper and lower Germanic the root was *FGS (for those of you playing along at home, the * indicates a supposition or uncertainty)?  I'd love to know.  If an email was sent out detailing this at some point, I didn't get it so please forward it to me.</p>

<p>As for the rest of the word, 'mein' is a fairly commonly known German word, as is 'nicht'.  Being the semi-agglutinative language German is, they all get slammed together.  I guess we English speakers prefer hyphens.</p>

<p>Since I spent so much time on it, here's a chunk of the song that spawned this whole diatribe:</p>

<p>Verzeih mir - bleib bei mir<br />
und ich sagte noch Vergissmeinnicht<br />
Ich schenk dir zum Abschied<br />
ein letztes Licht<br />
Vergissmeinnicht</p>

<p>Translation:<br />
Forgive me - stay with me<br />
and I still said forget-me-not<br />
I'll give you as a goodbye<br />
one last light<br />
Forget-me-not</p>]]>
        
    </content>
</entry>

<entry>
    <title>Cisco Alert</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/04/cisco-alert.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1191</id>

    <published>2009-04-10T01:11:26Z</published>
    <updated>2009-04-10T01:22:59Z</updated>

    <summary>For those of you playing along at home who also have to have an ASA running 8.0 or 8.1 code, pay attention. The rest of you, go about your business. Move along, nothing to see here... Cisco recently announced that...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Network" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bgp" label="bgp" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cisco" label="cisco" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="firewall" label="firewall" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>For those of you playing along at home who also have to have an ASA running 8.0 or 8.1 code, pay attention.  The rest of you, go about your business.  Move along, nothing to see here...</p>

<p>Cisco recently announced that a flaw exists in ASA 8.0 and 8.1 code that can force the device to reload itself if a specially-formed HTTP packet passes through it if SSL VPN is being used.  There are a couple of other conditions, but from what I've read they're all pretty non-standard configurations.</p>

<p>The moral of the story - keep your code up to date.</p>

<p>There's also a paper being released at Black Hat Europe next week that will supposedly reveal a fundamental flaw in BGP and MPLS of a comparable seriousness to Kaminsky's DNS exploit of several months ago.  So all those of you who run BGP (yeah yeah I know, no one who runs BGP is going to be reading the blog of little old me), heads up.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Nginx site loading functions</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/04/nginx-site-loading-functions.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1190</id>

    <published>2009-04-06T15:14:31Z</published>
    <updated>2009-04-06T20:04:14Z</updated>

    <summary><![CDATA[While digging through some old files, I found these two functions I had written during my fiddlings with the Nginx web server.&nbsp; At the time at least, there weren't Nginx equivalents of the a2ensite and a2dissite commands used to enable...]]></summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[While digging through some old files, I found these two functions I had written during my fiddlings with the Nginx web server.&nbsp; At the time at least, there weren't Nginx equivalents of the <i>a2ensite</i> and <i>a2dissite</i> commands used to enable and disable sites in Apache.&nbsp; <br /><br />Since I can't remember if I posted them already (and I'm a bit to busy to check right now) I thought I'd post them again just to be sure.&nbsp; Usage of these functions blah blah I take no responsibility blah at your own risk blah blah created in a factory that processes tree nuts.<br /><br /># Enables a site used by nginx<br />function nginable<br />(<br />&nbsp; if [ $# -lt 4 ]; then<br />&nbsp;&nbsp;&nbsp; echo "Usage: nginable -s|--source source_config_file -n|--name site_name [-r|--restart]"<br />&nbsp;&nbsp;&nbsp; echo "-s|--source The config file defining the site"<br />&nbsp;&nbsp;&nbsp; echo "-n|--name The name to appear in the sites-enabled directory"<br />&nbsp;&nbsp;&nbsp; echo "-r|--restart Include to restart nginx after the site has been enabled" <br />&nbsp;&nbsp; return 0 <br />&nbsp; fi<br /><br />&nbsp; if [ $1 = "--help" ]; then<br />&nbsp;&nbsp;&nbsp; echo "Enables a site used by nginx" &nbsp;<br />&nbsp;&nbsp;&nbsp; echo 'Usage: nginable -s|--source source_config_file -n|--name site_name [-r|--restart]'<br />&nbsp;&nbsp;&nbsp; echo 'Ex: nginable --source ./site_config --name nginx_tutorial --restart'<br />&nbsp;&nbsp;&nbsp; echo "&nbsp; If no pathing information is given, the config file"<br />&nbsp;&nbsp;&nbsp; echo "&nbsp; is assumed to exist in /etc/nginx/sites-available."<br />&nbsp;&nbsp;&nbsp; return 0<br />&nbsp; fi<br /><br />&nbsp; args=`getopt :s:n:r $*`<br /><br />&nbsp; for i<br />&nbsp;&nbsp;&nbsp; do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "$i" in<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -s|--source) shift;SOURCE=$1;shift;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -n|--name) shift;NAME=$1;shift;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -r|--restart) RESTART=1;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esac<br />&nbsp;&nbsp;&nbsp; done<br /><br />&nbsp; SITESENABLED=/etc/nginx/sites-enabled<br />&nbsp; SITESAVAIL=/etc/nginx/sites-available<br /><br />&nbsp; # See if nginx is running<br />&nbsp; PROC=`pgrep -c nginx`<br />&nbsp; <br />&nbsp; if [ $PROC -gt 1 ]; then<br />&nbsp;&nbsp;&nbsp; NGINXON=1<br />&nbsp; else<br />&nbsp;&nbsp;&nbsp; echo 'Nginx does not appear to be running...'<br />&nbsp; fi<br />&nbsp; <br />&nbsp; # Check for target directory<br />&nbsp; if [ ! -d $SITESENABLED ]; then<br />&nbsp;&nbsp;&nbsp; echo "[ERROR] Can't find sites-enabled directory"<br />&nbsp;&nbsp;&nbsp; return 1<br />&nbsp; fi<br /><br />&nbsp; # Check for config file<br />&nbsp; if [ -f $SITESAVAIL/$SOURCE ]; then<br />&nbsp;&nbsp;&nbsp; SOURCE=$SITESAVAIL/$SOURCE<br />&nbsp;&nbsp;&nbsp; echo "Site detected - $SOURCE"<br />&nbsp; elif [ ! -f $SOURCE ]; then<br />&nbsp;&nbsp;&nbsp; echo "[ERROR] Can't find config file $SOURCE"<br />&nbsp;&nbsp;&nbsp; return 2<br />&nbsp; fi <br /><br />&nbsp; # See if a site by that name already exists<br />&nbsp; if [ -f $SITESENABLED/$NAME ]; then<br />&nbsp;&nbsp;&nbsp; echo "A site called $NAME already exists in $SITESENABLED"<br />&nbsp;&nbsp;&nbsp; return 3<br />&nbsp; fi<br /><br />&nbsp; # Enable site<br />&nbsp; ln --target-directory=$SITESENABLED --symbolic $SOURCE<br /><br />&nbsp; # See if restart was called for and check syntax<br />&nbsp; if [ $RESTART ]; then<br />&nbsp;&nbsp;&nbsp; if [ $NGINXON ]; then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /etc/init.d/nginx stop <br />&nbsp;&nbsp;&nbsp; fi <br /><br />&nbsp;&nbsp;&nbsp; /etc/nginx -t<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; if [ ! $? -eq 0 ]; then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "[ERROR] Errors found in config files"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Disabling new site..."<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rm $SITESENABLED/$NAME<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [ ${NGINXON} ]; then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /etc/init.d/nginx start<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "Restarting nginx..."<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 4<br />&nbsp;&nbsp;&nbsp; fi<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; if [ ${NGINXON} ]; then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /etc/init.d/nginx start<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0<br />&nbsp;&nbsp;&nbsp; fi<br /><br />&nbsp;&nbsp;&nbsp; echo "Site $NAME enabled"<br />&nbsp;&nbsp;&nbsp; return 0<br />&nbsp; fi<br />)<br /><br /># Disables a site used by nginx<br />function nginoff<br />(<br />&nbsp; if [ $1 = '--help' || $1 = '-h' || $# -lt 2 ]; then<br />&nbsp;&nbsp;&nbsp; echo "Disables a site used by nginx"<br />&nbsp;&nbsp;&nbsp; echo "Usage: nginoff -n|--name site_name [-r|--restart]"<br />&nbsp;&nbsp;&nbsp; echo "Ex: nginoff --name nginx_tutorial --restart"<br />&nbsp;&nbsp;&nbsp; return 0<br />&nbsp; fi<br />&nbsp; <br />&nbsp; SITESENABLED=/etc/nginx/sites-enabled<br /><br />&nbsp; # See if nginx is running<br />&nbsp; PROC=`pgrep -c nginx`<br />&nbsp; <br />&nbsp; if [ $PROC -gt 1 ]; then<br />&nbsp;&nbsp;&nbsp; NGINXON=1<br />&nbsp; else<br />&nbsp;&nbsp;&nbsp; echo 'Nginx does not appear to be running...'<br />&nbsp; fi<br /><br />&nbsp; args=`getopt :n:r $*`<br /><br />&nbsp; for i<br />&nbsp;&nbsp;&nbsp; do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "$i" in<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -n|--name)shift;NAME=$1;shift;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -r|--restart)shift;RESTART=1;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esac<br />&nbsp;&nbsp;&nbsp; done<br /><br />&nbsp; if [ ${NGINXON} &amp;&amp; ! ${RESTART} ]; then<br />&nbsp;&nbsp;&nbsp; echo "[WARNING] If nginx is not restarted, site errors may occur"<br />&nbsp; fi<br />&nbsp; <br />&nbsp; if [ ! -f $SITESENABLED/$NAME ]; then<br />&nbsp;&nbsp;&nbsp; echo "[ERROR] Can't find an enabled site called $NAME"<br />&nbsp;&nbsp;&nbsp; return 1<br />&nbsp; fi<br /><br />&nbsp; rm $SITESENABLED/$NAME<br /><br />&nbsp; echo "Site $NAME disabled"<br /><br />&nbsp; if [ ${RESTART} ]; then<br />&nbsp;&nbsp;&nbsp; if [ ${NGINXON} ]; then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /etc/init.d/nginx stop <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /etc/init.d/nginx start<br />&nbsp;&nbsp;&nbsp; fi <br />&nbsp; fi<br /><br />&nbsp; return 0<br />)<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>A break from the norm</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/04/a-break-from-the-norm.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1189</id>

    <published>2009-04-02T23:49:19Z</published>
    <updated>2009-04-03T00:25:59Z</updated>

    <summary>While this isn&apos;t a post directly related to my latest random technological fiddlings, I still feel it&apos;s important to raise here. A bill is making it&apos;s way through the United States Senate spear-headed by West Virginia Democratic Sen. John Rockefeller,...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Soapbox" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="whereareyourpapers" label="Where are your papers?" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>While this isn't a post directly related to my latest random technological fiddlings, I still feel it's important to raise here.</p>

<p>A bill is making it's way through the United States Senate spear-headed by West Virginia Democratic Sen. John Rockefeller, the head of the Senate Committee on Commerce, Science, and Transportation, and Sen. Olympia Snowe, a Republican.  This piece of legislation would, in effect, give the president the authority to <em><strong>shut down any network in the U.S. they so chose.</strong></em>  The bill dresses all this in a nice suit of "Oh wait, only for national security reasons".</p>

<p>What's scary is that what exactly constitutes a national security concern has always been somewhat ill-defined.  During the 1960s, any organization that spoke against the government could be monitored under exactly that same justification.  During the McCarthy era, countless individuals, organizations, and businesses were monitored and sometime hauled in front of congress to answer questions about their political beliefs, often at the expense of common sense and decency.</p>

<p>The idea that these individuals might have communist leanings was all the justification that was needed to declare them a potential threat to national security and all by kill them.</p>

<p>As more and more bits of information (well, there's Rush Limbaugh, too) are being placed at the fingertips of the world, this becomes a more sweeping proposal with each passing second.  The internet has grown and evolved in a way no one could possibly have predicted and simply switching it off would be chopping off the national arm.</p>

<p>The bill doesn't simply stop at essentially switching off the U.S. edge devices though.  It would give the president the ability to also power down private networks and dictate how those systems are configured.  As is well and widely known, the open source movement is a critical part of the internet, from a security standpoint as well as from one of it's overall development.  I for one, am none too keen on the idea of a body of officials (one of whom famously once described the internet as 'a series of tubes') dictating to me how I can and can't configure the router sitting on the floor of my room.</p>

<p>One of the bill's provisions is to create a licensing requirement for people who want to work in computer security.  There are driver's licenses, and I still got rear-ended by someone who didn't know (by her own admission) that she didn't know that wet surfaces increased breaking distance.  Creating a certification could be a beneficial bullet on anyone's resume, but having a mandatory license will have the same effect that teaching anything else seems to; directing people to one way of thinking and academically punishing you for not learning something precisely the way it's taught.  </p>

<p>The danger also lies in that a license is bound to make people think they know what they're talking about.  We all know that there are plenty of idiots out there with college degrees, and I seriously doubt that the Senators have a four-year study program in mind; best-case scenario, it turns out exactly the same type of people.</p>

<p>Imagine the security products vendors could sell with "U.S. Government Approved!" stickers on the box.  Creating a mandatory license will only serve to give credence to the voice of people just studious enough to pass it and in the eyes of those who recognize that, diminish the value of the license of the people who are competent.</p>

<p>One of the most effective ways to learn something is to be burned by NOT knowing it at a key moment, and that's how a lot of people know a lot of things.  As some of you may know, I spent about eight years in the United States Marine Corps (and no, I don't feel that makes me inherently a bad-ass); there's a apropos expression: "No combat-ready unit has ever passed inspection and no inspection-ready unit has ever passed combat".  There is no way that training can compensate for experience.</p>

<p>After graduating from an intensive Arabic language program, I rapidly found out that what I knew was perfect for a laboratory situation, but completely unsuited for something as simple as a coffee shop.  </p>

<p>The first thing to learn is how to learn what you need to forget.</p>

<p>The Rockefeller/Snowe bill, quite simply, must not be allowed to pass.</p>]]>
        
    </content>
</entry>

<entry>
    <title>I really hope /bin/mail did this...</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/03/i-really-hope-binmail-did-this.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1188</id>

    <published>2009-03-22T12:44:17Z</published>
    <updated>2009-03-22T13:04:55Z</updated>

    <summary> ...and for security reasons, I won&apos;t write a blog entry about it. In other news, I&apos;m now working in our office in Austin so I&apos;ve moved there as well. As part of setting up my internet connection, I decided...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Misc" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cisco" label="cisco" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wireless" label="wireless" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://geeklair.net/~pratzsch/blog/assets_c/2009/03/links-404.html" onclick="window.open('http://geeklair.net/~pratzsch/blog/assets_c/2009/03/links-404.html','popup','width=829,height=361,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://geeklair.net/~pratzsch/blog/assets_c/2009/03/links-thumb-200x87-404.gif" width="200" height="87" alt="links.gif" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span></p>

<p>...and for security reasons, I won't write a blog entry about it.</p>

<p>In other news, I'm now working in our office in Austin so I've moved there as well.  As part of setting up my internet connection, I decided to force myself to learn how to configure the wireless functionality on my Cisco 1801.  It turns out it's actually pretty easy:</p>

<p>interface Dot11Radio0<br />
 description 192.168.100.0/24_Wireless<br />
 ip address 192.168.100.2 255.255.255.0<br />
 !<br />
 ssid fieryweasel <-- also my Twitter account<br />
 !<br />
 speed basic-54.0<br />
 station-role root<br />
 no routing dynamic<br />
!<br />
dot11 ssid fieryweasel   <br />
   authentication open <br />
   guest-mode<br />
   infrastructure-ssid</p>

<p>Looking at the wireless traffic with a protocol analyzer, I kept seeing the 'hello' packets used by the Cisco discovery protocol - I had forgotten to enter "no cdp enable", but after that it cleaned up nicely.  There's currently no authentication in place, but since the only thing the router is presently connected to is my ASA, I'm in no rush.  Perhaps I'll get more in-depth about the configuration options in a later entry.  If there's anything else Cisco-related that anyone's curious about, let me know.  Chances are I don't know it but it would be a good way to learn.</p>]]>
        
    </content>
</entry>

<entry>
    <title>The discovery of languages on Earth</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/03/the-discovery-of-languages-on.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1186</id>

    <published>2009-03-19T16:45:29Z</published>
    <updated>2009-03-19T17:35:53Z</updated>

    <summary>I&apos;ve been reading a number of books recently dealing with how various languages were discovered, analyzed, and translated in the past. If the language itself is unknown, the key has almost always been what&apos;s referred to as a &apos;bilingual&apos;, some...</summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Linguistics" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="linguistics" label="linguistics" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="translation" label="translation" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[<p>I've been reading a number of books recently dealing with how various languages were discovered, analyzed, and translated in the past.  If the language itself is unknown, the key has almost always been what's referred to as a 'bilingual', some text of sufficient length written in at least one known language as well as the unknown.</p>

<p>The most famous example of this is of course the 1,700-lb Rosetta stone, with the same text in Greek, demotic, and Egyptian hieroglyphs.  The Rosetta stone allowed Champollion (arguably) to finish deciphering the hieroglyphic language by means of comparing proper names in the Greek and attempting to find the equivalent hieroglyphs.</p>

<p>I started thinking about how various languages might be deciphered in a distant future when humans were long gone.  It occurred to me that about the only real stone inscriptions in any quantity are those that appear on grave stones, and the length of each inscription consists almost entirely of names and numbers if not exclusively.  Granted, there are also some monument inscriptions and thing of that nature.  </p>

<p>As more and more things become electronic and internet-bound, it may appear to some future civilization that at some point we just stopped writing.  But what about plastics?  An increasing number of things are plastic, and it's well-known that plastics last a ridiculously long time before finally decomposing.  Something as simple as Coke bottles discovered in the landfills of various nations may someday allow many human languages to be unraveled.  It's an odd thought that our garbage may be the only real clue to our civilizations.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Tkinter</title>
    <link rel="alternate" type="text/html" href="http://geeklair.net/~pratzsch/blog/2009/03/tkinter.html" />
    <id>tag:geeklair.net,2009:/~pratzsch/blog//14.1184</id>

    <published>2009-03-12T13:48:00Z</published>
    <updated>2009-03-12T14:15:33Z</updated>

    <summary><![CDATA[As part of my continuing effort to hate Python less, I decided to do some fiddling with the Python Tkinter library.&nbsp; For those of you playing along at home, it's a series of libraries (or whatever Python calls them) for...]]></summary>
    <author>
        <name>Philip Ratzsch</name>
        <uri>http://www.linkedin.com/in/ratzsch</uri>
    </author>
    
        <category term="Dev" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tkinter" label="tkinter" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://geeklair.net/~pratzsch/blog/">
        <![CDATA[As part of my continuing effort to hate Python less, I decided to do some fiddling with the Python Tkinter library.&nbsp; For those of you playing along at home, it's a series of libraries (or whatever Python calls them) for performing Tk/Tcl tasks. &nbsp;<br /><br />I've never done GUI coding before.&nbsp; Up to this point, all my code's execution space was limited to browsers and the occasional CLI tool.&nbsp; Like one would expect from an object-oriented language, the GUI behaves in much the same fashion, with 'widgets' as they are called (a button, a menu, text field, etc.) descend from a root frame.<br /><br />from Tkinter import *&nbsp; # Get the library<br /><br />class App:<br /><br />&nbsp;&nbsp;&nbsp; # Draw GUI and init<br />&nbsp;&nbsp;&nbsp; def __init__(self, master):<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Parent frame<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame = Frame(master)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The pack() method returns an object of type None so Frame(master).pack() will only work if you don't want to reference 'frame' again.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.pack()<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Labels are simply output areas<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.display_text = Label(frame,text="")<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # side=TOP - Sets the widget's placement<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # TOP, BOTTOM, LEFT, and RIGHT are constants set by Tk<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.display_text.pack(side=TOP)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Create a button<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Args:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp; frame - Set 'frame' as the parent of the button<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp; text - an attribute setting the text on the button<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp; command - the callback which will fire when the button is clicked.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.button = Button(frame, text="This is a button", command=self.a_method)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.button.pack(side=LEFT)<br /><br />&nbsp;&nbsp;&nbsp; # A callback method<br />&nbsp;&nbsp;&nbsp; def a_method(self):<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # the config() (or configure() ) method is used to modify widget options<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.display_text.config(text="Button pressed")<br /><br />#Yet another thing I hate about Python - if the next four lines are at the top of the file, this doesn't work.<br />root = Tk() #Instantiate the root widget<br />root.title('Test App')&nbsp; # ...and give the window a title<br />app = App(root)&nbsp; #Instantiate the App class, which contains all the logic<br />root.mainloop() # Start the event handling loop<br /><br />Much like in CSS, object placement seems to get exponentially more troublesome as the number of objects grow.&nbsp; <br /><br />While so far the only thing I've done with this is write a utility for work (and thereby getting some more practice with Python's xmlrpclib methods) I think I'll definitely have to keep messing around with this.<br /><br />Play around with it a bit and let me know what you end up creating!<br />]]>
        
    </content>
</entry>

</feed>
