<?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>Grabbing Hanuman&#039;s Long Tail - Jacob Singh online</title>
	<atom:link href="http://pajamadesign.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://pajamadesign.com</link>
	<description>Just because something doesn&#039;t do what you planned it to do doesn&#039;t mean it&#039;s useless.   - Thomas A. Edison</description>
	<lastBuildDate>Fri, 06 Nov 2009 08:34:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Spam yourself.  Spamalot or a spamalittle with DevelMailLog</title>
		<link>http://pajamadesign.com/2009/11/06/spam-yourself-spamalot-or-a-spamalittle-with-develmaillog/</link>
		<comments>http://pajamadesign.com/2009/11/06/spam-yourself-spamalot-or-a-spamalittle-with-develmaillog/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 07:09:47 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[acquia]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=114</guid>
		<description><![CDATA[I was upgrading The Watcher module  to Drupal 7 today and found myself having to test a lot of email sending.  Looking around in vain for a fake email system to log emails to the disk instead of sending them out into the interwebs to risk getting called the dreaded meat product, I [...]]]></description>
			<content:encoded><![CDATA[<p>I was upgrading <a href="http://drupal.org/project/watcher">The Watcher module </a> to Drupal 7 today and found myself having to test a lot of email sending.  Looking around in vain for a fake email system to log emails to the disk instead of sending them out into the interwebs to risk getting called the dreaded meat product, I decided to write one using the new pluggable mail system interface in Drupal 7.</p>
<p><img src="http://www.maximumpc.com/files/u69/Spam.png" alt="Spam!" /></p>
<p>Previous versions of this have existed in the past, but I couldn&#8217;t find anything in <a href="http://drupal.org/project/devel">devel</a> currently.  Here&#8217;s how it works.  If you want to save your mails locally to files:</p>
<p><strong>Step 1</strong><br />
Install <a href="http://drupal.org/project/devel">Devel</a><br />
<strong>Step 2</strong><br />
Apply this patch (until it gets committed) &#8211; Review here: http://drupal.org/node/625062.</p>
<pre class="brush:bash">
cd sites/all/modules/devel
curl http://drupal.org/files/issues/develmail-625062-1.patch | patch -p0
</pre>
<p><strong>Step 3</strong><br />
In your settings.php file:</p>
<pre class="brush:PHP">
$conf['mail_system'] = array('default-system', 'DevelMailLog');
</pre>
<p>That&#8217;s it!</p>
<p>Unless you set anything else mails are saved to files/mails/$to-$subject-$datetime.mail.txt</p>
<p><strong> Example </strong><br />
<img src="http://img.skitch.com/20091106-xcchjhudmrqgpnq446jknit8pr.png" alt="Contact | My Site"/></p>
<p><img src="http://img.skitch.com/20091106-qdxus2f5yfd9q8hxdcsdhj229n.png" alt="Terminal — bash — 140×50"/></p>
<p><strong> Bonus </strong><br />
You can change the directory with<br />
variable_set(&#8217;devel_debug_mail_directory&#8217;, file_directory_path() . &#8216;/mails&#8217;);</p>
<p>Or the file format<br />
variable_set(&#8217;devel_debug_mail_file_format&#8217;, &#8216;%to-%subject-%datetime.mail.txt&#8217;);</p>
<p>Till next time spammers&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/11/06/spam-yourself-spamalot-or-a-spamalittle-with-develmaillog/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>What can we do to make Drupal 7 faster?</title>
		<link>http://pajamadesign.com/2009/10/22/drupal-7-performance-testing/</link>
		<comments>http://pajamadesign.com/2009/10/22/drupal-7-performance-testing/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 10:21:29 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[acquia]]></category>
		<category><![CDATA[acquia drupal planet]]></category>
		<category><![CDATA[bowling]]></category>
		<category><![CDATA[jmeter]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[simpsons]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=75</guid>
		<description><![CDATA[Drupal 7&#8217;s major API code freeze is behind us  so time to take stock of the effect of the massive API overhauls and the hotly debated new interfaces and how they effect performance.  As part of the last sprint at Acquia, I was tasked with comparing the performance of Drupal 6 and Drupal [...]]]></description>
			<content:encoded><![CDATA[<p>Drupal 7&#8217;s major API code freeze is behind us  so time to take stock of the effect of the massive API overhauls and the hotly debated new interfaces and how they effect performance.  As part of the last sprint at <a href="http://acquia.com">Acquia</a>, I was tasked with comparing the performance of Drupal 6 and Drupal 7 in similar conditions so we know how much work we all have to do before Drupal 7 is ready for release.</p>
<h3> So how does D7 match up with D6? </h3>
<p><img width="200px" style="width:200px; float:right" src="http://mooreslore.corante.com/archives/images/homer%20simpson.gif" /></p>
<blockquote><p>
<strong>Of men who have a sense of honor, more come through alive than are slain, but from those who flee comes neither glory nor any help.</strong><br />
    Homer, The Iliad
</p></blockquote>
<p><br style="clear:both"/></p>
<p><strong> The Legend of the Drupal release cycle</strong><br />
In every Drupal development and release cycle, there is a period of rampant innovation by thousands of people distributed throughout the world.  They get on IRC, email lists, in the flesh, etc and just bang out a ton of great code.  Then the dust settles and the code freezes. Everyone wakes up after 3 days of recovery sleep, finishes their caffeinated beverage of choice, and tries out their new super-duper-fantastic toy to see how it works.  It&#8217;s full of creaky limbs and flashy lightbulbs attached to misplaced handles.  It gets poked and prodded, and then, we take it around the block to see how it runs and what we need to do to harden the security and make it as fast as possible (two areas Drupal has always excelled in).  Then we all pitch in to get the bug fixing and performance tuning done.</p>
<p>Drupal 6 was of course a major refinement over Drupal 5 without creating too many waves for developers or user interfaces.  It was also a little bit slower.  <strong>Drupal 7 looks sexy, has much more consistency in its APIs, a kick ass database abstraction layer, a powerful ORM in fields.</strong>   However as is expected in this pre-release stage, I have found in my testing that Drupal 7 in the current stage is slower, and now is the time to focus on performance.</p>
<p><em> <strong>Disclaimer: </strong>These are very preliminary numbers using a new benchmarking setup (which is described below).  Neither the methodology nor the reports are perfect, so please do you own benchmarks (I also cover that later).</em></p>
<p><strong> Summary (Cliff notes)</strong></p>
<ul>
<li> As expected, Drupal 7 is slower as it is pre-release and more feature rich.</li>
<li> For anonymous (cached) browsing, D7 is close on /taxonomy/1 and /node/1, it is much slower on /node</li>
<li> Authenticated users browsing is about 2-3x slower</li>
<li> User operations (login, user page, logout) are about 3-4x slower</li>
</ul>
<h3> What / how are we testing- Check the lanes </h3>
<p><strong>Target machine:</strong> IBM T60p thinkpad (Ubuntu 9.10, 2.16Ghz Core Duo + 2GB Dual channel RAM).<br />
<strong>Testing machine:</strong> MacBookPro 2.5ghz 4GB of RAM</p>
<p>Testing machine ran <a href="http://jakarta.apache.org/jmeter/">jmeter</a> and the two boxes were connected via LAN cables to minimize the network effect.</p>
<h3>Testing platform &#8211; Set up the pins</h3>
<p><img src="http://www.clipartguide.com/_named_clipart_images/0511-0902-0913-3442_Bowling_Pins_clipart_image.jpg" alt="Bowling pins" /></p>
<p>To start with, we need a reproducible environment of fake data to test against.  As an attempt to create such a standard, I started the <a href="http://drupal.org/project/northdrop">NorthDrop</a> project on Drupal.org.  It is an install profile which uses devel_generate (dumy content generation module) to make fake content depending on settings provided during the install.</p>
<p>I got devel_generate mostly working for D7 and I backported NorthDrop to D6 so we could get two installs with almost identical types and amounts of content.</p>
<p>For the purposes of this test and not having someone call the society for the preservation of old and battered laptops, I put it on the &#8220;small setting&#8221; which includes:</p>
<pre class="brush: php">
$sample_sizes['small'] = array();
$sample_sizes['small']['nodes'] = 200;
$sample_sizes['small']['comments'] = 4; // Per node
$sample_sizes['small']['users'] = 50;
$sample_sizes['small']['terms'] = 15;
$sample_sizes['small']['vocabs'] = 3;
</pre>
<h3>Testing format &#8211; The approach&#8230;</h3>
<p>For this basic profiling test, I built three thread groups.  A thread group is a set of fake users who will do the same routine (hit a few paths / submit forms) for a certain number of loops.  In this case, here are my thread groups:</p>
<p><img src="http://pajamadesign.com/wp-content/uploads/2009/10/BowlingThreads1.png" alt="BowlingThreads" title="BowlingThreads" width="449" height="352" class="aligncenter size-full wp-image-85" /></p>
<p>All three thread groups run simultaneously and the results are saved to xml files which are later views / processed.<br />
For verification of results, I used the highly scientific eye-ball method of, &#8220;eh&#8230; that&#8217;s pretty close&#8221; after running each test 3-4 times.</p>
<h3> Results &#8211; The Scorecard </h3>
<p><img src="http://a.espncdn.com/i/page3/photos/040119homerbowl.jpg"/></p>
<p>Although I highlighted the important conclusions in the summary, here are the tables it is derived from:<br />
<a href="http://spreadsheets.google.com/pub?key=t9ln9MYX0RCR4VlH3l4D0ZA&#038;output=html">Benchmark Data for Drupal 6 / Drupal 7</a></p>
<p>And here is a nice histogram built by this <a href="http://blogs.atlassian.com/developer/2008/10/performance_testing_with_jmete.html">awesome script </a> by the folks at Atlassian (makers of JIRA and Fisheye).</p>
<p>This shows the response times for <strong> Authenticated users </strong> as percentage of requests.  (click to see a larger image).</p>
<h4>Drupal 6:</h4>
<p><a href="http://pajamadesign.com/wp-content/uploads/2009/10/Drupal6-percent-auth.png"><img src="http://pajamadesign.com/wp-content/uploads/2009/10/Drupal6-percent-auth-300x225.png" alt="Drupal6-percent-auth" title="Drupal6-percent-auth" width="300" height="225" class="aligncenter size-medium wp-image-87" /></a></p>
<h4>Drupal 7:</h4>
<p><a href="http://pajamadesign.com/wp-content/uploads/2009/10/Drupal7-percent-stacked.png"><img src="http://pajamadesign.com/wp-content/uploads/2009/10/Drupal7-percent-stacked-300x225.png" alt="Drupal7-percent-stacked" title="Drupal7-percent-stacked" width="300" height="225" class="aligncenter size-medium wp-image-86" /></a></p>
<h3> What next? &#8211; The long drive home </h3>
<h4> Profiling </h4>
<p>We need to examine the causes in more detail.  This type of basic performance testing gives us some clues as to what pages / content cause load.  Next we have to open up xcache and start getting into the nitty gritty to identify what needs to change.</p>
<h4> Improved tests, isolation tests</h4>
<p>I&#8217;ve posted the jmx I used for testing to a <a href="http://github.com/jacobSingh/Drupal-Performance-Testing-Suite">new github repo</a> for this.  If I get time, I will be writing another post to outline how this jmx was built and what it takes to run it.  <em> hint: it&#8217;s really easy! </em>.  It would be great if we built tests which just test one facet at a time, and also if we profiled more write heavy ops like commenting, content creation, etc.</p>
<h4> Automated testing </h4>
<p>The framework is in place to automate this, especially in D7 since the northdrop profile can be installed from the CLI.  Jmeter can take params, and the jmetergraph.pl program can give us a good visual.  Everyone&#8217;s eventual goal is something like testbot to run after every commit or perhaps on certain patches to give us an indication of what effect a change will have on general performance.  We&#8217;re just dev hours and a server farm away from getting this set-up.</p>
<h4> Resource profiling </h4>
<p>Looking from the outside, we just get response times.  We need to also identify what is making it slow from a system level.  Is it MySQL?  Is it PHP?  RAM or CPU? are we I/O limited in some operations? Sometimes we can go backwards in performance, but forwards in scalability.  This should be accounted for.</p>
<h3> Good bye! </h3>
<p><img src="http://pajamadesign.com/wp-content/uploads/2009/10/bowling-pins.jpg" alt="bowling-pins" title="bowling-pins" width="250" height="185" class="aligncenter size-full wp-image-96" /><br />
If you want to get the test files used for this report <a href="http://github.com/jacobSingh/Drupal-Performance-Testing-Suite">they are here.</a><br />
A special thanks to <a href="http://www.drupaler.co.uk">greg_harvey</a> and Graham Taylor for sending me a starter jmx they had built previously for functional tests. I hope this post is useful in spurring the discussion of D7 performance, please feel free to<a href="http://pajamadesign.com/?p=75#respond"> leave a comment on pajamadesign.com</a> or on my Acquia blog.</p>
<p>There is still time to fix these performance issues so dive in.</p>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/10/22/drupal-7-performance-testing/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Measuring Drupal performance with jmeter</title>
		<link>http://pajamadesign.com/2009/10/22/measuring-drupal-performance-with-jmeter/</link>
		<comments>http://pajamadesign.com/2009/10/22/measuring-drupal-performance-with-jmeter/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 06:56:14 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=101</guid>
		<description><![CDATA[As some of you know, I&#8217;ve been doing some performance testing of Drupal recently.
I&#8217;ve also started a project on github  for this work.  I&#8217;ll be updating the documentation here, there and elsewhere as more time is invested, but for now, here is a brief intro to what jmeter looks like and how it [...]]]></description>
			<content:encoded><![CDATA[<p>As some of you know, I&#8217;ve been doing some performance testing of Drupal recently.</p>
<p>I&#8217;ve also started a <a href="http://github.com/jacobSingh/Drupal-Performance-Testing-Suite">project on github </a> for this work.  I&#8217;ll be updating the documentation here, there and elsewhere as more time is invested, but for now, here is a brief intro to what jmeter looks like and how it can be used to profile Drupal.</p>
<p><a href="http://pajamadesign.com/drupal/movies/jmeter-drupal.mov">Video on Drupal profiling with jmeter</a></p>
<p>Apologies for not making zooms, etc.  If it is not viewable, let me know and I&#8217;ll spend a bit more time.</p>
<p>Best,<br />
Jacob</p>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/10/22/measuring-drupal-performance-with-jmeter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://pajamadesign.com/drupal/movies/jmeter-drupal.mov" length="5356050" type="video/quicktime" />
		</item>
		<item>
		<title>Plugin Manager in Core (part deux)</title>
		<link>http://pajamadesign.com/2009/08/06/plugin-manager-in-core-part-deux/</link>
		<comments>http://pajamadesign.com/2009/08/06/plugin-manager-in-core-part-deux/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 05:54:48 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[acquia]]></category>
		<category><![CDATA[plugin manager]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=64</guid>
		<description><![CDATA[Sorry, long time no blog.
It&#8217;s been a crazy three months working on the Plugin Manager in Core project.
For those not acquainted, the plan is to make a GUI based installer / updater for Drupal modules and themes.

We were almost done, and even had it all  accessible 
Then, some concerns were raised in the community [...]]]></description>
			<content:encoded><![CDATA[<p>Sorry, long time no blog.</p>
<p>It&#8217;s been a crazy three months working on the Plugin Manager in Core project.</p>
<p>For those not acquainted, the plan is to make a GUI based installer / updater for Drupal modules and themes.</p>
<div class="thumbnail"><a href="http://skitch.com/jacobsingh/b4mym/available-updates-dev7"><img src="http://img.skitch.com/20090806-ctf4danajqdxatehnag1bif56c.preview.jpg" alt="Available updates | dev7" /></a></div>
<p>We were almost done, and even had it all <a href="http://pajamadesign.com/update_status/update_accessible.mov"> accessible </a></p>
<p>Then, some <a href="http://groups.drupal.org/node/24709">concerns</a> were raised in the community about security and reliability.  If you would like the US Library of Congress ref number for this discussion and the issues about <a href="http://drupal.org/node/395474">Plugin Manager</a> in <a href="http://drupal.org/node/395472">D7</a>, please contact me directly, I&#8217;ll notify you when they have finished building a computer fast enough to import them into their collection.</p>
<p>At any rate, here is the gist:</p>
<p>I, Adrian Rossouw, and probably some others are working to get something in by September 1st.</p>
<p>I&#8217;ve developed a specification, a backlog, and worked with Dries to finalize it&#8217;s acceptance.<br />
Here is the something we are building:<br />
<a href="http://drupal.org/node/536630">Plugin manager for D7 code freeze spec</a>.</p>
<p>I&#8217;ve also started out on a few of the issues, namely adding  <a href="http://drupal.org/node/528326">chmod support to FileTransfers</a>, and <a href="http://drupal.org/node/538660"> moving the security sensitive operations to a separate file</a>.</p>
<p>But there is a lot of other work to do, and we need all the help we can get.  So if you&#8217;re interested in volunteering, comment here, or the main specification issue, email me, call me, show up at my house, whatever.</p>
<p>Also, come to my <a href="http://paris2009.drupalcon.org/session/kill-your-programmer-easy-installing-drupal-modules-and-themes-d7">session at DrupalCon</a>.  I&#8217;ll also be trying to organize a BoF to talk about future plans.</p>
<p>Take care!<br />
Jacob</p>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/08/06/plugin-manager-in-core-part-deux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://pajamadesign.com/update_status/update_accessible.mov" length="1665960" type="video/quicktime" />
		</item>
		<item>
		<title>Be Drunk</title>
		<link>http://pajamadesign.com/2009/07/03/be-drunk/</link>
		<comments>http://pajamadesign.com/2009/07/03/be-drunk/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 04:00:10 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[drunk]]></category>
		<category><![CDATA[poetry]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=62</guid>
		<description><![CDATA[(Received in an email&#8230; really sounds like a Sufi, but it&#8217;s not AFAICT from the name).
Be Drunk
by Charles Baudelaire
Translated by Louis Simpson
You have to be always drunk. That&#8217;s all there is to it—it&#8217;s the only
way. So as not to feel the horrible burden of time that breaks your
back and bends you to the earth, you [...]]]></description>
			<content:encoded><![CDATA[<p>(Received in an email&#8230; really sounds like a Sufi, but it&#8217;s not AFAICT from the name).</p>
<p>Be Drunk<br />
by Charles Baudelaire<br />
Translated by Louis Simpson</p>
<p>You have to be always drunk. That&#8217;s all there is to it—it&#8217;s the only<br />
way. So as not to feel the horrible burden of time that breaks your<br />
back and bends you to the earth, you have to be continually drunk.<br />
But on what? Wine, poetry or virtue, as you wish. But be drunk.<br />
And if sometimes, on the steps of a palace or the green grass of a<br />
ditch, in the mournful solitude of your room, you wake again,<br />
drunkenness already diminishing or gone, ask the wind, the wave, the<br />
star, the bird, the clock, everything that is flying, everything that<br />
is groaning, everything that is rolling, everything that is singing,<br />
everything that is speaking. . .ask what time it is and wind, wave,<br />
star, bird, clock will answer you: &#8220;It is time to be drunk! So as not<br />
to be the martyred slaves of time, be drunk, be continually drunk! On<br />
wine, on poetry or on virtue as you wish.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/07/03/be-drunk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The death of the Drupal programmer</title>
		<link>http://pajamadesign.com/2009/06/25/the-death-of-the-drupal-programmer/</link>
		<comments>http://pajamadesign.com/2009/06/25/the-death-of-the-drupal-programmer/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 12:21:15 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[acquia]]></category>
		<category><![CDATA[acquia drupal planet]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=61</guid>
		<description><![CDATA[Okay, so that&#8217;s going a bit too far.  But we&#8217;re getting ever closer to the dream module and theme updates and installs using a GUI in your browser!
Many thanks to cwgordon, Joshua Rogers, dww and especially chx for kicking some serious arse on this issue and getting us very close.

That&#8217;s right, in Drupal 7 [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, so that&#8217;s going a bit too far.  But we&#8217;re getting ever closer to the dream module and theme updates and installs using a GUI in your browser!</p>
<p>Many thanks to cwgordon, Joshua Rogers, dww and especially chx for kicking some serious arse on this issue and getting us very close.</p>
<div class="thumbnail"><a href="http://skitch.com/jacobsingh/biqsw/update-process2.mov-video-quicktime-object"><img src="http://img.skitch.com/20090625-p8tyfyn82g7mf1fr19rqnart6g.preview.jpg" alt="update_process2.mov (video/quicktime Object)" /></a></div>
<p>That&#8217;s right, in Drupal 7 you will be able to update your modules and themes without learning FTP, SSH or CVS. </p>
<p><a href="http://pajamadesign.com/update_status/update_process2.mov">Check out my latest screencast</a></p>
<p>and <a href="http://drupal.org/node/395474"> get involved</a>.</p>
<p>Also PLEASE vote for my <a href="http://paris2009.drupalcon.org/session/kill-your-programmer-easy-installing-drupal-modules-and-themes-d7">session at DrupalCon Paris</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/06/25/the-death-of-the-drupal-programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://pajamadesign.com/update_status/update_process2.mov" length="5807175" type="video/quicktime" />
		</item>
		<item>
		<title>Finding and installing Drupal modules from your site</title>
		<link>http://pajamadesign.com/2009/06/10/finding-and-installing-drupal-modules-from-your-site/</link>
		<comments>http://pajamadesign.com/2009/06/10/finding-and-installing-drupal-modules-from-your-site/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 12:40:33 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=60</guid>
		<description><![CDATA[In my last post, I showed how updating modules may look in Drupal 7.  If you didn&#8217;t see it  it is here 
In this post, I&#8217;m going to throw up some &#8220;dream&#8221; wireframes which may or may not make the ver 1 cut, but are perhaps good start in the right direction.
Hopefully, at [...]]]></description>
			<content:encoded><![CDATA[<p>In my last post, I showed how updating modules may look in Drupal 7.  If you didn&#8217;t see it <a href="http://pajamadesign.com/2009/06/10/updating-modules-drupal-7/"> it is here </a></p>
<p>In this post, I&#8217;m going to throw up some &#8220;dream&#8221; wireframes which may or may not make the ver 1 cut, but are perhaps good start in the right direction.</p>
<p>Hopefully, at least parts of them will be practical to implement, or at least spur discussion.</p>
<p>Without further ado:</p>
<p><a href="http://pajamadesign.com/Install/Extension_browser.html"> Check out the clickable wireframes </a></p>
<p>And give feedback here:<br />
<a href="http://drupal.org/node/395478"> Plugin Manager in Core: Part 3 (integration with installation system)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/06/10/finding-and-installing-drupal-modules-from-your-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Updating modules and themes in Drupal 7</title>
		<link>http://pajamadesign.com/2009/06/10/updating-modules-drupal-7/</link>
		<comments>http://pajamadesign.com/2009/06/10/updating-modules-drupal-7/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 05:53:42 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[acquia]]></category>
		<category><![CDATA[acquia drupal planet]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[plugin manager]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=59</guid>
		<description><![CDATA[ The problem: Updates in Drupal require FTP / SSH and a bit of know how
When the average Drupal site owner without ssh, cvs and other geek gadgets wants to update modules on or themes on their Drupal site, they currently have to do the following:

 Go update status and see the mod is out [...]]]></description>
			<content:encoded><![CDATA[<h3> The problem: Updates in Drupal require FTP / SSH and a bit of know how</h3>
<p>When the average Drupal site owner without ssh, cvs and other geek gadgets wants to update modules on or themes on their Drupal site, they currently have to do the following:</p>
<ol>
<li> Go update status and see the mod is out of date</li>
<li> Take the site offline</li>
<li> Make a backup (if they can)</li>
<li> Know where to find the module on d.o., download the tarball</li>
<li> Unzip the tarball</li>
<li> Remove the current directory</li>
<li> Use FTP to upload the new directory</li>
<li> Run update.php</li>
</ol>
<p>We&#8217;re trying to provide a way that users can get the same user friendliness of a package manager like Synaptic. Where updates and new installs are just a few clicks, <strong>no geek gadget belt</strong>.</p>
<p>I&#8217;ve entered the D7 ux fray, specifically focusing my generous amount of <a href="http://acquia.com">Acquia</a> community time on getting a project called the Plugin Manager spruced up and into core.</p>
<p>For more background on the effort, see: <a href="http://drupal.org/node/395472">Plugin Manager in Core (part 1)</a>.</p>
<h3> The solution: make Drupal update like everything else.</h3>
<div class="thumbnail"><a href="/update_status/Canvas_1.html"><img src="http://img.skitch.com/20090610-kdieqmscr6t57camrrn2eagjdb.preview.jpg" alt="Mozilla Firefox" /></a></div>
<p>Here is the issue:<br />
<a href="http://drupal.org/node/395474#comment-1682648">Plugin Manager Part 2 : The update status UI</a></p>
<p>I&#8217;ve been working out some wireframes of how the process might look, and I wanted to share them with the planet to see what people thought of them.  So without further ado:</p>
<h3><a href="/update_status/Canvas_1.html">Check out the clickable wireframes</a></h3>
<h3><a href="/update_status_2/Canvas_1.html">Round 2</a></h3>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/06/10/updating-modules-drupal-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wake up and smell the coffee (through an HMAC filter)</title>
		<link>http://pajamadesign.com/2009/06/09/wake-up-and-smell-the-coffee-through-an-hmac-filter/</link>
		<comments>http://pajamadesign.com/2009/06/09/wake-up-and-smell-the-coffee-through-an-hmac-filter/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 07:47:44 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[acquia]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[splunk]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=58</guid>
		<description><![CDATA[ Hey, stay out of my index! 
So when I first joined Acquia, my fledgling Solr hosting service had IP based security.  You, the customer could tell me what IPs you were going to connect with, and I would allow access to your search index from those IPs.
One of the first major tasks was [...]]]></description>
			<content:encoded><![CDATA[<h3> Hey, stay out of my index! </h3>
<p>So when I first joined Acquia, my fledgling Solr hosting service had IP based security.  You, the customer could tell me what IPs you were going to connect with, and I would allow access to your search index from those IPs.</p>
<p>One of the first major tasks was to implement HMAC based authentication to the service to ensure against man-in-the-middle attacks and provide a way to use from any IP.  Also, it is standard operating procedure for other Acquia services.</p>
<h3> Fail first! </h3>
<p>In the first iteration, we built something on the load balancers (which run nginx) because it provided a central point of access control, the balancers were under-utilized and we didn&#8217;t have to mess with the Solr code.</p>
<p>This worked okay for awhile, and was decently fast but was quite flaky as some stupid developer had the brilliant idea to implement it as python middleware with fcgi (flup). That developer was me.</p>
<h3> Don&#8217;t fail second!</h3>
<p>So to combat the unstable nature of the fcgi protocol, and to make things a little more efficient, I (along with help from Peter Wolanin and Douglas Hubler) rebuilt it in Java using a Servlet Filter.  This was a royal pain the butt, as Java is pretty tricky when it comes to input streams and buffers.</p>
<p>Thankfully the results are worth it:</p>
<p>It&#8217;s hard to tell from this graph because of the peak, but the median stayed almost the same (blue line), and the average decreases pretty significantly (purple) as does the 90% line (yellow). Click the image to see it larger.</p>
<div class="thumbnail"><a href="http://skitch.com/jacobsingh/b1mx4/source-solr-nginx-access-eventtype-solr-search-request-timechart-span-2h-median-request-time-perc90-request-time-avg-request-time-as-avg-request-time-in-the-past-3-days-ip-10-251-75-227-splunk-3.4.8"><img src="http://img.skitch.com/20090609-xeh6qw1t43hdk8kc162b5fjr7m.preview.jpg" alt="source=solr_nginx_access (eventtype=solr_search_request)| timechart span=2h median(request_time), perc90(request_time), avg(request_time) as avg_request_time - in the past 3 days - ip-10-251-75-227 - Splunk 3.4.8" /></a></div>
<p>This graph shows the standard deviation (blue) in addition to the previous numbers and describes more acutely what the previous graph suggests, that is, the previous implementation was not any slower really, but less consistent, causing some of the requests to take much longer than others.</p>
<div class="thumbnail"><a href="http://skitch.com/jacobsingh/b1m17/source-solr-nginx-access-eventtype-solr-search-request-timechart-span-2h-stdev-request-time-median-request-time-perc90-request-time-avg-request-time-as-avg-request-time-in-the-past-3-days-ip-10-251-75-227-splunk-3.4.8"><img src="http://img.skitch.com/20090609-jd61y5gjpew3m5159ypkcyeth5.preview.jpg" alt="source=solr_nginx_access (eventtype=solr_search_request)| timechart span=2h stdev(request_time), median(request_time), perc90(request_time), avg(request_time) as avg_request_time - in the past 3 days - ip-10-251-75-227 - Splunk 3.4.8" /></a></div>
<p>So there you have, Acquia Search is both secure and fast and now 200% more reliably fast <img src='http://pajamadesign.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/06/09/wake-up-and-smell-the-coffee-through-an-hmac-filter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This Python needs Adult Supervision</title>
		<link>http://pajamadesign.com/2009/04/06/this-python-needs-adult-supervision/</link>
		<comments>http://pajamadesign.com/2009/04/06/this-python-needs-adult-supervision/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 05:24:03 +0000</pubDate>
		<dc:creator>Jacob Singh</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[fcgi]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[supervisord]]></category>
		<category><![CDATA[wsgi]]></category>

		<guid isPermaLink="false">http://pajamadesign.com/?p=57</guid>
		<description><![CDATA[A while back, I wrote a daemon.  No, I&#8217;m not a satanist mom, it&#8217;s a program which will basically stick around and manage a bunch of other little minions as they server content via unix sockets to a webserver (nginx).
The point here is to take in traffic from nginx via python and do something [...]]]></description>
			<content:encoded><![CDATA[<p>A while back, I wrote a daemon.  No, I&#8217;m not a satanist mom, it&#8217;s a program which will basically stick around and manage a bunch of other little minions as they server content via unix sockets to a webserver (nginx).</p>
<p>The point here is to take in traffic from nginx via python and do something with it.  For this I found an excellent tutorial which got me started:</p>
<p><a href="http://www.p16blog.com/p16/2008/11/quick-demo-of-python-wsgi-nginx.html">http://www.p16blog.com/p16/2008/11/quick-demo-of-python-wsgi-nginx.html</a></p>
<p>This worked great, but then you needed to write something to manage all the little unix sockets, start them when they died, etc.</p>
<p>So I had to custom write something (at least I thought) as nothing in existence seemed suited for the task.  It has worked &#8220;okay&#8221; but is having some mysterious problems under heavy real world load, and I needed to find something more robust for the task.</p>
<p>I recently stumbled across:<br />
<a href="http://just-another.net/2009/01/18/byteflowdjangosupervisordnginx-win/">http://just-another.net/2009/01/18/byteflowdjangosupervisordnginx-win/</a></p>
<p>This thing looks perfect, <del datetime="2009-04-08T03:43:36+00:00">but I can&#8217;t quite get it work</del>&#8230; Basically, <a href="http://supervisord.org">supervisord</a> is a python application which has a very usefull and usable configuration file to specify programs you would like to run as services.  It replaces 90% of the init.d scripts in existence I imagine.<br />
<del datetime="2009-04-08T03:43:36+00:00"><br />
In theory, </del>you create a block like this:</p>
<p><code></p>
<pre>
; Production setup
[fcgi-program:gate]
socket=tcp://127.0.0.1:1212  ; We reference this later in nginx
command = /usr/local/solrflare/bin/gate.py  ; Calls the above code
</pre>
<p></code></p>
<p>This means, that when I run supervisord, it starts a daemon which will fire up my python script (which currently looks like this):</p>
<p><code></p>
<pre>
#!/usr/bin/python
from flup.server.fcgi import WSGIServer
import time, os, sys

def app(environ, start_response):
        status = "200 OK"
        response_headers = [('Content-type', 'text/plain')]
        start_response(status, response_headers)
        return ["If a thread dies in the middle of a request, and noone is a around to hear it, does it give a status code?\n"]
WSGIServer(app).run()
</pre>
<p></code></p>
<p>And Supervisord provides a nice little web interface to monitor and manage the daemon, also provides a nice interactive shell program and XML-RPC! (among many other cool features).</p>
<div class="thumbnail"><a href="http://skitch.com/jacobsingh/bkadd/supervisor-status"><img src="http://img.skitch.com/20090406-8an424bgchag27yd98p6yc5p6n.preview.jpg" alt="Supervisor Status" /></a></div>
<p>When this works, it will be awesome because I can throw out a lot of code (which I love to do).  However, currently it just kinda sits there when I curl the port&#8230; doesn&#8217;t do anything, doesn&#8217;t log anything.</p>
<p><strong> Update: I got it working! And it is awesome.  I just needed to deal w/ an nginx config issue I created and do some permissions wrangling.  It is running great so far!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://pajamadesign.com/2009/04/06/this-python-needs-adult-supervision/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
