<?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>TappingStone</title>
	<atom:link href="http://blog.tappingstone.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tappingstone.com</link>
	<description>User Behavior Prediction as a Service for App Developers</description>
	<lastBuildDate>Mon, 15 Oct 2012 13:21:30 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>How to Build a Restaurant Recommendation App in Minutes</title>
		<link>http://blog.tappingstone.com/restaurant-recommendations-python-demo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=restaurant-recommendations-python-demo</link>
		<comments>http://blog.tappingstone.com/restaurant-recommendations-python-demo/#comments</comments>
		<pubDate>Mon, 15 Oct 2012 12:12:34 +0000</pubDate>
		<dc:creator>kingcong</dc:creator>
				<category><![CDATA[Demo Tutorial]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[recommendation]]></category>

		<guid isPermaLink="false">http://blog.tappingstone.com/?p=26</guid>
		<description><![CDATA[<p>Almost no good consumer app can go without recommending good content to users nowadays. <a href="http://www.yelp.com/">Yelp</a> and <a href="http://www.foursquare.com">Foursquare</a> are two successful examples. You may also remember the news about <a href="http://itunes.apple.com/us/app/alfred/id447020280?mt=8">Alfred</a>, a mobile app for restaurant recommendations, being acquired by Google in light speed last year. Alfred was built by a Stanford PhD-led team at Clever [...]]]></description>
			<content:encoded><![CDATA[<p>Almost no good consumer app can go without recommending good content to users nowadays. <a href="http://www.yelp.com/">Yelp</a> and <a href="http://www.foursquare.com">Foursquare</a> are two successful examples. You may also remember the news about <a href="http://itunes.apple.com/us/app/alfred/id447020280?mt=8">Alfred</a>, a mobile app for restaurant recommendations, being acquired by Google in light speed last year. Alfred was built by a Stanford PhD-led team at Clever Sense which learns your tastes by discovering patterns.</p>
<p>In this tutorial, we will show you how to build a high-quality restaurant recommendation app with TappingStone in 3 simple steps, without a PhD team. TappingStone Python SDK is used this time.</p>
<p>&nbsp;</p>
<h3>1. Setup the Project</h3>
<p>Provided in the demo is a sample restaurant recommender data set courtesy of the <a title="UCI Machine Learning Repository" href="http://archive.ics.uci.edu/ml/" target="_blank">UCI Machine Learning Repository</a>. Completed sample application with source code and dataset can be <a title="Sample Restaurant Demo at Github" href="https://github.com/tappingstone/demo-python-restaurant-rec-app">downloaded here</a>. If you need help in getting the repo, please see &#8220;<a title="forking a repo" href="https://help.github.com/articles/fork-a-repo" target="_blank">forking a repo</a>&#8220;.</p>
<p>Once you have successfully forked and cloned the repo to your machine you can import the project into your favorite IDE (A IML project file for IntelliJ is included. Use it if you do not want to go through the project creation wizard yourself) or just a plain ole&#8217; text editor of your choice.</p>
<p>Below is a screenshot of  how your directories and files should look:</p>
<p><a href="http://blog.tappingstone.com/wp-content/uploads/2012/10/TappingStoneDemoProjectLayout1.png" rel="lightbox[26]"><img class="alignnone size-full wp-image-28" title="TappingStoneDemoProjectLayout" src="http://blog.tappingstone.com/wp-content/uploads/2012/10/TappingStoneDemoProjectLayout1.png" alt="" width="330" height="461" /></a></p>
<p>There is an included README that gives an overview of all the files and a basic howto on how to get started. If that&#8217;s enough to get you started great! Else, read on!</p>
<p>The first thing you&#8217;ll notice is that there are two distinct directories under the com/tappingstone folder, app and data. If you plan to import your own data  you can more or less ignore the data folder unless you want to use the mock_data.py script as a template for your own data import script. Below is a snippet of the mock_data.py</p>
<div id="gist-3857244" class="gist">
    

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kn">import</span> <span class="nn">re</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kn">import</span> <span class="nn">stoneapi</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c">#Initalize Stone Client</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">appKey</span> <span class="o">=</span> <span class="s">&#39;&#39;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiUrl</span> <span class="o">=</span> <span class="s">&#39;https://stoneapi.com&#39;</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiVer</span> <span class="o">=</span> <span class="s">&#39;v1&#39;</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">threadCount</span> <span class="o">=</span> <span class="mi">100</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c">#Create client for usage</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span> <span class="o">=</span> <span class="n">stoneapi</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">appkey</span><span class="o">=</span><span class="n">appKey</span><span class="p">,</span> <span class="n">threads</span><span class="o">=</span><span class="n">threadCount</span><span class="p">,</span> <span class="n">apiurl</span><span class="o">=</span><span class="n">apiUrl</span><span class="p">,</span> <span class="n">apiversion</span><span class="o">=</span><span class="n">apiVer</span><span class="p">)</span></div><div class='line' id='LC13'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/8aba23b53499e7f9d991/137962e827747f5b24602d45004cf00fd0f893cf/mock_data.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991#file_mock_data.py" style="float:right;margin-right:10px;color:#666">mock_data.py</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>What&#8217;s important to notice in this snippet of code is that the appKey variable is blank. You need to enter in your own application key here using single quotes. For example,</p>
<blockquote><p>appKey=&#8217;<strong>thisIsMyTappingStoneAppKey</strong>&#8216;</p></blockquote>
<p>Otherwise without a valid application key you will be unable to import any data into your TappingStone account, nor will you be able to use any of the recommendation calls we provide. If you need to get an application key, please <a title="TappingStone" href="https://www.tappingstone.com/">sign up here</a>.</p>
<p>The other variables that deal with communicating with the TappingStone server are apiUrl and apiVer. These you should generally leave alone for this demo application but if you have your own custom apiURL or you are testing a newer api version feel free to edit them. The variable threadCount can also be changed to any positive integer though you generally want to keep it under 100 to prevent the script from sucking up all the available threads. Note that if you want to make asynchronous calls you will need at least two threads. For a brief overview of what asynchronous means, see <a title="Asynchronous_I/O" href="http://en.wikipedia.org/wiki/Asynchronous_I/O" target="_blank">here.</a> We&#8217;ll also go further into detail about the thread count below but for now just set it to some positive integer greater than 0. If you&#8217;re running the mock_data.py script, leave the threadCount as is unless you run into memory issues if any.</p>
<h3></h3>
<p>&nbsp;</p>
<h3>2. Import Data into TappingStone</h3>
<p>Once you have entered in all variables you can test the script by running it! Simply hit the run button on your IDE or through command line with the following command,</p>
<blockquote><p>python mock_data.py</p></blockquote>
<p>You&#8217;ll see the console print messages as it goes about it&#8217;s business  Note that this script takes anywhere from 15-30 minutes depending on how many threads you specified and your network speed. Below is a sample of what your IDE console or terminal window should be printing out.</p>
<p><a href="http://blog.tappingstone.com/wp-content/uploads/2012/10/TappingStoneMockData_Terminal.png" rel="lightbox[26]"><img class="alignnone size-full wp-image-49" title="TappingStoneMockData_Terminal" src="http://blog.tappingstone.com/wp-content/uploads/2012/10/TappingStoneMockData_Terminal.png" alt="" width="400" height="424" /></a></p>
<p>&nbsp;</p>
<p>Once the data has been successfully imported it will take some time (usually about one hour) for our servers to generate some recommendations for you. You can <a title="Login to check your application's control panel" href="https://www.tappingstone.com/signin" target="_blank">check</a> the status in your application web control panel. Once the &#8220;Behavior Prediction Status&#8221; is &#8220;Ready&#8221; you&#8217;re ready to move onto the next step.</p>
<h3></h3>
<p>&nbsp;</p>
<h3>3. Retrieve Personalized Recommendations</h3>
<p>Now that a unique prediction model is built for your data set, we can start using the API to get some recommendations as well as use a few other nifty API calls for our purposes. Again, let&#8217;s refer to the screenshot below for the directory structure:</p>
<p><a href="http://blog.tappingstone.com/wp-content/uploads/2012/10/TappingStoneDemoProjectLayout1.png" rel="lightbox[26]"><img class="alignnone size-full wp-image-28" title="TappingStoneDemoProjectLayout" src="http://blog.tappingstone.com/wp-content/uploads/2012/10/TappingStoneDemoProjectLayout1.png" alt="" width="330" height="461" /></a></p>
<p>You&#8217;ll want to edit core_actions.py and enter in your application key just like you did in mock_data.py.</p>
<div id="gist-3857244" class="gist">
    

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">ServerActions</span><span class="p">:</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span> <span class="o">=</span> <span class="bp">None</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c">#Initalize Stone Client</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">appKey</span> <span class="o">=</span> <span class="s">&#39;{yourApplicationKeyGoesHere}&#39;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiUrl</span> <span class="o">=</span> <span class="s">&#39;https://stoneapi.com&#39;</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiVer</span> <span class="o">=</span> <span class="s">&#39;v1&#39;</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">threadCount</span> <span class="o">=</span> <span class="mi">100</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/8aba23b53499e7f9d991/57d32c8b25ffca2865e07bc940a1da6d699f9b20/core_actions.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991#file_core_actions.py" style="float:right;margin-right:10px;color:#666">core_actions.py</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>If you&#8217;re not using our provided sample data set, please edit <strong>tappingStoneDemo.py</strong> accordingly to ensure that when the application is run that you don&#8217;t run into any funny errors. For those of you that are using our imported data set, run tappingStoneDemo.py through your IDE or the following command</p>
<blockquote><p>python tappingStoneDemo.py</p></blockquote>
<p>You should see something similar to the screenshot below:</p>
<p><a href="http://blog.tappingstone.com/wp-content/uploads/2012/10/TS_Demo_Output_Terminal1.png" rel="lightbox[26]"><img class="alignnone size-full wp-image-105" title="TS_Demo_Output_Terminal" src="http://blog.tappingstone.com/wp-content/uploads/2012/10/TS_Demo_Output_Terminal1.png" alt="" width="403" height="175" /></a></p>
<p>Note that if you do not use a sample user ID from the <strong>sampleUserIDList.txt</strong> found under the<strong> com/tappingstone/data</strong> folder the application will generate whatever user ID you input and import that user ID into your TappingStone application data. Feel free at this point to play around with the application and get some recommendations <img src='http://blog.tappingstone.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  One thing to note is that the TappingStone demo application is coded to give you 10 random restaurants every time when you select view restaurants. If you want to consistently execute an action on a particular restaurant (such as viewing, liking, disliking, or rating) just jot down the restaurant ID number and enter that number in every time you are asked to input a restaurant ID. Alternatively, you can edit <strong>tappingStoneDemo.py </strong>to give you a fixed number of restaurants every time such as only the first 10 restaurants or however many you want to display. Below is some sample console output again:</p>
<p><a href="http://blog.tappingstone.com/wp-content/uploads/2012/10/Ts_Demo_Sample_Usage_terminal11.png" rel="lightbox[26]"><img class="alignnone size-full wp-image-106" title="Ts_Demo_Sample_Usage_terminal1" src="http://blog.tappingstone.com/wp-content/uploads/2012/10/Ts_Demo_Sample_Usage_terminal11.png" alt="" width="481" height="1257" /></a></p>
<p>Now that you&#8217;ve gotten a taste of what the application looks like!</p>
<h3></h3>
<p>&nbsp;</p>
<h3>Code Explained</h3>
<p>Let&#8217;s dive into the code to see the different functions being used and how to use them.</p>
<p><strong>core_actions.py</strong></p>
<p>core_actions.py contains functions that handle server side client calls for actions and functions that do not deal with user related behavioral actions. These actions include  for example</p>
<ul>
<li>creating new users</li>
<li>creating new items</li>
<li>accessing item details</li>
<li>accessing user details</li>
<li>parsing server responses</li>
</ul>
<div>The first step and arguably the most important part of any application using TappingStone is shown below along with other related functions:</div>
<div></div>
<div><div id="gist-3857244" class="gist">
    

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c">#Initalize Stone Client</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">appKey</span> <span class="o">=</span> <span class="s">&#39;5x4h1i4p33k3m5h552i615s521c313h&#39;</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiUrl</span> <span class="o">=</span> <span class="s">&#39;https://stoneapi.com&#39;</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiVer</span> <span class="o">=</span> <span class="s">&#39;v1&#39;</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">threadCount</span> <span class="o">=</span> <span class="mi">100</span></div><div class='line' id='LC7'><br/></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c">#Create client for usage</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">stoneapi</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">appkey</span><span class="o">=</span><span class="n">appKey</span><span class="p">,</span> <span class="n">threads</span><span class="o">=</span><span class="n">threadCount</span><span class="p">,</span> <span class="n">apiurl</span><span class="o">=</span><span class="n">apiUrl</span><span class="p">,</span> <span class="n">apiversion</span><span class="o">=</span><span class="n">apiVer</span><span class="p">)</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'><span class="c"># Returns the Stone Client for usage</span></div><div class='line' id='LC12'><span class="k">def</span> <span class="nf">getStoneClient</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span></div><div class='line' id='LC14'><br/></div><div class='line' id='LC15'><span class="c"># Closes the Stone Client connection</span></div><div class='line' id='LC16'><span class="k">def</span> <span class="nf">closeStoneClient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client</span><span class="p">):</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/8aba23b53499e7f9d991/5788e22b4a5cd626a5f06cf1bb2bc1b2e4bd3512/core_actions_stoneclient.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991#file_core_actions_stoneclient.py" style="float:right;margin-right:10px;color:#666">core_actions_stoneclient.py</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</div>
<div></div>
<div>The first method defined which is also the init function core_actions.py creates what we&#8217;ll reference in the rest of this post as the Stone client. The object created here and returned via the getStoneClient is used in all the other functions in core_actions.py as well as behavior_actions.py to make requests to the TappingStone server.</div>
<div></div>
<div>As with any client that can make third party calls it&#8217;s always good practice to close the connection when it&#8217;s no longer needed to prevent unnecessary resource usage as shown by the closeStoneClient function.</div>
<p>Let&#8217;s examine a function and go over it and their usage.</p>
<div id="gist-3857244" class="gist">
    

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c"># Method to create a user</span></div><div class='line' id='LC2'><span class="k">def</span> <span class="nf">createUser</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client</span><span class="p">,</span> <span class="n">uid</span><span class="p">,</span> <span class="n">async</span><span class="p">):</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="n">async</span> <span class="ow">is</span> <span class="bp">True</span><span class="p">:</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="o">.</span><span class="n">acreate_user</span><span class="p">(</span><span class="n">uid</span><span class="o">=</span><span class="n">uid</span><span class="p">)</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span><span class="p">:</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="o">.</span><span class="n">create_user</span><span class="p">(</span><span class="n">uid</span><span class="o">=</span><span class="n">uid</span><span class="p">)</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/8aba23b53499e7f9d991/728b5aac0d66b25f9d5b0bc79275c0b6649eb42d/core_actions_createUser.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991#file_core_actions_create_user.py" style="float:right;margin-right:10px;color:#666">core_actions_createUser.py</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>This particular function has a parameter that is of particular interest to us and that is the <strong>async</strong> parameter which is a meant to be a boolean value of True or False. Depending on what is passed in from <strong>tappingStoneDemo.py</strong> it will determine which function to call. At this point let&#8217;s take a minute to discuss what the difference is between asynchronous calls and synchronous calls. For a detailed explanation see the Wikipedia article <a title="Asynchronous I/O" href="http://en.wikipedia.org/wiki/Asynchronous_I/O" target="_blank">here</a>. Otherwise, in the most general terms possible, asynchronous calls as implemented by the TappingStone API mean that whenever you call an asynchronous function it will not block your app. What does blocked mean? If you do not use asynchronous calls or if you&#8217;ve somehow maxed out the thread count your application will &#8220;hang&#8221; or be blocked from taking further action until the function either completes (regardless of whether it&#8217;s successful or not), more threads are allocated, or if other threads have completed their jobs and are freed and able to be used again. Generally speaking you want to take advantage of asynchronous calls because it lets you send off a request and continue doing something else more interesting in the application. The main downside to using asynchronous calls is that you must check the response by feeding it to the response parsing function see below:</p>
<div id="gist-3857244" class="gist">
    

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c"># Method to unpack the response object</span></div><div class='line' id='LC2'><span class="c"># TODO seperate into different response unpacks</span></div><div class='line' id='LC3'><span class="k">def</span> <span class="nf">parseResponse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client</span><span class="p">,</span> <span class="n">response</span><span class="p">,</span> <span class="n">uid</span><span class="p">):</span></div><div class='line' id='LC4'><span class="sd">&quot;&quot;&quot;</span></div><div class='line' id='LC5'><span class="sd">* This is a generic response parser to parse the responses returned by the server</span></div><div class='line' id='LC6'><span class="sd">&quot;&quot;&quot;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">try</span><span class="p">:</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">parsedResponse</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">aresp</span><span class="p">(</span><span class="n">response</span><span class="p">)</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">parsedResponse</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">except</span><span class="p">(</span><span class="n">stoneapi</span><span class="o">.</span><span class="n">UserNotFoundError</span><span class="p">):</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&#39;User was not found&#39;</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c"># Create a new user if user ID is not found</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="bp">self</span><span class="o">.</span><span class="n">createUser</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">uid</span><span class="o">=</span><span class="n">uid</span><span class="p">,</span> <span class="n">async</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">except</span><span class="p">(</span><span class="n">stoneapi</span><span class="o">.</span><span class="n">ItemNotCreatedError</span><span class="p">):</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&#39;There is no such item.&#39;</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">except</span><span class="p">(</span><span class="n">stoneapi</span><span class="o">.</span><span class="n">ItemNotFoundError</span><span class="p">):</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&#39;There is no such item.&#39;</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/8aba23b53499e7f9d991/836f1af408aa2265040fca0216ee5d0227b1a8cb/core_actions_parseResponse.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991#file_core_actions_parse_response.py" style="float:right;margin-right:10px;color:#666">core_actions_parseResponse.py</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>All asynchronous function responses must be passed to the above function to get the response result if there are any. <strong>NOT ALL ASYNC FUNCTIONS RETURN SOMETHING USABLE.</strong> For example, creating a user or deleting a user when you pass in the response you are returned None as the return if it was successful. Otherwise it will throw it&#8217;s specified exception. Please see the TappingStone python SDK <a title="TappingStone Python API Documentation" href="https://www.tappingstone.com/docs/sdk/python/stoneapi.html" target="_blank">documentation</a> for more in-depth documentation of function parameters, return objects, and exceptions.</p>
<p>The rest of the functions in core_actions.py should be self-explanatory so let&#8217;s move onto the next class.</p>
<p><strong>behavior_actions.py</strong></p>
<p>On the other hand, behavior_actions.py is a Python class that contains all the &#8220;behavioral&#8221; function calls to the TappingStone server. This means any action a user performs that is collected and aggregated into the recommendation calculations such as viewing items, liking items, rating items, friending, de-friending, following, unfollowing, etc.</p>
<p>Most of these functions should be pretty self-explanatory from the Python SDK <a title="TappingStone Python SDK Documentation" href="https://www.tappingstone.com/docs/sdk/python/stoneapi.html" target="_blank">documentation</a>. However, there are a few things I&#8217;d like to go over regarding the actual Python SDK functions.</p>
<p>Most of these behavioral action functions should be done asynchronously. You don&#8217;t want your application user to view an item and have the whole application hang while waiting for the thread to complete it&#8217;s task. For example, you can have your application make an asynchronous call to get a list of recommendations for a particular user login and cache it so that a user can immediately get results or prepare an error handler in the background while your user uses your application. This way your user will not experience a loading screen when they go to fetch recommendations. They will immediately know their desired information or know that there may be some problem with their data connection or your application&#8217;s network connection right away instead of watching your application try to retrieve data and eventually timing out. Note that in our demo application we&#8217;ve coded our demo application to allow you to experiment with asynchronous and synchronous calls so you can get a feel for the different functions. Note that the speed of sending and receiving a response is dependent on your network as well as TappingStone&#8217;s network for the demo application.</p>
<p>Sample code for getting recommendations either asynchronously or synchronously.</p>
<div id="gist-3857244" class="gist">
    

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c"># Method to get N recommendations for given user, call can be done async or non-async</span></div><div class='line' id='LC2'><span class="k">def</span> <span class="nf">getRecommend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client</span><span class="p">,</span> <span class="n">uid</span><span class="p">,</span> <span class="n">numRecs</span><span class="p">,</span> <span class="n">async</span><span class="p">):</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="n">async</span> <span class="ow">is</span> <span class="bp">True</span><span class="p">:</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">aget_recommendations</span><span class="p">(</span><span class="n">uid</span><span class="o">=</span><span class="n">uid</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="n">numRecs</span><span class="p">)</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">else</span><span class="p">:</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">get_recommendations</span><span class="p">(</span><span class="n">uid</span><span class="o">=</span><span class="n">uid</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="n">numRecs</span><span class="p">)</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">response</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/8aba23b53499e7f9d991/71b3af4a1bb60847a56584026424c6a1c646c2a5/behavior_actions_getRecs.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991#file_behavior_actions_get_recs.py" style="float:right;margin-right:10px;color:#666">behavior_actions_getRecs.py</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Note that the Python SDK for this function returns a dictionary list which returns ONLY item IDs. See below for an example:</p>
<p><a href="http://blog.tappingstone.com/wp-content/uploads/2012/10/TS_Response_Example_Terminal1.png" rel="lightbox[26]"><img class="alignnone size-full wp-image-110" title="TS_Response_Example_Terminal" src="http://blog.tappingstone.com/wp-content/uploads/2012/10/TS_Response_Example_Terminal1.png" alt="" width="476" height="227" /></a></p>
<p>Your demo application most likely will hook into your own system&#8217;s database or an in-app database that&#8217;s already been setup with all the proper values for every item&#8217;s properties. However, as an example, if you wanted to completely use TappingStone to also host your item database you can pass in optional parameters when creating items which would then allow you to query item information to get all the optional values. An example of such code as well as it&#8217;s return value is shown below:</p>
<p><a href="http://blog.tappingstone.com/wp-content/uploads/2012/10/TS_Item_IntelliJ_Terminal1.png" rel="lightbox[26]"><img class="alignnone size-full wp-image-107" title="TS_Item_IntelliJ_Terminal" src="http://blog.tappingstone.com/wp-content/uploads/2012/10/TS_Item_IntelliJ_Terminal1.png" alt="" width="505" height="356" /></a></p>
<p>And an example of how you would add such an item into your TappingStone account,</p>
<div id="gist-3857244" class="gist">
    

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kn">import</span> <span class="nn">re</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kn">import</span> <span class="nn">stoneapi</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c">#Initalize Stone Client</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">appKey</span> <span class="o">=</span> <span class="s">&#39;5x4h1i4p33k3m5h552i615s521c313h&#39;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiUrl</span> <span class="o">=</span> <span class="s">&#39;https://stoneapi.com&#39;</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiVer</span> <span class="o">=</span> <span class="s">&#39;v1&#39;</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">threadCount</span> <span class="o">=</span> <span class="mi">100</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c">#Create client for usage</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span> <span class="o">=</span> <span class="n">stoneapi</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">appkey</span><span class="o">=</span><span class="n">appKey</span><span class="p">,</span> <span class="n">threads</span><span class="o">=</span><span class="n">threadCount</span><span class="p">,</span> <span class="n">apiurl</span><span class="o">=</span><span class="n">apiUrl</span><span class="p">,</span> <span class="n">apiversion</span><span class="o">=</span><span class="n">apiVer</span><span class="p">)</span></div><div class='line' id='LC13'><br/></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="nb">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;mock_data.txt&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">lines</span> <span class="o">=</span> <span class="nb">file</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">try</span><span class="p">:</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="o">.</span><span class="n">create_item</span><span class="p">(</span><span class="n">iid</span><span class="o">=</span><span class="s">&#39;9999&#39;</span><span class="p">,</span> <span class="n">itypes</span><span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="p">,),</span> <span class="n">name</span><span class="o">=</span><span class="s">&#39;test item&#39;</span><span class="p">,</span> <span class="n">special</span><span class="o">=</span><span class="s">&#39;A special value here&#39;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="s">&#39;Priceless&#39;</span><span class="p">)</span></div><div class='line' id='LC18'><br/></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">except</span> <span class="p">(</span><span class="n">stoneapi</span><span class="o">.</span><span class="n">ItemNotCreatedError</span><span class="p">):</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&#39;Error creating item!&#39;</span></div><div class='line' id='LC21'><br/></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&#39;Done&#39;</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/8aba23b53499e7f9d991/d87319ac040f13130c751edf24c73ad3c264cb21/mock_data_createItem.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991#file_mock_data_create_item.py" style="float:right;margin-right:10px;color:#666">mock_data_createItem.py</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Also if you wanted to create a custom user with some customized information such as their birthday and sex,</p>
<div id="gist-3857244" class="gist">
    

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span></div><div class='line' id='LC2'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kn">import</span> <span class="nn">re</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kn">import</span> <span class="nn">stoneapi</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c">#Initalize Stone Client</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">appKey</span> <span class="o">=</span> <span class="s">&#39;5x4h1i4p33k3m5h552i615s521c313h&#39;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiUrl</span> <span class="o">=</span> <span class="s">&#39;https://stoneapi.com&#39;</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">apiVer</span> <span class="o">=</span> <span class="s">&#39;v1&#39;</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">threadCount</span> <span class="o">=</span> <span class="mi">100</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="c">#Create client for usage</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span> <span class="o">=</span> <span class="n">stoneapi</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">appkey</span><span class="o">=</span><span class="n">appKey</span><span class="p">,</span> <span class="n">threads</span><span class="o">=</span><span class="n">threadCount</span><span class="p">,</span> <span class="n">apiurl</span><span class="o">=</span><span class="n">apiUrl</span><span class="p">,</span> <span class="n">apiversion</span><span class="o">=</span><span class="n">apiVer</span><span class="p">)</span></div><div class='line' id='LC13'><br/></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="nb">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;mock_data.txt&#39;</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">lines</span> <span class="o">=</span> <span class="nb">file</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">try</span><span class="p">:</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="o">.</span><span class="n">create_user</span><span class="p">(</span><span class="n">uid</span><span class="o">=</span><span class="s">&#39;customuser&#39;</span><span class="p">,</span> <span class="n">birthday</span><span class="o">=</span><span class="s">&#39;09-24-12&#39;</span><span class="p">,</span> <span class="n">sex</span><span class="o">=</span><span class="s">&#39;male&#39;</span><span class="p">)</span></div><div class='line' id='LC18'><br/></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">except</span> <span class="p">(</span><span class="n">stoneapi</span><span class="o">.</span><span class="n">UserNotCreatedError</span><span class="p">):</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&#39;Error creating user!&#39;</span></div><div class='line' id='LC21'><br/></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">print</span> <span class="s">&#39;Done&#39;</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/8aba23b53499e7f9d991/c11e582713b4fb51501af098e9ff9ead8de6d72b/mock_data_createUser.py" style="float:right;">view raw</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991#file_mock_data_create_user.py" style="float:right;margin-right:10px;color:#666">mock_data_createUser.py</a>
            <a href="https://gist.github.com/8aba23b53499e7f9d991">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<div></div>
<div></div>
<div></div>
<div>
<h3>Next Step: Make it Location-based!</h3>
</div>
<div></div>
<div>TappingStone has built-in support for apps that require location-based recommendations. It&#8217;s straightforward. Please refer to our <a title="Location-based Recommendation" href="https://www.tappingstone.com/docs/advanced#location-based-recommendation">documentation</a> for further information. We&#8217;ll leave it to you as an exercise.</p>
</div>
<div></div>
<div></div>
<div></div>
<div></div>
<div>
<h3>Conclusion</h3>
</div>
<div></div>
<div>Hopefully this introduction to the Python SDK with the demo application gives you enough information to get your own amazing app up and running using TappingStone&#8217;s recommendation engine to create a truly customized experience for your application users! Should you have any questions or comments feel free to leave them in the comment section or to email us at <a href="mailto:help@tappingstone.com">help@tappingstone.com</a></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.tappingstone.com/restaurant-recommendations-python-demo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>We are TappingStone</title>
		<link>http://blog.tappingstone.com/we-are-tappingstone/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=we-are-tappingstone</link>
		<comments>http://blog.tappingstone.com/we-are-tappingstone/#comments</comments>
		<pubDate>Fri, 12 Oct 2012 15:29:26 +0000</pubDate>
		<dc:creator>TappingStone Team</dc:creator>
				<category><![CDATA[Stone News]]></category>

		<guid isPermaLink="false">http://blog.tappingstone.com/?p=41</guid>
		<description><![CDATA[<p>We are a team of data scientists, engineers and entrepreneurs who believe that every web and mobile app should be very smart, and that there should be an easy way to build it.</p> <p>We appreciate how forward-thinking companies such as LinkedIn, Facebook, Quora, Flipboard, Zygna, Foursquare make use of data science and machine learning techniques [...]]]></description>
			<content:encoded><![CDATA[<p>We are a team of data scientists, engineers and entrepreneurs who believe that every web and mobile app should be very smart, and that there should be an easy way to build it.</p>
<p>We appreciate how forward-thinking companies such as LinkedIn, Facebook, Quora, Flipboard, Zygna, Foursquare make use of data science and machine learning techniques to build smart apps.</p>
<p>We like apps that know each user individually – who the users like to connect to, what they like to discover, which questions they can answer, what topics they are concerned about, when they will leave the game and where they like to go.</p>
<p>We believe that data science should not be an exclusive privilege to these big guys who can afford to spend years on R&amp;D with teams of PhD scientists.</p>
<p>We wish to see that every app developer and every startup having the power to build smart apps quickly and cost-effectively, today and now.</p>
<p>We are crazy yet confident enough to believe that we are the team which can make this happen.</p>
<p>We believe that the best way to maximize the impact of our little contribution is to offer user behavior prediction as a service to all app developers.</p>
<p>We don’t know how the smartest app should look like exactly.</p>
<p>We, however, know that the sky is not the limit and it’s really up to your imagination.</p>
<p>We invite you to join this revolution by giving TappingStone a try now.</p>
<p>We welcome any suggestions and comments.</p>
<p>We are TappingStone.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tappingstone.com/we-are-tappingstone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The First Post of TappingStone Blog</title>
		<link>http://blog.tappingstone.com/the-first-post-of-tappingstone-blog/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-first-post-of-tappingstone-blog</link>
		<comments>http://blog.tappingstone.com/the-first-post-of-tappingstone-blog/#comments</comments>
		<pubDate>Sat, 29 Sep 2012 01:20:02 +0000</pubDate>
		<dc:creator>TappingStone Team</dc:creator>
				<category><![CDATA[Stone News]]></category>

		<guid isPermaLink="false">http://blog.tappingstone.com/?p=17</guid>
		<description><![CDATA[<p>Today, TappingStone blog is launched. Stay tuned.</p>]]></description>
			<content:encoded><![CDATA[<p>Today, TappingStone blog is launched. Stay tuned.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tappingstone.com/the-first-post-of-tappingstone-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.976 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-10-15 13:32:10 -->

<!-- Compression = gzip -->