<?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/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Joel&#039;s Blog</title>
	<atom:link href="https://joelvanhorn.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://joelvanhorn.com</link>
	<description>A snapshot.</description>
	<lastBuildDate>Sun, 23 Feb 2020 09:13:53 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.3.21</generator>
<site xmlns="com-wordpress:feed-additions:1">11855402</site>	<item>
		<title>Developing Apps with Environment Variables</title>
		<link>https://joelvanhorn.com/2012/06/12/developing-apps-with-environment-variables/</link>
				<comments>https://joelvanhorn.com/2012/06/12/developing-apps-with-environment-variables/#comments</comments>
				<pubDate>Tue, 12 Jun 2012 08:59:16 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://joelvanhorn.com/?p=323</guid>
				<description><![CDATA[This post is mostly a reminder to myself about my setup to deal with environment variables when working on web applications. I develop in Ruby on OS X, to give you the gist of my setup. It wasn&#8217;t until I switched from ASP.NET and C# to Ruby that I started using Heroku. Heroku is awesome, [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>This post is mostly a reminder to myself about my setup to deal with environment variables when working on web applications. I develop in Ruby on OS X, to give you the gist of my setup.</p>
<p>It wasn&#8217;t until I switched from ASP.NET and C# to Ruby that I started using <a href="http://www.heroku.com" target="_blank" rel="noopener noreferrer">Heroku</a>. Heroku is awesome, but has its opinions of how apps should be setup. It was a little bit of a mental shift coming from Microsoft technologies, but I love it now.</p>
<h3>Importing &amp; Exporting Config Variables &#8211; The Heroku CLI</h3>
<p>Heroku wants you to store all credentials and other settings in environment variables. This allows you to modify credentials and such without affecting the code. It also makes sure that the code doesn&#8217;t have sensitive information in it when checked into <a href="http://en.wikipedia.org/wiki/Git_%28software%29" target="_blank" rel="noopener noreferrer">git</a>.</p>
<p><a href="https://devcenter.heroku.com/articles/heroku-command" target="_blank" rel="noopener noreferrer">Heroku&#8217;s command line utility</a> lets you easily list and update environment variables on Heroku. However, it&#8217;s not very easy to get those environment variables loaded when developing on your local machine. There&#8217;s a plugin for Heroku&#8217;s command line utility that lets you export environment variables to a &#8220;.env&#8221; file. <a href="https://github.com/joelvh/heroku-config" target="_blank" rel="noopener noreferrer">I&#8217;ve created a modified version of the plugin</a> that lets you specify separate files for each environment (e.g. development.env, staging.env, production.env). These files can be modified and pushed back to Heroku easily.</p>
<h3>Loading Environment Variables &#8211; Using Foreman</h3>
<p>Now that we can manage the environment variables on Heroku, how do we use them locally? Well, that&#8217;s what <a href="https://github.com/ddollar/foreman" target="_blank" rel="noopener noreferrer">Foreman</a> is for. It was created by <a href="http://daviddollar.org/" target="_blank" rel="noopener noreferrer">David Dollar</a>, along with the original Heroku CLI plugin that I <a href="https://github.com/joelvh/heroku-config" target="_blank" rel="noopener noreferrer">tweaked</a>. The beautiful thing is that Foreman uses the same &#8220;.env&#8221; files and lets you specify the filename to load.</p>
<p>A quick step back: Foreman lets you easily start up multiple processes required to run your web app. You can specify what processes to start in a Procfile, which is the basis for Heroku web apps.</p>
<p>Now, you can just run a command such as &#8220;foreman start&#8221; and it will load up the Procfile in the current directory. You can also specify your environment variables to load such as &#8220;foreman start -e development.env&#8221;. Your Procfile might simply have &#8220;web: rails s&#8221; in it, so Foreman just runs that command with environment variables automatically loaded from your file.</p>
<p>The latest piece of the puzzle I put together was to get the environment variables loaded when I wanted to use the Rails console. Foreman has a nice little hidden command which is &#8220;foreman run&#8221;. The latest version as of a day or two ago lets you use your &#8220;.env&#8221; file. All you have to do is run &#8220;foreman run -e development.env rails c&#8221; and you&#8217;re good to go!</p>
<h3>Simplifying Your Development Environment &#8211; Use Shortcuts!</h3>
<p>Last but not least, I created some shell functions that really easily let me run any command with my environment variables loaded. Additionally, I wrap my command in &#8220;bundle exec&#8221; where appropriate to make sure the proper gems are loaded when running my command. Here they are:</p>
<pre><code class="language-bash">function dev() {
  if [[ -f Gemfile &amp;&amp; $@ != bundle* ]]; then
    foreman run -e development.env bundle exec $@ ;
  else
    foreman run -e development.env $@;
  fi;
}
</code></pre>
<pre><code class="language-bash">function prod() {
  if [[ -f Gemfile &amp;&amp; $@ != bundle* ]]; then
    foreman run -e production.env bundle exec $@ ;
  else
    foreman run -e production.env $@;
  fi;
}
</code></pre>
<pre><code class="language-bash">function stage() {
  if [[ -f Gemfile &amp;&amp; $@ != bundle* ]]; then
    foreman run -e staging.env bundle exec $@ ;
  else
    foreman run -e staging.env $@;
  fi;
}
</code></pre>
<p>All you have to do now is prefix any command with &#8220;dev&#8221;, &#8220;prod&#8221;, or &#8220;stage&#8221; to run the command with those environment variables. For example, I&#8217;m constantly running &#8220;dev rails c&#8221; and everything works flawlessly!</p>
<h3>Update: Using Environment Variables in Your Gemfile on Heroku</h3>
<p>I am hosting some private gems via git and to access them Rails needs a username and password. By now, you know where the credentials are stored. However, Heroku does not load environment variables when building the slug. To enable this, you need to install a <a href="https://devcenter.heroku.com/articles/labs-user-env-compile" target="_blank" rel="noopener noreferrer">Heroku &#8220;labs&#8221; plugin</a> by running this command:</p>
<pre>heroku labs:enable user_env_compile -a myapp</pre>
<p>Hopefully all my bases are now covered&#8230;..</p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2012/06/12/developing-apps-with-environment-variables/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">323</post-id>	</item>
		<item>
		<title>Pre-populating Shopify Checkout Forms and Other Undocumented Functionality</title>
		<link>https://joelvanhorn.com/2012/03/24/pre-filling-shopify-checkout-forms/</link>
				<comments>https://joelvanhorn.com/2012/03/24/pre-filling-shopify-checkout-forms/#comments</comments>
				<pubDate>Sat, 24 Mar 2012 20:22:44 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[mechanize]]></category>
		<category><![CDATA[shopify]]></category>

		<guid isPermaLink="false">http://joelvanhorn.com/?p=292</guid>
				<description><![CDATA[We&#8217;ve been using Shopify at ThankLab and chose them because they&#8217;re a hosted solution and have a simple API. However, we quickly uncovered many limitations that required us to come up with workarounds. Some of the issues we had to resolve were a result of integrating Shopify into a third-party website with existing user accounts. [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>We&#8217;ve been using <a title="Shopify" href="http://shopify.com" target="_blank" rel="noopener noreferrer">Shopify</a> at <a title="ThankLab" href="http://thanklab.com" target="_blank" rel="noopener noreferrer">ThankLab</a> and chose them because they&#8217;re a hosted solution and have a simple API. However, we quickly uncovered many limitations that required us to come up with workarounds. Some of the issues we had to resolve were a result of integrating Shopify into a third-party website with existing user accounts.</p>
<p>As we dug into documentation on the official Shopify wiki and blog, it became clear that many of the solutions they provide are their own hacks around limitations many customers have run into. This realization was double-edged: Shopify clearly encourages hacking on their platform, but many capabilities or &#8220;features&#8221; are not really baked into their core product. In the end (frustrations aside), the challenge of making Shopify work for us became an exercise in creativity.</p>
<h3>Seamlessly integrating third-party user accounts with Shopify checkout</h3>
<p>Our users login to our website and checkout on Shopify. Shopify has these 3 options at checkout:</p>
<p style="text-align: center;"><a href="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.22.24-PM.png?ssl=1"><img data-attachment-id="307" data-permalink="https://joelvanhorn.com/2012/03/24/pre-filling-shopify-checkout-forms/screen-shot-2012-03-24-at-2-22-24-pm/" data-orig-file="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.22.24-PM.png?fit=789%2C195&amp;ssl=1" data-orig-size="789,195" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Shopify checkout options" data-image-description="" data-medium-file="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.22.24-PM.png?fit=300%2C74&amp;ssl=1" data-large-file="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.22.24-PM.png?fit=580%2C143&amp;ssl=1" class="aligncenter  wp-image-307" title="Shopify checkout options" src="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.22.24-PM.png?resize=552%2C137&#038;ssl=1" alt="Shopify checkout options" width="552" height="137" srcset="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.22.24-PM.png?w=789&amp;ssl=1 789w, https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.22.24-PM.png?resize=300%2C74&amp;ssl=1 300w, https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.22.24-PM.png?resize=768%2C190&amp;ssl=1 768w" sizes="(max-width: 552px) 100vw, 552px" data-recalc-dims="1" /></a></p>
<ul>
<li>Guest checkout &#8211; requires the customer to enter their email address</li>
<li>Customer login only &#8211; requires email and password to login, however each customer needs to be manually invited via email to create passwords for their account</li>
</ul>
<p><em><strong>Goal:</strong> pre-fill email address on guest checkout page (and hide email field)</em></p>
<p><em><strong>Shopify limitations:</strong> Checkout page has a unique URL (is not known ahead of time), does not accept query string parameters to pre-fill form fields, and only allows you to customize CSS.</em></p>
<h4>Get the Shopify checkout URL ahead of time</h4>
<p>I kinda lied there a little bit. The checkout page CAN be determined ahead of time, but because the URL has a random looking token in it, it isn&#8217;t immediately evident. Here&#8217;s an example of my cart on the <a href="http://store.penny-arcade.com/">Penny Arcade</a> store:</p>
<p style="text-align: center;"><a href="https://i1.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.13.31-PM.png?ssl=1"><img data-attachment-id="301" data-permalink="https://joelvanhorn.com/2012/03/24/pre-filling-shopify-checkout-forms/screen-shot-2012-03-24-at-2-13-31-pm/" data-orig-file="https://i1.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.13.31-PM.png?fit=774%2C172&amp;ssl=1" data-orig-size="774,172" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Shopify checkout URL" data-image-description="" data-medium-file="https://i1.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.13.31-PM.png?fit=300%2C67&amp;ssl=1" data-large-file="https://i1.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.13.31-PM.png?fit=580%2C129&amp;ssl=1" class="aligncenter  wp-image-301" title="Shopify checkout URL" src="https://i1.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.13.31-PM.png?resize=542%2C120&#038;ssl=1" alt="Shopify checkout URL" width="542" height="120" srcset="https://i1.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.13.31-PM.png?w=774&amp;ssl=1 774w, https://i1.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.13.31-PM.png?resize=300%2C67&amp;ssl=1 300w, https://i1.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.13.31-PM.png?resize=768%2C171&amp;ssl=1 768w" sizes="(max-width: 542px) 100vw, 542px" data-recalc-dims="1" /></a></p>
<pre></pre>
<p>As it turns out, the ID in the URL is <strong>your shop ID</strong> (429942) and is always the same for all customers. The 32-character ID (c813f407436dc8cdda0c50d58e6d5e96) is your <strong>cart token</strong>, which is stored in a cookie called &#8220;cart&#8221;. To get the checkout URL for each customer, you&#8217;ll have to use JavaScript:</p>
<ol>
<li>Get your shop ID from your checkout page URL (simply click &#8220;checkout&#8221; in your shop)</li>
<li>Create a JavaScript function that can read the &#8220;cart&#8221; cookie (<a href="http://www.quirksmode.org/js/cookies.html#script" target="_blank" rel="noopener noreferrer">here&#8217;s some code you can use</a>)</li>
<li>Create a JavaScript function that combines everything into a proper URL and do something with it</li>
</ol>
<p>After combining these steps, you might have some JavaScript code that looks something like this:</p>
<pre>var shop_id = "429942";
var checkout_url = "https://checkout.shopify.com/carts/" + shop_id + "/" + readCookie("cart");</pre>
<p>We will use this URL to add some parameters to pre-fill the checkout form. <a href="https://github.com/joelvh/shopify_hacks" target="_blank" rel="noopener noreferrer">Download my example script (shopify_hacks.js) from Github.</a></p>
<h4>Pre-filling the Shopify checkout form</h4>
<p>We are now able to determine the Shopify checkout URL ahead of time, but need to pre-fill the form. If you&#8217;re familiar with <a title="Ruby on Rails" href="http://rubyonrails.org/" target="_blank" rel="noopener noreferrer">Ruby on Rails</a> or web development frameworks in general, you know that you can typically take the names of form fields and add them to the URL as query string values. Those values are then pre-populated in forms that have fields matching those parameters.</p>
<p>In the case of the checkout form, if you view the HTML source of the page in your browser and find the &#8220;input&#8221; tags, you&#8217;ll find the field for the email address on guest checkout. The name is &#8220;order[email]&#8221;. Now, when you add that name as a query string value, the checkout URL looks like this:</p>
<p style="text-align: center;"><a href="https://i2.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.18.05-PM.png?ssl=1"><img data-attachment-id="304" data-permalink="https://joelvanhorn.com/2012/03/24/pre-filling-shopify-checkout-forms/screen-shot-2012-03-24-at-2-18-05-pm/" data-orig-file="https://i2.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.18.05-PM.png?fit=937%2C273&amp;ssl=1" data-orig-size="937,273" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Shopify checkout URL with email parameter" data-image-description="" data-medium-file="https://i2.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.18.05-PM.png?fit=300%2C87&amp;ssl=1" data-large-file="https://i2.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.18.05-PM.png?fit=580%2C169&amp;ssl=1" class="aligncenter  wp-image-304" title="Shopify checkout URL with email parameter" src="https://i2.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.18.05-PM.png?resize=525%2C153&#038;ssl=1" alt="Shopify checkout URL with email parameter" width="525" height="153" srcset="https://i2.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.18.05-PM.png?w=937&amp;ssl=1 937w, https://i2.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.18.05-PM.png?resize=300%2C87&amp;ssl=1 300w, https://i2.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.18.05-PM.png?resize=768%2C224&amp;ssl=1 768w" sizes="(max-width: 525px) 100vw, 525px" data-recalc-dims="1" /></a></p>
<p>Unfortunately this didn&#8217;t work. The email address is still blank. However, if you submit the form with invalid information (e.g. blank email address), you&#8217;ll notice that the cart URL changes. The URL now ends in &#8220;create_order&#8221;:</p>
<p style="text-align: center;"><a href="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.29.16-PM.png?ssl=1"><img data-attachment-id="306" data-permalink="https://joelvanhorn.com/2012/03/24/pre-filling-shopify-checkout-forms/screen-shot-2012-03-24-at-2-29-16-pm/" data-orig-file="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.29.16-PM.png?fit=939%2C200&amp;ssl=1" data-orig-size="939,200" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Shopify checkout URL for populating form fields" data-image-description="" data-medium-file="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.29.16-PM.png?fit=300%2C64&amp;ssl=1" data-large-file="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.29.16-PM.png?fit=580%2C124&amp;ssl=1" class="aligncenter  wp-image-306" title="Shopify checkout URL for populating form fields" src="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.29.16-PM.png?resize=563%2C120&#038;ssl=1" alt="Shopify checkout URL for populating form fields" width="563" height="120" srcset="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.29.16-PM.png?w=939&amp;ssl=1 939w, https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.29.16-PM.png?resize=300%2C64&amp;ssl=1 300w, https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/03/Screen-Shot-2012-03-24-at-2.29.16-PM.png?resize=768%2C164&amp;ssl=1 768w" sizes="(max-width: 563px) 100vw, 563px" data-recalc-dims="1" /></a></p>
<p> Now you can see that my email address is pre-populated in the form. You can pre-populate all form fields if you wish. In our case we are only pre-populating the email field and using CSS to hide the table row. This effectively lets our users checkout without re-entering the email address we already know.<br />
<a name="mechanize"></a></p>
<h4>Alternatively, use Mechanize to automate creating Shopify customer accounts with passwords</h4>
<p><em><strong>Goal:</strong> Create Shopify customer logins linked to third-party user database</em></p>
<p><em><strong>Shopify limitation:</strong> Shopify customer logins can only be created by inviting a customer (manually) via email, at which point customers can create a password.</em></p>
<p>Originally wanted to create a Shopify customer account for each user in our third-party database, but Shopify doesn&#8217;t let you create customer accounts through the API. For some reason the only way to create a Shopify customer account is to manually &#8220;invite&#8221; the user via email, which sends them a link to create a password. We ended up automating this process using <a title="Mechanize" href="http://mechanize.rubyforge.org/" target="_blank" rel="noopener noreferrer">Mechanize</a>:</p>
<ol>
<li><a href="http://api.shopify.com/customer.html" target="_blank" rel="noopener noreferrer">Create a Shopify customer using the API</a></li>
<li>Create a Shopify administrator account that only has access to Customers</li>
<li>Mechanize logs in to shop admin with administrator account</li>
<li>Mechanize retrieves the invite link for a customer</li>
<li>Mechanize visits the invite link and fills out the form to create a password</li>
</ol>
<p>Pretty simple. However, we felt that this was less reliable than the guest checkout method. This process would also sometimes take up to 7 seconds to complete, and we decided it would add more complexity to our application to deal with this latency, as well as making sure that our users would be logged in to their Shopify accounts behind the scenes reliably (read: posting their Shopify username and password to the login form on Shopify in a hidden iframe).</p>
<p><a href="https://github.com/joelvh/shopify_hacks" target="_blank" rel="noopener noreferrer">Download the mechanize script (mechanize_activate_customer_login.rb) from Github.</a> It&#8217;s a Ruby script that you can run from the command line. It accepts several arguments and outputs how long each step takes. Make sure to install the Mechanize gem before running the script.</p>
<h3>Some other convenient undocumented Shopify functionality discovered</h3>
<p>We actually have our own custom cart on a website separate from Shopify. So, when users click the &#8220;checkout&#8221; button, we need to &#8220;copy&#8221; the items we have in our cart to the Shopify cart. To do this, we first need to clear their existing Shopify cart and then post all items to Shopify.</p>
<h4>Redirect after clearing Shopify cart</h4>
<p>To clear a Shopify cart, you visit the &#8220;/cart/clear&#8221; page. After the cart is cleared, it automatically redirects you back to the empty cart page:</p>
<pre>http://store.penny-arcade.com/cart/clear</pre>
<p>However, if you want to send your user to a page of your choosing, all you have to do is add that page to the URL as a &#8220;return_to&#8221; parameter:</p>
<pre>http://store.penny-arcade.com/cart/clear<strong>?return_to=</strong>https://joelvanhorn.com</pre>
<p>This parameter is documented for adding products to the cart, but not any other pages. Presumably, you can add the &#8220;return_to&#8221; parameter to more pages that perform actions within Shopify.</p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2012/03/24/pre-filling-shopify-checkout-forms/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">292</post-id>	</item>
		<item>
		<title>Easily Transform JSON with json2json</title>
		<link>https://joelvanhorn.com/2012/01/05/easily-reformat-json-with-json2json/</link>
				<comments>https://joelvanhorn.com/2012/01/05/easily-reformat-json-with-json2json/#comments</comments>
				<pubDate>Thu, 05 Jan 2012 11:00:41 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://joelvanhorn.com/?p=277</guid>
				<description><![CDATA[I have been working on an auto-complete web service that searches Amazon&#8217;s Product Advertising API. &#160;I built it in Node.js and using the APAC package made it really easy to query the API.&#160;The only thing that was extremely impractical was the JSON data returned by APAC. Since Amazon&#8217;s API only returns data as XML, APAC [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>I have been working on an auto-complete web service that searches Amazon&#8217;s <a href="http://aws.amazon.com/associates/" target="_blank" rel="noopener noreferrer">Product Advertising API</a>. &nbsp;I built it in <a href="http://nodejs.org/" target="_blank" rel="noopener noreferrer">Node.js</a> and using the <a href="https://github.com/joelvh/node-apac" target="_blank" rel="noopener noreferrer">APAC package</a> made it really easy to query the API.&nbsp;The only thing that was extremely impractical was the JSON data returned by APAC.</p>
<p>Since Amazon&#8217;s API only returns data as XML, APAC uses <a href="https://github.com/buglabs/node-xml2json" target="_blank" rel="noopener noreferrer">xml2json</a> to convert the XML to JSON. Unfortunately the resulting JSON is <a href="https://github.com/joelvh/json2json/blob/master/example/original.json" target="_blank" rel="noopener noreferrer">quite ugly</a>. I wanted to be able to choose the data I needed and copy it to a <a href="https://github.com/joelvh/json2json/blob/master/example/transformed.json" target="_blank" rel="noopener noreferrer">new, clean JSON format</a>. My solution was to create <a href="https://github.com/joelvh/json2json" target="_blank" rel="noopener noreferrer">json2json</a>.</p>
<p style="text-align: center;"><a href="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/01/transmogrifier.gif?ssl=1"><img data-attachment-id="278" data-permalink="https://joelvanhorn.com/2012/01/05/easily-reformat-json-with-json2json/transmogrifier/" data-orig-file="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/01/transmogrifier.gif?fit=234%2C300&amp;ssl=1" data-orig-size="234,300" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Transmogrifier" data-image-description="" data-medium-file="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/01/transmogrifier.gif?fit=234%2C300&amp;ssl=1" data-large-file="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/01/transmogrifier.gif?fit=234%2C300&amp;ssl=1" class="size-full wp-image-278 alignright" title="Transmogrifier" src="https://i0.wp.com/joelvanhorn.com/wp-content/uploads/2012/01/transmogrifier.gif?resize=234%2C300&#038;ssl=1" alt="" width="234" height="300"  data-recalc-dims="1"></a></p>
<p><strong>json2json</strong> lets you create a template that describes how to transform the original JSON to a new structure. I wrote the Node.js <a href="http://search.npmjs.org/#/json2json" target="_blank" rel="noopener noreferrer">package</a> and <a href="https://github.com/joelvh/json2json/blob/master/example/template.coffee" target="_blank" rel="noopener noreferrer">example template</a> in <a href="http://coffeescript.org/" target="_blank" rel="noopener noreferrer">CoffeeScript</a> because it has a much cleaner and simpler syntax than JavaScript. However, it is extremely simple to convert to JavaScript (<a href="http://coffeescript.org/" target="_blank" rel="noopener noreferrer">click on &#8220;Try CoffeeScript&#8221;</a>) and can easily be modified for use in a browser.&nbsp;Check out the (crude) <a href="https://github.com/joelvh/json2json" target="_blank" rel="noopener noreferrer">documentation</a> and <a href="https://github.com/joelvh/json2json/tree/master/example" target="_blank" rel="noopener noreferrer">example files</a> and let me know what you think.</p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2012/01/05/easily-reformat-json-with-json2json/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">277</post-id>	</item>
		<item>
		<title>FBAPI.js: Facebook JavaScript SDK Simplified</title>
		<link>https://joelvanhorn.com/2011/12/17/fbapi-js-facebook-javascript-sdk-simplified/</link>
				<comments>https://joelvanhorn.com/2011/12/17/fbapi-js-facebook-javascript-sdk-simplified/#respond</comments>
				<pubDate>Sat, 17 Dec 2011 17:01:01 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[FBAPI.js]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://joelvanhorn.com/?p=259</guid>
				<description><![CDATA[I&#8217;ve been working on Rembly using several javascript libraries: Spine.js, Mustache.js, ICanHaz.js, and Facebook&#8217;s JavaScript SDK. These have made application development easier, but not always easy enough! I wrote previously about my enhancements to ICanHaz.js for loading Mustache templates. This time around, I wanted to use Facebook&#8217;s JavaScript SDK with less &#8220;overhead&#8221; and a simplified [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>I&#8217;ve been working on <a title="Rembly" href="http://rembly.com" target="_blank" rel="noopener noreferrer">Rembly</a> using several javascript libraries: <a title="Spine.js" href="http://spinejs.com/" target="_blank" rel="noopener noreferrer">Spine.js</a>, <a title="Mustache" href="http://mustache.github.com/" target="_blank" rel="noopener noreferrer">Mustache.js</a>, <a title="ICanHaz.js on Github" href="https://github.com/joelvh/ICanHaz.js" target="_blank" rel="noopener noreferrer">ICanHaz.js</a>, and <a title="Facebook's JavaScript SDK" href="https://developers.facebook.com/docs/reference/javascript/" target="_blank" rel="noopener noreferrer">Facebook&#8217;s JavaScript SDK</a>. These have made application development easier, but not always easy enough! I wrote previously about <a href="/2011/12/05/a-super-charged-version-of-icanhaz-js/">my enhancements to ICanHaz.js</a> for loading Mustache templates. This time around, I wanted to use Facebook&#8217;s JavaScript SDK with less &#8220;overhead&#8221; and a simplified API.</p>
<p>I created <strong><a title="FBAPI.js" href="https://github.com/joelvh/FBAPI.js" target="_blank" rel="noopener noreferrer">FBAPI.js</a></strong> to handle the setup requirements that Facebook&#8217;s SDK requires, such as adding a &#8220;root&#8221; tag to the page before loading the SDK. Now FBAPI.js takes care of all the SDK requirements and lets you use the <a title="Facebook's Graph API" href="https://developers.facebook.com/docs/reference/api/" target="_blank" rel="noopener noreferrer">Graph API</a> without worrying about the overhead. FBAPI.js adds helper methods for event binding and retrieving user data.  However, the best part of FBAPI.js is that you don&#8217;t have to wait for the page or javascript dependencies to be loaded before you can start using it! All methods use <a title="Promises" href="http://en.wikipedia.org/wiki/Futures_and_promises" target="_blank" rel="noopener noreferrer">promises</a> and <a title="Callbacks" href="http://en.wikipedia.org/wiki/Callback_(computer_programming)" target="_blank" rel="noopener noreferrer">callbacks</a>. This lets you run your scripts in any order you want!</p>
<p>Check out the <a title="FBAPI.js on Github" href="https://github.com/joelvh/FBAPI.js" target="_blank" rel="noopener noreferrer">Github repository</a> and let me know what you think!</p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2011/12/17/fbapi-js-facebook-javascript-sdk-simplified/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">259</post-id>	</item>
		<item>
		<title>Easily Overload JavaScript Functions with Optional Parameters</title>
		<link>https://joelvanhorn.com/2011/12/12/easily-overload-javascript-functions-with-optional-parameters/</link>
				<comments>https://joelvanhorn.com/2011/12/12/easily-overload-javascript-functions-with-optional-parameters/#respond</comments>
				<pubDate>Tue, 13 Dec 2011 04:04:42 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Sysmo.js]]></category>

		<guid isPermaLink="false">http://joelvanhorn.com/?p=267</guid>
				<description><![CDATA[I just answered a Stack Overflow question from a couple years ago titled &#8220;Handling optional parameters in javascript&#8221; and figured I&#8217;d write about my solution here. I&#8217;ll start by saying that the easiest way to handle optional parameters in javascript is to use an &#8220;options&#8221; object that allows a function to be called with as many [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>I just answered a <a title="Stack Overflow" href="http://joelvh.com/spwMGV" target="_blank" rel="noopener noreferrer">Stack Overflow</a> question from a couple years ago titled &#8220;<a title="Stack Overflow" href="http://joelvh.com/spwMGV" target="_blank" rel="noopener noreferrer">Handling optional parameters in javascript</a>&#8221; and figured I&#8217;d write about my solution here.</p>
<p>I&#8217;ll start by saying that the easiest way to handle optional parameters in javascript is to use an &#8220;options&#8221; object that allows a function to be called with as many or as few parameters (arguments) as you wish.</p>
<pre>function displayOverlay(options) {
  if (options.alert) { 
    alert(options.message); 
  }
}</pre>
<p>However, if you need to use individual parameters, i&#8217;ve created a utility that acts as a proxy and lets you strongly type values.  It looks like this:</p>
<pre>function displayOverlay(/*message, timeout, callback*/) {
  return proxy(arguments, String, Number, Function,
    function(message, timeout, callback) {
      /* ... your code ... */
    });
};</pre>
<p>I call my proxy <a title="GitHub" href="http://joelvh.com/ulKNgr" target="_blank" rel="noopener noreferrer">arrangeArgs()</a>. Here&#8217;s a clearer explanation of what&#8217;s going on:</p>
<pre>function displayOverlay(/*message, timeout, callback*/) {
  //arrangeArgs is the proxy
  return arrangeArgs(
           //first pass in the original arguments
           arguments,
           //then pass in the type for each argument
           String,  Number,  Function,
           //lastly, pass in your function and the proxy will do the rest!
           function(message, timeout, callback) {

             //debug output of each argument to verify it's working
             console.log("message", message, "timeout", timeout, "callback", callback);

             /* ... your code ... */

           }
         );
};</pre>
<p>I created the <a title="GitHub" href="http://joelvh.com/ulKNgr" target="_blank" rel="noopener noreferrer">arrangeArgs()</a> proxy to handle optional parameters for you.  It works nicely.  The code is in my <a title="GitHub" href="http://joelvh.com/ulKNgr" target="_blank" rel="noopener noreferrer">Sysmo.js utility library on GitHub</a>. Let me know what you think!</p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2011/12/12/easily-overload-javascript-functions-with-optional-parameters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">267</post-id>	</item>
		<item>
		<title>A Super-Charged Version of ICanHaz.js</title>
		<link>https://joelvanhorn.com/2011/12/05/a-super-charged-version-of-icanhaz-js/</link>
				<comments>https://joelvanhorn.com/2011/12/05/a-super-charged-version-of-icanhaz-js/#comments</comments>
				<pubDate>Mon, 05 Dec 2011 16:36:41 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rembly]]></category>
		<category><![CDATA[Templates]]></category>

		<guid isPermaLink="false">http://joelvanhorn.com/?p=251</guid>
				<description><![CDATA[I&#8217;ve been working on Rembly, which uses Spine.js as the core piece that ties all the functionality together.  I decided to use Mustache.js for my HTML templates.  And finally, I chose ICanHaz.js as a simple and lightweight way of managing my HTML templates. Although ICanHaz.js is a great start, managing my HTML templates became unwieldy because [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>I&#8217;ve been working on <a title="Rembly" href="http://www.rembly.com" target="_blank" rel="noopener noreferrer">Rembly</a>, which uses <a title="Spine.js" href="http://maccman.github.com/spine/" target="_blank" rel="noopener noreferrer">Spine.js</a> as the core piece that ties all the functionality together.  I decided to use <a title="Mustache.js" href="http://mustache.github.com/" target="_blank" rel="noopener noreferrer">Mustache.js</a> for my HTML templates.  And finally, I chose <a title="ICanHaz.js" href="http://icanhazjs.com/" target="_blank" rel="noopener noreferrer">ICanHaz.js</a> as a simple and lightweight way of managing my HTML templates.</p>
<p>Although ICanHaz.js is a great start, managing my HTML templates became unwieldy because I started having little templates everywhere.  Each part of a page that is dynamically updated needs to be broken out into its own template.  When you&#8217;ve broken a web page into small parts, it&#8217;s hard to keep track of what it looks like when put back together.  It also becomes hard to create the correct CSS styles when you lose track of the HTML hierarchy.</p>
<p>This lead me to enhance ICanHaz.js with a ton of new features.  The primary one being nested templates, which allowed me to keep my full HTML page template in tact, while designating specific HTML tags as &#8220;sub templates&#8221; or partials. You can also specify additional templates to load and replace script &#8220;include&#8221; tags with the loaded HTML.</p>
<p>Check out <a title="Fork of ICanHaz.js on Github" href="https://github.com/joelvh/ICanHaz.js" target="_blank" rel="noopener noreferrer">my fork on Github</a> for more information about how to use <a title="ICanHaz.js fork on Github" href="https://github.com/joelvh/ICanHaz.js/" target="_blank" rel="noopener noreferrer">my enhanced version if ICanHaz.js</a>. Make sure to <a title="Javascript comments" href="https://github.com/joelvh/ICanHaz.js/blob/master/ICanHaz.js#L47" target="_blank" rel="noopener noreferrer">look at the javascript comments</a> for details. And let me know what you think.</p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2011/12/05/a-super-charged-version-of-icanhaz-js/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">251</post-id>	</item>
		<item>
		<title>Announcing the ThreatSim Beta</title>
		<link>https://joelvanhorn.com/2011/06/15/announcing-the-threatsim-beta/</link>
				<comments>https://joelvanhorn.com/2011/06/15/announcing-the-threatsim-beta/#respond</comments>
				<pubDate>Wed, 15 Jun 2011 12:46:55 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://joelvanhorn.com/?p=248</guid>
				<description><![CDATA[I&#8217;ve been working with Stratum Security for the past couple of months on ThreatSim (@ThreatSim), which we are happy to announce to the world today!  ThreatSim is a web-based phishing attack simulator to help companies assess how vulnerable their network and internal assets may be to phishing attacks.  Not only does ThreatSim track who is [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>I&#8217;ve been working with <a href="http://www.stratumsecurity.com" target="_blank" rel="noopener noreferrer">Stratum Security</a> for the past couple of months on <a href="http://threatsim.com" target="_blank" rel="noopener noreferrer">ThreatSim</a> (<a href="http://twitter.com/threatsim" target="_blank" rel="noopener noreferrer">@ThreatSim</a>), which we are happy to announce to the world today!  ThreatSim is a web-based phishing attack simulator to help companies assess how vulnerable their network and internal assets may be to phishing attacks.  Not only does ThreatSim track who is clicking on phishing emails, but we&#8217;re also making an exfiltration agent available, which simulates transmitting sensitive data from the local network out to the internet.</p>
<p>Check out the website at <a href="http://www.threatsim.com" target="_blank" rel="noopener noreferrer">www.ThreatSim.com</a>, follow us at <a href="http://twitter.com/threatsim" target="_blank" rel="noopener noreferrer">@ThreatSim</a>, and check out the conversation on <a href="http://news.ycombinator.com/item?id=2657804" target="_blank" rel="noopener noreferrer">Hacker News</a>.</p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2011/06/15/announcing-the-threatsim-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">248</post-id>	</item>
		<item>
		<title>Draw Happy</title>
		<link>https://joelvanhorn.com/2011/05/18/draw-happy/</link>
				<comments>https://joelvanhorn.com/2011/05/18/draw-happy/#respond</comments>
				<pubDate>Wed, 18 May 2011 21:59:31 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Creativity]]></category>
		<category><![CDATA[Mood]]></category>

		<guid isPermaLink="false">http://twopointyou.com/?p=52</guid>
				<description><![CDATA[Draw what makes you happy?&#160; What a great idea. &#160;Happiness is redefined by everyone who experiences it. &#160;To define happiness can be as simple as expressing what gives you joy. &#160;Think about what makes you happy and draw it! Draw &#8220;happy.&#8221; &#160;Join the global art project at Draw Happy and share your happiness with the [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Draw what makes you happy?&nbsp; What a great idea. &nbsp;Happiness is redefined by everyone who experiences it. &nbsp;To define happiness can be as simple as expressing what gives you joy. &nbsp;Think about what makes you happy and draw it!</p>
<p>Draw &#8220;happy.&#8221; &nbsp;Join the global art project at <a href="http://drawhappy.wordpress.com/" target="_blank" rel="noopener noreferrer">Draw Happy</a> and share your happiness with the world. &nbsp;Don&#8217;t know what makes you happy? &nbsp;I guarantee the creative expressions at <a href="http://drawhappy.wordpress.com/" target="_blank" rel="noopener noreferrer">Draw Happy</a> will remind you and hopefully bring a smile to your face.</p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2011/05/18/draw-happy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">373</post-id>	</item>
		<item>
		<title>Play!</title>
		<link>https://joelvanhorn.com/2011/05/15/play/</link>
				<comments>https://joelvanhorn.com/2011/05/15/play/#respond</comments>
				<pubDate>Sun, 15 May 2011 12:13:20 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Creativity]]></category>

		<guid isPermaLink="false">http://twopointyou.com/?p=48</guid>
				<description><![CDATA[So many innovative ideas come about by accident. &#160;They come about by experimenting and being creative in your own unique ways. &#160;Just playing around with ideas can lead to exciting new discoveries. &#160;Schools don&#8217;t teach us to play. &#160;They don&#8217;t encourage us to explore. &#160;They don&#8217;t even really prepare us for tomorrow, but rather prepare [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>So many innovative ideas come about by accident. &nbsp;They come about by experimenting and being creative in your own unique ways. &nbsp;Just playing around with ideas can lead to exciting new discoveries. &nbsp;Schools don&#8217;t teach us to play. &nbsp;They don&#8217;t encourage us to explore. &nbsp;They don&#8217;t even really prepare us for tomorrow, but rather prepare us for test taking.</p>
<p>Robert Scoble presented at TEDxBloomington about &#8220;play&#8221; and what wonderful discoveries and inventions it can lead to. Coincidence plays a big part, but it&#8217;s primarily curiosity.</p>
<p>Check out the great examples of &#8220;play&#8221; and what comes of it!</p>
<p><iframe class='youtube-player' type='text/html' width='580' height='327' src='https://www.youtube.com/embed/F1vpjD6djwI?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2011/05/15/play/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">372</post-id>	</item>
		<item>
		<title>Your Own Scale for Measuring Success</title>
		<link>https://joelvanhorn.com/2011/04/05/your-own-scale-for-measuring-success/</link>
				<comments>https://joelvanhorn.com/2011/04/05/your-own-scale-for-measuring-success/#respond</comments>
				<pubDate>Tue, 05 Apr 2011 14:06:40 +0000</pubDate>
		<dc:creator><![CDATA[Joel]]></dc:creator>
				<category><![CDATA[Creativity]]></category>

		<guid isPermaLink="false">http://twopointyou.com/?p=43</guid>
				<description><![CDATA[I&#8217;ve read Seth Godin&#8217;s books over the past couple of years, and he consistently has great insights into marketing and human behavior. &#160;His post about &#8220;Originality&#8221; was very timely, coinciding with Austin Kleon&#8217;s post on the same subject. &#160;His way of thinking is a parallel to what I aim to apply to my own life, [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>I&#8217;ve read Seth Godin&#8217;s books over the past couple of years, and he consistently has great insights into marketing and human behavior. &nbsp;His post about <a href="/2011/04/originality/" target="_blank" rel="noopener noreferrer">&#8220;Originality&#8221;</a> was very timely, coinciding with <a href="/2011/04/how-to-steal-like-an-artist/" target="_blank" rel="noopener noreferrer">Austin Kleon&#8217;s post</a> on the same subject. &nbsp;His way of thinking is a parallel to what I aim to apply to my own life, and the perspective I want to share with others.</p>
<p>People have different motivations to achieve success and how they measure their achievements. &nbsp;Our society puts a lot of value on becoming famous and achieving recognition by the main stream media. &nbsp;It&#8217;s sometimes dumbfounding to observers when someone with exceptional talent and influence does not follow the &#8220;trendy&#8221; routes their peers may follow to become recognized. &nbsp;Seth Godin talks about chef <a href="http://en.wikipedia.org/wiki/Charlie_Trotter" target="_blank" rel="noopener noreferrer">Charlie Trotter</a>, whom he calls &#8220;a pioneer in modern cooking&#8221;. &nbsp;Someone who is achieving greatness and measuring success in his own way.</p>
<p>Fame and fortune are not what motivate all of us. &nbsp;Seeing how you affect the people around you can be gratifying enough. &nbsp;<a href="http://sethgodin.typepad.com/seths_blog/2011/04/dancing-faster-then-ever-but-why.html" target="_blank" rel="noopener noreferrer">&#8220;Dancing faster than ever, but why?&#8221;</a> highlights Charlie Trotter as one of these people, and it&#8217;s refreshing to have an influencer such as Seth Godin reminding us that we don&#8217;t have to measure success the way others may want us to.</p>
]]></content:encoded>
							<wfw:commentRss>https://joelvanhorn.com/2011/04/05/your-own-scale-for-measuring-success/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
						<post-id xmlns="com-wordpress:feed-additions:1">43</post-id>	</item>
	</channel>
</rss>
