<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:series="http://organizeseries.com/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Larry UllmanLarry Ullman | Translating Geek Into English</title>
	
	<link>http://www.larryullman.com</link>
	<description>Translating Geek Into English</description>
	<lastBuildDate>Thu, 23 May 2013 16:19:53 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/larryullman/bMsj" /><feedburner:info uri="larryullman/bmsj" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/larryullman/bMsj" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Flarryullman%2FbMsj" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><feedburner:browserFriendly>Thanks for your interest in my blog feed. You may want to also subscribe to my newsletter. And you can find me on Twitter @LarryUllman.</feedburner:browserFriendly><item>
		<title>Changes to How You Use PayPal in &#x201c;Effortless E-commerce with PHP and MySQL&#x201d;</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/eCJMbdQeeUs/</link>
		<comments>http://www.larryullman.com/2013/05/22/changes-to-how-you-use-paypal-in-effortless-e-commerce-with-php-and-mysql/#comments</comments>
		<pubDate>Wed, 22 May 2013 11:23:05 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[ecom]]></category>
		<category><![CDATA[paypal]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3605</guid>
		<description><![CDATA[One of the problems with technical writing is that the instructions you provide will eventually become outdated. Some details, such as the fundamentals of a programming language like C, Ruby, or PHP, change relatively slowly. Others, like libraries, frameworks, and browsers, change frequently. And so, it was not surprising to find out that PayPal changed some of their systems a while back in a way that will affect readers of my "Effortless E-commerce with PHP and MySQL" book. This issue first appeared last summer in my support forums, with Sean and Michael discovering the problem and the solution. ]]></description>
				<content:encoded><![CDATA[<p>One of the problems with technical writing is that the instructions you provide will eventually become outdated. Some details, such as the fundamentals of a programming language like C, Ruby, or PHP, change relatively slowly. Others, like libraries, frameworks, and browsers, change frequently. And so, it was not surprising to find out that PayPal changed some of their systems a while back in a way that will affect readers of my &#8220;<a href="http://amzn.to/UD74kV">Effortless E-commerce with PHP and MySQL</a>&#8221; book. This issue first appeared last summer in my <a href="http://www.larryullman.com/forums/index.php">support forums</a>, with <a href="http://www.larryullman.com/forums/index.php?/topic/1577-chapter-6-ipn/">Sean and Michael discovering the problem and the solution</a>. <span id="more-3605"></span></p>
<p>The specific problem seems to occur in the IPN script (<strong>ipn.php</strong>), and only when using PayPal&#8217;s Sandbox. The IPN script confirms with PayPal the transaction that just occurred and updates the system accordingly. To do so, the script includes these lines:</p>
<pre class="brush: php; title: ; notranslate">$header = &quot;POST /cgi-bin/webscr HTTP/1.0\r\n&quot;;
$header .= &quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;
$header .= &quot;Content-Length: &quot; . strlen($req) . &quot;\r\n\r\n&quot;;
fputs ($fp, $header . $req);</pre>
<p>That performs the request, sending along three specific headers to customize the request.</p>
<p>Due to changes in PayPal&#8217;s Sandbox interface, you have to add one more header, just after the POST header. The resulting code is now:</p>
<pre class="brush: php; title: ; notranslate">$header = &quot;POST /cgi-bin/webscr HTTP/1.0\r\n&quot;;
$header .= &quot;Host: www.sandbox.paypal.com\r\n&quot;;
$header .= &quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;
$header .= &quot;Content-Length: &quot; . strlen($req) . &quot;\r\n\r\n&quot;;
fputs ($fp, $header . $req);</pre>
<p>Thanks to Sean and Michael for bringing this to my attention.</p>
<p>Let me know if anyone has any problems or questions surrounding this.</p><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/eCJMbdQeeUs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/05/22/changes-to-how-you-use-paypal-in-effortless-e-commerce-with-php-and-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/05/22/changes-to-how-you-use-paypal-in-effortless-e-commerce-with-php-and-mysql/</feedburner:origLink></item>
		<item>
		<title>Latest Update on &#x201c;The Yii Book&#x201d;</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/JL_noSx-Xws/</link>
		<comments>http://www.larryullman.com/2013/05/20/latest-update-on-the-yii-book/#comments</comments>
		<pubDate>Mon, 20 May 2013 11:54:52 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yiibk]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3604</guid>
		<description><![CDATA[So progress on "The Yii Book" in the past month has not gone as well as I would have liked. And, sadly, progress has been poor for no particular reason other than my own ability to get things done. These things do happen to us all, but it doesn't mean I'm happy about. Still, even though it's been slow, progress is being made. A quick status report...]]></description>
				<content:encoded><![CDATA[<p>So progress on &#8220;The Yii Book&#8221; in the past month has not gone as well as I would have liked. And, sadly, progress has been poor for no particular reason other than my own ability to get things done. These things do happen to us all, but it doesn&#8217;t mean I&#8217;m happy about. Still, even though it&#8217;s been slow, progress is being made. A quick status report&#8230;<span id="more-3604"></span></p>
<p>I did some changing around of the <a href="http://yii.larryullman.com/toc.php">table of contents</a>. These are just changes that came organically as the book progressed. I did not drop the modules chapter, but I originally had one chapter on using extensions, one on modules (writing and using), and one on writing extensions. It just made more sense to do one chapter on using extensions (including modules) and one on writing extensions (including modules). So there&#8217;s that. And I changed the order of the other chapters in Part 3 a bit.</p>
<p>I&#8217;m almost done with Chapters 15, &#8220;Internationalization&#8221;, and 16, &#8220;Leaving the Browser&#8221;. I was almost done like two weeks ago, and now I&#8217;m still almost done. It&#8217;s been that kind of month! But I&#8217;m close, and they&#8217;ll go to the tech editors soon, and then I&#8217;ll do an update.</p>
<p>For the next X amount of time, I&#8217;m going to keep working hard on this, getting the first electronic edition done as soon as possible, without compromising the quality.</p>
<p>Also, I think I&#8217;ve got a handle on how to do a print run, and I&#8217;ll address that once this ebook is complete. The same goes for translations. Thanks to those that have expressed an interest in doing, or buying, a translation.</p>
<p>So there&#8217;s that. I&#8217;m going back to writing and working on getting this done!</p><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/JL_noSx-Xws" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/05/20/latest-update-on-the-yii-book/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/05/20/latest-update-on-the-yii-book/</feedburner:origLink></item>
		<item>
		<title>What is Larry Thinking? #69 =&gt; Going Big, Micro Version, Part 1</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/mJMKfoLb_2E/</link>
		<comments>http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/#comments</comments>
		<pubDate>Wed, 15 May 2013 19:42:26 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[newsletter]]></category>
		<category><![CDATA[scale]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[yiibk]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3599</guid>
		<description><![CDATA[This is the second of a two-part newsletter on "going big". By "going big" I mean how one transitions from a Web site with little to moderate traffic, to one that can handle tons of traffic. The previous newsletter looked at going big from the macro perspective: theory, implementation, hardware, and networking. In this newsletter, I'll look at the micro perspective: how to write code that scales well. And, as it turns out, this newsletter again got to be too big, so this is part one of two parts that makes up part two of the two-part series. (Huh?) In this newsletter, I'll mostly focus on code. The next will mostly focus on the database.

Before going into details, I'm going to define what it means to be a "big" site. As I said in the previous newsletter, it actually depends upon the kind of content and activity the site has: X number of video requests is far more demanding than the same X number of mostly text pages. Likewise, X number of WordPress page requests is far more demanding than the same X number of static HTML page requests. For the purposes of this discussion, let's say that "big" is a site that gets in the broad neighborhood of 100,000 to 500,000 pageviews per day. At that point (if not before), you'll need more than one server to handle the load. (As a counterpoint, on the highest end, Netflix sometimes requires up to 20,000 servers at a single time.)

As always, questions, comments, and all feedback are much appreciated. And thanks for your interest in what I have to say and do!]]></description>
				<content:encoded><![CDATA[<p>In this edition&#8230;</p>
<ul>
<li><a href="http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/#about">About This Newsletter</a></li>
<li><a href="http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/#you">What Were You Thinking? =&gt; Going Big, Macro Version</a></li>
<li><a href="http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/#thinking">What is Larry Thinking =&gt; Two Keywords for &#8220;Big&#8221; Programming</a></li>
<li><a href="http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/#qa1">Q&amp;A =&gt; How do you write flexible code?</a></li>
<li><a href="http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/#qa2">Q&amp;A =&gt; What do you think about Sass, Compass, and Haml?</a></li>
<li><a href="http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/#web">On the Web =&gt; CoffeeScript at Dropbox</a></li>
<li><a href="http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/#news">Larry Ullman&#8217;s Book News =&gt; &#8220;The Yii Book&#8221;</a></li>
</ul>
<p><span id="more-3599"></span></p>
<h2 id="about">About This Newsletter</h2>
<p>This is the second of a two-part newsletter on &#8220;going big&#8221;. By &#8220;going big&#8221; I mean how one transitions from a Web site with little to moderate traffic, to one that can handle tons of traffic. The <a href="http://www.larryullman.com/2013/04/08/what-is-larry-thinking-68-going-big-macro/">previous newsletter</a> looked at going big from the macro perspective: theory, implementation, hardware, and networking. In this newsletter, I&#8217;ll look at the micro perspective: how to write code that scales well. And, as it turns out, this newsletter again got to be too big, so this is part one of two parts that makes up part two of the two-part series. (Huh?) In this newsletter, I&#8217;ll mostly focus on code. The next will mostly focus on the database.</p>
<p>Before going into details, I&#8217;m going to define what it means to be a &#8220;big&#8221; site. As I said in the previous newsletter, it actually depends upon the kind of content and activity the site has: X number of video requests is far more demanding than the same X number of mostly text pages. Likewise, X number of WordPress page requests is far more demanding than the same X number of static HTML page requests. For the purposes of this discussion, let&#8217;s say that &#8220;big&#8221; is a site that gets in the broad neighborhood of 100,000 to 500,000 pageviews per day. At that point (if not before), you&#8217;ll need more than one server to handle the load. (As a counterpoint, on the highest end, Netflix sometimes requires up to 20,000 servers at a single time.)</p>
<p>As always, questions, comments, and all feedback are much appreciated. And thanks for your interest in what I have to say and do!</p>
<h2 id="you">What Were You Thinking? =&gt; Going Big, Macro Version</h2>
<p>After my previous newsletter, Ross shared with me his own experiences when it came to hosting, going big, and jumping the gun. Ross had an interesting experience, learned a lot, and was nice enough to let me share his story here (which I&#8217;ve hopefully not garbled too badly).</p>
<p>Ross had created an online game, and when he went from the private testing stage to the public beta, the amount of activity quickly spiked. Ross suddenly found that his Virtual Private Server (VPS) account was insufficient to handle the load, and as income was already coming in at a great pace, Ross quickly upgraded to two dedicated servers: one web and one database.</p>
<p>Unfortunately for Ross, both the activity and income then dropped pretty quickly, leveling off just above profitable over the course of the first year. Both continued their decline over the next couple years.</p>
<p>In hindsight, Ross says he should have realized sooner that the upgraded two-server hosting was too much money and unnecessary, but it took three years before Ross downgraded the hosting to a single VPS again.</p>
<p>Ross also discovered after the fact that one of the driving forces behind the initial need for a more powerful hosting solution was inefficient code. Particularly problematic was a lack of proper indexes on the database. Later implementing those changes resulted in a much better performing site. Ross&#8217;s realization is great for me, as the purpose of this particular newsletter is focusing on coding for a site that could go big!</p>
<p>Fortunately Ross still feels pretty good about his experience, appreciating what he learned, the money that did come in, and the people that he met along the way. In his most recent email to me, Ross said:</p>
<blockquote><p>&#8230;[the] next time around&#8230;I&#8217;ll be able to do more, faster, with fewer mistakes. I&#8217;ve been able to pass on some of the lessons learned to friends and family, which is satisfying, and if there&#8217;s some wisdom that helps your readers, too, that&#8217;s even better.</p></blockquote>
<p>Thanks, Ross!</p>
<h2 id="thinking">What is Larry Thinking? =&gt; Two Keywords for &#8220;Big&#8221; Programming</h2>
<p>If I were to summarize how to program a site for a potentially &#8220;big&#8221; scale, it&#8217;d come down to two words: <em>optimal</em> and <em>flexible</em>.</p>
<p>Optimal means that the site should perform as well as possible. This should seem obvious, of course, but it bears repeating. Entire books could be written on coding optimally, but a few rules of thumb include:</p>
<ul>
<li>Don&#8217;t create variables or functions you don&#8217;t need</li>
<li>Minimize interactions with the file system</li>
<li>Minimize interactions with the database</li>
<li>Minimize networking</li>
<li>Limit the amount of information retrieved from the database</li>
<li>Watch usage of loops and recursion</li>
<li>Minimize and compress the amount of data transferred to the browser</li>
</ul>
<p>A catch is that you need to avoid <a href="http://c2.com/cgi/wiki?PrematureOptimization">premature optimization</a>. Don&#8217;t overthink what you&#8217;re supposed to be doing while you&#8217;re performing the initial programming! The goal is really to write code using the best practices. Then, when the site is done, profile and benchmark what you&#8217;ve created to see how it performs. Then you can attempt to fix bottlenecks.</p>
<p>Next, there&#8217;s the issue of writing <em>flexible</em> code. To understand the importance of flexible code as it pertains to &#8220;going big&#8221;, one has to understand the two ways in which a site may need to grow:</p>
<ul>
<li>Scale to handle more traffic</li>
<li>Add and change features and functionality</li>
</ul>
<p>A site can often be scaled to handle more traffic simply by throwing more resources at it: better hosting, a better server, more memory, more servers, a Content Delivery Network (CDN), etc. You generally don&#8217;t have to do anything with your code to make it scale-able, although as Ross discovered, inefficient code can make it necessary to spend more on resources sooner than you otherwise should. It&#8217;s this second issue?the ability to add and change features and functionality?that&#8217;s of relevance to your programming.</p>
<p>Some years ago I saw a presentation by an engineer at YouTube who said that it was more important that they could fix problems quickly than that the site itself runs quickly. I&#8217;ve heard similar thoughts expressed by many other programmers: a developer&#8217;s time is precious, but a site can be made to run faster merely by throwing an extra $100 worth of RAM into a server.</p>
<p>The point of flexible code is that the site has to be written in such a way that it&#8217;s quick and easy for you to fix problems, add features, and make other significant changes. If the code is hard to update, then updates either won&#8217;t happen or won&#8217;t happen quickly enough (and therefore, users will leave).</p>
<p>As an example, I&#8217;m working on a site now for a customer with some terrible legacy code. The site works well enough, but the customer needs to add features and improve performance. The performance can largely be remedied by fixing several problems in the database:</p>
<ul>
<li>A lack of indexes</li>
<li>Inconsistent column definitions</li>
</ul>
<p>The database issues are not too difficult to solve. However, each added feature is taking twice as long as it should because the code is a mess. One main script is over 3,000 lines long! And because the site is being actively used (and is currently profitable), I cannot make the large, sweeping changes I&#8217;d like to make, at the risk of hurting the business. Hence, baby steps are required, changes are being made very slowly, and the client is paying extra because it&#8217;s so tedious to work with this code.</p>
<p>So how do you write flexible code? I&#8217;ll answer that specific question next, but first, there&#8217;s a conflict to be understood: <strong>flexible code is at odds with optimal code</strong>. Generally speaking, if you make your code more flexible, it won&#8217;t perform as well.</p>
<p>As a specific example, many developers use database-agnostic interfaces, such as <a href="http://www.php.net/pdo">PDO</a> in PHP. PDO gives you a consistent interface regardless of the database in use. PDO also allows you to switch database applications on the fly, should that need arise. But the added interface layer drags down performance. Moreover, by being database agnostic, you can&#8217;t write your code to take advantage of features and capabilities of any specific database application. You&#8217;ve increased flexibility greatly, but hurt code optimization.</p>
<p>In this particular example, I&#8217;m generally of the opinion that one should just write the code to a specific database application. In almost 14 years of Web development, I&#8217;ve never once switched underlying database applications on an existing site. But the main point is that you have to find a balance between writing optimal code and writing flexible code. Fortunately, most of the best practices you&#8217;ll see online and read about in books hit this mark pretty well.</p>
<h2 id="qa1">Q&amp;A =&gt; How do you write flexible code?</h2>
<p>I forget who asked me this and when, but the question surrounded what, exactly, <em>flexible</em> code is and how one writes it. There are two ways you can write flexible code:</p>
<ul>
<li>In the code itself</li>
<li>Using a good workflow</li>
</ul>
<p>One of the first hallmarks of flexible code is <em>modularization</em>: dividing code up into discrete, independent blocks. At the more beginner level, using multiple files is a modular approach. One file might connect to the database, another is a configuration file, another has useful functions. The primary files then include these as necessary.</p>
<p>Defining your own functions for certain routines is also a modular approach. With both of these examples, the benefit is that you can edit one piece of code in one location and have site-wide impacts. That&#8217;s flexible code.</p>
<p>Second, create variables for values repeatedly used throughout a site. This could be the site&#8217;s name or URL, an email address, and so on. You might not think you&#8217;ll ever change a site&#8217;s URL, but if you do, having assigned that value to a variable that&#8217;s used throughout the site will make that change a snap.</p>
<p>Third, and on the more advanced level, Object-Oriented Programming creates much more flexible code. It&#8217;s modular by definition. Sweeping changes can be made in single locations, including adding features. I&#8217;m not an &#8220;OOP is always better&#8221; kind of developer, but I don&#8217;t think there&#8217;s a question that OOP makes for more maintainable code when it comes to large sites. Well, good OOP, that is.</p>
<p>You can also create flexible code by creating good workflows. In other words, flexibility isn&#8217;t just demonstrated by the code itself, but also how you generate the code. For example, mastering your development tools is crucial. But more specifically, if you start using technologies like CoffeeScript (a JavaScript generator), and Sass, LESS, or Compass (CSS frameworks), edits can be made in one location and reflected everywhere. I&#8217;ll talk a bit more about these later in this newsletter.</p>
<p>The final component of your workflow should be version control. There are lots of arguments for version control, and being able to quickly institute code changes is just one. Being able to immediately revoke <strong>bad</strong> code changes is another! For large sites, the more advanced solution is <a href="http://en.wikipedia.org/wiki/Continuous_integration">continuous integration</a>.</p>
<p>Again, much of what I&#8217;m talking about here is just a case of best practices: the kinds of things you should do whether or not your site would ever go big. The question is really how far you take any single approach.</p>
<h2 id="qa2">Q&amp;A =&gt; What do you think about Sass and Compass?</h2>
<p>A thousand years ago or so, Jamie asked for my thoughts on Sass and Compass. Jamie said:</p>
<blockquote><p>I&#8217;ve used Sass (SCSS) for a few projects, and Compass for one or two, and could never go back to vanilla CSS after doing so. I&#8217;m now looking forward to trying Sass&#8217;s &#8220;Sass&#8221; syntax in future projects.</p></blockquote>
<p>At the time Jamie asked, I wasn&#8217;t really using CSS on such a level to appreciate these tools. And, to be frank, that&#8217;s still true. As a backend developer, I don&#8217;t do much with CSS, aside from the occasional edit of existing values to change a font&#8217;s size, a background color, or the height of a header. That&#8217;s changed some thanks to <a href="http://twitter.github.io/bootstrap/">Twitter Bootstrap</a>. When I&#8217;m using it for a site, I&#8217;ll end up doing more CSS edits, simply to customize the default Bootstrap look to something slightly more original (slightly). Bootstrap uses <a href="http://lesscss.org/">LESS</a>, so I&#8217;ve started using LESS more myself (&#8220;LESS more&#8221; HA!). Coupled with <a href="http://incident57.com/codekit/">CodeKit</a> (for the Mac), it&#8217;s a great workflow to quickly develop sites.</p>
<p>Personally, I still don&#8217;t have much need for most of the features of these CSS frameworks. But they are great and totally useful. If you&#8217;re curious, I&#8217;d start out with something basic like LESS. If you use CSS a lot, then you may want to consider Sass.</p>
<h2 id="web">On the Web =&gt; CoffeeScript at Dropbox</h2>
<p><a href="http://coffeescript.org/">CoffeeScript</a> is a language used to simplify the writing of JavaScript. One writes code in CoffeeScript and then compiles it, with the resulting output being usable JavaScript. The arguments for using CoffeeScript are:</p>
<ul>
<li>Less code to write</li>
<li>Easier to maintain</li>
<li>Results in better JavaScript</li>
</ul>
<p>I personally had not been too sold on using CoffeeScript until I read about how Dropbox used CoffeeScript to <a href="https://tech.dropbox.com/2012/09/dropbox-dives-into-coffeescript/">rewrite all of its JavaScript in a single week</a>. Three employees performed that task, converting over 23,000 lines of JavaScript into 18,000+ lines of CoffeeScript, without affecting any of the functionality.</p>
<h2 id="news">Larry Ullman&#8217;s Book News =&gt; &#8220;The Yii Book&#8221;</h2>
<p>There was not as much progress on &#8220;<a href="http://yii.larryullman.com">The Yii Book</a>&#8221; last month as I would have liked, but I&#8217;m hoping to change that in May. I did some changing around of the <a href="http://yii.larryullman.com/toc.php">table of contents</a>. These are just changes that came organically as the book progressed. I did not drop the modules chapter, but I originally had one chapter on using extensions, one on modules (writing and using), and one on writing extensions. It just made more sense to do one chapter on using extensions (including modules) and one on writing extensions (including modules). So there&#8217;s that. And I changed the order of the other chapters in Part 3 a bit.</p>
<p>I&#8217;ve finally completed Chapters 15, Internationalization, and 16, Leaving the Browser. I&#8217;m getting those to the tech editors after this newsletter goes out, with an update to follow sometime thereafter.</p>
<p>It&#8217;s May, so I&#8217;m really bearing down to push through finishing this ASAP. I know I say this every time, but I really do appreciate your patience with this. You&#8217;ve been great. Truly. The writing itself hasn&#8217;t taken that much longer than expected, but everything else surrounding self-publishing has been a major drain on my time. I&#8217;ll write about all this when it&#8217;s behind me.</p>
<p>Also, in case you missed it, the first public preview of Yii 2 came out earlier this month. I&#8217;ve written how I expect that to impact &#8220;The Yii Book&#8221; in <a href="http://www.larryullman.com/2013/05/06/yii-2-public-preview-and-the-yii-book/">this blog post</a>.</p>
<p>Thanks to everyone for their interest in this book and to everyone that has already purchased a copy!</p><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/mJMKfoLb_2E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/05/15/what-is-larry-thinking-69-going-big-micro-version-part-1/</feedburner:origLink></item>
		<item>
		<title>LayoutIt!, a Twitter Bootstrap Design Tool</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/pEgVm3Tvvh8/</link>
		<comments>http://www.larryullman.com/2013/05/10/layoutit-a-twitter-bootstrap-design-tool/#comments</comments>
		<pubDate>Fri, 10 May 2013 14:18:25 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3596</guid>
		<description><![CDATA[I just recently discovered the Web site LayoutIt!. LayoutIt! provides a Web-based drag-and-drop interface for creating HTML layouts using the Twitter Bootstrap framework. For someone like me, with no design skills whatsoever, Twitter Bootstrap and this new LayoutIt! tool are wonderful inventions.]]></description>
				<content:encoded><![CDATA[<p>I just recently discovered the Web site <a href="http://www.layoutit.com/">LayoutIt!</a>. LayoutIt! provides a Web-based drag-and-drop interface for creating HTML layouts using the <a href="http://twitter.github.io/bootstrap/">Twitter Bootstrap</a> framework. For someone like me, with no design skills whatsoever, Twitter Bootstrap and this new LayoutIt! tool are wonderful inventions.<span id="more-3596"></span></p>
<p>To use LayoutIt!, you can start from scratch or begin with one of three base templates: starter, marketing, and article. Within the editing window, you can then start customizing your layout. First, use the grid functionality to add rows and columns of varying sizes. Maybe you want a banner across the top, then a row of two columns, and then a row of three. Could not be easier!</p>
<p>Next, use the CSS stuff to add and stylizes tables, forms, blockquotes, images, and the like. Depending upon what you add, you&#8217;ll be presented with other options to customize it, such as changing the alignment, emphasis, effects, and other styling.</p>
<p>There are then other conventional components: dropdowns, navigation menus, pagination links, &#8220;badges&#8221;, and &#8220;hero units&#8221;. Some of these can also be further customized once added to the page.</p>
<p>Finally, drop in the JavaScript-dependent components you need, like modal windows, tabs, accordions, and carousels.</p>
<p>Once you&#8217;ve got the design as you like it, you can download what you&#8217;ve created. You have three options:</p>
<ul>
<li>Copy just the HTML for the layout created, to be dropped into your own HTML file (with Bootstrap already installed)</li>
<li>Download a single HTML page</li>
<li>Download an entire zip file, with all the components required</li>
</ul>
<p>You can also save what you&#8217;ve created, in which case you&#8217;ll be presented with a short URL that returns you to your design for future edits. You can also use that URL to give clients or coworkers a preview of what you&#8217;ve done.</p>
<p>The site is currently in beta, meaning there are more features to be added, but what&#8217;s there already is quite promising, particularly for those of us that can use all the extra design help they can get.</p><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/pEgVm3Tvvh8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/05/10/layoutit-a-twitter-bootstrap-design-tool/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/05/10/layoutit-a-twitter-bootstrap-design-tool/</feedburner:origLink></item>
		<item>
		<title>Putting Your Current Clients First (Duh)</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/2GmEsZZ_puU/</link>
		<comments>http://www.larryullman.com/2013/05/08/putting-your-current-clients-first-duh/#comments</comments>
		<pubDate>Wed, 08 May 2013 21:08:06 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3577</guid>
		<description><![CDATA[When it comes to running a business, a lot of the discussion and effort goes towards getting new clients. Getting new clients is important, of course, especially when you're just getting started, but I believe that many business and people don't focus enough on the clients they already have. As happy as you are when you get a new project and client, how long is it before your eyes start to wander to that next possible job? This is natural, and certainly I've been guilty of it myself. But I would argue that you should put at least as much thought and effort into treating your current clients right as you put into getting new clients. Let's look at the why's and how's...]]></description>
				<content:encoded><![CDATA[<p>When it comes to running a business, a lot of the discussion and effort goes towards <em>getting new clients</em>. Getting new clients is important, of course, especially when you&#8217;re just getting started, but I believe that many business and people don&#8217;t focus enough on the clients they already have. As happy as you are when you get a new project and client, how long is it before your eyes start to wander to that next possible job? This is natural, and certainly I&#8217;ve been guilty of it myself. But I would argue that you should put at least as much thought and effort into treating your current clients right as you put into getting new clients. Let&#8217;s look at the why&#8217;s and how&#8217;s&#8230;<span id="more-3577"></span></p>
<h3>Why You Should Prioritize Your Current Clients</h3>
<p>I&#8217;d like to think that I shouldn&#8217;t have to argue for <em>why</em> you should prioritize the clients you already have, and yet, it seems to be necessary. Here, then, are three simple arguments for doing so:</p>
<ul>
<li>It&#8217;s easy</li>
<li>It&#8217;s the right thing to do</li>
<li>It will pay off financially</li>
</ul>
<p>Those are three different reasons with three different motivations. Let&#8217;s look at each.</p>
<h4>It&#8217;s Easy (the &#8220;lazy&#8221; argument)</h4>
<p>Getting new clients is hard! Really hard. You have to find them (or be fortunate enough that they find you). You have to engage in a conversation with them. You have to convince them to hire you instead of someone else. If you fail at any one of these steps, you don&#8217;t have a new client. And, statistically, you will fail in most of your attempts to get new clients.</p>
<p>Conversely, it&#8217;s very easy to take care of the clients you have. You&#8217;ve already connected with that client and established a relationship. In fact, you&#8217;ve already convinced them to hire you! You can now directly communicate with someone that pays you money for work. Hooray! Once you&#8217;ve gotten to that point, taking care of the client is easy, comparatively. You know what they want, what&#8217;s important to them, what they like, etc.</p>
<p>(This is normally the case. You will come across the occasional difficult client whom you can&#8217;t make happy, but you don&#8217;t really want that client in the long run anyway.)</p>
<h4>It&#8217;s the Right Thing To Do (the &#8220;moral&#8221; argument)</h4>
<p>Contractually, you have to live up to what you promise a client. But if you believe in the golden rule, then you ought to do more than just the bare minimum requirements.</p>
<h4>It Will Pay Off Financially (the &#8220;good business&#8221; argument)</h4>
<p>If neither of the other two arguments is sufficient for you, then here&#8217;s the kicker: you&#8217;ll make more money this way. Clients and jobs are too often thought of as just a financial arrangement: you do work for money. But if done right, you&#8217;ll get a lot more from a client and a job than just money:</p>
<ul>
<li>Experience</li>
<li>A better portfolio</li>
<li>Marketing benefits</li>
<li>A potential future client</li>
</ul>
<p>Experience and a strong portfolio can be as important as the money itself, especially when you&#8217;re just starting out. The same goes for the marketing benefit. If you treat your customer right, if you give them what they wanted and more, they will sing your praises, and you will likely get other clients because of that. A real, live recommendation or referral will do far more for you than any other type of advertising and promotion you attempt.</p>
<p>Finally, you ought to think of your current clients as potential future clients. I have two clients that I&#8217;ve continued to work with since 2001-2002. One just had me do another Web site for him last year. For the other client, I&#8217;ve probably done 5 Web sites over the decade. Clearly it&#8217;s better to have done 5 projects with one client than trying to find, work with, and manage 5 separate clients.</p>
<blockquote><p><strong>Your current clients are also potential future clients.</strong></p></blockquote>
<h3>How to Prioritize Your Current Clients</h3>
<p>So if you&#8217;re convinced of the need to put your current clients first, how exactly does one go about doing that? I&#8217;d recommend three steps:</p>
<ul>
<li>Make sure the project gets done, on time, and correctly</li>
<li>Give the customer a bit more</li>
<li>Follow up with the customer after the fact to make sure they&#8217;re still happy</li>
</ul>
<p>The first suggestion is a given, although despite our best intentions, it doesn&#8217;t always (or often enough) happen. As for doing the job &#8220;correctly&#8221;, sadly most customers won&#8217;t know how well something is programmed. But you&#8217;ll know, so do it right. At the very least, you&#8217;ll appreciate having done it right if you&#8217;re ever hired back to do more work on the project (which is, of course, a goal)!</p>
<p>The second suggestion is a way to truly shine and put yourself ahead of the competition. Undoubtedly, while you&#8217;re scoping and working on the project there will be things the customer would like to do, but can&#8217;t afford. So pick one or two of those and do it for them. The afternoon you spend giving the customer a little bit more will pay off in spades down the line.</p>
<p>Third, and finally, some period of time after the project has been completed, and you&#8217;ve been paid, follow up with the customer. How is it working? Is there anything that&#8217;s not working (through no fault of your own or otherwise)? Is there anything that they realize in hindsight should be done differently? If life&#8217;s not too hectic, and it&#8217;s not unreasonable, offer to tweak a thing or two for free. Or at a discount.</p>
<p>These little things will make a huge impression, and a huge, positive impression will be great for your business in the long run.</p>
<p>Those are my thoughts as to why and how you should put your existing clients first. It&#8217;s something I strongly believe and continue to remind myself day after day. And I think the fact that I&#8217;m still making money from clients I first connected with over 10 years ago is proof that it works.</p>
<p>For more ideas (although many are particular to designers), check out <a href="http://designfestival.com/10-cost-effective-ways-to-delight-your-design-clients/">this article at DesignFestival</a>.</p>
<p>What do you think?</p><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/2GmEsZZ_puU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/05/08/putting-your-current-clients-first-duh/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/05/08/putting-your-current-clients-first-duh/</feedburner:origLink></item>
		<item>
		<title>Yii 2 Public Preview and &#x201c;The Yii Book&#x201d;</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/HP5j-9xZddc/</link>
		<comments>http://www.larryullman.com/2013/05/06/yii-2-public-preview-and-the-yii-book/#comments</comments>
		<pubDate>Mon, 06 May 2013 14:22:09 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yiibk]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3590</guid>
		<description><![CDATA[Last week, the first public preview of version 2 of the Yii framework was announced. Qiang and the entire team have been working very hard, and this is a great milestone to reach. The code is available on Github, and there's a whole forum dedicated to feedback and design discussions. Input from the Yii community is actively encouraged. All that being said, understand that Yii 2 is not nearly ready for production uses yet. Many bugs will undoubtedly be found, and other changes to the framework's design are inevitable, too.

Besides mentioning this exciting news, I also wanted to explain how I expect this impacts my self-published book on the Yii framework...]]></description>
				<content:encoded><![CDATA[<p>Last week, the <a href="http://www.yiiframework.com/news/71/yii-2-public-preview-available/">first public preview of version 2 of the Yii framework</a> was announced. Qiang and the entire team have been working very hard, and this is a great milestone to reach. The <a href="https://github.com/yiisoft/yii2">code is available on Github</a>, and there&#8217;s a whole forum <a href="http://www.yiiframework.com/forum/index.php/forum/42-design-discussions-for-yii-20/">dedicated to feedback and design discussions</a>. Input from the Yii community is actively encouraged. All that being said, understand that Yii 2 is not nearly ready for production uses yet. Many bugs will undoubtedly be found, and other changes to the framework&#8217;s design are inevitable, too.</p>
<p>Besides mentioning this exciting news, I also wanted to explain how I expect this impacts my <a href="http://yii.larryullman.com">self-published book</a> on the Yii framework.<span id="more-3590"></span></p>
<p>As version 2 of the framework was being developed while I was writing <a href="http://yii.larryullman.com">the book</a>, it was always my intention to start writing the book for Yii 1, and eventually update it all for Yii 2. The question is when I make that switch. Considering that Yii 2 is not production ready, and more changes are sure to come, <strong>my current plan is to complete the first draft of the book for Yii 1.</strong> Yii 1 is what people are using now, and there&#8217;s still a lot more information that people need to be covered by the book.</p>
<p>I assume that it will probably be three months or so before Yii 2 is ironed out and close to being production ready. The first electronic version of &#8220;<a href="http://yii.larryullman.com">The Yii Book</a>&#8221; will be done by then. The remaining questions will be:</p>
<ul>
<li>When do I do a print run of the book?</li>
<li>When do I start the process of having the book translated?</li>
</ul>
<p>In other words, will the order be:</p>
<ul>
<li>Complete the book for Yii 1</li>
<li>Update the book for Yii 2</li>
<li>Create a print version of the book (for Yii 2)</li>
<li>Create translations of the book (for Yii 2)</li>
</ul>
<p>In that scenario, no print version or translations will ever be done for the Yii 1 version of the book.</p>
<p>Or will the order be:</p>
<ul>
<li>Complete the book for Yii 1</li>
<li>Create a print version of the book (for Yii 1)</li>
<li>Create translations of the book (for Yii 1)</li>
<li>Update the book for Yii 2</li>
<li>Create a print version of the book (for Yii 2)</li>
<li>Create translations of the book (for Yii 2)</li>
</ul>
<p>I will have to wait and see how things go, but my inclination today is that the first order will be what happens. On the one hand, the book&#8217;s content for Yii 2 won&#8217;t really be finalized until about Yii 2.0.x, when most of the post-production bugs have been found and fixed. This could be Fall 2013. On the other hand, I don&#8217;t want to ask translators to translate the entire book twice, as that&#8217;s a lot of work.</p>
<p>So, the short version of all this is that I&#8217;m going to complete the electronic version of the book for Yii version 1 first. Then I&#8217;ll see about translations and print copies based upon where Yii 2 is at that time.</p>
<blockquote><p><strong>As a reminder, anyone that purchases an electronic, English-language, Yii 1 version of the book will receive the electronic, English-language, Yii 2 version for free. </strong></p></blockquote><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/HP5j-9xZddc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/05/06/yii-2-public-preview-and-the-yii-book/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/05/06/yii-2-public-preview-and-the-yii-book/</feedburner:origLink></item>
		<item>
		<title>HTTP: The Protocol Every Web Developer Must Know &#x2013; Part 2 at Nettuts+</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/EDz7idmdFP0/</link>
		<comments>http://www.larryullman.com/2013/05/03/http-the-protocol-every-web-developer-must-know-part-2-at-nettuts/#comments</comments>
		<pubDate>Fri, 03 May 2013 18:48:10 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[http]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3589</guid>
		<description><![CDATA[A couple weeks ago, I posted a link to the Nettuts+ article ?HTTP: The Protocol Every Web Developer Must Know ? Part 1? by Pavan Podila. That was the first part of a two-part article, covering what every Web developer ought to know about the Hypertext Transfer Protocol. That article explained the fundamentals of HTTP, and is something that that truly every Web developer should read. Nettuts+ just posted Part 2. In this article, Podila goes into...]]></description>
				<content:encoded><![CDATA[<p>A couple weeks ago, I posted a link to the <a href="http://net.tutsplus.com/">Nettuts+</a> article ?<a href="http://net.tutsplus.com/tutorials/tools-and-tips/http-the-protocol-every-web-developer-must-know-part-1/">HTTP: The Protocol Every Web Developer Must Know ? Part 1</a>? by <a href="http://net.tutsplus.com/author/pavanpodila/">Pavan Podila</a>. That was the first part of a two-part article, covering what every Web developer ought to know about the Hypertext Transfer Protocol. That article explained the fundamentals of HTTP, and is something that that truly every Web developer should read.</p>
<p>Nettuts+ just posted <a href="http://net.tutsplus.com/tutorials/tools-and-tips/http-the-protocol-every-web-developer-must-know-part-2/">Part 2</a>. In this article, Podila goes into:</p>
<ul>
<li>Connection handling</li>
<li>Identification and authorization</li>
<li>Caching</li>
</ul>
<p>It&#8217;s useful, detailed stuff, and understanding these fundamentals will help you better appreciate the how&#8217;s and why&#8217;s of web development.</p>
<p>&nbsp;</p><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/EDz7idmdFP0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/05/03/http-the-protocol-every-web-developer-must-know-part-2-at-nettuts/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/05/03/http-the-protocol-every-web-developer-must-know-part-2-at-nettuts/</feedburner:origLink></item>
		<item>
		<title>&#x201c;The Yii Book&#x201d; Updated Table of Contents</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/5dupxvR-CUk/</link>
		<comments>http://www.larryullman.com/2013/04/29/the-yii-book-updated-table-of-contents/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 17:53:11 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yiibk]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3584</guid>
		<description><![CDATA[I'm working on Part 3 of "The Yii Book", and have made reference to the fact that I've been working on Chapter 15, "Internationalization," and Chapter 16, "Leaving the Browser." These are not the original chapters, per the first table of contents. Here, then, is an updated table of contents. These are still subject to change, but considering there's not that much of the book left, there probably won't be any dramatic changes.]]></description>
				<content:encoded><![CDATA[<style type="text/css" media="screen">
	.green {color: #008000}
</style>
<p>I&#8217;m working on Part 3 of &#8220;The Yii Book&#8221;, and have made reference to the fact that I&#8217;ve been working on Chapter 15, &#8220;Internationalization,&#8221; and Chapter 16, &#8220;Leaving the Browser.&#8221; These are not the original chapters, per the first table of contents. Here, then, is an updated table of contents. These are still subject to change, but considering there&#8217;s not that much of the book left, there probably won&#8217;t be any dramatic changes.<span id="more-3584"></span></p>
<p>The sections <span class="green">highlighted in green mark</span> the completed sections as of the time of this blog post (April 29, 2013). If you have any questions, see the <a href="http://yii.larryullman.com/faq.php">FAQ</a> page.</p>
<ul class="green">
<li><strong>Introduction </strong><a href="http://yii.larryullman.com/introduction.php" class="btn btn-info btn-small">excerpt</a>
<ul>
<li>Why Frameworks?</li>
<li>Why Yii?</li>
<li>What You&#8217;ll Need</li>
<li>About This Book</li>
<li>Getting Help</li>
</ul>
</li>
</ul>
<h3 class="green">Part 1: Getting Started</h3>
<ul class="green">
<li><strong>Chapter 1: Fundamental Concepts</strong>
<ul>
<li>Object-Oriented Programming</li>
<li>The MVC Approach</li>
<li>Using a Web Server</li>
<li>Command Line Tools</li>
</ul>
</li>
<li><strong>Chapter 2: Starting a New Application</strong>
<ul>
<li>Downloading Yii</li>
<li>Testing the Requirements</li>
<li>Installing the Framework</li>
<li>Building the Site Shell</li>
<li>Testing the Site Shell</li>
</ul>
</li>
<li><strong>Chapter 3: A Manual for Your Yii Site</strong>
<ul>
<li>The Site&#8217;s Folders</li>
<li>Referencing Files and Directories</li>
<li>Yii Conventions</li>
<li>How Yii Hands a Page Request</li>
</ul>
</li>
<li><strong>Chapter 4: Initial Customizations and Code Generations</strong>
<ul>
<li>Enabling Debug Mode</li>
<li>Moving the Protected Folder</li>
<li>Basic Configurations</li>
<li>Developing Your Site</li>
<li>Building Components with Gii</li>
</ul>
</li>
</ul>
<h3>Part 2: Core Concepts</h3>
<ul>
<li class="green"><strong>Chapter 5: Working with Models</strong>
<ul>
<li>The Model Classes</li>
<li>Establishing Rules</li>
<li>Changing Labels</li>
<li>Watching for Model Events <a href="http://www.larryullman.com/2013/03/13/watching-for-model-events-in-the-yii-framework/" class="btn btn-info btn-small">excerpt</a></li>
<li>Relating Models</li>
</ul>
</li>
<li class="green"><strong>Chapter 6: Working with Views</strong>
<ul>
<li>The View Structure</li>
<li>Where Views are Referenced</li>
<li>Layouts and Views</li>
<li>Editing View Files</li>
<li>Working with Layouts</li>
<li>Alternative Content Presentation <a href="http://www.larryullman.com/2013/04/03/using-content-decorators-in-the-yii-framework/" class="btn btn-info btn-small">excerpt</a></li>
</ul>
</li>
<li class="green"><strong>Chapter 7: Working with Controllers</strong>
<ul>
<li>Controller Basics</li>
<li>Using Views</li>
<li>Using Models</li>
<li>Handling Forms</li>
<li>Basic Access Control</li>
<li>Understanding Routes <a href="http://www.larryullman.com/2013/02/18/understanding-routes-in-the-yii-framework/" class="btn btn-info btn-small">excerpt</a></li>
<li>Tapping Into Filters</li>
<li>Showing Static Pages <a href="http://www.larryullman.com/2013/04/17/showing-static-pages-in-the-yii-framework/" class="btn btn-info btn-small">excerpt</a></li>
<li>Exceptions</li>
</ul>
</li>
<li class="green"><strong>Chapter 8: Working with Databases</strong>
<ul>
<li>Debugging Database Operations</li>
<li>Database Options</li>
<li>Using Active Record</li>
<li>Using QueryBuilder</li>
<li>Using Database Active Objects</li>
<li>Choosing an Interface Option</li>
<li>Common Challenges</li>
</ul>
</li>
<li class="green"><strong>Chapter 9: Working with Forms</strong>
<ul>
<li>Understanding Forms and MVC</li>
<li>Creating Forms Without Models</li>
<li>Using CHtml</li>
<li>Using &#8220;Active&#8221; Methods</li>
<li>Using CActiveForm</li>
<li>Using Form Builder</li>
<li>Common Form Needs</li>
</ul>
</li>
<li class="green"><strong>Chapter 10: Maintaining State</strong>
<ul>
<li>Cookies</li>
<li>Sessions</li>
</ul>
</li>
<li class="green"><strong>Chapter 11: Authenticating Users</strong>
<ul>
<li>Fundamentals of Authentication</li>
<li>Authentication Options</li>
<li>The UserIdentity State</li>
<li>Authorization</li>
<li>Working with Flash Messages</li>
</ul>
</li>
<li class="green"><strong>Chapter 12: Working with Widgets</strong>
<ul>
<li>Using Widgets</li>
<li>Basic Yii Widgets</li>
<li>Presenting Data</li>
<li>The jQuery UI Widgets</li>
</ul>
</li>
<li class="green"><strong>Chapter 13: Using Extensions</strong>
<ul>
<li>The Basics of Extensions</li>
<li>The bootstrap Extension</li>
<li>The giix Extension</li>
<li>Validator Extensions</li>
<li>Auto-Setting Timestamps</li>
<li>Using WYSIWYG Editor</li>
</ul>
</li>
<li class="green"><strong>Chapter 14: JavaScript and jQuery</strong>
<ul>
<li>What You Must Know</li>
<li>Adding JavaScript to a Page</li>
<li>Using JavaScript with CActiveForm</li>
<li>Implementing Ajax</li>
<li>Common Needs</li>
</ul>
</li>
</ul>
<h3>Part 3: Advanced Topics</h3>
<ul>
<li><strong>Chapter 15: Internationalization</strong>
<ul>
<li>What is i18n?</li>
<li>Setting the Locale</li>
<li>Detecting the User&#8217;s Locale</li>
<li>Providing Language-Appropriate Text</li>
<li>Formatting Dates</li>
<li>Representing Time Zones</li>
<li>Formatting Numbers</li>
<li>i18n and Your Models</li>
</ul>
</li>
<li><strong>Chapter 16: Leaving the Browser</strong>
<ul>
<li>Writing a Proxy Script</li>
<li>Creating Web Services</li>
<li>Creating a Console Application</li>
</ul>
</li>
<li><strong>Chapter 17: Improving Performance</strong>
<ul>
<li>Testing Performance</li>
<li>Faster Sessions</li>
<li>Caching</li>
<li>Utilizing APC</li>
<li>Database Profiling and Optimization</li>
<li>Browser Improvements</li>
</ul>
</li>
<li><strong>Chapter 18: Advanced Database Issues</strong>
<ul>
<li>Calling Stored Procedures</li>
<li>Database Migration</li>
<li>Complex Relationships</li>
<li>Complex Keys</li>
</ul>
</li>
<li><strong>Chapter 19: Extending Yii</strong>
<ul>
<li>Creating Widgets</li>
<li>Creating a Stripe Extension</li>
<li>Creating Modules</li>
</ul>
</li>
<li><strong>Chapter 20: Working with Third-Party Libraries</strong>
<ul>
<li>Integrating Zend Framework Components</li>
<li>Alternative Database Libraries</li>
<li>Other Examples TBD</li>
</ul>
</li>
<li><strong>Chapter 21: Implementing Unit Tests</strong>
<ul>
<li>Using PHPUnit</li>
<li>Using Selenium</li>
<li>Automating Tests</li>
</ul>
</li>
</ul>
<h3>Part 4: Completing Projects</h3>
<ul>
<li><strong>Chapter 22: Creating a CMS</strong></li>
<li><strong>Chapter 23: Making an E-commerce Site</strong></li>
<li><strong>Chapter 24: Implementing a Search Engine</strong></li>
<li><strong>Chapter 25: Shipping Your Project</strong></li>
</ul>
<ul>
<li><strong>Appendix A: Frequently Asked Questions</strong></li>
</ul><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/5dupxvR-CUk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/04/29/the-yii-book-updated-table-of-contents/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/04/29/the-yii-book-updated-table-of-contents/</feedburner:origLink></item>
		<item>
		<title>20 Point List For Preventing Cross-Site Scripting In PHP</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/bklmToXbZtU/</link>
		<comments>http://www.larryullman.com/2013/04/26/20-point-list-for-preventing-cross-site-scripting-in-php/#comments</comments>
		<pubDate>Fri, 26 Apr 2013 18:05:14 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3583</guid>
		<description><![CDATA[Pádraic Brady just posted "20 Point List For Preventing Cross-Site Scripting In PHP", a thorough list of steps you should take when developing a Web site to prevent Cross-Site Scripting (XSS) attacks. Arguably, it would have been useful to include the explanations for some of these, but then the post could have been too long. In any case, it's worth a quick read. I particularly like the following:]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.astrumfutura.com/">Pádraic Brady</a> just posted &#8220;<a href="http://blog.astrumfutura.com/2013/04/20-point-list-for-preventing-cross-site-scripting-in-php/">20 Point List For Preventing Cross-Site Scripting In PHP</a>&#8220;. This is a thorough list of steps you should take when developing a Web site to prevent Cross-Site Scripting (XSS) attacks. Arguably, it would have been useful to include the explanations for some of these, but then the post could have been too long (and one less likely to actually be read). In any case, it&#8217;s worth a quick look through. I particularly like the following recommendations:<span id="more-3583"></span></p>
<ul>
<li>Never forget to validate data arriving from an untrusted origin using relevant rules for the context it?s used in.</li>
<li>Remember that anything not explicitly defined in source code has an untrusted origin.</li>
<li>Never include resources loaded over unsecured HTTP on a page loaded over HTTPS.</li>
<li>Adopt the Content Security Policy (CSP) header and abandon the use of inline CSS and Javascript where feasible.</li>
<li>Ensure that cookies which must only be transmitted over HTTPS are marked Secure.</li>
</ul><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/bklmToXbZtU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/04/26/20-point-list-for-preventing-cross-site-scripting-in-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/04/26/20-point-list-for-preventing-cross-site-scripting-in-php/</feedburner:origLink></item>
		<item>
		<title>Need a Graphic Designer for Pro Bono Work</title>
		<link>http://feedproxy.google.com/~r/larryullman/bMsj/~3/fInrW6clvtA/</link>
		<comments>http://www.larryullman.com/2013/04/24/need-a-graphic-designer-for-pro-bono-work/#comments</comments>
		<pubDate>Wed, 24 Apr 2013 14:07:30 +0000</pubDate>
		<dc:creator>Larry</dc:creator>
				<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.larryullman.com/?p=3580</guid>
		<description><![CDATA[For several months now, I've been doing some pro-bono (i.e., free) work for a local non-profit, the Centre County Down Syndrome Society. I'm helping them bring their Web site into the modern age. (If you look, you'll see that the site is currently terrible. Terrible!) That process is moving right along, but they have a need I cannot address, and I'm hoping that some friendly graphic designer out there can help them (and me) out.]]></description>
				<content:encoded><![CDATA[<p>For several months now, I&#8217;ve been doing some pro-bono (i.e., free) work for a local non-profit, the <a href="http://centrecountydownsyndrome.org/">Centre County Down Syndrome Society</a>. I&#8217;m helping them bring their Web site into the modern age. (If you look, you&#8217;ll see that the site is currently terrible. Terrible!) That process is moving right along, but they have a need I cannot address, and I&#8217;m hoping that some friendly graphic designer out there can help them (and me) out.</p>
<div class="alert alert-info">UPDATE: I believe this need has already been filled, but if you want to offer names and suggestions just in case, that&#8217;s great. My sincerest thanks to everyone!</div>
<p><span id="more-3580"></span></p>
<p>The organization&#8217;s original logo is a terribly clunky thing, probably created in Microsoft PowerPoint or Paint! They need the logo to be recreated as a vector image (I assume), so that it&#8217;ll be usable online and in print publications. I imagine the color scheme will stay relatively the same. Other than that, I&#8217;m not sure as to the particulars of what they&#8217;d want the logo to be, look like, etc. (This is an organization, with a committee, so there may be multiple opinions involved.)</p>
<p>This is a non-paying gig. However, you&#8217;ll have my eternal gratitude and the reward of having done something charitable.</p>
<p>If you&#8217;re able and interested, let me know. Thanks!</p><img src="http://feeds.feedburner.com/~r/larryullman/bMsj/~4/fInrW6clvtA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.larryullman.com/2013/04/24/need-a-graphic-designer-for-pro-bono-work/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.larryullman.com/2013/04/24/need-a-graphic-designer-for-pro-bono-work/</feedburner:origLink></item>
	</channel>
</rss><!-- Served from: www.larryullman.com @ 2013-05-25 08:42:12 by W3 Total Cache -->
