<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ryan Day</title>
	<atom:link href="http://www.ryanday.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ryanday.net</link>
	<description>Product Development</description>
	<lastBuildDate>Mon, 23 Nov 2015 12:45:22 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.23</generator>
	<item>
		<title>Yes, it needs tests</title>
		<link>http://www.ryanday.net/2015/09/21/features-versus-one-hacks/</link>
		<comments>http://www.ryanday.net/2015/09/21/features-versus-one-hacks/#comments</comments>
		<pubDate>Tue, 22 Sep 2015 00:10:14 +0000</pubDate>
		<dc:creator><![CDATA[Ryan Day]]></dc:creator>
				<category><![CDATA[Meta]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[web application]]></category>

		<guid isPermaLink="false">http://www.ryanday.net/?p=1163</guid>
		<description><![CDATA[<p>Don&#8217;t spend a lot of time on this, because it isn&#8217;t a full blown feature. It&#8217;s just one little thing the client needs. Don&#8217;t go overboard, just quick and simple. You can&#8217;t control how other people think. You can only control you. The client and sales have already had the meeting. They&#8217;ve already convinced themselves <a class="more-link" href="http://www.ryanday.net/2015/09/21/features-versus-one-hacks/">Read More</a></p><p>The post <a href="http://www.ryanday.net/2015/09/21/features-versus-one-hacks/">Yes, it needs tests</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></description>
				<content:encoded><![CDATA[<blockquote><p>Don&#8217;t spend a lot of time on this, because it isn&#8217;t a full blown feature. It&#8217;s just one little thing the client needs. Don&#8217;t go overboard, just quick and simple.</p></blockquote>
<p>You can&#8217;t control how other people think. You can only control you. The client and sales have already had the meeting. They&#8217;ve already convinced themselves this is a quick easy feature. You can&#8217;t change this. But you can remind them of the policy:</p>
<p style="padding-left: 30px;"><em><strong>All committed code needs tests.</strong></em></p>
<p>Have this policy! Follow it! When <strong><em>you</em></strong> say no, you are a disgruntled programmer who doesn&#8217;t want to do work. When the policy requires tests, you are doing everything you can to get that request implemented. It will just take some time.</p>
<p>I was recently asked to build a small, one off workflow for a client. I was met with a bit of a shock when I asked why we weren&#8217;t making this a full feature. They honestly wanted to save time. They didn&#8217;t want this to get in the way. They didn&#8217;t want to go through the work of designing and implementing a new feature. I had just a couple questions:</p>
<blockquote><p>Does this have to work correctly every time?<br />
Does this have to integrate with the system without breaking anything else?</p></blockquote>
<p>This a feature. It needs to be tested. It needs to work. It needs the time to be built correctly. Have the policies in place that allow you to build software the way it should be done.</p>
<p>&nbsp;</p>
<p>The post <a href="http://www.ryanday.net/2015/09/21/features-versus-one-hacks/">Yes, it needs tests</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ryanday.net/2015/09/21/features-versus-one-hacks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQLAlchemy and Memory</title>
		<link>http://www.ryanday.net/2015/03/30/python-memory-reminders/</link>
		<comments>http://www.ryanday.net/2015/03/30/python-memory-reminders/#comments</comments>
		<pubDate>Mon, 30 Mar 2015 14:59:18 +0000</pubDate>
		<dc:creator><![CDATA[Ryan Day]]></dc:creator>
				<category><![CDATA[Meta]]></category>

		<guid isPermaLink="false">http://www.ryanday.net/?p=1144</guid>
		<description><![CDATA[<p>I started having segfaults in my celery processes. These were incredibly difficult to debug because they didn&#8217;t always happen, and never happened in development. Fortunately they were happening in certain places and I was able to guess where the problem was. However, I didn&#8217;t understand just how severe the problem was. I use SQLAlchemy in my Flask <a class="more-link" href="http://www.ryanday.net/2015/03/30/python-memory-reminders/">Read More</a></p><p>The post <a href="http://www.ryanday.net/2015/03/30/python-memory-reminders/">SQLAlchemy and Memory</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I started having segfaults in my celery processes. These were incredibly difficult to debug because they didn&#8217;t always happen, and never happened in development. Fortunately they were happening in certain places and I was able to guess where the problem was. However, I didn&#8217;t understand just how severe the problem was.</p>
<p>I use SQLAlchemy in my Flask apps. I typically issue queries similar to</p>
<p><code lang="python">query_result = db.session.query(MyModel).first()</code></p>
<p>I knew I was running out of memory on my entry level Digital Ocean droplets. That is when the segfaults started. I stumbled across https://pypi.python.org/pypi/memory_profiler and created a quick test program to profile a single function that was causing problems.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;">Line <span style="color: #808080; font-style: italic;"># Mem usage Increment Line Contents</span>
<span style="color: #66cc66;">================================================</span>
<span style="color: #ff4500;">56</span> <span style="color: #ff4500;">46.0</span> MiB <span style="color: #ff4500;">0.0</span> MiB   <span style="color: #66cc66;">@</span><span style="color: #dc143c;">profile</span>
<span style="color: #ff4500;">57</span>                    <span style="color: #ff7700;font-weight:bold;">def</span> get_bounced_emails<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
<span style="color: #ff4500;">58</span> <span style="color: #ff4500;">48.2</span> MiB <span style="color: #ff4500;">2.2</span> MiB       emails <span style="color: #66cc66;">=</span> db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>EmailAddress<span style="color: black;">&#41;</span>.\
<span style="color: #ff4500;">59</span> <span style="color: #ff4500;">48.3</span> MiB <span style="color: #ff4500;">0.0</span> MiB           join<span style="color: black;">&#40;</span>send_history<span style="color: #66cc66;">,</span> send_history.<span style="color: black;">c</span>.<span style="color: black;">email_id</span> <span style="color: #66cc66;">==</span> EmailAddress.<span style="color: black;">email_id</span><span style="color: black;">&#41;</span>.\
<span style="color: #ff4500;">60</span> <span style="color: #ff4500;">372.1</span> MiB <span style="color: #ff4500;">323.9</span> MiB        <span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>send_history.<span style="color: black;">c</span>.<span style="color: black;">bounce</span> <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>.\
<span style="color: #ff4500;">61</span>                            <span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">62</span>
<span style="color: #ff4500;">63</span> <span style="color: #ff4500;">372.1</span> MiB <span style="color: #ff4500;">0.0</span> MiB      email_dict <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
<span style="color: #ff4500;">64</span> <span style="color: #ff4500;">374.1</span> MiB <span style="color: #ff4500;">2.0</span> MiB      <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #dc143c;">email</span> <span style="color: #ff7700;font-weight:bold;">in</span> emails:
<span style="color: #ff4500;">65</span> <span style="color: #ff4500;">374.1</span> MiB <span style="color: #ff4500;">0.0</span> MiB          email_dict<span style="color: black;">&#91;</span><span style="color: #dc143c;">email</span>.<span style="color: black;">email_address</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
<span style="color: #ff4500;">66</span>
<span style="color: #ff4500;">67</span> <span style="color: #ff4500;">314.9</span> MiB -<span style="color: #ff4500;">59.2</span> MiB    <span style="color: #ff7700;font-weight:bold;">del</span> emails
<span style="color: #ff4500;">68</span> <span style="color: #ff4500;">314.9</span> MiB <span style="color: #ff4500;">0.0</span> MiB      <span style="color: #ff7700;font-weight:bold;">return</span> email_dict</pre></td></tr></table></div>

<p>The memory profiler package makes it real easy to see the memory consumption of your application line by line. In this function, we are just retrieving a ton of records. They are taking up a lot of memory.</p>
<p>This is where I learned a little bit about SQLAlchemy. This function only needs the email_address field of the record, but I&#8217;m retrieving the entire record. So I made a change to simply grab the email_address record.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;">Line <span style="color: #808080; font-style: italic;"># Mem usage Increment Line Contents</span>
<span style="color: #66cc66;">================================================</span>
<span style="color: #ff4500;">56</span> <span style="color: #ff4500;">46.0</span> MiB <span style="color: #ff4500;">0.0</span> MiB   <span style="color: #66cc66;">@</span><span style="color: #dc143c;">profile</span>
<span style="color: #ff4500;">57</span>                    <span style="color: #ff7700;font-weight:bold;">def</span> get_bounced_emails<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
<span style="color: #ff4500;">58</span> <span style="color: #ff4500;">47.1</span> MiB <span style="color: #ff4500;">1.1</span> MiB       emails <span style="color: #66cc66;">=</span> db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>EmailAddress.<span style="color: black;">email_address</span><span style="color: black;">&#41;</span>.\
<span style="color: #ff4500;">59</span> <span style="color: #ff4500;">47.1</span> MiB <span style="color: #ff4500;">0.0</span> MiB           join<span style="color: black;">&#40;</span>send_history<span style="color: #66cc66;">,</span> send_history.<span style="color: black;">c</span>.<span style="color: black;">email_id</span> <span style="color: #66cc66;">==</span> EmailAddress.<span style="color: black;">email_id</span><span style="color: black;">&#41;</span>.\
<span style="color: #ff4500;">60</span> <span style="color: #ff4500;">81.2</span> MiB <span style="color: #ff4500;">34.1</span> MiB          <span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>send_history.<span style="color: black;">c</span>.<span style="color: black;">bounce</span> <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>.\
<span style="color: #ff4500;">61</span>                            <span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">62</span>
<span style="color: #ff4500;">63</span> <span style="color: #ff4500;">81.2</span> MiB <span style="color: #ff4500;">0.0</span> MiB       email_dict <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
<span style="color: #ff4500;">64</span> <span style="color: #ff4500;">84.2</span> MiB <span style="color: #ff4500;">3.0</span> MiB       <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #dc143c;">email</span> <span style="color: #ff7700;font-weight:bold;">in</span> emails:
<span style="color: #ff4500;">65</span> <span style="color: #ff4500;">84.2</span> MiB <span style="color: #ff4500;">0.0</span> MiB           email_dict<span style="color: black;">&#91;</span><span style="color: #dc143c;">email</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
<span style="color: #ff4500;">66</span>
<span style="color: #ff4500;">67</span> <span style="color: #ff4500;">65.9</span> MiB -<span style="color: #ff4500;">18.2</span> MiB     <span style="color: #ff7700;font-weight:bold;">del</span> emails
<span style="color: #ff4500;">68</span> <span style="color: #ff4500;">65.9</span> MiB <span style="color: #ff4500;">0.0</span> MiB       <span style="color: #ff7700;font-weight:bold;">return</span> email_dict</pre></td></tr></table></div>

<p>Wow. By just grabbing that one field I seriously reduced the memory consumption of this method. I had under estimated just how much overhead there is in pulling the entire record in a query.</p>
<p>Now I take this into account when building queries. Just what do I need form the DB? Then I only grab that.</p>
<p>The post <a href="http://www.ryanday.net/2015/03/30/python-memory-reminders/">SQLAlchemy and Memory</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ryanday.net/2015/03/30/python-memory-reminders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time Management</title>
		<link>http://www.ryanday.net/2015/03/23/time-management/</link>
		<comments>http://www.ryanday.net/2015/03/23/time-management/#comments</comments>
		<pubDate>Mon, 23 Mar 2015 11:56:00 +0000</pubDate>
		<dc:creator><![CDATA[Ryan Day]]></dc:creator>
				<category><![CDATA[Meta]]></category>

		<guid isPermaLink="false">http://www.ryanday.net/?p=1172</guid>
		<description><![CDATA[<p>I spend roughly an hour every Sunday making tortillas. This allows me to save upwards of $5 every week. Given my hourly bill rate, this is really stupid. I should just buy the tortillas. OR Spend the hour each week making tortillas. Stop spending the 3 other hours each week Googling tortilla recipes.</p><p>The post <a href="http://www.ryanday.net/2015/03/23/time-management/">Time Management</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I spend roughly an hour every Sunday making tortillas. This allows me to save upwards of $5 every week. </p>
<p>Given my hourly bill rate, this is really stupid. I should just buy the tortillas.</p>
<p><strong>OR</strong></p>
<p>Spend the hour each week making tortillas. Stop spending the 3 other hours each week Googling tortilla recipes.</p>
<p>The post <a href="http://www.ryanday.net/2015/03/23/time-management/">Time Management</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ryanday.net/2015/03/23/time-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Silent Win</title>
		<link>http://www.ryanday.net/2015/02/06/silent-win/</link>
		<comments>http://www.ryanday.net/2015/02/06/silent-win/#comments</comments>
		<pubDate>Fri, 06 Feb 2015 13:33:32 +0000</pubDate>
		<dc:creator><![CDATA[Ryan Day]]></dc:creator>
				<category><![CDATA[Meta]]></category>

		<guid isPermaLink="false">http://www.ryanday.net/?p=1169</guid>
		<description><![CDATA[<p>Well it&#8217;s been six days since I&#8217;ve decided to post something everyday and haven&#8217;t I posted anything on any days. Some might see this as a total failure. But I&#8217;m deciding I&#8217;ve actually succeeded. The real goal, of course, is to practice writing down thoughts in a logical order that can be understood by others. <a class="more-link" href="http://www.ryanday.net/2015/02/06/silent-win/">Read More</a></p><p>The post <a href="http://www.ryanday.net/2015/02/06/silent-win/">Silent Win</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Well it&#8217;s been six days since I&#8217;ve decided to post something everyday and haven&#8217;t I posted anything on any days. Some might see this as a total failure. But I&#8217;m deciding I&#8217;ve actually succeeded.</p>
<p>The real goal, of course, is to practice writing down thoughts in a logical order that can be understood by others. The secondary goal (as of now) is to improve my signal to noise. That can&#8217;t happen by scribbling down my insane thoughts every day. Unless I had an easily identifiable pattern of clarity to insanity. But I don&#8217;t think that&#8217;s something you can plan.</p>
<p>So I&#8217;ve privately jotted down thoughts for revision, and not posted the horrible bits. This helps me organize my ideas and doesn&#8217;t clutter the internet.</p>
<p>Huzzah!</p>
<p>The post <a href="http://www.ryanday.net/2015/02/06/silent-win/">Silent Win</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ryanday.net/2015/02/06/silent-win/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More Writing</title>
		<link>http://www.ryanday.net/2015/01/31/writing/</link>
		<comments>http://www.ryanday.net/2015/01/31/writing/#comments</comments>
		<pubDate>Sun, 01 Feb 2015 02:08:59 +0000</pubDate>
		<dc:creator><![CDATA[Ryan Day]]></dc:creator>
				<category><![CDATA[Meta]]></category>

		<guid isPermaLink="false">http://www.ryanday.net/?p=1160</guid>
		<description><![CDATA[<p>I think it&#8217;s about time to start this &#8220;post a day&#8221; idea. Fred Wilson does it. This guy seems pretty consistent about it. More importantly, I&#8217;m starting to send long emails which are simply not being read. I need another outlet to vent. Or people are going to stop talking to me altogether just to <a class="more-link" href="http://www.ryanday.net/2015/01/31/writing/">Read More</a></p><p>The post <a href="http://www.ryanday.net/2015/01/31/writing/">More Writing</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I think it&#8217;s about time to start this &#8220;post a day&#8221; idea. <a href="http://avc.com/">Fred Wilson</a> does it. <a href="http://lockhartsteele.com/blog/">This guy</a> seems pretty consistent about it. More importantly, I&#8217;m starting to send long emails which are simply not being read. I need another outlet to vent. Or people are going to stop talking to me altogether just to avoid getting stuck in conversation.</p>
<p>I certainly have enough half finished thoughts in my drafts folder. I&#8217;m thinking I can stretch this out two weeks. Maybe three. I can&#8217;t simply ramble, I have to do something productive. So with that in mind.</p>
<p>&#8211; &#8211; &#8211; &#8211; &#8211;</p>
<p>I missed the product release notes yesterday (it&#8217;s Saturday). So I&#8217;m finalizing them them now. I put out release notes every Friday afternoon so everyone on the team can keep up with the new features and resolved bugs. It also lets people know I&#8217;m not sleeping all day. That isn&#8217;t a joke. It is actually important to do this. Especially when you&#8217;re a back end developer.</p>
<p>I keep an open notepad all week, and add important features and fixes that people care about. Those are the notes I share. I always have one line: <em>&#8220;Lots of small bug fixes and refactoring</em>&#8220;. That is a catch all for everything I don&#8217;t talk about.</p>
<p>Keeping an open notepad for release notes forces me to do at least 2 or 3 things each week that people will notice. I may spend 4 long grueling days profiling and writing unit tests for an Objective C API we are rolling out. On the fifth day, I know I better write a new graph report. Or maybe update some email templates to look better on mobile. Or anything where people can see the output. Otherwise the rest just doesn&#8217;t matter. It really doesn&#8217;t. Non-developers only ever work with production level software, usually from very large teams. They only see software that, generally, works very well. But they have no idea what goes into it.</p>
<p>On the plus side, they have no idea how long it takes to change the color of a button. So take all day. 3 seconds to change the color. 8 hours to refactor and write tests for the rest of the system. So thats what I do. I spend a day every week making highly visible changes, no matter how simple.</p>
<p>It&#8217;s a balancing act. I really think the difference between a normal coder and the mythical 10Xer is how you spend the other 4 days.</p>
<p>The post <a href="http://www.ryanday.net/2015/01/31/writing/">More Writing</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ryanday.net/2015/01/31/writing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuration in the Environment</title>
		<link>http://www.ryanday.net/2015/01/02/configuration-environment/</link>
		<comments>http://www.ryanday.net/2015/01/02/configuration-environment/#comments</comments>
		<pubDate>Fri, 02 Jan 2015 15:45:02 +0000</pubDate>
		<dc:creator><![CDATA[Ryan Day]]></dc:creator>
				<category><![CDATA[Meta]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.ryanday.net/?p=1148</guid>
		<description><![CDATA[<p>Moving Fast published this article, regarding the danger of using the environment to store secrets. I think that every time is a good time to re-evaluate design choices with security implications. So that&#8217;s what I&#8217;m doing here. My previous post focused specifically on the security implications of storing keys in your code repository. This was a particularly <a class="more-link" href="http://www.ryanday.net/2015/01/02/configuration-environment/">Read More</a></p><p>The post <a href="http://www.ryanday.net/2015/01/02/configuration-environment/">Configuration in the Environment</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Moving Fast published <a href="http://movingfast.io/articles/environment-variables-considered-harmful/">this article</a>, regarding the danger of using the environment to store secrets. I think that every time is a good time to re-evaluate design choices with security implications. So that&#8217;s what I&#8217;m doing here.</p>
<p>My <a title="Keep Private Data Out Of Your Repository" href="http://www.ryanday.net/2014/08/23/private-data-repository/">previous post</a> focused specifically on the security implications of storing keys in your code repository. This was a particularly harmful situation with a client project I had joined. But as I think about it a little more, security isn&#8217;t the reason I use the environment to store configuration. <strong>Security is simply a byproduct.</strong> The reasons I use the environment in my company are:</p>
<p style="padding-left: 60px;">1. When bringing up a new contractor or employee, I simply generate an IAM role and a key to our internal API. I plug those into the &#8220;Developer&#8221; environment IDE config file, and the new developer is up and running.</p>
<p style="padding-left: 60px;">2. It&#8217;s easy to move developers between environments. We are writing V2 of our internal API as I write this. Its really quick to change your environment to build features in V2, or fix bugs in V1.</p>
<p style="padding-left: 60px;">3. It felt much quicker to have a config.py pull from the environment than to parse command line parameters for our large number of configuration options or to add a dependency for an ini parser.</p>
<p>Reading this short list, there is really nothing here that forces us to use the environment. A config file would be just fine. Maybe I should think about that.</p>
<p><strong>What concerns should I examine?</strong></p>
<p><em>My application servers have 3 user accounts: nobody, alembic deploy user, root.</em></p>
<p>That&#8217;s it. Access to any one of those three accounts would give an attacker access to our secret keys and database. It wouldn&#8217;t matter if the configuration values were in the environment or a file. An attacker could read secrets from disk or from memory. So I don&#8217;t really gain or lose anything from using the environment instead of a config file.</p>
<p><em>My application starts up with an environment set, and reads the values from the environment into config variables.</em></p>
<p>Not only could this be done with a config file, <em>that&#8217;s what is actually happening</em>. The environment parameters are still stored on disk. When the server reboots, it reads the file, sets up the environment, and launches the application. So the &#8220;environment&#8221; part is simply a mirror of the setup on the developer&#8217;s system to keep production and development code consistent. So I may have the downside of both designs from a security perspective.</p>
<p><em>Very low probability of adding new config options.</em></p>
<p>When we do add a new environment config, it&#8217;s ok that it isn&#8217;t an automated process. It doesn&#8217;t happen frequently so having to redeploy our configuration manually isn&#8217;t a problem.</p>
<p><strong>What do I gain from using the environment?</strong></p>
<p>I don&#8217;t run the risk of a developer accidentally checking in their config file. However, if that did happen I would only have to reset their IAM credentials and internal API key.</p>
<p><strong>What do I gain from using a config file?</strong></p>
<p>I may only be gaining &#8220;not using the environment&#8221;. I think a successful attack on our system would happen regardless of how we stored our secrets.</p>
<p><strong>Conclusions</strong></p>
<p>Well I&#8217;m not sure. The Moving Fase article helped me, because we aren&#8217;t cleaning up the application environment after setting the config variables. So that is a security enhancement I will make. Other than that, I don&#8217;t think changing from the environment to a config file would give much benefit in a security or functionality sense.</p>
<p>The post <a href="http://www.ryanday.net/2015/01/02/configuration-environment/">Configuration in the Environment</a> appeared first on <a href="http://www.ryanday.net">Ryan Day</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ryanday.net/2015/01/02/configuration-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
