<?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>Phillip Napieralski</title>
	<atom:link href="http://blog.pnapieralski.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.pnapieralski.com</link>
	<description>Programmer, Engineer, Researcher.</description>
	<lastBuildDate>Tue, 29 Sep 2015 14:18:16 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.8.1</generator>
	<item>
		<title>Building a simple joke site with nodejs &#8211; Part 4 &#8211; Adding our joke routes</title>
		<link>http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-4-adding-our-joke-routes/</link>
		<comments>http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-4-adding-our-joke-routes/#respond</comments>
		<pubDate>Wed, 15 Jul 2015 06:25:40 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[nodejs]]></category>
		<category><![CDATA[happypolack]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[yomomma]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=192</guid>
		<description><![CDATA[Last time, we got a basic expressjs app setup. Now, let&#8217;s bring in the stuff we created from part 2 and add to it in an expressjs way. This is the first step to awesomeness! Adding our flat file &#8220;database&#8221; into the mix Let&#8217;s start by building off the same app that we created in [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Last time, we got a basic expressjs app setup. Now, let&#8217;s bring in the stuff we created from part 2 and add to it in an  expressjs way. This is the first step to <strong> awesomeness</strong>!</p>
<h2>Adding our flat file &#8220;database&#8221; into the mix</h2>
<p>Let&#8217;s start by building off the same app that we created in <b>Part 3</b> &#8211; the happypolack auto-generated app.</p>
<p>Remember our JokesDB.json file from <a href="http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-2-reading-json-from-files/">part 2</a>? Let&#8217;s add that to the happypolack app that we created, but let&#8217;s put it in a new folder called <b>model</b>. Go ahead and create that folder and put the jokes json file in there:</p>
<pre class="brush: plain; title: ; notranslate">
[
	{
		'category': 'chucknorris',
		'content': 'chuck norris joke'
	},
	{
		'category': 'yomomma',
		'content': 'momma joke'
	}
]
</pre>
<h2>Setting up our /jokes REST endpoints</h2>
<p>Let&#8217;s create a new route that simply returns a simple &#8220;hello world&#8221; for our /jokes endpoints. Create the file /routes/jokes.js and add the following code:</p>
<pre class="brush: plain; title: ; notranslate">
// PART 4

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
  res.send('GET for /jokes');
});

router.post('/', function(req, res, next) {
  res.send('POST for /jokes');
});

module.exports = router;
</pre>
<p>All we&#8217;re doing with this module is setting up a simple GET path and a POST path. The POST path will &#8220;eventually&#8221; be used to add a new joke to our database &#8211; where as GET path will show a listing of the jokes when your browser goes to that route. </p>
<p>Now, let&#8217;s make it so that going to http://localhost:3000/jokes points to this module.</p>
<p>To do this, let&#8217;s modify app.js (our default nodejs file). In app.js, add the following code to the top of the file:</p>
<pre class="brush: plain; title: ; notranslate">
var jokes = require('./routes/jokes');
</pre>
<p>Now, we&#8217;ve imported the jokes module. Let&#8217;s point /jokes to this module by adding the following code below the line app.use(&#8216;/users&#8217;, users) in <strong>app.js</strong>:</p>
<pre class="brush: plain; title: ; notranslate">
app.use('/jokes', jokes);
</pre>
<p>That&#8217;s it! Now run `npm start` in the console, navigate to http://localhost:3000/jokes and you&#8217;ll see our new joke modules simple response <em>&#8216;GET for /jokes&#8217;</em>. Note, we don&#8217;t need to test the POST endpoint just yet.</p>
<h2>Having our REST /jokes endpoint return the jokes</h2>
<p>Bring in the file from Part 2 called database.js. Let&#8217;s put this in a new folder called /lib. This is where we&#8217;ll put all of our &#8220;helper modules&#8221;</p>
<p>Here&#8217;s our new database.js file so it correctly points to our jokesDB.json flat file database:</p>
<pre class="brush: plain; title: ; notranslate">
var fs = require('fs');

module.exports =
{
	getJokesFromDB: function()
	{
		return fs.readFileSync('./model/jokesDB.json').toString();
	}
}
</pre>
<p>With that in place, let&#8217;s modify our /jokes GET endpoint to use this module and output the jokes. Add the following line to the top of your jokes.js file to include that database module:</p>
<pre class="brush: plain; title: ; notranslate">
var db = require('../lib/database.js'); 
</pre>
<p>Then, change the router.get function to be the following:</p>
<pre class="brush: plain; title: ; notranslate">
router.get('/', function(req, res, next) {
  var jokesJson = db.getJokesFromDB();
  res.send(jokesJson);
});
</pre>
<p>Now CTRL+C your currently running node app and re-run `npm start`. Then, navigating to http://localhost:3000/jokes should return you the list of jokes.</p>
<h2>Summary</h2>
<p>That&#8217;s it! We&#8217;ve got a good start by adding our REST endpoints set-up. We&#8217;ll continue to refine the database with CRUD operations and by using MongoDB and (eventually) add in angularjs to the front-end to show the jokes on the index page in a responsive manner!</p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			<wfw:commentRss>http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-4-adding-our-joke-routes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a simple joke site with nodejs &#8211; Part 3 &#8211; Expressjs</title>
		<link>http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-3-expressjs/</link>
		<comments>http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-3-expressjs/#respond</comments>
		<pubDate>Thu, 25 Jun 2015 15:43:03 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[nodejs]]></category>
		<category><![CDATA[happypolack]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=190</guid>
		<description><![CDATA[A simple index-only page won&#8217;t do for a joke website. You&#8217;ll want to be able to navigate to pages that only have chuck norris jokes, or only have yo momma jokes. Or, perhaps you&#8217;ll add a page where users can submit jokes &#8211; then of course you&#8217;ll need a profile page for users. Let&#8217;s use [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A simple index-only page won&#8217;t do for a joke website. You&#8217;ll want to be able to navigate to pages that only have chuck norris jokes, or only have yo momma jokes. Or, perhaps you&#8217;ll add a page where users can submit jokes &#8211; then of course you&#8217;ll need a profile page for users. Let&#8217;s use expressjs to get our multiple pages set-up!</p>
<h2>Auto-generating a beginning expressjs template</h2>
<p>Let&#8217;s install express&#8217; project generator tool, but let&#8217;s install this globally for the operating system using the <i>-g</i> option:</p>
<pre class="brush: plain; title: ; notranslate">
npm install express-generator -g
</pre>
<p>Let&#8217;s generate a new app called <i>happypolack</i>. For our <i>template</i> engine, we&#8217;ll use ejs. We&#8217;ll get into this more later.</p>
<pre class="brush: plain; title: ; notranslate">
express --ejs happypolack
</pre>
<h3>Directories overview</h3>
<p>Now, if you <i>cd</i> into the happypolack directory, you&#8217;ll see a number of different directories. There&#8217;s /public, /routes, /views and /bin. The Public directory contains everything that will actually be downloaded by your customers, such as the javascript, images and stylsheets, except for your .HTML code. Your HTML code will go into the /views folder. Though these have a .ejs extension, know that they are essentially HTML with the addition of being able to access server side code through template tags (<%= and %>). See an example of how the title is set using these template tags in /views/index.ejs.</p>
</h3>
<p>Index, where art thou?</h3>
<p>But, where does the title between the template tags come from? It comes from the /routes/index.js file! Let&#8217;s take a look at this code in routes/index.js:</p>
<pre class="brush: plain; title: ; notranslate">
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
</pre>
<p>Remember in our first tutorials how you had to do &#8220;writeHead&#8221; and call &#8220;responses.end&#8221; to actually send data to the user? The way you do this in express is much different.</p>
<p>Let&#8217;s say, simply, that you want the web URL http://happypolack.com/ to show your index.ejs HTML file, and that&#8217;s it. Well, you&#8217;ll setup a route (this is index.js) and have that route included in our main app.js file (we&#8217;ll get to that). All the code in index.js is doing is setting things up so that when an HTTP GET request goes to the root of our website, it will show/render the &#8220;index[.ejs]&#8221; file and pass the variable data <b>title</b>.</p>
<p>Now, open up app.js that was generated in the root directory for you. This file is essentially our <b>main</b>. The top 24 lines are simple set-up that you don&#8217;t need to worry about immediately. However, let&#8217;s look at these lines of code:</p>
<pre class="brush: plain; title: ; notranslate">
var routes = require('./routes/index');
...
var app = express();
...
app.use('/', routes);
...
</pre>
<p>Understand this already? That route that was generated for us (routes/index.js) was simply a node module. This node module will be loaded whenever the base URL (&#8216;/&#8217;) is navigated to by your customer (in my case I want it to be http://happypolack.com). Let&#8217;s see this in action!</p>
<h3>Lights, camera, action!</h3>
<p>First, express included a bunch of dependencies in a package.json file. A <i>package.json</i> file is the main identifier for a node module. Inside of that file, there&#8217;s is an array of &#8220;dependencies&#8221; that your module requires. To install all of those dependencies, it&#8217;s easy! Type the following:</p>
<pre class="brush: plain; title: ; notranslate">
npm install
</pre>
<p>You&#8217;ll now see a bunch of new directories/modules inside a folder called node_modules.</p>
<p>Now run your app using either node app.js or, easier, the npm command:</p>
<pre class="brush: plain; title: ; notranslate">
npm start
</pre>
<p>By default expressjs generated apps use port 3000. Now navigate your browser to:</p>
<pre class="brush: plain; title: ; notranslate">
http://localhost:3000
</pre>
<p>You should see a basic &#8220;Welcome to Express&#8221; web page. That&#8217;s it!</p>
<h2>Conclusion</h2>
<p>You&#8217;ve seen how to setup expressjs and now you should have a basic understanding of the structure expressjs creates for you. Next time, we&#8217;ll add back our basic flat file &#8220;database&#8221; and start showing some jokes!</p>
<h3>See the rest of this tutorial series</h3>
<p><a href="http://blog.pnapieralski.com/nodejs/getting-started-with-nodejs-part-1/">Part 1 &#8211; Hello World</a><br />
<a href="http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-2-reading-json-from-files/">Part 2 &#8211; Adding our flat file &#8220;database&#8221;</a></p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			<wfw:commentRss>http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-3-expressjs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a simple joke site with Nodejs &#8211; Part 2 &#8211; Reading JSON from files</title>
		<link>http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-2-reading-json-from-files/</link>
		<comments>http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-2-reading-json-from-files/#comments</comments>
		<pubDate>Fri, 12 Jun 2015 03:29:48 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[nodejs]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=187</guid>
		<description><![CDATA[Last time we set-up NodeJS and built a simple &#8220;Hello world&#8221; app. This time, let&#8217;s have it serve up something more interesting. As a first step to building our joke website, let&#8217;s read two jokes from a file and print them out to the screen. The &#8220;backend database&#8221; format JSON is arguably the most widely [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Last time we set-up NodeJS and built a simple &#8220;Hello world&#8221; app. This time, let&#8217;s have it serve up something more interesting. As a first step to building our joke website, let&#8217;s read two jokes from a file and print them out to the screen.</p>
<h2>The &#8220;backend database&#8221; format</h2>
<p>JSON is arguably the most widely used format to store objects with javascript. Backend databases like the document based MongoDB works seamlessly with the format. So, let&#8217;s use it!</p>
<p>Dump this into a file called <b>jokesDB.json</b></p>
<pre class="brush: plain; title: ; notranslate">
[
	{
		'category': 'chucknorris',
		'content': 'When chuck norris does a push-up, he's actually pushing the world down.'
	},
	{
		'category': 'yomomma',
		'content': 'Yo momma house so dirty, she has to wipe her feet before she goes outside.'
	}
]
</pre>
<p>Place this file in the same directory you plan to keep your code. It will act as a temporary database from where we can retrieve our jokes.</p>
<p>NOTE: You probably wouldn&#8217;t want to use a flat file for a production website. Especially if you want to be able to add and remove jokes quickly from your &#8220;database.&#8221; Later on we&#8217;ll add a real database solution for which to store our data.</p>
<h2>Our &#8220;database&#8221; module</h2>
<p>To facilitate a clean separation later on, it makes sense to start, even now, putting our backend logic all in a separate module. You&#8217;ll thank me later when our module to interface with the database has 100s of lines of code.</p>
<p>Create a new file in the same directory as your jokesDB.json file and call it &#8220;database.js&#8221;. Copy this code to it:</p>
<pre class="brush: plain; title: ; notranslate">
var fs = require('fs');

module.exports =
{
	getJokesFromDB: function()
	{
		return fs.readFileSync('jokesDB.json').toString();
	}
}
</pre>
<p>That&#8217;s it! Now we just need to modify our server.js code.</p>
<h2>The new server code</h2>
<p>If you still have your code from the previous tutorial (<a href="http://blog.pnapieralski.com/nodejs/getting-started-with-nodejs-part-1/">part 1</a>), it&#8217;ll be easy to modify the code to load the database module and show the jokes. Here&#8217;s what your new server.js file should look like:</p>
<pre class="brush: jscript; title: ; notranslate">
// node modules
var http = require('http');

// our created modules
var db = require('./database');

// Handle a general user request
function handleRequest(request, response) {
	response.writeHead(200, {'Content-Type': 'text/html'});
	var jokesJson = db.getJokesFromDB();
	response.end(jokesJson);
}

http.createServer(handleRequest).listen(80, &quot;127.0.0.1&quot;);

console.log('Server running at http://127.0.0.1:80');
</pre>
<h2>Show me the jokes!</h2>
<p>Now the magical part &#8211; let&#8217;s see what we&#8217;ve done so far. Open up a terminal/command prompt, navigate to your directory (eg; &#8216;cd D:\nodescripts\) and type the following:</p>
<pre class="brush: plain; title: ; notranslate">
node server.js
</pre>
<h2>Conclusion</h2>
<p>I showed you how to use the fs module to load in a file and output that data to a file! You&#8217;ll now see the simple file outputted to the browser when you navigate to http://localhost or http://127.0.0.1 (they are the same). Next time, we&#8217;ll bring expressjs in the mix to give us the ability to easily add other pages.</p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			<wfw:commentRss>http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-2-reading-json-from-files/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Building a simple joke site with nodejs &#8211; Part 1 &#8211; Hello World</title>
		<link>http://blog.pnapieralski.com/nodejs/getting-started-with-nodejs-part-1/</link>
		<comments>http://blog.pnapieralski.com/nodejs/getting-started-with-nodejs-part-1/#comments</comments>
		<pubDate>Sat, 16 May 2015 00:59:42 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=184</guid>
		<description><![CDATA[If you&#8217;ve heard about nodejs and always wanted to get started with it, look no further! I&#8217;ll walk you through the basics of getting set-up and building a super simple joke website from start to finish, using my current website happypolack.com as a goal to get to. NOTE: These tutorials were written with node version [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>If you&#8217;ve heard about nodejs and always wanted to get started with it, look no further! I&#8217;ll walk you through the basics of getting set-up and building a super simple joke website from start to finish, using my current website <a href="http://happypolack.com">happypolack.com</a> as a goal to get to.</p>
<p><b>NOTE:</b> These tutorials were written with node version 0.12.4 and npm version 2.10.1. Type &#8220;node -v&#8221; and &#8220;npm -v&#8221; to see your versions</p>
<h2>Why nodejs?</h2>
<p>NodeJS was engineered from the ground up to be excellent at server event driven websites and services. It&#8217;s also much easier to develop in (once you get the hang of it), since you can use the same language that you use for the front-end (javascript!). Finally, the node package manager (NPM) allows you to simply and easily utilize a world of different open source and free code bases instantly!</p>
<h2>Installation</h2>
<h3>For Windows users</h3>
<p>Since I still use windows at home, I&#8217;m going to first walk through these instructions assuming you are running windows as well.</p>
<ol>
<li>Download the (msi) installer from the <a href="https://nodejs.org/#download">nodejs website</a>
</li>
<p><a href="http://blog.pnapieralski.com/wp-content/uploads/2015/05/1.png" rel="shadowbox[sbpost-184];player=img;"><img src="http://blog.pnapieralski.com/wp-content/uploads/2015/05/1.png" alt="NodeJS Website" width="485" height="250" class="alignnone size-full wp-image-186" /></a></p>
<li>For the Install directory, I chose something a bit easier to remember:
<pre class="brush: plain; title: ; notranslate">
D:\nodejs
</pre>
</li>
<li>
That&#8217;s it! Now, when you want to run a server, you can simply type &#8220;node <somefile>.js&#8221; in your command prompt.
</li>
</ol>
<h3>For Mac OS X users</h3>
<p>A fantastic command line package manager for mac os is called <a href="http://brew.sh/">brew</a>. Once you install that, you can easily install node by simply typing:</p>
<pre class="brush: plain; title: ; notranslate">
brew install node
</pre>
<p>That&#8217;s it!</p>
<h2>A helloworld &#8220;website&#8221;</h2>
<ul>
<li>
Create a file called &#8220;helloworld.js&#8221; in an easy to remember directory (I chode D:\nodescripts) and add the following content to it:</p>
<pre class="brush: jscript; title: ; notranslate">
var http = require('http');

http.createServer(function (req, res) {
	res.writeHead(200, {'Content-Type': 'text/html'});
	res.end('Hello World\n');
}).listen(80, &quot;127.0.0.1&quot;);

console.log('Server running at http://127.0.0.1:80/');
</pre>
</li>
<li>Now open up the command prompt and navigate to your file:
<pre class="brush: plain; title: ; notranslate">
cd D:\nodescripts
</pre>
</li>
<li>To start your local web server, now type:
<pre class="brush: plain; title: ; notranslate">
node helloworld.js
</pre>
</li>
<li>
You should see the message</p>
<pre class="brush: plain; title: ; notranslate">
Server running at http://127.0.0.1:80
</pre>
</li>
<li>Open your browser and navigate to http://127.0.0.1 (also known as http://localhost)</li>
<li>Viola!</li>
</ul>
<h2>Summary</h2>
<p>See how easy that was? Now you&#8217;re ready to get started with nodejs. Stay tuned for <a href="http://blog.pnapieralski.com/nodejs/building-a-simple-joke-site-with-nodejs-part-2-reading-json-from-files/">part 2</a>.</p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			<wfw:commentRss>http://blog.pnapieralski.com/nodejs/getting-started-with-nodejs-part-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Leaving Microsoft after 3 years, on to Qualtrics</title>
		<link>http://blog.pnapieralski.com/personal/leaving-microsoft-after-3-years-on-to-qualtrics/</link>
		<pubDate>Fri, 01 May 2015 02:54:20 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[Motivation]]></category>
		<category><![CDATA[personal]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=181</guid>
		<description><![CDATA[Over the past 3 years, I&#8217;ve had the pleasure working with some incredibly bright and motivated people at Microsoft and I&#8217;ll forever be thankful for the time I spent there. But, I recently switch to a &#8220;Full Stack Software Engineering&#8221; position at Qualtrics. Read on if you want my whole story. My journey at Microsoft [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Over the past 3 years, I&#8217;ve had the pleasure working with some incredibly bright and motivated people at Microsoft and I&#8217;ll forever be thankful for the time I spent there. But, I recently switch to a &#8220;Full Stack Software Engineering&#8221; position at Qualtrics. Read on if you want my whole story.</p>
<h2>My journey at Microsoft</h2>
<h3>As a program manager</h3>
<p>I actually started at Microsoft as a Program Manager (PM) in May 2012, fresh from graduating at Clemson University with a MS in Computer Science. When I graduated, I honestly wasn&#8217;t sure whether or not a PM position was right for me &#8211; and I had a few other Software Engineering jobs on the table. However, Microsoft&#8217;s interview loop for the PM role was immensely interesting, so I decided to give it a try. </p>
<p>I actually loved being a PM when I first got there &#8211; I was able to write snippets of code when I needed and I was able to work with external partners, which I loved, who were building apps for Windows 8.  Throughout my team as a PM, I was even lucky to travel to a number of conferences. I gave a total of 4 talks at two different //Build conferences (once in Redmond, once in San Francisco), 1 talk at TechEd China in Beijing and 1 talk (joint with others) at GDC (in San Francisco). I even had the pleasure of going to LA to talk with partners once. This was all within a 1 year span of being on the team &#8211; and I was loving it.</p>
<p>But after about 9 months into the role, I encountered a personal struggle with the PM role. The problem that I could never get over was that I never really had the chance to actually dive deep into the Windows source code and understand the very root of why things are the way they are, down to the minutiae that makes Windows what it is &#8211; and that bothered me. My other PM priorities were simply more important.</p>
<h3>Diving deep as a software engineer</h3>
<p>So, after about a year on the Windows team as a PM, I switched to a position in Office for Windows Phone/Tablet as a Software Engineer. I knew, immediately, that I made the right move in becoming a software engineer. I now had the power, and the network of fellow smart developers, to dive deep into the codebase for a massive product (in terms of code and user base!). It was awesome, to say the least &#8211; and my career was growing faster than I thought possible at such a large company. </p>
<p>But, not long after being in this role, I felt like something was missing. I wasn&#8217;t given the amount of freedom I had as a PM. In fact, many days, I could crank out some code with minimal interaction with other people. I also am proud of the fact that I fixed well over 150 bugs in the Office for Windows Phone/Tablet codebases, but that just isn&#8217;t as satisfying as saying &#8220;I built X architecture from the ground up.&#8221; After over 1.5 years in Office, I felt I needed a bigger challenge. However, it would be silly to think I, alone or with a small team, could change a product like Office (or Windows, Bing or any other Microsoft product) in the near term, so I decided to try my hand at a much smaller company.</p>
<h3>The white knight?</h3>
<p>When the &#8220;I need to find a new job&#8221; switch finally flipped all the way, I started looking for companies in the area and stumbled upon many early stage startups that weren&#8217;t necessarily proven yet. I felt that going from a massive stable company like Microsoft to a barely stage A startup would be, in my mind, too risky. </p>
<p>However, I found out, from my wife actually, that a decent sized company, Qualtrics, whose headquarters is in Utah (that&#8217;s weird?) just opened an office in Seattle. In fact, when I had my first phone interview with the recruiter, they hadn&#8217;t even gotten the keys to the building yet. This company wasn&#8217;t exactly a startup &#8211; they had something like 700 total employees (<100 engineers) and already had over $200 million from VCs when I first came in contact with them. But, what was awesome about the whole situation was that the Seattle office was going to be almost it's own start-up inside a bigger company - it's own products and features and everything.

So, I interviewed with a couple companies and actually, Qualtrics was my first offer. I didn't take long to accept - I knew the opportunity was going to be right for me.

After ~2 months at Qualtrics, I can safely say I made the right choice. I'm now given significant ownership over what I used to have. I'm talking to partners on a semi-regularly basis and also coding and doing architecture work. It's almost like my previous two roles at Microsoft were combined into one "super role" that, I guess, is sometimes called a "tech lead."



<h3>Memo to future Phil</h3>
<p>I didn&#8217;t actually think I would put anything about this particular transition in my life in this blog, but I think it&#8217;s important that I do on occasion. It helps to be constantly reminded of our past so that we know where we are going as we move forward. As Steve Jobs said in a commencement speech, &#8220;You can&#8217;t connect the dots looking forward, you can only connect them looking backwards.&#8221; If I don&#8217;t constantly look at the dots I&#8217;ve laid previously, how will I ever know that I&#8217;m going the right direction? The majority of dots in my past seem, at least to me, to not have a clear picture in focus &#8211; but I think the recent dots laid out are starting to take shape into something much bigger. I can&#8217;t wait to see what dots I lay in the next 5-10 years.</p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			</item>
		<item>
		<title>How do I unzip multiple files in the windows command prompt (using 7-zip)?</title>
		<link>http://blog.pnapieralski.com/windows/how-do-i-unzip-multiple-files-in-the-windows-command-prompt-using-7-zip/</link>
		<pubDate>Sat, 20 Dec 2014 19:43:47 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[command prompt]]></category>
		<category><![CDATA[files]]></category>
		<category><![CDATA[unzip]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=175</guid>
		<description><![CDATA[Unfortunately, Windows does not come stock with a way to unzip multiple files either in the file explorer or in the command prompt. Luckily, 7-zip is an open-source tool that does this beautifully from the command prompt! 7-zip Get 7-zip for windows and install it. I installed the x64 version to C:\Program Files\7-zip, however, make [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Unfortunately, Windows does not come stock with a way to unzip multiple files either in the file explorer or in the command prompt.</p>
<p>Luckily, 7-zip is an open-source tool that does this beautifully from the command prompt!</p>
<h2>7-zip</h2>
<p><a href="http://www.7-zip.org/download.html" title="Get 7-zip">Get 7-zip</a> for windows and install it. I installed the x64 version to C:\Program Files\7-zip, however, make note if you installed it to a different directory.</p>
<h2>The command prompt</h2>
<p>Let&#8217;s get these files unzipped!</p>
<ol>
<li>Open up a command prompt by typing &#8220;WindowsKey+R&#8221; and typing &#8220;cmd.&#8221; <b>NOTE:</b>If you get permission errors when extracting files, you likely need to run &#8220;cmd&#8221; as an administrator by right-clicking the program/shortcut to it and clicking &#8220;Run as Administrator&#8221;</li>
<li>Type &#8220;cd C:\Program Files\7-zip&#8221; to get to the directory where you installed 7-zip (so you can run their 7z program from the command line). If you changed the install directory, be sure to change the second part of that command to the directory where it&#8217;s installed</li>
<li>Type &#8220;for %f in (&#8220;<b>C:\Path\</b>*.zip&#8221;) do 7z x &#8220;%f&#8221;   <b>NOTE:</b> Replace C:\Path with the directory where your many .zip files are stored.</li>
</ol>
<p>Boom, that&#8217;s it! However, your files will all be unzipped to Program Files/7-Zip folder. If you want to change that, you can set the &#8220;-o&#8221; property when running the 7z command, or add the 7-zip folder to your windows &#8220;Path&#8221;. </p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			</item>
		<item>
		<title>Spaceship Destroyer on Google Play (a post-mortem)</title>
		<link>http://blog.pnapieralski.com/haxeflixel/spaceship-destroyer-on-google-play-a-post-mortem/</link>
		<pubDate>Mon, 01 Dec 2014 16:30:51 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[cross-platform]]></category>
		<category><![CDATA[haxe]]></category>
		<category><![CDATA[haxeflixel]]></category>
		<category><![CDATA[Post-mortem]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=162</guid>
		<description><![CDATA[Everything on this blog is something that I&#8217;ve put into a product, or created a prototype using. My latest adventures into haxeflixel is no exception. Introducing Spaceship Destroyer When I first started dabbling n haxeflixel, my goal was to be able to pet all my old flash flixel games to mobile. Today, I finally realized [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Everything on this blog is something that I&#8217;ve put into a product, or created a prototype using. My latest adventures into haxeflixel is no exception.</p>
<h2>Introducing Spaceship Destroyer</h2>
<p>When I first started dabbling n haxeflixel, my goal was to be able to pet all my old flash flixel games to mobile. Today, I finally realized that goal. Check out my &#8220;studio&#8221; website at http://fantongstudios.com to get to starship destroyer.</p>
<h2>Learning experiences</h2>
<p>No matter how much you scope the game down to, you&#8217;ll need to scope it down even more to ship in a reasonable timeframe. I hear all the time of people that start projects and never finish them &#8211; I&#8217;ve even done that twice in the past month! I even remember reading on Reddit about a guy that spent 7 years developing a game. He kept pushing it off, doing a little bit, then pushing it off again. The problem with that is, naturally, the lack of immediate satisfaction. Another problem is that you are going to change <a href="https://www.ted.com/talks/dan_gilbert_you_are_always_changing/transcript?language=en" title="Future self ted talk">a LOT</a> in 7 years (or 2 years, however long it takes you to build it). By the time he finished the game, you could tell the difference between the beginning and the end of the game.</p>
<p>Ultimately, I went into Spaceship Destroyer thinking of having 10 different levels, many in-app purchases, in-game ads, launching on iOS and Android, and many more bosses and enemies. What I ended up with was a great game that has 5 levels, 2 in-app purchases (that are great values if you like the game), and 16 upgrades. </p>
<h2>Integrating achievements and leaderboard</h2>
<p>The most interesting to implement was the achievements and leaderboards. I opted to use Google Play for both, which was super easy using HaxeFlixel and <a href="http://blog.pnapieralski.com/haxeflixel/how-do-i-use-google-play-services-with-haxeflixel/" title="Google Play Achievements with HaxeFlixel">Sergey&#8217;s extensions</a>. The gist of the setup is, you get an ID from the <a href="https://play.google.com/apps/publish/" title="Google Play Console">Google Play Developer Console</a>, plug that ID into the extension APIs when some event occurs (eg; killed 500 enemies), and watch as it just magically works! The set-up was very minimal.</p>
<h2>Monetization</h2>
<p>The hardest part when I was creating this game was monetization. I originally was thinking of having ads after every level you beat (which I still may do), but ultimately, it was easiest to support in-app purchases with HaxeFlixel when I originally created the game. So, I opted for 2 in-app purchases that allows you to buy coins to purchase upgrades.</p>
<p>How has it worked so far? Well, I&#8217;ll tell you once people start <a href="http://fantongstudios.com/" title="Starship Destroyer">downloading it</a> :), which brings me to my last point of monetization &#8211; marketing!</p>
<p>Marketing has always alluded me. I started a small, very focused, campaign on AdWords that ultimately got me <100 clicks and only a few actual installs. However, I chose cheap keywords and also chose a low budget. Perhaps if I went all in with marketing and decided to spend hundreds, it might pay off.



<h2>Conclusion</h2>
<p>Overall, Spaceship Destroyer was a labor of love. My love for bullet hell shoot-em-up games, gradius, R-type and similar games forced me to make this game. It had some unique challenges, in terms of scope, implementation and monetization, but it was worth it in the end (though, maybe not financially)!</p>
<p>Don&#8217;t forget to check it out on <a href="http://fantongstudios.com" title="Fantong Studios - Starship Destroyer">fantongstudios.com</a></p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			</item>
		<item>
		<title>Dreamhost deals black friday weekend!</title>
		<link>http://blog.pnapieralski.com/deals/dreamhost-deals-black-friday-weekend/</link>
		<comments>http://blog.pnapieralski.com/deals/dreamhost-deals-black-friday-weekend/#comments</comments>
		<pubDate>Sat, 29 Nov 2014 22:37:24 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[deals]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=169</guid>
		<description><![CDATA[My web host rocks! I always believed that Dreamhost has challenged the status quo. They&#8217;ve been pushing the boundaries of technology and service ever since I started with them. I recall not too long after starting this blog (almost 7 years ago now), not knowing a thing about web development. Luckily, they were the first [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>My web host rocks!</strong><br />
I always believed that Dreamhost has challenged the status quo. They&#8217;ve been pushing the boundaries of technology and service ever since I started with them.</p>
<p>I recall not too long after starting this blog (almost 7 years ago now), not knowing a thing about web development. Luckily, they were the first company to offer one-click wordpress installation (which, of course, they still do). I had this blog up and running in, literally, 10 minutes after signing up!</p>
<p><del datetime="2014-12-03T07:09:09+00:00"><strong>Deals</strong></p>
<p>There&#8217;s an amazing deal this weekend if you&#8217;re looking to jump into web development/hosting and are looking to start something THIS WEEKEND, check out their deal at their <a href="http://www.dreamhost.com/" title="Dreamhost">homepage</a>.</p>
<p>2.95/mo + 1 free domain only this black friday weekend, you literally cannot beat that!</del></p>
<p>The deal looks to be winding down, but you can still sign-up using this <a href="http://www.dreamhost.com/r.cgi?570981" title="Dreamhost Promo">link</a> or my promo code FROMMYFRIENDPHIL &#8211; this will give you $90 off!</p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			<wfw:commentRss>http://blog.pnapieralski.com/deals/dreamhost-deals-black-friday-weekend/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>3 tips for working with haxelib</title>
		<link>http://blog.pnapieralski.com/flixel/3-tips-for-working-with-haxelib/</link>
		<comments>http://blog.pnapieralski.com/flixel/3-tips-for-working-with-haxelib/#comments</comments>
		<pubDate>Thu, 14 Aug 2014 01:05:25 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[cross-platform]]></category>
		<category><![CDATA[Flixel]]></category>
		<category><![CDATA[haxe]]></category>
		<category><![CDATA[haxeflixel]]></category>
		<category><![CDATA[cross-platform development]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=160</guid>
		<description><![CDATA[Tip 1 &#8211; Pointing haxelib library to git repository Did you just fork flixel-addons to tweak an out-of-date control? I recently had to do this to add touch support to FlxButtonPlus &#8211; this is truly the power of open source! Here&#8217;s what you can do: Now, wait for the download to finish and confirm everything [&#8230;]]]></description>
				<content:encoded><![CDATA[<blockquote>
<h2>Tip 1 &#8211; Pointing haxelib library to <i>git</i> repository</h2>
<p>Did you just fork flixel-addons to tweak an out-of-date control? I recently had to do this to add touch support to FlxButtonPlus &#8211; this is truly the power of open source!</p>
<p>Here&#8217;s what you can do:</p>
<pre class="brush: xml; title: ; notranslate">
haxelib git
&gt; Library name : flixel-addons
&gt; Git path : &lt;paste git repository URL here&gt;
</pre>
<p>Now, wait for the download to finish and confirm everything is working as expected by doing:</p>
<pre class="brush: xml; title: ; notranslate">
haxelib list 
&gt; actuate: [1.7.5]
&gt; firetongue: [1.0.0]
&gt; flixel-addons: 1.1.0 git [dev:C:\HaxeToolkit\haxe\lib\flixel-addons/git]
&gt; flixel-demos: [1.1.1]
&gt; flixel-editors: git [dev:C:\HaxeToolkit\haxe\lib\flixel-editors/git]
...
</pre>
<p>In the output, you see that flixel-addons list two options, a stable version 1.1.0 and the actual git repository.</p>
<h2>Tip 2 &#8211; switching between haxelib versions</h2>
<p>Now that you have a stable 1.1.0 version and the git version, you will automatically be working using the latest and greatest in the git repository. But, what if you aren&#8217;t ready yet?</p>
<p>Here&#8217;s how to compile using flixel-addons version 1.1.0 &#8211; this works with all haxelibs and versions:</p>
<pre class="brush: plain; title: ; notranslate">
haxelib set flixel-addons 1.1.0
</pre>
<p>Likewise, if I wanted to downgrade/upgrade anyother library, I could via <i>haxelib set</i></p>
<h2>Tip 3 &#8211; keeping everything up-to-date</h2>
<p>To keep everything up-to-date, there are two ways:</p>
<p>1. Upgrading an individual haxelib:</p>
<pre class="brush: plain; title: ; notranslate">
haxelib update &lt;haxelib name, eg; flixel-addons&gt;
</pre>
<p>If the library is pointing to a git repository, it will simply do a pull from the git repository (how cool is that?).</p>
<p>2. Upgrade all haxelibs at once</p>
<pre class="brush: plain; title: ; notranslate">
haxelib upgrade
</pre>
<p>Now wait&#8230; boom, done!</p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			<wfw:commentRss>http://blog.pnapieralski.com/flixel/3-tips-for-working-with-haxelib/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How do I use google play services with HaxeFlixel?</title>
		<link>http://blog.pnapieralski.com/haxeflixel/how-do-i-use-google-play-services-with-haxeflixel/</link>
		<pubDate>Sun, 29 Jun 2014 21:29:15 +0000</pubDate>
		<dc:creator><![CDATA[Phillip Napieralski]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[haxeflixel]]></category>

		<guid isPermaLink="false">http://blog.pnapieralski.com/?p=156</guid>
		<description><![CDATA[You use Sergey Miryanov&#8217;s Google Play android extension that&#8217;s what! Find it here: https://github.com/sergey-miryanov/linden-google-play And sample here: https://github.com/sergey-miryanov/linden-samples]]></description>
				<content:encoded><![CDATA[<p>You use Sergey Miryanov&#8217;s Google Play android extension that&#8217;s what!</p>
<p>Find it here: <a href="https://github.com/sergey-miryanov/linden-google-play" title="google play services with haxeflixel">https://github.com/sergey-miryanov/linden-google-play </a></p>
<p>And sample here: <a href="https://github.com/sergey-miryanov/linden-samples" title="google play services with haxeflixel">https://github.com/sergey-miryanov/linden-samples</a></p>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>
	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<!-- blog-pnapieralski-med-rect -->
	<ins class="adsbygoogle"
		 style="display:inline-block;width:300px;height:250px"
		 data-ad-client="ca-pub-8879106254061711"
		 data-ad-slot="6429668224"></ins>
	<script>
	(adsbygoogle = window.adsbygoogle || []).push({});
	</script>]]></content:encoded>
			</item>
	</channel>
</rss>
