<?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>Seocracy.com &#187; Theory</title>
	<atom:link href="http://seocracy.com/category/theory/feed/" rel="self" type="application/rss+xml" />
	<link>http://seocracy.com</link>
	<description>A blog about technical SEO, Ruby, Web Apps, and more</description>
	<lastBuildDate>Wed, 28 Apr 2010 21:47:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Amazon S3 bucket limit</title>
		<link>http://seocracy.com/2009/08/amazon-s3-bucket-limit/</link>
		<comments>http://seocracy.com/2009/08/amazon-s3-bucket-limit/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 09:33:53 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Theory]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ruby/rails]]></category>

		<guid isPermaLink="false">http://seocracy.com/?p=321</guid>
		<description><![CDATA[
So, today I learned that Amazon S3 limits the amount of buckets you are allowed to have at any one time. This was a HUGE pain in the ass for me, as I just rewrote my S3 caching libraries to separate my caching into daily buckets.

The idea I had was that I would keep 30 [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-320 alignnone" title="I CALL SHENANIGANS ON AMAZON S3!!!" src="http://seocracy.com/wp-content/uploads/2009/08/theybestealinmybucket.jpg" alt="theybestealinmybucket" width="640" height="340" /></p>
<p>So, today I learned that Amazon S3 limits the amount of buckets you are allowed to have at any one time. This was a HUGE pain in the ass for me, as I just rewrote my S3 caching libraries to separate my caching into daily buckets.</p>
<p><img class="alignnone size-full wp-image-328" title="headesk" src="http://seocracy.com/wp-content/uploads/2009/08/headesk1.png" alt="headesk" width="614" height="314" /></p>
<p>The idea I had was that I would keep 30 days worth of buckets before automatically shuffling all those buckets into long term archival at the end of each month.</p>
<p>You see, Amazon S3 doesn&#8217;t allow for folders within buckets (not technically, I&#8217;ll get to that later), and I think it&#8217;s bloody ridiculous for me to store the ~15 millions xml cache files I need daily access to in just one massive bucket. So, I thought my plan to create daily buckets was pretty damn good. Apparently Amazon disagrees, as hey have set a limit on the number of buckets I can have associated with my account (FYI, I have ~90 buckets right now and that&#8217;s where the limit is).</p>
<p>So, I&#8217;ve been looking into my options, and I have decided that I&#8217;m going to have to go back to my original set up of storing all 15 million (and growing) xml files in one bucket. As some of you may know, S3 GUIs like S3Fox are able to show sub-folders within buckets, so I figure I will go this route. My first step was to take a crack at the Ruby S3 library from Amazon (<strong>not</strong> the AWS gem, which is crap for multi threaded environments) to see how I can create folders within buckets. Turns out, you can&#8217;t. At least, not out of the box. You see, AmazonS3 doesn&#8217;t actually SUPPORT sub-folders within buckets.</p>
<p>Stupid, right? I know.</p>
<p>So, how does S3Fox do it? It turns out they create virtualized folders by creating a special object that acts as a folder, then you access your stored objects by appending that folder object name to the actual file key. For a directory named &#8220;/foo&#8221;, you would create an object with the key &#8220;foo_$folder$&#8221;. Then, to get a directory listing of all files stored under the foo path, you just query S3 for objects with keys that start with &#8220;/foo&#8221;, and you ignore any objects that end with &#8220;_$folder$&#8221;.</p>
<p>I&#8217;m about to waste my day setting this up, and I&#8217;m none to happy about it. It seems like a hackish and shitty work around for an obvious service flaw. I&#8217;m sure there is some technically-reasonable answer for why Amazon has set an arbitrary limit for buckets and also why they don&#8217;t allow you to create folders, but I don&#8217;t know what it is. Anyone have any answers?</p>
<p>Hat-Tip the <a href="http://deadprogrammersociety.blogspot.com/2008/01/making-s3-folders-in-ruby.html" target="_blank">Dead Programmer Society</a> for the code to create virtualized folders in S3.</p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2009/08/amazon-s3-bucket-limit/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Survey Says: Ipsos Reid presentation to BC Hydro on Social Network Marketing</title>
		<link>http://seocracy.com/2009/06/ipsos-reid-presentation-social-network-marketing/</link>
		<comments>http://seocracy.com/2009/06/ipsos-reid-presentation-social-network-marketing/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 16:43:48 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Theory]]></category>
		<category><![CDATA[survey-says...]]></category>

		<guid isPermaLink="false">http://seocracy.com/?p=313</guid>
		<description><![CDATA[UPDATE: I&#8217;ve had to remove the presentation due to a DMCA complaint. *sigh*
I wanted to share some interesting tid-bits with you all from a recent Ipsos Reid presentation (June 18th) on Social Network Marketing.
This presentation was made to BC Hydro, the major Power authority in British Columbia (that&#8217;s in Canada, dummy).
The average Canadian:

5.4 hrs/week spent [...]]]></description>
			<content:encoded><![CDATA[<p>UPDATE: I&#8217;ve had to remove the presentation due to a DMCA complaint. *sigh*</p>
<p>I wanted to share some interesting tid-bits with you all from a recent Ipsos Reid presentation (June 18th) on Social Network Marketing.</p>
<p>This presentation was made to BC Hydro, the major Power authority in British Columbia (that&#8217;s in Canada, dummy).</p>
<p><strong><span style="text-decoration: underline;">The average Canadian:</span></strong></p>
<ul>
<li>5.4 hrs/week spent on Social network sites, about 1/3 of total Online time.</li>
<li>LinkedIn captures 70% of the share of Social Networking in the workplace.</li>
<li>The stuff teens do online is very different from adults, and VERY limited: socializing, music, and gaming.
<ul>
<li>88% of Adults use the internet to visit a new or informational website, versus only 44% of teens.</li>
<li>68% of Adults have clicked a website advertisement versus 28% of teens.</li>
<li> 70% teens are weekly social network users, versus 36% of adults</li>
</ul>
</li>
</ul>
<p><strong><span style="text-decoration: underline;">Highlights:</span></strong></p>
<ul>
<li>Advertising budgets are not aligned to where people are spending their time &#8211; online expenditure lags significantly behind traditional mediums</li>
<li>58% of Canadians receive 51+ unsolicited commercial emails a week (17% don&#8217;t even know)
<ul>
<li>64% of people don&#8217;t open ANY unsolicited emails</li>
<li>of the people that do open unsolicited emails, 53% do so out of curiosity, 28% because they thought it was legitimate</li>
</ul>
</li>
<li>Permission-based (opt-in) emails are still one of the best ways to market to your websites audience. Be diligent about collecting them</li>
<li>77% of Canadians are registered to receive some kind of opt-in email (2008 average number of sites registered with: 15.3)
<ul>
<li>Top 3 reasons for opting-in: Personal Interest (42% ), Entertainment (38%), New and Information (32%)</li>
<li>It&#8217;s worth noting that E-Commerce and Retail is the 7th most common reason (27%)</li>
</ul>
</li>
<li>Activities resulting from opting-in to an email list:
<ul>
<li>60% entered an advertiser&#8217;s contest</li>
<li>52% visited the advertiser&#8217;s website</li>
<li>17% purchase or received products at a later date</li>
</ul>
</li>
<li>68% percent of Canadians are willing to provide their email address depending on reasoning</li>
</ul>
<p><span style="text-decoration: line-through;">I&#8217;ve uploaded the full presentation for you all, which can be viewed here:</span></p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2009/06/ipsos-reid-presentation-social-network-marketing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Will Google stop SERP scrapers by going Ajax?</title>
		<link>http://seocracy.com/2009/01/will-google-stop-serp-scrapers-by-going-ajax/</link>
		<comments>http://seocracy.com/2009/01/will-google-stop-serp-scrapers-by-going-ajax/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 17:29:26 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://seocracy.com/?p=243</guid>
		<description><![CDATA[Some of you might have noticed the buzz going around the net today about Google&#8217;s SERPs going ajax. There is a great post about it here:
Google Web Search Ajax
I&#8217;ve heard more than a few people asking if this will stop automation software from crawling Googles SERPs to retrieve rankings or Adwords data. In short, the [...]]]></description>
			<content:encoded><![CDATA[<p>Some of you might have noticed the buzz going around the net today about Google&#8217;s SERPs going ajax. There is a great post about it here:</p>
<p><a href="http://smackdown.blogsblogsblogs.com/2009/01/30/google-web-search-goes-completely-ajax/" target="_blank">Google Web Search Ajax</a></p>
<p>I&#8217;ve heard more than a few people asking if this will stop automation software from crawling Googles SERPs to retrieve rankings or Adwords data. In short, the answer is no.</p>
<p>I doubt this development would be solely intended to stop people from using automated rank checkers or content scrapers, but Google has to know that whatever they change, people will simply adapt and evolve their software to keep pace. My personal opinion is that a move to ajax SERPs would provide google with a tighter control of how they serve data, as well as providing them with a whole slew of new metrics they could leverage. On the flip-side, this move could hamper the accessibility of Googles service from outdated/underpowered computers and browsers.</p>
<p>Regardless, the possibility of Google going ajax does indeed raise some questions in so far as how people should proceed with developing automation software. Not only is ajax delivered content more difficult to automate, but ajax also could be used to track mouse movement. This would be one of the metrics that ajax would make available to Google, and also it could be a possible means by which Google could begin to distinguish bots from humans. (although, on the Google-scale, that would be an incredibly large amount of data to process.)  While AJAX content is not as trivial to scrape as traditional content, it is still quite possible. I think that as Google evolves to develop ways to clean up their SERPs, programmers and marketers will evolve as well. I believe that software will inevitably evolve to mimic human browsing behavior. This includes filling out form data, mouse movement, sending Google Toolbar data, using back buttons, clicking links, storing cookes, etc. And don&#8217;t forget, all that will have to be done at human speeds, not computer speeds. The requirement to mimic human behavior also means that it will become more and more difficult to multi-thread and do simultaneous requests from one IP range. Rather than managing massive proxy farms, in the future, it will be more cost-effective and productive to off-load automation requests to client computers which, when required, send data back to a master server for processing (no, I&#8217;m not talking about malware here&#8230;.more like browser plugins).</p>
<p>There are already a slew of different libraries which mimic browsing behavior and also handle ajax. Off the cuff, <a href="http://www.rubyrailways.com/ajax-scraping-with-scrubyt-linkedin-google-analytics-yahoo-suggestions/" target="_blank">ScrubyT </a>handles ajax quite well. <a href="http://wtr.rubyforge.org/" target="_blank">Watir</a> can actually open an instance of IE, FF, Safari, or even Chrome, and thus fully mimic a browser. Marketers and programmers can use these libraries, and other libraries to both mimic human browsing behavior and make ajax calls to automate SERPs. In the future, you can expect these kinds of libraries to evolve and become more advanced and customized towards mimicking human behavior. Even still, if ajax calls are not encoded, you can simply extract the appropriate call out of the page and make it yourself. An example of this can be seen <a href="http://stackoverflow.com/questions/260540/how-do-you-screen-scrape-ajax-pages" target="_blank">here</a>.</p>
<p>At the end of the day, a move on Google&#8217;s part to ajax SERPs may throw a wrench into some peoples software, but it will certainly not herald an end to automation tools like Aaron Wall&#8217;s excellent <a href="http://tools.seobook.com/seo-toolbar/" target="_blank">SEOToolbar</a>, or others.</p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2009/01/will-google-stop-serp-scrapers-by-going-ajax/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Never Up-Sell a Customer</title>
		<link>http://seocracy.com/2009/01/never-up-sell-a-customer/</link>
		<comments>http://seocracy.com/2009/01/never-up-sell-a-customer/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 21:54:34 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Random!]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://seocracy.com/?p=236</guid>
		<description><![CDATA[We went out to buy a new couch today, which its FAR down on my list of favorite things to do on a sunday afternoon. I always find furniture shopping to be a harrowing experience, especially when dealing with commissioned sales people hovering like vultures.
Currently we have two big ultra-modern leather couches in our media [...]]]></description>
			<content:encoded><![CDATA[<p>We went out to buy a new couch today, which its FAR down on my list of favorite things to do on a sunday afternoon. I always find furniture shopping to be a harrowing experience, especially when dealing with commissioned sales people hovering like vultures.</p>
<p>Currently we have two big ultra-modern leather couches in our media room. We have been thinking that they&#8217;re a bit too stiff, a bit too cold. Basically, you have to be a contortionist to perform any kind of cuddling while watching a movie&#8230;so&#8230;it was time for a new couch.</p>
<p>In the first store we stopped at, we immediately saw a modular sofa set that was perfect&#8230;it had modern leather-clad frame but big comfy fabric cushions, and throw pillows instead of stiff leather cushions for the back&#8230;it was, in short, the ideal couch for us; especially since we were able to buy separate pieces and put them together in the arrangement we wanted (I love modular furniture). So, long story short, after we checked the dimensions, we were a firm sale (probably the easiest sale our salesman got all day).</p>
<p>Now, when we were checking out and paying for the sofa, the salesman did something that got me thinking: He didn&#8217;t up-sell us. He didn&#8217;t even TRY to up-sell us into add-ons, warranties, teflon stain-proofing, etc etc. No, he didn&#8217;t up-sell us, because he just put it all on the bill anyways without even asking us. Basically, he breezed over the itemized list on the bill and drew our attention directly to the total and said, &#8220;so that will be $____ dollars.&#8221; Now, I had been calculating the whole thing in my head, so I knew what to expect in terms of a final total. When I heard his total, I said, &#8220;Let me see that bill&#8230;.O.K, you&#8217;ve put Teflon on here for 25.99 per module, coming to 181.00.&#8221; and he says, &#8220;Oh you want that, you definitely want that. I put it on there because you&#8217;d be crazy not to want that.&#8221; And Randy, standing next to me, said &#8220;Oh yeah, let&#8217;s get that! You&#8217;re always spilling your wine!&#8221; (sadly, it&#8217;s true). So I went on down the bill to the next item, &#8220;Now, whats this 125.00 steel base item?&#8221; and the salesman says &#8220;Well, of course, you want the steel base right? It looks a lot better than the wood. Everyone is going steel nowadays.&#8221; And Randy was there saying &#8220;Oh yeah! I love that style.&#8221; So, we got the steel base, too&#8230;.</p>
<p>This debacle went on, item by item, until I was completely defeated and had no choice but to accept every add-on item on that bill except for one thing: the rug underlay (no joke, that was on the bill&#8230;) After we paid up and left &#8211; my wallet hurting alot more than I expected it too &#8211; I said, &#8220;We certainly bought alot more than we bargained for&#8221;, and Randy replied, &#8220;Well we knew it was going to be expensive, and besides, we didn&#8217;t end up paying as much as he initially tried to bill us.&#8221;</p>
<p>And there it was, the brilliance of not up-selling your customers. We never even saw what the price would have been without all those add-ons, we only saw the total price with all the add-ons included. The psychology of the situation is that once a customer sees an expensive base price, their wallet tightens up and they don&#8217;t want to spend anything more, even if it is just 25.99 per module for teflon coating, or 125.00 for a steel base.</p>
<p>Think about what would be more difficult: showing your customer a total price and then convincing them to spend more on upgrades? or showing a customer an upgraded price and letting them remove what they don&#8217;t really want? The answer is obvious. Chances are, the latter method will tend to get more customers to spend money on upgrades than the former method.</p>
<p>This lesson applies to the web as well, especially if you are marketing any kind of web-application. If you are selling something that has upgrades, why not include the upgrades automatically at checkout? It&#8217;s a win-win situation: The customer always feels better when they see their total price decrease as they customize their purchase to their needs, and chances are you&#8217;ll sell more upgrades than usual.</p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2009/01/never-up-sell-a-customer/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>People are talking about your niche, but where?!?!</title>
		<link>http://seocracy.com/2008/10/people-are-talking-about-your-niche-but-where/</link>
		<comments>http://seocracy.com/2008/10/people-are-talking-about-your-niche-but-where/#comments</comments>
		<pubDate>Sat, 04 Oct 2008 00:00:00 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Link-Love]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://127.0.0.1/seocracy/?p=84</guid>
		<description><![CDATA[A short tip on finding out where your audience is talking, and what they're saying.]]></description>
			<content:encoded><![CDATA[<p>My curiosity has always been a great asset. I&#8217;ve always been interested in the social psychology behind word-of-mouth marketing, group trends, memes, etc. I&#8217;ve learned a ton from tracking emerging memes and seeing how/where they spread. </span></p>
<p>The techniques and discipline applied to researching memes can also be applied to brands and niche specific search queries. Its useful to research this kind of information because it lets you know where your audience is communicating. Knowing where your brand/niche evangelists are communicating is an incredible asset, because they really have their fingers on the pulse of that brand/niche, and people LISTEN to them. By knowing where the evangelists communicate, you are in a position to deal with bad PR before it spins out of control; you&#8217;re also in position to exploit and leverage opportunities you might have missed if you were just relying on Google News Alerts, and BlogSearch.</span></p>
<p>This isn&#8217;t just about researching the buzz on social sites like Twitter. I mean, let&#8217;s face it, Twitter has a fairly narrow demographic. For example, let&#8217;s say you want to know how to best communicate to real estate investors. You better know where the realtors are hanging out on the web. You&#8217;ve got to get your hands dirty and identify the popular opinion blogs, the obscure dicussion forums, and so on.</span></p>
<p>I use alot of the obvious tools to do my research, like google search, blog search, technorati, etc, but, my favorite new tool is BoardReader. It is, hands down, one of the best research tools I&#8217;ve used in recent months.</span></p>
<p>Let&#8217;s say I wanted to find out where people are talking about condos in Toronto. I&#8217;d goto BoardReader and peform <a href="http://boardreader.com/tp/toronto+condos.html?tsearch=1" target="_blank">this search</a></span></p>
<p>With that one search, I&#8217;ve just been given a whole group of new websites to research and monitor. Now I know that people are talking about Toronto Condos on forums such as SkyScraper Forum, and InvestorsHub  and Realestatetalks.com and Cyburbiaforums etc etc etc.</span></p>
<p>And the best part of this is that BoardReader gives us a list of recent/relevant topics and posts on these forums. This makes it incredibly easy for us to monitor the conversations, find the opinion makers, and connect with our audience through meaningful, relevant and timely communications. </span></p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2008/10/people-are-talking-about-your-niche-but-where/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google2001 search for finding domains</title>
		<link>http://seocracy.com/2008/10/google2001-search-for-finding-domains/</link>
		<comments>http://seocracy.com/2008/10/google2001-search-for-finding-domains/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 00:00:00 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Google Hacking]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://127.0.0.1/seocracy/?p=83</guid>
		<description><![CDATA[A decent, but not perfect, way to buy niche-relevant domains]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;ve been messing around a bit with Googles 2001 search (http://www.google.com/search2001.html) and I&#8217;ve found some great old domains with it.</span></p>
<p>I got the idea when I found some domains that ranked for various viagra search terms back in 2001 that are now unregistered. They are old, plus have backlinks, which is a double bonus. We all know how much Google loves old domains!<br />
</span></p>
<p> </span></p>
<p>Anyways, I created a small script that goes through the 2001 SERPs and pulls each domain into a list that is run through a whois search to see if it&#8217;s available. In under and hour I found almost 15 great domains. The thing that I like about this, compared to domain auctions is that you know you&#8217;re buying a domain that is relevant to your niche! And chances are, whatever backlinks those domains still have will also be relevant to your niche.</span></p>
<p> </span></p>
<p>Give it a whirl! Some of you might be pleasantly surprised with what you find.</span></p>
<p> </span></p>
<p> </span></p>
<p> </span></p>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2008/10/google2001-search-for-finding-domains/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>You&#8217;re not still using Google Trends to figure out whats hot, are you?!?</title>
		<link>http://seocracy.com/2008/09/youre-not-still-using-google-trends-to-figure-out-whats-hot-are-you/</link>
		<comments>http://seocracy.com/2008/09/youre-not-still-using-google-trends-to-figure-out-whats-hot-are-you/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 00:00:00 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://127.0.0.1/seocracy/?p=82</guid>
		<description><![CDATA[If you rely on Google Trends, you'll often miss the boat]]></description>
			<content:encoded><![CDATA[<p>Google Trends is a great tool for figuring out what&#8217;s hot on the web&#8230;right? Alot of us have scrapers that grab Google Trends terms and then use them to create content pages. But the problem is, once something hits Google Trends, it can often be too late for you to really get any traction on the search term. What if you want to find out what&#8217;s hot ahead of Google Trends? Allow me to introduce <a href="http://www.twitscoop.com/" target="_blank">TwitScoop</a>.</span></p>
<p> </span></p>
<p>Today, there is a great example of how valuable TwitScoop is. It seems that Kanye West got arrested for beating on some paparazzi&#8230;have you heard about that yet? If you are relying on Google Trends, then no, you haven&#8217;t, because it hasn&#8217;t hit Google Trends yet. But its already all over the front page of TwitScoop. You can bet that <strong>Kanye West Arrested</strong> will be all over the front page of Google Trends in about 12 hours. This is because Twitter has its pulse on exactly what people are talking about at this exact moment, whereas Google Trends represents what people were searching for 12-24 hours ago.</span></p>
<p> </span></p>
<p>So, next time you&#8217;re researching what the moment&#8217;s hot topics are, check out TwitScoop first, and Google Trends second. </span></p>
<p>OH, and PS: TwitScoop has an API&#8230;.so&#8230;yeah&#8230;..it&#8217;s a slam dunk.</p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2008/09/youre-not-still-using-google-trends-to-figure-out-whats-hot-are-you/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Effective and Efficient ways to Mass Install Wordpress</title>
		<link>http://seocracy.com/2008/08/effective-and-efficient-ways-to-mass-install-wordpress/</link>
		<comments>http://seocracy.com/2008/08/effective-and-efficient-ways-to-mass-install-wordpress/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 00:00:00 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Link-Love]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Theory]]></category>
		<category><![CDATA[Tools & Applications]]></category>

		<guid isPermaLink="false">http://127.0.0.1/seocracy/?p=80</guid>
		<description><![CDATA[blah blah...slug line....blah blah.....catch phrase...]]></description>
			<content:encoded><![CDATA[<p>Blah&#8230;commencement of pleasantries&#8230;..blah blah&#8230;.witty charming banter&#8230;.blaah&#8230;.introduction to mass install wordpress..blaaah&#8230;&#8230;more witty commentary&#8230;.blah blah&#8230;..install this&#8230;ftp that&#8230;blah&#8230;incredibly complicated&#8230;.blah..self aggrandizement&#8230;.blah&#8230;&#8230;<br />
</span></p>
<p id="s2-23">Situation:<br />
Shared Host<br />
CPanel<br />
No SSH Access</span></p>
<p> Solution 1: FTP Transfer Folder  to server, Mechanize/CURL Install<br />
Process:<br />
</span></p>
<p id="s2-211">1) Collect variables: database, username, cpanel login, cpanel password, keywords<br />
</span></p>
<p id="s2-213">2) If necessary, create databases and users on CPanel host (using CURL, or Mechanize)</span></p>
<blockquote><p>
<em>Here is a function I use to create CPanel DBs:<br />
</em><span style="background-color: #ffff00">def self.create_db(base_url, cpanel_loc, cpanel_user, cpanel_pass, db, dbuser, dbpass)</span><br />
<span style="background-color: #ffff00"> agent = WWW::Mechanize.new </span><br />
<span style="background-color: #ffff00"> agent.user_agent_alias = $USER_AGENTS[rand($USER_AGENTS.length)]</span><br />
<span style="background-color: #ffff00"> agent.basic_auth(cpanel_user,cpanel_pass)</span><br />
<span style="background-color: #ffff00"> url = &#8220;http://#{base_url}#{cpanel_loc}/frontend/x/sql/&#8221;</span><br />
<span style="background-color: #ffff00"> agent.get(url)</span><br />
<span style="background-color: #ffff00"> agent.get(&#8221;#{url}adddb.html?db=#{db}&#8221;)</span><br />
<span style="background-color: #ffff00"> agent.get(&#8221;#{url}adduser.html?user=#{dbuser}&amp;pass=#{dbpass}&#8221;)</span><br />
<span style="background-color: #ffff00"> agent.get(&#8221;#{url}addusertodb.html?user=#{cpanel_user}_#{dbuser}&amp;db=#{cpanel_user}_#{db}&amp;ALL=ALL&#8221;)</span><br />
<span style="background-color: #ffff00"> end</span></p></blockquote>
<p id="cal50">3) For each keyword in the keyword list, create a different blog<br />
</span></p>
<p id="hquz0"> 3a) Write local wordpress-config file with user entered data</span></p>
<p id="hquz1"> 3b) Pull a random theme from local theme library</span></p>
<p id="kkiw"> 3c) Pull required plugins from local plugin library</span></p>
<p id="l8m2"> 3d) Create local folder for blog, copy base wordpress install files, plus files from 3a,3b,3c</span></p>
<p id="l8m20">4) Begin FTP Transfer of files from master server to destination on install server (Thread this process to speed up)</span></p>
<p id="l8m21">5) Mechanize/CURL to appropriate Install URL, then Mechanize/CURL through management panel to activate theme selected in 3b and plugins selected in 3c</span></p>
<p id="vn4b">*Repeat step 3 for each keyword supplied to the function<br />
</span></p>
<p id="s2-215">
</span></p>
<p>NOTES: This method, when optimized and threaded, can install about one blog / 90 seconds. The major speed limiting factor is the FTP transferring. A base wordpress install already has a TON of files, and depending on how many plugins and how many themes you are including, the number of files really slows down the FTP transfer. I recommend creating a personal WP base install with ALL of the junk and cruft removed (ie: the management panel niceities like password strength checking etc..). Removing all non-essential files from a wordpress base install can really speed up FTP transfers. This is a good practice anyways, since we want to be as resource efficient as possible, since we&#8217;re going to cram this shared server with nothing but blogs.</span></p>
<p>Solution 2: FTP package file to server, extract through file manager, Mechanize/CURL Install<br />
Process:<br />
</span></p>
<p id="c7-j0">1) Collect variables: database, username, cpanel login, cpanel password, keywords<br />
</span></p>
<p id="c7-j2">2) If necessary, create databases and users on CPanel host (using CURL, or Mechanize)<br />
</span></p>
<p id="c7-j4">3) For each keyword in the keyword list, create a different blog</span></p>
<p id="dbe5"> 3a) Write local wordpress-config file with user entered data</span></p>
<p id="c_bl"> 3b) Pull a random theme from local theme library</span></p>
<p id="c_bl0"> 3c) Pull required plugins from local plugin library</span></p>
<p id="c_bl1"> 3d) Create local folder for blog, copy base wordpress install files, plus files from 3a,3b,3c</span></p>
<p id="qp2u"> 3e) Package folder<br />
</span></p>
<p id="c_bl2">4) FTP Transfer Package from master server to destination on install server</span></p>
<p id="qp2u1">5) Mechanize or CURL CPanel Filemanager to unzip file on server</span></p>
<p id="fm6_">6) Mechanize/CURL to appropriate Install URL, then Mechanize/CURL through management panel to activate theme selected in 3b and plugins selected in 3c</span></p>
<p>*Repeat step 3 for each keyword supplied to the function</span></p>
<p>NOTES: This method, when optimized and threaded, can install one in about 25 seconds. Once again, the major impediment to speed here is the FTP transfer. This is still a lot faster than Solution 1, and is perhaps the best solution for a situation where you can&#8217;t use SSH. I should note that you could also just create one central tarball and then mechanize/CURL the CPanel File Manager to copy and unzip it for each new install, but&#8230;I really hate to use that amount of screen automation. It just tends to break down so often. </span></p>
<p>Situation:<br />
Shared / VPN Server<br />
CPanel<br />
SSH Access</span></p>
<p> Solution 1: Master Server Central Wordpress Install / Mechanize CURL Install<br />
Process:<br />
1) Upload base Wordpress install files, Theme Library, Plugin Library from master server to central location on install server<br />
2) Create a deployment file that does the following:<br />
2a) Copy base Wordpress install to destination folder using SSH<br />
2b) Set up symbolic links between destination install themes &amp; plugins, with the central libraries uploaded in step 1.<br />
2c) If necessary, create databases and users<br />
2d) Create Wordpress Config file based on information supplied by master server<br />
3) Mechanize/CURL to appropriate Install URL, then Mechanize/CURL through management panel to activate desired theme &amp; plugins.<br />
* For each blog you wish to install, just upload a new deployment file</span></p>
<p> NOTES: Once you have installed the central libraries, this method is extremely fast.</span></p>
<p> CONCLUSIONS: At the end of the day, it is definitely faster and more space efficient if you have SSH access through which you can automate the install process. Unfortunately, many shared hosts don&#8217;t offer SSH access (some offer it only if you provide some form of government identification). Many people go for shared hosting situations because they are very cheap, low-risk and you can afford to buy many different hosting packages with different IP addresses. For people who are running more sophisticated networks and have greater resources, VPS situations (without CPanel) are preferable, since they are more stable with more available resources, and of course, SSH, which really makes automation a breeze.</span></p>
<p> Automating the deployment and install of Wordpress blogs can be a really frustrating process to wade through. That said, ..blah&#8230;.blah&#8230;and&#8230;gratifying&#8230;.blah&#8230;1000 blogs&#8230;.blah blah&#8230;button click&#8230;.bla<br />
h&#8230;elite spammer&#8230;blah blah</span></p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2008/08/effective-and-efficient-ways-to-mass-install-wordpress/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>I Could Be Anything</title>
		<link>http://seocracy.com/2008/07/i-could-be-anything/</link>
		<comments>http://seocracy.com/2008/07/i-could-be-anything/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 00:00:00 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Announcements & News]]></category>
		<category><![CDATA[Theory]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://127.0.0.1/seocracy/?p=77</guid>
		<description><![CDATA[A little distraction, and a chance for research....]]></description>
			<content:encoded><![CDATA[<p>So today I had this idea for a little mini site that parses twitter updates, called <a href="http://icouldbeanything.com" target="_blank">I Could Be Anything</a>.</span></p>
<p> </span></p>
<p>I Could Be Anything monitors the Twitter public timeline and looks for messages that can be appended to the words &#8220;I am&#8221;.</span></p>
<p> </span></p>
<p>Back when I was doing my degree, I used to create alot of work that involved typography and poetry, so this was a fun little site to build. I played around alot with how to filter out certain stop words (he, she, etc), and punctuation marks, also I discovered that typically if a sentence fragment has more than four words between &#8220;the&#8221; and a punctuation mark, it won&#8217;t make sense when appeneded to &#8220;I am&#8221;. </span></p>
<p>Anyways, this might all seem pretty mundane, but it makes for great research. Twitter provides unlimited data for me to work with, and whenever I have time, I&#8217;ll continue tweaking and trying to perfect the filters. </span></p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2008/07/i-could-be-anything/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Fun with String Permutations</title>
		<link>http://seocracy.com/2008/06/fun-with-string-permutations/</link>
		<comments>http://seocracy.com/2008/06/fun-with-string-permutations/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 00:00:00 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Theory]]></category>
		<category><![CDATA[Tips & Tricks]]></category>

		<guid isPermaLink="false">http://127.0.0.1/seocracy/?p=76</guid>
		<description><![CDATA[Finding all possible permutations of a group of arrays]]></description>
			<content:encoded><![CDATA[<p id="r55u">So, I&#8217;ve been kicking around some new concepts for <a href="http://datapresser.com" target="_blank">Datapresser&#8217;s Content Generation</a>,</span> based on something called String Permutations.</span></p>
<p id="r55u0">
</span></p>
<p id="r55u2"> For example, lets say I had four word groups:</span></p>
<p id="r55u5">- pronouns (my, your, his, her, our)</span></p>
<p id="r55u6">- subjects (goat, sailboat, cabin)</span></p>
<p id="z75f">- conjunctions (is, is usually, is always)</span></p>
<p id="o:1m">- adjectives (stinky, leaking, clean)</span></p>
<p id="veio">
</span></p>
<p id="veio1">By analyzing all the possible permutations of these 4 word groups, we can see exactly how much content we can spin from it, and what all the possible permutations are.</span></p>
<p id="puac">
</span></p>
<p id="puac1">In this case, there are 135 possible permutations:</span></p>
<blockquote><p><span style="font-size: xx-small;">my goat is stinky</span></span><br />
<span style="font-size: xx-small;">my goat is leaking</span></span><br />
<span style="font-size: xx-small;">my goat is clean</span></span><br />
<span style="font-size: xx-small;">my goat is usually stinky</span></span><br />
<span style="font-size: xx-small;">my goat is usually leaking</span></span><br />
<span style="font-size: xx-small;">my goat is usually clean</span></span><br />
<span style="font-size: xx-small;">my sailboat is usually leaking</span></span><br />
<span style="font-size: xx-small;">my sailboat is usually clean</span></span><br />
<span style="font-size: xx-small;">our cabin is always leaking</span></span><br />
<span style="font-size: xx-small;">our cabin is always clean</span></span><br />
<span style="font-size: xx-small;">etc&#8230;etc&#8230;.etc&#8230;..</span></span></p></blockquote>
<p>The possible applications of string permutation become apparent when you consider a real-world example, like creating headlines:</span></p>
<blockquote><p><span style="font-size: xx-small;">So You Want To Meet a Girl<br />
</span><span style="font-size: xx-small;">So You Want To Get A Date<br />
</span><span style="font-size: xx-small;">So You Want To Ask Out A Woman<br />
</span><span style="font-size: xx-small;">So You Want To Ask A Woman Out<br />
</span><span style="font-size: xx-small;">So You Want To Get Started Dating<br />
</span><span style="font-size: xx-small;">Learn How To Meet a Girl<br />
</span><span style="font-size: xx-small;">Learn How To Get A Date<br />
</span><span style="font-size: xx-small;">Learn How To Ask Out A Woman<br />
</span><span style="font-size: xx-small;">Learn How To Ask A Woman Out<br />
</span><span style="font-size: xx-small;">Learn How To Get Started Dating<br />
</span><span style="font-size: xx-small;">Find Out The Way To Meet a Girl<br />
</span><span style="font-size: xx-small;">Find Out The Way To Get A Date<br />
</span><span style="font-size: xx-small;">Find Out The Way To Ask Out A Woman<br />
</span><span style="font-size: xx-small;">Find Out The Way To Ask A Woman Out<br />
</span><span style="font-size: xx-small;">Find Out The Way To Get Started Dating<br />
</span><span style="font-size: xx-small;">It&#8217;s Easy To Learn How To Meet a Girl<br />
</span><span style="font-size: xx-small;">It&#8217;s Easy To Learn How To Get A Date<br />
</span><span style="font-size: xx-small;">It&#8217;s Easy To Learn How To Ask Out A Woman<br />
</span><span style="font-size: xx-small;">It&#8217;s Easy To Learn How To Ask A Woman Out<br />
</span><span style="font-size: xx-small;">It&#8217;s Easy To Learn How To Get Started Dating</span></p></blockquote>
<p>When I first started analyzing the possible permutations of some of my madlib scripts, I was so astounded by the numbers that I assumed I had made a mistake in my coding. After I did the math manually, I realized that I had it right, but the numbers were still astounding. </span></p>
<p>I have one relatively short madlib script that outputs around 150 words. However, once you take into account number of possible rows in each database it draws from, plus the numerous wildcard sets, that script has approx 42311189564227584000 possible unique permutations.</span></p>
<p>To give you an idea of how steep the corelation is between input and output, here are some numbers.</span></p>
<p>Each line represents one word group.<br />
<span style="font-size: xx-small;">10 <span style="background-color: #ffff00">&lt;&#8211; first group has 10 words</span><br />
20 <span style="background-color: #ffff00">&lt;&#8211; second group has 2 </span></span></span><span style="font-size: xx-small;"><span style="background-color: #ffff00">words</span></span></span><span style="font-size: xx-small;"><br />
100 <span style="background-color: #ffff00">&lt;&#8211; third group has 5 </span></span></span><span style="font-size: xx-small;"><span style="background-color: #ffff00">words</span></span></span><span style="font-size: xx-small;"><br />
1300 <span style="background-color: #ffff00">&lt;&#8211; fourth group has 13 </span></span></span><span style="font-size: xx-small;"><span style="background-color: #ffff00">words</span></span></span><span style="font-size: xx-small;"><br />
20800 <span style="background-color: #ffff00">&lt;&#8211; etc etc etc</span><br />
166400<br />
998400<br />
10982400<br />
54912000<br />
219648000<br />
1537536000<br />
4612608000<br />
27675648000<br />
110702592000<br />
332107776000<br />
996323328000<br />
3985293312000<br />
15941173248000<br />
95647039488000<br />
382588157952000<br />
2295528947712000<br />
9182115790848000<br />
36728463163392000<br />
110185389490176000<br />
330556168470528000<br />
1322224673882112000<br />
5288898695528448000<br />
10577797391056896000<br />
42311189564227584000<br />
</span></span></p>
<p> For all you programmers out there, here is how I am calculating permutations (this needs to be threaded to have any production application):</span></p>
<p><span style="background-color: #ffff00; font-size: x-small;"> <span style="font-size: xx-small;">class Array</span></span><br />
<span style="font-size: xx-small;"> <span style="background-color: #ffff00">def sequence(i = 0, *a)</span></span></span><br />
<span style="font-size: xx-small;"> <span style="background-color: #ffff00">return [a] if i == size</span></span></span><br />
<span style="font-size: xx-small;"> <span style="background-color: #ffff00">self[i].map {|x|</span></span></span><br />
<span style="font-size: xx-small;"> <span style="background-color: #ffff00">sequence(i+1, *(a + [x]))</span></span></span><br />
<span style="font-size: xx-small;"> <span style="background-color: #ffff00">}.inject([]) {|m, x| m + x} </span></span></span><br />
<span style="font-size: xx-small;"> <span style="background-color: #ffff00">end</span></span></span><br />
<span style="font-size: xx-small;"> <span style="background-color: #ffff00">end</span></span></span></p>
<p><span style="font-size: xx-small;"><span style="background-color: #ffff00"> input = [<br />
["my","your","her","his","our"],<br />
["goat","sailboat","cabin"],<br />
["is","is usually","is always"],<br />
["stinky","leaking","clean"]<br />
]</span></span></span></p>
<p><span style="font-size: xx-small;"><span style="background-color: #ffff00">output = input.sequence</span></span></span></p>
<p><span style="font-size: xx-small;"> <span style="background-color: #ffff00">p output.length</span></span></span><br />
<span style="font-size: xx-small;"> <span style="background-color: #ffff00">p output</span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://seocracy.com/2008/06/fun-with-string-permutations/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

