<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:rawvoice="http://www.rawvoice.com/rawvoiceRssModule/"

	>
<channel>
	<title>Comments on: Design and Implementation of CSV/Excel Upload for SaaS</title>
	<atom:link href="http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=design-and-implementation-of-csvexcel-upload-for-saas</link>
	<description>Patrick McKenzie (patio11) blogs on software development, marketing, and general business topics</description>
	<lastBuildDate>Thu, 14 Jan 2016 20:48:09 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.1.7</generator>
	<item>
		<title>By: "&#62;</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-23039</link>
		<dc:creator><![CDATA["&#62;]]></dc:creator>
		<pubDate>Tue, 10 Feb 2015 05:56:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-23039</guid>
		<description><![CDATA[　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿ 　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿ ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿]]></description>
		<content:encoded><![CDATA[<p>　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿ 　　 ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿ ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿  ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: "&#62;</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-23038</link>
		<dc:creator><![CDATA["&#62;]]></dc:creator>
		<pubDate>Tue, 10 Feb 2015 05:55:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-23038</guid>
		<description><![CDATA[ه꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲]]></description>
		<content:encoded><![CDATA[<p>ه꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲҉꙰꙱҈̿꙲</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: "&#62;</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-23037</link>
		<dc:creator><![CDATA["&#62;]]></dc:creator>
		<pubDate>Tue, 10 Feb 2015 05:54:08 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-23037</guid>
		<description><![CDATA[a]]></description>
		<content:encoded><![CDATA[<p>a</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: "&#62;</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-23036</link>
		<dc:creator><![CDATA["&#62;]]></dc:creator>
		<pubDate>Tue, 10 Feb 2015 05:53:31 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-23036</guid>
		<description><![CDATA[Blah]]></description>
		<content:encoded><![CDATA[<p>Blah</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tyler T</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-22883</link>
		<dc:creator><![CDATA[Tyler T]]></dc:creator>
		<pubDate>Wed, 04 Feb 2015 03:02:56 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-22883</guid>
		<description><![CDATA[Awesome write up Patrick. I&#039;d been meaning to write something similar with my trials and travails with user CSV uploads. We&#039;ve had user-facing CSV uploads since shortly after MVP and it&#039;s been unbelievably complicated at times. One hard won lesson was, for the love of god, don&#039;t try to do this server side with Ruby CSV.

Right now we use PapaParse (papaparse.com) to convert CSV to JSON client-side and then clean and upload the data row by row in a Resque job, emailing back a CSV of any invalid rows with explanations.

Love to hear how it goes when you roll out to users and if the extra fancy SheetJS UI makes it usable for them (and less work for you).

Excellent kicker on funding OSS as well.]]></description>
		<content:encoded><![CDATA[<p>Awesome write up Patrick. I&#8217;d been meaning to write something similar with my trials and travails with user CSV uploads. We&#8217;ve had user-facing CSV uploads since shortly after MVP and it&#8217;s been unbelievably complicated at times. One hard won lesson was, for the love of god, don&#8217;t try to do this server side with Ruby CSV.</p>
<p>Right now we use PapaParse (papaparse.com) to convert CSV to JSON client-side and then clean and upload the data row by row in a Resque job, emailing back a CSV of any invalid rows with explanations.</p>
<p>Love to hear how it goes when you roll out to users and if the extra fancy SheetJS UI makes it usable for them (and less work for you).</p>
<p>Excellent kicker on funding OSS as well.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jeff</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-22850</link>
		<dc:creator><![CDATA[Jeff]]></dc:creator>
		<pubDate>Tue, 03 Feb 2015 05:01:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-22850</guid>
		<description><![CDATA[Got it - thanks for the update Patrick, that makes a lot of sense.]]></description>
		<content:encoded><![CDATA[<p>Got it &#8211; thanks for the update Patrick, that makes a lot of sense.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Holger</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-22740</link>
		<dc:creator><![CDATA[Holger]]></dc:creator>
		<pubDate>Thu, 29 Jan 2015 22:16:04 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-22740</guid>
		<description><![CDATA[Patrick,

great article. It&#039;s something I have to do for my CRM SaaS as well. Right now I concierge my user (yes singular) as well. Everytime he wants to upload new data he happily sends me a CSV and I import it.

Gotta write some software that does it for me. :D]]></description>
		<content:encoded><![CDATA[<p>Patrick,</p>
<p>great article. It&#8217;s something I have to do for my CRM SaaS as well. Right now I concierge my user (yes singular) as well. Everytime he wants to upload new data he happily sends me a CSV and I import it.</p>
<p>Gotta write some software that does it for me. :D</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Patrick</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-22723</link>
		<dc:creator><![CDATA[Patrick]]></dc:creator>
		<pubDate>Thu, 29 Jan 2015 08:49:34 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-22723</guid>
		<description><![CDATA[Hiya Jeff,

We use ecrypt-fs, which encrypts the redis data file (dump.rdb) when it is at rest.  Access to Redis only happens over an encrypted link (tunneled over SSH), so that has us in the clear when it is in flight.  My read of the HIPAA regulations and my legal advisors&#039; opinion is that this has us covered -- the data is theoretically unencrypted in memory in the Redis process, but if an attacker ever gets arbitrary memory read on our DB server, we&#039;re screwed anyhow.

We could use ecypt-fs for parts of the file system, but I&#039;m trying to keep the number of things we have to track to the minimal number possible.]]></description>
		<content:encoded><![CDATA[<p>Hiya Jeff,</p>
<p>We use ecrypt-fs, which encrypts the redis data file (dump.rdb) when it is at rest.  Access to Redis only happens over an encrypted link (tunneled over SSH), so that has us in the clear when it is in flight.  My read of the HIPAA regulations and my legal advisors&#8217; opinion is that this has us covered &#8212; the data is theoretically unencrypted in memory in the Redis process, but if an attacker ever gets arbitrary memory read on our DB server, we&#8217;re screwed anyhow.</p>
<p>We could use ecypt-fs for parts of the file system, but I&#8217;m trying to keep the number of things we have to track to the minimal number possible.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jeff</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-22710</link>
		<dc:creator><![CDATA[Jeff]]></dc:creator>
		<pubDate>Wed, 28 Jan 2015 22:56:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-22710</guid>
		<description><![CDATA[Great article!

One quick question: I had ruled out redis for HIPAA-sensitive data because I didn&#039;t think it supported encryption out of the box (their docs say &quot;Redis does not support encryption&quot; in the Data Encryption section of http://redis.io/topics/security).

So did you find another way to encrypt data stored in Redis?  (And if so, why wouldn&#039;t that have worked on the file system?)

Thanks!]]></description>
		<content:encoded><![CDATA[<p>Great article!</p>
<p>One quick question: I had ruled out redis for HIPAA-sensitive data because I didn&#8217;t think it supported encryption out of the box (their docs say &#8220;Redis does not support encryption&#8221; in the Data Encryption section of <a href="http://redis.io/topics/security" rel="nofollow">http://redis.io/topics/security</a>).</p>
<p>So did you find another way to encrypt data stored in Redis?  (And if so, why wouldn&#8217;t that have worked on the file system?)</p>
<p>Thanks!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Joshua Boyd</title>
		<link>http://www.kalzumeus.com/2015/01/28/design-and-implementation-of-csvexcel-upload-for-saas/#comment-22707</link>
		<dc:creator><![CDATA[Joshua Boyd]]></dc:creator>
		<pubDate>Wed, 28 Jan 2015 20:08:06 +0000</pubDate>
		<guid isPermaLink="false">http://www.kalzumeus.com/?p=1482#comment-22707</guid>
		<description><![CDATA[&gt; The Javascript glue code is 450 lines long. No unit tests because, frankly, I have 
&gt; no clue how one would test this in an automated fashion. 

I try to write Javascript Unit tests where I can, but in the upload code I&#039;ve written, the unit tests don&#039;t say much about if it will work, and were way too hard to write for the benefit.

What I do for testing the particularly nasty parts is have a third deployment of the entire system (first being development and second being production).  I then run a VM with Linux and Chrome in it with ChromeDriver and a script (I use python, but ruby is supported as well) to remote control Chrome for testing my software.  
Firefox is equally easy to setup.  IE is considerably harder, so I don&#039;t bother.

The script is completely controlling a normally running Chrome, so even though this could run on Windows or OSX, if you run it directly on your desktop/laptop, trying to use your desktop/laptop while it is running will interfere with the tests.  That is why I use a Linux VM to run it.

While you can spend endless amounts of time perfecting and taking it further, I bet that in about an hour or two, you could go from nothing to a few upload tests that you run by manually launching the script in your linux VM.

This is also how I run my actual javascript unit tests.  A python script opens Chrome pointed at the index.html file for the tests, waits for the tests to finish running in the browser, then scrapes the table of results to report what the failures are.  This gives me something that can be put in a git commit hook (It takes a minute or two, so it is a post commit report, not a condition of the commit finishing).]]></description>
		<content:encoded><![CDATA[<p>&gt; The Javascript glue code is 450 lines long. No unit tests because, frankly, I have<br />
&gt; no clue how one would test this in an automated fashion. </p>
<p>I try to write Javascript Unit tests where I can, but in the upload code I&#8217;ve written, the unit tests don&#8217;t say much about if it will work, and were way too hard to write for the benefit.</p>
<p>What I do for testing the particularly nasty parts is have a third deployment of the entire system (first being development and second being production).  I then run a VM with Linux and Chrome in it with ChromeDriver and a script (I use python, but ruby is supported as well) to remote control Chrome for testing my software.<br />
Firefox is equally easy to setup.  IE is considerably harder, so I don&#8217;t bother.</p>
<p>The script is completely controlling a normally running Chrome, so even though this could run on Windows or OSX, if you run it directly on your desktop/laptop, trying to use your desktop/laptop while it is running will interfere with the tests.  That is why I use a Linux VM to run it.</p>
<p>While you can spend endless amounts of time perfecting and taking it further, I bet that in about an hour or two, you could go from nothing to a few upload tests that you run by manually launching the script in your linux VM.</p>
<p>This is also how I run my actual javascript unit tests.  A python script opens Chrome pointed at the index.html file for the tests, waits for the tests to finish running in the browser, then scrapes the table of results to report what the failures are.  This gives me something that can be put in a git commit hook (It takes a minute or two, so it is a post commit report, not a condition of the commit finishing).</p>
]]></content:encoded>
	</item>
</channel>
</rss>
