<?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>PhilFreo.com</title>
	<atom:link href="http://philfreo.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://philfreo.com/blog</link>
	<description>The portfolio and blog of Phil Freo, on web design, development, and entrepreneurship.</description>
	<lastBuildDate>Thu, 09 May 2013 17:47:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>My Backbone.js book published!</title>
		<link>http://philfreo.com/blog/my-backbone-js-book-published/</link>
		<comments>http://philfreo.com/blog/my-backbone-js-book-published/#comments</comments>
		<pubDate>Wed, 01 May 2013 06:49:07 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[backbone.js]]></category>
		<category><![CDATA[Books]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=538</guid>
		<description><![CDATA[On my goals list for 2013 was to write an eBook of some sort. When I was approached to join some other Backbone.js contributors in a &#8220;book sprint&#8221; to write a book on developing a Backbone.js application, I happily accepted! The process went fairly smoothly (all things considered, when 5 people all write a book [...]]]></description>
			<content:encoded><![CDATA[<p>On my goals list for 2013 was to write an eBook of some sort. When I was approached to join some other Backbone.js contributors in a &#8220;book sprint&#8221; to write a book on developing a Backbone.js application, I happily accepted!</p>
<p>The process went fairly smoothly (all things considered, when 5 people all write a book at once, mostly over a weekend). There were some challenges with timezones and schedules, but overall the team did a great job getting it done.</p>
<p>We started by building our sample project, <a href=" https://github.com/backstopmedia/hubbub/">Hubbub</a> (a GitHub Issues tracker in a Kanban format), upon which we&#8217;d base the book. We wanted to build an app that was more complex / real-world than the typical localstorage Todo list example apps out there. You can <a href="http://backstopmedia.github.io/hubbub/">see the final project live</a> here.</p>
<p>You can read more about the book on the publisher&#8217;s site here: <a href="http://bleedingedgepress.com/our-books/backbone-js/">Developing a Backbone.js Edge</a>, or buy it from one of these locations:</p>
<ul>
<li><a href="https://gumroad.com/l/mtan/$5off">Gumroad</a> ($5 cheaper!)</li>
<li><a href="http://techbus.safaribooksonline.com/9781939902016">Safari Books</a></li>
<li><a href="http://www.amazon.com/Developing-a-Backbone-js-Edge-ebook/dp/B00CBP7N3O/?ie=UTF8&amp;tag=backbone05-20">Amazon (Kindle)</a></li>
</ul>
<p>Thanks to Casey Foster, Aidan Feldman, David Tonge, and Tim Branyen for co-writing it with me, and for Troy Mott for organizing the book sprint.</p>
<p>And now for some SEO love&#8230; I hope this book will become one of the best selling <a href="https://gumroad.com/l/mtan/$5off">Backbone.js tutorial books</a> out there!</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/my-backbone-js-book-published/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The problem with pull requests / code reviews</title>
		<link>http://philfreo.com/blog/the-problem-with-pull-requests-code-reviews/</link>
		<comments>http://philfreo.com/blog/the-problem-with-pull-requests-code-reviews/#comments</comments>
		<pubDate>Wed, 01 May 2013 05:50:08 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=530</guid>
		<description><![CDATA[We use git and GitHub&#8217;s Pull Requests fairly heavily in developing Close.io sales software. My main problem with pull requests as code review is that it focuses my attention too much on the specific lines of code added/removed/modified, but not enough on the context of where they were added/removed. Take this view, for instance: Sure, these [...]]]></description>
			<content:encoded><![CDATA[<p>We use git and GitHub&#8217;s Pull Requests fairly heavily in developing <a href="http://close.io/">Close.io sales software</a>. My main problem with pull requests as code review is that it focuses my attention too much on the specific lines of code added/removed/modified, but not enough on the <em>context</em> of where they were added/removed.</p>
<p><span id="more-530"></span></p>
<p>Take this view, for instance:</p>
<p style="text-align: center;"><img class="aligncenter  wp-image-531" src="http://philfreo.com/blog/wp-content/uploads/2013/04/Screen-Shot-2013-04-30-at-2.00.16-PM.png" alt="" width="467" height="182" /></p>
<p style="text-align: left;">Sure, these 3 lines look fine &#8212; there are valid Python code and don&#8217;t contain any obviously flawed logic. And I can see which file it&#8217;s in (app/resources.py), and even the method name (&#8216;validate_request&#8217;). But this very often isn&#8217;t enough for me to really review what&#8217;s going on. Do these lines make sense <em>here</em>? I have no idea from this view.</p>
<p style="text-align: left;">One reason is that seeing 2 lines of code above a change doesn&#8217;t really give me enough context even within a method. Another reason is that it&#8217;s not uncommon (especially in Python apps) to have a bunch of similar classes in the same file, that may all implement the same method names. In this case, how do I know which Resource class this code was added to?</p>
<p style="text-align: left;">Now, GitHub is just showing &#8220;git diff&#8221; which includes 3 lines (including whitespace) of context by default. But between git-diff&#8217;s additional options like &#8211;unified/-U (which allow you to show more than 3 lines of context) and  &#8211;function-context/-W, as well as the ability for them to combine AJAX-ey goodness, there&#8217;s a lot of opportunity for improvement.</p>
<p style="text-align: left;">Here are some ideas:</p>
<ul>
<li><strong>No UI Approach:</strong> For starters, add a querystring feature like <code>?u=7</code>, which would show me 7 lines of context instead of 3. They already do this with <code>?w=1</code> to show a diff that ignores whitespace changes and it comes in handy. This &#8220;no UI&#8221; approach is a no brainer, in my opinion.</li>
<li><strong>Get fancy with JavaScript: </strong>See the little &#8220;&#8230;&#8221; above line 422 which represents all the extra code? This is the web&#8230; I should be able to click on the ellipses to <em>expand</em> the context. It could load in and display several extra lines of code when I click this to let me see additional context about the code I&#8217;m reviewing.</li>
<li><strong>Get fancy with git:</strong> I&#8217;m not sure exactly how git-diff shows the function (<code>def validate_request(self, obj=None):</code> in this case) at the top of each chunk, but some intelligence could be added so that showed the class/object name in addition to the function/method names.</li>
</ul>
<p>Can you think of a better way to solve this problem?</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/the-problem-with-pull-requests-code-reviews/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>The startups and services behind Close.io</title>
		<link>http://philfreo.com/blog/the-startups-and-services-behind-close-io/</link>
		<comments>http://philfreo.com/blog/the-startups-and-services-behind-close-io/#comments</comments>
		<pubDate>Wed, 20 Feb 2013 04:47:18 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=526</guid>
		<description><![CDATA[Originally published on the Close.io blog. The startups and services behind Close.io In creating Close.io software for salespeople, we rely on a number of other startups and services to do what we do. While there are alternatives to using each of the following, we have chosen them for specific reasons because we think they’re the best. [...]]]></description>
			<content:encoded><![CDATA[<p>Originally published on the Close.io blog.</p>
<blockquote>
<h2><a href="http://blog.close.io/post/43503191746/the-startups-and-services-behind-close-io">The startups and services behind Close.io</a></h2>
</blockquote>
<div>
<blockquote><p>In creating <a href="http://close.io/">Close.io software for salespeople</a>, we rely on a number of other startups and services to do what we do. While there are alternatives to using each of the following, we have chosen them for specific reasons because we think they’re the best.</p>
<p>The common theme is that these services allow us to move faster and have better insight into our business. We could live without any of them, but it would mean slower iteration and less innovation.</p>
<h3><span id="more-526"></span>Powers our app</h3>
<p><a href="http://plivo.com/">Plivo</a> - Powers the backend telephony behind Close.io. We chose them over others like Twilio because of their low level sip telephony support, as well as their commitment to call quality.</p>
<p><a href="https://aws.amazon.com/">AWS</a> (EC2, ELB, S3, CloudFront) &#8211; Let the big guys handle our server infrastructure. Best AWS decision we’ve made is to host out of Oregon instead of the east coast, since almost all of the significant downtime AWS has had in the last year has been in Virginia.</p>
<p><a href="https://www.mongohq.com/">MongoHQ</a> - Rather than spending development resources working on the intricacies of properly tuning MongoDB, we like having some extra experience here.</p>
<p><a href="http://heroku.com/">Heroku</a> - Used to host our static Close.io homepage because there’s really no simpler way to get a Flask/Python app deployed.</p>
<h3>Technical insight &amp; debugging</h3>
<p><a href="https://newrelic.com/">New Relic</a> - Great way to monitor app server performance and server health. Expensive but worth it.</p>
<p><a href="http://errorception.com/">Errorception</a> - JavaScript error reporting. It’s not fancy, but JS error collection/reporting is an art and they know what’s up.</p>
<p><a href="http://hockeyapp.net/">HockeyApp</a> - Mac app crash reporting</p>
<h3>User analytics &amp; retention</h3>
<p><a href="http://customer.io/">Customer.io</a> - Used for automatic drip marketing emails. By plugging in our Google SMTP credentials to send from, our marketing emails automatically get logged into Close.io so we can see all emails sent/received to our contacts.</p>
<p><a href="http://mixpanel.com/">Mixpanel</a> - Used for user + event tracking within our app</p>
<p><a href="http://www.google.com/analytics/">Google Analytics</a> - Used for overall traffic analysis</p>
<p>Tip: best decision here was to use <a href="https://github.com/segmentio/analytics.js">Analytics.js</a> which allows us to easily try out different analytics services with only a single line of code changed.</p>
<h3>Development</h3>
<p><a href="https://github.com/">GitHub</a> - Best UI out there for code reviewing. Also heavily use GitHub Issues. Check out our <a href="https://github.com/elasticsales">open source contributions</a>.</p>
<p><a href="https://circleci.com/">CircleCI</a> - Upon every code push to GitHub, Circle automatically runs all our Python and JavaScript unit tests. If something fails, our engineering chat room is pinged. If tests pass in master, the latest code is automatically deployed to our production servers. Circle definitely beats running your own Jenkins CI server.</p>
<h3>Communication</h3>
<p><a href="http://campfirenow.com/">Campfire</a> - Used for both internal team communication (and integrated with GitHub, New Relic, CircleCI, Close.io, etc.) as well as the “Live Help Chat” link from within our app where we provide technical support and get feedback from customers. While it’s been neglected, we like using the <a href="http://propaneapp.com/">Propane</a> app compared to the web client.</p>
<p><a href="http://www.olark.com/">Olark</a> - Used for “Live Help” on the Close.io homepage. Pops up in the team’s IM client when someone needs help.</p>
<p><a href="http://www.google.com/enterprise/apps/business/">Google Apps</a> - Easiest way to get a team going with email, calendar, etc.</p>
<h3>Money</h3>
<p><a href="http://stripe.com/">Stripe</a> - A modern API for credit card processing.</p>
<h3>Integrations</h3>
<p><a href="https://zapier.com/">Zapier</a> - We can’t integrate Close.io with every possible service, so we’ve created a <a href="https://zapier.com/zapbook/closeio/">Close.io Zapier App</a> that allows our customers (and ourselves) to integrate with other services across the web.</p>
<h3>Sales (&amp; Telephony)</h3>
<p>Last but not least, we eat our own dogfood by using <a href="http://close.io/">Close.io</a> for our sales process of keeping track of all customers and prospect data, and calls / emails with them.</p>
<h3>What’s Needed?</h3>
<p>The section that I think is missing from other similar blog posts as this is “what’s missing?”. Here are some areas that I think need more startup effort.</p>
<ul>
<li><em>Better user analytics</em>. Mixpanel (and others we’ve tried) are good for some simple analytics but just don’t allow us to easily answer many of the higher-level questions we’d like to answer about usage (“which users fit X usage patterns”, “how many people fit Y criteria over time”, etc.). The data could be there, but the backend intelligence isn’t. Improvements in this space could really help both the sales process as well as product development processes.</li>
<li><em>Better web integrations</em>. We’d love to plugin a service that helps us help our users get their existing data into Close.io from many of the existing services out there.</li>
<li><em>Better financial software. </em>Stripe is great, but it’s pretty low level. For anything slightly complicated you still have to build your own system of database+code to manage subscriptions and invoices. Perhaps a combination of an open source library + an accounting/reporting service is needed.</li>
<li><em>A non-Google email/calendar solution. </em>There seems to be a lack of great alternatives for startups.</li>
</ul>
<p>Any other great services we should be using? Tweet us at @closeio</p>
<p>- Phil Freo (@philfreo)</p></blockquote>
</div>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/the-startups-and-services-behind-close-io/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Press around Close.io</title>
		<link>http://philfreo.com/blog/press-around-close-io/</link>
		<comments>http://philfreo.com/blog/press-around-close-io/#comments</comments>
		<pubDate>Wed, 20 Feb 2013 04:45:19 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[Entrepreneurship]]></category>
		<category><![CDATA[Startups]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=522</guid>
		<description><![CDATA[We&#8217;ve been getting some great press and feedback since launching Close.io software for salespeople. GigOm: Close.io is a social context for sales communications PandoDaily: Elastic launches Close.io, sales software designed by salespeople Forbes: Y Combinator-Backed Close.io Launches Sales Software They&#8217;ve got a couple good quotes from me in the PandoDaily article.]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve been getting some great press and feedback since launching <a href="http://close.io/">Close.io software for salespeople</a>.</p>
<ul>
<li><strong>GigOm</strong>: <a href="http://pro.gigaom.com/blog/close-io-is-a-social-context-for-sales-communications/">Close.io is a social context for sales communications</a></li>
<li><strong>PandoDaily</strong>: <a href="http://pandodaily.com/2013/01/29/elastic-launches-close-io-sales-software-designed-by-salespeople/">Elastic launches Close.io, sales software designed by salespeople</a></li>
<li><strong>Forbes</strong>: <a href="http://www.forbes.com/sites/tomiogeron/2013/01/29/y-combinator-backed-close-io-launches-sales-software/">Y Combinator-Backed Close.io Launches Sales Software</a></li>
</ul>
<p>They&#8217;ve got a couple good quotes from me in the PandoDaily article.</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/press-around-close-io/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>End of 2012 Review</title>
		<link>http://philfreo.com/blog/end-of-2012-review/</link>
		<comments>http://philfreo.com/blog/end-of-2012-review/#comments</comments>
		<pubDate>Wed, 02 Jan 2013 21:06:39 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Startups]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=491</guid>
		<description><![CDATA[At the end of a year I like looking back and seeing what I&#8217;ve accomplished and what new technologies I started working with in the year. Here&#8217;s a little summary. Company I started 2012 in a new role at ElasticSales to lead the product/engineering team, working on software to make better software for sales people. [...]]]></description>
			<content:encoded><![CDATA[<p>At the end of a year I like looking back and seeing what I&#8217;ve accomplished and what new technologies I started working with in the year. Here&#8217;s a little summary.</p>
<p><span id="more-491"></span></p>
<h4>Company</h4>
<p>I started 2012 in a new role at ElasticSales to lead the product/engineering team, working on software to make better software for sales people. It&#8217;s been a great year and I&#8217;ve gotten to learn a lot of stuff and work with a great team.</p>
<p><a href="https://elasticsales.com/">ElasticSales.com</a> &#8211; Designed a company website to show credibility for our sales as a service business, help with hiring, etc.</p>
<p><a href="http://close.io/">Close.io</a> &#8211; Launched the sales application we&#8217;ve been working on for months (and I launched this website for it). Designed completely different from traditional CRMs like Salesforce, Pipedrive, etc. it&#8217;s focused on helping with <em>sales communication</em> rather than just being a database. It does this by automatically logging all calls and emails (incoming and outgoing) in one place to remove the typical data entry associated with CRMs. Also making it much more beautiful and fast than those legacy sales apps.</p>
<p>A big goal for 2013 is to make Close.io a huge success as a profitable SaaS service that people love.</p>
<h4>Design</h4>
<p>I added <a href="http://dribbble.com/philfreo">12 shots on Dribbble</a> in 2012. Though most of my &#8220;design&#8221; work was simply trying to make good user experience in Close.io.</p>
<h4>Front-end Development</h4>
<p><a href="http://backbonejs.org/">Backbone.js</a> &#8211; I had significant experience working on big JavaScript projects before 2012 (using vanilla JS, jQuery, MooTools, etc.), but hadn&#8217;t used a higher level framework like Backbone.js. In the past 12 months I&#8217;ve been primarily doing front-end development and built two large apps using Backbone. I&#8217;ve also been able to contribute a few patches, features, and unit tests to the project. I love the framework because it seems to provide just enough structure to be useful everywhere without too much bloat. It&#8217;d be hard to imagine making another client-heavy web app without using something like Backbone.</p>
<p>Along with writing a bunch of code specific to Close.io, I&#8217;ve become deeply familiar with several Backbone add-ons:</p>
<ul>
<li><a href="https://github.com/powmedia/backbone-forms">Backbone-Forms</a> &#8211; Auto-generate HTML forms that sync with Backbone models. I&#8217;ve been able to contribute significantly and help triage pull requests and issues for this project.</li>
<li><a href="https://github.com/PaulUithol/Backbone-relational">Backbone-Relational</a> &#8211; Adds relations between Models &amp; Collections. I contributed significantly to this project as well.</li>
<li><a href="https://github.com/Codecademy/backbone.declarative">Backbone.Declarative</a> &#8211; Adds a declarative syntax (similar to how Backbone DOM events work) for binding Model/Collection events to Backbone Views. I helped rewrite this project to work better with Backbone 0.9.9.</li>
<li><a href="https://github.com/lukasolson/Backbone-Super">Backbone-Super</a> &#8211; Nice syntax for calling &#8220;super&#8221; for friendly OOP-like functionality</li>
<li><a href="https://github.com/NYTimes/backbone.stickit">Backbone.Stickit</a> &#8211; 2 way DOM &lt;-&gt; Model binding</li>
<li><a href="https://github.com/joneath/infiniScroll.js">Backbone.InfiniScroll</a> &#8211; Infinity scrolling in Backbone Views</li>
<li><a href="https://github.com/elasticsales/backbone.mousetrap">Backbone.Mousetrap</a> &#8211; I wrote this as a better integration of <a href="https://github.com/ccampbell/mousetrap">Mousetrap</a> (JS keyboard library) in Backbone Views.</li>
<li><a href="https://github.com/asciidisco/Backbone.Mutators">Backbone.Mutators</a> &#8211; Provide getter/setter support on Backbone Models. Started with this project though ended up writing <a href="https://gist.github.com/3056724">my own implementation</a> that I thought was better.</li>
</ul>
<p><a href="http://gruntjs.com/">Grunt</a> &#8211; Useful command line / JavaScript-based tool for creating tasks for minifying, concatenating, compiling JS/CoffeeScript, etc. Used heavily in our deploy process.</p>
<p><a href="http://requirejs.org/">RequireJS</a> &#8211; I&#8217;m using RequireJS heavily to keep our application nicely organized into modules, with dependencies declared explicitly.</p>
<p><a href="http://lesscss.org/">LESS</a> &#8211; extends CSS with a better syntax, mixins, variables, etc.</p>
<p><a href="http://qunitjs.com/">QUnit</a> &#8211; I got much more serious about front-end / JavaScript unit testing this year, as well as better at testing in general.</p>
<p><a href="http://twitter.github.com/bootstrap/">Bootstrap</a> &#8211; used as a base set of styles and core mixins. Great when using LESS</p>
<p>Several other front-end JavaScript projects, jQuery plugins, etc. Most of my open source work is done via <a href="https://gist.github.com/3056724">Elastic&#8217;s GitHub</a>.</p>
<h4>Back-end Development</h4>
<p><strong>Python</strong> &#8211; In 2012 I went from only know a touch of Python to feeling comfortable writing significant amounts of code in it. I added plenty of features and fixed plenty of bugs. I&#8217;d definitely use Python instead of PHP now for new projects and am a big fan of its simplicity and syntax.</p>
<p><a href="https://www.djangoproject.com/">Django</a> &#8211; I spent several months working on a Django project. I got deep into Django and used various add-ons for it. For any significant traditional web app written in Python, I&#8217;d still recommend using Django.</p>
<p><a href="http://flask.pocoo.org/">Flask</a> &#8211; I&#8217;ve written 4 or 5 projects using Flask now and love it for its simplicity. We&#8217;re using Flask for Close.io and are using several extensions (that we wrote and 3rd party). My team wrote <a href="https://github.com/elasticsales/flask-mongorest">Flask-Mongorest</a> which especially has made writing a MongoDB-backed JSON REST API super convenient.</p>
<p><a href="http://www.mongodb.org/">MongoDB</a> &#8211; I&#8217;ve learned a good bit about using MongoDB, and some of its best practices, as well as its gotchas.</p>
<p><strong>AWS</strong> &#8211; I&#8217;ve used several AWS services before 2012, but this past year led to much more significant experience using EC2, S3, RDS, Route 53, ELBs, etc. I&#8217;ve deployed several different services using both raw AWS as well as Heroku now, and love the flexibility and ease for creating scalable systems.</p>
<h4>Blogging</h4>
<p>I <a href="http://philfreo.com/blog/philfreo-com-v3-and-past-versions/">redesigned</a> my personal website/blog this year for the first time in 6 years! I also had 13 blogs posts this year, which is pretty good for me, as well as a <a href="http://techcrunch.com/2012/12/01/how-to-hire-a-full-stack-web-team/">guest post on TechCrunch</a>. Here are my 2012 blog posts:</p>
<ul>
<li><a href="http://philfreo.com/blog/two-years-at-quizlet/">Two Years at Quizlet</a></li>
<li><a href="http://philfreo.com/blog/why-is-this-so-hard-apple/">Why is this so hard… Apple</a></li>
<li><a href="http://philfreo.com/blog/how-to-upgrade-macports-to-os-x-10-8-mountain-lion/">How to upgrade MacPorts to OS X 10.8 Mountain Lion</a></li>
<li><a href="http://philfreo.com/blog/philfreo-com-v3-and-past-versions/">PhilFreo.com v3 (and past versions)</a></li>
<li><a href="http://philfreo.com/blog/uploading-static-assets-cssjs-to-s3-for-cloudfront-cdn/">Uploading static assets (CSS/JS) to S3 for CloudFront CDN</a></li>
<li><a href="http://philfreo.com/blog/objective-process-for-product-reviews/">Objective Process for Product Reviews</a></li>
<li><a href="http://philfreo.com/blog/stripe-ctf-2-0-web-security/">Stripe CTF 2.0 – Web Security</a></li>
<li><a href="http://philfreo.com/blog/quick-notes-from-startup-school-2012/">Quick notes from Startup School 2012</a></li>
<li><a href="http://philfreo.com/blog/mac-software-i-use/">Mac Software I Use</a></li>
<li><a href="http://philfreo.com/blog/launched-close-io-sales-communication-software/">Launched Close.io – sales communication software</a></li>
<li><a href="http://philfreo.com/blog/guest-post-on-techcrunch-full-stack-web-team/">Guest post on TechCrunch: Full-Stack Web Team</a></li>
<li><a href="http://philfreo.com/blog/how-to-allow-direct-file-uploads-from-javascript-to-amazon-s3-signed-by-python/">How to allow direct file uploads from JavaScript to Amazon S3 signed by Python</a></li>
<li><a href="http://philfreo.com/blog/how-to-unit-test-ajax-requests-with-qunit-and-sinon-js/">How to unit test AJAX Requests with QUnit and Sinon.JS</a></li>
<li><a href="http://philfreo.com/blog/manage-github-issues-milestones-in-trello/">Manage GitHub Issues milestones in Trello</a></li>
</ul>
<p>I&#8217;d like to do shoot for at least 13 posts in 2013 as well.</p>
<h4>Personal</h4>
<p>It was a big year for me. I started a new job at Elastic, started a life with Kristin after getting married on New Years Eve, moved to a new apartment in a new town, and started attending a new church! Let&#8217;s hope 2013 is as exciting!</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/end-of-2012-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Manage GitHub Issues milestones in Trello</title>
		<link>http://philfreo.com/blog/manage-github-issues-milestones-in-trello/</link>
		<comments>http://philfreo.com/blog/manage-github-issues-milestones-in-trello/#comments</comments>
		<pubDate>Wed, 19 Dec 2012 17:54:06 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[Product]]></category>
		<category><![CDATA[Product Managment]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=485</guid>
		<description><![CDATA[In doing product management on an engineering-led project, GitHub Issues rock. The killer features are that it&#8217;s a) really simple, b) tightly integrated with code (you can reference/close issues via commit messages), and c) facilitates discussion of issues just like it does of code. What GitHub Issues suck at is being able to get a [...]]]></description>
			<content:encoded><![CDATA[<p>In doing product management on an engineering-led project, GitHub Issues rock. The killer features are that it&#8217;s a) really simple, b) tightly integrated with code (you can reference/close issues via commit messages), and c) facilitates discussion of issues just like it does of code.</p>
<p>What GitHub Issues suck at is being able to get a high-level view, where you can see more than 30 issues at a time, and broken out by milestone or by person. (You can only filter to see issues for <em>one</em> milestone or <em>one </em>person, but not easily move multiple issues between them.)</p>
<p>I&#8217;d really like to see a Trello-style interface for managing GitHub Issues. Some very limited integrations exist, but what I&#8217;m looking for would let you <strong>quickly move issues around between milestones</strong>. This would help <strong>plan a product roadmap</strong> and be able to <strong>visualize what the upcoming milestones</strong> look like in one place.</p>
<p><span id="more-485"></span></p>
<p>The closest thing I&#8217;ve seen is <strong>Huboard</strong> (<a href="https://github.com/rauhryan/huboard">GitHub</a>, <a href="http://huboard.com/">site</a>, <a href="http://lostechies.com/ryanrauh/2012/01/13/huboard-github-issues-made-awesome/">blog post</a>), but it doesn&#8217;t <a href="https://github.com/rauhryan/huboard/issues/94">do milestones</a> currently [edit: now it does!].</p>
<p><strong>Zapier</strong> has <a href="https://zapier.com/zapbook/github/trello/">some existing hooks</a> for both GitHub Issues and Trello, but they seem to all be around creation, rather than a 2 way sync of moving around and editing. It&#8217;s possible that some improvements to the Zapier Apps would make the integration possible.</p>
<p>I&#8217;m thinking it would make a cool side project to use the <a href=" https://trello.com/docs/api/index.html">Trello API</a> and <a href="http://developer.github.com/v3/">GitHub API</a> to do this. Basically:</p>
<ul>
<li>Look for all GH issues from a repo with specific labels (whether that be &#8220;trello&#8221;, &#8220;feature&#8221;, etc.) &#8211; but on big projects you likely don&#8217;t want to see every little bug in Trello.</li>
<li>To &#8220;link&#8221; a Trello card to a GH Issue to allow 2-way sync, you could just use the GH Issue # in the card name, like &#8220;Add Twitter integration (#187)&#8221;, unless Trello support saving some custom source key field.</li>
<li>If new cards are created in Trello, their titles should get updated with the GH Issue #, once saved.</li>
<li>If new issues are created in GitHub, have them show up in the Trello board in the list corresponding to the milestone or else &#8220;No Milestone&#8221;.</li>
<li>Moving a card from one list to another should change the GH issue milestone, and vice versa.</li>
<li>Creating a new list in the board would create a new milestone. Same renaming strategy for milestones as we have for cards/issues.</li>
<li>2-way sync is always tricky and open to conflicts,  but we should be able to just take whichever action had a later updated date.</li>
</ul>
<div>Anyone have a better idea? Or something I&#8217;m missing?</div>
<p><small>For completeness, there are two other semi-related projects. <strong>Hubboard</strong> (<a href="https://github.com/rtyler/Hubboard">GitHub</a>, <a href="http://hubboard.herokuapp.com/">site</a>) seems inactive and also has the same limitation as Huboard. Also <strong>280 North</strong> has a very nice looking GitHub Issues viewer (<a href="http://githubissues.herokuapp.com/">site</a>, <a href="https://github.com/280north/issues">GitHub</a>, <a href="http://cappuccino.org/discuss/2010/05/13/github-issues-cappuccino-app-desktop-and-web/">blog post</a>) but it looks to be completely abandoned and no longer working.</small></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/manage-github-issues-milestones-in-trello/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>How to unit test AJAX Requests with QUnit and Sinon.JS</title>
		<link>http://philfreo.com/blog/how-to-unit-test-ajax-requests-with-qunit-and-sinon-js/</link>
		<comments>http://philfreo.com/blog/how-to-unit-test-ajax-requests-with-qunit-and-sinon-js/#comments</comments>
		<pubDate>Tue, 18 Dec 2012 06:02:35 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[backbone.js]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=472</guid>
		<description><![CDATA[We write QUnit tests for Close.io, a big Backbone.js app, to help avoid introducing bugs. Pretty quickly when testing front-end JavaScript code you&#8217;ll have to deal with how to test asynchronous callbacks and especially code related to AJAX/XHR requests and how their responses are handled. Here are some basic examples of how to use Sinon.JS [...]]]></description>
			<content:encoded><![CDATA[<p>We write <a href="http://qunitjs.com/">QUnit</a> tests for <a href="http://close.io/">Close.io</a>, a big Backbone.js app, to help avoid introducing bugs. Pretty quickly when testing front-end JavaScript code you&#8217;ll have to deal with how to test asynchronous callbacks and especially code related to AJAX/XHR requests and how their responses are handled. Here are some basic examples of how to use <a href="http://sinonjs.org/">Sinon.JS</a> to handle this.<br />
<span id="more-472"></span></p>
<p><strong>Mocking Responses</strong></p>
<p>Have some code that relies on an API response coming back that you want to test? Here&#8217;s an example of mocking out the HTTP response to test a Backbone.js Model#fetch() method.</p>
<p><script src="https://gist.github.com/4325280.js?file=mock_response.js"></script></p>
<p><strong>Testing Requests</strong></p>
<p>But what about testing the actual <strong>request</strong> side of things? A lot of basic tutorials leave this side of the XHR out. When dealing with complicated code it can be non-trivial to determine how the AJAX request is formed, so of course you should test it!</p>
<p>Here&#8217;s an example testing that a Backbone.js Model#save() method produces the HTTP request that&#8217;s expected. In the real world, the Model would be much less trivial. It relies on the <a href="http://sinonjs.org/docs/#server">useFakeXMLHttpRequest</a> feature of sinon.</p>
<p><script src="https://gist.github.com/4325280.js?file=test_request.js"></script></p>
<p>To get more advanced, you can learn about mocks, stubs, and spys in the <a href="http://sinonjs.org/docs/">Sinon.JS documentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/how-to-unit-test-ajax-requests-with-qunit-and-sinon-js/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to allow direct file uploads from JavaScript to Amazon S3 signed by Python</title>
		<link>http://philfreo.com/blog/how-to-allow-direct-file-uploads-from-javascript-to-amazon-s3-signed-by-python/</link>
		<comments>http://philfreo.com/blog/how-to-allow-direct-file-uploads-from-javascript-to-amazon-s3-signed-by-python/#comments</comments>
		<pubDate>Mon, 10 Dec 2012 17:25:00 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=461</guid>
		<description><![CDATA[On Close.io we originally implemented Filepicker.io to allow for file uploads while sending emails. While it was a quick way to get started with file uploading initially, after several minutes of downtime of their API and then an unannounced change in their JSON response format, I was reminded once again that you shouldn&#8217;t to rely on [...]]]></description>
			<content:encoded><![CDATA[<p>On <a href="http://close.io/">Close.io</a> we originally implemented <a href="https://www.filepicker.io/">Filepicker.io</a> to allow for file uploads while sending emails. While it was a quick way to get started with file uploading initially, after several minutes of downtime of their API and then an unannounced change in their JSON response format, I was reminded once again that <strong>you shouldn&#8217;t to rely on small startups for critical parts of your tech infrastructure</strong>.</p>
<p>There&#8217;s nothing wrong with filepicker.io if you want to use a lot of their features, but in our case we just needed to allow simple uploading of files to our own AWS S3 bucket. Here&#8217;s how:<br />
<span id="more-461"></span></p>
<p><strong>Setup S3 Bucket with CORS Policy</strong></p>
<p>Create an S3 bucket from the AWS Console (if you haven&#8217;t already). In its properties, click to Edit CORS Configuration:<br />
<script type="text/javascript" src="https://gist.github.com/philfreo/3843375.js?file=cors.xml"></script><br />
 This will allow cross-domain posting from the client.</p>
<p><strong>Setup an IAM user</strong><br />
 You can use your main AWS credentials, but I recommend generating keys with only the permissions that are necessary. In AWS, setup an IAM user with the following permissions policy.<br />
<script type="text/javascript" src="https://gist.github.com/philfreo/3843375.js?file=iam_policy.js"></script></p>
<p><strong>Add the JavaScript</strong><br />
First grab <a href="https://github.com/elasticsales/s3upload-coffee-javascript">the code</a> and then implement it on your site:<br />
<script type="text/javascript" src="https://gist.github.com/philfreo/3843375.js?file=client.js"></script></p>
<p><strong>Server endpoint for signing requests</strong><br />
To protect your AWS user credentials, we keep them on the server and then &#8220;sign&#8221; each upload right before sending it to S3. Here&#8217;s the endpoint in Python / Flask:<br />
<script type="text/javascript" src="https://gist.github.com/philfreo/3843375.js?file=view.py"></script></p>
<p>Here&#8217;s the <a href="https://gist.github.com/philfreo/3843375">gist with all the embedded code</a>.</p>
<p>&nbsp;</p>
<p>Thanks to CodeArtists for the <a href="http://codeartists.com/post/36892733572/how-to-directly-upload-files-to-amazon-s3-from-your">original tutorial</a>. I improved their code some and converted it to Python.</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/how-to-allow-direct-file-uploads-from-javascript-to-amazon-s3-signed-by-python/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Guest post on TechCrunch: Full-Stack Web Team</title>
		<link>http://philfreo.com/blog/guest-post-on-techcrunch-full-stack-web-team/</link>
		<comments>http://philfreo.com/blog/guest-post-on-techcrunch-full-stack-web-team/#comments</comments>
		<pubDate>Sat, 08 Dec 2012 19:19:55 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[Startups]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=456</guid>
		<description><![CDATA[I had my first guest post on TechCrunch last week! Here&#8217;s an excerpt: There is often confusion about the various roles of a web engineering team. I have had to explain, even to technical recruiters, the differences between these roles and that the lines that separate them are often fuzzy. I thought I’d share the [...]]]></description>
			<content:encoded><![CDATA[<p>I had my <a href="http://techcrunch.com/2012/12/01/how-to-hire-a-full-stack-web-team/">first guest post on TechCrunch</a> last week! Here&#8217;s an excerpt:</p>
<blockquote><p>There is often confusion about the various roles of a web engineering team. I have had to explain, even to technical recruiters, the differences between these roles and that the lines that separate them are often fuzzy. I thought I’d share the framework I like to use to evaluate whether someone is a good fit for a startup’s technical team.</p>
<p>In a startup, you can’t afford to have people who are only able to do one thing. Someone could be adept at writing HTML/CSS, but if they don’t have a great eye for design or know JavaScript well, it’s just not worth having them on the core team. Similarly, somebody who knows a little bit of everything but isn’t advanced in anything will just drag the team down.</p>
<p>The size of the company or startup will determine how many different hats each engineer must wear. Many startups get off the ground with a single founder who does a little bit of everything until he or she can grow the team. It’s also possible to outsource some roles completely. Just as cloud-hosting providers such as Amazon Web Services have drastically reduced the need for hardware/network engineers in web startups, platforms like Heroku take it further and (for a price) can reduce sysadmin and DevOps work almost entirely in the beginning.</p>
<p>In pretty much every case, when a startup grows, people will inevitably start specializing. Even those rare gems, who in the early days can spend the first half of the day in Photoshop and the second half scaling a database, will eventually specialize at least somewhat. If you’re hiring well, you’ll always find someone who can outperform you in at least one area.</p>
<p>I’m a big fan of “full stack” people and think specializing too much, too early, is a bad sign for startups. At Elastic, each of our engineers has written CSS and done database/server management. It’s good when a problem arises for there to be more than one person capable of fixing it. That said, I’m spending the bulk of my day writing in JavaScript/Backbone.js because I enjoy it much more than a coworker who’d rather be in Python as much as possible. That’s healthy and it works.</p></blockquote>
<p>You can read the rest <a href="http://techcrunch.com/2012/12/01/how-to-hire-a-full-stack-web-team/">over there</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/guest-post-on-techcrunch-full-stack-web-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Launched Close.io &#8211; sales communication software</title>
		<link>http://philfreo.com/blog/launched-close-io-sales-communication-software/</link>
		<comments>http://philfreo.com/blog/launched-close-io-sales-communication-software/#comments</comments>
		<pubDate>Sat, 01 Dec 2012 18:29:41 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Startups]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=451</guid>
		<description><![CDATA[I just launched a website for Close.io, the product we&#8217;ve been working on at Elastic for the past few months. Go check it out: http://close.io/ We&#8217;ve built this as &#8220;sales communication software&#8221;, which we believe didn&#8217;t really exist before. CRMs (salesforce.com, I&#8217;m looking at you!) are inadequate because they are more like databases of contacts than [...]]]></description>
			<content:encoded><![CDATA[<p>I just launched a website for Close.io, the product we&#8217;ve been working on at Elastic for the past few months.</p>
<p>Go check it out: <a href="http://close.io/">http://close.io/</a></p>
<p>We&#8217;ve built this as &#8220;sales communication software&#8221;, which we believe didn&#8217;t really exist before. CRMs (salesforce.com, I&#8217;m looking at you!) are inadequate because they are more like databases of contacts than software that really helps you <em>do the selling</em>. We&#8217;ve trying to change that by making your sales phone calling and sales emailing experience tightly coupled with your lead data (CRM).</p>
<p>Would love to hear any feedback you have about the product!</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/launched-close-io-sales-communication-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
