<?xml version="1.0" encoding="UTF-8"?>
<?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"?><!-- generator="wordpress/2.2" --><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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Zvents Developers Blog</title>
	<link>http://developers.zvents.com</link>
	<description>Engineers, programmers, and designers working with Zvents REST API</description>
	<pubDate>Fri, 25 Apr 2008 23:21:49 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Zvents-Developers-Blog" type="application/rss+xml" /><feedburner:emailServiceId>Zvents-Developers-Blog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Rails url_for is slow — some data comparison</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/xw4DgPJ2ekY/</link>
		<comments>http://developers.zvents.com/2008/performance-and-scalability/url_for-is-slow-some-data/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 23:18:47 +0000</pubDate>
		<dc:creator>Josh</dc:creator>
		
		<category><![CDATA[Performance and Scalability]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>
<category>General</category><category>Performance and Scalability</category><category>Rails</category><category>Ruby</category>
		<guid isPermaLink="false">http://developers.zvents.com/2008/performance-and-scalability/url_for-is-slow-some-data/</guid>
		<description><![CDATA[There has been some discussion, though not a lot in print, of the fact that the Rails helper method url_for (which is also the basis for link_to and other frequently-used helpers) can be slow.  This slowness stems from the process of generating routes, which takes longer as your routes.rb fills up.
As the Zvents site [...]]]></description>
			<content:encoded><![CDATA[<p>There has been some discussion, though not a lot in print, of the fact that the Rails helper method <strong>url_for</strong> (which is also the basis for link_to and other frequently-used helpers) can be slow.  This slowness stems from the process of generating routes, which takes longer as your routes.rb fills up.</p>
<p>As the <a href="http://www.zvents.com">Zvents site</a> and traffic grow, we&#8217;re always looking for opportunities to improve performance.  Our routes.rb has filled up a bit (nearly 40 entries), so I decided to do a little benchmarking to see if url_for was slowing us down, and if so, how much.</p>
<p>Here&#8217;s what I found.</p>
<p>I started with a page that has approximately 200 links generated with link_to (<a href="http://www.zvents.com/movies/theaters">http://www.zvents.com/movies/theaters</a>, though the number of links depends on your location).  This is a lot of links, but that made it easier to run my tests.  I wrapped each link_to call with a timing block, summed up the time, then took the average.  Also, these tests were run on my development machine (MacBook Pro) in a Linux VM, under fairly heavy load.</p>
<p>Here&#8217;s the difference between calling link_to with a hash (causing a call to url_for), and calling it with a string (no call to url_for), average over roughly 1,000 measurements:</p>
<p>link_to WITH url_for:  6.8 ms</p>
<p>link_to WITHOUT url_for:  2.0 ms</p>
<p>That&#8217;s a big difference &#8212; almost 5 ms, or 3.4 times longer.  And the cumulative effect on a page like the one tested, with nearly 200 links, is a total render time of almost one second more.</p>
<p>Obviously, the results will be very different on different machines, in different environments.  I&#8217;d love to do a more general, scientific analysis, when I have some time.  But for now, it&#8217;s just a little more information for you to use in trying to streamline your Rails apps.</p>
<a href="http://developers.zvents.com/tag/general" rel="tag">General</a>, <a href="http://developers.zvents.com/tag/performance-and-scalability" rel="tag">Performance and Scalability</a>, <a href="http://developers.zvents.com/tag/rails" rel="tag">Rails</a>, <a href="http://developers.zvents.com/tag/ruby" rel="tag">Ruby</a><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=xw4DgPJ2ekY:Fo_ngX6D7kQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=xw4DgPJ2ekY:Fo_ngX6D7kQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=xw4DgPJ2ekY:Fo_ngX6D7kQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=xw4DgPJ2ekY:Fo_ngX6D7kQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=xw4DgPJ2ekY:Fo_ngX6D7kQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=xw4DgPJ2ekY:Fo_ngX6D7kQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=xw4DgPJ2ekY:Fo_ngX6D7kQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=xw4DgPJ2ekY:Fo_ngX6D7kQ:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/xw4DgPJ2ekY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2008/performance-and-scalability/url_for-is-slow-some-data/feed/</wfw:commentRss>
		<feedburner:origLink>http://developers.zvents.com/2008/performance-and-scalability/url_for-is-slow-some-data/</feedburner:origLink></item>
		<item>
		<title>Hypertable Podcast</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/812uoWM9lT8/</link>
		<comments>http://developers.zvents.com/2008/hypertable/38/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 21:12:39 +0000</pubDate>
		<dc:creator>Zvents</dc:creator>
		
		<category><![CDATA[Hypertable]]></category>

		<category><![CDATA[High-performance computing]]></category>

		<category><![CDATA[Open Source]]></category>
<category>High performance computing</category><category>hypertable</category><category>linuxworld</category><category>open source</category><category>podcast</category>
		<guid isPermaLink="false">http://developers.zvents.com/2008/hypertable/38/</guid>
		<description><![CDATA[Zvents software architect, Doug                      Judd, discussed a short code example from soon be released open-source distributed data storage system, Hypertable, with LinuxWorld.  In the podcast (Download: mp3 / iTunes) he explains the basics [...]]]></description>
			<content:encoded><![CDATA[<p>Zvents software architect, Doug                      Judd, discussed a <a href="http://code.google.com/p/hypertable/wiki/ApacheLogLoad">short code example</a> from soon be released open-source distributed data storage system, <a href="http://www.hypertable.org/">Hypertable,</a> with <a href="http://www.linuxworld.com/">LinuxWorld</a>.  In the podcast (Download: <a href="http://podcasts.networkworld.com/linuxcast/013008-linuxcast.mp3">mp3</a> / <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=260736082">iTunes</a>) he explains the basics and high performance of Hypertable which is designed to support applications requiring maximum performance, scalability, and reliability.</p>
<p>Since Hypertable is starting from the ground up, also discussed are the system&#8217;s goals, strengths, and limitations with some insight to the state of the art in project infrastructure, including git for revision control, cmake for build, and Google Code for issue tracking.</p>
<p>Listen now: <a href="http://podcasts.networkworld.com/linuxcast/013008-linuxcast.mp3">mp3</a> / <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=260736082">iTunes</a></p>
<a href="http://developers.zvents.com/tag/high-performance-computing" rel="tag">High performance computing</a>, <a href="http://developers.zvents.com/tag/hypertable" rel="tag">hypertable</a>, <a href="http://developers.zvents.com/tag/linuxworld" rel="tag">linuxworld</a>, <a href="http://developers.zvents.com/tag/open-source" rel="tag">open source</a>, <a href="http://developers.zvents.com/tag/podcast" rel="tag">podcast</a><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=812uoWM9lT8:68MxVpDrwuc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=812uoWM9lT8:68MxVpDrwuc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=812uoWM9lT8:68MxVpDrwuc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=812uoWM9lT8:68MxVpDrwuc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=812uoWM9lT8:68MxVpDrwuc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=812uoWM9lT8:68MxVpDrwuc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=812uoWM9lT8:68MxVpDrwuc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=812uoWM9lT8:68MxVpDrwuc:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/812uoWM9lT8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2008/hypertable/38/feed/</wfw:commentRss>
<enclosure url="http://podcasts.networkworld.com/linuxcast/013008-linuxcast.mp3" length="11100160" type="audio/mpeg" />
		<feedburner:origLink>http://developers.zvents.com/2008/hypertable/38/</feedburner:origLink></item>
		<item>
		<title>Federated Local Search</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/cN32JctKHwc/</link>
		<comments>http://developers.zvents.com/2008/search/federated-local-search/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 01:36:20 +0000</pubDate>
		<dc:creator>paul</dc:creator>
		
		<category><![CDATA[Search]]></category>
<category>blended</category><category>federated</category><category>google</category><category>local</category><category>local search</category><category>Search</category><category>serp</category><category>universal</category><category>universal search</category>
		<guid isPermaLink="false">http://developers.zvents.com/2008/search/federated-local-search/</guid>
		<description><![CDATA[Zvents continues to grow at exponential rates, having signed The McClatchy Company which brings local search and things to do to over 50 additional local sites such as Triangle.com and indexing events, businesses, and performers as quickly as possible.  Today&#8217;s big news though was our release of a unique, blended local search technology which [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">Zvents continues to grow at exponential rates, having signed <a href="http://www.mcclatchy.com">The McClatchy Company</a> which brings local search and things to do to over 50 additional local sites such as <a href="http://events.triangle.com/">Triangle.com</a> and indexing events, businesses, and performers as quickly as possible.  Today&#8217;s big news though was our release of a unique, blended local search technology which combines all facets of local content into one search results page: business listings, movies, restaurants, events, sales, performers/celebrities (in town), sports, etc.</p>
<p class="MsoNormal">This is a tremendous advance for the <a href="http://gesterling.wordpress.com/2008/01/28/zvents-expands-its-scope/">local search industry</a>, <a href="http://www.localseoguide.com/zvents-launches-new-local-search/">local businesses</a>, and users, advancing the space from business listing lookups to a singular experience for discovering things to do and finding everything local.  naturalsearchblog&#8217;s Chris  <a href="http://www.zvents.com/search?st=any&amp;swhat=super+bowl&amp;swhen=&amp;swhere=Phoenix%2CAZ&amp;srad=60&amp;complexity=basic&amp;search=true&amp;svt=text" title="Discover things to do"><img src="http://developers.zvents.com/wp-content/uploads/2008/01/fed.jpg" title="Universal Local Search" alt="Universal Local Search" align="left" hspace="3" vspace="2" /></a>Silver Smith has a nice comparison to <a href="http://www.naturalsearchblog.com/archives/2008/01/28/zvents-launches-federated-local-search/">Google&#8217;s Universal Search</a> (for blended web results); <a href="http://www.localseoguide.com/zvents-launches-new-local-search/">Andrew Shotland</a>, <a href="http://www.websitemagazine.com/content/blogs/posts/archive/2008/01/28/ZVents_Launches_Federated_Local_Search.aspx">Website Magazine&#8217;s Pete Prestipino</a>, and <a href="http://gesterling.wordpress.com/2008/01/28/zvents-expands-its-scope/">Greg Sterling</a> also shared initial thoughts worth a read.</p>
<p class="MsoNormal"> Federated local search is easily accessible throughout <a href="http://www.zvents.com">Zvents</a>; the prominent search box allows users to query &#8216;what&#8217; and &#8216;when&#8217; (either or both) to discover things to do.  IP mapping predefines user location making it easy to find things to do near them, while the clear, personalized City/State location or Advanced Search options make it easy to search another city.  We&#8217;ve even blended our listings submission so you can quickly <a href="http://www.zvents.com/welcome/create">add a venue, event, or performer</a>; a must do for local businesses who want to reach our millions of unique users through over 200 major partners.</p>
<p class="MsoNormal">We&#8217;re looking forward to many more enhancements to the local space throughout 2008; <a href="http://feeds.feedburner.com/Zvents-Developers-Blog" target="_blank">stay tuned</a>!</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<a href="http://developers.zvents.com/tag/blended" rel="tag">blended</a>, <a href="http://developers.zvents.com/tag/federated" rel="tag">federated</a>, <a href="http://developers.zvents.com/tag/google" rel="tag">google</a>, <a href="http://developers.zvents.com/tag/local" rel="tag">local</a>, <a href="http://developers.zvents.com/tag/local-search" rel="tag">local search</a>, <a href="http://developers.zvents.com/tag/search" rel="tag">Search</a>, <a href="http://developers.zvents.com/tag/serp" rel="tag">serp</a>, <a href="http://developers.zvents.com/tag/universal" rel="tag">universal</a>, <a href="http://developers.zvents.com/tag/universal-search" rel="tag">universal search</a><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=cN32JctKHwc:dGl4aXmTUJA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=cN32JctKHwc:dGl4aXmTUJA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=cN32JctKHwc:dGl4aXmTUJA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=cN32JctKHwc:dGl4aXmTUJA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=cN32JctKHwc:dGl4aXmTUJA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=cN32JctKHwc:dGl4aXmTUJA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=cN32JctKHwc:dGl4aXmTUJA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=cN32JctKHwc:dGl4aXmTUJA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/cN32JctKHwc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2008/search/federated-local-search/feed/</wfw:commentRss>
		<feedburner:origLink>http://developers.zvents.com/2008/search/federated-local-search/</feedburner:origLink></item>
		<item>
		<title>The Google File System (and How It Can Be Improved)</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/exP4d2WEWBg/</link>
		<comments>http://developers.zvents.com/2007/high-performance-computing/the-google-file-system-and-how-it-can-be-improved/#comments</comments>
		<pubDate>Wed, 07 Nov 2007 00:34:24 +0000</pubDate>
		<dc:creator>doug</dc:creator>
		
		<category><![CDATA[High-performance computing]]></category>
<category>High performance computing</category>
		<guid isPermaLink="false">http://developers.zvents.com/2007/high-performance-computing/the-google-file-system-and-how-it-can-be-improved/</guid>
		<description><![CDATA[Over the past several years, Google has built and deployed large scale distributed software infrastructure for the purpose of storing and processing the massive amount of data that they collect.  Three of these systems are fundamental and underpin their entire business.  They are: The Google File System, Map-Reduce, and Bigtable.  They&#8217;ve described [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past several years, Google has built and deployed large scale distributed software infrastructure for the purpose of storing and processing the massive amount of data that they collect.  Three of these systems are fundamental and underpin their entire business.  They are: The Google File System, Map-Reduce, and Bigtable.  They&#8217;ve described these systems in detail in three separate papers (see <a href="http://research.google.com/pubs/papers.html">http://research.google.com/pubs/papers.html</a>).</p>
<p>The GFS was designed to reliably store a massive amount of data (i.e. <a href="http://www.webopedia.com/TERM/P/petabyte.html">petabytes</a>) in such a way that allows it to be efficiently processed.  To achieve this goal in the most cost effective way possible, the GFS was designed to be run on large clusters of commodity hardware (i.e. the commodity PC and gigabit ethernet).  The following list highlights some of the important features of GFS:</p>
<ul>
<li><strong>Global namespace</strong>.  GFS provides a global namespace in the sense that any machine or process can connect to it and see the whole thing.  It also runs entirely in user space and doesn&#8217;t require system administrator privileges to connect to it.  <a href="http://en.wikipedia.org/wiki/RAID">NFS</a>, on the other hand, requires you to mount many &#8220;islands&#8221; of filesystem into your own local filesystem requiring system administrator privileges to do so.</li>
<li><strong>High Availability</strong>.    Given the unreliable nature of commodity hardware, GFS has been designed to constantly check for and react to machine failures.  High data availability is achieved through inter-machine replication.  GFS breaks each file into chunks (default is 64MB) and each chunk is replicated across some number of machines (default is 3).  Unlike <a href="http://en.wikipedia.org/wiki/RAID">RAID</a>, it can withstand all types of machine failures (e.g. Power supply, memory, network ports) as opposed to just disk failures.  Chunks are also replicated inter-rack to protect against correlated failures caused by failures in a network switch or power circuit.</li>
<li><strong>Efficient processing</strong>.  By splitting data into 64MB chunks and distributing the chunks across a large cluster of machines, the data can be processed efficiently in parallel.  This is achieved by pushing processing jobs to the machines that store the chunks and running the computation at the storage nodes in parallel.  This has enormous benefit since the computation requires almost no network I/O to read the data that it is processing (see <a href="http://outgoing.typepad.com/outgoing/2005/04/mapreduce.html">Map-reduce</a>).</li>
<li><strong>Atomic record append</strong>.  Traditional Unix filesystems support the ability to open a file in O_APPEND mode, which instructs the system to append all writes to the end of the file.  Unfortunately, most implementations have a race condition where concurrent appends can conflict with one another causing one to overwrite the other.  GFS supports true atomic append where the client specifies only the data to be appended and the system will append it at least once, atomically, returning the offset of where it was written, back to the client.  This operation is used heavily at Google and allows files to be used as producer/consumer queues with multiple producers.</li>
<li><strong>Snapshot</strong>.  A file or directory tree can be copied almost instantaneously with the snapshot operation.  To achieve this fast copy, the systems copies only the metadata and marks all of the underlying chunks copy-on-write.  Only if a chunk gets modified will a new copy get created with the modification, otherwise the chunks are shared between the original files and the snapshotted files.</li>
</ul>
<p>There are several aspects of the GFS design that could be improved given the context of Google&#8217;s usage of GFS today and the other distributed systems that have been built up around it.</p>
<p>The first improvement would be to get rid of the random write and support only record append.  The GFS paper repeatedly emphasizes that the write workload Google typically sees consists of large streaming writes.  Small random writes are almost non-existent.  Since the paper was published, Google has developed a database system called Bigtable that sits on top of GFS.  It is designed to efficiently handle small random updates by caching them in memory and periodically spilling data sequentially to the GFS.  The number of applications that require small random updates, but where Bigtable is inappropriate, is effectively zero.  By eliminating this feature, a considerable amount of complexity gets dropped from the system.  Reduction of complexity in a software system generally leads to better quality and maintainability.</p>
<p>The next place where I see room for improvement is the fixed (64MB) chunk size.  Most applications operate on fixed or variable sized records.  If the file system is made aware of these record boundaries, then it could vary the size of its chunks to accomodate whole records only.  With a fixed 64MB chunk size the last record in a chunk usually gets truncated, causing the application to read data from multiple locations to assemble the whole record.  This isn&#8217;t such a big deal in many applications, but can cause scaling problems in the Map-reduce system.  Map-reduce achieves much of its efficiency by pushing computation out to where the data is physically stored and running it locally.  If, for every chunk, the last record in the chunk is truncated, then the system must fetch the other part of the record to process it, which often involves communicating with another node on the network.  At scale and under load, every additional network round-trip negatively impacts performance.  If the file system takes into account application record boundaries, then it can make more intelligent placement decisions and therefore reduce overall network load.</p>
<p>The last place in GFS where I feel there could be an improvement is in its data consistency model.  Under certain conditions where there are concurrent modifications at the same location, records can get duplicated, truncated, and/or padding (e.g. dead space) can get written into the file.  GFS leaves it up to the application to write self-validating and self-identifying records to guard against these situations.  This just does not seem right.  It places a big onus on the application.  I suspect that if GFS moved to a record append only model, that it would be much easier to provide a fully consistent data model.</p>
<p>There are several efforts underway to build open source implementations of this distributed computing infrastructure.  Zvents has been building an implementation of a Bigtable-like distributed database called Hypertable.  Look for an announcement coming on this soon.</p>
<p>- Doug Judd</p>
<a href="http://developers.zvents.com/tag/high-performance-computing" rel="tag">High performance computing</a><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=exP4d2WEWBg:ocJFy1JaLBw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=exP4d2WEWBg:ocJFy1JaLBw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=exP4d2WEWBg:ocJFy1JaLBw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=exP4d2WEWBg:ocJFy1JaLBw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=exP4d2WEWBg:ocJFy1JaLBw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=exP4d2WEWBg:ocJFy1JaLBw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=exP4d2WEWBg:ocJFy1JaLBw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=exP4d2WEWBg:ocJFy1JaLBw:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/exP4d2WEWBg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2007/high-performance-computing/the-google-file-system-and-how-it-can-be-improved/feed/</wfw:commentRss>
		<feedburner:origLink>http://developers.zvents.com/2007/high-performance-computing/the-google-file-system-and-how-it-can-be-improved/</feedburner:origLink></item>
		<item>
		<title>Add Zvents to Pageflakes</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/pz4Gt_Wslz0/</link>
		<comments>http://developers.zvents.com/2007/widgets/add-zvents-to-pageflakes/#comments</comments>
		<pubDate>Fri, 15 Jun 2007 18:11:26 +0000</pubDate>
		<dc:creator>paul</dc:creator>
		
		<category><![CDATA[Widgets]]></category>

		<guid isPermaLink="false">http://dev0/blog3/?p=4</guid>
		<description><![CDATA[ Pageflakes fans can bring Zvents to to their startpage with a great flake from Wendy in our community of developers.  The Zvents Event Search flake supports our what/when/where search for things to do and venues with results sorted by date or relevance.My search for concerts in San Francisco this weekend turned up O.A.R. [...]]]></description>
			<content:encoded><![CDATA[<p class="article-text"> <a href="http://www.pageflakes.com/">Pageflakes</a> fans can bring Zvents to to their startpage with a great flake from Wendy in our <a href="http://www.zvents.com/support/developers">community of developers</a>.  The <a href="http://www.pageflakes.com/Community/Content/Flakes.aspx?moduleKey=4100">Zvents Event Search flake</a> supports our what/when/where search for things to do and venues with results sorted by date or relevance.My search for concerts in San Francisco this weekend turned up <a href="http://www.zvents.com/events/show/1564796-O-A-R-Of-a-Revolution-with-Bedouin-Soundclash">O.A.R. (a personal favorite for “That Was a Crazy Game of Poker”) at The Warfield</a> and the jazzy, folk pop of <a href="http://www.zvents.com/events/show/1250420-The-Samples">The Samples at Cafe-du-Nord</a>.</p>
<p>A search in venues for “baseball” returns the obvious <a href="http://www.zvents.com/venues/show/9549-AT-T-Park">AT&amp;T Park</a>, home of the <a href="http://www.zvents.com/events/show/16382440-MLB-All-Star-Game">2007 <span class="caps">MLB</span> All-star Game</a> as well as the San Francisco Exploratorium.  <a href="http://www.zvents.com/events/show/14582742-Baseball-Edition-of-Iron-Science-Teacher-Contest">Why, you might ask</a>?  We’re <a href="http://www.zvents.com/events/show/14582742-Baseball-Edition-of-Iron-Science-Teacher-Contest">discovering</a> all sorts of things for you to do.</p>
<p><a href="http://www.pageflakes.com/Community/Content/Flakes.aspx?moduleKey=4100">Add the Zvents Event Search flake</a> to your startpage and start discovering things to do.By the way, Zvents Developer <span class="caps">API</span> provides programmatic access to objects including events, venues, groups, and tags, stored in Zvents. Using the <span class="caps">API</span> is as simple as:</p>
<ol>
<li>Login to your Zvents account and <a href="http://www.zvents.com/user/edit">generate an <span class="caps">API</span> key</a></li>
<li><a href="http://blog.zvents.com/www.zvents.com/rest">Read the documentation</a></li>
<li>Get hacking</li>
</ol>
<p>If you have any suggestions for improvements to the APIs or have created an application, <a href="http://www.zvents.com/support/contact?issues=developer">let us know</a>.(thanks Wendy!)</p>
No Tags<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=pz4Gt_Wslz0:p8a8eRj6uFE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=pz4Gt_Wslz0:p8a8eRj6uFE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=pz4Gt_Wslz0:p8a8eRj6uFE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=pz4Gt_Wslz0:p8a8eRj6uFE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=pz4Gt_Wslz0:p8a8eRj6uFE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=pz4Gt_Wslz0:p8a8eRj6uFE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=pz4Gt_Wslz0:p8a8eRj6uFE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=pz4Gt_Wslz0:p8a8eRj6uFE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/pz4Gt_Wslz0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2007/widgets/add-zvents-to-pageflakes/feed/</wfw:commentRss>
		<feedburner:origLink>http://developers.zvents.com/2007/widgets/add-zvents-to-pageflakes/</feedburner:origLink></item>
		<item>
		<title>Try our Google Mapplet, and speed up your own</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/9pJDhoZ1zKg/</link>
		<comments>http://developers.zvents.com/2007/general/try-our-google-mapplet-and-speed-up-your-own/#comments</comments>
		<pubDate>Tue, 12 Jun 2007 18:48:40 +0000</pubDate>
		<dc:creator>paul</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://dev0/blog3/?p=5</guid>
		<description><![CDATA[
I just finished putting together a Google Mapplet that helps you discover things to do while you are using Google Maps.
Mapplets are a new feature that let you add Zvents event search and all sorts of other information to Google Maps itself, combining them in any way you want. Google is fixing a few remaining [...]]]></description>
			<content:encoded><![CDATA[<p class="article-text"><a href="http://maps.google.com/ig/directory?synd=mpl&amp;pid=mpl&amp;features=sharedmap,geofeed&amp;backlink=http%3A%2F%2Fmaps.google.com%2Fmaps%2Fmm%3Fmapprev%3D1%26ie%3DUTF8%26z%3D4%26om%3D1&amp;num=24&amp;url=http://www.zvents.com/widgets/mapplet/zmap.xml" alt="Install the Zvents Mapplet" title="Install the Zvents Mapplet"><img src="http://blog.zvents.com/assets/2007/6/12/mapplet.png" style="border: medium none ; margin: 0pt 0pt 4px 8px; width: 300px; height: 437px; float: right" /></a></p>
<p>I just finished putting together a Google Mapplet that helps you discover things to do while you are using Google Maps.</p>
<p><a href="http://google-latlong.blogspot.com/2007/05/mashup-of-mashups.html">Mapplets</a> are a new feature that let you add Zvents event search and all sorts of other information to Google Maps itself, combining them in any way you want. Google is fixing a few remaining bugs in their mapplet code, so right now mapplets are available only on a developer preview page. We’ll have an official announcement when Google releases Mapplets on the main Google Maps page.</p>
<p>In the meantime, you are welcome to try out our Zvents mapplet, if you don’t mind the odd bug or two. You can install the mapplet by clicking the <strong>Add it to Maps</strong> button on <a href="http://maps.google.com/ig/directory?synd=mpl&amp;pid=mpl&amp;features=sharedmap,geofeed&amp;backlink=http%3A%2F%2Fmaps.google.com%2Fmaps%2Fmm%3Fmapprev%3D1%26ie%3DUTF8%26z%3D4%26om%3D1&amp;num=24&amp;url=http://www.zvents.com/widgets/mapplet/zmap.xml">this page</a>, then click <strong>Discover things to do – Zvents</strong> under the Mapplets tab on the Google Maps page. I think it’s a lot of fun, and I hope you do too. We’d like to hear your feedback!</p>
<p>The rest of this post is for my fellow Google Mapplet developers. If you’ve worked with both the regular <a href="http://www.google.com/apis/maps/">Google Maps <span class="caps">API</span></a> and the <a href="http://www.google.com/apis/maps/documentation/mapplets/">Mapplet <span class="caps">API</span></a>, you know that there’s one big difference between the two: many of the Maps <span class="caps">API</span> functions are replaced with special asynchronous versions. Because of the way mapplets work, it isn’t possible for an <span class="caps">API</span> function to return a value directly to its caller. Instead, you must provide a callback function which receives the value. For example, this Maps <span class="caps">API</span> code:</p>
<pre><code>var center = map.getCenter();
// do something with the map center here
</code></pre>
<p>must be replaced with:</p>
<pre><code>map.getCenterAsync( function( center ) {
    // do something with the map center here
});
</code></pre>
<p>This type of asynchronous callback should be familiar to any <span class="caps">AJAX</span> developer.</p>
<p>The problem starts when you need several pieces of information at once. To find events on the part of the map you are looking at, our mapplet uses the map boundaries and center along with the map size in pixels. My first attempt at the code looked like this:</p>
<pre><code>map.getSizeAsync( function( size ) {
    map.getBoundsAsync( function( bounds ) {
        map.getCenterAsync( function( center ) {
            // Run a search using size, bounds, and center
        });
    });
});
</code></pre>
<p>That works fine, but it is rather slow. The code first asks for the pixel size and waits for it, then asks for the geographical boundaries and waits for them, then asks for the center and waits for it. That’s a lot of waiting around! And it gets that much worse if you need even more information from the map.</p>
<p>It would  speed things up if there were a way to combine all of those asynchronous requests into one. What if the mapplet <span class="caps">API</span> worked like this:</p>
<pre><code>GAsync( map, 'getSize', 'getBounds', 'getCenter',
    function( size, bounds, center ) {
        // Run a search using size, bounds, and center
    });</code></pre>
<p>This <code>GAsync()</code> function would gather up all three pieces of map information and return them in a single callback. The code is simpler and easier to read too.</p>
<p>Interestingly enough, it turns out to be possible to implement <code>GAsync()</code> as a small layer on top of the existing Mapplet <span class="caps">API</span> functions and gain these benefits. I did just that, and it really improved the responsiveness of our mapplet.</p>
<p>When I told the Google Mapplet team about this, they liked the idea too, and they will include <code>GAsync()</code> in the next version of the mapplet <span class="caps">API</span>.</p>
<p>If you’re already working on a mapplet, you don’t have to wait. You can use <code>GAsync()</code> right now by including its source code directly in your mapplet. It’s a small function that you can paste into your code, making your mapplet code easier to write and faster too.</p>
<p>Full details and the <code>GAsync()</code> source code are in <a href="http://mg.to/2007/06/06/a-fast-and-simple-async-api-for-google-mapplets">my blog post</a>.</p>
No Tags<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=9pJDhoZ1zKg:pGrcxZCwuxI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=9pJDhoZ1zKg:pGrcxZCwuxI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=9pJDhoZ1zKg:pGrcxZCwuxI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=9pJDhoZ1zKg:pGrcxZCwuxI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=9pJDhoZ1zKg:pGrcxZCwuxI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=9pJDhoZ1zKg:pGrcxZCwuxI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=9pJDhoZ1zKg:pGrcxZCwuxI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=9pJDhoZ1zKg:pGrcxZCwuxI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/9pJDhoZ1zKg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2007/general/try-our-google-mapplet-and-speed-up-your-own/feed/</wfw:commentRss>
		<feedburner:origLink>http://developers.zvents.com/2007/general/try-our-google-mapplet-and-speed-up-your-own/</feedburner:origLink></item>
		<item>
		<title>Happy Birthday, Zvents!</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/4IblikQK4Bg/</link>
		<comments>http://developers.zvents.com/2007/general/happy-birthday-zvents/#comments</comments>
		<pubDate>Mon, 19 Mar 2007 19:08:52 +0000</pubDate>
		<dc:creator>Zvents</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://dev0/blog3/?p=8</guid>
		<description><![CDATA[Zvents is two today.  Congratulations to the team at our fast-growing company, and looking forward to three!

No Tags]]></description>
			<content:encoded><![CDATA[<p class="article-text">Zvents is two today.  Congratulations to the team at our fast-growing company, and looking forward to three!</p>
<p><a href="http://www.flickr.com/photos/onohoku/427329185/" title="Zvents birthday cake"><img src="http://farm1.static.flickr.com/160/427329185_b5cd6fbdcf_m.jpg" alt="zCakecut" height="229" width="240" /></a></p>
No Tags<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=4IblikQK4Bg:q38md_njyYo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=4IblikQK4Bg:q38md_njyYo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=4IblikQK4Bg:q38md_njyYo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=4IblikQK4Bg:q38md_njyYo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=4IblikQK4Bg:q38md_njyYo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=4IblikQK4Bg:q38md_njyYo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=4IblikQK4Bg:q38md_njyYo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=4IblikQK4Bg:q38md_njyYo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/4IblikQK4Bg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2007/general/happy-birthday-zvents/feed/</wfw:commentRss>
		<feedburner:origLink>http://developers.zvents.com/2007/general/happy-birthday-zvents/</feedburner:origLink></item>
		<item>
		<title>Open Source Search: Zvents Marries Heritrix with Hadoop</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/Xz-zejQ8uvM/</link>
		<comments>http://developers.zvents.com/2007/general/open-source-search-zvents-marries-heritrix-with-hadoop/#comments</comments>
		<pubDate>Thu, 25 Jan 2007 19:11:12 +0000</pubDate>
		<dc:creator>Zvents</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://dev0/blog3/?p=9</guid>
		<description><![CDATA[The rise of significant open-source search technology projects is one of the key reasons that startups like Zvents can compete with the major portals. Doug Cutting began this trend with the release of Lucene, and the public release of the Google MapReduce paper has now led to Hadoop, an open source implementation of Google’s GFS [...]]]></description>
			<content:encoded><![CDATA[<p class="article-text">The rise of significant open-source search technology projects is one of the key reasons that startups like Zvents can compete with the major portals. Doug Cutting began this trend with the release of <a href="http://lucene.apache.org/">Lucene</a>, and the public release of the <a href="http://labs.google.com/papers/mapreduce.html">Google MapReduce paper</a> has now led to <a href="http://lucene.apache.org/hadoop/">Hadoop</a>, an open source implementation of Google’s <span class="caps">GFS</span> and Map-Reduce system lead by Doug and the folks over at Yahoo.</p>
<p>The engineering team at the Internet Archive has built a web crawler as an open-source project called <a href="http://crawler.archive.org/">Heritrix</a>. Heritrix provides a full set of features for running an Internet crawl. Current startup state of the art for high-volume web crawling is to combine Heritrix with Hadoop… the only problem being that the two aren’t really on speaking terms.</p>
<p>What are you going to do with all the Heritrix-crawled data once you’ve pulled it down? To do large-scale data mining on the crawled content, you must go through the inelegant and non-scalable process of writing to local disk and then copying into <span class="caps">HDFS</span> (Hadoop Distributed FileSystem). The Zvents engineering staff has developed an extension to Heritrix that allows it to crawl directly into <span class="caps">HDFS</span>, speeding up the process and makes it much more reliable. A source code and binary distribution of this extension can be found at <a href="http://www.zvents.com/labs">http://www.zvents.com/labs </a></p>
<p>We’re pleased to contribute this component to the community, and look forward to giving back more useful pieces of our effort to build the best local events search engine.</p>
<p class="article-line"><!-- split the category, comment, links --></p>
<p><span class="comments-link"></span></p>
No Tags<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=Xz-zejQ8uvM:-zEhXyi4Z70:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=Xz-zejQ8uvM:-zEhXyi4Z70:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=Xz-zejQ8uvM:-zEhXyi4Z70:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=Xz-zejQ8uvM:-zEhXyi4Z70:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=Xz-zejQ8uvM:-zEhXyi4Z70:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=Xz-zejQ8uvM:-zEhXyi4Z70:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=Xz-zejQ8uvM:-zEhXyi4Z70:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=Xz-zejQ8uvM:-zEhXyi4Z70:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/Xz-zejQ8uvM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2007/general/open-source-search-zvents-marries-heritrix-with-hadoop/feed/</wfw:commentRss>
		<feedburner:origLink>http://developers.zvents.com/2007/general/open-source-search-zvents-marries-heritrix-with-hadoop/</feedburner:origLink></item>
		<item>
		<title>Refueling the Rocket: Zvents Raises $7 million in funding</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/KrlirxU7Cdo/</link>
		<comments>http://developers.zvents.com/2006/general/10/#comments</comments>
		<pubDate>Tue, 07 Nov 2006 19:12:07 +0000</pubDate>
		<dc:creator>Zvents</dc:creator>
		
		<category><![CDATA[General]]></category>
<category>fund raising</category><category>funding</category><category>General</category><category>investors</category><category>zvents</category>
		<guid isPermaLink="false">http://dev0/blog3/?p=10</guid>
		<description><![CDATA[Zvents launched at the Web 2.0 conference 13 months ago, and we’ve had an amazing year. We’ve built out big pieces of our product, and signed up our first major media partners. At every step, I’ve been proud of our team for making great things happen on limited resources.
As of today, our resources are no [...]]]></description>
			<content:encoded><![CDATA[<p class="article-text">Zvents launched at the Web 2.0 conference 13 months ago, and we’ve had an amazing year. We’ve built out big pieces of our product, and signed up our first major media partners. At every step, I’ve been proud of our team for making great things happen on limited resources.</p>
<p>As of today, our resources are no longer quite so limited. We’re very pleased that VantagePoint Partners, and our new board member David Carlick, are joining NetService Ventures and Red Rock in buying in to our vision and our potential. With this funding, we’ll be taking <a href="http://www.zvents.com">Zvents nationwide</a>, and bringing in more great talent to join our growing team. The first of those new team members also made the official press release – Gordon Rios has joined us as <span class="caps">CTO</span>, coming from Yahoo! Search. Gordon will be leading the technical team that will implement our vision for the next generation of local search – truly helping people find out what is going on in their neighborhood and their city.</p>
<p>It’s all happening at Zvents – new partners and customers, new metro areas, new users, new employees, and whole new problems to solve. Little things that make our lives easier are also happening, like moving from our 1-bedroom apartment (for 12 people!) to an actual office.</p>
<p>It’s been a great year, and we’re all looking forward to what comes next.</p>
<p>-Ethan</p>
<a href="http://developers.zvents.com/tag/fund-raising" rel="tag">fund raising</a>, <a href="http://developers.zvents.com/tag/funding" rel="tag">funding</a>, <a href="http://developers.zvents.com/tag/general" rel="tag">General</a>, <a href="http://developers.zvents.com/tag/investors" rel="tag">investors</a>, <a href="http://developers.zvents.com/tag/zvents" rel="tag">zvents</a><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=KrlirxU7Cdo:PGsVjzhomzA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=KrlirxU7Cdo:PGsVjzhomzA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=KrlirxU7Cdo:PGsVjzhomzA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=KrlirxU7Cdo:PGsVjzhomzA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=KrlirxU7Cdo:PGsVjzhomzA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=KrlirxU7Cdo:PGsVjzhomzA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=KrlirxU7Cdo:PGsVjzhomzA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=KrlirxU7Cdo:PGsVjzhomzA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/KrlirxU7Cdo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2006/general/10/feed/</wfw:commentRss>
		<feedburner:origLink>http://developers.zvents.com/2006/general/10/</feedburner:origLink></item>
		<item>
		<title>Rails Plugin: Extended Fragment Cache</title>
		<link>http://feedproxy.google.com/~r/Zvents-Developers-Blog/~3/uEi9m6lOeEA/</link>
		<comments>http://developers.zvents.com/2006/general/rails-plugin-extended-fragment-cache/#comments</comments>
		<pubDate>Fri, 03 Nov 2006 19:13:24 +0000</pubDate>
		<dc:creator>Zvents</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://dev0/blog3/?p=11</guid>
		<description><![CDATA[The extended_fragment_cache plugin provides content interpolation and an in-process memory cache for fragment caching. It also integrates the features of Yan Pritzker’s memcache_fragments plugin since they both operate on the same methods.
Installation
1. This plugin requires that the memcache-client gem is installed.
   # gem install memcache-client
2. Install the plugin OR the gem
   [...]]]></description>
			<content:encoded><![CDATA[<p>The extended_fragment_cache plugin provides content interpolation and an in-process memory cache for fragment caching. It also integrates the features of <a href="http://www.agilewebdevelopment.com/plugins/memcache_fragments_with_time_expiry">Yan Pritzker’s memcache_fragments plugin</a> since they both operate on the same methods.</p>
<h3>Installation</h3>
<p>1. This plugin requires that the memcache-client gem is installed.</p>
<pre>   # gem install memcache-client</pre>
<p>2. Install the plugin OR the gem</p>
<pre>   $ script/plugin install svn://rubyforge.org/var/svn/zventstools/projects/extended_fragment_cache
   - OR -
   # gem install extended_fragment_cache</pre>
<h3>In-Process Memory Cache for Fragment Caching</h3>
<p>Fragment caching has a slight inefficiency that requires two lookups to the fragment cache store to render a single cached fragment. The two cache lookups are:</p>
<p>1. The read_fragment method invoked in a controller to determine if a    fragment has already been cached. e.g.,</p>
<pre>     unless read_fragment("/x/y/z")
      ...
     end</pre>
<p>2. The cache helper method invoked in a view that renders the fragment. e.g.,</p>
<pre>     &lt;% cache("/x/y/z") do %&gt;
       ...
     &lt;% end %&gt;</pre>
<p>This plugin adds an in-process cache that saves the value retrieved from the fragment cache store.  The in-process cache has two benefits:</p>
<p>1. It cuts in half the number of read requests sent to the fragment cache    store.  This can result in a considerable saving for sites that make    heavy use of memcached.</p>
<p>2. Retrieving the fragment from the in-process cache is faster than going    to fragment cache store.  On a typical dev box, the savings are    relatively small but would be noticeable in a standard production    environment using memcached (where the fragment cache is often running on another machine)</p>
<p>Peter Zaitsev has a great post comparing the latencies of different cache types on the MySQL Performance blog: <a href="http://www.mysqlperformanceblog.com/2006/08/09/cache-performance-comparison/">http://www.mysqlperformanceblog.com/2006/08/09/cache-performance-comparison/</a></p>
<p>The plugin automatically installs a before_filter on the ApplicationController that flushes the in-process memory cache at the start of every request.</p>
<h3>Content Interpolation for Fragment Caching</h3>
<p>Many modern websites mix a lot of static and dynamic content.  The more dynamic content you have in your site, the harder it becomes to implement caching.  In an effort to scale, you’ve implemented fragment caching all over the place.  Fragment caching can be difficult if your static content is interleaved with your dynamic content.  Your views become littered with cache calls which not only hurts performance (multiple calls to the cache backend), it also makes them harder to read.  Content interpolation allows you substitude dynamic content into cached fragment.</p>
<p>Take this example view:</p>
<pre>&lt;% cache("/first_part") do %&gt;
  This content is very expensive to generate, so let's fragment cache it.&lt;br/&gt;
&lt;% end %&gt;
&lt;%= Time.now %&gt;&lt;br/&gt;
&lt;% cache("/second_part") do %&gt;
  This content is also very expensive to generate.&lt;br/&gt;
&lt;% end %&gt;</pre>
<p>We can replace it with:</p>
<pre>&lt;% cache("/only_part", {}, {"__TIME_GOES_HERE__" =&gt; Time.now}) do %&gt;
  This content is very expensive to generate, so let's fragment cache it.&lt;br/&gt;
  __TIME_GOES_HERE__&lt;br/&gt;
  This content is also very expensive to generate.&lt;br/&gt;
&lt;% end %&gt;</pre>
<p>The latter is easier to read and induces less load on the cache backend.</p>
<p>We use content interpolation at Zvents to speed up our <span class="caps">JSON</span> methods. Converting objects to <span class="caps">JSON</span> representation is notoriously slow. Unfortunately, in our application, each <span class="caps">JSON</span> request must return some unique data.  This makes caching tedious because 99% of the content returned is static for a given object, but there’s a little bit of dynamic data that must be sent back in each response.  Using content interpolation, we cache the object in <span class="caps">JSON</span> format and substitute the dynamic values in the view.</p>
<p>This plugin integrates Yan Pritzker’s extension that allows content to be cached with an expiry time (from the memcache_fragments plugin) since they both operate on the same method.  This allows you to do things like:</p>
<pre>&lt;% cache("/only_part", {:expire =&gt; 15.minutes}) do %&gt;
  This content is very expensive to generate, so let's fragment cache it.
&lt;% end %&gt;</pre>
<h3>Bugs, Code and Contributing</h3>
<p>There.s a RubyForge project set up at:</p>
<p><a href="http://rubyforge.org/projects/zventstools/">http://rubyforge.org/projects/zventstools/</a></p>
<p>Anonymous <span class="caps">SVN</span> access:</p>
<p>$ svn checkout svn://rubyforge.org/var/svn/zventstools</p>
<p>-Tyler</p>
No Tags<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=uEi9m6lOeEA:RfMWXBcMJuw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=uEi9m6lOeEA:RfMWXBcMJuw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=uEi9m6lOeEA:RfMWXBcMJuw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=uEi9m6lOeEA:RfMWXBcMJuw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=uEi9m6lOeEA:RfMWXBcMJuw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=uEi9m6lOeEA:RfMWXBcMJuw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?a=uEi9m6lOeEA:RfMWXBcMJuw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Zvents-Developers-Blog?i=uEi9m6lOeEA:RfMWXBcMJuw:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Zvents-Developers-Blog/~4/uEi9m6lOeEA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://developers.zvents.com/2006/general/rails-plugin-extended-fragment-cache/feed/</wfw:commentRss>
		<feedburner:origLink>http://developers.zvents.com/2006/general/rails-plugin-extended-fragment-cache/</feedburner:origLink></item>
	</channel>
</rss>
