<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>yPass.net</title>
	
	<link>http://www.ypass.net/blog</link>
	<description>Solaris, PHP, and Random Things</description>
	<lastBuildDate>Fri, 22 Feb 2013 18:55:07 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ypass" /><feedburner:info uri="ypass" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>The Greatest AWS Advertisement Ever</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/CWgIaB2yrus/</link>
		<comments>http://www.ypass.net/blog/2013/02/the-greatest-aws-advertisement-ever/#comments</comments>
		<pubDate>Fri, 22 Feb 2013 18:52:40 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=662</guid>
		<description><![CDATA[John, There is going to be a lot of equipment coming into the facility. I&#8217;d guess somewhere around 70 pieces of equipment total. Of those, most will be liquidated. I spoke with Chris about that yesterday and he&#8217;s aware of what&#8217;s happening. Either a rack or a cabinet is fine. It does not matter to [...]]]></description>
				<content:encoded><![CDATA[<p><strike>John,</p>
<ol>
<li>There is going to be a lot of equipment coming into the facility.  I&#8217;d guess somewhere around 70 pieces of equipment total.  Of those, most will be liquidated.  I spoke with Chris about that yesterday and he&#8217;s aware of what&#8217;s happening.</li>
<p></p>
<li>Either a rack or a cabinet is fine.  It does not matter to us.</li>
<p></p>
<li>All equipment to be racked will have rail kits and they are standard 4 post 19&#8243; equipment</li>
<p></p>
<li>To start, we&#8217;re only asking for a single gigabit ethernet drop.  We&#8217;ll run our own distribution switch from that drop (1U 19&#8243; rack mount cisco 3560 48 port gig-e switch).  I think Matthew can provide the full cross-connect information for that drop.  All equipment in the rack will then connect to that switch for networking.</li>
<p></p>
<li>I&#8217;m not sure how you guys do power distribution.  All of the servers have dual power supplies.  We are looking to rack no more than 15 servers total.  This means we&#8217;re going to need about 30 power outlets (standard 110V) and it should not draw more than 40 amps total.  I assume you run redundant power circuits, in which case if you could run two power drops with 16 outlet PDUs of 30 amps each, that would be more than enough.  If needed, we can provide managed PDUs as well.  We have about 16 8 port 20 amp APC PDUs and 2 16 port 30 amp APC PDUs that will be available.  I would prefer having 2 30 amp drops if that&#8217;s possible.</li>
<p></p>
<li>Our team will work directly with asset management to get everything straightened out.  That&#8217;s probably going to be a lengthy process.</li>
<p></p>
<li>We are requesting — if possible — one piece of equipment be moved from our Equinix Ashburn location by IT so we can get started building our infrastructure.  Equipment from our Equinix San Jose datacenter will be shipped by a vendor on or about March 4th. It should arrive at the Sterling location in a crate that same week.  Equipment from our QTS Atlanta datacenter will be unracked and moved to the Atlanta office location.  Equipment from our Equinix Ashburn will be unracked and moved by Igor and Shawn on the week of the 11th.  Again, most of this equipment will be liquidated.<br />
</p>
<li>Igor, Shawn, and I are the only ones with access to the current Ashburn Equinix datacenter.  However, we can contact the facility and grant escorted access to whoever is going to be moving the equipment.  If need be, we can even have the datacenter remote hands staff pull the server and have it ready for pickup.</li>
</ol>
<p>I&#8217;m available for a meeting at any time.</strike></p>
<p># ./create-instance</p>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=662" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/CWgIaB2yrus" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2013/02/the-greatest-aws-advertisement-ever/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2013/02/the-greatest-aws-advertisement-ever/</feedburner:origLink></item>
		<item>
		<title>Sync A Large Directory Structure to S3</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/Dvmztysmowc/</link>
		<comments>http://www.ypass.net/blog/2012/10/sync-a-large-directory-structure-to-s3/#comments</comments>
		<pubDate>Tue, 23 Oct 2012 19:05:00 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Amazon AWS EC2]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[S3]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=640</guid>
		<description><![CDATA[There&#8217;s a handful of commands out there that deal with command line operations for s3. The most popular (I think) is s3tool&#8217;s s3cmd. However, we have a filesystem that we would like to keep in sync with S3 while we are working on migrating. s3cmd has a sync command that works really well for filesystems [...]]]></description>
				<content:encoded><![CDATA[<p>There&#8217;s a handful of commands out there that deal with command line operations for s3.  The most popular (I think) is s3tool&#8217;s s3cmd.  However, we have a filesystem that we would like to keep in sync with S3 while we are working on migrating.  s3cmd has a sync command that works really well for filesystems with a small to medium number of files (not total file size&#8230; total file count).  We have a filesystem that contains many millions of files which can be problematic for programs like s3cmd (even rsync has issues with this many files).  The problem (or feature) is that they tend to calculate the changes for everything recursively all at once, then they start performing operations.</p>
<p>If you do not need this feature, it takes a lot less memory to calculate all the changes on a directory by directory basis.  Of course, if you&#8217;re syncing a single directory with millions of files, you have bigger problems anyway and this won&#8217;t help.  Luckily, we tend to split up the files into categorized directories.</p>
<p>So, I wrote this very simple little PHP script that keeps S3 in sync with a local directory structure.  It shouldn&#8217;t be too hard to rewrite this in just about any language.  It&#8217;s not complicated at all.</p>
<p><b>IMPORTANT NOTES</b>:</p>
<ul>
<li>This <i>WILL</i> dereference symlinks. So make sure you do not have recursive symlinks in your directory structure.  For example: &#8220;ln -s . recurseme&#8221; would be bad</li>
<li>The local filesystem is <i><b>always</b></i> authoritative.  If it doesn&#8217;t exist locally, it will get deleted from S3</li>
<li>It does not compare MD5 sums (even though you can see that I thought about it in the code)</li>
<li>It does not update the S3 side timestamp with the local timestamp and will only sync if the file size is different or the local timestamp is later than the S3 timestamp</li>
</ul>
<pre><code>#!/usr/bin/php
&lt;?
require_once('AWSSDKforPHP/sdk.class.php');

$s3 = new AmazonS3();
$basepath = '/path/to/sync';
$bucket = 'your-bucket-name';

function getDirectoryList($localdir) {
    global $directoryList;

    /*
    // this is useful for testing
    if (substr_count($localdir, '/') &gt; 2) {
        return;
    }
    */
    $d = opendir($localdir);
    while ($ent = readdir($d)) {
        if ($ent == '.' || $ent == '..') {
            continue;
        }
        if (is_dir($localdir . '/' . $ent)) {
            $directoryList[] = $localdir . '/' . $ent;
            getDirectoryList($localdir . '/' . $ent);
        }
    }
    closedir($d);
}

function syncDirectory($basepath, $localdir) {
    global $s3;

    $remotedir = preg_replace('%^' . $basepath . '/?%', '', $localdir);
    echo "getting s3 file list for $remotedir\n";
    $s3filelist = getRemoteDirectory($remotedir);
    echo "getting local file list for $localdir\n";
    $localfilelist = getLocalDirectory($basepath, $localdir);
    echo "calculating differences\n";
    foreach ($localfilelist as $key =&gt; $linfo) {
        if (! array_key_exists($key, $s3filelist)) {
            syncFile($basepath . '/' . $key, $key);
            continue;
        }
        $rinfo = $s3filelist[$key];
        if ($linfo['lastmodified'] &gt; $rinfo['lastmodified']) {
            syncFile($basepath . '/' . $key, $key);
            continue;
        }
        if ($linfo['size'] != $rinfo['size']) {
            syncFile($basepath . '/' . $key, $key);
            continue;
        }
    }
    foreach ($s3filelist as $key =&gt; $rinfo) {
        if (! array_key_exists($key, $localfilelist)) {
            deleteFile($key);
            continue;
        }
    }
}

function getRemoteDirectory($remotedir) {
    global $s3, $bucket;

    $s3filelist = array();
    do {
        $args['delimiter'] = '/';
        if (strlen($remotedir)) {
            $args['prefix'] = $remotedir . '/';
        }
        if (isset($lastkey)) {
            $args['marker'] = $lastkey;
        }
        $response = $s3-&gt;list_objects($bucket, $args);
        if (! $response-&gt;isOK()) {
            echo "error: failed to get S3 object list for static $remotedir\n";
            return false;
        }
        foreach ($response-&gt;body-&gt;Contents as $s3object) {
            $s3filelist[(string)$s3object-&gt;Key] = array(
                    'md5' =&gt; preg_replace('/^\"(.*)\"$/', '$1',
                        (string)$s3object-&gt;ETag),
                    'size' =&gt; (string)$s3object-&gt;Size,
                    'lastmodified' =&gt; strtotime((string)$s3object-&gt;LastModified),
                    );
            $lastkey = (string)$s3object-&gt;Key;
        }
        $isTruncated = (string)$response-&gt;body-&gt;IsTruncated;
        unset($response);
    } while ($isTruncated == 'true');
    return $s3filelist;
}

function getLocalDirectory($basepath, $localdir) {
    $d = opendir($localdir);
    if (! $d) {
        return false;
    }
    $localfilelist = array();
    while ($ent = readdir($d)) {
        if ($ent == '.' || $ent == '..') {
            continue;
        }
        if (is_dir($localdir . '/' . $ent)) {
            continue;
        }
        $localfile = $localdir . '/' . $ent;
        $key = preg_replace('%^' . $basepath . '/?%', '', $localfile);
        $localfilelist[$key] = array(
                'md5' =&gt; $GLOBAL['checkmd5'] == true ? md5_file($localfile) : null,
                'size' =&gt; filesize($localfile),
                'lastmodified' =&gt; filemtime($localfile),
                );
    }
    closedir($d);
    return $localfilelist;
}

function syncFile($localfile, $remotefile) {
    global $s3, $bucket;

    echo "     sync  : $localfile -&gt; s3://$bucket/$remotefile\n";
    try {
        $response = $s3-&gt;create_object($bucket, $remotefile,
                array('fileUpload' =&gt; $localfile));
        if (! $response-&gt;isOK()) {
            echo "error: failed to sync $localfile\n";
            echo $response-&gt;body-&gt;Code . ": " . $response-&gt;body-&gt;Message . "\n";
        }
    } catch (Exception $e) {
        echo "error: failed to sync $localfile\n";
        echo $e-&gt;getMessage . "\n";
    }
}

function deleteFile($remotefile) {
    global $s3, $bucket;

    echo "     delete: s3://$bucket/$remotefile\n";
    try {
        $response = $s3-&gt;delete_object($bucket, $key);
        if (! $response-&gt;isOK()) {
            echo "error: failed to delete s3://$bucket/$key:\n";
            echo $response-&gt;body-&gt;Code . ": " . $response-&gt;body-&gt;Message . "\n";
        }
    } catch (Exception $e) {
        echo "error: failed to sync $localfile\n";
        echo $e-&gt;getMessage . "\n";
    }
}

$directoryList = array();
getDirectoryList($basepath);
foreach ($directoryList as $localdir) {
    syncDirectory($basepath, $localdir);
}

?&gt;
</code></pre>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=640" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/Dvmztysmowc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2012/10/sync-a-large-directory-structure-to-s3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2012/10/sync-a-large-directory-structure-to-s3/</feedburner:origLink></item>
		<item>
		<title>Ping Is Too Pessimistic</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/lnEwsy_3VpI/</link>
		<comments>http://www.ypass.net/blog/2012/06/ping-is-too-pessimistic/#comments</comments>
		<pubDate>Sat, 23 Jun 2012 19:34:47 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=631</guid>
		<description><![CDATA[There are many billions of packets flying across the Internet every single second. The fact that a packet can get from one host in one part of the world to another host in another part of the world in a matter of milliseconds is absolutely amazing. The ping utility has long been used as a [...]]]></description>
				<content:encoded><![CDATA[<p>There are many billions of packets flying across the Internet every single second.  The fact that a packet can get from one host in one part of the world to another host in another part of the world in a matter of milliseconds is absolutely amazing.  The ping utility has long been used as a measure of checking if this awesomeness works&#8230; but unfortunately, it is very pessimistic.</p>
<p>To think that I can send 56 bytes of non-sense data from my machine to any Internet connected machine on the planet and have ping tell me &#8220;0% packets lost&#8221; seems rather depressing.  Instead, ping should be happily exclaim &#8220;100% packets found!&#8221;</p>
<p>I wrote a little patch that makes the ping utility a happier utility program and the user benefits from seeing just how awesome the Internet is (unless of course, some packets were not found).  ping should be a &#8220;glass is half-full&#8221; kinda program if you ask me.</p>
<pre>
eric@lolbuntu:/tmp/iputils-20071127.new$ sudo ./ping -c 3 www.google.com
PING www.l.google.com (74.125.45.147) 56(84) bytes of data.
64 bytes from yx-in-f147.1e100.net (74.125.45.147): icmp_seq=1 ttl=51 time=51.5 ms
64 bytes from yx-in-f147.1e100.net (74.125.45.147): icmp_seq=2 ttl=51 time=50.0 ms
64 bytes from yx-in-f147.1e100.net (74.125.45.147): icmp_seq=3 ttl=51 time=49.7 ms

--- www.l.google.com ping statistics ---
3 packets transmitted, 3 received, 100% packets found, time 2002ms
rtt min/avg/max/mdev = 49.792/50.433/51.504/0.762 ms
</pre>
<p>Here&#8217;s the patch:</p>
<pre>
--- iputils-20071127/ping_common.c	2007-12-09 20:56:22.000000000 -0700
+++ iputils-20071127.new/ping_common.c	2012-06-23 00:16:47.838210690 -0600
@@ -795,9 +795,9 @@
 	if (nerrors)
 		printf(", +%ld errors", nerrors);
 	if (ntransmitted) {
-		printf(", %d%% packet loss",
-		       (int) ((((long long)(ntransmitted - nreceived)) * 100) /
-			      ntransmitted));
+		printf(", %d%% packets found",
+		       (int) (100 - ((((long long)(ntransmitted - nreceived)) * 100) /
+			      ntransmitted)));
 		printf(", time %ldms", 1000*tv.tv_sec+tv.tv_usec/1000);
 	}
 	putchar('\n');
</pre>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=631" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/lnEwsy_3VpI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2012/06/ping-is-too-pessimistic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2012/06/ping-is-too-pessimistic/</feedburner:origLink></item>
		<item>
		<title>A Proper Post-Mortem</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/tEQdzMMXS_o/</link>
		<comments>http://www.ypass.net/blog/2012/06/a-proper-post-mortem/#comments</comments>
		<pubDate>Sun, 17 Jun 2012 06:07:58 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=616</guid>
		<description><![CDATA[There are three companies that I really enjoy doing business with. They are USAA, Amazon (on the consumer side), and Internap (on the tech side). Let&#8217;s skip USAA, because it isn&#8217;t tech oriented and let&#8217;s look at Internap first. When there is a failure in Internap&#8217;s service, 9 times out of 10 they tell me [...]]]></description>
				<content:encoded><![CDATA[<p>There are three companies that I really enjoy doing business with.  They are USAA, Amazon (on the consumer side), and Internap (on the tech side).</p>
<p>Let&#8217;s skip USAA, because it isn&#8217;t tech oriented and let&#8217;s look at Internap first.  When there is a failure in Internap&#8217;s service, 9 times out of 10 they tell me before I realize it.  Most of the time, these failures are transient and I would have never even known there was a problem had Internap not sent me an email giving me the info.</p>
<p>Here&#8217;s an email I got from Internap on May 30th, 2012:</p>
<blockquote><p>At approximately 12:18 EDT on May 30, 2012 we were notified that the BGP session for our Verio provider in the ACS PNAP (Atlanta, GA) was in an active (down) state.  The session recovered at 12:22 EDT and has been stable since that time.</p>
<p>During this time period, you may have noticed some sub-optimal routing and slight latency or packet loss as traffic destined for the Verio network was re-routed through our other providers in the PNAP.  Once the session recovered, you may have noticed sub-optimal routing and slight latency again, as traffic was re-routed back onto Verio.
</p></blockquote>
<p>This type of outage is routine and isn&#8217;t a big deal.  Internap lost an upstream provider at their PNAP.  So what?  I don&#8217;t really care.  I pay them to deal with this and I experienced no downtime.  But what happens when Internap themselves fucks up?  We&#8217;ve had two major Internap outages.  Each time, we&#8217;ve received a full RFO.  One of them was an internal error from a sysadmin and another was a faulty Cisco command module.  Most importantly, we received a full RFO (reason for outage) each time.</p>
<p>Now that we&#8217;ve moved to AWS, June 14th 2012&#8242;s outage RFO from Amazon makes me incredibly happy.  From Amazon:</p>
<blockquote><p>We would like to share some detail about the Amazon Elastic Compute Cloud (EC2) service event last night when power was lost to some EC2 instances and Amazon Elastic Block Store (EBS) volumes in a single Availability Zone in the US East Region.
</p></blockquote>
<p>This is the most beautiful thing I can imagine.  They are not hiding the failures.  They are admitting that it failed and they are giving both the reason why it failed and what they&#8217;re going to do to prevent future failures.  The best part of this is that I didn&#8217;t have to wake up and deal with this all night.  This is why IaaS is a good idea&#8230; as long as this communication continues.</p>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=616" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/tEQdzMMXS_o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2012/06/a-proper-post-mortem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2012/06/a-proper-post-mortem/</feedburner:origLink></item>
		<item>
		<title>Introduction To Syslog Log Levels/Priorities</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/FcX9cMdPa6c/</link>
		<comments>http://www.ypass.net/blog/2012/06/introduction-to-syslog-log-levelspriorities/#comments</comments>
		<pubDate>Thu, 07 Jun 2012 22:56:16 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=606</guid>
		<description><![CDATA[A very common question about syslog is how to decide the appropriate log priority (a.k.a. log level) for a specific log message. Deciding on the correct priority depends on a number of different factors. Syslog allows you define a facility and a log level for each individual log message. The syslog &#8220;facility&#8221; is used to [...]]]></description>
				<content:encoded><![CDATA[<p>A very common question about syslog is how to decide the appropriate log priority (a.k.a. log level) for a specific log message.  Deciding on the correct priority depends on a number of different factors.</p>
<p>Syslog allows you define a facility and a log level for each individual log message.  The syslog &#8220;facility&#8221; is used to separate out log messages by application or by function.  For example, email logs are normally logged on the LOG_MAIL facility.  This groups all email related logs together.  Your systems administrator will assign you a log facility to use.  You should not use an arbitrary facility.</p>
<p>Log priorities are not as cut and dry.  For custom applications, developers and systems administrators need to work together to define what constitutes a certain priority of a message.  In the most generic terms possible, syslog levels are defined as:</p>
<pre><code>       LOG_EMERG      system is unusable
       LOG_ALERT      action must be taken immediately
       LOG_CRIT       critical conditions
       LOG_ERR        error conditions
       LOG_WARNING    warning conditions
       LOG_NOTICE     normal, but significant, condition
       LOG_INFO       informational message
       LOG_DEBUG      debug-level message
</code></pre>
<p>Before digging into specifics on the priority definitions, let me address the developers directly.  These priorities are defined in syslog.h as follows:</p>
<pre><code>#define LOG_EMERG       0       /* system is unusable */
#define LOG_ALERT       1       /* action must be taken immediately */
#define LOG_CRIT        2       /* critical conditions */
#define LOG_ERR         3       /* error conditions */
#define LOG_WARNING     4       /* warning conditions */
#define LOG_NOTICE      5       /* normal but significant condition */
#define LOG_INFO        6       /* informational */
#define LOG_DEBUG       7       /* debug-level messages */
</code></pre>
<p>Normally, your application should call syslog() from some sort of internal logging function/method.  This allows you to set an application-wide maximum log level.  For example, on a production system, you do not want to waste CPU cycles generating debug error messages.  Your application&#8217;s logging function should specify a maximum log level and filter the messages internally via some configuration variable.</p>
<p>For instance, in production, you may only care about messages of priority LOG_ERR and higher.  So you would specify via some variable that your maximum logging level is LOG_ERR (3) and if a message comes into your logging function with a priority of 4 or greater, it is ignored.</p>
<p>The syslog server has the ability to filter messages of specific priorities as well.  Systems administrators may choose to log only LOG_ERR or higher. So if the application is generating LOG_DEBUG error messages and the syslog server is only logging LOG_ERR or higher, this is just wasted processing time for both the application, the syslog server, and possibly even network I/O.</p>
<p>But the main question here is what is the most appropriate log level/priority for a particular message.  Again, this is a hard question to answer because it can vary wildly by application, but in general, I would define them as such:</p>
<ol start="0">
<li><b>LOG_EMERG</b> &#8211; The application has completely crashed and is no longer functioning.  Normally, this will generate a message on the console as well as all root terminals.  This is the most serious error possible.  This should not normally be used applications outside of the system level (filesystems, kernel, etc).  This usually means the entire system has crashed.</li>
<li><b>LOG_ALERT</b> &#8211; The application is unstable and a crash is imminent.  This will generate a message on the console and on root terminals.  This should not normally be used applications outside of the system level (filesystems, kernel, etc).</li>
<li><b>LOG_CRIT</b> &#8211; A serious error occurred during application execution.  Someone (systems administrators and/or developers) should be notified and should take action to correct the issue.</li>
<li><b>LOG_ERR</b> &#8211; An error occurred that should be logged, however it is not critical.  The error may be transient by nature, but it should be logged to help debug future problems via error message trending.  For example, if a connection to a remote server failed, but it will be retried automatically and is fairly self-healing, it is not critical.  But if it fails every night at 2AM, you can look through the logs to find the trend.</li>
<li><b>LOG_WARNING</b> &#8211; The application encountered a situation that it was not expecting, but it can continue.  The application should log the unexpected condition and continue on.</li>
<li><b>LOG_NOTICE</b> &#8211; The application has detected a situation that it was aware of, it can continue, but the condition is possibly incorrect.</li>
<li><b>LOG_INFO</b> &#8211; For completely informational purposes, the application is simply logging what it is doing.  This is useful when trying to find out where an error message is occurring during code execution.</li>
<li><b>LOG_DEBUG</b> &#8211; Detailed error messages describing the exact state of internal variables that may be helpful when debugging problems.</li>
</ol>
<p>So as an application developer, you may be asking yourself why you should not be using LOG_EMERG or LOG_ALERT.  This is a valid question and this depends on you working with your systems administrator to determine if these log levels are appropriate.  By default, almost every syslog implementation will log all LOG_EMERG and LOG_ALERT messages to the console which can make it difficult to actually work on a system to fix the problem if the log messages are flying by on the screen.  Your systems administrator can set up filters on the syslog server to log them to the appropriate place, but before using those two priority levels, you should definitely consult with your systems administrator.</p>
<p>LOG_CRIT should be reserved for error messages that actually need to be visible to systems administrators and/or developers.  If the error message you are logging will be ignored by everyone receiving the error, it should not be considered critical.  Excuse the tautology, but &#8220;Critical errors are critical.&#8221;  A critical error requires user intervention.  If it does not require user intervention, it should be logged as LOG_ERR.</p>
<p>Priorities of LOG_WARNING and lower should be used at the developer&#8217;s discretion.  It is common practice not to log any message with a priority lower than LOG_ERR on a production system.</p>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=606" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/FcX9cMdPa6c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2012/06/introduction-to-syslog-log-levelspriorities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2012/06/introduction-to-syslog-log-levelspriorities/</feedburner:origLink></item>
		<item>
		<title>Connecting a Fortinet VPN to Amazon AWS VPC</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/vDkDaDIOHCM/</link>
		<comments>http://www.ypass.net/blog/2012/05/connecting-a-fortinet-vpn-to-amazon-aws-vpc/#comments</comments>
		<pubDate>Sat, 05 May 2012 04:26:20 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Amazon AWS EC2]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=588</guid>
		<description><![CDATA[There is a lot of spotty information out there on the Internet on how to connect a Fortinet VPN router to an Amazon AWS VPC VPN, but a lot of it is confusing, wants you to use the GUI, is outdated, or simply doesn&#8217;t work that well. It took me a bit to get all [...]]]></description>
				<content:encoded><![CDATA[<p>There is a lot of spotty information out there on the Internet on how to connect a Fortinet VPN router to an Amazon AWS VPC VPN, but a lot of it is confusing, wants you to use the GUI, is outdated, or simply doesn&#8217;t work that well.  It took me a bit to get all of the pieces put together, but here&#8217;s the basic steps involved:</p>
<ol>
<li>Enable asymmetric routing &#8211; this allows packets to go out through one of the tunnels and come back through the other</li>
<li>Create interface based VPN tunnels (phase1 and phase2)</li>
<li>Configure the wan1 sub-interfaces automatically created in step 2</li>
<li>Configure BGP</li>
<li>Configure firewall rules</li>
</ol>
<p>So here&#8217;s a generic configuration that does this.  If you right click on the VPN gateway in the AWS Console and download the &#8220;Generic&#8221; configuration, you can easily change the values in this config.</p>
<p>Also, you need to make sure that the policy numbers I put in for the firewall configuration (policies 200-203) do not conflict with any existing policy numbers you have configured.  If they do, just pick a different number; the number doesn&#8217;t matter.  Note that these policies allow all traffic in and out of your internal network and the VPC.  After you get it working, you&#8217;ll probably want to tighten those policies up quite a bit.</p>
<p>So without further ado:</p>
<pre>
config system settings
    set asymroute enable
end

config vpn ipsec phase1-interface
    edit "amazon1"
        set interface "wan1"
        set dpd enable
        set dhgrp 2
        set proposal aes128-sha1
        set remote-gw &lt;CHANGE: Tunnel #1 Outside Virtual Private Gateway&gt;
        set psksecret &lt;CHANGE: Tunnel #1 Pre-Shared Key&gt;
        set dpd-retryinterval 10
    next
    edit "amazon2"
        set interface "wan1"
        set dpd enable
        set dhgrp 2
        set proposal aes128-sha1
        set remote-gw &lt;CHANGE: Tunnel #2 Outside Virtual Private Gateway&gt;
        set psksecret &lt;CHANGE: Tunnel #2 Pre-Shared Key&gt;
        set dpd-retryinterval 10
    next
end

config vpn ipsec phase2-interface
    edit "amazon1"
        set dhgrp 2
        set pfs enable
        set phase1name "amazon1"
        set proposal aes128-sha1
        set replay enable
    next
    edit "amazon2"
        set dhgrp 2
        set pfs enable
        set phase1name "amazon2"
        set proposal aes128-sha1
        set replay enable
    next
end

config system interface
    edit "amazon1"
        set vdom "root"
        set ip &lt;CHANGE: Tunnel #1 Inside Customer Gateway&gt; 255.255.255.255
        set type tunnel
        set remote-ip &lt;CHANGE: Tunnel #1 Inside Virtual Private Gateway&gt;
        set interface "wan1"
    next
    edit "amazon2"
        set vdom "root"
        set ip &lt;CHANGE: Tunnel #2 Inside Customer Gateway&gt; 255.255.255.255
        set type tunnel
        set remote-ip &lt;CHANGE: Tunnel #2 Inside Virtual Private Gateway&gt;
        set interface "wan1"
    next
end

config router bgp
    set as &lt;CHANGE: BGP Customer Gateway ASN&gt;
        config neighbor
            edit &lt;CHANGE: Tunnel #1 Inside Virtual Private Gateway&gt;
                set remote-as &lt;CHANGE: Tunnel #1 BGP Virtual Private Gateway ASN&gt;
            next
            edit &lt;CHANGE: Tunnel #2 Inside Virtual Private Gateway&gt;
                set remote-as &lt;CHANGE: Tunnel #2 BGP Virtual Private Gateway ASN&gt;
            next
        end
        config network
            edit 1
                set prefix &lt;CHANGE: Your Local Net&gt; &lt;CHANGE: Your Local netmask&gt;
            next
        end
        config redistribute "connected"
        end
        config redistribute "rip"
        end
        config redistribute "ospf"
        end
        config redistribute "static"
        end
    set router-id &lt;CHANGE: Tunnel #1 Inside Virtual Private Gateway&gt;
end

config firewall policy
    edit 200
        set srcintf "internal"
        set dstintf "amazon1"
            set srcaddr "all"
            set dstaddr "all"
        set action accept
        set schedule "always"
            set service "ANY"
    next
    edit 201
        set srcintf "amazon1"
        set dstintf "internal"
            set srcaddr "all"
            set dstaddr "all"
        set action accept
        set schedule "always"
            set service "ANY"
    next
    edit 202
        set srcintf "internal"
        set dstintf "amazon2"
            set srcaddr "all"
            set dstaddr "all"
        set action accept
        set schedule "always"
            set service "ANY"
    next
    edit 203
        set srcintf "amazon2"
        set dstintf "internal"
            set srcaddr "all"
            set dstaddr "all"
        set action accept
        set schedule "always"
            set service "ANY"
    next
end
</pre>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=588" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/vDkDaDIOHCM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2012/05/connecting-a-fortinet-vpn-to-amazon-aws-vpc/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2012/05/connecting-a-fortinet-vpn-to-amazon-aws-vpc/</feedburner:origLink></item>
		<item>
		<title>Conditionally Installing Packages With Puppet</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/H_VQt6Y2Rus/</link>
		<comments>http://www.ypass.net/blog/2012/03/conditionally-installing-packages-with-puppet/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 16:53:03 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Puppet]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=576</guid>
		<description><![CDATA[If you want to install a package using puppet only if another package is already installed, you can use puppet&#8217;s virtual resources to accomplish this. The proper way to do this is to define your two classes and then realize the virtual package in the dependent class. For example, if I wanted to install php5-dev [...]]]></description>
				<content:encoded><![CDATA[<p>If you want to install a package using puppet only if another package is already installed, you can use puppet&#8217;s virtual resources to accomplish this.  The proper way to do this is to define your two classes and then realize the virtual package in the dependent class.  For example, if I wanted to install php5-dev <b><i>only if</i></b> gcc was installed, I would make two modules:  a gcc module and a php5 module.</p>
<p>In the php5 module:</p>
<pre><code>
class php5($type) {
    package { 'php5-common':
        ensure => installed,
    }
    package { 'php5-cli':
        ensure => installed,
        require => Package['php5-common'],
    }
    <b>@package { 'php5-dev':
        ensure => installed,
        tag => 'develpkgs',
    }</b>
}
</code></pre>
<p>The &#8216;@&#8217; symbol defines the php5-dev package as a virtual resource, so it doesn&#8217;t actually get realized when the puppet manifest is compiled unless some other module realizes it.  To realize it, we go into our gcc module:</p>
<pre><code>
class gcc {
    package { 'gcc': ensure => installed, }
    package { 'g++': ensure => installed, }
    package { 'make': ensure => installed, }
    <b>Package &lt;| tag == 'develpkgs' |&gt;</b>
}
</code></pre>
<p>This will search through all of your modules and realize any virtual resource that is tagged with &#8216;develpkgs&#8217;.  So for example, if you have another module called mysql and you want to install the mysql development package:</p>
<pre><code>
class mysql {
    package { 'mysql': ensure => installed, }
    package { 'mysql-server': ensure => installed, }
    <b>@package { 'libmysqlclient-dev':
        ensure => installed,
        tag => 'develpkgs',
    }</b>
}
</code></pre>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=576" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/H_VQt6Y2Rus" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2012/03/conditionally-installing-packages-with-puppet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2012/03/conditionally-installing-packages-with-puppet/</feedburner:origLink></item>
		<item>
		<title>Using LAME to Concatenate MP3 Files</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/AvNRaEenePs/</link>
		<comments>http://www.ypass.net/blog/2012/02/using-lame-to-concatenate-mp3-files/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 20:17:43 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[encoding]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=567</guid>
		<description><![CDATA[I needed a way to concatenate multiple MP3 files of varying bitrate/sample rate/channels and I needed it to be scriptable to handle pretty much any permutation of various input MP3 formats. I came up with a simple script that does just that. It&#8217;s certainly not ideal, because it requires re-encoding everything 2 (more) times, but [...]]]></description>
				<content:encoded><![CDATA[<p>I needed a way to concatenate multiple MP3 files of varying bitrate/sample rate/channels and I needed it to be scriptable to handle pretty much any permutation of various input MP3 formats.</p>
<p>I came up with a simple script that does just that.  It&#8217;s certainly not ideal, because it requires re-encoding everything 2 (more) times, but it works well enough for me.  Of course, the input files can be anything lame supports, so you can pass in AIFF files which makes this a little better.</p>
<p>The goal was to take a short intro audio file, a long content audio file, and a short outro audio file and pull them all together.  To do this, I first transcode each audio file to an MP3 with known sample rate, channels, and bitrate.  Then I decode that newly encoded file to PCM.  Finally, it encodes the PCM to a new MP3 file with my desired final MP3 settings.</p>
<pre>
for f in intro.mp3 content.mp3 outro.mp3 ; do
        lame -m m -b 192 --resample 44.1 $f - | lame --decode -t --mp3input - -
done | lame -r -m m -s 44.1 --resample 22.05 - outfile.mp3
</pre>
<p>I&#8217;m going to have to do this same thing with video using ffmpeg in the near future.  I have a feeling that&#8217;s going to be a lot more difficult.</p>
<p>Thanks to <a href="http://serialized.net/2007/09/quick-lame-tip-concatenate-mp3s/">this guy</a> for sending me down this path.</p>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=567" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/AvNRaEenePs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2012/02/using-lame-to-concatenate-mp3-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2012/02/using-lame-to-concatenate-mp3-files/</feedburner:origLink></item>
		<item>
		<title>Dencor Energy Control Systems – Bad Idea Or Worst Idea?</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/N0nJvvcE2qQ/</link>
		<comments>http://www.ypass.net/blog/2011/07/dencor-energy-control-systems/#comments</comments>
		<pubDate>Sun, 17 Jul 2011 00:03:10 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=559</guid>
		<description><![CDATA[I&#8217;m going to deviate slightly from what I normally post about on here, but I guess this is somehow tangentially related to technology. I bought a new house a few months back and it had a Dencor Energy Control System in it. Of course, I had no clue what this system does (and frankly, I&#8217;m [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m going to deviate slightly from what I normally post about on here, but I guess this is somehow tangentially related to technology.  I bought a new house a few months back and it had a Dencor Energy Control System in it.  Of course, I had no clue what this system does (and frankly, I&#8217;m still not entirely sure), but it wasn&#8217;t that big of a deal until recently.</p>
<p>Basically, the system consists of a programmable interface inside the house and a relay disconnect outside of the house.  I&#8217;ve spoken to two different electricians about the system and they both say they also know nothing about it.  The system that I have was installed by the original builders back in the late 70s or so, so we&#8217;re talking about pretty old technology here.  I&#8217;m sure things have progressed since then, but that&#8217;s not really the point of this post.</p>
<p>The problem is that I have 3 electrical outlets on different breakers that mysteriously stopped working.  This may or may not be related to this Dencor Energy Management System, but since I have no idea how this thing works, it seemed like a good thing to investigate.  When I first bought the house, I was kind of curious how the system worked, but when I called the Dencor headquarters, they told me it was going to cost me $20 or $30 to get a copy of the manual.  I wasn&#8217;t <i>that</i> curious.</p>
<p>So now that I can&#8217;t charge my razor or my fancy electronic toothbrushes once these outlets died, I decided to try again and I emailed the president of Dencor Energy Control Systems, Matt Essig, with this email:</p>
<blockquote><p>I purchased a home back in February and it seems the original builder installed Dencor energy management systems throughout the neighborhood (back in the 70s).  We&#8217;ve recently had a handful of outlets on various breakers stop working and I can&#8217;t figure out any reason why other than possibly this system.  I&#8217;ve asked all of my neighbors if they know how this thing works and no one knows anything about it.  </p>
<p>It says DDS-809 on the outer cover and on the circuit board it lists 809-1002.</p>
<p>I spoke with someone a few months back and they said you would have to charge me $20 or $30 for a manual for this, but that seems a bit extreme just to buy some instructions for a product.</p>
<p>I can find no information about this system online and your website isn&#8217;t very informative.  If you have a manual for this, can&#8217;t you just scan it and post it on your website or at the very least email it to me.  Or if that&#8217;s too much effort, simple photocopies of the manual pages would be fine and I can stop by and pick it up since I live in south Denver.  I&#8217;ve attached a picture of the control panel (sorry it&#8217;s blurry.. i can get a real picture if needed) and I can provide photos of the relay box in the back of the house if that helps too.</p>
<p>If I can&#8217;t figure out how it works, my next step is going to be trying to figure out how to disable the whole system without killing myself by electric shock.</p>
<p>-eric</p></blockquote>
<p>That seems pretty reasonable to me.  But then something strange happened.  Here is the email exchange between me and Matt Essig, the president of Dencor Energy Control Systems.</p>
<blockquote><p>Eric,</p>
<p>The manual and spec sheet are attached.</p>
<p>I know actually charging for products and services when you are a for profit business in a market driven economy seems odd but maybe your approach is the right one; when I&#8217;m at the grocery store I&#8217;m going to insist they give me everything for free because the prices they charge are excessive.</p>
<p>We stopped producing the 809 decades ago; in 20 years would you support a product you stopped developing and selling, or giving away, today?  How about Microsoft?  Oracle?  Thought so&#8230;.</p>
<p>Maybe you should disconnect the system and watch your power bills go up (assuming the system is currently programmed properly)&#8230;</p>
<p>Matt</p></blockquote>
<p>Since Matt is a big fan of free market economics, I figured I&#8217;d teach him a thing or two.  So I responded with this:</p>
<blockquote><p>Matt,</p>
<p>Thank you for the manual.</p>
<p>I am well aware of how markets work, but it seems you are not.  In a market driven economy, customer service is incredibly important.  This is increasingly more important now that the masses have such innovations as the Internet in order to share information about how companies treat their customers.</p>
<p>I see that you&#8217;re beginning to understand this since you responded to &#8220;Sandra&#8217;s&#8221; 2008 post on ripoffreport.com just a week or two ago on July 5th, 2011.  I agree that Sandra was a being a bit unreasonable, but given your response to me, I can see why she might be a tad bit upset with you.</p>
<p>Now there&#8217;s a pretty distinct difference between what I&#8217;m asking of your company versus what you suggested I should ask at a grocery store.  I think a more apt analogy would be me contacting the grocery store to help me out with instructions on how to microwave a pizza I bought.  Or even better yet, contacting the *manufacturer* of the pizza&#8230; say Red Baron (via the toll free number on the back of the box that says &#8220;questions?&#8221;) and asking them how to microwave it.  Now granted, I&#8217;m not going to ask how to microwave a 20 year old pizza, but we&#8217;ll discuss that next.</p>
<p>You see, you think I want something for free, but I am not asking you to give me any actual product or service for free unless you consider the instruction manual for your real product yet another product.  That&#8217;s quite the stretch.  But you asked quite an interesting question.  Can I, in fact, find support for say&#8230;. Windows 3.1?  You bet your ass I can.  As bad as Microsoft support is, they appear to be doing a better job than your company.  It&#8217;s unfortunate that you happened to pick the industry I am in for your examples.</p>
<p>Here is Microsoft supporting 20+ year old products:</p>
<p>Oh?  I can download an updated vshare.386 binary for Windows 3.1?  Yep&#8230; right here: http://www.microsoft.com/download/en/details.aspx?id=16991</p>
<p>Holy crap!  Look at this!  Windows 3.0 instructions on editing an autoexec.bat and config.sys file?  Wow, that brings back some memories of the 80s&#8230;. http://support.microsoft.com/kb/85194</p>
<p>Of course, there are plenty more examples, but I think that should be sufficient for now.  If you want me to give you some more examples (maybe HP printer manuals from the 80s?) I could certainly dig that up as well if you&#8217;d like.  But at any rate, that&#8217;s not really the issue anymore now, is it?  I possibly would have hired someone to come fix and/or upgrade the system, which of course, would benefit you, because as you well know, in a market driven economy if people can make money working on your products, your product&#8217;s future value increases in non-real terms (hint: think advertising).</p>
<p>But back to the point: The issue now is that your level of customer service has made my decision quite easy.  I will post my email to you as well as your email back (and this one too) in its entirety on my website.  I think others would be glad to hear how the president of Dencor responds to requests from users of their products.<br />
I&#8217;ve also noticed that you seem to have a bit of litigious streak in you.  You can contact &#8220;Christian Onsager, at Onsager Staelin &#038; Guyerson&#8221; and let them know that you want to file suit against me when I post this information online as well.  There&#8217;s no need for a John Doe subpoena though, you can have them serve notice directly to me at the following address:</p>
<p>Eric [redacted]<br />
[redacting my actual address here as well]</p>
<p>Remember&#8230;. all I asked for was a simple manual.   And again, thanks for the manual as well as the incredibly quick response.</p>
<p>Eventually, however, you&#8217;ll learn one of the greatest lessons of the market driven economy:  Don&#8217;t be a dick to your customers.</p>
<p>-eric</p></blockquote>
<p>Now I assumed that&#8217;d be the end of the story.  Only an idiot would respond to that email.  But Mr. Matt Essig, the <b>president</b> of Dencor Energy Management Systems didn&#8217;t want to leave it at that.  He said he would sue me if I posted these emails:</p>
<blockquote><p>Eric,</p>
<p>If you would like to post the emails on your website then go ahead.  The email was meant for you, and you only, hence it was addressed to you.  I will litigate over this if you choose to do so&#8230;just try me.</p>
<p>Matt</p></blockquote>
<p>Well, not to let him down and of course I haven&#8217;t been sued in a long time, here we are.  So I responded with this:</p>
<blockquote><p>Matt,</p>
<p>Seriously?  Emails are certainly not confidential.  Furthermore, Colorado doesn&#8217;t even require two-party consent for recording and publishing of phone calls, let alone other electronic communications.  You may want to contact your attorneys before you continue digging yourself into a bigger hole.  You would think that for a president of a company, you would be a little better informed about the ramifications of your communications and your business conduct in general.  But again, you have my address.  Instead, you sound like a petulant toddler trying desperately to undo the damage that you&#8217;ve already done.  Feel free to have your legal team serve notice of a lawsuit.</p>
<p>I will contact you again when I post the information online with a web address where you can find your emails and my commentary on my dealings with you today.</p>
<p>Kindest Regards,</p>
<p>Eric</p>
<p>P.S. The manuals you sent don&#8217;t mention anything about programming the system.  I appreciate the documentation you provided, but if you could send the actual programming manual, that&#8217;d be incredibly helpful.  Thanks again.</p></blockquote>
<p>Well Mr. Matt Essig of Dencor Energy Management Systems, your move.  Best regards and I would appreciate that manual if you could foward over a copy.  You have my physical and email address.</p>
<p>Also, I&#8217;ve sent him a link to this post.  I look forward to hearing from you again Mr. Essig</p>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=559" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/N0nJvvcE2qQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2011/07/dencor-energy-control-systems/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2011/07/dencor-energy-control-systems/</feedburner:origLink></item>
		<item>
		<title>yTransit and GTFS revisited</title>
		<link>http://feedproxy.google.com/~r/ypass/~3/ceL0RW71d2o/</link>
		<comments>http://www.ypass.net/blog/2011/07/ytransit-and-gtfs-revisited/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 16:30:30 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Google APIs]]></category>
		<category><![CDATA[GTFS]]></category>

		<guid isPermaLink="false">http://www.ypass.net/blog/?p=551</guid>
		<description><![CDATA[It&#8217;s been a long time since I last looked at GTFS. Since then, I&#8217;ve gotten tons of emails and comments on the blog post about my failed little yTransit project. A Google engineer in the Czech Republic working on their transit team even contacted me, but still nothing from actual transit companies. However, it&#8217;s been [...]]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s been a long time since I last looked at GTFS.  Since then, I&#8217;ve gotten tons of emails and comments on the blog post about my failed little yTransit project.  A Google engineer in the Czech Republic working on their transit team even contacted me, but still nothing from actual transit companies.</p>
<p>However, it&#8217;s been a little while and I think there may be a glimmer of hope for this project yet.  I&#8217;m guessing (hoping) that since smartphones have become increasingly popular, more people in the industry are getting a bit more interested in the technology.  I called the Summit County, Colorado transit system (Summit Stage Transit) this morning and talked to the dispatcher.</p>
<p>I told him that I was interested in getting their transit schedule into Google Maps and he didn&#8217;t just say &#8220;uuhhhh&#8230; what?&#8221;  He actually said &#8220;I think we&#8217;d be very interested in that.&#8221;  He told me the person I needed to speak with wasn&#8217;t in the office at that moment, but he&#8217;ll be in later today and that I should leave a voicemail.</p>
<p>Now remember, I had originally contacted Summit Stage Transit way back in 2009 and they weren&#8217;t interested and didn&#8217;t return my calls.  So at least this time around, I actually got a favorable response.  That is huge progress!</p>
<p>We&#8217;ll see if this goes anywhere, but if they&#8217;re able to help me get some requirements built, I might actually be able to make this happen.</p>
<p>So officially, the project is still dead pending resuscitation by John at Summit Stage Transit who is supposed to return my call this afternoon.</p>
<p><b>Update:</b>  I spoke with John and I have a meeting scheduled for the July 20th to discuss their needs and requirements.  This thing might happen after all.</p>
 <img src="http://www.ypass.net/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=551" width="1" height="1" style="display: none;" /><img src="http://feeds.feedburner.com/~r/ypass/~4/ceL0RW71d2o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ypass.net/blog/2011/07/ytransit-and-gtfs-revisited/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.ypass.net/blog/2011/07/ytransit-and-gtfs-revisited/</feedburner:origLink></item>
	</channel>
</rss>
