Browse Source

Add ISP issues post

Thomas Dy 6 years ago
parent
commit
35275ae900

+ 16 - 0
content/posts/isp-issues.md

@@ -0,0 +1,16 @@
++++
+title = "ISP Issues"
+date = 2018-08-16T23:03:05+09:00
+tags = [ "sysadmin" ]
+slug = "isp-issues"
++++
+
+At the first office I worked at, we had 2 different ISPs. This was supposed to be for reliability, as one was fast but spotty, and the other was slow but reliable. Since they weren't *too* expensive, we just went and got both.
+
+We have monitoring setup to watch our office IPs from the outside so we could see how often the connection goes down. The interesting thing we found was that the fast and spotty connection had perfect uptime. Even when there was clearly no internet from the office, it was still "up" according to our monitoring.
+
+So we tried pinging our office IP using the other connection and to our surprise it was indeed up. There was even a webserver running on it (we only have VPN exposed). Apparently, it was someone elses CCTV admin page. We could actually see a hallway with people walking by sometimes!
+
+Apparently someone else had our IP address and nothing good comes from an IP conflict. This was completely baffling as our internet line was supposed to be a "business line" and that came with a static IP address. So the only scenarios where this could happen is, the ISP mistakenly gave the same IP to 2 different lines or the ISP allows some clients to freely set their own IP.
+
+We complained to the ISP and eventually got it resolved. They just gave us an entirely new IP address, but they never explained what went wrong. We already had quite a negative opinion of that particular ISP though, and they somehow managed to outdo themselves.

+ 24 - 60
output/index.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">
@@ -36,6 +36,29 @@
 <main id="content" role="main">
 <div class="postindex">
 	
+	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
+		<header>
+			<h1 class="p-name entry-title" itemprop="headline">
+				<a href="/posts/isp-issues.html" class="u-url">ISP Issues</a>
+			</h1>
+		</header>
+		<div class="e-content entry-content">
+			<p>At the first office I worked at, we had 2 different ISPs. This was supposed to be for reliability, as one was fast but spotty, and the other was slow but reliable. Since they weren&rsquo;t <em>too</em> expensive, we just went and got both.</p>
+
+<p>We have monitoring setup to watch our office IPs from the outside so we could see how often the connection goes down. The interesting thing we found was that the fast and spotty connection had perfect uptime. Even when there was clearly no internet from the office, it was still &ldquo;up&rdquo; according to our monitoring.</p>
+
+<p>So we tried pinging our office IP using the other connection and to our surprise it was indeed up. There was even a webserver running on it (we only have VPN exposed). Apparently, it was someone elses CCTV admin page. We could actually see a hallway with people walking by sometimes!</p>
+
+<p>Apparently someone else had our IP address and nothing good comes from an IP conflict. This was completely baffling as our internet line was supposed to be a &ldquo;business line&rdquo; and that came with a static IP address. So the only scenarios where this could happen is, the ISP mistakenly gave the same IP to 2 different lines or the ISP allows some clients to freely set their own IP.</p>
+
+<p>We complained to the ISP and eventually got it resolved. They just gave us an entirely new IP address, but they never explained what went wrong. We already had quite a negative opinion of that particular ISP though, and they somehow managed to outdo themselves.</p>
+
+		</div>
+		<small class="dateline">Posted: <time class="published dt-published" itemprop="datePublished" datetime="2018-08-16">2018-08-16</time></small>
+		| <small class="commentline"><a href="/posts/isp-issues.html#isso-thread">Comments</a></small>
+	</article>
+	</article>
+	
 	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
 		<header>
 			<h1 class="p-name entry-title" itemprop="headline">
@@ -344,65 +367,6 @@ rspirep (Content-Type.*) \1;\ charset=utf-8 unless has_charset
 	</article>
 	</article>
 	
-	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
-		<header>
-			<h1 class="p-name entry-title" itemprop="headline">
-				<a href="/posts/cloudflare-shenanigans.html" class="u-url">Cloudflare Shenanigans</a>
-			</h1>
-		</header>
-		<div class="e-content entry-content">
-			<p>An old client of ours managed to convince a telco to zero-rate the data for their app. In order to whitelist it though, we needed to use plain HTTP for domain whitelisting. For HTTPS, they can only whitelist by IP address. Like any good developer, we were using HTTPS. Also, like any good developer, we put our server behind Cloudflare.</p>
-
-<p>Now the problem is that Cloudflare can put you behind <a href="https://www.cloudflare.com/ips/">any IP they own</a>, which is a huge range. There&rsquo;s no guarantee that the IP we have now is going to be the same later on. So we did the reasonable thing and asked them to whitelist all of the Cloudflare IPs. And the telco agreed! We were in total disbelief when that happened. But hey, if life gives you free internet, you take it.</p>
-
-<p>We never actually empirically tested whether other sites hosted on Cloudflare were also actually zero-rated. But I like to think that we saved a lot of people on their data costs from browsing Reddit and 4chan. But alas, good things must come to an end.</p>
-
-<p>A few months after we started beta testing the app, Cloudflare added more IPs to their range. Unfortunately, our server got moved to those new IPs which were not whitelisted yet. Apparently, the telco whitelisting process was incredibly convoluted and time consuming. Our client didn&rsquo;t want to bother asking them to whitelist more IPs. We also tried asking Cloudflare to move us back to the original IP range, but they could only do that if we were in their enterprise tier. We couldn&rsquo;t really afford that, so we looked for other options.</p>
-
-<p>Since Cloudflare was essentially just a giant reverse proxy, theoretically there should be no distinction between one IP address from another. The specific IP we get is probably just for load balancing. So we tried accessing the IPs in the range directly and just setting the Host header and it worked! But we get SSL errors because the IP itself doesn&rsquo;t have its own certificate.</p>
-
-<p>After more testing, we figured out that you could actually use any Cloudflare backed domain so long as we properly set the Host header. We just needed to find one still in the old range. Coincidentally, 4chan.org was. Which led to this wonderful commit</p>
-<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><code class="language-diff" data-lang="diff"><span></span>commit 123456789abcdef
-Author: ~~~~~~
-Date:   ~~~~~~
-
-    4chan hack
-
-<span style="color: #000080; font-weight: bold">diff --git a/src/com/client/common/Util.java b/src/com/client/common/Util.java</span>
-<span style="color: #A00000">--- a/src/com/client/common/Util.java</span>
-<span style="color: #00A000">+++ b/src/com/client/common/Util.java</span>
-<span style="color: #800080; font-weight: bold">@@ -210,7 +210,8 @@ public class Util {</span>
-        }
-
-        public static String getServerAddress(Context context) {
-<span style="color: #A00000">-               String address = &quot;https://backend.client.com&quot;;</span>
-<span style="color: #00A000">+               // String address = &quot;https://backend.client.com&quot;;</span>
-<span style="color: #00A000">+               String address = &quot;https://4chan.org&quot;;</span>
-                if(!isDebug(context)) return address;
-                try {
-<span style="color: #000080; font-weight: bold">diff --git a/src/com/client/common/logging/APIClient.java b/src/com/client/common/logging/APIClient.java</span>
-<span style="color: #A00000">--- a/src/com/client/common/logging/APIClient.java</span>
-<span style="color: #00A000">+++ b/src/com/client/common/logging/APIClient.java</span>
-<span style="color: #800080; font-weight: bold">@@ -101,6 +101,7 @@ public class APIClient {</span>
-        private HttpResponse postInternal(String url, List&lt;NameValuePair&gt; data, boolean forRegistration) throws ClientProtocolException, IOException {
-                HttpPost request = new HttpPost(Util.getServerAddress(mContext)+&quot;/api/&quot;+url);
-                request.setHeader(&quot;X-API-VERSION&quot;, apiVersion);
-<span style="color: #00A000">+               request.setHeader(&quot;Host&quot;, &quot;backend.client.com&quot;);</span>
-
-                if(data == null) {
-                        data = new ArrayList&lt;NameValuePair&gt;();
-</code></pre></div>
-
-<p>Eventually, we did decide to just abandon Cloudflare for the server. We probably weren&rsquo;t going to be the target of a DDOS or anything. This also allowed us to do more secure things like pinning the server certificate in the application itself. Clearly, this is what we should have just done in the first place, but at the time we just wanted a stopgap solution.</p>
-
-<p>I just still find it funny we were making people&rsquo;s phones go to 4chan.org everyday for more than a year.</p>
-
-		</div>
-		<small class="dateline">Posted: <time class="published dt-published" itemprop="datePublished" datetime="2015-12-25">2015-12-25</time></small>
-		| <small class="commentline"><a href="/posts/cloudflare-shenanigans.html#isso-thread">Comments</a></small>
-	</article>
-	</article>
-	
 </div>
 <nav class="postindexpager">
 	<ul class="pager clearfix">

+ 60 - 28
output/page/2.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">
@@ -36,6 +36,65 @@
 <main id="content" role="main">
 <div class="postindex">
 	
+	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
+		<header>
+			<h1 class="p-name entry-title" itemprop="headline">
+				<a href="/posts/cloudflare-shenanigans.html" class="u-url">Cloudflare Shenanigans</a>
+			</h1>
+		</header>
+		<div class="e-content entry-content">
+			<p>An old client of ours managed to convince a telco to zero-rate the data for their app. In order to whitelist it though, we needed to use plain HTTP for domain whitelisting. For HTTPS, they can only whitelist by IP address. Like any good developer, we were using HTTPS. Also, like any good developer, we put our server behind Cloudflare.</p>
+
+<p>Now the problem is that Cloudflare can put you behind <a href="https://www.cloudflare.com/ips/">any IP they own</a>, which is a huge range. There&rsquo;s no guarantee that the IP we have now is going to be the same later on. So we did the reasonable thing and asked them to whitelist all of the Cloudflare IPs. And the telco agreed! We were in total disbelief when that happened. But hey, if life gives you free internet, you take it.</p>
+
+<p>We never actually empirically tested whether other sites hosted on Cloudflare were also actually zero-rated. But I like to think that we saved a lot of people on their data costs from browsing Reddit and 4chan. But alas, good things must come to an end.</p>
+
+<p>A few months after we started beta testing the app, Cloudflare added more IPs to their range. Unfortunately, our server got moved to those new IPs which were not whitelisted yet. Apparently, the telco whitelisting process was incredibly convoluted and time consuming. Our client didn&rsquo;t want to bother asking them to whitelist more IPs. We also tried asking Cloudflare to move us back to the original IP range, but they could only do that if we were in their enterprise tier. We couldn&rsquo;t really afford that, so we looked for other options.</p>
+
+<p>Since Cloudflare was essentially just a giant reverse proxy, theoretically there should be no distinction between one IP address from another. The specific IP we get is probably just for load balancing. So we tried accessing the IPs in the range directly and just setting the Host header and it worked! But we get SSL errors because the IP itself doesn&rsquo;t have its own certificate.</p>
+
+<p>After more testing, we figured out that you could actually use any Cloudflare backed domain so long as we properly set the Host header. We just needed to find one still in the old range. Coincidentally, 4chan.org was. Which led to this wonderful commit</p>
+<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><code class="language-diff" data-lang="diff"><span></span>commit 123456789abcdef
+Author: ~~~~~~
+Date:   ~~~~~~
+
+    4chan hack
+
+<span style="color: #000080; font-weight: bold">diff --git a/src/com/client/common/Util.java b/src/com/client/common/Util.java</span>
+<span style="color: #A00000">--- a/src/com/client/common/Util.java</span>
+<span style="color: #00A000">+++ b/src/com/client/common/Util.java</span>
+<span style="color: #800080; font-weight: bold">@@ -210,7 +210,8 @@ public class Util {</span>
+        }
+
+        public static String getServerAddress(Context context) {
+<span style="color: #A00000">-               String address = &quot;https://backend.client.com&quot;;</span>
+<span style="color: #00A000">+               // String address = &quot;https://backend.client.com&quot;;</span>
+<span style="color: #00A000">+               String address = &quot;https://4chan.org&quot;;</span>
+                if(!isDebug(context)) return address;
+                try {
+<span style="color: #000080; font-weight: bold">diff --git a/src/com/client/common/logging/APIClient.java b/src/com/client/common/logging/APIClient.java</span>
+<span style="color: #A00000">--- a/src/com/client/common/logging/APIClient.java</span>
+<span style="color: #00A000">+++ b/src/com/client/common/logging/APIClient.java</span>
+<span style="color: #800080; font-weight: bold">@@ -101,6 +101,7 @@ public class APIClient {</span>
+        private HttpResponse postInternal(String url, List&lt;NameValuePair&gt; data, boolean forRegistration) throws ClientProtocolException, IOException {
+                HttpPost request = new HttpPost(Util.getServerAddress(mContext)+&quot;/api/&quot;+url);
+                request.setHeader(&quot;X-API-VERSION&quot;, apiVersion);
+<span style="color: #00A000">+               request.setHeader(&quot;Host&quot;, &quot;backend.client.com&quot;);</span>
+
+                if(data == null) {
+                        data = new ArrayList&lt;NameValuePair&gt;();
+</code></pre></div>
+
+<p>Eventually, we did decide to just abandon Cloudflare for the server. We probably weren&rsquo;t going to be the target of a DDOS or anything. This also allowed us to do more secure things like pinning the server certificate in the application itself. Clearly, this is what we should have just done in the first place, but at the time we just wanted a stopgap solution.</p>
+
+<p>I just still find it funny we were making people&rsquo;s phones go to 4chan.org everyday for more than a year.</p>
+
+		</div>
+		<small class="dateline">Posted: <time class="published dt-published" itemprop="datePublished" datetime="2015-12-25">2015-12-25</time></small>
+		| <small class="commentline"><a href="/posts/cloudflare-shenanigans.html#isso-thread">Comments</a></small>
+	</article>
+	</article>
+	
 	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
 		<header>
 			<h1 class="p-name entry-title" itemprop="headline">
@@ -259,33 +318,6 @@ twanager bag default <span style="color: #BA2121">&lt;&lt;EOF</span>
 	</article>
 	</article>
 	
-	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
-		<header>
-			<h1 class="p-name entry-title" itemprop="headline">
-				<a href="/posts/geocoding-services.html" class="u-url">Geocoding Services</a>
-			</h1>
-		</header>
-		<div class="e-content entry-content">
-			<p>A key component for any routing service is being able to do geocoding. Most people who are looking for routes most probably don&rsquo;t know exactly where their start and end points are on the map. Even then, manually looking for a location on a map is a time-consuming task.</p>
-
-<p>The gold standard for doing geocoding right now is Google Maps. It&rsquo;s hard to find a better location search experience. If they actually provided routing for jeeps here in the Philippines, I imagine there wouldn&rsquo;t be <em>that</em> much you could do for the competition.</p>
-
-<p>When the competition started though, I took it as a challenge to avoid Google Maps as much as possible. I wanted to see how much is currently possible with other options such as OpenStreetMap. In fact, OSM does have a geocoding service called <a href="http://nominatim.openstreetmap.org">Nominatim</a>.</p>
-
-<p>Sadly, for a mapping app, what you want to do is not simply just geocoding. With geocoding, you take an address and turn it into coordinates. When you want to search for a place in a mapping app, you take part of an address, infer the rest of it, and give the user options to choose from.</p>
-
-<p>Given a typical mapping app, you might type in &ldquo;ateneo&rdquo; and expect it to give you Ateneo de Manila University. With typical geocoding services like Nominatim or even Google&rsquo;s <a href="https://developers.google.com/maps/documentation/javascript/geocoding">geocoding API</a>, you probably won&rsquo;t get any result for this. What you want to use is the <a href="https://developers.google.com/maps/documentation/javascript/places">Places API</a> which provides an autocomplete search box. Using it, when you type in &ldquo;ateneo&rdquo;, it automatically suggests in the dropdown, &ldquo;Ateneo de Manila University&rdquo;.</p>
-
-<p>A downside to using the Places API is that it&rsquo;s against the terms of service to use it with something that isn&rsquo;t Google Maps, which means no OpenStreetMap. If there were more time, writing your own autocompletion engine using OpenStreetMap&rsquo;s data will probably be a better long term solution.</p>
-
-<p>For now, since the competition&rsquo;s deadline is just a few days away, I&rsquo;ll be using Google Maps.</p>
-
-		</div>
-		<small class="dateline">Posted: <time class="published dt-published" itemprop="datePublished" datetime="2013-09-25">2013-09-25</time></small>
-		| <small class="commentline"><a href="/posts/geocoding-services.html#isso-thread">Comments</a></small>
-	</article>
-	</article>
-	
 </div>
 <nav class="postindexpager">
 	<ul class="pager clearfix">

+ 28 - 34
output/page/3.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">
@@ -36,6 +36,33 @@
 <main id="content" role="main">
 <div class="postindex">
 	
+	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
+		<header>
+			<h1 class="p-name entry-title" itemprop="headline">
+				<a href="/posts/geocoding-services.html" class="u-url">Geocoding Services</a>
+			</h1>
+		</header>
+		<div class="e-content entry-content">
+			<p>A key component for any routing service is being able to do geocoding. Most people who are looking for routes most probably don&rsquo;t know exactly where their start and end points are on the map. Even then, manually looking for a location on a map is a time-consuming task.</p>
+
+<p>The gold standard for doing geocoding right now is Google Maps. It&rsquo;s hard to find a better location search experience. If they actually provided routing for jeeps here in the Philippines, I imagine there wouldn&rsquo;t be <em>that</em> much you could do for the competition.</p>
+
+<p>When the competition started though, I took it as a challenge to avoid Google Maps as much as possible. I wanted to see how much is currently possible with other options such as OpenStreetMap. In fact, OSM does have a geocoding service called <a href="http://nominatim.openstreetmap.org">Nominatim</a>.</p>
+
+<p>Sadly, for a mapping app, what you want to do is not simply just geocoding. With geocoding, you take an address and turn it into coordinates. When you want to search for a place in a mapping app, you take part of an address, infer the rest of it, and give the user options to choose from.</p>
+
+<p>Given a typical mapping app, you might type in &ldquo;ateneo&rdquo; and expect it to give you Ateneo de Manila University. With typical geocoding services like Nominatim or even Google&rsquo;s <a href="https://developers.google.com/maps/documentation/javascript/geocoding">geocoding API</a>, you probably won&rsquo;t get any result for this. What you want to use is the <a href="https://developers.google.com/maps/documentation/javascript/places">Places API</a> which provides an autocomplete search box. Using it, when you type in &ldquo;ateneo&rdquo;, it automatically suggests in the dropdown, &ldquo;Ateneo de Manila University&rdquo;.</p>
+
+<p>A downside to using the Places API is that it&rsquo;s against the terms of service to use it with something that isn&rsquo;t Google Maps, which means no OpenStreetMap. If there were more time, writing your own autocompletion engine using OpenStreetMap&rsquo;s data will probably be a better long term solution.</p>
+
+<p>For now, since the competition&rsquo;s deadline is just a few days away, I&rsquo;ll be using Google Maps.</p>
+
+		</div>
+		<small class="dateline">Posted: <time class="published dt-published" itemprop="datePublished" datetime="2013-09-25">2013-09-25</time></small>
+		| <small class="commentline"><a href="/posts/geocoding-services.html#isso-thread">Comments</a></small>
+	</article>
+	</article>
+	
 	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
 		<header>
 			<h1 class="p-name entry-title" itemprop="headline">
@@ -158,39 +185,6 @@ sed -i .bak <span style="color: #BA2121">&#39;/^72/ s/,600/,60/&#39;</span> freq
 	</article>
 	</article>
 	
-	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
-		<header>
-			<h1 class="p-name entry-title" itemprop="headline">
-				<a href="/posts/transit-wand.html" class="u-url">Transit Wand</a>
-			</h1>
-		</header>
-		<div class="e-content entry-content">
-			<p>Link: <a href="https://play.google.com/store/apps/details?id=com.conveyal.transitwand">http://transitwand.com</a></p>
-
-<p>Overall, this was the simplest of the <a href="http://philippine-transit.hackathome.com/use-this-code/">open-source transit tools</a> to actually get up and running. There&rsquo;s already a deployed instance of the server, and you can easily download the phone app via the <a href="https://play.google.com/store/apps/details?id=com.conveyal.transitwand">Play Store</a>. Even running the server by yourself didn&rsquo;t have any of the hiccups I had with GTFS Editor.</p>
-
-<p>The phone app is actually quite simple. It allows you to capture a trip, which will record your GPS coordinates as you ride public transit. It also allows you to mark points of the trip where you stop and also how long the stop took. Lastly, it allows you to record embarking and disembarking passengers which is potentially useful for ridership data.</p>
-
-<p>After doing a capture session, you can review the data on the phone. It will plot out the route on a map, with markers for the stops. You then either delete the data if it looks wrong, or you can upload it to the Transit Wand server. Uploading involves registering an account, but it&rsquo;s free and you don&rsquo;t even actually need to put in a username or anything. It simply registers the phone&rsquo;s IMEI on the server and gives you a 6-digit identifier.</p>
-
-<p>You can then use the 6-digit identifier to view the data on Transit Wand&rsquo;s server, which is good since uploading any data automatically deletes it from the phone. There really isn&rsquo;t much else you can do with it though. It just allows you to view the data, and export it as a <a href="https://en.wikipedia.org/wiki/Shapefile">Shapefile</a>.</p>
-
-<p>As is, this is purely a data collection client-server app. Barring looking at the database, there is no way to get a list of phones which have collected data. Only the person who initiated the data collection knows the 6-digit code to view their data. There&rsquo;s also no way to extract the ridership information from the server yet. This isn&rsquo;t to say that the data won&rsquo;t eventually go public though.</p>
-
-<p>An interesting thing you <em>can</em> do with the Transit Wand data is import it into GTFS Editor to make a new route. You don&rsquo;t even have to manually download and upload the data. Just type in your 6-digit identifier and it will give you a list of routes you&rsquo;ve captured via Transit Wand. This is wonderful as you get all the stop data, as well as the shape of the route.</p>
-
-<p>I imagine these two tools were how the DOTC came up with all the GTFS data we have now. What I don&rsquo;t understand is why the shape data isn&rsquo;t present. Importing from Transit Wand already gets you shape data. There are even facilities to edit the shape within the editor if clean up is necessary. The only problem I saw was the fact that you can&rsquo;t easily move stops, you have to input coordinates to change the position.</p>
-
-<p>It <em>might</em> also be possible that when the DOTC was still collecting the data, the route collection or editing features weren&rsquo;t present yet. That would just be lame and depressing though.</p>
-
-<p>Overall, Transit Wand does what it&rsquo;s supposed to do. You collect data, and then upload it to a server. There is a lot of room for improvement though. It would be nice to have a better API that allows access to more of the data. Building in analysis tools for the ridership data might also be a welcome thing. I imagine it would also be great if you could encourage people to use the app and upload their own trips.</p>
-
-		</div>
-		<small class="dateline">Posted: <time class="published dt-published" itemprop="datePublished" datetime="2013-07-15">2013-07-15</time></small>
-		| <small class="commentline"><a href="/posts/transit-wand.html#isso-thread">Comments</a></small>
-	</article>
-	</article>
-	
 </div>
 <nav class="postindexpager">
 	<ul class="pager clearfix">

+ 34 - 28
output/page/4.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">
@@ -36,6 +36,39 @@
 <main id="content" role="main">
 <div class="postindex">
 	
+	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
+		<header>
+			<h1 class="p-name entry-title" itemprop="headline">
+				<a href="/posts/transit-wand.html" class="u-url">Transit Wand</a>
+			</h1>
+		</header>
+		<div class="e-content entry-content">
+			<p>Link: <a href="https://play.google.com/store/apps/details?id=com.conveyal.transitwand">http://transitwand.com</a></p>
+
+<p>Overall, this was the simplest of the <a href="http://philippine-transit.hackathome.com/use-this-code/">open-source transit tools</a> to actually get up and running. There&rsquo;s already a deployed instance of the server, and you can easily download the phone app via the <a href="https://play.google.com/store/apps/details?id=com.conveyal.transitwand">Play Store</a>. Even running the server by yourself didn&rsquo;t have any of the hiccups I had with GTFS Editor.</p>
+
+<p>The phone app is actually quite simple. It allows you to capture a trip, which will record your GPS coordinates as you ride public transit. It also allows you to mark points of the trip where you stop and also how long the stop took. Lastly, it allows you to record embarking and disembarking passengers which is potentially useful for ridership data.</p>
+
+<p>After doing a capture session, you can review the data on the phone. It will plot out the route on a map, with markers for the stops. You then either delete the data if it looks wrong, or you can upload it to the Transit Wand server. Uploading involves registering an account, but it&rsquo;s free and you don&rsquo;t even actually need to put in a username or anything. It simply registers the phone&rsquo;s IMEI on the server and gives you a 6-digit identifier.</p>
+
+<p>You can then use the 6-digit identifier to view the data on Transit Wand&rsquo;s server, which is good since uploading any data automatically deletes it from the phone. There really isn&rsquo;t much else you can do with it though. It just allows you to view the data, and export it as a <a href="https://en.wikipedia.org/wiki/Shapefile">Shapefile</a>.</p>
+
+<p>As is, this is purely a data collection client-server app. Barring looking at the database, there is no way to get a list of phones which have collected data. Only the person who initiated the data collection knows the 6-digit code to view their data. There&rsquo;s also no way to extract the ridership information from the server yet. This isn&rsquo;t to say that the data won&rsquo;t eventually go public though.</p>
+
+<p>An interesting thing you <em>can</em> do with the Transit Wand data is import it into GTFS Editor to make a new route. You don&rsquo;t even have to manually download and upload the data. Just type in your 6-digit identifier and it will give you a list of routes you&rsquo;ve captured via Transit Wand. This is wonderful as you get all the stop data, as well as the shape of the route.</p>
+
+<p>I imagine these two tools were how the DOTC came up with all the GTFS data we have now. What I don&rsquo;t understand is why the shape data isn&rsquo;t present. Importing from Transit Wand already gets you shape data. There are even facilities to edit the shape within the editor if clean up is necessary. The only problem I saw was the fact that you can&rsquo;t easily move stops, you have to input coordinates to change the position.</p>
+
+<p>It <em>might</em> also be possible that when the DOTC was still collecting the data, the route collection or editing features weren&rsquo;t present yet. That would just be lame and depressing though.</p>
+
+<p>Overall, Transit Wand does what it&rsquo;s supposed to do. You collect data, and then upload it to a server. There is a lot of room for improvement though. It would be nice to have a better API that allows access to more of the data. Building in analysis tools for the ridership data might also be a welcome thing. I imagine it would also be great if you could encourage people to use the app and upload their own trips.</p>
+
+		</div>
+		<small class="dateline">Posted: <time class="published dt-published" itemprop="datePublished" datetime="2013-07-15">2013-07-15</time></small>
+		| <small class="commentline"><a href="/posts/transit-wand.html#isso-thread">Comments</a></small>
+	</article>
+	</article>
+	
 	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
 		<header>
 			<h1 class="p-name entry-title" itemprop="headline">
@@ -418,33 +451,6 @@ Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
 	</article>
 	</article>
 	
-	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
-		<header>
-			<h1 class="p-name entry-title" itemprop="headline">
-				<a href="/posts/jeepney-and-bus-routes.html" class="u-url">Jeepney and Bus Routes</a>
-			</h1>
-		</header>
-		<div class="e-content entry-content">
-			<p>In the <a href="philippine-transit-app-challenge.html">last post</a>, I talked about how we now have data about jeepney and bus routes in the Philippines. The data is actually in the <a href="https://developers.google.com/transit/gtfs/">GTFS format</a>, which is the format the Google Maps consumes transit data. Apparently, the government will be submitting the GTFS data later this year. Transit directions for Metro Manila in Google Maps would be wonderful. That said, it definitely raises the bar for the app challenge people.</p>
-
-<p>In the last post, I mentioned the quality of the data isn&rsquo;t quite good. Even before seeing the data, I was already a bit unsure of it. The key problem is how you model the routes. The GTFS format was inherently designed for more well developed and organized transit agencies which isn&rsquo;t exactly what we have in the Philippines now.</p>
-
-<p>One potential problem is the nature of the jeeps and buses. GTFS routes are a collection of trips which are a sequence of stops. However, we don&rsquo;t have jeepney stops, and even if we did they still just stop anywhere. There are also times where jeeps will take a shortcut if no passengers need to get dropped off along their normal route.</p>
-
-<p>From what I&rsquo;ve seen of the data, they handled the first problem well enough. Stops are defined as where people typically get on the jeep or bus. This is good, but they didn&rsquo;t define a shape for the routes. There is no information as to which exact roads they pass through. All we have to go by are the stops to show the route on a map.</p>
-
-<p><img src="http://i.imgur.com/NSVlryE.jpg" alt="sample route" /></p>
-
-<p>The problem isn&rsquo;t that bad though. The agencies could still add the shapes later on. Or maybe an app challenge participant could make an app around fixing the routes via crowd-sourcing or similar. The shape itself isn&rsquo;t that important for a rudimentary directions app, but if we want better apps, we will need better data.</p>
-
-<p>There were also some minor issues with the data itself. Some of the files had extra columns. This normally isn&rsquo;t an issue, but it caused problems for <a href="https://github.com/harrisony/gtfs_SQL_importer">GTFS SQL importer</a>. There were also problems with matching the shape data with the stops when I tried it with <a href="http://onebusaway.org">OneBusAway</a>. They could probably be <a href="https://github.com/OneBusAway/onebusaway-application-modules/wiki/Stop-to-Shape-Matching">fixed</a> but that&rsquo;s for another day.</p>
-
-		</div>
-		<small class="dateline">Posted: <time class="published dt-published" itemprop="datePublished" datetime="2013-07-07">2013-07-07</time></small>
-		| <small class="commentline"><a href="/posts/jeepney-and-bus-routes.html#isso-thread">Comments</a></small>
-	</article>
-	</article>
-	
 </div>
 <nav class="postindexpager">
 	<ul class="pager clearfix">

+ 28 - 1
output/page/5.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">
@@ -36,6 +36,33 @@
 <main id="content" role="main">
 <div class="postindex">
 	
+	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
+		<header>
+			<h1 class="p-name entry-title" itemprop="headline">
+				<a href="/posts/jeepney-and-bus-routes.html" class="u-url">Jeepney and Bus Routes</a>
+			</h1>
+		</header>
+		<div class="e-content entry-content">
+			<p>In the <a href="philippine-transit-app-challenge.html">last post</a>, I talked about how we now have data about jeepney and bus routes in the Philippines. The data is actually in the <a href="https://developers.google.com/transit/gtfs/">GTFS format</a>, which is the format the Google Maps consumes transit data. Apparently, the government will be submitting the GTFS data later this year. Transit directions for Metro Manila in Google Maps would be wonderful. That said, it definitely raises the bar for the app challenge people.</p>
+
+<p>In the last post, I mentioned the quality of the data isn&rsquo;t quite good. Even before seeing the data, I was already a bit unsure of it. The key problem is how you model the routes. The GTFS format was inherently designed for more well developed and organized transit agencies which isn&rsquo;t exactly what we have in the Philippines now.</p>
+
+<p>One potential problem is the nature of the jeeps and buses. GTFS routes are a collection of trips which are a sequence of stops. However, we don&rsquo;t have jeepney stops, and even if we did they still just stop anywhere. There are also times where jeeps will take a shortcut if no passengers need to get dropped off along their normal route.</p>
+
+<p>From what I&rsquo;ve seen of the data, they handled the first problem well enough. Stops are defined as where people typically get on the jeep or bus. This is good, but they didn&rsquo;t define a shape for the routes. There is no information as to which exact roads they pass through. All we have to go by are the stops to show the route on a map.</p>
+
+<p><img src="http://i.imgur.com/NSVlryE.jpg" alt="sample route" /></p>
+
+<p>The problem isn&rsquo;t that bad though. The agencies could still add the shapes later on. Or maybe an app challenge participant could make an app around fixing the routes via crowd-sourcing or similar. The shape itself isn&rsquo;t that important for a rudimentary directions app, but if we want better apps, we will need better data.</p>
+
+<p>There were also some minor issues with the data itself. Some of the files had extra columns. This normally isn&rsquo;t an issue, but it caused problems for <a href="https://github.com/harrisony/gtfs_SQL_importer">GTFS SQL importer</a>. There were also problems with matching the shape data with the stops when I tried it with <a href="http://onebusaway.org">OneBusAway</a>. They could probably be <a href="https://github.com/OneBusAway/onebusaway-application-modules/wiki/Stop-to-Shape-Matching">fixed</a> but that&rsquo;s for another day.</p>
+
+		</div>
+		<small class="dateline">Posted: <time class="published dt-published" itemprop="datePublished" datetime="2013-07-07">2013-07-07</time></small>
+		| <small class="commentline"><a href="/posts/jeepney-and-bus-routes.html#isso-thread">Comments</a></small>
+	</article>
+	</article>
+	
 	<article class="h-entry post-text" itemscope itemtype="http://schema.org/Blog">
 		<header>
 			<h1 class="p-name entry-title" itemprop="headline">

+ 1 - 1
output/pages.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/pages/projects.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 6 - 1
output/posts.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">
@@ -40,6 +40,11 @@
 	</header>
 	<ul class="postlist">
 		
+		<li>
+			<a class="listtitle" href="/posts/isp-issues.html">ISP Issues</a>
+			<span class="entry-meta"><time itemprop="datePublished" datetime="2018-08-16">2018-08-16</time></span>
+		</li>
+		
 		<li>
 			<a class="listtitle" href="/posts/audventure.html">Audventure</a>
 			<span class="entry-meta"><time itemprop="datePublished" datetime="2017-11-19">2017-11-19</time></span>

+ 5 - 1
output/posts/audventure.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">
@@ -156,6 +156,10 @@ want to contribute music or sound effects, I&rsquo;d gladly appreciate it.</p>
 				</li>
 				
 				
+				<li class="next">
+					<a href="/posts/isp-issues.html" rel="next" title="ISP Issues">Next post &rarr;</a>
+				</li>
+				
 			</ul>
 		</nav>
 	</aside>

+ 1 - 1
output/posts/cloudflare-shenanigans.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/console-keymap-switching.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/elevation-data-in-otp.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/fare-data.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/geocoding-services.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/graphserver.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/gtfs-editor.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/haproxy-charset.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/highways-in-otp.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/is-my-terminal-window-active.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 118 - 0
output/posts/isp-issues.html

@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+	<meta charset="utf-8">
+	<meta name="generator" content="Hugo 0.46" />
+	<meta name="viewport" content="width=device-width, initial-scale=1">
+	<link rel="stylesheet" href="/assets/css/theme.css">
+	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">
+	<script type="text/javascript" src="//use.typekit.net/iwm5axp.js"></script>
+	<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
+	<title>ISP Issues - Pleasant Programmer</title>
+</head>
+
+<body>
+	<header id="header" role="banner">
+		<div id="thomas">
+			<img src="/assets/img/thomas.gif" alt="DJ THOMAS IN DA HAUS">
+			<img src="/assets/img/thomas.png" alt="Pleasant Programmer">
+		</div>
+		<h1 class="site-title"><a href="/">Pleasant Programmer</a></h1>
+		<nav id="menu" role="navigation">
+			<ul>
+				<li class="twitter">
+					<a href="http://twitter.com/pleasantprog">@pleasantprog</a>
+				</li>
+				<li><a href="/pages/projects.html">projects</a></li>
+				<li><a href="/posts.html">archives</a></li>
+				<li><a href="/tags.html">tags</a></li>
+				<li><a href="/rss.xml">rss</a></li>
+			</ul>
+		</nav>
+	</header>
+	<div id="container">
+
+
+<main id="content" role="main">
+<article itemscope itemtype="http://schema.org/BlogPosting">
+	<h1 class="p-name entry-title" itemprop="headline name">
+		<a href="/posts/isp-issues.html">ISP Issues</a></h1>
+	<small>
+		<span class="dateline">Posted: <time itemprop="datePublished" datetime="2018-08-16">2018-08-16</time></span>
+		| More posts about
+		
+		<a class="tag p-category" href="/tags/sysadmin.html" rel="tag">
+			sysadmin
+		</a>
+		
+	</small>
+	<div class="e-content entry-content" itemprop="entry-text">
+		<p>At the first office I worked at, we had 2 different ISPs. This was supposed to be for reliability, as one was fast but spotty, and the other was slow but reliable. Since they weren&rsquo;t <em>too</em> expensive, we just went and got both.</p>
+
+<p>We have monitoring setup to watch our office IPs from the outside so we could see how often the connection goes down. The interesting thing we found was that the fast and spotty connection had perfect uptime. Even when there was clearly no internet from the office, it was still &ldquo;up&rdquo; according to our monitoring.</p>
+
+<p>So we tried pinging our office IP using the other connection and to our surprise it was indeed up. There was even a webserver running on it (we only have VPN exposed). Apparently, it was someone elses CCTV admin page. We could actually see a hallway with people walking by sometimes!</p>
+
+<p>Apparently someone else had our IP address and nothing good comes from an IP conflict. This was completely baffling as our internet line was supposed to be a &ldquo;business line&rdquo; and that came with a static IP address. So the only scenarios where this could happen is, the ISP mistakenly gave the same IP to 2 different lines or the ISP allows some clients to freely set their own IP.</p>
+
+<p>We complained to the ISP and eventually got it resolved. They just gave us an entirely new IP address, but they never explained what went wrong. We already had quite a negative opinion of that particular ISP though, and they somehow managed to outdo themselves.</p>
+
+	</div>
+	<aside class="postpromonav">
+		<nav>
+			<ul class="pager clearfix">
+				
+				<li class="previous">
+					<a href="/posts/audventure.html" rel="prev" title="Audventure">&larr; Previous post</a>
+				</li>
+				
+				
+			</ul>
+		</nav>
+	</aside>
+	<section class="comments">
+		<script
+	data-isso="https://isso.pleasantprogrammer.com/"
+	data-isso-require-author="true"
+	data-isso-vote="false"
+	src="https://isso.pleasantprogrammer.com/js/embed.min.js">
+</script>
+<section id="isso-thread"></section>
+
+	</section>
+</article>
+</main>
+
+
+	<footer id="footer" role="contentinfo">
+		<p>
+		<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/deed.en_US">
+			<img alt="CC-BY-SA" style="border-width:0" src="https://licensebuttons.net/l/by-sa/3.0/80x15.png">
+		</a> &copy; 2018 Thomas Dy - Powered by <a href="http://gohugo.io">Hugo</a></p>
+	</footer>
+</div>
+
+<script src="/assets/js/konami.js"></script>
+<script>
+var easter_egg = new Konami();
+easter_egg.code = function() {
+	var el = document.getElementById('thomas');
+	if(el.className == "whoa") {
+		el.className = "";
+	}
+	else {
+		el.className = "whoa";
+	}
+	document.body.scrollTop = document.documentElement.scrollTop = 0;
+}
+easter_egg.load();
+
+
+
+</script>
+
+
+
+</body>
+</html>
+

+ 1 - 1
output/posts/jeep-and-bus-schedules.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/jeepney-and-bus-routes.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/one-bus-or-maybe-jeep-away.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/open-trip-planner.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/openpreppad.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/philippine-transit-app-challenge.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/removing-pldtmydslbiz-from-the-zyxel-p-2612hnu.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 11 - 1
output/posts/rss.xml

@@ -6,11 +6,21 @@
     <description>Recent content in Posts on Pleasant Programmer</description>
     <generator>Hugo -- gohugo.io</generator>
     <language>en-us</language>
-    <lastBuildDate>Sun, 19 Nov 2017 22:00:00 +0800</lastBuildDate>
+    <lastBuildDate>Thu, 16 Aug 2018 23:03:05 +0900</lastBuildDate>
     
 	<atom:link href="https://pleasantprogrammer.com/posts/rss.xml" rel="self" type="application/rss+xml" />
     
     
+    <item>
+      <title>ISP Issues</title>
+      <link>https://pleasantprogrammer.com/posts/isp-issues.html</link>
+      <pubDate>Thu, 16 Aug 2018 23:03:05 +0900</pubDate>
+      
+      <guid>https://pleasantprogrammer.com/posts/isp-issues.html</guid>
+      <description>At the first office I worked at, we had 2 different ISPs. This was supposed to be for reliability, as one was fast but spotty, and the other was slow but reliable. Since they weren&amp;rsquo;t too expensive, we just went and got both.
+We have monitoring setup to watch our office IPs from the outside so we could see how often the connection goes down. The interesting thing we found was that the fast and spotty connection had perfect uptime.</description>
+    </item>
+    
     <item>
       <title>Audventure</title>
       <link>https://pleasantprogrammer.com/posts/audventure.html</link>

+ 1 - 1
output/posts/tiddlywiki-in-the-sky-or-tiddlyweb-for-tw5.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 1 - 1
output/posts/transit-wand.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">

+ 11 - 1
output/rss.xml

@@ -6,11 +6,21 @@
     <description>Recent content on Pleasant Programmer</description>
     <generator>Hugo -- gohugo.io</generator>
     <language>en-us</language>
-    <lastBuildDate>Sat, 10 Feb 2018 16:47:55 +0900</lastBuildDate>
+    <lastBuildDate>Thu, 16 Aug 2018 23:03:05 +0900</lastBuildDate>
     
 	<atom:link href="https://pleasantprogrammer.com/rss.xml" rel="self" type="application/rss+xml" />
     
     
+    <item>
+      <title>ISP Issues</title>
+      <link>https://pleasantprogrammer.com/posts/isp-issues.html</link>
+      <pubDate>Thu, 16 Aug 2018 23:03:05 +0900</pubDate>
+      
+      <guid>https://pleasantprogrammer.com/posts/isp-issues.html</guid>
+      <description>At the first office I worked at, we had 2 different ISPs. This was supposed to be for reliability, as one was fast but spotty, and the other was slow but reliable. Since they weren&amp;rsquo;t too expensive, we just went and got both.
+We have monitoring setup to watch our office IPs from the outside so we could see how often the connection goes down. The interesting thing we found was that the fast and spotty connection had perfect uptime.</description>
+    </item>
+    
     <item>
       <title>Projects</title>
       <link>https://pleasantprogrammer.com/pages/projects.html</link>

+ 8 - 3
output/sitemap.xml

@@ -2,6 +2,11 @@
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
   xmlns:xhtml="http://www.w3.org/1999/xhtml">
   
+  <url>
+    <loc>https://pleasantprogrammer.com/posts/isp-issues.html</loc>
+    <lastmod>2018-08-16T23:03:05+09:00</lastmod>
+  </url>
+  
   <url>
     <loc>https://pleasantprogrammer.com/pages/projects.html</loc>
     <lastmod>2018-02-10T16:47:55+09:00</lastmod>
@@ -157,13 +162,13 @@
   
   <url>
     <loc>https://pleasantprogrammer.com/</loc>
-    <lastmod>2018-02-10T16:47:55+09:00</lastmod>
+    <lastmod>2018-08-16T23:03:05+09:00</lastmod>
     <priority>0</priority>
   </url>
   
   <url>
     <loc>https://pleasantprogrammer.com/posts.html</loc>
-    <lastmod>2017-11-19T22:00:00+08:00</lastmod>
+    <lastmod>2018-08-16T23:03:05+09:00</lastmod>
     <priority>0</priority>
   </url>
   
@@ -175,7 +180,7 @@
   
   <url>
     <loc>https://pleasantprogrammer.com/tags/sysadmin.html</loc>
-    <lastmod>2016-06-24T00:00:00+00:00</lastmod>
+    <lastmod>2018-08-16T23:03:05+09:00</lastmod>
     <priority>0</priority>
   </url>
   

+ 2 - 2
output/tags.html

@@ -2,7 +2,7 @@
 <html lang="en-us">
 <head>
 	<meta charset="utf-8">
-	<meta name="generator" content="Hugo 0.36" />
+	<meta name="generator" content="Hugo 0.46" />
 	<meta name="viewport" content="width=device-width, initial-scale=1">
 	<link rel="stylesheet" href="/assets/css/theme.css">
 	<link rel="alternate" href="/rss.xml" type="application/rss+xml" title="Pleasant Programmer">
@@ -58,7 +58,7 @@
 		
 		<li><a class="reference listtitle" href="/tags/programming.html">programming</a> (14)</li>
 		
-		<li><a class="reference listtitle" href="/tags/sysadmin.html">sysadmin</a> (5)</li>
+		<li><a class="reference listtitle" href="/tags/sysadmin.html">sysadmin</a> (6)</li>
 		
 		<li><a class="reference listtitle" href="/tags/systemd.html">systemd</a> (1)</li>