<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PhilFreo.com</title>
	<atom:link href="http://philfreo.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://philfreo.com/blog</link>
	<description>The portfolio and blog of Phil Freo, on web design, development, and entrepreneurship.</description>
	<lastBuildDate>Tue, 13 Mar 2012 17:21:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Two Years at Quizlet</title>
		<link>http://philfreo.com/blog/two-years-at-quizlet/</link>
		<comments>http://philfreo.com/blog/two-years-at-quizlet/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 05:44:33 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[California]]></category>
		<category><![CDATA[Collectors Weekly]]></category>
		<category><![CDATA[Entrepreneurship]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Quizlet]]></category>
		<category><![CDATA[Startups]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=285</guid>
		<description><![CDATA[The last two years (2010-2011) I spent working at Quizlet were an incredible learning experience. Like I did in Jan 2010, I wanted to reflect on some of the technologies I learned and things I did over the last 2 years&#8230; Backend: Learned tons about scalability! Scaled Quizlet to serve 11 million visits per months (60 million [...]]]></description>
			<content:encoded><![CDATA[<p>The last two years (2010-2011) I spent working at Quizlet were an incredible learning experience.</p>
<p>Like I did <a href="/blog/technologies-ive-worked-with-in-2009/">in Jan 2010</a>, I wanted to reflect on some of the technologies I learned and things I did over the last 2 years&#8230;</p>
<p><span id="more-285"></span></p>
<p style="text-align: center;"><img class="aligncenter  wp-image-386" src="http://philfreo.com/blog/wp-content/uploads/2012/03/quizlet_2011-2012.png" alt="" width="560" height="231" /></p>
<p>Backend:</p>
<ul>
<li><strong>Learned tons about scalability!</strong> Scaled Quizlet to serve 11 million visits per months (60 million pageviews, 5 million uniques), serving mostly UGC content with an average page response time of &lt; 50ms.</li>
<li>Got very comfortable with understanding and <strong>tweaking advanced configuration options of Apache, PHP, &amp; MySQL</strong> for desired functionality and scalability requirements</li>
<li>Went from a command line beginner to feeling very comfortable in Linux and Solaris, frequently <strong>writing bash/shell scripts for common sysadmin tasks</strong>, and trying to automate as much as possible.</li>
<li><strong>Worked with large data sets</strong>: our database had several hundred million rows and was in the dozens of gigabytes in size.</li>
<li>Played a dev-ops role and helped transition all production servers to use <strong>Puppet for configuration management</strong>. Focused on having a process for all server related changes and created the ability to have over a dozen different servers recreate-able in very little time.</li>
<li><strong>Learned how to make MySQL fast on a high-trafficked and large database</strong>, do replication and have a quick recovery plan. Dealt with configuring databases, designing schemas, and optimizing SQL statements. Also managed our relationship with Percona&#8217;s consultants (leading MySQL experts) and learned from them.</li>
<li><strong>Automated backups</strong> and ensured we had quick access to them in the right places plus securely storing them off-site to <strong>Amazon S3 </strong>for safety. We had people relying on their data being accessible for studying and thankfully were able to recover quickly from incidents without losing any data.</li>
<li><strong>Sphinx Search</strong> is a very powerful open source search server good for indexing and quickly searching over MySQL. I learned how to configure it for our purposes and use its various features to power search on millions of rows of Quizlet content in a couple hundred milliseconds.</li>
<li>Implemented and used several <strong>performance monitoring tools </strong>to keep tabs on a heavily trafficked website: Nagios, Munin, New Relic, etc.</li>
<li>Learned all about (and implemented) <strong>email deliverability best practices</strong>: SPF records, DKIM, rDNS, Feedback Loops, IP address reputation, etc.</li>
<li>Used several<strong> cloud service providers</strong> (Joyent, Slicehost, Amazon AWS). Setup <strong>reverse proxy CDNs</strong> for optimal performance of static files.</li>
</ul>
<p>Frontend:</p>
<ul>
<li>Major focus on<strong> serious performance optimizations across entire stack. </strong>Spent time obsessing over how to get an extra 20ms out of a page load from our backend while keeping code clean. Resulted in an average page load of &lt; 50ms across Quizlet.</li>
<li>Also became <strong>extremely good at front-end performance; </strong>Did JavaScript profiling, proper handling of static files, caching headers, etc. Attended Velocity Conferences; Kept tabs on PageSpeed and WebpageTest waterfall results.</li>
<li><strong>Used Google Analytics Event Tracking </strong>for tracking client-side user events via JavaScript. Good for error detection and user behavior analysis.</li>
<li>I already knew PHP well, but I&#8217;d say now I&#8217;m more of an expert at properly structuring <strong>object-oriented PHP5</strong> on a large codebase.</li>
<li>Learned all about and then <strong>implemented website localization &amp; internationalization</strong> (i18n) for Quizlet, helping create a framework for user-generated translation submissions that launched in 7 languages.</li>
<li>Got deep into Unicode and character encodings and <strong>implemented a language detection system</strong> in PHP based on n-grams and character encodings.</li>
<li>Spent time <strong>optimizing with AdSense </strong>- A/B tested with different ad placement, targeting, and IAB ad sizes for better inventory.</li>
<li><strong>Wrote a very fast A/B testing framework and used it to optimize</strong> our upgrade page for better monetization</li>
<li>Went very deep on the <strong>MooTools JavaScript library</strong> using it to <a href="/blog/behind-the-scenes-look-at-my-work-at-quizlet/">build complex study games</a>. In the past, jQuery has been my JS library of choice, but MooTools is very nice at being object-oriented and not afraid to extend native objects.</li>
<li>Used <strong>Google Maps &amp; Geocoding  API </strong>heavily (JavaScript and PHP) to build an events directory on CollectorsWeekly.</li>
<li><strong>Used the Stripe API</strong> to accept credit card payments (replacing our previous PayPal solution).</li>
<li><strong>Lots of cross-browser CSS &#8211; </strong>making things look good in browsers both old and new.</li>
</ul>
<p>Dev Processes:</p>
<ul>
<li><strong>Helped lead the development team </strong>with best practices and good processes for coding and communication.</li>
<li>Became<strong> really good at Git </strong>and <strong>transitioned our team from SVN/Trac to Git/GitHub</strong>. Used git submodules to manage many of our dependancies and became a better open source citizen by submitting pull requests and bug reports in more projects.</li>
<li>Did a lot of <strong>code reviewing</strong> on trac and GitHub with peers and new hires / interns.</li>
<li><strong>Introduced unit testing</strong> in both PHP (via PHPUnit) and JavaScript (via Jasmine); did some test-driven-development (TDD).</li>
<li><strong>Created a safer deployment process</strong> which first runs unit tests, PHP Lint, and other sanity checks before deploying.</li>
<li>Started <strong>daily standups</strong> with the eng team to keep everyone up-to-date and on track.</li>
</ul>
<p>Product:</p>
<ul>
<li>Along with development work, I was doing a lot of <strong>Product Management</strong>: feature triage and prioritization, tracking roadmaps, deciding among tradeoffs, etc.</li>
<li><strong>Huge focus on the user interface</strong>: tried to make every new feature high quality and easy to use. Spent a lot of time redoing the user flow of features that already existed to improve their ease of use. <strong>Removed clutter </strong>and made features that &#8220;just work&#8221;.</li>
<li>Used Photoshop to work on <strong>visual improvements &#8212; designing or redesigning</strong> almost all the main pages and many shared UI components on Quizlet.</li>
<li>Brainstormed and implemented game mechanics and other ways to make studying on Quizlet more fun and social.</li>
</ul>
<p>Business+Management</p>
<ul>
<li><strong>Focused heavily on recruiting</strong> other developers, helped create a process<strong> </strong>for finding potential candidates and putting them through a funnel. Did a lot of <strong>technical interviewing </strong>by phone/Skype and in-person. Helped build a great team of full-time people and interns.</li>
<li><strong>Team building.</strong> Helped manage and guide new employees, getting them up to speed and supporting their projects.</li>
<li>Did a fair amount of <strong>biz dev</strong> as well. <strong>Negotiated deals</strong> for licensing software, worked out details of contracts. Talked with potential partners.</li>
<li><strong>Managed projects</strong> that other developers were working on, pushing for both code quality, fast completion, and a high quality user experience.</li>
<li>Wrote a bunch of Quizlet blog posts about product announcements.</li>
</ul>
<p>I&#8217;m sure I&#8217;m missing lots of stuff, and I should probably take even more time to write down some higher level lessons learned about startups. But for now this will do: startups are awesome and the best way to learn a lot of stuff really quickly by doing it. And if you&#8217;re lucky like I&#8217;ve been, it will be with an awesome team working on a great product used by tons of people.</p>
<p>I&#8217;ve recently moved onto a new opportunity that I&#8217;m very excited about. But I&#8217;m really glad to have been at Quizlet the last two years and I look forward to seeing it continuing to succeed widely!</p>
<p>(P.S., they&#8217;re <a href="http://quizlet.com/jobs/">hiring</a>&#8230;)</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/two-years-at-quizlet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Behind the scenes look at my work at Quizlet</title>
		<link>http://philfreo.com/blog/behind-the-scenes-look-at-my-work-at-quizlet/</link>
		<comments>http://philfreo.com/blog/behind-the-scenes-look-at-my-work-at-quizlet/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 07:36:18 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Quizlet]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=332</guid>
		<description><![CDATA[I just wrote a pretty in-depth article on the Quizlet Blog: &#8220;How We Do Product Development at Quizlet: An Inside Look at the Making of Speller&#8221; which describes the process of how Andrew and I created &#8220;Speller&#8221;, the latest study mode on Quizlet. &#8230;a behind the scenes look at how we created Speller, our engineering [...]]]></description>
			<content:encoded><![CDATA[<p>I just wrote a pretty in-depth article on the Quizlet Blog: &#8220;<a href="http://quizlet.com/blog/the-making-of-speller/">How We Do Product Development at Quizlet: An Inside Look at the Making of Speller</a>&#8221; which describes the process of how Andrew and I created &#8220;Speller&#8221;, the latest study mode on Quizlet.</p>
<blockquote><p><em>&#8230;a behind the scenes look at how we created Speller, our engineering challenges and processes, and how we obsessed over the user experience and the educational experience.</em></p></blockquote>
<p>Includes some technical details of how we programmed it (mostly JavaScript), the text-to-speech, development process and usability testing, and lots of screenshots of the different iterations we did in order to get the UI right.</p>
<p>It&#8217;s a little long, but hopefully worth the read!</p>
<p><img class="size-full border wp-image-3595 aligncenter" style="display:block;margin: 10px auto;border: solid 1px #eee; padding: 4px;" src="https://quizlet.com/blog/wp-content/uploads/2011/09/los_animales.png" alt="" width="484" height="147" /></p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/behind-the-scenes-look-at-my-work-at-quizlet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wedding Website &amp; Invitations</title>
		<link>http://philfreo.com/blog/wedding-website-invitations/</link>
		<comments>http://philfreo.com/blog/wedding-website-invitations/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 04:03:12 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=317</guid>
		<description><![CDATA[I launched my first new website in a very long time, and also designed some matching print work. This time the client was tougher than usual. But she was also cuter than usual so it was worth it&#8230; I present to you, philandkristin.com! I built it in Rails 3.1, though it&#8217;s mostly all static. It [...]]]></description>
			<content:encoded><![CDATA[<p>I launched my first new website in a very long time, and also designed some matching print work. This time the client was tougher than usual. But she was also cuter than usual so it was worth it&#8230;</p>
<p><span id="more-317"></span></p>
<p>I present to you, <a href="http://philandkristin.com/">philandkristin.com</a>! I built it in Rails 3.1, though it&#8217;s mostly all static. It was my first time using Ruby on Rails which I have mostly enjoyed, and hosting on Heroku so far has been quite nice.</p>
<p style="text-align: center;"><a href="http://philandkristin.com/"><img class="size-medium wp-image-318  aligncenter" src="http://philfreo.com/blog/wp-content/uploads/2011/09/philandkristin-300x226.png" alt="" width="300" height="226" /></a></p>
<p style="text-align: left;">And our closest friends and family (man it&#8217;s hard to not invite everybody!) will be getting wedding invitations that look something like the left one from my drafts below:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-327" src="http://philfreo.com/blog/wp-content/uploads/2011/09/invites-sm.png" alt="" width="475" height="356" /></p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/wedding-website-invitations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Honestly.com &#8211; Not acting so honestly</title>
		<link>http://philfreo.com/blog/honestly-com-not-acting-so-honestly/</link>
		<comments>http://philfreo.com/blog/honestly-com-not-acting-so-honestly/#comments</comments>
		<pubDate>Sat, 14 May 2011 23:40:35 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[Spam]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Virality]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=299</guid>
		<description><![CDATA[I hate to have my first blog post after over a year be a negative one, but I feel like these guys need calling out. I recently received an email from a company, Honestly.com, that got me quite curious. I looked up the website to see what it was all about, and I saw that [...]]]></description>
			<content:encoded><![CDATA[<p>I hate to have my first blog post after over a year be a negative one, but I feel like these guys need calling out.</p>
<p>I recently received an email from a company, Honestly.com, that got me quite curious. I looked up the website to see what it was all about, and I saw that they are a way of reviewing former/current coworkers and business partners. Their tag lines are &#8220;Get the inside scoop on your potential boss, coworkers, or business partners.&#8221; and &#8220;Candid community-created reviews of business professionals.&#8221; I sort of expected them to be a more extensive version of <a href="http://www.cubeduel.com/">CubeDuel</a> (which was quite fun for the first few minutes), but with full reviews rather than just ratings&#8230;</p>
<p><span id="more-299"></span></p>
<p><img class="aligncenter size-full wp-image-301" title="honestly1" src="http://philfreo.com/blog/wp-content/uploads/2011/05/honestly1.png" alt="" width="500" height="289" /></p>
<p>Seeing this email (&#8220;Someone created a profile for you&#8230;&#8221;) after seeing what their company does instantly made me think that someone left a public review about me. Naturally, I was quite interested in seeing what it said, so I clicked through.</p>
<p>Bringing me to the site&#8230;</p>
<p><strong>Step 1:</strong> Their only option is to Login with Facebook and give them your Facebook info and a list of all your friends. Kind of annoying, but I login with Facebook lots of places online, so whatever.</p>
<p><img class="aligncenter size-full wp-image-303" title="honestlyfb" src="http://philfreo.com/blog/wp-content/uploads/2011/05/honestlyfb.png" alt="" width="450" height="333" /></p>
<p><strong>Step 2: </strong>Get your email address</p>
<p><strong>Step 3</strong>: Try to get your email contacts</p>
<p><img class="aligncenter size-full wp-image-304" title="honestlyemail" src="http://philfreo.com/blog/wp-content/uploads/2011/05/honestlyemail.png" alt="" width="400" height="80" /></p>
<p><strong> Step 4:</strong> Try to get your LinkedIn contacts (your Facebook friends weren&#8217;t enough apparently)</p>
<p><img class="aligncenter size-full wp-image-306" title="honestlylinked" src="http://philfreo.com/blog/wp-content/uploads/2011/05/honestlylinked1.png" alt="" width="400" height="81" /></p>
<p><strong>Step 5: </strong>At this point I think to myself that I&#8217;m done with all the &#8220;let&#8217;s try to make this web app viral by gathering as much info as possible&#8221; crap. Nope&#8230; the next screen is the best one yet.</p>
<p><img class="aligncenter size-full wp-image-307" title="honestly2a" src="http://philfreo.com/blog/wp-content/uploads/2011/05/honestly2a.png" alt="" width="500" height="580" /></p>
<p>As you can see, I&#8217;m <strong>so close</strong> to being able to see all these reviews about myself. See look &#8211; they&#8217;re right there on the screen already, just dimmed out and they say &#8220;Review text will be available after you like us on Facebook.&#8221;  It looks like there are already several reviews/rankings for me and as soon as I click &#8220;Like&#8221; I&#8217;ll be able to see them.</p>
<p>I don&#8217;t want to &#8220;Like&#8221; Honestly on Facebook. I don&#8217;t like them so far (they haven&#8217;t done a single positive thing for me at this point) and I certainly don&#8217;t want to broadcast to my friends that I like them. But as I&#8217;d also not like to connect my LinkedIn and leave reviews, I &#8220;Like&#8221; them knowing that I can fix this on Facebook immediately after.</p>
<p>So finally, the big moment of getting to see my reviews!!&#8230;</p>
<p><img class="aligncenter size-full wp-image-308" title="honestly2" src="http://philfreo.com/blog/wp-content/uploads/2011/05/honestly2.png" alt="" width="500" height="211" /></p>
<p>WHAT?!?! All that for nothing! So they sent me an email saying &#8220;Someone created a profile for you on Honestly.com&#8221; and there&#8217;s nothing there &#8212; what a bait and switch. Sure, you can debate the semantics of someone &#8220;creating a (blank) profile&#8221; vs. someone &#8220;leaving a review&#8221;, but they are clearly taking advantage of both me and whichever of my Facebook or LinkedIn&#8217;s friends that &#8220;created a profile&#8221; for me (a.k.a., probably just imported their contacts with no intention of all of them getting a deceptive email).</p>
<p>Bottom line: I think the idea is good and I have plenty of respect for investor Joshua Schachter of del.icio.us&#8230; but with a name like &#8220;Honestly&#8221; and a tagline of &#8220;Truth in reputation&#8221;, they should drop the sleazy and spammy tactics. If you&#8217;ve got a startup then by all means: use Facebook, Twitter, and LinkedIn to grow. But please, do it in a respectful and honest way.</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/honestly-com-not-acting-so-honestly/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>New Job with Startup: Old School Industries</title>
		<link>http://philfreo.com/blog/new-job-with-startup-old-school-industries/</link>
		<comments>http://philfreo.com/blog/new-job-with-startup-old-school-industries/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 00:47:53 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[California]]></category>
		<category><![CDATA[Collectors Weekly]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Quizlet]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=275</guid>
		<description><![CDATA[I just accepted a full-time position at a small startup in San Francisco as a lead Developer and Product Manager.  The company is called Old School Industries LLC and is a combination of two businesses: Quizlet and Collectors Weekly. I&#8217;ve been working with the founders, Dave Margulius and Andrew Sutherland (student at MIT), for around [...]]]></description>
			<content:encoded><![CDATA[<p>I just accepted a full-time position at a small startup in San Francisco as a lead Developer and Product Manager.  The company is called Old School Industries LLC and is a combination of two businesses: <a href="http://quizlet.com/" target="_blank">Quizlet</a> and <a href="http://www.collectorsweekly.com/" target="_blank">Collectors Weekly</a>.</p>
<p><span id="more-275"></span></p>
<p>I&#8217;ve been working with the founders, <a href="http://www.linkedin.com/pub/dave-margulius/3/827/613" target="_blank">Dave Margulius</a> and <a href="http://quizlet.com/about/" target="_blank">Andrew Sutherland</a> (student at MIT), for around 6 months remotely and on short term trips as a contractor, and have now decided to accept an offer with the team full-time.  I&#8217;ll be responsible for developing new features on both websites, improving user experience, increasing monetization, and overall growing the businesses.</p>
<p><a href="http://quizlet.com/" target="_blank">Quizlet.com</a> is a studying website that lets students make flashcards online and study in a more effective and more fun way.  The site serves over a million students each month, has over 750,000 registered users, and has over 50 million user-generated flash cards.  As only the second developer on Quizlet, I&#8217;m excited to grow the website in huge ways and spend most of my time helping make studying better for a lot of people.</p>
<p><a href="http://www.collectorsweekly.com/" target="_blank">Collectors Weekly</a> is a resource for all things collecting, antiques, and vintage.  It&#8217;s a combination of great original content and providing tools to browse eBay in a better way (<a href="http://www.collectorsweekly.com/model-trains/auctions" target="_blank">SuperBrowse example</a>).  I just helped launched its new geo-targetted <a href="http://www.collectorsweekly.com/events" target="_blank">events section</a> and will spend about one third of my time developing new features for this site.</p>
<p>Both websites run on the LAMP stack.  I&#8217;ll be working heavily with Apache, PHP, JavaScript / Ajax, MySQL, Memcache, Sphinx, etc. to help grow traffic and features in a scalable way.  A decent number of the interesting technologies that I <a href="/blog/technologies-ive-worked-with-in-2009/">used for the first time in 2009</a> were a result of working with these guys.</p>
<p>This is an exciting time and a big opportunity for me as I&#8217;ll be able to significantly impact the growth and success of the startup.  It will also nice to be able to focus all my work attention in one direction rather than juggling many projects, as I&#8217;ve just <a href="/blog/graduation-thoughts-best-classes-at-uf-for-computer-engineering/">graduated</a> from UF and won&#8217;t be continuing freelance web work.  And of course, moving to San Francisco from Florida will be a big change and I&#8217;m excited, although I&#8217;ll still get to fly back every so often.  Wish me luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/new-job-with-startup-old-school-industries/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Technologies I&#8217;ve worked with in 2009</title>
		<link>http://philfreo.com/blog/technologies-ive-worked-with-in-2009/</link>
		<comments>http://philfreo.com/blog/technologies-ive-worked-with-in-2009/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 18:00:07 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=240</guid>
		<description><![CDATA[One benefit of doing freelance development work is that I get the opportunity to get involved in many different technologies and frameworks in a short amount of time. Since the year is over&#8230; here&#8217;s a quick list of 15 technologies/frameworks that I got to learn in 2009 alone, during my last year in college. Learned [...]]]></description>
			<content:encoded><![CDATA[<p>One benefit of doing freelance development work is that I get the opportunity to get involved in many different technologies and frameworks in a short amount of time.</p>
<p>Since the year is over&#8230; here&#8217;s a quick list of 15 technologies/frameworks that I got to learn in <strong>2009</strong> alone, during my <a href="http://philfreo.com/blog/graduation-thoughts-best-classes-at-uf-for-computer-engineering/">last year in college</a>.</p>
<p><span id="more-240"></span></p>
<ol>
<li>Learned PHP optimization techniques, such as using <strong>APC</strong> and <strong>Memcached</strong></li>
<li>Worked with the <strong>Twitter API</strong> to create a Twitter bot</li>
<li>Learned <strong>advanced Google Analytics tools</strong> and did multivariable testing of conversion rates with Website Optimizer</li>
<li>Work with the <strong>PayPal Payments Pro API</strong></li>
<li>Created a simple <strong>Facebook App</strong> (using FBML)</li>
<li>Learned some <strong>Objective C </strong>and worked with XCode and Interface Builder</li>
<li>Created a basic <strong>iPhone App</strong> that interacted with an XML web service</li>
<li>Worked heavily with <strong><a href="http://philfreo.com/blog/magento-ecommerce-first-thoughts-tips/">Magento customization</a></strong><strong> </strong>and theming work</li>
<li>Wrote a <strong><a href="http://philfreo.com/blog/arbitrary-shortcodes/">WordPress plugin</a></strong><strong> </strong>to make deploying multiple sites easier, along with plenty of other WordPress development</li>
<li>Wrote an <strong><a href="http://philfreo.com/blog/freo-addon-installer/">ExpressionEngine module</a> </strong>to save people time,<strong> </strong>and other EE work</li>
<li>Learned about various <strong>MySQL performance </strong>with different storage engines</li>
<li>Built a <strong>Google Wave Robot </strong>at a Google hackathon and demoed it at a WordPress Dev Day</li>
<li>Worked with the <strong>YouTube API</strong> to build an automatic video status checker</li>
<li><strong>Geo-targeting</strong> by IP address</li>
<li>Automatic<strong> language detection of text </strong>with Google&#8217;s Translation API</li>
</ol>
<p>Hopefully 2010 will bring its own interesting technologies and opportunities to learn!</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/technologies-ive-worked-with-in-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Review: &#8220;jQuery 1.3 with PHP&#8221;</title>
		<link>http://philfreo.com/blog/book-review-jquery-1-3-with-php/</link>
		<comments>http://philfreo.com/blog/book-review-jquery-1-3-with-php/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 07:30:59 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=255</guid>
		<description><![CDATA[I was given another book to review, called &#8220;jQuery 1.3 with PHP&#8221;, so here it is.  The book is aimed at beginners or intermediate developers wanting to learn how to &#8220;enhance your PHP applications by increasing their responsiveness through jQuery and its plugins&#8220;. Chapter 1: Introduction &#38; Overview, Chapter 2: Quick Tricks &#8211; Good chapter to [...]]]></description>
			<content:encoded><![CDATA[<p>I was given another book to review, called &#8220;jQuery 1.3 with PHP&#8221;, so here it is.  The book is aimed at beginners or intermediate developers wanting to learn how to &#8220;<em>enhance your PHP applications by increasing their responsiveness through jQuery and its plugins</em>&#8220;.</p>
<p><span id="more-255"></span></p>
<p><strong>Chapter 1: Introduction &amp; Overview, Chapter 2: Quick Tricks</strong> &#8211; Good chapter to teach beginners to both JavaScript, jQuery, and PHP the differences between client-side and server-side code, and how the jQuery framework fits into it all.</p>
<p><strong>Chapter 3: Tabs and Accordions</strong> &#8211; At first this chapter looks to be nothing more than glorified examples of <a href="http://docs.jquery.com/UI">jQuery UI</a> Widgets, but later it actually does a nice job showing how PHP can be used with these widgets to do server-side management of the tabs.</p>
<p><strong>Chapter 4: Forms and Form Validation</strong> &#8211; Interesting and insightful way of validating forms (both on the client and server side, which is necessary) without having to duplicate all the validation rules.</p>
<p><strong>Chapter 5: File Management</strong>, <strong>Chapter 6: Calendars</strong> &#8211; Very specific examples, but Ch. 6 uses the very nice <a href="http://www.redredred.com.au/projects/jquery-week-calendar/">jquery-week-calendar</a> plugin to create an interface very similar to Google Calendar and shows how to link it up with PHP managing the events server-side.</p>
<p><strong>Chapter 7: Image Manipulation</strong> &#8211; Another nice example of bringing using both PHP and jQuery plugins (<a href="http://plugins.jquery.com/project/treeview">treeview</a> and <a href="http://deepliquid.com/content/Jcrop.html">jcrop</a>) to create something really useful.  In this case an image browser, resizer, rotator, and cropper.</p>
<p><strong>Chapter 8: Drag and Drop</strong> &#8211; Standard sorting/dragging examples + persisting data.</p>
<p><strong>Chapter 9: Data Tables</strong> &#8211; Using the <a href="http://datatables.net/">DataTables</a> jQuery plugin with PHP on very large data sets.</p>
<p><strong>Chapter 10: Optimization</strong> &#8211; A few helpful tips regarding caching, automatically merging .js source files, JavaScript code optimization, perceived user load times, etc.</p>
<p>Overall, if you&#8217;re a programmer not super familiar with PHP or JavaScript, this book does have some very helpful explanations with good examples.</p>
<p>One small gripe about the book: while I do know that black and white books are much cheaper to produce, reading code without syntax coloring makes it unnecessarily harder to understand.</p>
<p>To learn more or purchase: <a href="http://www.packtpub.com/jquery-1-3-with-php?utm_source=philfreo.com&#038;utm_medium=bookrev&#038;utm_content=blog&#038;utm_campaign=mdb_001650">&#8220;jQuery 1.3 with PHP&#8221; by Kae Verens</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/book-review-jquery-1-3-with-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Graduation thoughts: best classes at UF for Computer Engineering</title>
		<link>http://philfreo.com/blog/graduation-thoughts-best-classes-at-uf-for-computer-engineering/</link>
		<comments>http://philfreo.com/blog/graduation-thoughts-best-classes-at-uf-for-computer-engineering/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 21:38:05 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[College]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[UF]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=212</guid>
		<description><![CDATA[In three weeks from today, I will have graduated, with honors, from the University of Florida with a B.S. in Computer Engineering (software emphasis) and a minor in Business Administration.  Overall, I&#8217;ve had an incredible college experience and have learned a ton, had some great experiences, and built relationships with a lot of really great [...]]]></description>
			<content:encoded><![CDATA[<p>In three weeks from today, I will have graduated, with honors, from the <a rel="nofollow" href="http://ufl.edu">University of Florida</a> with a B.S. in <a rel="nofollow" href="http://www.registrar.ufl.edu/catalog/programs/majors/compeng.html">Computer Engineering</a> (software emphasis) and a minor in Business Administration.  Overall, I&#8217;ve had an incredible college experience and have learned a ton, had some great experiences, and built relationships with a lot of really great people.</p>
<p>I thought it&#8217;d be worth mentioning the classes at UF that, looking back, had the greatest impact on me.  I&#8217;ve taken a bunch of classes over the past 4.5 years, but these were the ones that I really can appreciate the most&#8230;<br />
<span id="more-212"></span></p>
<hr /><strong>1.  Digital Logic &amp; Computer Systems (EEL 3701), with <a href="http://www.mil.ufl.edu/~ems/">Dr. Eric Schwarz</a></strong></p>
<p><a style="float: right; margin: 5px; border: solid 1px #ccc;" href="http://philfreo.com/blog/wp-content/uploads/2009/11/DSCN2582-224x300.jpg" target="_blank"><img class="size-medium wp-image-215 alignright" title="EEL3701" src="http://philfreo.com/blog/wp-content/uploads/2009/11/DSCN2582-224x300.jpg" alt="My breadboard from one of the Digital Logic labs" width="224" height="300" /></a><strong>It wasn&#8217;t until this class that I really understood how computers worked</strong>.  I started this class as a freshman who could barely count in binary.  In one jam-packed semester, we learned all about: number systems, logic gates, mixed logic, <a href="http://en.wikipedia.org/wiki/Karnaugh_map">k-maps</a>, <a href="http://en.wikipedia.org/wiki/Multiplexer">multiplexers</a>, <a href="http://en.wikipedia.org/wiki/Flip-flop_(electronics)">flip-flops</a>, <a href="http://en.wikipedia.org/wiki/Arithmetic_logic_unit">ALUs</a>, RAM, ROM, etc.  We also learned how to design hardware components using Quartus and <a href="http://en.wikipedia.org/wiki/VHDL">VHDL</a>, and program them onto our <a href="http://en.wikipedia.org/wiki/Programmable_logic_device">PLDs</a> to watch different LEDs on our breadboards react to various switches and buttons (<em>see picture of my breadboard wired up after programming a PLD</em>).</p>
<p>All in all, <strong>we started with simple logic gates and designed an entire (basic) 8-bit CPU – and then programmed it by writing and hand-compiling assembly code</strong>.  What a great learning experience!</p>
<p>This was also a great example of where <strong>it was completely worth taking the class with the harder professor</strong> who gives more homework, because he was very passionate about the subject and knew how to teach it well.  I don&#8217;t remember every detail of what I learned 4 years ago in this class, but because I had a great professor, I can still explain most of the major concepts and would feel comfortable diving back in if needed.</p>
<hr /><strong>2.  Object-Oriented Programming (COP 4331), with </strong><strong><a href="http://www.cise.ufl.edu/~dts/">Dave Small</a></strong></p>
<p>This OOP class has had a greater influence on me as a developer than anything else ever has.  Heavily based on both in-class lectures (with reading assignments) and very large get-your-hands-dirty team programming assignments, the course was a great mix of theory and practice.</p>
<p>We went over many important topics such as encapsulation, inheritance, composition, cohesion, encumbrance, type conformance, <a href="http://www.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/paper-boy/demeter.pdf">Law of Demeter</a>, <a href="http://pragmaticprogrammer.com/articles/tell-dont-ask">Tell Don&#8217;t Ask</a>, <a href="http://www.objectmentor.com/resources/articles/ocp.pdf">Open-Closed Principle</a>, <a href="http://www.objectmentor.com/publications/lsp.pdf">Liskov Substitution Principle</a>, and <a href="http://en.wikipedia.org/wiki/Model–view–controller">MVC</a>.  We also became deeply familiar with reading <a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language">UML diagrams</a> and <a href="http://en.wikipedia.org/wiki/Sequence_diagram">sequence diagrams</a> and used these to express complex software object models.</p>
<p>The real value from this course, though, came from the programming assignments.  We worked in groups of 7-8 people throughout the semester on three different iterations of a real-time role playing rage (RPG) in Java based on proper OO design based on what we had learned at that point in the semester.  We actually started from scratch for each of the 3 iterations, and, for each iteration, I spent about 90 hours outside of class working with my group on a solid UML design and implementing our design in Java.</p>
<p>These group assignments, even though they were very time consuming, had a huge amount of value in helping us turn abstract OO concepts into practice.  They were also very rewarding as we were creating a pretty cool game</p>
<p>A side effect was that I also <strong>learned a lot about teamwork and leadership</strong>, and working with a group of people under high-stress work environments.  They also were what caused me to really know Java well.</p>
<hr /><strong>Runner Ups</strong></p>
<ul>
<li><strong>Design Patterns</strong><strong> in OOP</strong> (CIS 4930) &#8211; Dave&#8217;s other class.  I&#8217;d highly recommend it to anyone wanting to become a better programmer/designer.</li>
<li><strong>Business Finance</strong></li>
<li><strong>Intro to Financial Accounting </strong></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/graduation-thoughts-best-classes-at-uf-for-computer-engineering/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Largest website width to support 1024&#215;768 resolution</title>
		<link>http://philfreo.com/blog/largest-website-width-to-support-1024x768-resolution/</link>
		<comments>http://philfreo.com/blog/largest-website-width-to-support-1024x768-resolution/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 04:47:13 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=207</guid>
		<description><![CDATA[Currently, web designers are advised to support browser resolutions of widths 1024px and greater based on current browser usage data. The idea is that you want your site&#8217;s design to look good, and not require a horizontal scroll bar for those users. But screen resolution and browser width are not the same thing, because of [...]]]></description>
			<content:encoded><![CDATA[<p>Currently, web designers are advised to support browser resolutions of widths 1024px and greater based on current browser usage data.  The idea is that you want your site&#8217;s design to look good, and not require a horizontal scroll bar for those users.  But screen resolution and browser width are not the same thing, because of browser chrome, scroll bars, and because many users browse without their window being maximized.<br />
<span id="more-207"></span></p>
<p>Common advice is that for the 1024 resolutions you have a maximum width of around <a rel="nofollow" href="http://www.cameronmoll.com/archives/001220.html">960</a> or 980px to work with.  <strong>But if you really need to get every last pixel in, I can confirm test results from Windows XP running at 1024&#215;768, with Internet Explorer 6.0 fully maximized, gives you a width of 1007px to work with.</strong></p>
<p>* Of course, fluid layouts are also nice.</p>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/largest-website-width-to-support-1024x768-resolution/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ExpressionEngine: “Freo Add-on Installer” makes installing add-ons a breeze</title>
		<link>http://philfreo.com/blog/freo-addon-installer/</link>
		<comments>http://philfreo.com/blog/freo-addon-installer/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 06:00:39 +0000</pubDate>
		<dc:creator>Phil Freo</dc:creator>
				<category><![CDATA[ExpressionEngine]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://philfreo.com/blog/?p=143</guid>
		<description><![CDATA[I wrote my first module for ExpressionEngine, called &#8220;Freo Add-on Installer&#8221;, with the aim of saving EE developers a lot of time.  Here&#8217;s what it&#8217;s all about. [Jump to Download/Installation Link] Each time you set up a website with ExpressionEngine you probably want to install several different modules, extensions, and plugins. Doing that usually involves [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote my first module for ExpressionEngine, called &#8220;Freo Add-on Installer&#8221;, with the aim of <strong>saving EE developers a lot of time</strong>.  Here&#8217;s what it&#8217;s all about.</p>
<p><span id="more-143"></span></p>
<p>[<a href="#installation">Jump to Download/Installation Link</a>]</p>
<p>Each time you set up a website with ExpressionEngine you probably want to install several different modules, extensions, and plugins.  Doing that usually involves downloading a .zip file for each add-on, then individually unzipping and uploading each file/folder to the corresponding <span style="background-color: #dedede; font-size: 0.9em;">modules/</span>, <span style="background-color: #dedede; font-size: 0.9em;">extensions/</span>, <span style="background-color: #dedede; font-size: 0.9em;">plugins/</span>, <span style="background-color: #dedede; font-size: 0.9em;">language/</span>, and <span style="background-color: #dedede; font-size: 0.9em;">themes/</span> folders.<em> Then each time any add-on is updated, you have to repeat the process across all your websites.</em></p>
<p><strong>With my module,</strong> <strong>installing other add-ons is basically a one-click process</strong>.  You just visit the module page (shown below) and then either upload a .zip/.php file, or give it the URL to the source from the developer&#8217;s website.  Hit one button and my module takes the source file, extracts, and searches through the files and determines where each file/folder goes.</p>
<p>Screenshot:</p>
<p><img class="alignleft size-full wp-image-153" style="border: solid 1px #ccc;" title="Freo Add-on Installer for ExpressionEngine" src="http://philfreo.com/blog/wp-content/uploads/2009/10/screenshot1.png" alt="Freo Add-on Installer for ExpressionEngine" width="623" height="473" /></p>
<p>For example, if you just upload a .zip file that contains a folder for a module, a pi.someplugin.php, and a lang.someplugin.php, all of the files will get extracted and moved to their proper locations.  If it comes across a file it doesn&#8217;t understand, it will let you know.</p>
<p><strong>Requirements: </strong></p>
<ul>
<li>ExpressionEngine 1.6.8</li>
<li>PHP cannot be in Safe Mode</li>
<li>You may need to change permissions for a few folders if instructed</li>
</ul>
<p>These likely would only be a problem with some shared hosting companies. (If you need good <a href="/services/">ExpressionEngine hosting</a> let me know).</p>
<p><strong><a name="installation">Installation</a>:</strong></p>
<ol>
<li><strong>Download <a href="/blog/wp-content/uploads/2009/10/freo_addon_installer_1.2.zip">freo_addon_installer_1.2.zip</a></strong><strong> </strong>and unzip</li>
<li>Upload the <span style="background-color: #dedede; font-size: 0.9em;">freo_addon_installer/</span> folder to your <span style="background-color: #dedede; font-size: 0.9em;">system/modules/</span> folder</li>
<li>From the Modules page of your EE Control Panel, click &#8220;Install&#8221; next to &#8220;Freo Add-on Installer&#8221;</li>
<li>If you&#8217;re running a version of EE <strong>older</strong> than 1.6.8, copy <span style="background-color: #dedede; font-size: 0.9em;">freo_addon_installer/language/english/lang.freo_addon_installer.php</span> to <span style="background-color: #dedede; font-size: 0.9em;">system/languages/english/</span></li>
<li><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=8685097">Please donate to support development</a> of this and future add-ons.</li>
</ol>
<p><strong>Changes:</strong></p>
<ul>
<li><strong>v1.2 &#8211; </strong>Bug fixes (Oct. 25, 2009)</li>
<li><strong>v1.1</strong> &#8211; Fixed problem when URLs redirect, like on github download zip URLs.  Added better support for installing fieldtypes for Brandon Kelly&#8217;s <a href="http://brandon-kelly.com/fieldframe">FieldFrame</a> extension.  (Oct. 7, 2009)</li>
<li><strong>v1.0</strong> &#8211; Initial Release. (Oct. 7, 2009)</li>
</ul>
<p><strong>Ideas &amp; Plans:</strong></p>
<ul>
<li>Create a long list of known add-ons to choose from so that installing will truly be one-click and not require looking up a source .zip URL.</li>
<li>Integrate with LG Addon Updater so installing updates will be more of a breeze.</li>
</ul>
<p><strong>Feedback &amp; Support:</strong></p>
<p><strong></strong>If you encounter any problems or have any ideas for improvement at all please let me know. <strong>Leave a comment below and let me know how you like it. </strong><a href="http://expressionengine.com/forums/viewthread/131282/">This support thread</a> in the forums is the best place to resolve any problems you may have.</p>
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=8685097">Please donate to support development</a> of this and future add-ons.</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input name="cmd" type="hidden" value="_s-xclick" />
<input name="hosted_button_id" type="hidden" value="8685097" />
<input style="border:none !important;" alt="PayPal - The safer, easier way to pay online!" name="submit" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif" type="image" /> <img src="https://www.paypal.com/en_US/i/scr/pixel.gif" border="0" alt="" width="1" height="1" /><br />
</form>
]]></content:encoded>
			<wfw:commentRss>http://philfreo.com/blog/freo-addon-installer/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

