<?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>Blog &#8211; Aaron Saray</title>
	<atom:link href="http://aaronsaray.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://aaronsaray.com</link>
	<description>Milwaukee Web Developer, PHP Programmer</description>
	<lastBuildDate>Tue, 21 Jul 2015 18:20:57 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.4.1</generator>
	<item>
		<title>Stop fast taps acting like double-tap-to-zoom</title>
		<link>http://aaronsaray.com/blog/2015/07/21/stop-fast-taps-acting-like-double-tap-to-zoom/</link>
		<comments>http://aaronsaray.com/blog/2015/07/21/stop-fast-taps-acting-like-double-tap-to-zoom/#respond</comments>
		<pubDate>Tue, 21 Jul 2015 18:20:57 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1868</guid>
		<description><![CDATA[I have been making a number pad on a webpage for mobile browsers &#8211; and one problem I kept running into is double tap to zoom&#8217;ing when I didn&#8217;t want it. So, basically, people were typing too fast on the screen&#8217;s number buttons &#8211; and that would execute a zoom. Turns out, with a little [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I have been making a number pad on a webpage for mobile browsers &#8211; and one problem I kept running into is double tap to zoom&#8217;ing when I didn&#8217;t want it.</p>
<p>So, basically, people were typing too fast on the screen&#8217;s number buttons &#8211; and that would execute a zoom.  Turns out, with a little bit of jQuery, you can get rid of this annoying problem.  </p>
<p></p><pre class="crayon-plain-tag">$(body).on('touchend', '.number-keys', function(e) {
    e.preventDefault();
    e.target.click();
});</pre><p></p>
<p>Here, you just watch for touch-end on the body, limit that to your number-keys (or any selector you want), and prevent the touch end &#8211; and instead issue a click.  That way it&#8217;ll work like a standard tap and not a double-tap and zoom.<br />
Keep in mind, it&#8217;s probably best practice to only disable this on areas that need it &#8211; not the entire body &#8211; because then you&#8217;re removing some of the usability of your page.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/07/21/stop-fast-taps-acting-like-double-tap-to-zoom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3 Steps to the Best Programmer&#8217;s Cover Letter</title>
		<link>http://aaronsaray.com/blog/2015/07/11/3-steps-to-the-best-programmers-cover-letter/</link>
		<comments>http://aaronsaray.com/blog/2015/07/11/3-steps-to-the-best-programmers-cover-letter/#comments</comments>
		<pubDate>Sat, 11 Jul 2015 20:03:09 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1854</guid>
		<description><![CDATA[The other day I found myself giving advice and revisions to a fellow PHP programmer about his cover letter for his next job application. That really inspired me to help out and write this entry. I&#8217;ve had a lot of experience hiring programmers, so I thought I&#8217;d take a look at this fellow&#8217;s cover letter. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><em>The other day I found myself giving advice and revisions to a fellow PHP programmer about his cover letter for his next job application.  That really inspired me to help out and write this entry.</em></p>
<p>I&#8217;ve had a lot of <a href="/resume">experience</a> hiring programmers, so I thought I&#8217;d take a look at this fellow&#8217;s cover letter.  After quickly reviewing it, I realized it was just a shortened version of his resume and maybe one personal paragraph.  This won&#8217;t do!  I wanted him to be successful.  </p>
<h2>The Connection Letter</h2>
<p>Really, the cover letter should be called the connection letter.  Whether it&#8217;s the email that is sent with an attached resume, or an actual letter attached to the resume, the purpose of this letter is to connect to the recipient.  Automated systems scan the resume for keywords &#8211; and sometimes the HR department does a cursory glance over it to make sure it passes a few filters &#8211; but that cover letter is really what connects with the hiring manager.  </p>
<p>When a hiring manager reviews your resume with a cover letter &#8211; they have two choices: read the cover letter and then the resume, or skip over the letter and just look for qualifications.  You have precious few seconds to grab attention with this cover letter (come to think of it, it&#8217;s like a marketing webpage in that way).  So, make them count.  Otherwise, they&#8217;re going to do what I did a lot: skip over the cover letter and scan the resume to see if this is an extremely well qualified candidate &#8211; because they sure can&#8217;t write.</p>
<h2>The Three Steps</h2>
<p>So, you know you have to grab attention, but what else do you need to do?  Add clarification beyond the resume details and share your personality.  We all know that the official hiring stance is to hire the best qualified person for the job, but <a href="http://www.businessinsider.com/companies-are-hiring-for-personality-2014-9">managers are hiring based on personality</a> also.  The power of the team is stronger than just the individual, so you must be a good fit &#8211; and someone that they want to spend at least 8 hours of their life with every day.</p>
<p>So, let&#8217;s get into the three steps &#8211; or three parts of the <strong>connection letter</strong>.</p>
<h3>Step 1: Grab Attention</h3>
<p>Those first few sentences are where you need to get the attention of the reader.  But, how do we do that?  Simple &#8211; we focus on their needs at this exact moment.</p>
<p>See, we know that the reader has a very big problem, and since they&#8217;re reading resumes right NOW, they&#8217;re focusing on that right now.  We actually have the upper hand because we know exactly what the focus of the reader is: they need to solve a problem &#8211; and that problem is getting some more work done.</p>
<p>I bet you thought I&#8217;d say getting a great programmer on the team?  Nope &#8211; the actual need is getting more work done.  The programmer is just the path to get to the solution.  So often I see programmers begin their cover letter with descriptions of their history or their qualifications.  But, that doesn&#8217;t meet the need &#8211; the need is to get more work done.  The solution is to get a good programmer in there to reduce the workload.  So, we know exactly what we have to do.</p>
<p>First step is to connect with the need.  You may want to talk about the work load, connect with them about their busy schedules, etc.  Whatever fits your personality style.  The point is to stay away from &#8220;I&#8221; and focus on them.  Bonus points if you do a bit of research and can actually address particular needs they might have.  The end of this is to transition to how you can fit that need.</p>
<h3>Step 2: Indirectly Fit Their Need</h3>
<p>This is where you can to speak about yourself.  Here you can share a summary of your experience.  And even better yet, if you can find a way to relate a personal project or a work project to the current business, that&#8217;s great!  This is the place to quickly summarize the resume, but more so to add additional detail on a few key points that relate to this position. </p>
<p>This means that you need to be intimately familiar with the job posting.  A standard cover letter will not suffice for this step.  You must take the time to tailor your qualifications to fit this position &#8211; otherwise you&#8217;re just summarizing your resume and bragging.  And, I bet you&#8217;d rather get the job than just brag to the hiring manager.</p>
<p>I&#8217;ve heard from some programmers in the past that they&#8217;re too busy applying to write custom cover letters.  Hogwash!  Hogwash I say!  There are two things wrong with this statement.  First, if you&#8217;re job hunting, you have the time.  Instead of working 8 hours today, you&#8217;re just applying for jobs.  Trust me, you have the time.  Put away the PS4, xBox, Cheetos and self-pity, plop yourself down in front of this computer, and write write write!  </p>
<p>The second reason this statement irks me is because of the quality vs quantity argument.  If you&#8217;re so busy applying for so many jobs like this, chances are you&#8217;re applying for the wrong jobs.  Slow down and focus on the ones that you may be a good fit for.  If you invest the time in pitching just a few jobs, those will work out for you.  Trust me, I received a lot of resumes when I was hiring for programmers &#8211; but the ones that actually stood out were the ones that I saw took time to invest in their cover letter and resume.  See, if you can&#8217;t take the time to invest in the application process, I don&#8217;t know if I&#8217;ll trust you to spend the proper time doing the work.</p>
<h3>Step 3: Confidently Submit Yourself</h3>
<p>The last section of the cover letter is to do the ask.  A lot of us programmers are used to working in the background and not having to do a lot of sales.  Some of us are introverts.  And by and large, many of the most talented programmers just don&#8217;t act confidently enough when it comes to the application process.  </p>
<p>You&#8217;ve worked hard to get to this point, so it&#8217;s time to show it.  Instead of asking if it&#8217;s ok for a phone call or response, carefully tailor your last few sentences into a confident requests for times that you can chat with the hiring manager.  The subtle difference here is that you&#8217;re showing that you know you&#8217;re a fit for the position and you have every intention of moving forward.  There was nothing that turned me off from a candidate more than their lack of close at the end.  It almost seemed like they weren&#8217;t interested in the position by the time they got to the end of the letter.  I&#8217;ve seen it shift from a job-seeker to job-hirer and back and forth market.  But, regardless of who &#8220;has the power,&#8221; it&#8217;s important to understand that this is a two way conversation with give and take on both sides.  You are planning on spending a third of your life here for the foreseeable future, so act like it!</p>
<h3>Bonus Step: The PS</h3>
<p>When you apply to a programming job, you should be ready to stand on your merits alone.  Just because a friend referred you doesn&#8217;t necessarily mean that the hiring manager should look upon you more fondly.  In fact, it can be a distraction.  So instead, I suggest using any referral as your PS.  Once you&#8217;ve (hopefully) successfully made your case to have the hiring manager move past your cover letter and truly evaluate your resume, this is where you drop the last bomb on them.  Your referral.</p>
<p>The best way to put this is something that just mentions the referral had good things to say or thought you&#8217;d be a great fit.  You may even joke about having to buy them lunch or something in return for the great connection they&#8217;ve made.  But, point being, it should be a light-hearted name-drop and not a demand.  I&#8217;ve seen people use phrases like &#8220;so and so recommended me, so you know I&#8217;m good.&#8221;  Woah!  Hell no &#8211; don&#8217;t do that.</p>
<h2>End Notes</h2>
<p>I know there is a lot of competing information out there, especially from higher level educational institutes about what a cover letter and a resume should be.  I really believe that these people are trying their best to give a good answer to the millions of applications out there.  But, programming is different, programmers are special.  This job is hard and there is a lot of competition.  Remember, you&#8217;re not writing a cover letter, you&#8217;re writing a <strong>connection letter</strong>.  This is the time to share your personality, to make connections with the hiring manager, and to show you care about the position.  Now, start writing better cover letters and win those jobs!</p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/07/11/3-steps-to-the-best-programmers-cover-letter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>One-time Scrolling Banner with jQuery</title>
		<link>http://aaronsaray.com/blog/2015/06/29/one-time-scrolling-banner-with-jquery/</link>
		<comments>http://aaronsaray.com/blog/2015/06/29/one-time-scrolling-banner-with-jquery/#respond</comments>
		<pubDate>Mon, 29 Jun 2015 22:02:11 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1852</guid>
		<description><![CDATA[I&#8217;m not gonna lie &#8211; I was really trying to figure out how to put more keywords onto the home page of my company, 201 Creative, besides just the trademark: &#8220;Let&#8217;s make software simple.&#8221; So, I messed around with making a rotating banner on the home page that alternated through words that described the concept. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m not gonna lie &#8211; I was really trying to figure out how to put more keywords onto the home page of my company, <a href="http://201creative.com">201 Creative</a>, besides just the trademark: &#8220;Let&#8217;s make software simple.&#8221;  So, I messed around with making a rotating banner on the home page that alternated through words that described the concept.  However, I found it annoying and eventually gave up on the idea.  I didn&#8217;t want to just delete it, though, because it was really light-weight and did something I didn&#8217;t really see anywhere else.</p>
<p>So, I don&#8217;t have a need for it for this particular site &#8211; but maybe you do?  Check out the <a href="/demo/scroll-and-stop.html">Scroll and stop demo in jquery</a>.</p>
<h3>The Code</h3>
<p>The mark-up is very simple.  Just a div, and a UL of terms:</p>
<p></p><pre class="crayon-plain-tag">&lt;div id=&quot;hero&quot;&gt;Let's make software &lt;ul id=&quot;scroller&quot;&gt;&lt;li&gt;stream-lined.&lt;/li&gt;&lt;li&gt;effective.&lt;/li&gt;&lt;li&gt;simple.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</pre><p></p>
<p>Next, let&#8217;s look at the very small amount of CSS required:</p>
<p></p><pre class="crayon-plain-tag">#hero {
    font-size: 5rem;
}
#hero ul {
    vertical-align: top;
    margin: 0;
    padding: 0;
    list-style-type: none;
    display: block;
    height: 6rem;
    overflow: hidden;
}</pre><p></p>
<p>First, set the size of the font so we know what size the scrolling box will need to be.  Then, position our UL aligned vertically, with no padding or margin, and cut it off after the first word with the height/overflow styles.</p>
<p>Finally, we need to have some javascript to rotate these.  I used jQuery to save some time &#8211; but this could be done without it as well.</p>
<p></p><pre class="crayon-plain-tag">var $scrollingUL = $('#scroller');

function scroller(element)
{
    var $nextSibling = $(element).next();
    if ($nextSibling.length) {
        setTimeout(function() {
            $scrollingUL.animate({
                scrollTop: $scrollingUL.scrollTop() + $nextSibling.height()
            }, 400, function() {
                scroller($nextSibling);
            })
        }, 5000);

    }
}

scroller($('#hero ul li:first-child'));</pre><p></p>
<p>Let&#8217;s look over the pieces here first.  (Just a reminder &#8211; if you&#8217;re making a bigger project, you might want to encapsulate this functionality into a module.)  First, get a reference to the scoller UL.  Since the function is ran multiple times, I don&#8217;t want to search for that item each time.  Next, call the scroller() function with an element: the first element in the scroller ul.  The function gets the next sibling, and if it exists, sets a time-out to animate it to the next position &#8211; afterwards it calls itself. (Yay recursion). </p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/06/29/one-time-scrolling-banner-with-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Keep user&#8217;s scroll position in scrollable div</title>
		<link>http://aaronsaray.com/blog/2015/06/23/keep-users-scroll-position-in-scrollable-div/</link>
		<comments>http://aaronsaray.com/blog/2015/06/23/keep-users-scroll-position-in-scrollable-div/#respond</comments>
		<pubDate>Tue, 23 Jun 2015 21:39:06 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1863</guid>
		<description><![CDATA[The other day I was faced with an issue that I need to be able to keep the scroll position of a user in a overflow-y scrollable div. Turns out &#8211; with a combination of javascript and local storage, this is pretty easy. TWO NOTES First, instead of using local storage, you could also use [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>The other day I was faced with an issue that I need to be able to keep the scroll position of a user in a overflow-y scrollable div.  Turns out &#8211; with a combination of javascript and local storage, this is pretty easy.</p>
<p><strong>TWO NOTES</strong> First, instead of using local storage, you could also use a cookie.  And second, my project already had jQuery in it &#8211; it&#8217;s not required for this solution.</p>
<p></p><pre class="crayon-plain-tag">var $blockList = $('.block-list');
if ($blockList.length &amp;&amp; window.localStorage) {
    $(window).on('unload', function () {
        var scrollPosition = $blockList.scrollTop();
        localStorage.setItem('blockListScrollPosition', scrollPosition);
    });

    var position = localStorage.getItem('blockListScrollPosition');
    if (position) {
        $blockList.scrollTop(position);
    }
}</pre><p></p>
<p>In this example, the div (or really any element) has a class of &#8216;block-list&#8217; to be used by this snippet.  Here&#8217;s the outline of the functionality:</p>
<p>First, get the element that has .block-list as a class.<br />
Next, if it exists and localStorage is available, do the functionality.<br />
The functionality is to add an unload handler on the window object.  When the user leaves the page, the scroll top position will be set into local storage.<br />
Finally, any time there is a stored value for the scroll position, the element is scrolled to that position.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/06/23/keep-users-scroll-position-in-scrollable-div/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Documentation Tools for PHPStorm</title>
		<link>http://aaronsaray.com/blog/2015/05/19/documentation-tools-for-phpstorm/</link>
		<comments>http://aaronsaray.com/blog/2015/05/19/documentation-tools-for-phpstorm/#respond</comments>
		<pubDate>Tue, 19 May 2015 19:56:05 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[web tools]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1815</guid>
		<description><![CDATA[I like when projects have documentation, yet I hate writing it. That&#8217;s why I rely on phpDocumentor to do most of my documentation for my project. Recently, I&#8217;ve also discovered a new tool for documenting my API: ApiDoc. I&#8217;ve also been relying heavily on vagrant for my projects. So, when it came to generating this [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I like when projects have documentation, yet I hate writing it.  That&#8217;s why I rely on <a href="http://www.phpdoc.org/">phpDocumentor</a> to do most of my documentation for my project.  Recently, I&#8217;ve also discovered a new tool for documenting my API: <a href="http://apidocjs.com/">ApiDoc</a>.  I&#8217;ve also been relying heavily on vagrant for my projects.  </p>
<p>So, when it came to generating this documentation, I wanted to make sure that I didn&#8217;t have to do too much work.  So, I configured PHPStorm with external tools over SSH using vagrant configurations to do this.</p>
<p>Let&#8217;s have a quick look:</p>
<h3>Setting up the Tools</h3>
<p>First, <a href="http://www.phpdoc.org/docs/latest/getting-started/installing.html">install phpDocumentor</a> to your virtual machine.  I happened to have mine installed as a global binary on this project vm.</p>
<p>Second, <a href="http://apidocjs.com/#install">install apiDoc</a> using npm.</p>
<p>Next, Go to the <strong>PHPStorm preferences > Tools > Remote SSH External Tools</strong>.</p>
<p>Click the <strong>+</strong> button to add a new tool:<br />
<a href="http://aaronsaray.com/wp-content/uploads/2015/04/Screenshot-2015-04-05-18.15.42.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/Screenshot-2015-04-05-18.15.42-150x150.png" alt="Screenshot 2015-04-05 18.15.42" width="150" height="150" class="alignright size-thumbnail wp-image-1816" /></a>
<ul>
<li>Enter php doc as the name.  You can group it differently if you&#8217;d like.</li>
<li>Leave most of the options at defaults.  I chose to leave it as Current Vagrant.  (if you don&#8217;t have this option, you might not have vagrant installed in this project.  You may want to choose a default remote interpreter instead.)</li>
<li>I entered phpdocumentor as the program because I have it installed as a global command.  This might be something like &#8220;php path/to/phpdoc/bin&#8221; if you have it installed with composer.</li>
<li>Finally, I put my parameters in the parameters input box.  You can set your own based on the phpdocumentor cli options, but mine basically says the source code directory (-d) and the output location (-t)</li>
</ul>
<p>Click OK and you&#8217;re good to go for phpdocumentor.</p>
<p>The same configuration can be done with apiDoc.  For parameters, I used &#8220;-i /path/to/api.php -o /path/to/api/doc/output&#8221;.   </p>
<p><a href="http://aaronsaray.com/wp-content/uploads/2015/04/Screenshot-2015-04-05-18.21.11.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/Screenshot-2015-04-05-18.21.11-300x282.png" alt="Screenshot 2015-04-05 18.21.11" width="300" height="282" class="alignright size-medium wp-image-1817" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/Screenshot-2015-04-05-18.21.11-300x282.png 300w, http://aaronsaray.com/wp-content/uploads/2015/04/Screenshot-2015-04-05-18.21.11.png 458w" sizes="(max-width: 300px) 100vw, 300px" /></a>After you save this, you now have external tools available to use in PHPStorm.  You simply have to click on the Tools menu, hover over External tools, and choose your tool from the menu.  (Note, if you have used vagrant, it may ask you to confirm you&#8217;d like to use the current vagrant instance each time you run the tool.)  Also, if you chose a different group for the commands, the menu will be different.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/05/19/documentation-tools-for-phpstorm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Composer-based Utility Installs vs Global Installs</title>
		<link>http://aaronsaray.com/blog/2015/05/11/composer-based-utility-installs-vs-global-installs/</link>
		<comments>http://aaronsaray.com/blog/2015/05/11/composer-based-utility-installs-vs-global-installs/#respond</comments>
		<pubDate>Mon, 11 May 2015 23:12:25 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[phpunit]]></category>
		<category><![CDATA[web tools]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1813</guid>
		<description><![CDATA[I&#8217;m a huge fan of tools like PHPUnit. Or any other tool that will help my project carry on. But, maybe it&#8217;s because I&#8217;ve been using them for a long time that I always favored global installs vs composer based installs. But, maybe that&#8217;s wrong now? Let me trace the history&#8230; Many years ago, there [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m a huge fan of tools like PHPUnit.  Or any other tool that will help my project carry on.</p>
<p>But, maybe it&#8217;s because I&#8217;ve been using them for a long time that I always favored global installs vs composer based installs.  But, maybe that&#8217;s wrong now?</p>
<p>Let me trace the history&#8230;</p>
<p>Many years ago, there was this tool called PEAR.  Ok, I&#8217;m being slightly silly &#8211; but I &#8220;grew up&#8221; using tools like PEAR to install my tools globally.  But, I was never a fan of this because I didn&#8217;t like the idea of installing something to the global file system (like a framework) that would be shared among all my projects.  What if I wanted to upgrade the framework in one project but not all of them all at once?</p>
<p>So, I used PEAR for tools that I somehow thought should be shared (like PHPUnit) and downloaded individual components / their versions by hand and versioned them into my project.</p>
<p>Then, as PHAR become more common, I tended to shift my thoughts to downloading a .phar file, renaming it to look like a binary, and marking it executable.  Still, it was still global.</p>
<p>I remember recently looking at installing PHPUnit on a new project and seeing the composer &#8211; based install.</p>
<p>A knee jerk reaction was to ignore that install and install it to the filesystem globally instead.  Why would I want to duplicate this code to my local working directory when I would be using it among many projects?</p>
<p>Perhaps by now, you&#8217;re seeing the flaw in my reasoning.  I gotta admit &#8211; I was still being old-school and stubborn.</p>
<p>So, on my most recent project, I use apt-get to install PHPUnit.  All was good and fine until I did a &#8211;version on the command line tool &#8211; for some unknown reason.</p>
<p></p><pre class="crayon-plain-tag">PHPUnit 3.7.28 by Sebastian Bergmann.</pre><p></p>
<p>Ruh roh &#8211; all this time, I had been looking at the docs for the newest 4.x version of the platform, 4.6 stable.  </p>
<p>Now, I think I finally get it.  Let me summarize for those who have been dense for years like me:</p>
<p>&#8211; Harddrive space and bandwidth are cheap.  There is no need to share the install of a library for those reasons.<br />
&#8211; Always read/document and test against a known version.  If you don&#8217;t include the library as a declaration (I&#8217;m looking at you composer.lock file), you can&#8217;t guarantee what version of the library you&#8217;re using.<br />
&#8211; Don&#8217;t be stubborn &#8211; change with the times.  Sometimes, when everyone&#8217;s doing it someway (composer require phpunit/phpunit), there&#8217;s a reason why</p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/05/11/composer-based-utility-installs-vs-global-installs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP PDF Viewer &#8211; Convert to Images and use HTML/JS</title>
		<link>http://aaronsaray.com/blog/2015/05/03/php-pdf-viewer-convert-to-images-and-use-htmljs/</link>
		<comments>http://aaronsaray.com/blog/2015/05/03/php-pdf-viewer-convert-to-images-and-use-htmljs/#respond</comments>
		<pubDate>Mon, 04 May 2015 00:33:06 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1859</guid>
		<description><![CDATA[Well &#8211; I really couldn&#8217;t think of a good title &#8211; it&#8217;s really not catchy at all. Anyway&#8230; at my last job, we were contemplating making a PDF reading solution that would easily scale, work on multiple devices, and allow advertisements along side of them. I left before we began this project, but it hasn&#8217;t [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Well &#8211; I really couldn&#8217;t think of a good title &#8211; it&#8217;s really not catchy at all.</p>
<p>Anyway&#8230; at my last job, we were contemplating making a PDF reading solution that would easily scale, work on multiple devices, and allow advertisements along side of them.  I left before we began this project, but it hasn&#8217;t ever left my mind.</p>
<p>I decided to do a quick proof of concept.  Turns out Imagick with PHP will convert PDF to jpeg really quick and easy.  So, I wrote the following PHP class to work with this.</p>
<p></p><pre class="crayon-plain-tag">namespace AaronSaray;

class PDFViewer
{
    /**
     * @const string the location of the PDF files in relation to this class
     */
    const PDF_DIR = '/pdf';

    /**
     * @const string the cache location
     */
    const CACHE_DIR = '/pdf/cache';

    /**
     * Get the PDF files
     * @return array
     */
    public function getPDFList()
    {
        return glob(__DIR__ . self::PDF_DIR . '/*.pdf');
    }

    /**
     * Creates an image list by either processing the pdf or retrieving them from the cache
     *
     * @param $filename
     * @return array
     * @throws \Exception
     */
    public function getImageList($filename)
    {
        $filePath = __DIR__ . self::PDF_DIR . &quot;/{$filename}&quot;;
        if (!is_readable($filePath)) {
            throw new \Exception($filePath . ' was not readable.');
        }

        $dirName = substr(basename($filePath), 0, -4);
        $cacheLocation = __DIR__ . self::CACHE_DIR . &quot;/{$dirName}&quot;;
        $globPattern = $cacheLocation . '/*.jpg';

        $files = glob($globPattern);
        if (empty($files)) {
            $this-&gt;processFileToImageCache($filePath, $cacheLocation);
            $files = glob($globPattern);
        }

        return $files;
    }

    /**
     * Write a rendered PDF to the cache.
     *
     * @param $filePath
     * @param $cacheLocation
     */
    protected function processFileToImageCache($filePath, $cacheLocation)
    {
        if (!is_dir($cacheLocation)) mkdir($cacheLocation);

        $imagick = new \Imagick();
        $imagick-&gt;setResolution(150,150);
        $imagick-&gt;readImage($filePath);
        $imagick-&gt;writeImages($cacheLocation . '/rendered.jpg', true);
    }
}</pre><p></p>
<p>Simply put, you&#8217;ll call one function to get a list of PDFs &#8211; and then you can feed a PDF to the other function to make it write it to the cache &#8211; or read it from the cache.</p>
<p>Finally, add in a little jQuery:</p><pre class="crayon-plain-tag">$(function() {
    $('#pdf img:first-child').show();
    $('#pdf').on('click', function() {
        var visibleImage = $('img:visible', $(this));
        var nextImage = visibleImage.next();
        if (nextImage.length == 0) {
            nextImage = $(visibleImage.siblings()[0]);
        }
        visibleImage.fadeOut();
        nextImage.fadeIn();
    })
});</pre><p></p>
<p>This simply will skip through the images one by one on click &#8211; and restart from the beginning.  Not particularly pretty, but it&#8217;s just a proof of concept.</p>
<p>Check out the demo <a href="/demo/pdf-viewer">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/05/03/php-pdf-viewer-convert-to-images-and-use-htmljs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Error Validating Seconds in HTML5 Time Input?</title>
		<link>http://aaronsaray.com/blog/2015/05/02/error-validating-seconds-in-html5-time-input/</link>
		<comments>http://aaronsaray.com/blog/2015/05/02/error-validating-seconds-in-html5-time-input/#respond</comments>
		<pubDate>Sat, 02 May 2015 15:51:54 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1856</guid>
		<description><![CDATA[Turns out, it&#8217;s just another issue of RTFM &#8211; but maybe this will save you some headache! I was using a simple HTML5 input of time&#8230; [crayon-56a088bb76220886297508/] At first, the user would enter something like &#8220;4:00 PM&#8221; &#8211; which I&#8217;d convert to 15:59:59 on the backend. When I reloaded the page, it now reflected &#8220;3:59:59 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Turns out, it&#8217;s just another issue of RTFM &#8211; but maybe this will save you some headache!</p>
<p>I was using a simple HTML5 input of time&#8230;</p>
<p></p><pre class="crayon-plain-tag">&lt;input type=&quot;time&quot; name=&quot;the-time&quot;&gt;</pre><p></p>
<p>At first, the user would enter something like &#8220;4:00 PM&#8221; &#8211; which I&#8217;d convert to 15:59:59 on the backend.  When I reloaded the page, it now reflected &#8220;3:59:59 PM&#8221; in the input field.</p>
<p>Then, the user would go to edit the time to say&#8230; &#8220;3:30:00 PM&#8221; and they&#8217;d get the following error in Chrome:</p>
<p><img src="http://aaronsaray.com/wp-content/uploads/2015/05/Screenshot-2015-05-02-10.23.50-300x101.png" alt="Screenshot 2015-05-02 10.23.50" width="300" height="101" class="alignnone size-medium wp-image-1857" srcset="http://aaronsaray.com/wp-content/uploads/2015/05/Screenshot-2015-05-02-10.23.50-300x101.png 300w, http://aaronsaray.com/wp-content/uploads/2015/05/Screenshot-2015-05-02-10.23.50.png 740w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>&#8220;Please enter a valid value.  The two nearest valid values are&#8230;&#8221; &#8211; that didn&#8217;t make any sense to me.</p>
<p>Well, turns out that every number field in html5 spec is using step=1 on the input fields &#8211; however, time is using step=60 &#8211; as in 60 seconds.  (I guess the authors preferred minutes over seconds).  <a href="https://html.spec.whatwg.org/multipage/forms.html#time-state-(type=time)">The spec</a> clearly defines this &#8211; but I guess I just missed that part.</p>
<p>Hopefully it saves you some time too &#8211; in the end, this is what I changed my input field to &#8211; and it worked!</p>
<p></p><pre class="crayon-plain-tag">&lt;input type=&quot;time&quot; name=&quot;the-time&quot; step=&quot;1&quot;&gt;</pre><p></p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/05/02/error-validating-seconds-in-html5-time-input/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating a Google Fusion Table from a Google Drive Spreadsheet</title>
		<link>http://aaronsaray.com/blog/2015/04/21/creating-a-google-fusion-table-from-a-google-drive-spreadsheet/</link>
		<comments>http://aaronsaray.com/blog/2015/04/21/creating-a-google-fusion-table-from-a-google-drive-spreadsheet/#respond</comments>
		<pubDate>Tue, 21 Apr 2015 18:18:36 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[Misc Web Design]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1837</guid>
		<description><![CDATA[Wow! Enter Google Fusion Tables &#8211; an easy way to show, manipulate, sort and display data. I wanted to see how easy this actually was. I was surfing around on one of my favorite websites, Milwaukee Biz Journal, and I saw this article: MKE City Building Values. I thought, that slideshow seems like a great [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Wow!  Enter <a href="https://support.google.com/fusiontables/answer/2571232">Google Fusion Tables</a> &#8211; an easy way to show, manipulate, sort and display data. </p>
<p>I wanted to see how easy this actually was.  I was surfing around on one of my favorite websites, Milwaukee Biz Journal, and I saw this article: <a href="http://www.bizjournals.com/milwaukee/blog/real_estate/2015/04/find-out-the-values-of-some-of-the-major-downtown.html">MKE City Building Values</a>.  I thought, that slideshow seems like a great source of data I&#8217;d like to see in sortable, mappable information.</p>
<p><strong>tl;dr</strong> <a href="https://www.google.com/fusiontables/DataSource?docid=1Fh6PprjLdK6Pq9Tzn6Mn7n0BdGOvv0_NSL3quMNy#map:id=3" target="_blank">Top Milwaukee Building Values</a> Fusion Table</p>
<p>First thing&#8217;s first, I created a Google Drive Spreadsheet (looks like you can upload your own data as well if you want.)  I made it have columns for the name of the building, the address, the 2015 value, 2014 value, and an image from the original article (Thanks MKE Biz Journal!)</p>
<p>Next, I scanned a tutorial about Fusion tables located here: <a href="https://support.google.com/fusiontables/answer/2571232">About Fusion Tables</a> &#8211; and clicked to make one.</p>
<p>And this is where we begin!</p>
<h3>Selecting the Source</h3>
<p><a href="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-1.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-1-300x214.png" alt="Choose Source" width="300" height="214" class="aligncenter size-medium wp-image-1838" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-1-300x214.png 300w, http://aaronsaray.com/wp-content/uploads/2015/04/fusion-1.png 846w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>I chose to use a Google Drive Spreadsheet.</p>
<h3>Validating the Layout</h3>
<p><a href="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-2.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-2-300x214.png" alt="" width="300" height="214" class="aligncenter size-medium wp-image-1839" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-2-300x214.png 300w, http://aaronsaray.com/wp-content/uploads/2015/04/fusion-2.png 821w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Yup, everything looks good.  I really like the option of choosing the header / label row too.  Sometimes you might want to make a report from data farther down on a street.</p>
<h3>Adding the Meta Data</h3>
<p><a href="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-3.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-3-300x217.png" alt="" width="300" height="217" class="aligncenter size-medium wp-image-1840" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-3-300x217.png 300w, http://aaronsaray.com/wp-content/uploads/2015/04/fusion-3.png 812w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>I think its important to give attribution to sources when you use them.  Here, I did so with MKE Biz Journal.</p>
<p>Click Finish!</p>
<h3>The first result</h3>
<p><a href="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-4.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-4-300x202.png" alt="" width="300" height="202" class="aligncenter size-medium wp-image-1841" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-4-300x202.png 300w, http://aaronsaray.com/wp-content/uploads/2015/04/fusion-4.png 617w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>As you can tell &#8211; it&#8217;s pretty boring right now.  But, let&#8217;s make it a little bit more user friendly.  I&#8217;ve decided to rename the columns to &#8216;Source Data&#8217;, &#8216;Cards&#8217; and &#8216;Building Locations.&#8217;  When I clicked on the locations tab, however, it decided to do all the geo-location:</p>
<p><a href="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-5.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-5-300x193.png" alt="" width="300" height="193" class="aligncenter size-medium wp-image-1842" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-5-300x193.png 300w, http://aaronsaray.com/wp-content/uploads/2015/04/fusion-5.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>That only took a little while &#8211; and then I had my map.  But it was WAY zoomed out.  <strong> AND </strong> I couldn&#8217;t find my locations anywhere.  Turns out there is an option on the left to select which column you want to map. It had defaulted to &#8220;Name&#8221; &#8211; so I chose address &#8211; and then it re-geocoded.  This actually re-focused it &#8211; closer to Wisconsin, but that&#8217;s not perfect yet.  Turns out, I had to center and zoom the map manually &#8211; but that was fine.  </p>
<p>There are other map configuration options too.  The default placeholder was a simple dot &#8211; but I wanted the familiar balloon.  So, I chose that option.  On the left hand, choose Feature Map -> Choose feature styles.  You&#8217;ll see something like this:</p>
<p><a href="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-6.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-6-300x275.png" alt="" width="300" height="275" class="aligncenter size-medium wp-image-1843" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-6-300x275.png 300w, http://aaronsaray.com/wp-content/uploads/2015/04/fusion-6.png 629w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>The next thing I wanted to do was configure the info window.  This is on the left side too: Feature Map -> Change Info Window.  I decided I would want the name, address, values and picture to be in the info window.  By default, it renders all of the information automatically like shown below:</p>
<p><a href="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-7.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-7-300x230.png" alt="" width="300" height="230" class="aligncenter size-medium wp-image-1844" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-7-300x230.png 300w, http://aaronsaray.com/wp-content/uploads/2015/04/fusion-7.png 820w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>I decided to write my own HTML to customize the view.  You can click on the custom tab and do the following:</p>
<p></p><pre class="crayon-plain-tag">&lt;div class='googft-info-window' style='height: 11em; overflow-y: auto'&gt;
&lt;img src=&quot;{Image}&quot; style=&quot;float:right; height: 10em; margin-left: 0.5em&quot;/&gt;
&lt;b&gt;{Name}&lt;/b&gt;&lt;br&gt;
{Address}&lt;br&gt;
&lt;hr&gt;
2015: ${2015}&lt;br&gt;
&lt;span style=&quot;color: #aaa&quot;&gt;2014: ${2014}&lt;/span&gt;&lt;br&gt;
&lt;/div&gt;</pre><p></p>
<p><a href="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-8.png"><img src="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-8-300x164.png" alt="fusion-8" width="300" height="164" class="alignright size-medium wp-image-1845" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/fusion-8-300x164.png 300w, http://aaronsaray.com/wp-content/uploads/2015/04/fusion-8.png 443w" sizes="(max-width: 300px) 100vw, 300px" /></a>Ugh &#8211; inline style.  But, what can ya do?</p>
<p>Anyway, this makes a pretty good looking info window for our purposes.</p>
<h3>Final Part</h3>
<p>Click Tools -> Publish and choose to change the visibility.  You must make this public so you can share it or embed it.  I chose the option to make it visible to anyone with a link.</p>
<p>So again, here is your link!</p>
<p><a href="https://www.google.com/fusiontables/DataSource?docid=1Fh6PprjLdK6Pq9Tzn6Mn7n0BdGOvv0_NSL3quMNy#map:id=3" target="_blank">Top Milwaukee Building Values</a></p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/04/21/creating-a-google-fusion-table-from-a-google-drive-spreadsheet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3 Steps to Getting Great Volunteers</title>
		<link>http://aaronsaray.com/blog/2015/04/16/3-steps-to-getting-great-volunteers/</link>
		<comments>http://aaronsaray.com/blog/2015/04/16/3-steps-to-getting-great-volunteers/#respond</comments>
		<pubDate>Thu, 16 Apr 2015 19:17:07 +0000</pubDate>
		<dc:creator><![CDATA[Aaron]]></dc:creator>
				<category><![CDATA[business]]></category>

		<guid isPermaLink="false">http://aaronsaray.com/?p=1831</guid>
		<description><![CDATA[If you run a volunteer organization, you might be turning away valuable volunteers! Let me give you 3 useful ways to lock in these volunteers &#8211; now! First of all, a little background. I just called a volunteer organization and offered to work with the team. The person who answered the phone was very confused, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>If you run a volunteer organization, you might be turning away valuable volunteers!  Let me give you 3 useful ways to lock in these volunteers &#8211; now!</strong></p>
<p><img src="http://aaronsaray.com/wp-content/uploads/2015/04/living-300x200.jpg" alt="living" width="300" height="200" class="alignright size-medium wp-image-1832" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/living-300x200.jpg 300w, http://aaronsaray.com/wp-content/uploads/2015/04/living.jpg 960w" sizes="(max-width: 300px) 100vw, 300px" />First of all, a little background.  I just called a volunteer organization and offered to work with the team.  The person who answered the phone was very confused, very gruff, and in the end, told me to email someone before hurrying off the phone.  Needless to say, if that&#8217;s the caliber of person that runs the organization, I don&#8217;t want to participate!  </p>
<p>So, let&#8217;s get into the tips &#8211; to make sure you never have to worry about getting volunteers again.</p>
<h3>Secret Shopper Program</h3>
<p><img src="http://aaronsaray.com/wp-content/uploads/2015/04/shopper-300x232.jpg" alt="shopper" width="300" height="232" class="alignright size-medium wp-image-1833" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/shopper-300x232.jpg 300w, http://aaronsaray.com/wp-content/uploads/2015/04/shopper.jpg 960w" sizes="(max-width: 300px) 100vw, 300px" />The first steps to solving a problem is identifying it.  Sometimes, when you&#8217;re so close to a specific task or process, it&#8217;s hard to identify the weaknesses.  If you find yourself confused about why your on-boarding, marketing or attraction system is not working, it might be time to do a secret shopper program.  Find a trusted colleague or a friend of a friend who can play the part: give them the standard material, and see what happens.  </p>
<p>In the end, you may even actually get a new volunteer! &#8211; But even if you don&#8217;t, you&#8217;ll get valuable advice from their brand new experience.  They might tell you that your handout material or call to action on your website didn&#8217;t connect with them.  Perhaps they&#8217;re even confused on what they would be doing if they chose to volunteer.  They might even be scared thinking they don&#8217;t have the right skills to be successful.  Grab all this information &#8211; and make small, incremental changes to your program!</p>
<h3>Be a Spy / Ask for Help</h3>
<p>We all know there are precedents for thriving, successful volunteer organizations.  Sometimes it&#8217;s just as simple as asking a similar organization what really helps them entice new volunteers.  Most non-profit organizations are willing to share this information for each other &#8211; after all, we&#8217;re all trying to make a better world.  </p>
<p>If you can&#8217;t seem to get that information directly, it&#8217;s ok to be a spy.  Jump on their website, give them a call, and TAKE NOTES.  Figure out what they&#8217;re doing right &#8211; compare your organization to theirs.  Sometimes the differences require a large investment &#8211; I understand that.  But most are just process, communication and idea changes &#8211; and those can be cheap or even free!</p>
<h3>Communicate the Value and Requirements, Kindly</h3>
<p><img src="http://aaronsaray.com/wp-content/uploads/2015/04/phone-300x200.jpg" alt="phone" width="300" height="200" class="alignright size-medium wp-image-1834" srcset="http://aaronsaray.com/wp-content/uploads/2015/04/phone-300x200.jpg 300w, http://aaronsaray.com/wp-content/uploads/2015/04/phone.jpg 960w" sizes="(max-width: 300px) 100vw, 300px" />The genesis of this article came from that phone call I mentioned above.  I really felt rubbed the wrong way, but I&#8217;m persistent.  I&#8217;m going to call at a different time, email, and continue my volunteering streak.  But, not everyone is like me.  You don&#8217;t want to lose any volunteers, not even 1!  </p>
<p>So, what concerns do volunteers have when they call?  Let&#8217;s figure it out:</p>
<p><strong>What volunteering options are available?</strong><br />
Don&#8217;t assume the volunteer is familiar with the organization.  You may ask &#8220;Do you have a specific opportunity in mind, or would you like to learn more about all the options?&#8221;</p>
<p><strong>Assure the volunteer that they are qualified.</strong><br />
A lot of volunteers, especially first time ones, may not think they can do what you&#8217;re asking.  Obviously, there are some options that do require advanced skills, but for the most part, non-profits just need qualified volunteers that have a little time available.  Ask about the volunteer&#8217;s background &#8211; and then give them assurance that they would be a great fit &#8211; even if they don&#8217;t ask about it.</p>
<p><strong>Speak clearly, treat volunteers with respect.</strong><br />
Remember, this is a cross between an interview and a sales opportunity.  And, for the most part, the power is with the potential volunteer.  Treat them with respect, go above and beyond, and communicate clearly and accurately.  Remember, you need to get these volunteers in the door &#8211; because as we all know, there are high turnovers in great volunteers &#8211; because they&#8217;re desperately wanted elsewhere too!</p>
<h3>Final Thoughts</h3>
<p>Volunteer organizations are HARD to run.  Trust me, I&#8217;ve started one &#8211; nothing was harder than getting people to help you with the work.  So, make sure you&#8217;re following these three simple steps and you should see your stats jump up!</p>
<p>Have questions about your volunteer organization?  Need help figuring out what you&#8217;re doing wrong OR RIGHT? Let me know &#8211; I&#8217;d love to share stories with you and provide you some fresh eyes and feedback.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaronsaray.com/blog/2015/04/16/3-steps-to-getting-great-volunteers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
