<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Will Glynn]]></title><description><![CDATA[Will Glynn]]></description><link>http://www.willglynn.com/</link><generator>Ghost v0.4.2</generator><lastBuildDate>Thu, 09 Apr 2026 10:07:28 GMT</lastBuildDate><atom:link href="http://www.willglynn.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[LSI SAS firmware nonsense]]></title><description><![CDATA[<p>I'm screwing around with storage again. This time I bought a pair of 8-lane 6 gbps SAS adapters: one with two internal SFF-8087 ports, one with two external SFF-8088 ports.</p>

<p>(If you don't know what I'm talking about, that's okay. This post is mostly for Google, in case someone else has a similar problem.)</p>

<p>The first controller was listed as a IBM ServeRAID M1015, which is a rebranded LSI 9240-8i. It offers two 4-lane SAS connectors, hence the <code>-8i</code> suffix. ZFS afficianados will recognize this as the controller of choice. It's cheap (~$90) because it was produced in vast quantities and is now being discarded in vast quantities. What's more, despite normally having onboard RAID functions, it can be cross-flashed into a non-RAID LSI 9211-8i HBA, giving the host direct access to all the drives – perfect for use with ZFS.</p>

<p>My M1015 arrived, and it was visually indistinguishable from a 9240-8i; there's literally no physical evidence of IBM anywhere. It's almost as if someone took an LSI card and flashed it to say "IBM M1015" in the MPT BIOS! Like, maybe… IBM.</p>

<p><img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415395202.png'  alt="IBM M1015 BIOS" /></p>

<p>It matters not. I followed the standard recipe to turn it into a generic <a href='http://www.lsi.com/products/io-controllers/pages/lsi-sas-2008.aspx' >LSI SAS2008</a> HBA, and life was good.</p>

<p><img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415397598.png'  alt="M1015 crossflash in progress" /></p>

<p>The second card was listed as an "HP LSI 9207-8e". This card is a straight-up SAS HBA with no RAID functions, which is what I want, and it has two four-lane external ports (<code>-8e</code>), which is what I want. Easy. It would work as-is, except I wanted to flash it to the same firmware level as the other LSI HBA, which is P16 to match the drivers in my target operating system.</p>

<p>On arrival, I noted that it had HP branding all over: the anti-static bag, the PCB silkscreen, everything. I removed the other card just to eliminate all possible confusion and booted up. The card's BIOS identifies it as an "HP 200 Series":</p>

<p><img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415409564.png'  alt="HP H221 BIOS" /></p>

<p>I dug in with <code>sas2flsh -list</code>, which says it's a <code>SAS2308_2(B0)</code> controller on a H221 board, which is definitely an HP part number.</p>

<p><img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415409652.png'  alt="sas2flsh -list output" /></p>

<p>First things first. I wanted to wipe the BIOS, since no matter what I won't be booting off this card. The SAS2Flash manual said boot support lives in memory region 5, so I wiped it with <code>sas2flsh -o -e 5</code>:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415409754.png'  alt="Wipe BIOS" /></p>

<p>Next I told it to flash the 9207-8e P16 firmware, with <code>sas2flsh -f 9207-8e.bin</code>:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415409807.png'  alt="sas2flsh -f 9207-8e.bin" />
<img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415409838.png'  alt="NVDATA Image does not match Controller Chip Revision" /></p>

<p>Huh. <code>NVDATA Image does not match Controller Chip Revision</code>, you say. <code>No compatible NVDATA Image(s) found!</code>, you say.</p>

<p><em>*go dig around on the internet*</em></p>

<p>Word on the street is that the HP H221 had a hardware revision, and while it's a rebranded LSI 9207-8e nowadays, some of the older ones floating around are in fact rebranded LSI 9205-8e cards.</p>

<p>So, next, I grabbed the 9205-8e P16 firmware and tried loading it with <code>sas2flsh -f 9205-8e.bin</code>:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415411019.png'  alt="sas2flsh -f 9205-8e.bin" /></p>

<p><code>NVDATA Device ID and Chip Revision match verified.</code> Hooray!</p>

<p><code>ERROR: NVDATA Image does not match Controller SubSystem ID!</code> Boo!</p>

<p><em>*go dig around on the internet some more*</em></p>

<p>The fact that the device ID and chip revision match means that I definitely have firmware for the right card. In other words, while it was readily apparent that this LSI 9207-8e was first sold as an HP H221, it turns out this HP H221 is <em>really</em> an LSI 9205-8e.</p>

<p>(Why did this change? Easy: the 9205-8e was discontinued and replaced by the 9207-8e. Both cards use the same <a href='http://www.lsi.com/products/io-controllers/pages/lsi-sas-2308.aspx' >LSI SAS2308</a> controller, but the 9207 supports PCI Express 3.0, while the 9205 does not. This limits the 9205 to ~2700 MB/s of throughput, which… seems okay for now.)</p>

<p>(Further aside: why would HP sell both under the same part number? Because they're jerks. If you change something in a way that breaks firmware compatibility without changing the part number, screw you.)</p>

<p>I don't know what the controller subsystem ID mismatch message means exactly, but somebody on the internet made it sound like that's an advisory check performed only by newer versions of the flashing utility. If that's the case, I figured such a mismatch couldn't be significant enough to brick the controller, so why not give it a try? I downloaded the P14 ZIP and pulled out the P14 <code>sas2flsh.exe</code>.</p>

<p>To reiterate: I decided to flash the P16 firmware with P14 utility. Sounds brilliant, right? What can possibly go wrong? Well…</p>

<p><img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415411470.png'  alt="P14 sas2flsh with P16 9205-8e.bin" />
<img src='http://www.willglynn.com/content/images/2014/Nov/screenshot-1415411523.png'  alt="P14 sas2flsh with P16 9205-8e.bin" /></p>

<p>It worked.</p>]]></description><link>http://www.willglynn.com/2014/11/10/lsi-sas-firmware-nonsense/</link><guid isPermaLink="false">3f34d94a-20fe-41f9-aa62-c0bb9d05ae36</guid><category><![CDATA[storage]]></category><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Tue, 11 Nov 2014 03:12:11 GMT</pubDate></item><item><title><![CDATA[CSC wireless upgrades]]></title><description><![CDATA[<p>I've been tinkering with the <a href='http://www.skydivecsc.com/' >Chicagoland Skydiving Center</a> network in preparation for the <a href='https://www.facebook.com/events/1421142298139544' >2014 Independence Boogie</a>. This is generally a large event, and this year is no exception:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Jul/hangar_ne-1.jpg'  alt="Hangar full of people" /></p>

<p>The vast majority of the people on the network are guests on wifi.</p>

<p>CSC can be broken down into three domains:</p>

<ul>
<li>The south building, including the Flight Deck restaurant, pro shop, bathrooms, showers, and team rooms</li>
<li>The main hangar, which is largely open space but also contains several offices both ground-level and on a mezzanine</li>
<li>Outdoors, including the CSCity RV park, the courtyard, the loading area, and outdoor dining at Flight Deck</li>
</ul>

<p>Both the south building and the main hangar are served using three access points. Their locations, frequency assignments, and antenna coverage patterns were carefully chosen to avoid interference and to provide consistently high perforance, especially under load.</p>

<p>The couryard is easy enough to handle with omnis, but CSCity is a problem. Residents expect their cell phones to pick up the CSC wifi inside their trailers – even though trailers are basically Faraday cages. We can serve 5 GHz clients using directional antennas, but 2.4 GHz doesn't give us enough channels to make that a viable option, so we've been running with a single omni.</p>

<p>The last week included four separate projects:</p>

<ol>
<li>We upgraded the CSCity mast on the SE corner of the main hangar. This mast provides service using two 14 dBi 5 GHz sector antennas and a 6 dBi 2.4 GHz omni. The antenna configuration did not change, but the radios powering it are improved.  </li>
<li>We upgraded the courtyard mast on the NW corner of the south building. This mast provides service using a 10 dBi 5 GHz omni and a 6 dBi 2.4 GHz omni. As before, same antennas, better radios.  </li>
<li>We added a CSCity North mast with a single 2.4 GHz access point. Channel selection was difficult; with the hangar door open, this AP can see at least one other AP on every frequency. I chose to alias the AP that serves the least traffic with the lowest transmit power, and CCQs remain high. CSCity North is the only AP that is not directly wired to the rest of the network using Ethernet; instead, it's connected via a point-to-multipoint 5 GHz backhaul.  </li>
<li>We renumbered the public VLAN. We have been close to running out of addresses on a single /24; it's now a /22. IPv6 service remains unchanged at a /64, and DHCPv6 prefix delegation lets you request additional routed /63s.</li>
</ol>

<p>I'm pretty happy with the performance during this event:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Jul/fri_wireless_users.png'  alt="Wireless users" />
<img src='http://www.willglynn.com/content/images/2014/Jul/fri_traffic.png'  alt="Traffic" />
<img src='http://www.willglynn.com/content/images/2014/Jul/fri_latency.png'  alt="Latency" /></p>

<p>The main hangar access point has the highest load (see all those people on the packing mat?) but performance is excellent: 0.1% retransmit rate, 22 mbps throughput, 60 associated stations. Note also this access point is using only 11 dBm EIRP.</p>

<p>Other drop zones (*cough*) have networking poor enough that I bring a 3G hotspot. CSC's network makes me happy to live here full-time.</p>]]></description><link>http://www.willglynn.com/2014/07/04/csc-wireless-upgrades/</link><guid isPermaLink="false">4868ccf4-7fcc-4f69-8575-7406d7f85bd2</guid><category><![CDATA[skydiving]]></category><category><![CDATA[networking]]></category><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Fri, 04 Jul 2014 18:39:11 GMT</pubDate></item><item><title><![CDATA[Performance Designs on wing loadings]]></title><description><![CDATA[<p>I just noticed something odd. Head to the <a href='http://www.performancedesigns.com/velocity.asp' >PD Velocity</a> page.</p>

<p>Follow the <a href='http://www.performancedesigns.com/docs/velocity.pdf' >Velocity Flight Characteristics</a> link. You'll see some wing loading recommendations:</p>

<blockquote>
  <p><strong>Size does matter:</strong></p>
  
  <p>… [a Velocity] can be loaded as lightly as 1.0 pounds per square foot …</p>
  
  <p><strong>So what size is best for you?</strong></p>
  
  <p>… as long as you’re above a minimum of 1.0 pounds per square foot. …</p>
</blockquote>

<p>All right, so the PD Velocity needs to be loaded above 1.0 lb/ft<sup>2</sup>. I would have guessed higher.</p>

<p>Now, follow the Manual link. You'll get an undated <a href='http://www.performancedesigns.com/docs/MainUsersManual.pdf' >Ram-Air Parachute Owner's Manual</a>. Scroll to "Picking The Right Canopy" on page 14. This section includes the statement:</p>

<blockquote>
  <p>Performance Designs does not recommend that anyone jump a canopy that will result in the wing loading exceeding 1.0 lb./sq.ft.</p>
</blockquote>

<p>All right, so PD does not recommend anything to be loaded above 1.0 lb/ft<sup>2</sup>.</p>

<p>So… er… no one should jump a Velocity?</p>]]></description><link>http://www.willglynn.com/2014/05/01/performance-designs-on-wing-loadings/</link><guid isPermaLink="false">e9989e4f-726e-47a0-a2f9-125f1f0f24cf</guid><category><![CDATA[skydiving]]></category><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Thu, 01 May 2014 17:54:42 GMT</pubDate></item><item><title><![CDATA[Skydiving season is on]]></title><description><![CDATA[<p>My 2014 skydiving season is off to a great start: I made jumps on both Saturday <em>and</em> Sunday! This puts me way ahead of last year, when the weather was so poor we didn't have a two-day weekend until July.</p>

<p>I made a video to celebrate the occasion:</p>

<iframe src='http://player.vimeo.com/video/90503807'  width="960" height="720" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

<p>Still <a href='http://www.willglynn.com/2014/03/19/free-fall-suits-malice-or-incompetence/' #week27">nothing from Freefall Suits</a>.</p>]]></description><link>http://www.willglynn.com/2014/03/31/skydiving-season-is-on/</link><guid isPermaLink="false">2944425b-e6e1-4618-a43f-4de1cf139397</guid><category><![CDATA[skydiving]]></category><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Mon, 31 Mar 2014 14:15:00 GMT</pubDate></item><item><title><![CDATA[Free Fall Suits: malice or incompetence?]]></title><description><![CDATA[<p>Free Fall Suits sells made-to-order jumpsuits, wingsuits, camera jackets, etc. -- everything a skydiver might want.</p>

<p>Note that I said "sells", not "makes".</p>

<h3 id="tldr">TL;DR</h3>

<p>I ordered and paid for a freefly suit and camera jacket from Chris Kotscha at Freefall Suits on September 21, 2013.</p>

<p>My five delivery dates:</p>

<ul>
<li>As of September 21: about 8 weeks</li>
<li>As of December 12: "week of 13 January"</li>
<li>As of February 7: "later next week"</li>
<li>As of February 24: "The order WILL be completed and delivered before the season"</li>
<li>As of March 19: "within the next 2 weeks"</li>
</ul>

<p>I published this page after <a href="#week25">six months of getting nowhere</a>.</p>

<p>Freefall Suits indicated that my freefly suit was completed on <a href="#april32014">April 3</a>, but I did not receive anything until <a href="#april192014">April 19</a> – precisely 30 weeks after placing my order.</p>

<p>My camera jacket shipped <a href="#may22014">May 2</a> but is still in transit.</p>

<h2 id="thewholestory">The Whole Story</h2>

<p>Quick links:</p>

<ul>
<li><a href="#week2">Week 2</a></li>
<li><a href="#week10">Week 10</a></li>
<li><a href="#week11">Week 11</a></li>
<li><a href="#week16">Week 16</a></li>
<li><a href="#week17">Week 17</a></li>
<li><a href="#week18">Week 18</a></li>
<li><a href="#week19">Week 19</a></li>
<li><a href="#week21">Week 21</a></li>
<li><a href="#week22">Week 22</a></li>
<li><a href="#week25">Week 25</a></li>
<li><a href="#week27">Week 27</a></li>
<li><a href="#week28">Week 28</a></li>
<li><a href="#week29">Week 29</a></li>
<li><a href="#week30">Week 30</a></li>
<li><a href="#week31">Week 31</a></li>
<li><a href="#week32">Week 32</a></li>
</ul>

<h3 id="initialcontact">Initial contact</h3>

<h4 id="september212013">September 21, 2013</h4>

<p>It was a Saturday. Like most Saturdays, I was skydiving, but with Nationals recently completed, I was fun-jumping instead of training with my team. It was my last weekend with my rental wingsuit, so I started the day with two wingsuit jumps before joining most of my friends doing other things.</p>

<p>I saw a tent go up after my third jump of the day. Ah, jumpsuits for sale! I was in the market for a freefly suit, so I made a point to stop in.</p>

<p>I popped over around jump #6 and said, literally, "sell me this jumpsuit". Chris – who I later learned was the founder of Free Fall Suits – took the demo suit by one arm and told me to pull on the other one. "No, no, really pull on it!" I did. The suit didn't care at all.</p>

<p>Honestly, very impressive demonstration. He told me all about the fabrics (this panel uses a Cordura/Kevlar blend!), the zippers, the stitching, everything. It looked and felt like an exceptionally well-made jumpsuit, but it was priced at the bottom end of the spectrum. I challenged him; Chris explained that he wanted to grow his company rather than to make a bunch of profit day one, and the best way to do that is to saturate the market with his suits, which meant selling them cheap.</p>

<p>This seemed like an unusual strategy, but Chris seemed like an unusual fellow. "All right, I'm sold", and he started measuring. I selected both a freefly suit and a camera jacket.</p>

<p>Chris had been planning to make a wingsuit jump, so I made sure to review: jump run is north, we're landing north, no more than 90º onto final, there's power lines on all the roads, etc. This left his associate to run the booth. We chatted about the company: they're just starting out, they've been on a tour, they were just leaving Nationals at Skydive Chicago and thought they'd stop by, etc. Seemed reasonable enough.</p>

<p>I watched Chris land under his reserve. Bummer – apparently he had a malfunction, chopped, opened into reserve line twists, and dropped his handles in order to sort it out. He spent the next while trying to gather his rig together again while I kept jumping.</p>

<p>After sunset, we looped back together again to finalize things: colors, options, payment. I paid in full using a Capital One VISA and got an Intuit payment receipt by email at 7:19 PM.</p>

<p>I was told to expect delivery in about 8 weeks, which fell just after the end of my season. I figured it didn't much matter if the schedule slipped because I wouldn't need it until spring.</p>

<h3 id="week2">Week 2</h3>

<h4 id="october102013">October 10, 2013</h4>

<p>I received an email:</p>

<blockquote>
  <p>Good afternoon,</p>
  
  <p>Please note that we are having a delay as some of the materials for the generation 4 suits did not pass the stress tests.  </p>
  
  <p>As we use materials that are custom made we are not able to simply go to a fabric store and start making the suits.  </p>
  
  <p>I apologize for the delay and will inform you as soon as we resolve this.</p>
  
  <p>Thank you,</p>
  
  <p>Chris Kotscha <br />
  Freefall Suits</p>
</blockquote>

<p>All right. Again, I can deal with a delay.</p>

<h3 id="week10">Week 10</h3>

<h4 id="december42013">December 4, 2013</h4>

<p>We're now two weeks past the original delivery date. I wrote an email, quoting the delay message above:</p>

<blockquote>
  <p>I haven't heard anything in quite a while. Is everything still on hold? More directly, could you provide an updated delivery window?</p>
</blockquote>

<p>I included a copy of my receipt for reference.</p>

<h3 id="week11">Week 11</h3>

<h4 id="december102013">December 10, 2013</h4>

<p>No reply. I wrote another email:</p>

<blockquote>
  <p>Hello?</p>
  
  <p>I'm now concerned by the lack of communication. Additionally, I note that we're coming to the close of the 90-day chargeback window.</p>
  
  <p>Please talk to me.</p>
  
  <p>--Will</p>
</blockquote>

<h4 id="december112013">December 11, 2013</h4>

<p>I received:</p>

<blockquote>
  <p>Good morning Will,</p>
  
  <p>I am unsure why you have not received a response from the office. I will look into the status of your suit. </p>
  
  <p>Thank you,</p>
  
  <p>Chris</p>
  
  <p>Sent from my iPhone</p>
</blockquote>

<h4 id="december122013">December 12, 2013</h4>

<p>I sent:</p>

<blockquote>
  <p>When should I expect to hear back on this?</p>
  
  <p>--Will</p>
</blockquote>

<p>I received:</p>

<blockquote>
  <p>Good evening will,</p>
  
  <p>I asked the office and they say your suit will be done on the week of 13 January.</p>
  
  <p>I thank you for your patience. We had an issue with our material supplier but have found a new source and are catching up to the cue.</p>
  
  <p>Thank you,</p>
  
  <p>Chris</p>
  
  <p>Sent from my iPhone</p>
</blockquote>

<p>Optimistic, I sent:</p>

<blockquote>
  <p>Excellent! I appreciate the update.</p>
  
  <p>What's the delivery time look like after that? I'm thinking I want to order another suit once I get my current order and can check it for fit and such.</p>
  
  <p>Thanks,</p>
  
  <p>--Will</p>
</blockquote>

<p>And received:</p>

<blockquote>
  <p>Shipping normally takes 3-8 business days. </p>
  
  <p>Cheers!</p>
  
  <p>Sent from my iPhone</p>
</blockquote>

<h3 id="week16">Week 16</h3>

<h4 id="january132014">January 13, 2014</h4>

<p>This is the delivery date provided on December 12. I wrote:</p>

<blockquote>
  <p>Are we still on track for shipping this week?</p>
  
  <p>Thanks,</p>
  
  <p>--Will</p>
</blockquote>

<h3 id="week17">Week 17</h3>

<h4 id="january222014">January 22, 2014</h4>

<p>I sent:</p>

<blockquote>
  <p>I am beyond tired of emailing your company without reply. Customer service is a <a href='http://www.zendesk.com/' >solved</a> <a href='http://www.kayako.com/' >problem</a>. Even a to-do list would suffice: check your email, add the issue to the list, reply "I'll get back to you", and work down the list. Any issues left open at the end of the day get a second reply saying "I haven't forgotten". It's not acceptable to ignore direct inquiries.</p>
  
  <p>--Will</p>
</blockquote>

<p>I received:</p>

<blockquote>
  <p>Good Morning Will,</p>
  
  <p>I apologize that you have not had a good experience. I am heading back to the office to fix a number of issues that arose once I had left. Unfortunately I had thought that the office was responding to you and others but it turned out that they were not doing there job. As such you were not responded to and for that I really apologize. I have let go two people as a result of this lack of communication as you were not the only one (unfortunately), the shipping is one example as I was told it would be ready to ship. I passed that on to you and then it turned out to not be correct. I am heading back to the office this week and will ensure your suit gets built asap, even if I sit down and sew it myself.</p>
  
  <p>Again I am heading back to the office to fix this issue and finding out why the inspection did not catch both the options and the measurements. Unfortunately it seems that as soon as I left things started to fall apart. I will fit it. I cancelled all my plans for the next few months so I can stay in the office.</p>
  
  <p>My motivation for starting this company was to provide a well built suit at a price that was much more reasonable then what the market currently is. Money was not at all a motivator as I planned on not making anything for the first 4 years. I just want to make better products at a better rate.</p>
  
  <p>I really do thank you for your patience, I understand your frustration as you this should not have been an issue. All I can do at this stage is makes sure that you get a good value and experience. We made mistakes but I will do anything to correct the issues and get you the suit.</p>
  
  <p>Thank you,</p>
  
  <p>Chris Kotscha</p>
</blockquote>

<p>I sent:</p>

<blockquote>
  <p>I didn't even know there were issues with my order. The last contact I had was the December 12 email giving last week as the shipping target.</p>
  
  <p>I appreciate your attention.</p>
  
  <p>--Will Glynn<br/>Sent from my iPhone</p>
</blockquote>

<h3 id="week18">Week 18</h3>

<h4 id="january312014">January 31, 2014</h4>

<p>I received what seems like a mass email since it's approximately a duplicate of the one I got on January 22. I guess lots of other people are having problems.</p>

<blockquote>
  <p>Good Morning,</p>
  
  <p>I wanted to reach out to you so you know what has been happening with your suit order.</p>
  
  <p>There have been some issues recently that I am currently addressing. Unfortunately I had thought that the office was responding to you and others but it turned out that they were not doing their job. As such you were not responded to and for that I really apologize. I did not realize the scope of the issue until I got back to the office. I have let go two people as a result of this lack of communication as you were not the only one (unfortunately). It seems that as soon as I left things started to fall apart. I WILL fix it. I cancelled all my plans for the next few months so I can stay in the office in order to resolve the delivery times and communication to ensure you and future orders get exactly what they expect.</p>
  
  <p>In the September/October timeframe we switched over to the generation 4 models of suit and the transition of this design took longer than we had expected. These suits are amazing in build and strength and I know you will be happy. We fixed the modeling issues that arose and are now in the final stages of “catch up”. I apologize that this build up of orders affected the delivery time on your suit, know that we are working 2 shifts a day to catch up on this backlog and we are almost caught up.</p>
  
  <p>Please send your email inquiries to the <a href='mailto:info@freefallsuits.com' >info@freefallsuits.com</a> address and someone Will get back to you shortly, Unfortunately I personally receive over 500 emails a day and sometimes they get lost, the office will always assist you.</p>
  
  <p>My motivation for starting this company was to provide a well built suit at a price that was much more reasonable then what the market currently is. Money was not at all a motivator as I planned on not making anything for the first 4 years. I just want to make better products at a better rate. I thank you for the opportunity to </p>
  
  <p>I really do thank you for your patience, I understand your frustration as you this should not have been an issue. All I can do at this stage is makes sure that you get a good value and experience. We made mistakes but I will do anything to correct the issues and ensure you are happy.</p>
  
  <p>Thank you,</p>
  
  <p>Chris Kotscha</p>
</blockquote>

<h3 id="week19">Week 19</h3>

<h4 id="february52014">February 5, 2014</h4>

<p>I sent:</p>

<blockquote>
  <p>Can you provide me with an updated delivery date?</p>
  
  <p>--Will</p>
</blockquote>

<h4 id="february72014">February 7, 2014</h4>

<p>I sent:</p>

<blockquote>
  <p>I don’t really know why I expected a reply this time, but I’m disappointed.</p>
  
  <p>Look: <strong>I need to know if you’re going to make that jumpsuit and camera jacket</strong>. I placed the order on September 21, 2013 — that's 20 weeks ago tomorrow. Safety Day is 4 weeks away, the start of my skydiving season is 7 weeks away, and the local iFLY tunnel should have its grand opening around then as well. If you’re not going to fill my order, I need to get someone else working on it now.</p>
  
  <p>--Will</p>
</blockquote>

<p>I received:</p>

<blockquote>
  <p>Good morning Will,</p>
  
  <p>Your suit will be ready later next week.</p>
  
  <p>I apologize for the delay. Since I got back everyone has been working double shifts in order to catch up the backlog.</p>
  
  <p>Personally I apologize for not responding on Wednesday. I thought that I had but obviously confused that with responding to someone else's request.</p>
  
  <p>Thank you,</p>
  
  <p>Chris</p>
</blockquote>

<p>Concerned that he might have forgotten I ordered two things:</p>

<blockquote>
  <p>Excellent, thank you.</p>
  
  <p>Is this just the freefly suit, or does that include the camera jacket as well?</p>
  
  <p>--Will</p>
</blockquote>

<p>I received:</p>

<blockquote>
  <p>Hi Will,</p>
  
  <p>That's for both. I thank you for your patience through these growing pains. </p>
  
  <p>Sent from iPhone. Please note if I do not reply quickly I may have not received your email due to the high volume I receive.</p>
</blockquote>

<h3 id="week21">Week 21</h3>

<h4 id="february212014">February 21, 2014</h4>

<blockquote>
  <p>I haven’t heard anything in two weeks, so all I can do is assume there’s been no progress.</p>
  
  <p>As a reminder:</p>
  
  <blockquote>
    <p>Look: <strong>I need to know if you’re going to make that jumpsuit and camera jacket</strong>. I placed the order on September 21, 2013 — that's 20 weeks ago tomorrow. Safety Day is 4 weeks away, the start of my skydiving season is 7 weeks away, and the local iFLY tunnel should have its grand opening around then as well. If you’re not going to fill my order, I need to get someone else working on it now.</p>
  </blockquote>
  
  <p>Tomorrow marks 22 weeks. It also marks one month since you offered:</p>
  
  <blockquote>
    <p>I am heading back to the office this week and will ensure your suit gets built asap, even if I sit down and sew it myself.</p>
  </blockquote>
  
  <p>—Will</p>
</blockquote>

<h3 id="week22">Week 22</h3>

<h4 id="february242014">February 24, 2014</h4>

<blockquote>
  <p>Hi Will,</p>
  
  <p>I am trying to figure out an exact delivery date.  The order WILL be completed and delivered before the season. </p>
  
  <p>Unfortunately we are running behind on production. We recently experienced an issue with our made to measure software. This caused some grief as the issue resulted in ankles, wrists and the waist to be a bit smaller then the pattern. Because of this we had to redo a number of suits before they could be sent out. This compounded the other lessons learnt but we have learnt and continue to improve.</p>
  
  <p>We have identified the issue and are working hard to catch up the cue as quickly as possible. </p>
  
  <p>This delay in production caused the cue to build up. I apologize that this build up of orders affected the delivery time on your suit. I am still trying to get specific delivery dates to everyone, it's just going to take a few days for me to figure out how quickly we can catch up.</p>
  
  <p>My motivation for starting this company was to provide a well built suit at a price that was more reasonable then what was on the market. We have experienced some growing pains but that motivation is as strong as ever. </p>
  
  <p>I really do thank you for your patience. </p>
  
  <p>Chris<br/>Freefall Suits</p>
</blockquote>

<h3 id="week25">Week 25</h3>

<h4 id="march192014">March 19, 2014</h4>

<p>I wrote:</p>

<blockquote>
  <blockquote>
    <p>I am trying to figure out an exact delivery date.  The order WILL be completed and delivered before the season. </p>
  </blockquote>
  
  <p>Opening day is next Friday, March 28. I’ll have my suits by then?</p>
  
  <p>—Will Glynn</p>
</blockquote>

<p>Then I saw <a href='https://www.facebook.com/Freefallsuits/posts/729376990426515'  rel="nofollow">this</a> on their Facebook page. They're both selling stock suits <em>and</em> inviting more custom orders while my 6-month-old paid-in-full custom order is still sitting unfulfilled. I had to comment:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Mar/freefall_suits_facebook-2.png'  alt="I ordered and paid for a custom suit in September. I don't have the suit. I don't even have a delivery date." /></p>

<p>Freefall Suits removed my comment but could not be bothered to reply to my email or otherwise address my situation. I found this extremely distasteful, so:</p>

<ul>
<li>I published this page to the web at large</li>
<li>I shared this on <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4613051' #4613051">dropzone.com</a>, finding I'm not alone</li>
<li>I shared this on <a href='https://twitter.com/delta407/status/446462312296501249'  rel="nofollow">Twitter</a> and <a href='https://plus.google.com/+WillGlynn/posts/5XTHB6fHNAT'  rel="nofollow">Google+</a></li>
<li>I shared this with my local DZO and recommended against Freefall Suits as a vendor</li>
<li>I sent this page to all my skydiving friends, some of whom have heard about Freefall Suits, but most of whom haven't</li>
</ul>

<p>Freefall Suits: <strong>fill my order</strong>. Chris Kotscha: you said you would build my suit "asap, even if I sit down and sew it myself". That was two months ago. My season starts next Friday.</p>

<hr />

<p>After publishing this, I received:</p>

<blockquote>
  <p>Good evening Will,</p>
  
  <p>It will be close but you will have them within the next 2 weeks. We had to re-make your suit a few times as they didn't reach my standard.</p>
  
  <p>I'm sorry it has taken so long, we ran into every administrative and personnel problem that I had ever thought possible. We are sorting it out but I know the wait was too long. We are working very very hard to get a fast turn around.</p>
  
  <p>Thank you,</p>
  
  <p>Chris</p>
  
  <p>Sent from iPhone. Please note if I do not reply quickly I may have not received your email due to the high volume I receive.</p>
</blockquote>

<p>I replied:</p>

<blockquote>
  <p>Thank you for the response. I look forward to receiving the suits.</p>
  
  <p>You should know: I wrote you the email earlier today, and then saw a Facebook post inviting more custom orders. I posted a comment indicating my 6-month-old order is still in limbo – clearly as a frustrated customer – and instead of responding in any way, someone simply deleted it.</p>
  
  <p>Deleting that one little comment made me feel not just ignored but actively silenced, so between then and now, I chronicled my entire Freefall Suits experience in full and published it to my website.</p>
  
  <p><a href='http://www.willglynn.com/2014/03/19/free-fall-suits-malice-or-incompetence/' #week25'>http://www.willglynn.com/2014/03/19/free-fall-suits-malice-or-incompetence/#week25</a></p>
  
  <p>Delays are understandable, but combining both extreme delays and poor communication is a problem. I’ve had to reach out to Freefall Suits over and over again to get any kind of information, including today, and the responses I’ve gotten have mostly been broken promises.</p>
  
  <p>I sincerely hope I will be able to end that post in a positive way, having received well-built, well-fitting jumpsuits at a fair price.</p>
  
  <p>--Will</p>
</blockquote>

<p>I received two more messages after I went to bed:</p>

<blockquote>
  <p>Hi Will,</p>
  
  <p>I apologize that you got that impression. We have someone managing the Facebook that doesn't have any day to day information. When he saw your post he sent me a message telling me that no one reached out to you.</p>
  
  <p>Unfortunately we are in our first year and have had personnel issues that caused communication issues. Obviously that still needs to be worked out.</p>
  
  <p>All I want to do is provide a great suit at a way lower price then what the market currently is. I'm not making any money (actually loosing a ton right now) as that's not my motivation. Unfortunately it's hard to get others to understand the importance of answering the phone or messages instead of the physical cutting and sewing portions. </p>
  
  <p>Hopefully this summer we will grow big enough to be able to afford front desk personnel to ensure effective communication.</p>
  
  <p>Thank you,</p>
  
  <p>Chris</p>
  
  <p>Sent from iPhone. Please note if I do not reply quickly I may have not received your email due to the high volume I receive.</p>
</blockquote>

<p>Followed by:</p>

<blockquote>
  <p>After reading your posts I realized that I had said I would sit down and sew it myself. </p>
  
  <p>In my schedule I realized that it would be a wait if I did it myself as I suffer from a mountain of work. As such I looked at other options to speed things up. We built a pattern for your suit and gave it and the materials to a local seamstress. Expensive but speed was key. Since then the seamstress went on a very long vacation and didnt tell me until I received an email 2 weeks after I have everything over.</p>
  
  <p>Not an excuse, our problems are ours to deal with. I just wanted you to know why I didn't physically sew the suit myself. After 4 months of working 7am until midnight or past I have realized that time for me to sew is virtually non existent. </p>
  
  <p>One of the unfortunate realities of any new business is balancing employees, production, suppliers and infrastructure and bringing it all together. The easy way out would be to stop making suits, but I want this to succeed. It frustrates me to no one when people I know spend $1000 for a jumpsuit and I want to change that. </p>
  
  <p>I thank you for your time and patience. </p>
  
  <p>Chris </p>
  
  <p>Sent from iPhone. Please note if I do not reply quickly I may have not received your email due to the high volume I receive.</p>
</blockquote>

<h4 id="march202014">March 20, 2014</h4>

<p>I replied:</p>

<blockquote>
  <blockquote>
    <p>We have someone managing the Facebook that doesn't have any day to day information.</p>
  </blockquote>
  
  <p>I found the Facebook post aggravating for two reasons: first, it happily invites readers to order more custom suits, even though I know with certainty that Freefall Suits has custom orders from at least six months ago still outstanding. Second, my comment was deleted very quickly – much more quickly than any other contact I’ve had with Freefall Suits – and it was deleted without any other form of contact, such as a private message indicating that someone would get back to me soon.</p>
  
  <blockquote>
    <p>Unfortunately it's hard to get others to understand the importance of answering the phone or messages instead of the physical cutting and sewing portions. </p>
  </blockquote>
  
  <p>It’s really about expectations. Perhaps showing these people my perspective as a customer will help them understand.</p>
  
  <blockquote>
    <p>Hopefully this summer we will grow big enough to be able to afford front desk personnel to ensure effective communication.</p>
  </blockquote>
  
  <p>I made some suggestions in my January 22 email where I assert that customer service is a solved problem. I believe you need a *system* — really, just about any system — not more people.</p>
  
  <p>If you had told me in September that my suit wouldn’t be ready until March, that would have been completely fine. Unfortunately, I’ve let Freefall Suits set my expectations at each point, only to have each delivery window come and go without another word. I think someone should keep track of the delivery dates given to customers. You know a week in advance when a suit won't be ready in time, so you can be proactive — give your customer an update before you’re late.</p>
  
  <p>Without that, we get my experience: the dates come and go, so I check to see what’s going on because no one has told me. If I got a reply setting expectations again, I’d be a little irritated, but generally okay. However, I didn't get <em>anything</em> from Freefall Suits unless I hassled you repeatedly; see my emails on December 4/10/12, January 13/22, February 5/7. Seriously? It’s not hard to figure out which emails need action and mark them as such. I’d even settle for “I’ll get back to you shortly”, but being totally silent after blowing a self-imposed deadline is just awful.</p>
  
  <p>Whatever you’re doing now isn’t working. Fix it. There are plenty of tools available.</p>
  
  <blockquote>
    <p>After reading your posts I realized that I had said I would sit down and sew it myself.</p>
  </blockquote>
  
  <p>It really doesn’t matter to me if you personally construct my suit. Ultimately, you took my measurements and you run the company; if I have a problem with the results, I’ll be contacting you to resolve it regardless of who actually put it together.</p>
  
  <p>That said, I did interpret this as meaning you were personally taking ownership of my order, and I took it at face value when you said you would “ensure [my] suit gets built asap”. That was two months ago. I suspect it would have been possible to start and finish producing my order in less than two months.</p>
  
  <p>For comparison, a friend and I each ordered a wingsuit from Phoenix-Fly in November — exactly two months after I ordered from Free Fall Suits. We both received our orders on time in early February, right around when you told me “later next week”. My wingsuit was perfect, but his wingsuit had enough problems that Phoenix agreed to re-make it from scratch. Correcting this required a single phone call, and his second suit arrived three weeks ago.</p>
  
  <p>For an additional comparison, I ordered a container from Rigging Innovations in October. I’m sure I was told when to expect delivery when I sent in the form but I didn’t remember anything more specific than “Q1 2014”. I wrote an email on January 9 at 4:53 PM:</p>
  
  <blockquote>
    <p>I haven't heard anything in a while and I don't really remember when to expect production to be complete. Could you check on my order?</p>
  </blockquote>
  
  <p>I got a response at 5:13 PM:</p>
  
  <blockquote>
    <p>It's moving along, I'm guessing it should be done within 3-4 more weeks.  The factory is closed for 2 weeks at the end of December, so that always creates a bit of a backlog for us.  I attached a picture of it.  Thanks!</p>
  </blockquote>
  
  <p>I was so pleased, I sent the photo of my partially-constructed container to a bunch of people right then. It shipped three and a half weeks later. I know who I’ll talk to next time.</p>
  
  <blockquote>
    <p>One of the unfortunate realities of any new business is balancing employees, production, suppliers and infrastructure and bringing it all together. The easy way out would be to stop making suits, but I want this to succeed. It frustrates me to no one when people I know spend $1000 for a jumpsuit and I want to change that. </p>
  </blockquote>
  
  <p>I want you to succeed. I want to like your product enough to buy more and to recommend it to my friends. So: please, make me a happy customer. Fill my order and let’s go from there.</p>
  
  <p>—Will</p>
</blockquote>

<h2 id="week27">Week 27</h2>

<h3 id="march292014">March 29, 2014</h3>

<p>My skydiving season <a href='http://www.willglynn.com/2014/03/31/skydiving-season-is-on/' >officially started</a>. This means we're also officially past my fourth delivery date, <a href="#week22">given on February 24</a>:</p>

<blockquote>
  <p>The order WILL be completed and delivered before the season.</p>
</blockquote>

<h3 id="april22014">April 2, 2014</h3>

<p>We're now at my fifth and most recent delivery date. I sent:</p>

<blockquote>
  <p>On Mar 19, 2014, at 10:00 PM, Chris Freefall suits wrote:</p>
  
  <blockquote>
    <p>It will be close but you will have them within the next 2 weeks.</p>
  </blockquote>
  
  <p>It's been exactly two weeks and I don't have the suits. I also don't have a tracking number, which makes me think they haven't been shipped, and I haven't received any information about my order's production, which makes me think nothing has happened at all.</p>
  
  <p>Eight weeks ago:</p>
  
  <blockquote>
    <p>Look: <strong>I need to know if you’re going to make that jumpsuit and camera jacket.</strong> I placed the order on September 21, 2013 — that's 20 weeks ago tomorrow. Safety Day is 4 weeks away, the start of my skydiving season is 7 weeks away, and the local iFLY tunnel should have its grand opening around then as well. If you’re not going to fill my order, I need to get someone else working on it now.</p>
  </blockquote>
  
  <p>Not only did you agree to make these items, you said they would be ready "later next week".</p>
  
  <p>I need these suits. You've repeatedly committed to providing them. <strong>Where are they?</strong></p>
  
  <p>--Will</p>
</blockquote>

<p>I checked in on the Dropzone.com thread, finding posts from several other people still waiting for their orders as well as a post by a Freefall Suits representative. I <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4618848' #4618848">replied</a>:</p>

<blockquote>
  <blockquote>
    <p>We are currently processing the orders from the very end of Dec. Within the next 5 weeks we will be caught up on all the orders from January, February and March bringing us back to a 6.5 week delivery time.</p>
  </blockquote>
  
  <p>If that's true then you're not processing orders chronologically. I ordered on September 21, and as of my fifth delivery date (today), I haven't received anything. </p>
  
  <blockquote>
    <p>For perspective other suit companies have had a 24 week delivery time before when they were newer and learning lessons</p>
  </blockquote>
  
  <p>Maybe so, but I'd guess those other companies don't make a habit of promising and failing to deliver. Again, I'm at <strong>five</strong> delivery dates blown -- delivery dates <strong>set by Freefall Suits</strong>. If you had quoted me a 24-week lead time, I probably would have been okay with that, but instead I was told I'd have my order in 8 weeks, 4 weeks, next week, 4 weeks, and 2 weeks. </p>
  
  <p>As of now, my order is <a href="#week27">27 weeks old</a> and I don't even have an ETA. </p>
</blockquote>

<h3 id="april32014">April 3, 2014</h3>

<p>I received this in the wee hours of the morning:</p>

<blockquote>
  <p>Hi Will, </p>
  
  <p>Your freefly suit is done, now we need to work on your camera jacket. </p>
  
  <p>I know we have broken past deadlines that we supplied. At the time for all of those I thought it was achievable, then we would run into more issues that delayed delivery. </p>
  
  <p>Unfortunately due to a flurry of posts on dz.com we went from the usual 30-40hrs a week of answering phone / emails to an absurd amount. This meant that I had to pull a seamstress to answer phones in addition to myself and one other sharing the workload. As we are a small company this resulted in a loss of 15% of our production until the inquiries die down. When I quoted the 2 weeks I didn't predict that I would lose 60hrs of productive sewing labor in a week. Unfortunately hiring more staff is not a possibility to cover this off.</p>
  
  <p>I used to think that building suits was easy. Frankly the physical sewing is easy, but getting the man power, infrastructure, supplies and administration together while concurrently trouble shooting each day is a challenge. </p>
  
  <p>We have / are sending over 140 suits this week so we have been hyper productive to catch up after an endless list of issues (almost all externally influenced). </p>
  
  <p>I thank you for your patience. We're a startup and people's patience has a benefit that I cannot begin to describe my appreciation of.</p>
  
  <p>Chris</p>
</blockquote>

<p>I replied:</p>

<blockquote>
  <p>Thank you for the update. I look forward to receiving the suits. Please send me a tracking number when they ship.</p>
  
  <p>--Will</p>
</blockquote>

<h2 id="week28">Week 28</h2>

<h3 id="april102014">April 10, 2014</h3>

<p>A brand new account <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4622494' #4622494">posted on dropzone.com</a> that they ordered from Freefly Suits in late October, received a suit in February, sent it back for fixes, and received the  altered suit in two weeks.</p>

<h3 id="april112014">April 11, 2014</h3>

<p>I <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4622558' #4622558">replied on dropzone.com</a>:</p>

<blockquote>
  <blockquote>
    <p>I jump in eloy and Chris was out there at the Halloween Boogie. … My suit came in February. … He took the suit that day and reenginered it . 2 Weeks later I had my suit back.</p>
  </blockquote>
  
  <p>I ordered in September -- 29 weeks ago tomorrow -- and still have received nothing. According to Chris, my freefly suit was completed at least 8 days ago, but I haven't received a shipment or a shipment notification. Maybe he's waiting to finish my camera jacket too in order to save on postage... </p>
  
  <blockquote>
    <p>But Freefall Suit makes unbelievable skydiving suits.</p>
  </blockquote>
  
  <p>I hope so. </p>
</blockquote>

<p>This story is consistent with my <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4618848' #4618848">earlier suspicion</a> that Freefall Suits doesn't have anything resembling a first-in, first-out production queue.</p>

<h2 id="week29">Week 29</h2>

<h3 id="april122014">April 12, 2014</h3>

<p>I sent an email:</p>

<blockquote>
  <p>On Apr 3, 2014, at 12:39 AM, Chris Freefall suits wrote:</p>
  
  <blockquote>
    <p>Your freefly suit is done, now we need to work on your camera jacket. </p>
  </blockquote>
  
  <p>It's been 9 days since your last message, so I assume the camera jacket isn't ready yet. However, I need a freefly suit more than I need a camera jacket.</p>
  
  <p>I understand that it would be cheaper to ship both together, but seeing as how my order is now 29 weeks old and my skydiving season is underway, I think it would be reasonable for you to ship both items as they become available. Could you ship my freefly suit on Monday?</p>
  
  <p>--Will</p>
</blockquote>

<p>I <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4622950;' #4622950">posted on dropzone.com</a>:</p>

<blockquote>
  <blockquote>
    <p>What happens when you need more money, but there are no new orders?</p>
  </blockquote>
  
  <p>Apparently <a href="#march192014">you do a stock sale, solicit more new orders, and delete any negative feedback</a>.</p>
  
  <p>Chris indicated that my freefly suit was done a week and a half ago. I <a href="#week29">asked him to ship it on Monday</a> even if the camera jacket I ordered is still outstanding. Let's see what happens next. </p>
</blockquote>

<p>I received a reply:</p>

<blockquote>
  <p>Good afternoon Will,</p>
  
  <p>I will ensure it is sent out on Monday.</p>
  
  <p>Thank you,</p>
  
  <p>Chris</p>
</blockquote>

<h3 id="april142014">April 14, 2014</h3>

<p>Monday's business hours came and went without a word. Shortly before going to bed, I sent:</p>

<blockquote>
  <blockquote>
    <p>I will ensure it is sent out on Monday.</p>
  </blockquote>
  
  <p>Was my freefly suit shipped today? If so, could you provide the tracking number?</p>
  
  <p>--Will Glynn<br/>Sent from my iPhone</p>
</blockquote>

<p>A couple hours later (after midnight my time), I received:</p>

<blockquote>
  <p>Good evening Will,</p>
  
  <p>The tracking number is USPS 9114 9012 3080 3140 4494 32  </p>
  
  <p>Thank you,</p>
  
  <p>Chris</p>
</blockquote>

<h3 id="april152014">April 15, 2014</h3>

<p>The tracking number shows it was supposed to be delivered today but the tracking data casts doubt on this prediction:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Apr/usps_tracking.png'  alt="USPS tracking on April 15" /></p>

<h3 id="april162014">April 16, 2014</h3>

<p>USPS continues to list an Expected Delivery Day of yesterday, but at least the package appears to be making progress:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Apr/usps_tracking_april_16.png'  alt="USPS tracking on April 16" /></p>

<p>This is consistent with <a href='https://about.usps.com/what-we-are-doing/service-performance/fy2014-q1-package-services-quarterly-performance.pdf' >USPS FY2014 Q1 statistics</a> showing 75.3% on-time performance to Chicago and 84.0% overall.</p>

<p>Chris <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4624236' #4624236">posted to the dropzone.com thread</a>, addressing numerous issues. I <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4624556' #4624556">responded</a>:</p>

<blockquote>
  <blockquote>
    <p>Will - your suit was shipped and the tracking number was sent to your email.</p>
  </blockquote>
  
  <p>That's true; I have a tracking number. I've been keeping <a href="#april142014">my post up-to-date</a>. If I receive the freefly suit, and it fits, and it's the correct colors, and it has the correct options, it will have been a 29-week ordeal -- and if there's a problem, it will end up being an even longer ordeal. </p>
  
  <p>Either way, my Freefall Suits camera jacket is still in week 29 with no ETA. </p>
</blockquote>

<h3 id="april172014">April 17, 2014</h3>

<p>No movement from USPS. "Expected Delivery Day" remains April 15.</p>

<p>The <a href='https://about.usps.com/what-we-are-doing/service-performance/fy2014-q1-package-services-quarterly-performance.pdf' >USPS performance report</a> says "98.5 percent delivered within the service standard plus three days", which should be tomorrow. On the other hand, <a href='https://web.archive.org/web/20070706212449/http://boykin.acis.ufl.edu/?p=118' >USPS appears to lose more packages than its competitors</a>. Let's hope I get lucky.</p>

<h3 id="april182014">April 18, 2014</h3>

<p>No movement from USPS. I'm slated to organize at <a href='https://www.facebook.com/events/278242699010064' >today's RW event</a>, so I won't be sitting at my mailbox in Chicago all day, but I've arranged for a friend to stop by and collect the package should USPS indicate it was delivered.</p>

<h2 id="week30">Week 30</h2>

<h3 id="april192014">April 19, 2014</h3>

<p>The USPS package was actually delivered to my home in Chicago today. I'm at the drop zone all weekend (team training!), so I had a friend stop by, retrieve the package from the entryway, place it inside my home, and send me a photo.</p>

<p><img src='http://www.willglynn.com/content/images/2014/Apr/IMG_7639.jpg'  alt="USPS box" /></p>

<p>I plan to open the box on Monday.</p>

<h3 id="april212014">April 21, 2014</h3>

<p>Closer examination of the box reveals why it took so long: the handwritten shipping label contained the wrong ZIP code.</p>

<p>I opened the box, revealing a freefly suit in my colors and approximating my size. It has magnets, which is the option I cared most about. There are some issues with the fit, some of which I can't precisely diagnose alone.</p>

<p>My plan is to get feedback from my local rigger and prepare a full report tomorrow.</p>

<h3 id="april232014">April 23, 2014</h3>

<p>I visited my local rigging loft and we decided that the best next step is to jump the suit and see what happens. The weather should permit that on Friday.</p>

<h3 id="april252014">April 25, 2014</h3>

<p>I jumped the freefly suit a couple times. Positives:</p>

<ul>
<li>I fit inside of the suit.</li>
<li>It's the right colors.</li>
<li>It's warm.</li>
<li>The arm material seems like it'll withstand contact with velco, say, from an altimeter wrist strap. (This is a source of wear on my current RW suit.)</li>
</ul>

<p>Negatives:</p>

<ul>
<li>The torso and legs seem too long in general, both by about an inch and a half. The legs sort of bunch up above my shoes and mostly the excess goes away once I put on a rig. The torso, on the other hand, has a habit of riding up while I'm under canopy and making the zipper brush against my chin.</li>
<li>The seams are bulky and don't really lay flat, instead developing an uneven waviness. (I think that's part of the design and not anything particular to my suit.) I'm calling this a negative because there are bulky, not-really-laying-flat vertical seams cuddled up right next to my pillow cutaway/reserve handles.</li>
<li>The elastic around the ankles is small enough that it's legitimately a struggle to fit my feet through the leg holes. Maybe I have an unusual foot-to-ankle ratio?</li>
<li>The collar is loose enough to breathe more than desired in freefall, though thankfully not so loose that it flaps around enough to irritate my skin.</li>
<li>The magnets on the zipper are mounted in thin fabric and they readily snap to each other when the suit is not zipped.</li>
<li>It'll probably be too warm in the summer. I needed gloves in the air today, and despite not wearing layers under the suit, I was almost sweating.</li>
</ul>

<p>Despite the length of list, on the balance, I'm not dissatisfied with the suit for the price I paid. However, given the level of service I received during production, I am not inclined to ask Freefall Suits for alterations on this suit, or for additional jumpsuits in the future.</p>

<p>Now all I need is a camera jacket and I can be done with this company.</p>

<h2 id="week31">Week 31</h2>

<h3 id="april282014">April 28, 2014</h3>

<p>Someone <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4628877' #4628877">resurrected the Dropzone.com thread</a>, calling out Freefall Suits' earlier "within the next 5 weeks we will be caught up" statement, saying:</p>

<blockquote>
  <p>Well, 5-1/2 more weeks have passed and still no suit. This takes my wait to just over 30 weeks so far. </p>
</blockquote>

<p>I <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4628964' #4628964">posted</a>, citing my earlier reaction to this claim, adding:</p>

<blockquote>
  <p>To their credit, Freefall Suits filled half my order – I did, in fact, receive a freefly suit. That said, my camera jacket (ordered that same day in September, now 31 weeks ago) is still outstanding. Freefall Suits seems to have stopped providing me ETAs; I've heard nothing about my camera jacket since an April 3 email which seemed to imply that production hadn't started. </p>
</blockquote>

<h3 id="april292014">April 29, 2014</h3>

<p>Four business hours after my forum post, I received:</p>

<blockquote>
  <p>Good morning Will,</p>
  
  <p>I am following up as we haven't received a reply in a week. </p>
  
  <p>Your camera jacket is finished and I will send a tracking number as soon as I get it from S&amp;R.</p>
  
  <p>I thank you for your patience as we worked through our issues.</p>
  
  <p>Chris</p>
</blockquote>

<p>I replied:</p>

<blockquote>
  <blockquote>
    <p>Good morning Will,</p>
    
    <p>I am following up as we haven't received a reply in a week. </p>
  </blockquote>
  
  <p>It took a week to receive the shipment. I wasn't able to jump the freefly suit until Friday.</p>
  
  <blockquote>
    <p>Your camera jacket is finished and I will send a tracking number as soon as I get it from S&amp;R.</p>
    
    <p>I thank you for your patience as we worked through our issues. </p>
  </blockquote>
  
  <p>Excellent, thank you.</p>
  
  <p>--Will</p>
</blockquote>

<h3 id="may22014">May 2, 2014</h3>

<p>Another customer <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4630322' #4630322">posted on Dropzone.com</a>, complaining about splipping delivery dates and poor communication, including his correspondence as well. <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4630347' #4630347">I replied</a>:</p>

<blockquote>
  <blockquote>
    <p>I am just going to start posting my correspondence with this company in this thread, since your blog seems to have gotten you results maybe this will help.</p>
  </blockquote>
  
  <p>Posting here seems to get attention too. </p>
  
  <p>I had no contact with Freefall Suits since an <a href="#april142014">April 14 email exchange</a>. I posted here two weeks later, and within hours Chris emailed me saying <a href="#april292014">my camera jacket is complete</a>, promising a tracking number. Now, it's been three days and I don't have a tracking number, but still – this was the <em>first ever</em> unprompted email I've received from Freefall Suits, and it happened right after post #37. </p>
  
  <p>Customers shouldn't have to resort to public shaming. </p>
</blockquote>

<p>I then received an email:</p>

<blockquote>
  <p>Good morning Will,</p>
  
  <p>Tracking number USPS 9114 9012 3080 3140 3771 79</p>
  
  <p>Thank you,</p>
  
  <p>Chris</p>
</blockquote>

<p>I replied:</p>

<blockquote>
  <p>Thank you. I look forward to its arrival.</p>
  
  <p>--Will</p>
</blockquote>

<p>I also <a href='http://www.dropzone.com/cgi-bin/forum/gforum.cgi?post=4630428' #4630428">posted to Dropzone.com</a>:</p>

<blockquote>
  <blockquote>
    <p>Now, it's been three days and I don't have a tracking number, but still – this was the first ever unprompted email I've received from Freefall Suits, and it happened right after post #37.</p>
  </blockquote>
  
  <p>…and now, a few hours after posting this, I received a tracking number. </p>
  
  <blockquote>
    <p>Customers shouldn't have to resort to public shaming.</p>
  </blockquote>
  
  <p>Seems like it works. </p>
</blockquote>

<p>I received another email:</p>

<blockquote>
  <p>I'm genuinely sorry it took as long as it did. Never in my life has I faced so many hurdles to getting things done. After tons of hard work from everyone, double shifts for months on end we are finally catching up on the cue. A few other suits are late but we are rapidly catching up on clearing out the entire cue. </p>
  
  <p>Thank you for your patience as we sorted out the growing pains.</p>
</blockquote>

<p>I replied:</p>

<blockquote>
  <p>On May 2, 2014, at 1:31 PM, Chris Kotscha wrote:</p>
  
  <blockquote>
    <p>I'm genuinely sorry it took as long as it did. Never in my life has I faced so many hurdles to getting things done. After tons of hard work from everyone, double shifts for months on end we are finally catching up on the cue. A few other suits are late but we are rapidly catching up on clearing out the entire cue. </p>
    
    <p>Thank you for your patience as we sorted out the growing pains.</p>
  </blockquote>
  
  <p>That's great. I hope you can deliver your product at your price with an acceptable level of service – you could actually force the jumpsuit industry to compete. Your success would benefit everyone.</p>
  
  <p>However: I have stopped caring. I want to be done.</p>
  
  <p>Every single opportunity Freefall Suits has had to impress me has resulted in disappointment.</p>
  
  <p>I placed an order; you could impress me by filling it promptly. Then there was a problem with materials and production was halted: all right, so impress me with how you handle that by keeping me in the loop with how things are unfolding. Then I wrote an email concerned by the lack of communication: you could impress me by telling me what's going on and instilling confidence in your ability to handle things going forward. Then I wrote another email annoyed that no one replied: you could impress me by taking control of the customer service situation. On and on and on, weeks and weeks and weeks.</p>
  
  <p>You did impress me at one point after making the sale:</p>
  
  <blockquote>
    <p>I am heading back to the office this week and will ensure your suit gets built asap, even if I sit down and sew it myself.</p>
  </blockquote>
  
  <p>…and then disappointed me further as my order continued to sit unfilled.</p>
  
  <p>At one point, I told you what I need as directly as possible:</p>
  
  <blockquote>
    <p>Look: <strong>I need to know if you’re going to make that jumpsuit and camera jacket</strong>. I placed the order on September 21, 2013 — that's 20 weeks ago tomorrow. Safety Day is 4 weeks away, the start of my skydiving season is 7 weeks away, and the local iFLY tunnel should have its grand opening around then as well. If you’re not going to fill my order, I need to get someone else working on it now.</p>
  </blockquote>
  
  <p>You replied:</p>
  
  <blockquote>
    <p>Your suit will be ready later next week.</p>
  </blockquote>
  
  <p>That was <strong>12 weeks ago today</strong>.</p>
  
  <p>The reasons don't matter, the apologies don't help, and my understanding doesn't change anything. Ultimately, "disappointed" doesn't begin to capture my experience. </p>
  
  <p>I went public when the frustration of dealing with your company was too much to bear. It took a lot to get me to that place. I've been disappointed by plenty of companies, even in skydiving: just three weeks ago, a canopy I ordered over the winter missed its delivery date, at which point we all found out that the factory hadn't even started production. They offered me a reason to wait a second time and gave me the information I needed to make a decision. I ended up ordering a competing product instead, but I'm not even upset. I'll happily talk to them again next time I need a canopy.</p>
  
  <p>Freefall Suits, on the other hand, has taken "ordeal" to a whole new level. I believe I've accurately chronicled my entire customer experience, I believe it speaks for itself, and I believe people ought to know that this happened September 2013 through May 2014.</p>
  
  <p>I want to receive that camera jacket. I want it to fit, I want it to be in the correct colors, and I want it to have the correct options. That's it. I want to be done.</p>
  
  <p>--Will</p>
</blockquote>

<h2 id="week32">Week 32</h2>

<h3 id="may32014">May 3, 2014</h3>

<p>USPS inexplicably reports that the package is "available for pickup". I hope they bother trying to deliver it at some point because a) it's their job and b) my local post office is a frustrating place to visit.</p>

<p>It's fitting that Freefall Suits would ship with USPS.</p>

<p><img src='http://www.willglynn.com/content/images/2014/May/usps_available_for_pickup.png'  alt="USPS package available for pickup" /></p>

<h3 id="may52014">May 5, 2014</h3>

<p>I filled out the USPS problem form around 11 AM:</p>

<blockquote>
  <p>Topic: Receiving Mail > No Delivery/No Attempt > I Did Not Receive a Specific Item</p>
  
  <p>Tracking number: 9114901230803140377179</p>
  
  <p>Message: This package arrived at the 60640 post office and is presently "Available for Pickup", but no delivery has been attempted. I would like USPS to deliver this package.</p>
</blockquote>

<p>I selected that I want a response by email instead of a response by phone:</p>

<p><img src='http://www.willglynn.com/content/images/2014/May/usps_contact_method.png'  alt="USPS contact method" /></p>

<p>However, my local post office has disregarded this selection in every previous instance, choosing to call me or to ignore the issue instead.</p>

<p>My case number is HQ117780154.</p>

<p>I received an aggravating phone call just before 6 PM from a woman at the Uptown post office. She did not bother reading any of my report and instead asked me to provide all my information again. She indicated she would "look for the package in the place where we keep packages" (essentially what I asked them to do in the first place) and call me back tomorrow.</p>

<p>Around 8 PM, the tracking updated to show delivery earlier this afternoon. I'm not in Chicago, but my wife is, and she retrieved the box from my building's lobby. This package has the correct ZIP code.</p>]]></description><link>http://www.willglynn.com/2014/03/19/free-fall-suits-malice-or-incompetence/</link><guid isPermaLink="false">0c1f5d4d-3b76-48c4-a8a9-bd185022093b</guid><category><![CDATA[skydiving]]></category><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Wed, 19 Mar 2014 23:54:14 GMT</pubDate></item><item><title><![CDATA[avr-gcc on Travis-CI]]></title><description><![CDATA[<p>I wanted to build an Atmel AVR project on Travis-CI. This wasn't hard at all: Ubuntu ships a usable <code>gcc-avr</code> package.</p>

<p>I uploaded a <a href='https://github.com/willglynn/travis-avr-gcc' >sample project</a> as a demonstration. Here's the <code>.travis.yml</code>:</p>

<pre><code>---
language: c
before_install:
  - sudo apt-get update -qq
install:
  - sudo apt-get install -qq gcc-avr binutils-avr avr-libc
script: make
</code></pre>

<p>Open firmware is one of the reasons I bought my <a href='http://flysight.ca/' >FlySight audible GPS</a>. Open firmware means I can hack on it, sure, but it also lets me use world-class tools like GitHub and Travis-CI.</p>]]></description><link>http://www.willglynn.com/2014/02/20/avr-gcc-on-travis-ci/</link><guid isPermaLink="false">d8c82c3c-ec38-41bf-a0a7-a2c0228f63e7</guid><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Thu, 20 Feb 2014 21:16:19 GMT</pubDate></item><item><title><![CDATA[Exporting from the Wayback Machine]]></title><description><![CDATA[<p>One of my little projects has been trying to resurrect a corner of web history. It seems like a normal enough story: there used to be a website, it went away, the guy who made it has no backups.</p>

<p>Of course, the <a href='https://archive.org/web/' >Wayback Machine</a> has copies of nearly everything, and this site is no exception. The content isn't gone to the sands of time – but it's also nowhere near accessible, since the individual crawls presented by the Wayback Machine are various fragments.</p>

<p>I want to get the data out of the Wayback Machine, process it into a cohesive form, and give it back to the creator so he can make it available on the web once again.</p>

<p>Getting the data out poses two problems. First, I want to know exactly what data the Wayback Machine contains. Second, I want to retrieve the items of interest.</p>

<h2 id="querying">Querying  </h2>

<p>The Wayback Machine is basically a big distributed filesystem that contains <a href='http://blog.archive.org/2013/01/09/updated-wayback/' >5+ petabytes</a> of archived content. The data is stored in <a href='http://www.digitalpreservation.gov/formats/fdd/fdd000236.shtml' >WARC files</a>, each weighing about a gigabyte.</p>

<p>WARCs (and ARCs before them) are just blobs containing record after record after record with no features to support random access. That's a problem, so the Wayback Machine generates secondary indexes called <a href='http://archive.org/web/researcher/cdx_file_format.php' >CDX files</a>. These allow a reader to jump straight to a particular record without having to read (and decompress!) an entire gigabyte of crawl results.</p>

<p>The Internet Archive offers a <a href='https://github.com/internetarchive/wayback/blob/master/wayback-cdx-server/README.md' >CDX Server API</a>. This allows you to phrase a query and get back a list of records that match. For example, here's the <a href='http://web.archive.org/cdx/search/cdx?url=http://www.google.com/' *&amp;limit=100">first record for <code>google.com</code></a>:</p>

<pre><code>com,google)/ 19981111184551 http://google.com:80/ text/html 200 HOQ2TGPYAEQJPNUA6M4SMZ3NGQRBXDZ3 381
</code></pre>

<p>This tells us more than enough: the URL, timestamp, HTTP status code, path, content type, hash, and length.</p>

<p>In short, the CDX server allows me to get a list of archived resources with enough detail for me to decide if it's an object I need.</p>

<h2 id="retrieval">Retrieval  </h2>

<p>This is where it gets harder. See, the Wayback Machine is designed for use by humans, but I want to hook it into a machine.</p>

<p>Check out the Wayback Machine for <a href='http://web.archive.org/web/19981111184551/http://www.google.com/' >google.com, 1998-11-11</a>:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Jan/wayback_google_screenshot.png'  alt="" /></p>

<p>See the bar up top? View source: <br />
<img src='http://www.willglynn.com/content/images/2014/Jan/Screen_Shot_2014_01_25_at_11_56_47_PM.png'  alt="" /></p>

<p>Ewww. The Wayback Machine added 250 lines of not-quite-HTML. This makes it easy for humans to navigate, but it complicates machine parsing.</p>

<p>I dug around the <a href='https://github.com/internetarchive/wayback' >Wayback machine source code</a> and discovered a solution. The <code>/web/YYYYMMDDHHMMSS/&lt;url&gt;</code> syntax accepts flags after the timestamp. This is used to trigger certain filters from various contexts: <code>&lt;link rel="stylesheet"&gt;</code> links are rewritten to trigger CSS-specific processing, <code>&lt;img&gt;</code> links are rewritten to trigger image-specific processing, <code>&lt;script&gt;</code> does Javascript, etc.</p>

<p>I discovered that this mechanism supports an <code>id</code> flag. This flag ultimately causes the resource to be handled by <a href='https://github.com/internetarchive/wayback/blob/master/wayback-core/src/main/java/org/archive/wayback/replay/TransparentReplayRenderer.java' ><code>TransparentReplayRenderer</code></a>, which attempts to hand back the content in an unmodified form. </p>

<p>View source on <a href='http://web.archive.org/web/19981111184551id_/http://www.google.com/' ><code>/web/19981111184551id_/http://www.google.com/</code></a>:</p>

<p><img src='http://www.willglynn.com/content/images/2014/Jan/wayback_google_clean_source.png'  alt="" /></p>

<p>Bingo!</p>

<p>I'd prefer a way to get the corresponding WARC record for maximum fidelity, but that's not available right now. The headers aren't quite preserved – some new ones get added and I <em>think</em> some of the originals get clobbered in various situations, but it's better than the alternatives. At least the HTTP response body isn't completely rewritten.</p>

<p>(There's another way to trigger this behavior too, but I'm not sure it's intentional and it might have security implications.)</p>

<p>Now, the question is: does archive.org intend for me to connect these two services? I'm guessing no – the <a href='https://archive.org/about/terms.php' >terms of service</a> grant access "for scholarship and research purposes only", and their <code>robots.txt</code> forbids machine access. Still, the existence of the CDX server indicates they support certain types of machine interaction, so I wrote them an email to ask. I'll keep you posted.</p>]]></description><link>http://www.willglynn.com/2014/01/26/exporting-from-the-wayback-machine/</link><guid isPermaLink="false">713eb2ee-fc17-4162-b118-eb3183f12fb6</guid><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Sun, 26 Jan 2014 06:18:32 GMT</pubDate></item><item><title><![CDATA[Health checks in nginx]]></title><description><![CDATA[<p><code>nginx</code> is an awesome web server. If you haven't heard of it, that's okay; it has <a href='http://w3techs.com/blog/entry/nginx_just_became_the_most_used_web_server_among_the_top_1000_websites' >a lot of other users</a>.</p>

<h3 id="theproblem">The problem</h3>

<p>I have a project that involves a bunch of <code>nginx</code> servers in a bunch of different locations. If one of them stops working, I'd like to stop using it until it gets better. I'll be using <a href='http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html' >Amazon Route 53 health checks</a> to provide this behavior, but plenty of other things work the same way.</p>

<p>All I need to do is to make each server indicate if it's healthy or not. But, hmm… what does "healthy" mean in this context?</p>

<p>This project uses <code>nginx</code> as caching proxies. Most of the content is immediately available most of the time, but <em>some</em> of the time, <code>nginx</code> has to consult other systems over the network. So, even if the <em>local system</em> is working fine, it might not actually be capable of serving clients, in which case I want the health check to fail.</p>

<p>The status check is an HTTP <code>GET</code> request. The upstream system will interpret any <code>200 OK</code> response as success, any any other response as a failure. That sounds like the logic I want.</p>

<p>Except… no, I need to check <em>several</em> paths. Crap.</p>

<p>Well, let's see. <code>nginx</code> is built around an asynchronous event processing loop, which internally supports the notion of sub-requests. All the health check needs to do is to make some sub-requests, wait for them to complete, and return <code>200 OK</code> if and only if they all returned <code>200 OK</code>. That totally fits the <code>nginx</code> request processing model, so this shouldn't be hard, right?</p>

<h3 id="thesolution">The solution</h3>

<p>Well, turns out it wasn't hard. <code>nginx</code> supports running arbitrary logic in-process via the <a href='http://wiki.nginx.org/HttpLuaModule' ><code>ngx_lua</code> module</a>, and this module exposes enough of the internals to do exactly what I want.</p>

<p>Specifically, I can use <code>ngx.location.capture_multi()</code> to run multiple simultaneous sub-requests, <code>ngx.status = 500</code> to signal failure, and <code>ngx.print()</code> to return a request body just for good measure. It's been a long time since I wrote Lua, but:</p>

<pre><code>location /health_check {
  default_type 'text/plain';
  content_by_lua '
    local reqs = {
      { "/" },
      { "/path1" },
      { "/path2" }
    }
    local resps = { ngx.location.capture_multi(reqs) }
    local ok = true

    for i, resp in ipairs(resps) do
      local req = reqs[i]
      table.insert(body, "- GET ")
      table.insert(body, req[1])
      table.insert(body, " returned ")
      table.insert(body, resp.status)
      table.insert(body, "\\n")

      if resp.status ~= 200 then
        ok = false
      end
    end

    table.insert(body, "\\n")

    if ok then
      table.insert(body, "ok\\n")
    else
      table.insert(body, "failed\\n")
      ngx.status = 500
    end

    ngx.print(table.concat(body))
  ';
}
</code></pre>

<p>This satisfies my goal of testing multiple paths (in parallel!) and returning <code>200 OK</code> if and only if each of them are working.</p>

<p>Health check: accomplished.</p>

<p>As a bonus, <code>/health_check</code> returns a useful plain-text result should I care to inspect it from a browser:</p>

<pre><code>- GET / returned 200
- GET /path1 returned 200
- GET /path2 returned 500

failed
</code></pre>

<h4 id="implementationnotes">Implementation notes</h4>

<p>Note that I'm buffering the response in <code>body</code> rather than immediately calling <code>ngx.print()</code>. This is necessary because <code>ngx.print()</code> tells <code>nginx</code> to write the passed string as part of the response body, which implicitly tells it to send the response headers, including the status code. Therefore, I can't call <code>ngx.print()</code> before I've determined the status code I want to send.</p>

<p>Additionally, for those try-it-at-home types, be aware that <code>ngx_lua</code> is not an official part of the <code>nginx</code> source tree. It is, however, available in the <code>nginx-extras</code> package on Debian-related distributions, and is therefore also part of <a href='https://wiki.ubuntu.com/LTS' >Ubuntu LTS</a>, which is good enough for me.</p>]]></description><link>http://www.willglynn.com/2013/12/03/health-checks-in-nginx/</link><guid isPermaLink="false">0c843d21-8f09-41aa-aa27-9bf8d1952ed0</guid><category><![CDATA[nginx]]></category><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Tue, 03 Dec 2013 18:05:47 GMT</pubDate></item><item><title><![CDATA[2013 skydiving season]]></title><description><![CDATA[<p>My 2013 skydiving season is now complete. I made my last jump an hour ago, a 5-way RW jump, landing on a <a href='http://www.willglynn.com/katana-150/' >borrowed Katana 150</a>. It was my 840th jump total, and my 500th jump of the year.</p>

<iframe src='http://player.vimeo.com/video/79050196'  width="960" height="720" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

<p>I had a great year skydiving. It's sad that it's over, but I made the most of it. Special thanks to <a href='http://www.skydivecsc.com/' >Chicagoland Skydiving Center</a> for being awesome.</p>]]></description><link>http://www.willglynn.com/2013/11/10/2013-skydiving-season/</link><guid isPermaLink="false">731fb5b3-d1cb-48b3-804d-c6d1397d7093</guid><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Sun, 10 Nov 2013 20:59:10 GMT</pubDate></item><item><title><![CDATA[Katana 150]]></title><description><![CDATA[<p>It's the last weekend of the season and I'm still experimenting with different canopies. This time, it's a Katana 150 I'm borrowing from a friend.</p>

<h3 id="airspeed">Airspeed</h3>

<p>Returning to a Katana after the demo Crossfire 2, I find that I <em>adore</em> the increased airspeed. I can fly faster on this Katana 150 than I could on the Crossfire 2 149, due in large part to the lightness of the front risers.</p>

<p>That extra airpseed was extremely useful today. The winds up top were exceptionally strong: 27 knots ground speed on jump run, so something like 70 mph at 13000' and forecast to be something like 30 mph at 3000'. I was first out on first load, and I chose an exit point a little over a mile away. Freefall drift was such that I opened up slightly short but quite a ways crosswind, and the canopy winds were moving me backwards at full flight. I got on my fronts and managed to crab back to the airport with enough altitude to fly a landing pattern, but on the Crossfire 2 (or my Sabre 2), I would have been forced down in the corn.</p>

<p>Well, that's not true. If I had a slower canopy, I would have stayed on the ground. Knowing I had a Katana, I chose to jump on load one, trusting that the canopy had the ability to make progress even if I had to fly into the wind. Sure enough, I needed to do exactly that, and the Katana delivered.</p>

<h3 id="flight">Flight</h3>

<p>I put four jumps on this canopy today.</p>

<p>It opens way better than the Katana 170 I demoed a month ago. The openings were my primary complaint with that Katana, but this one feels very different. Like the 170, this Katana 150 still searches when it snivels, but it inflates much more symmetrically.</p>

<p><img src='http://www.willglynn.com/content/images/2013/Nov/beautiful_opening.gif'  alt="Beautiful Katana opening" /></p>

<p>It handles much like the Katana 170, though a bit snappier, which is expected due to the smaller size. Rears feel the same, fronts feel the same (and I love it!), though brakes feel a little different.</p>

<h3 id="brakes">Brakes</h3>

<p>I noticed that the brake lines look a little different too:</p>

<p><img src='http://www.willglynn.com/content/images/2013/Nov/katana_150.jpg'  alt="Canopy with odd brake line attachment" /></p>

<p><img src='http://www.willglynn.com/content/images/2013/Nov/brake_line_detail.jpg'  alt="Brake line detail" /></p>

<p>The Katana 170 didn't look like that, so this caught my attention. According to <a href='http://www.performancedesigns.com/docs/linetrims/KA-083-0170LineTrimChart.pdf' >the Katana line trim chart</a>, the upper steering lines should be arranged from longest to shortest, with the shortest lines towards the outside. I examined the canopy after the next jump, finding:</p>

<p><img src='http://www.willglynn.com/content/images/2013/Nov/brake_lines_as_attached.jpg'  alt="Brake lines as attached" /></p>

<p>A-ha, proof! The innermost upper steering lines were switched with their neighbors when this canopy was re-lined. The trim chart indicates that this arrangement is not correct for any size Katana, so I'm really not sure what the rigger was doing.</p>

<p>Besides looking strange, I suspect this might be why the toggles don't respond quite the way I remember, and why the stall point isn't where I expected to find it.</p>

<p>My friendly local rigger (who did not perform the re-line) intends to take a look tomorrow. It should be a quick fix thanks to the bar tack machine, though Katanas use HMA lines, and HMA doesn't really like having stitches pulled out.</p>

<h3 id="togglefire">Toggle fire</h3>

<p>So, again, I've made four jumps on this Katana 150 so far and three of the openings were far better than the Katana 170. The odd one out was a toggle fire. The parachute opened normally, but quickly started turning and diving just like I was pulling on one of the toggles – or, say, because one of the toggles came loose while the other was still stowed.</p>

<p><img src='http://www.willglynn.com/content/images/2013/Nov/katana_toggle_fire.gif'  alt="Katana toggle fire" /></p>

<p>You can fix this by a) grabbing the loose toggle and pulling it or b) by un-stowing the still-stowed toggle. And sure enough, in my case, I easily arrested the spin once I got the toggles in my hands.</p>

<p>A toggle fire isn't terribly surprising. It's not normal for me, but these aren't my normal risers and these toggles don't stow the same way, so I must have done it wrong.</p>

<p>At least, that's what I thought.</p>

<p>See, the canopy felt fully inflated, then it started turning rather aggressively, exactly as if I was holding the right toggle to about hip level. That perfectly fits the profile of a toggle fire, so I went for the toggles. I focused on securing the left toggle, because that's the one that must have popped loose, but I ended up grabbing and releasing both at the same time.</p>

<p><img src='http://www.willglynn.com/content/images/2013/Nov/katana_not_toggle_fire.jpg'  alt="Katana spinning with toggle properly stowed" /></p>

<p>Except… the left toggle isn't loose. It's firmly seated. You can see the steering line tucked onto the back of the riser, indicating it's still properly set. I can't say for sure what actually happened; it felt exactly like a toggle turn, and not a front riser, rear riser, or harness turn. Still, I can say for sure what <em>didn't</em> happen, and according to the video, the left toggle did not release before I pulled it.</p>

<p>This was not a toggle fire.</p>

<p>My best guess is that this was a tension knot involving the right brake line. The video neither supports nor refutes this hypothesis. Still, I was chasing a CRW group, so this was a slow (subterminal) deployment – prime territory for tension knots – and releasing both brakes as I did could conceivably clear a tension knot on the right side. It fits the evidence, but I just don't know.</p>

<h3 id="conclusion">Conclusion</h3>

<p>I'm still on the fence about what to put in my new container come spring, but I am glad to be jumping this canopy. Also, it's for sale, and it does match my colors…</p>]]></description><link>http://www.willglynn.com/2013/11/09/katana-150/</link><guid isPermaLink="false">ba58cd97-17c4-426a-a220-2aa193870d17</guid><category><![CDATA[skydiving]]></category><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Sun, 10 Nov 2013 05:02:09 GMT</pubDate></item><item><title><![CDATA[SSD performance woes]]></title><description><![CDATA[<p>I noticed that copying a 7 GB file from my <a href='http://www.willglynn.com/drobo-5d/' >Drobo 5D</a> to my internal SSD took <em>forever</em> to complete – as in, over a minute. (Life is hard!) My Drobo can read significantly faster than that, and my SSD can write faster than that, so what's the deal?</p>

<p>I pop open Activity Monitor, turn to the Disk Activity tab,  and open Terminal:</p>

<pre><code>$ cd /Volumes/Drobo
$ dd if=input_file of=/dev/null bs=$(( 1024 * 1024 ))
</code></pre>

<p>Yep, easily 250 MB/s off the Drobo.</p>

<pre><code>$ cd
$ dd if=/dev/zero of=zero bs=$(( 1024 * 1024 )) count=8
</code></pre>

<p>Yep, easily 200 MB/s to the SSD… wait, why did it drop to zero after the first GB? What are all these spikes?!</p>

<p><em>*poke about system diagnostics*</em></p>

<p>Ah, <code>TRIM</code> is disabled. Probably a while ago, too. (I guess Apple still doesn't trust third-party SSDs to implement it properly?) Whatever. I now have two problems: I need to OSX to send ATA <code>TRIM</code> commands going forwards, and I need to <code>TRIM</code> all the current empty space in order to restore my SSD's write performance.</p>

<p>I open up <a href='http://www.groths.org/software/trimenabler/' >Trim Enabler</a> and slide the switch. Done. I go to the Settings tab, check "Warn if trim patch is disabled", so maybe I'll notice if this breaks again. Reboot, and System Information now says <code>TRIM</code> is enabled.</p>

<p>Now, how do I re-<code>TRIM</code> all the current free space? I could write a file of zeroes and delete it, but that's… dumb.</p>

<p><em>*poke about the web*</em></p>

<p>Ah, great! <code>fsck</code> can do this. Though… since I need to use my now-modified kernel extensions, I'll have to <code>fsck</code> my Macintosh HD volume while running from it. This can be done from <a href='http://support.apple.com/kb/ht1492' >single user mode</a>, but asking a running system to modify itself in this manner is mildly unnerving. I'd feel better if I were booted from the recovery partition, but that would not include the modifications necessary to enable <code>TRIM</code> on non-Apple SSDs.</p>

<p>Before going further, I asked Disk Utility to "Verify Drive" from the desktop to make sure everything was fine.</p>

<p>Guess what? Everything wasn't fine. Apparently somewhere along the line my volume bitmap got screwed up; space was marked as used even though the filesystem no longer referenced it. That doesn't affect any of my data, but it <em>does</em> indicate that the volume somehow got in an inconsistent state, which means it's possible there are other undetected problems. Now the situation demands even more caution.</p>

<p><em>Time Machine! Back up everything!</em></p>

<p>Time Machine dutifully backed up everything, both to my NAS as usual and to an external hard drive that I infrequently attach.</p>

<p>I powered down, then powered up again while holding ⌘S. Once booted:</p>

<pre><code># fsck
...
** Checking Journaled HFS Plus volume.
** Checking extents overflow file.
** Checking catalog file.
** Checking multi-linked files.
** Checking catalog hierarchy.
** Checking extended attributes file.
** Checking multi-linked directories.
** Checking volume bitmap.
   Volume bitmap needs minor repair for orphaned blocks
** Checking volume information.
   Invalid volume free block count
   (It should be 82404658 instead of 81741301)
** Repairing volume.
** Rechecking volume.
** Checking Journaled HFS Plus volume.
** Checking extents overflow file.
** Checking catalog file.
** Checking multi-linked files.
** Checking catalog hierarchy.
** Checking extended attributes file.
** Checking multi-linked directories.
** Checking volume bitmap.
** Checking volume information.
** Trimming unused blocks.
** The volume Macintosh HD appears to be OK.
</code></pre>

<p>Hooray! It says the volume is fixed, and it issued <code>TRIM</code> commands for all the unused space. We should be in business.</p>

<pre><code># reboot
</code></pre>

<p>Now I see a globe instead of the Apple logo. Are you… are you trying to netboot? What? Why?</p>

<p>Did I do a bad?</p>

<p>Power down. Power up. Apple logo, flicker, Apple logo, login screen. (Whew.)</p>

<p>And finally: I tried copying that 7 GB file again. It completed in about 30 seconds, averaging 220 MB/s.</p>]]></description><link>http://www.willglynn.com/2013/11/08/ssd-performance-woes/</link><guid isPermaLink="false">41511aa8-3854-4f67-983f-35c4b7d1d17a</guid><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Sat, 09 Nov 2013 05:20:28 GMT</pubDate></item><item><title><![CDATA[MongoDB is half-baked]]></title><description><![CDATA[<p>I needed to copy data from one MongoDB database to another. MongoDB supplies the <code>mongodump</code> and <code>mongorestore</code> tools to do exactly that. I haven't had to use them lately, so the first thing I do is to check the command line options:</p>

<pre><code>$ mongodump --help
Export MongoDB data to BSON files.

options:
...
 -o [ --out ] arg (=dump) output directory or "-" for stdout
</code></pre>

<p>Great, <code>-o -</code> is how I write to standard output. I want to dump from here and restore to there, so <code>mongodump here | mongorestore there</code> is the natural solution.</p>

<p>How do I restore from standard input?</p>

<pre><code>$ mongorestore --help
usage: mongorestore [options] [directory or filename to restore from]
...
</code></pre>

<p>Hmm, well <code>mongodump</code> understood <code>-</code>, surely <code>mongorestore</code> will too:</p>

<pre><code>$ mongorestore -
connected to: 127.0.0.1
don't know what to do with file [-]
</code></pre>

<p>Okay, so <code>mongorestore</code> thinks <code>-</code> is a literal filename. The example input path is in brackets indicating that it's optional; maybe it uses standard input by default if I leave it blank?</p>

<pre><code>$ mongorestore 
connected to: 127.0.0.1
don't know what to do with file [dump]
</code></pre>

<p>All right, I give up. Google, how do I make <code>mongorestore</code> read from standard input?</p>

<p>Answer:</p>

<ul>
<li><a href='https://jira.mongodb.org/browse/SERVER-4345' >SERVER-4345: mongorestore has no way to accept input from stdin</a></li>
<li><a href='https://jira.mongodb.org/browse/SERVER-3111' >SERVER-3111: Allow mongorestore to read from stdin</a></li>
</ul>

<p>That's right! <code>mongodump</code> can write to standard output, but <code>mongorestore</code> cannot read from standard input. Reported two years ago, still unfixed.</p>

<p>You can of course dump to a file and then read from a file, and that's what I ended up doing. But… if that's the only permitted mode of operation, why support writing to standard output at all? It's just a useless and frustrating half-feature.</p>

<p>I poked around the MongoDB bug tracker to get <a href='https://jira.mongodb.org/issues/?jql=project%20%3D%20SERVER%20AND%20fixVersion%20%3D%20%22planned%20but%20not%20scheduled%22%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC%2C%20created%20ASC' >a list of other "planned but not scheduled"</a> tickets. As of this writing, an efficient representation of keys (<a href='https://jira.mongodb.org/browse/SERVER-863' >#863</a>), a read-only mode (<a href='https://jira.mongodb.org/browse/SERVER-593' >#563</a>), triggers (<a href='https://jira.mongodb.org/browse/SERVER-124' >#124</a>), and re-adding master-master replication (<a href='https://jira.mongodb.org/browse/SERVER-2956' >#2956</a>) – each of them a feature I wanted – remain in that category.</p>

<p>For the record, <a href='http://db.cs.berkeley.edu/oldpost/postgres95-0.02/' >Postgres95 beta 0.02</a> (released May 1995) supported <code>pg_dump | psql</code>.</p>]]></description><link>http://www.willglynn.com/2013/11/04/mongodb-is-half-baked/</link><guid isPermaLink="false">0f2dc67c-9747-41c8-a558-85e6dda38e04</guid><category><![CDATA[bugs]]></category><category><![CDATA[mongodb]]></category><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Mon, 04 Nov 2013 14:06:50 GMT</pubDate></item><item><title><![CDATA[Comcast/Netgear routers eat SRV records]]></title><description><![CDATA[<p>I've been troubleshooting an issue with two Comcast users in the Memphis area. One is a recent Comcast subscriber, and the other has been using Comcast for months, noticed this issue, and invented a kludgey workaround on his own that involves several VPNs.</p>

<p>After lots of head-scratching, I was able to determine that the users' local DNS is in fact broken and does not return SRV records.</p>

<p>For example, take this query against Google's public DNS:</p>

<pre><code>; &lt;&lt;&gt;&gt; DiG 9.8.5-P1 &lt;&lt;&gt;&gt; srv _xmpp-client._tcp.google.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 10142
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;_xmpp-client._tcp.google.com.    IN  SRV

;; ANSWER SECTION:
_xmpp-client._tcp.google.com. 900 IN    SRV 20 0 5222 alt2.xmpp.l.google.com.
_xmpp-client._tcp.google.com. 900 IN    SRV 20 0 5222 alt3.xmpp.l.google.com.
_xmpp-client._tcp.google.com. 900 IN    SRV 20 0 5222 alt1.xmpp.l.google.com.
_xmpp-client._tcp.google.com. 900 IN    SRV 20 0 5222 alt4.xmpp.l.google.com.
_xmpp-client._tcp.google.com. 900 IN    SRV 5 0 5222 xmpp.l.google.com.

;; Query time: 36 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Nov 01 09:42:32 CDT 2013
;; MSG SIZE  rcvd: 251
</code></pre>

<p>Running against Level3 DNS (4.2.2.2) and OpenDNS (208.67.222.222) return the same results. There are SRV records to be found.</p>

<p>Here's the same query run by an affected user with their default settings as installed by Comcast:</p>

<pre><code>; &lt;&lt;&gt;&gt; DiG 9.8.5-P1 &lt;&lt;&gt;&gt; srv _xmpp-client._tcp.google.com
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 31875
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;_xmpp-client._tcp.google.com.    IN  SRV

;; Query time: 5 msec
;; SERVER: 172.16.12.1#53(172.16.12.53)
;; WHEN: Fri Nov 01 07:22:43 CDT 2013
;; MSG SIZE  rcvd: 46
</code></pre>

<p>The SRV records missing, but it doesn't stop there. Nonexistent names should come back as <code>NXDOMAIN</code>, not <code>NOERROR</code>. What's worse, the user's local DNS server has the balls to set the AA "Authoritative Answer" bit, something that only the actual google.com DNS servers can claim. And of course, to top off the wrongness, the device claiming to be authoritative leaves the authority section blank.</p>

<p>The hardware at fault is a Comcast-provided router, a <a href='http://support.netgear.com/product/WNR1000v2' >Netgear WNR1000v2-VC</a>. I don't know who wrote their DNS software, but it's totally and completely wrong. (Why can't they use <a href='http://www.thekelleys.org.uk/dnsmasq/doc.html' ><code>dnsmasq</code></a> or <a href='http://cr.yp.to/djbdns/dnscache.html' ><code>dnscache</code></a>?) A vaguely-related Netgear device got a firmware update some <a href='http://www.dslreports.com/forum/r24369544-WNDR3700-Firmware-Version-1.0.4.68-Released-' >three years ago</a> that corrected a similar issue, yet the issue persists here.</p>

<p>My selected workaround is for the affected users to <strong>stop using their broken devices</strong> for DNS. <a href='https://developers.google.com/speed/public-dns/' >Google public DNS</a> and <a href='http://www.opendns.com/' >OpenDNS</a> are both viable options, and both handle queries properly.</p>]]></description><link>http://www.willglynn.com/2013/11/01/comcast-netgear-routers-eat-srv-records/</link><guid isPermaLink="false">968760a1-e1be-4576-a41d-2252418f1f9a</guid><category><![CDATA[bugs]]></category><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Fri, 01 Nov 2013 15:07:44 GMT</pubDate></item><item><title><![CDATA[Serial ports are hard]]></title><description><![CDATA[<p>There might be sonething wrong with me: I keep finding situations where I need to use serial ports. They're not always RS-232 ports, either. Sometimes they're TTL serial to microcontrollers or other wacky stuff. Sometimes <a href='https://github.com/flysight/flysight/pull/11' >I modify firmware to add a USB serial port</a>.</p>

<p>Serial communication boils down to bits – ones and zeroes – transmitting high and low voltages on one wire, receiving high and low voltages on a second wire. It's an extremely common way to interface with peripherals because it's extremely simple.</p>

<p>At least, it's simple until you get into the details.</p>

<h3 id="signallingdetails">Signalling details</h3>

<p>How long do you send each bit before sending the next bit? (This is usually specified in terms of a <a href='http://en.wikipedia.org/wiki/Baud' >baud rate</a> which is related to but not exactly equal to this value.)  How many ones and zeroes are sent per character? Are you transmitting extra bit(s) for error correction purposes, and if so, how are they calculated? How do you mark the start of a character? What about the end?</p>

<p>Familiar configuration strings like <code>9600,8,N,1</code> can answer few questions, but that's not the end of it. See… besides data, devices often need to communicate additional information.</p>

<p>You might want to reset the device somehow. Why not just hold the transmit line high (sending a constant stream of ones) for the length of several characters? This is the "break" sequence; it's not data (it's encoded in a way that cannot be confused as data), but it's transmitted on the data lines.</p>

<p>Another such need has to do with buffering, wherein devices can't accept more data until they've processed data they already have. A receiving device can:</p>

<ol>
<li>Hope no new data arrives. What if it does? Well… throw it away, I guess.  </li>
<li>Send a special "don't send me more data right now" character. This would be with the <code>XOFF</code> character… but now you have to worry about what to do if the <code>XOFF</code> bit sequence legitimately appears in the data stream.  </li>
<li>Use a separate electrical connection to indicate that whether or not it's ready. This would be the <code>CTS</code> line… but now instead of two wires, you have three.</li>
</ol>

<p>There's other signalling needs too. The host might want to know if there's a device plugged in (the <code>DSR</code> line), and the host might want to tell the device that it is plugged in (the <code>DTR</code> line). The host might want to tell the device that it wants to send data (the <code>RTS</code> line). The device might be acting as a bridge between the serial link and something else – say, a phone line or radio link – and might need to indicate that it has a connection to the other side (<code>CD</code>) or that something on the other side is trying to establish a connection (<code>RI</code>).</p>

<p>All this sucks, of course, because by now you've either ballooned from 2 wires to 9 wires (DB-9) to 25 wires (full RS-232) to handle everything <em>or</em> you've thrown up your hands in frustration and completely given up on trying to communicate most of this information.</p>

<h3 id="implementationdetails">Implementation details</h3>

<p>It's woefully inefficient to force general-purpose processors to sit there and transmit and receive individual bits, so instead, people make dedicated hardware called UARTs – universal asynchronous receiver/transmitters – to do this.</p>

<p>The key advantage of a UART is that you can send and receive whole characters at your convenience. If you want to send a character, give it to the UART. If you want to send more, check to see if it's done, then send more. When it receives a character, it'll say so, and you can process it as a unit.</p>

<p>Of course, character-at-a-time operation isn't hugely more efficient than bit-at-a-time, so the new hotness 20 years ago was the <a href='http://www.ti.com/product/pc16550d' >16550 UART</a> which had onboard buffers. You could send and receive up to 16 characters at a time! <em>Amazing!</em></p>

<p>Nowadays, 16550-like functionality is included in larger I/O chips alongside real-time clocks and other decidedly unsexy functions. But… remember how data isn't the only consideration? Yeah, well, UART buffers only deal with data.</p>

<p>If you want to send a break, well, poke at a register saying to send a break. If you want to signal things or receive signals on all those status lines, poke at another register, or check a register to see what lines are set. Catch is, since UARTs are asynchronous and include a buffer by design, it's very difficult to line up "I received this character" with "that status line changed"; you can be sure both <em>happened</em>, but rarely are you quite sure in which order.</p>

<p>Also, good luck changing baud rates or flow control settings at a specific point in a data stream. Those internal buffers? Not so great if you have a need for precision at the electrical level.</p>

<h3 id="unix">Unix</h3>

<p>Serial ports are character devices on UNIXy systems, which means they look just like a file for reading or writing. Simple!</p>

<p>Of course, if you want to <em>do</em> anything with it, you need to specify the serial port configuration. That sounds like an I/O control, right? So, like, <code>ioctl()</code>?</p>

<p>Well… kinda. Serial ports and UNIX go <em>way</em> back – back to a time when people primarily used computers through teletype machines – so a lot of serial functionality is mixed in with terminal functionality. Terminals have a separate set of control functions (see <code>&lt;termios.h&gt;</code>) that are may or may not be implemented with <code>ioctl()</code> under the hood. Still, even with these functions specifically aimed at serial control, setting <code>9600,8,N,1</code> is <a href='http://en.wikibooks.org/wiki/Serial_Programming/termios' #Basic_Configuration_of_a_Serial_Interface">far from trivial</a>.</p>

<p>Sending and receiving data works like any other character device. Well, mostly. The operating system may or many not buffer things in ways you'd expect, and your data likely flows through a UART that may or may not buffer things in ways you'd expect, but it works.</p>

<p>What about all that other stuff? Like, how would you send a break? Call <code>tcsendbreak()</code>! What about receiving a break? Well, if the file handle in question is not your controlling terminal, you can ask to get breaks delivered as <code>\x00</code> or <code>\xff\x00\x00</code>, your preference! But, wait… how would you distinguish breaks from normal data you might read with those patterns? You can't. Have fun!</p>

<p>How would you wait for data? Easy, use any of the normal ways you'd wait for data on a file descriptor. How would you wait for a status line change? Surprise, you can't! Poll <code>ioctl(fd, TIOCMGET)</code> several times a second and watch for changes yourself. Let's not even worry about detecting parity errors, truncated characters, or things like that.</p>

<p>See? Simple.</p>

<h3 id="tcpip">TCP/IP</h3>

<p>It gets worse when people try to expose serial devices over a network, because most of the time, people just pump characters back and forth. Simple!</p>

<p>This might even work, but it's extremely naïve: all that other stuff is just glossed over, and anyone that needs a serial port to support anything besides transmitting and receiving characters will be very disappointed.</p>

<p>Enter <a href='http://tools.ietf.org/html/rfc2217' >RFC 2217</a>. This is a specification that extends Telnet to include serial port controls. (Some people use Telnet as a dumb pipe for characters, but in fact it includes <a href='http://tools.ietf.org/html/rfc854' #page-14">an extension mechanism</a>.) Hooray! Now our serial port is back to being a single byte channel, there's a clear escape mechanism to distinguish control signals from data, and all the 9-wire serial port functions are available.</p>

<p>(Okay, it's really only <em>almost</em> all of those functions. For example, the UNIX API allows you to transmit with one baud rate and receive with another, while RFC 2217 does not. Also, while you can <em>clear</em> the buffers, you can't synchronize command execution with <em>flushing</em> the buffers, but in practice anything you need to do like that would suck using a local ports anyway.)</p>

<p>Programs such as <code>ser2net</code> can be used to expose physical serial ports as intelligent, functional RFC 2217 services. Perfect.</p>

<p>…unless you want to use software that assumes you have an actual serial port, or software that assumes a physical serial device. Aagh!</p>]]></description><link>http://www.willglynn.com/2013/10/31/serial-ports-are-hard/</link><guid isPermaLink="false">96b8d7d7-37fb-485c-98f7-6fdd9d74c3be</guid><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Thu, 31 Oct 2013 17:39:46 GMT</pubDate></item><item><title><![CDATA[Fun in Google Earth]]></title><description><![CDATA[<p>I noticed that Google Earth posted new imagery in and around Chicagoland Skydiving Center. Among other things, this means that the hangar is actually visible; the previous set features a time when CSC was operating out of tents.</p>

<p>Google Earth says the photos were taken on Monday September 9, and judging by the shadows, it appears to be shortly after solar noon. I checked my logbook and found that I made a jump over lunch that day.</p>

<p>Curious, I dug a little deeper, breaking out my <a href='http://flysight.ca/' >FlySight</a> GPS logs. I usually run my FlySight for the entire ascent when I'm not concerned about battery life, and sure enough, I found I had recorded the plane's flight path as part of my jump #705 track. Following along, I find:</p>

<p><img src='http://www.willglynn.com/content/images/2013/Oct/google_earth_pac.jpg'  alt="CSC's PAC 750 in flight" />
<img src='http://www.willglynn.com/content/images/2013/Oct/google_earth_overview.jpg'  alt="" /></p>

<p>Hooray, data!</p>

<p>Here's <a href='https://maps.google.com/maps?ll=41.888431,-89.0948&amp;t=h&amp;z=20' >a link to this view in Google Maps</a> just for good measure.</p>]]></description><link>http://www.willglynn.com/2013/10/30/fun-in-google-earth/</link><guid isPermaLink="false">c2872d31-c12b-4b00-9154-76048e17081f</guid><dc:creator><![CDATA[Will Glynn]]></dc:creator><pubDate>Wed, 30 Oct 2013 14:04:36 GMT</pubDate></item></channel></rss>