<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5753436922335124458</id><updated>2011-12-02T01:33:21.743-08:00</updated><title type='text'>Soo Hwan's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-3144068632576148931</id><published>2011-09-03T03:14:00.000-07:00</published><updated>2011-09-03T03:30:43.532-07:00</updated><title type='text'>Find an installed Ruby Gem contents folder</title><content type='html'>&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; #!/usr/bin/env ruby  &lt;br /&gt; def find_path gem_name  &lt;br /&gt;   `gem list #{gem_name}` =~ /(.*)\s\((.*)\)/  &lt;br /&gt;   version = $2.split(",")[0]  &lt;br /&gt;   "#{Gem.default_dir}/gems/#{gem_name}-#{version}"  &lt;br /&gt; end  &lt;br /&gt; puts find_path ARGV[0]  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-3144068632576148931?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/3144068632576148931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=3144068632576148931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3144068632576148931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3144068632576148931'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/09/find-installed-ruby-gem-contents-folder.html' title='Find an installed Ruby Gem contents folder'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-6899676274660209434</id><published>2011-07-07T16:45:00.000-07:00</published><updated>2011-07-07T16:47:48.606-07:00</updated><title type='text'>CouchDB with Jsonp</title><content type='html'>Download jquery.jsonp.js and ejs.js.&lt;br /&gt;&lt;br /&gt;Templates "list.ejs"&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;ul&amp;gt;  &lt;br /&gt; &amp;lt;% $.each(list, function(i, element) {%&amp;gt;  &lt;br /&gt;   &amp;lt;li&amp;gt;&amp;lt;%=element%&amp;gt;&amp;lt;/li&amp;gt;  &lt;br /&gt; &amp;lt;% }); %&amp;gt;  &lt;br /&gt; &amp;lt;/ul&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;test.html&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;!DOCTYPE html&amp;gt;  &lt;br /&gt; &amp;lt;html&amp;gt;  &lt;br /&gt;  &amp;lt;head&amp;gt;  &lt;br /&gt;   &amp;lt;title&amp;gt;CouchDB Demo&amp;lt;/title&amp;gt;  &lt;br /&gt;   &amp;lt;%= stylesheet_link_tag 'jquery-ui', 'develop_demo' %&amp;gt;  &lt;br /&gt;   &amp;lt;%= javascript_include_tag :defaults, 'jquery.couch', 'jquery.jsonp-2.1.4.min', 'ejs' %&amp;gt;  &lt;br /&gt;   &amp;lt;%= csrf_meta_tag %&amp;gt;  &lt;br /&gt;   &amp;lt;script type="text/javascript" charset="utf-8"&amp;gt;  &lt;br /&gt;   $(document).ready(function() {  &lt;br /&gt;     var url_all_dbs = "http://127.0.0.1:5984/_all_dbs";  &lt;br /&gt;     function all_dbs() {  &lt;br /&gt;       $.jsonp({  &lt;br /&gt;         url: url_all_dbs + "?callback=?",  &lt;br /&gt;         success: function(data) {  &lt;br /&gt;           render_all_dbs(data);  &lt;br /&gt;         }  &lt;br /&gt;       });  &lt;br /&gt;     }  &lt;br /&gt;     function render_all_dbs(data) {  &lt;br /&gt;       var template = new EJS({url: '/templates/list.ejs'})  &lt;br /&gt;       var div_html = template.render({list: data});  &lt;br /&gt;       $("#couch_all_dbs").html(div_html);  &lt;br /&gt;     };  &lt;br /&gt;     all_dbs();  &lt;br /&gt;   });  &lt;br /&gt;   &amp;lt;/script&amp;gt;  &lt;br /&gt;   &amp;lt;/head&amp;gt;  &lt;br /&gt;   &amp;lt;body&amp;gt;  &lt;br /&gt;    &amp;lt;h1&amp;gt;Development Test&amp;lt;/h1&amp;gt;  &lt;br /&gt;    &amp;lt;div id="content"&amp;gt;  &lt;br /&gt;      Content...  &lt;br /&gt;      &amp;lt;h1&amp;gt;all_dbs&amp;lt;/h1&amp;gt;  &lt;br /&gt;      &amp;lt;div id="couch_all_dbs"&amp;gt;&amp;lt;/div&amp;gt;  &lt;br /&gt;    &amp;lt;/div&amp;gt;  &lt;br /&gt;   &amp;lt;/body&amp;gt;  &lt;br /&gt; &amp;lt;/html&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-6899676274660209434?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/6899676274660209434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=6899676274660209434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6899676274660209434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6899676274660209434'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/07/couchdb-with-jsonp.html' title='CouchDB with Jsonp'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-6816594317903665172</id><published>2011-03-24T23:46:00.000-07:00</published><updated>2011-03-24T23:47:47.446-07:00</updated><title type='text'>HTML Audio Tag with Duration</title><content type='html'>Here is the code ..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;html&amp;gt;  &lt;br /&gt;   &amp;lt;header&amp;gt;  &lt;br /&gt;     &amp;lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;     &amp;lt;script&amp;gt;  &lt;br /&gt;     $(document).ready(function(){  &lt;br /&gt;       var audioElement = document.getElementById('audio');  &lt;br /&gt;       audioElement.addEventListener("durationchange", function() {  &lt;br /&gt;         var duration_div = document.getElementById('duration');  &lt;br /&gt;         var duration = parseInt(audioElement.duration);  &lt;br /&gt;         var min = parseInt(duration / 60);  &lt;br /&gt;         var sec = duration % 60;  &lt;br /&gt;         var str = "" + min + ":" + sec;   &lt;br /&gt;         duration_div.innerHTML = str;  &lt;br /&gt;       }, true);  &lt;br /&gt;       audioElement.addEventListener("timeupdate", function() {  &lt;br /&gt;         var current_div = document.getElementById('current');  &lt;br /&gt;         var cur_time = parseInt(audioElement.currentTime);  &lt;br /&gt;         var min = parseInt(cur_time / 60);  &lt;br /&gt;         var sec = cur_time % 60;  &lt;br /&gt;         var str = "" + min + ":" + sec;   &lt;br /&gt;         current_div.innerHTML = str;  &lt;br /&gt;       }, true);  &lt;br /&gt;     });  &lt;br /&gt;     &amp;lt;/script&amp;gt;  &lt;br /&gt;   &amp;lt;/header&amp;gt;  &lt;br /&gt;   &amp;lt;body&amp;gt;  &lt;br /&gt;   &amp;lt;audio id="audio" controls preload="auto" autobuffer&amp;gt;   &lt;br /&gt;     &amp;lt;source src="test.mp3" /&amp;gt;  &lt;br /&gt;   &amp;lt;/audio&amp;gt;  &lt;br /&gt;   &amp;lt;span id="current"&amp;gt;&amp;lt;/span&amp;gt; / &amp;lt;span id="duration"&amp;gt;&amp;lt;/span&amp;gt;  &lt;br /&gt;   &amp;lt;/body&amp;gt;  &lt;br /&gt; &amp;lt;/html&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-6816594317903665172?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/6816594317903665172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=6816594317903665172' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6816594317903665172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6816594317903665172'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/03/html-audio-tag-with-duration.html' title='HTML Audio Tag with Duration'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-3521266015518995959</id><published>2011-02-27T15:38:00.000-08:00</published><updated>2011-02-27T16:31:14.210-08:00</updated><title type='text'>Ruby's mDNS (dnssd)</title><content type='html'>I'd like to have Zero conf services. So, I was looking for those Discovery libraries and found this.. Let's try&lt;br /&gt;&lt;br /&gt;Here is the service side. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; require 'dnssd'  &lt;br /&gt; domains = []  &lt;br /&gt; enumerator = DNSSD.enumerate_domains do |reply|  &lt;br /&gt;  domains &amp;lt;&amp;lt; reply.domain  &lt;br /&gt;  next if reply.flags.more_coming?  &lt;br /&gt;  puts "Found domains:\n#{domains.join "\n"}"  &lt;br /&gt;  break  &lt;br /&gt; end  &lt;br /&gt; DNSSD.register 'agent', '_agent._tcp', nil, 6464  &lt;br /&gt; puts "registered agent at 6464"  &lt;br /&gt; loop do  &lt;br /&gt;   sleep 1  &lt;br /&gt;   puts "agent running.."  &lt;br /&gt; end  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And here is the client side.. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; require 'dnssd'  &lt;br /&gt; browser = DNSSD::Service.new  &lt;br /&gt; puts "Browsing for Agent service"  &lt;br /&gt; browser.browse '_agent._tcp' do |reply|  &lt;br /&gt;   puts "Time: #{Time.new.to_f} reply: #{reply.fullname}"  &lt;br /&gt;   puts reply    &lt;br /&gt;   break  &lt;br /&gt; end   &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Asynchronous Browse and Resolve&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; require 'dnssd'  &lt;br /&gt; require 'socket'  &lt;br /&gt; browser = DNSSD::Service.new  &lt;br /&gt; puts "Browsing for Agent service"  &lt;br /&gt; # Make it Asynchronous ..  &lt;br /&gt; Thread.new do  &lt;br /&gt;  browser.browse '_agent._tcp' do |reply|  &lt;br /&gt;    puts "Time: #{Time.new.to_f} reply: #{reply.fullname}"  &lt;br /&gt;    puts reply.inspect    &lt;br /&gt;    puts reply.service_name  &lt;br /&gt;    target = nil  &lt;br /&gt;    resolver = DNSSD::Service.new  &lt;br /&gt;    resolver.resolve reply do |r|  &lt;br /&gt;     target = r.target  &lt;br /&gt;     puts "#{r.name} on #{r.target}:#{r.port}"  &lt;br /&gt;     # puts "\t#{r.text_record.inspect}" unless r.text_record.empty?  &lt;br /&gt;     break unless r.flags.more_coming?  &lt;br /&gt;    end  &lt;br /&gt;    resolver.stop  &lt;br /&gt;    puts "target: #{target}"  &lt;br /&gt;    addrinfo = Socket.getaddrinfo target, nil, Socket::AF_INET  &lt;br /&gt;    puts "Addresses for #{target}"  &lt;br /&gt;    addrinfo.each do |addr|  &lt;br /&gt;     puts addr.inspect  &lt;br /&gt;    end  &lt;br /&gt;    break  &lt;br /&gt;  end   &lt;br /&gt; end  &lt;br /&gt; sleep 1  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-3521266015518995959?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/3521266015518995959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=3521266015518995959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3521266015518995959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3521266015518995959'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/rubys-mdns-dnssd.html' title='Ruby&apos;s mDNS (dnssd)'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-3585507800452815789</id><published>2011-02-25T00:06:00.000-08:00</published><updated>2011-02-25T00:14:51.241-08:00</updated><title type='text'>Fix EventMachine::PeriodicTimer</title><content type='html'>EventMachine::PeriodicTimer doesn't give an accurate timing. For example, if I add a periodic timer with 1 second interval, in my Mac, it looks like this. &lt;br /&gt;&lt;br /&gt;1. the test code. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; require 'eventmachine'  &lt;br /&gt; puts 'Start'  &lt;br /&gt; EM.run do  &lt;br /&gt;   EM::add_periodic_timer 1.0 do   &lt;br /&gt;     puts "time: #{Time.new.to_f.round(1)}"  &lt;br /&gt;   end  &lt;br /&gt; end  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. output in my MacBook Pro. &lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; time: 1298620726.9  &lt;br /&gt; time: 1298620728.0  &lt;br /&gt; time: 1298620729.1  &lt;br /&gt; time: 1298620730.1  &lt;br /&gt; time: 1298620731.2  &lt;br /&gt; time: 1298620732.3  &lt;br /&gt; time: 1298620733.4  &lt;br /&gt; time: 1298620734.5  &lt;br /&gt; time: 1298620735.5  &lt;br /&gt; time: 1298620736.6  &lt;br /&gt; time: 1298620737.7  &lt;br /&gt; time: 1298620738.8  &lt;br /&gt; time: 1298620739.9  &lt;br /&gt; time: 1298620741.0  &lt;br /&gt; time: 1298620742.0  &lt;br /&gt; time: 1298620743.1  &lt;br /&gt; time: 1298620744.2  &lt;br /&gt; time: 1298620745.3  &lt;br /&gt; time: 1298620746.4  &lt;br /&gt; time: 1298620747.4  &lt;br /&gt; time: 1298620748.5  &lt;br /&gt; time: 1298620749.6  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, it drifted 100ms every time. Which is not very good when you want to do some job every 1 second. You might omit some seconds. So, with using the same method that I used for the Periodic ruby service, I made a change to PeriodicTimer. It looks like this. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; # Override PeriodicTimer  &lt;br /&gt; module EventMachine  &lt;br /&gt;   class PeriodicTimer  &lt;br /&gt;     alias :old_initialize :initialize  &lt;br /&gt;     def initialize interval, callback=nil, &amp;amp;block  &lt;br /&gt;       # Added two additional instance variables to compensate difference.   &lt;br /&gt;       @start = Time.now  &lt;br /&gt;       @fixed_interval = interval  &lt;br /&gt;       old_initialize interval, callback, &amp;amp;block  &lt;br /&gt;     end  &lt;br /&gt;     alias :old_schedule :schedule  &lt;br /&gt;     def schedule  &lt;br /&gt;       # print "Started at #{@start}..: "  &lt;br /&gt;       compensation = (Time.now - @start) % @fixed_interval   &lt;br /&gt;       @interval = @fixed_interval - compensation  &lt;br /&gt;       # Schedule   &lt;br /&gt;       old_schedule  &lt;br /&gt;     end  &lt;br /&gt;   end  &lt;br /&gt; end  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, here is the result (this is not that accurate like the simple ruby service, but reasonably useable. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; time: 1298620683.4  &lt;br /&gt; time: 1298620684.4  &lt;br /&gt; time: 1298620685.4  &lt;br /&gt; time: 1298620686.4  &lt;br /&gt; time: 1298620687.4  &lt;br /&gt; time: 1298620688.4  &lt;br /&gt; time: 1298620689.4  &lt;br /&gt; time: 1298620690.4  &lt;br /&gt; time: 1298620691.3  &lt;br /&gt; time: 1298620692.3  &lt;br /&gt; time: 1298620693.4  &lt;br /&gt; time: 1298620694.4  &lt;br /&gt; time: 1298620695.4  &lt;br /&gt; time: 1298620696.4  &lt;br /&gt; time: 1298620697.4  &lt;br /&gt; time: 1298620698.4  &lt;br /&gt; time: 1298620699.4  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's it. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-3585507800452815789?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/3585507800452815789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=3585507800452815789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3585507800452815789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3585507800452815789'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/fix-eventmachineperiodictimer.html' title='Fix EventMachine::PeriodicTimer'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-5656409033526929143</id><published>2011-02-24T22:41:00.000-08:00</published><updated>2011-02-24T22:49:22.828-08:00</updated><title type='text'>Ruby - Periodic Process</title><content type='html'>Ruby's sleep is not very accurate and Eventmachine's timer is also not very good. So, If you need to process one periodic job with some interval, this approach might be helpful. There is a compensation for sleep and you just need to define your process. &lt;br /&gt;&lt;br /&gt;Here is the Service class. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; class Service  &lt;br /&gt;   def initialize  &lt;br /&gt;     @interval = 1.0  &lt;br /&gt;     @start_time = Time.now   &lt;br /&gt;   end  &lt;br /&gt;   def start   &lt;br /&gt;     # Update the start-time  &lt;br /&gt;     @start_time = Time.now   &lt;br /&gt;     # run loop  &lt;br /&gt;     loop do  &lt;br /&gt;       t_start = Time.now  &lt;br /&gt;       # process the job  &lt;br /&gt;       process  &lt;br /&gt;       elapsed = Time.now - t_start  &lt;br /&gt;       if elapsed &amp;gt; @interval  &lt;br /&gt;         puts "Error: Job is bigger than Interval.. #{elapsed}"  &lt;br /&gt;       end  &lt;br /&gt;       # apply some compensation.   &lt;br /&gt;       compensation = (Time.now - @start_time) % @interval  &lt;br /&gt;       sleep (@interval - compensation)  &lt;br /&gt;     end  &lt;br /&gt;   end  &lt;br /&gt;   def process  &lt;br /&gt;     raise NotImplementedError  &lt;br /&gt;   end  &lt;br /&gt; end  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And then, define your jobs in process method. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; class MyService &amp;lt; Service   &lt;br /&gt;   def initialize  &lt;br /&gt;     super  &lt;br /&gt;     @interval = 2.0  &lt;br /&gt;   end  &lt;br /&gt;   def process  &lt;br /&gt;     puts "time: #{Time.now.to_f.round(3)}"  &lt;br /&gt;     # do the random job .. it takes upto 1.5 seconds.   &lt;br /&gt;     sleep rand(150) * 0.01  &lt;br /&gt;   end  &lt;br /&gt; end  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Try to run it.. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; service = MyService.new  &lt;br /&gt; service.start   &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And you will get a very accurate intervals &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; time: 1298615010.271  &lt;br /&gt; time: 1298615011.271  &lt;br /&gt; time: 1298615012.271  &lt;br /&gt; time: 1298615013.271  &lt;br /&gt; time: 1298615014.271  &lt;br /&gt; time: 1298615015.271  &lt;br /&gt; time: 1298615016.271  &lt;br /&gt; time: 1298615017.271  &lt;br /&gt; time: 1298615018.271  &lt;br /&gt; time: 1298615019.271  &lt;br /&gt; time: 1298615020.271  &lt;br /&gt; time: 1298615021.271  &lt;br /&gt; time: 1298615022.271  &lt;br /&gt; time: 1298615023.271  &lt;br /&gt; time: 1298615024.271  &lt;br /&gt; time: 1298615025.271  &lt;br /&gt; time: 1298615026.271  &lt;br /&gt; time: 1298615027.271  &lt;br /&gt; time: 1298615028.271  &lt;br /&gt; time: 1298615029.271  &lt;br /&gt; time: 1298615030.271  &lt;br /&gt; time: 1298615031.271  &lt;br /&gt; time: 1298615032.271  &lt;br /&gt; time: 1298615033.271  &lt;br /&gt; time: 1298615034.271  &lt;br /&gt; time: 1298615035.271  &lt;br /&gt; time: 1298615036.271  &lt;br /&gt; time: 1298615037.271  &lt;br /&gt; time: 1298615038.271  &lt;br /&gt; time: 1298615039.271  &lt;br /&gt; time: 1298615040.271  &lt;br /&gt; time: 1298615041.271  &lt;br /&gt; time: 1298615042.271  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next time, will try to fix Eventmachine timer..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-5656409033526929143?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/5656409033526929143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=5656409033526929143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/5656409033526929143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/5656409033526929143'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/ruby-periodic-process.html' title='Ruby - Periodic Process'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-8192622568545852301</id><published>2011-02-13T21:23:00.000-08:00</published><updated>2011-02-13T21:25:10.806-08:00</updated><title type='text'>NodeJS - HTTP Request</title><content type='html'>1. GET &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; var http = require('http');  &lt;br /&gt; // GET.   &lt;br /&gt; var options = {  &lt;br /&gt;           host: 'localhost',   &lt;br /&gt;           port: 3000,   &lt;br /&gt;           path: '/user/suwanny'  &lt;br /&gt;      };   &lt;br /&gt; var req = http.get(options, function(res) {  &lt;br /&gt;      console.log("Got response: " + res.statusCode);   &lt;br /&gt;      res.on('data', function(chunk) {  &lt;br /&gt;           console.log("Body: " + chunk);   &lt;br /&gt;      });   &lt;br /&gt; }).on('error', function(e) {  &lt;br /&gt;      console.log("Got error: " + e.message);   &lt;br /&gt; });   &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. POST &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; // POST.   &lt;br /&gt; var http = require('http');&lt;br /&gt; var options = {  &lt;br /&gt;           host: 'localhost',   &lt;br /&gt;           port: 3000,   &lt;br /&gt;           path: '/load/debug',  &lt;br /&gt;           method: 'POST'  &lt;br /&gt;      };   &lt;br /&gt;var req = http.request(options, function(res) {       &lt;br /&gt;      console.log("Got response: " + res.statusCode);   &lt;br /&gt;      console.log('HEADERS: ' + JSON.stringify(res.headers));  &lt;br /&gt;      res.on('data', function(chunk) {  &lt;br /&gt;           console.log("Body: \n" + chunk);   &lt;br /&gt;      });   &lt;br /&gt; });   &lt;br /&gt; req.end();  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-8192622568545852301?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/8192622568545852301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=8192622568545852301' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/8192622568545852301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/8192622568545852301'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/nodejs-http-request.html' title='NodeJS - HTTP Request'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-6652244574189131392</id><published>2011-02-13T17:12:00.000-08:00</published><updated>2011-02-13T17:16:33.278-08:00</updated><title type='text'>NodeJS - Socket.IO</title><content type='html'>1. ex_socketio.js&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; var express = require('express'),   &lt;br /&gt;      server = express.createServer(),  &lt;br /&gt;  io = require('socket.io');  &lt;br /&gt; server.configure(function(){  &lt;br /&gt;      server.use(express.logger());   &lt;br /&gt;      server.use(express.staticProvider(__dirname + '/www/public'));  &lt;br /&gt; });  &lt;br /&gt; server.listen(3000);   &lt;br /&gt; // socket.io   &lt;br /&gt; var socket = io.listen(server),   &lt;br /&gt;      buffer = [];   &lt;br /&gt; socket.on('connection', function(client){   &lt;br /&gt;      client.send({buffer: buffer});   &lt;br /&gt;      client.broadcast({announcement: client.sessionId + ' connected'});  &lt;br /&gt;  // new client is here!   &lt;br /&gt;  client.on('message', function(message){  &lt;br /&gt;           client.send({ message: "got your message: " + message});   &lt;br /&gt;           client.broadcast({ message: client.sessionId + " sent message: " + message});   &lt;br /&gt;      });  &lt;br /&gt;  client.on('disconnect', function(){  &lt;br /&gt;           client.broadcast({announcement: client.sessionId + ' disconnected'});  &lt;br /&gt;      });   &lt;br /&gt; });  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. www/public/index.html &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;html&amp;gt;  &lt;br /&gt;   &amp;lt;head&amp;gt;  &lt;br /&gt;   &amp;lt;title&amp;gt; Test &amp;lt;/title&amp;gt;  &lt;br /&gt;   &amp;lt;script src="/socket.io/socket.io.js"&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;   &amp;lt;/head&amp;gt;  &lt;br /&gt;   &amp;lt;body&amp;gt;  &lt;br /&gt; &amp;lt;h1&amp;gt; Hello NodeJS &amp;lt;/h1&amp;gt;  &lt;br /&gt; &amp;lt;p&amp;gt; This is a static folder &amp;lt;/p&amp;gt;   &lt;br /&gt; &amp;lt;p id="ann"&amp;gt;empty now&amp;lt;/p&amp;gt;  &lt;br /&gt; &amp;lt;p id="chat"&amp;gt;empty now&amp;lt;/p&amp;gt;  &lt;br /&gt;   &amp;lt;script&amp;gt;  &lt;br /&gt;     var socket = new io.Socket(null, {port: 3000});   &lt;br /&gt;     socket.connect();   &lt;br /&gt;     socket.on("message", function(obj) {  &lt;br /&gt;       console.dir(obj);   &lt;br /&gt;       if('buffer' in obj) {  &lt;br /&gt;         document.getElementById('chat').innerHTML = '';  &lt;br /&gt;       }  &lt;br /&gt;       else {  &lt;br /&gt;         if('announcement' in obj)  &lt;br /&gt;           document.getElementById('ann').innerHTML = obj.announcement;   &lt;br /&gt;         else  &lt;br /&gt;           document.getElementById('chat').innerHTML = obj.message;   &lt;br /&gt;       }  &lt;br /&gt;     });   &lt;br /&gt;     socket.send("this is the test message");   &lt;br /&gt;   &amp;lt;/script&amp;gt;  &lt;br /&gt;   &amp;lt;/body&amp;gt;  &lt;br /&gt; &amp;lt;/html&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-6652244574189131392?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/6652244574189131392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=6652244574189131392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6652244574189131392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6652244574189131392'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/nodejs-socketio.html' title='NodeJS - Socket.IO'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-9131601403705503087</id><published>2011-02-13T16:00:00.000-08:00</published><updated>2011-02-13T16:06:40.588-08:00</updated><title type='text'>NodeJS - Express</title><content type='html'>This is an example which uses Express and Ejs with many configuration.&lt;br /&gt;Here is the full guide &lt;a href="http://expressjs.com/guide.html"&gt;http://expressjs.com/guide.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1. Static files ..&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; app.use(express.staticProvider(__dirname + '/www/public')); &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. View files (EJS)&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt;      app.set('views', __dirname + '/www/views');  &lt;br /&gt;     app.set('view engine', 'ejs'); &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;layout.ejs&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;html&amp;gt; &lt;br /&gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;EJS Layout&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt; &lt;br /&gt;&amp;lt;body&amp;gt; &lt;br /&gt;  &amp;lt;%- body %&amp;gt; &lt;br /&gt;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;lt;/html&amp;gt; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;hello.js&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;h1&amp;gt;Hello&amp;lt;/h1&amp;gt; &lt;br /&gt;  &amp;lt;h2&amp;gt;&amp;lt;%= api %&amp;gt;&amp;lt;/h2&amp;gt; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. nodejs application&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; // Production: NODE_ENV=production node ex_express.js &lt;br /&gt;// Development: NODE_ENV=development node ex_express.js &lt;br /&gt;var express = require('express'),  &lt;br /&gt;     app = express.createServer(); &lt;br /&gt;app.configure(function(){ &lt;br /&gt;     app.use(express.logger());  &lt;br /&gt; app.use(express.methodOverride()); &lt;br /&gt; app.use(express.bodyDecoder()); &lt;br /&gt; app.use(app.router); &lt;br /&gt; app.use(express.staticProvider(__dirname + '/www/public')); &lt;br /&gt;     app.set('views', __dirname + '/www/views');  &lt;br /&gt;     app.set('view engine', 'ejs'); &lt;br /&gt;}); &lt;br /&gt;app.configure('development', function(){ &lt;br /&gt; app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); &lt;br /&gt;}); &lt;br /&gt;app.configure('production', function(){ &lt;br /&gt; app.use(express.errorHandler()); &lt;br /&gt;}); &lt;br /&gt;// Application.  &lt;br /&gt;app.get('/user/:id', function(req, res) { &lt;br /&gt;     res.render('hello.ejs', {locals: {"api": "user"}});  &lt;br /&gt;});  &lt;br /&gt;app.post('/load/:mode', function(req, res) { &lt;br /&gt;     // console.dir(req);  &lt;br /&gt;     var body = "&amp;lt;h1&amp;gt;Load&amp;lt;/h1&amp;gt;";  &lt;br /&gt;     body += req.params.mode + "\n" &lt;br /&gt;     body += req.param("workers") + "\n" &lt;br /&gt;     res.send(body);  &lt;br /&gt;}); &lt;br /&gt;app.listen(3000);  &lt;br /&gt;console.log("Public Dir: " + __dirname + '/public');  &lt;br /&gt;console.log("Service Started at " + 3000); &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-9131601403705503087?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/9131601403705503087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=9131601403705503087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/9131601403705503087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/9131601403705503087'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/nodejs-express.html' title='NodeJS - Express'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-7801995479029435356</id><published>2011-02-13T10:02:00.000-08:00</published><updated>2011-02-13T18:41:38.780-08:00</updated><title type='text'>NodeJS- Useful Modules</title><content type='html'>1. express (RESTful routing, http://expressjs.com/ )&lt;br /&gt;http://expressjs.com/guide.html&lt;br /&gt;&lt;br /&gt;High performance, high class web development for Node.js&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; var express = require('express');&lt;br /&gt;var app = express.createServer();&lt;br /&gt;app.get('/', function(req, res){&lt;br /&gt;   res.send('Hello World');&lt;br /&gt;});&lt;br /&gt;app.listen(3000);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Features&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Robust routing&lt;/li&gt;&lt;li&gt;Redirection helpers&lt;/li&gt;&lt;li&gt;Dynamic view helpers&lt;/li&gt;&lt;li&gt;Application level view options&lt;/li&gt;&lt;li&gt;Content negotiation&lt;/li&gt;&lt;li&gt;Focus on high performance&lt;/li&gt;&lt;li&gt;View rendering and partials support&lt;/li&gt;&lt;li&gt;Environment based configuration&lt;/li&gt;&lt;li&gt;Session based flash notifications&lt;/li&gt;&lt;li&gt;Built on Connect&lt;/li&gt;&lt;li&gt;Executable for generating applications quickly&lt;/li&gt;&lt;li&gt;High test coverage&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. socket.io (Websocket)&lt;br /&gt;&lt;a href="http://soohwan.blogspot.com/2011/02/nodejs-socketio.html"&gt;http://soohwan.blogspot.com/2011/02/nodejs-socketio.html&lt;/a&gt;&lt;div&gt;&lt;br /&gt;3. couch_client (CouchDB)&lt;br /&gt;&lt;br /&gt;4. node_redis (redis)&lt;br /&gt;&lt;br /&gt;5. mDNS/Zeroconf/Bonjour (https://github.com/agnat/node_mdns)&lt;br /&gt;Hmm unfortunately this is not useable in my Appliance, so I gave up to use this even though I need this feature.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; npm install mdns &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Service Discovery&lt;br /&gt;&lt;br /&gt;node_mdns – service discovery for node.js&lt;br /&gt;node_mdns adds support for multicast DNS service discovery, also known as zeroconf or bonjour to node.js. It provides an object-oriented interface to announce and browse services on the local network.&lt;br /&gt;&lt;br /&gt;Internally, it uses the mDNSResponder API which is available on all major platforms.&lt;br /&gt;&lt;br /&gt;On Linux and other systems using the avahi daemon the avahi dns_sd compat library and its header files are required.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; var mdns = require('mdns'); &lt;br /&gt;// Browser.  &lt;br /&gt;var browser = mdns.createBrowser('http'); &lt;br /&gt;browser.on('serviceUp', function(info, flags) { &lt;br /&gt;     console.log("up"); &lt;br /&gt;     console.dir(info);  &lt;br /&gt;});  &lt;br /&gt;browser.on('serviceDown', function(info, flags) { &lt;br /&gt;     console.log("down"); &lt;br /&gt;     console.dir(info); &lt;br /&gt;}); &lt;br /&gt;browser.on('serviceChanged', function(info, flags) { &lt;br /&gt;     console.log("changed"); &lt;br /&gt;     console.dir(info); &lt;br /&gt;}); &lt;br /&gt;browser.start();  &lt;br /&gt;// Advertisement.  &lt;br /&gt;// mdns.createAdvertisement('http', 4321).start(); &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;6. msgpack (gave up because it is hard to compile in my centos/mac)&lt;br /&gt;A space-efficient object serialization library for NodeJS&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-7801995479029435356?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/7801995479029435356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=7801995479029435356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7801995479029435356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7801995479029435356'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/nodejs-useful-modules-for-me.html' title='NodeJS- Useful Modules'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-244768253098842159</id><published>2011-02-12T14:31:00.000-08:00</published><updated>2011-02-13T14:49:22.447-08:00</updated><title type='text'>NodeJS- Routing / Redis</title><content type='html'>This is an example for multiple listening ports. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; var http = require('http');  &lt;br /&gt; var connect = require('connect');  &lt;br /&gt; http.createServer(function(request, response) {  &lt;br /&gt;      response.writeHead(200, {'Content-Type': 'text/plain'});  &lt;br /&gt;      response.end('Hello World from 8124\n');  &lt;br /&gt; }).listen(8124);  &lt;br /&gt; var server = connect.createServer(function(req, res) {  &lt;br /&gt;  res.writeHead(200, { 'Content-Type': 'text/plain' });  &lt;br /&gt;  res.end('Hello World from 3000');  &lt;br /&gt; }).listen(3000);  &lt;br /&gt; console.log('Server running at http://127.0.0.1:8124 &amp;amp; 3000');  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Redis Example &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; var redis = require('redis'),  &lt;br /&gt;      redis_client = redis.createClient();   &lt;br /&gt; redis_client.on('error', function(err) {  &lt;br /&gt;      console.log("Error: " + err);  &lt;br /&gt; });   &lt;br /&gt; redis_client.set("Hello", "World", redis.print);  &lt;br /&gt; redis_client.hset("Hash", "field1", "value1", redis.print);  &lt;br /&gt; redis_client.hset(["Hash", "field2", "value2"], redis.print);  &lt;br /&gt; redis_client.hkeys("Hash", function(err, replies) {  &lt;br /&gt;      console.log(replies.length + " replies:");  &lt;br /&gt;      replies.forEach(function(reply, i) {  &lt;br /&gt;           console.log("  " + i + ": " + reply);  &lt;br /&gt;      });  &lt;br /&gt;      // redis_client.quit();   &lt;br /&gt; });   &lt;br /&gt; var instruction = {  &lt;br /&gt;      "id": "test1",  &lt;br /&gt;      "musl": [ "1.mus", "2.mus", "3.mus"],  &lt;br /&gt;      "hosts": {  &lt;br /&gt;           "host_0": "a1",  &lt;br /&gt;           "host_1": "a2"  &lt;br /&gt;      }  &lt;br /&gt; };   &lt;br /&gt;&lt;br /&gt;/// --&amp;gt; this is not supported. (no nested object.)  &lt;br /&gt; redis_client.hmset("Inst1", instruction); &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; redis_client.hgetall("Inst1", function(err, obj) {  &lt;br /&gt;      console.dir(obj);   &lt;br /&gt; });   &lt;br /&gt; var str_instruction = JSON.stringify(instruction);  &lt;br /&gt; console.log("str: " + str_instruction);   &lt;br /&gt; redis_client.set("instruction", str_instruction);   &lt;br /&gt; redis_client.get("instruction", function(err, value) {  &lt;br /&gt;      console.log("get: " + value);   &lt;br /&gt;      console.dir(JSON.parse(value));   &lt;br /&gt; });   &lt;br /&gt; // Publish/Subscribe  &lt;br /&gt; redis_client.on('message', function(channel, message) {  &lt;br /&gt;      console.log("client1 channel " + channel + ": " + message);  &lt;br /&gt; });  &lt;br /&gt; redis_client.subscribe('testengine');   &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. Redis PubSub Example &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; var redis = require("redis"),  &lt;br /&gt;   client1 = redis.createClient(), client2 = redis.createClient(),  &lt;br /&gt;   msg_count = 0;  &lt;br /&gt; client1.on("subscribe", function (channel, count) {  &lt;br /&gt;   client2.publish("a nice channel", "I am sending a message.");  &lt;br /&gt;   client2.publish("a nice channel", "I am sending a second message.");  &lt;br /&gt;   client2.publish("a nice channel", "I am sending my last message.");  &lt;br /&gt; });  &lt;br /&gt; client1.on("message", function (channel, message) {  &lt;br /&gt;   console.log("client1 channel " + channel + ": " + message);  &lt;br /&gt;   msg_count += 1;  &lt;br /&gt;   if (msg_count === 3) {  &lt;br /&gt;     client1.unsubscribe();  &lt;br /&gt;     client1.end();  &lt;br /&gt;     client2.end();  &lt;br /&gt;   }  &lt;br /&gt; });  &lt;br /&gt; client1.incr("did a thing");  &lt;br /&gt; client1.subscribe("a nice channel");  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-244768253098842159?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/244768253098842159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=244768253098842159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/244768253098842159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/244768253098842159'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/node-js-practice-routing-redis.html' title='NodeJS- Routing / Redis'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-4924097607902561570</id><published>2011-02-10T00:14:00.000-08:00</published><updated>2011-02-10T00:20:13.291-08:00</updated><title type='text'>A Simple Bash script to see the login information.</title><content type='html'>This is the script. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; #!/bin/bash  &lt;br /&gt; for user in `ls -al /home | awk '{ print $9 }'`  &lt;br /&gt; do  &lt;br /&gt;   echo $user  &lt;br /&gt;   last -f /var/log/wtmp.1 -1 $user | head -1  &lt;br /&gt;   last -1 $user | head -1  &lt;br /&gt; done  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And, this is the output. &lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; bxxxx  &lt;br /&gt; bxxxx  pts/0    wireless1x............ Thu Jan 27 15:56 - 16:06 (00:09)    &lt;br /&gt; bxxxx  pts/0    wireless1x-15-20 Tue Feb 1 11:44 - 12:19 (00:35)   &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-4924097607902561570?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/4924097607902561570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=4924097607902561570' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/4924097607902561570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/4924097607902561570'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/simple-bash-to-see-login-information.html' title='A Simple Bash script to see the login information.'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-7758662461945469586</id><published>2011-02-08T01:04:00.000-08:00</published><updated>2011-02-09T22:14:31.833-08:00</updated><title type='text'>CouchDB - Practice 01</title><content type='html'>With Curl&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; curl http://127.0.0.1:5984/  &lt;br /&gt; curl -X GET http://127.0.0.1:5984/_all_dbs  &lt;br /&gt; curl -X PUT http://127.0.0.1:5984/baseball  &lt;br /&gt; curl -X PUT http://127.0.0.1:5984/plankton&lt;br /&gt; curl -X DELETE http://127.0.0.1:5984/plankton&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-7758662461945469586?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/7758662461945469586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=7758662461945469586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7758662461945469586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7758662461945469586'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/couchdb-practice-01.html' title='CouchDB - Practice 01'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-1994080944601490607</id><published>2011-02-07T12:05:00.000-08:00</published><updated>2011-02-07T12:27:30.438-08:00</updated><title type='text'>Javascript MVC</title><content type='html'>This a practice to use Javascript MVC.&lt;br /&gt;&lt;br /&gt;1. Download javascriptmvc from http://www.javascriptmvc.com/.&lt;br /&gt;&lt;br /&gt;2. Move/Unzip and cd to your jmvc folder&lt;br /&gt;&lt;br /&gt;3. Updates every sub libraries.&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt;  ./js documentjs/update&lt;br /&gt;./js funcunit/update&lt;br /&gt;./js jquery/update&lt;br /&gt;./js steal/update&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4. Generates your app&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; ./js jquery/generate/app cookbook&lt;br /&gt;   cookbook/cookbook.css&lt;br /&gt;   cookbook/cookbook.html&lt;br /&gt;   cookbook/cookbook.js&lt;br /&gt;   cookbook/controllers&lt;br /&gt;   cookbook/docs&lt;br /&gt;   cookbook/fixtures&lt;br /&gt;   cookbook/funcunit.html&lt;br /&gt;   cookbook/models&lt;br /&gt;   cookbook/qunit.html&lt;br /&gt;   cookbook/resources&lt;br /&gt;   cookbook/scripts&lt;br /&gt;   cookbook/scripts/build.html&lt;br /&gt;   cookbook/scripts/build.js&lt;br /&gt;   cookbook/scripts/clean.js&lt;br /&gt;   cookbook/scripts/docs.js&lt;br /&gt;   cookbook/test&lt;br /&gt;   cookbook/test/funcunit&lt;br /&gt;   cookbook/test/funcunit/cookbook_test.js&lt;br /&gt;   cookbook/test/funcunit/funcunit.js&lt;br /&gt;   cookbook/test/qunit&lt;br /&gt;   cookbook/test/qunit/cookbook_test.js&lt;br /&gt;   cookbook/test/qunit/qunit.js&lt;br /&gt;   cookbook/views&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5. Make a Create-Read-Update-Delete (CRUD) scaffold.&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; $ ./js jquery/generate/scaffold Cookbook.Models.Recipe &lt;br /&gt;  cookbook/controllers&lt;br /&gt;  cookbook/controllers/recipe_controller.js&lt;br /&gt;  cookbook/fixtures&lt;br /&gt;  cookbook/fixtures/recipes.json.get&lt;br /&gt;  cookbook/models&lt;br /&gt;  cookbook/models/recipe.js&lt;br /&gt;  cookbook/test&lt;br /&gt;  cookbook/test/funcunit&lt;br /&gt;  cookbook/test/funcunit/recipe_controller_test.js&lt;br /&gt;  cookbook/test/qunit&lt;br /&gt;  cookbook/test/qunit/recipe_test.js&lt;br /&gt;  cookbook/views&lt;br /&gt;  cookbook/views/recipe&lt;br /&gt;  cookbook/views/recipe/edit.ejs&lt;br /&gt;  cookbook/views/recipe/init.ejs&lt;br /&gt;  cookbook/views/recipe/list.ejs&lt;br /&gt;  cookbook/views/recipe/show.ejs&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span class="Apple-style-span"   style="  ;font-family:sans-serif, 'Trebuchet MS', Verdana, Helvetica, Arial;font-size:medium;"&gt;&lt;p&gt;Here's what each part does:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;dl style="margin-top: 13px; margin-right: 13px; margin-bottom: 13px; margin-left: 13px; "&gt;&lt;dt&gt;&lt;code&gt;recipe_controller.js&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Cookbook.Controllers.Recipe, like all &lt;a href="http://www.javascriptmvc.com/docs/getstarted.html#&amp;amp;who=jQuery.Controller"&gt;Controllers&lt;/a&gt;, respond to events such as click and manipulate the DOM.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;edit.ejs,init.ejs,list.ejs,show.ejs&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href="http://www.javascriptmvc.com/docs/getstarted.html#&amp;amp;who=jQuery.View"&gt;Views&lt;/a&gt; are JavaScript templates for easily creating HTML.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;recipe_controller_test.js&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href="http://www.javascriptmvc.com/docs/getstarted.html#&amp;amp;who=FuncUnit"&gt;Tests&lt;/a&gt; the CRUD functionality of the user interface.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;recipe.js&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Cookbook.Models.Recipe &lt;a href="http://www.javascriptmvc.com/docs/getstarted.html#&amp;amp;who=jQuery.Model"&gt;model&lt;/a&gt; performs AJAX requests by manipulating services.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;recipes.get&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href="http://www.javascriptmvc.com/docs/getstarted.html#&amp;amp;who=jQuery.fixture"&gt;Fixtures&lt;/a&gt; simulate AJAX responses. This fixture responds to GET '/recipes'.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;recipe_test.js&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;A &lt;a href="http://www.javascriptmvc.com/docs/getstarted.html#&amp;amp;who=FuncUnit"&gt;unit test&lt;/a&gt; that tests Recipe model.&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/span&gt;&lt;br /&gt;6. Including Scripts &lt;br /&gt;After generating the scaffolding files, you must steal them in your application file. Open cookbook/cookbook.js and modify the code to steal your recipe controller and model as follows:&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; steal.plugins(    &lt;br /&gt;   'jquery/controller',        &lt;br /&gt;   'jquery/controller/subscribe',   &lt;br /&gt;   'jquery/view/ejs',   &lt;br /&gt;   'jquery/controller/view',        &lt;br /&gt;   'jquery/model',           &lt;br /&gt;   'jquery/dom/fixture',        &lt;br /&gt;   'jquery/dom/form_params')      &lt;br /&gt;   .css('cookbook')    &lt;br /&gt;   .resources()            &lt;br /&gt;   .models('recipe')              &lt;br /&gt;   .controllers('recipe')           &lt;br /&gt;   .views();  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;cookbook/test/qunit/qunits.js&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; steal  &lt;br /&gt;  .plugins("funcunit/qunit", "cookbook")  &lt;br /&gt;  .then("cookbook_test","recipe_test")  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;cookbook/test/funcunit/funcunit.js&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; steal  &lt;br /&gt;  .plugins("funcunit")  &lt;br /&gt;  .then("cookbook_test","recipe_controller_test")  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;7. That's it. open cookbook/cookbook.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-1994080944601490607?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/1994080944601490607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=1994080944601490607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1994080944601490607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1994080944601490607'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/javascript-mvc.html' title='Javascript MVC'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-2998098354296577849</id><published>2011-02-03T19:42:00.000-08:00</published><updated>2011-02-03T22:24:52.946-08:00</updated><title type='text'>CSS tutorial</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Syntax&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Two main parts:&lt;br /&gt;- A selector&lt;br /&gt;- Declarations&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; selector   declarations   &lt;br /&gt; h1 {color: blue; font-size:12px; }  &lt;br /&gt; p {color:red;text-align:center;}  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Selectors&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;1. ID selector&lt;br /&gt;The id selector uses the id attribute of the HTML element, and is defined with a "#". The style rule below will be applied to the element with id="para1":&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; #para1  &lt;br /&gt; {  &lt;br /&gt; text-align:center;  &lt;br /&gt; color:red;  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Class Selector &lt;br /&gt;&lt;br /&gt;The class selector is used to specify a style for a group of elements. Unlike the id selector, the class selector is most often used on several elements. This allows you to set a particular style for any HTML elements with the same class. The class selector uses the HTML class attribute, and is defined with a "."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-2998098354296577849?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/2998098354296577849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=2998098354296577849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/2998098354296577849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/2998098354296577849'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/css-tutorial.html' title='CSS tutorial'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-7718413480657399385</id><published>2011-02-02T23:02:00.000-08:00</published><updated>2011-02-04T09:51:30.929-08:00</updated><title type='text'>Studying jQuery</title><content type='html'>I'm reading Essential JavaScript &amp;amp; jQuery Design Patterns by Addy Osmani. He and many other gurus mentioned about "A Pattern Language". Should I read the book? It was published in 1977. Sounds old, but still referred. It means it's kind of Bible and people are interested "Pattern". I don't know how they are related. There is the main and most important book, "Design Patterns: Elements of Reusable Object-Oriented Software", which introduced and made "Design Patterns" popular to the world. It defines 23 core Object-Oriented design patterns. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Addy talked about Design Patterns in jQuery and Javascript. Here are Lists. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;jQuery&lt;/b&gt; &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Lazy Initialization&lt;/li&gt;&lt;li&gt;Composite &lt;/li&gt;&lt;li&gt;Wrapper&lt;/li&gt;&lt;li&gt;Facade&lt;/li&gt;&lt;li&gt;Observer&lt;/li&gt;&lt;li&gt;Iterator&lt;/li&gt;&lt;li&gt;Strategy&lt;/li&gt;&lt;li&gt;Proxy&lt;/li&gt;&lt;li&gt;Builder&lt;/li&gt;&lt;li&gt;Prototype&lt;/li&gt;&lt;li&gt;Flyweight&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Javascript&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Creational &lt;/li&gt;&lt;li&gt;Constructor&lt;/li&gt;&lt;li&gt;Singleton&lt;/li&gt;&lt;li&gt;Module&lt;/li&gt;&lt;li&gt;Revealing Module&lt;/li&gt;&lt;li&gt;Prototype&lt;/li&gt;&lt;li&gt;DRY&lt;/li&gt;&lt;li&gt;Facade&lt;/li&gt;&lt;li&gt;Factory&lt;/li&gt;&lt;li&gt;Decorator&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;What is a pattern? &lt;/div&gt;&lt;/div&gt;&lt;div&gt;A: A pattern is a reusable solution that can be applied to commonly occurring problems in software design.  There are three main benefits from Design Patterns. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Patterns are proven solutions. &lt;/div&gt;&lt;div&gt;2. Patterns can be easily re-used. &lt;/div&gt;&lt;div&gt;3. Patterns can be expressive. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, Patterns are NOT an exact solution. It provides an idea and prototype. It can be building blocks and you can customize it for your project. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Reusing patterns assists in preventing minor issues that can cause major problems in the application development process". - So, you can focus on your problem more. These days nobody starts from the scratch unless it is required. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Patterns can provide &lt;b&gt;generalized solutions&lt;/b&gt; which are documented in a fashion that doesn't require them to be tied to a specific problem." &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Certain patterns can actually decrease the overall file-size footprint of your code by &lt;b&gt;avoiding repetition&lt;/b&gt;." - DRY (Don't Repeat Yourself) &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A Good Pattern does these. &lt;/div&gt;&lt;div&gt;- Solves a particular problem. &lt;/div&gt;&lt;div&gt;- The solution to this problem cannot be obvious. &lt;/div&gt;&lt;div&gt;- The concept described must have been proven. &lt;/div&gt;&lt;div&gt;- It must describe a relationship. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is the rule of three for a valid pattern. &lt;/div&gt;&lt;div&gt;1. Fitness of purpose. - How? &lt;/div&gt;&lt;div&gt;2. Usefulness. - Why?&lt;/div&gt;&lt;div&gt;3. Applicability. - Wide? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;----&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The structure of a design pattern. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A design pattern must have a &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Pattern Name and a description&lt;/li&gt;&lt;li&gt;Context outline&lt;/li&gt;&lt;li&gt;Problem Statement&lt;/li&gt;&lt;li&gt;Solution&lt;/li&gt;&lt;li&gt;Design &lt;/li&gt;&lt;li&gt;Implementation&lt;/li&gt;&lt;li&gt;Illustrations.&lt;/li&gt;&lt;li&gt;Examples&lt;/li&gt;&lt;li&gt;Co-requisites&lt;/li&gt;&lt;li&gt;Relations&lt;/li&gt;&lt;li&gt;Known usage&lt;/li&gt;&lt;li&gt;Discussions&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Writing Design Patterns &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Bare in mind practicability&lt;/li&gt;&lt;li&gt;Ensure that you draw upon best practices.&lt;/li&gt;&lt;li&gt;Your design patterns should be transparent to the user. &lt;/li&gt;&lt;li&gt;Remember that originality is not key in pattern design.&lt;/li&gt;&lt;li&gt;Know the differences between patterns and design. &lt;/li&gt;&lt;li&gt;Your pattern needs to have a strong set of examples. &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-7718413480657399385?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/7718413480657399385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=7718413480657399385' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7718413480657399385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7718413480657399385'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2011/02/studying-jquery.html' title='Studying jQuery'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-3297897900037842238</id><published>2009-07-28T22:18:00.000-07:00</published><updated>2009-07-28T22:21:11.430-07:00</updated><title type='text'>Installing Zope and Plone from source on Ubuntu in 10 easy steps</title><content type='html'>&lt;span class="Apple-style-span"   style="  ;font-family:'lucida grande';font-size:12px;"&gt;&lt;h2 class="entry-title"   style=" font-weight: normal; letter-spacing: -1.5px;  margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 29px; font-family:georgia, constantia, times, serif;font-size:2.5em;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;from : &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;a href="http://www.paolocorti.net/2008/01/02/installing-zope-and-plone-from-source-on-ubuntu-in-10-easy-steps/"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;http://www.paolocorti.net/2008/01/02/installing-zope-and-plone-from-source-on-ubuntu-in-10-easy-steps/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 class="entry-title"   style=" font-weight: normal; letter-spacing: -1.5px;  margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 29px; font-family:georgia, constantia, times, serif;font-size:2.5em;"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;b&gt;Installing Zope and Plone from source on Ubuntu in 10 easy steps&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;Posted by Paolo Corti&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt; on January 2, 2008&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'trebuchet ms';font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'trebuchet ms';font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande'; font-size: 12px; "&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;Here are my notes for installing &lt;a title="Zope" href="http://zope.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/zope.org');" style="color: rgb(0, 0, 0); "&gt;Zope&lt;/a&gt; and &lt;a title="Plone" href="http://plone.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/plone.org');" style="color: rgb(0, 0, 0); "&gt;Plone&lt;/a&gt; from source in &lt;a title="Ubuntu" href="http://www.ubuntu.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.ubuntu.com');" style="color: rgb(0, 0, 0); "&gt;Ubuntu&lt;/a&gt;. I took this notes installing on 7.10 (Gutsy) but should work without problems for earlier Ubuntu versions, and for other Linux platforms&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-1- install libraries needed for build (build-essential) and Zope&lt;/strong&gt;&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo apt-get install build-essential python2.4-dev python-lxml python-elementtree python-imaging&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-2- download zope 2.10.5 and plone 3.0.4&lt;/strong&gt;&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;wget https://launchpad.net/plone/3.0/3.0.4/+download/Plone-3.0.4.tar.gz wget http://www.zope.org/Products/Zope/2.10.5/Zope-2.10.5-final.tgz&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;span id="more-72"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-3- unzip the downloaded files&lt;/strong&gt;&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;tar -xvzf Zope-2.10.5-final.tgz tar -xvzf Plone-3.0.4.tar.gz&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-4- create the makefile and set the prefix&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;cd Zope-2.10.5-final&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;way1:&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;./configure gedit makefile  and set  prefix=/opt/Zope-2.10.5&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;or way2 (simpler):&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt; ./configure --prefix=/opt/Zope-2.10.5&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-5- Install Zope (at the location set in prefix)&lt;/strong&gt;&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo make install&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-6- create an user for zope&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;not run as suggested: “Now run ‘/opt/Zope-2.10.5/bin/mkzopeinstance.py’” but create an user for zope&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo adduser zope&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-7- create one ore more Zope instances (here we will create just one single instance)&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;create a directory where to place each Zope instance&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo mkdir /srv/zope/inst_2_10_5&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;give to this directory ownership to zope user:&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo chown zope.zope /srv/zope/inst_2_10_5&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;run mkzopeinstance.py as the zope user:&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo su zope /opt/Zope-2.10.5/bin/mkzopeinstance.py Directory: /srv/zope/inst_2_10_5 Username: admin Password: ****&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-8- Run Zope and test Zope installation&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;If you want to run Zope on a port different from 8080:&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo gedit /srv/zope/inst_2_10_5/etc/zope.conf&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;go to server directive:&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="xml" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;&lt;span style="color: rgb(0, 153, 0); "&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold; "&gt;&lt;http-server&lt;span style="color: rgb(0, 0, 0); font-weight: bold; "&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;   # valid keys are "address" and "force-connection-close"   address 8080   # force-connection-close on &lt;span style="color: rgb(0, 153, 0); "&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold; "&gt;&lt;/http-server&lt;span style="color: rgb(0, 0, 0); font-weight: bold; "&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;and change 8080 to whatever port you want to run the Zope process&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;Now let’s start Zope: you need to run the Zope instance as the zope user&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo su zope /srv/zope/inst_2_10_5/bin/zopectl fg&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;fg is the foreground option for the Zope process. Without using it you will enter an interactive mode, where you can directly send commands (like start, stop, fg, debug).&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;Now if you go to the address: http://localhost:8080 (change 8080 to the port you are running the Zope process) you will be promptet for the user and password of the administrative user of ZMI.&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;Now to stop the zope fg process (in order to install Plone) just type ctrl+Z and kill the &lt;a title="python" href="http://www.python.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.python.org');" style="color: rgb(0, 0, 0); "&gt;python&lt;/a&gt; process:&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo killall -9 python2.4&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-9- Install Plone&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;9.a) For Plone 3.x&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;Copy Plone products and Python libs to the zope instance (products directory, base Zope is without products)&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo cp -r Plone-3.0.4/Products/* /srv/zope/inst_2_10_5/Products/ sudo cp -r Plone-3.0.4/lib/python/* /srv/zope/inst_2_10_5/lib/python/&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;give permission to zope user:&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo chown -R zope.zope /srv/zope/inst_2_10_5&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;9.b) For Plone 2.x&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;you just need to copy the Plone products&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;sudo cp -r Plone-3.0.4/* /srv/zope/inst_plone2/Products/&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;note: for any Plone (2.x, 3.x) if you copy the Products under the /opt/Zope-2.10.5/skell/Products directory, each instance that will be created will already have all the products. Same thing for the lib/python directory.&lt;br /&gt;Or, if you copy the products in /opt/Zope-2.10.5/lib/python/Products directory, all the zope instances will use that directory without copying them in each instance.&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-10- Run Zope and test Plone&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;Now if you run the Zope process and you go to the address: http://localhost:8080 (change 8080 to the port you are running the Zope process) you will access the ZMI.&lt;br /&gt;There you will create your first Plone site (by selecting “Plone Site” and then clicking the “add” button)&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;If you named the Plone Site “test” then you can go there by typing on the browser: http://localhost:8080/test. You are now on a new ajaxifed Plone 3.0 web site: congrats!&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;&lt;strong&gt;-extra step- debugging Zope&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;Run zope without the fg option and enter in the debug command prompt:&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;/srv/zope/inst_2_10_5/bin/zopectl zopectl&gt; start --will start zope zopectl&gt; debug --will debug zope zopectl&gt; stop --will stop zope&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="margin-top: 1.2em; margin-right: 0px; margin-bottom: 1.2em; margin-left: 0px; "&gt;Now under the Python shell you can debug Zope (and Plone). To exit from debug type ctrl+d.&lt;/p&gt;&lt;div class="wp_syntax" style="color: rgb(17, 0, 0); background-color: rgb(249, 249, 249); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 662px; "&gt;&lt;div class="code" style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "&gt;&lt;pre class="text" style="margin-top: 0.9em; margin-right: 0px; margin-bottom: 0.9em; margin-left: 0px; width: auto; float: none; clear: none; overflow-x: auto; overflow-y: auto; font-size: 12px; line-height: 1.333; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); font: normal normal normal 1em/normal 'bitstream vera sans mono', monaco, 'lucida console', 'courier new', courier, serif; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; font-family: monospace; background-position: initial initial; "&gt;&gt;&gt;&gt; dir() ....many resources &gt;&gt;&gt; dir(app) ...many resources &gt;&gt;&gt; dir(app.test) --if you named your Plone site as "test" &gt;&gt;&gt; print app.test &lt;plonesite&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-3297897900037842238?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/3297897900037842238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=3297897900037842238' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3297897900037842238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3297897900037842238'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/07/installing-zope-and-plone-from-source.html' title='Installing Zope and Plone from source on Ubuntu in 10 easy steps'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-6713951433645402531</id><published>2009-07-17T11:56:00.000-07:00</published><updated>2009-07-17T11:58:37.242-07:00</updated><title type='text'>Transactional Datastore</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; "&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px; line-height: 19px; "&gt;&lt;h1 id="tochome0" style="font-weight: bold; padding-top: 5px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 1.5em; "&gt;&lt;a class="wiki_link_ext" href="http://sourceforge.net/projects/chordless/" rel="nofollow" style="text-decoration: none; color: rgb(0, 51, 204); background-image: url(http://www.wiki.sourceforge.net/i/a.gif); background-repeat: no-repeat; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; padding-right: 10px; background-position: 100% 50%; "&gt;Chordless&lt;/a&gt;&lt;/h1&gt;&lt;div&gt;(&lt;a href="http://chordless.wiki.sourceforge.net/"&gt;http://chordless.wiki.sourceforge.net/&lt;/a&gt;Chordless is on the lowest level a distributed hash table modeled on &lt;a class="wiki_link_ext" href="http://pdos.csail.mit.edu/chord/" rel="nofollow" style="text-decoration: none; color: rgb(0, 51, 204); background-image: url(http://www.wiki.sourceforge.net/i/a.gif); background-repeat: no-repeat; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; padding-right: 10px; background-position: 100% 50%; "&gt;Chord and DHash&lt;/a&gt;.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;It implements most features talked about in &lt;a class="wiki_link_ext" href="http://pdos.csail.mit.edu/papers/chord:cates-meng.pdf" rel="nofollow" style="text-decoration: none; color: rgb(0, 51, 204); background-image: url(http://www.wiki.sourceforge.net/i/a.gif); background-repeat: no-repeat; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; padding-right: 10px; background-position: 100% 50%; "&gt;Robust and Efficient Data Management for a Distributed Hash Table&lt;/a&gt; and &lt;a class="wiki_link_ext" href="http://pdos.csail.mit.edu/chord/papers/paper-ton.pdf" rel="nofollow" style="text-decoration: none; color: rgb(0, 51, 204); background-image: url(http://www.wiki.sourceforge.net/i/a.gif); background-repeat: no-repeat; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; padding-right: 10px; background-position: 100% 50%; "&gt;Chord: A Scalable Peer-to-peer Lookup Protocol for Internet Applications&lt;/a&gt; with a few exceptions (mostly the lack of &lt;a class="wiki_link_ext" href="http://en.wikipedia.org/wiki/Erasure_codes" rel="nofollow" style="text-decoration: none; color: rgb(0, 51, 204); background-image: url(http://www.wiki.sourceforge.net/i/a.gif); background-repeat: no-repeat; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; padding-right: 10px; background-position: 100% 50%; "&gt;erasure codes&lt;/a&gt; for storage - if those interest you, look at &lt;a class="wiki_link_ext" href="http://rubyforge.org/projects/archipelago" rel="nofollow" style="text-decoration: none; color: rgb(0, 51, 153); background-image: url(http://www.wiki.sourceforge.net/i/a.gif); background-repeat: no-repeat; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; padding-right: 10px; background-position: 100% 50%; "&gt;archipelago&lt;/a&gt;, where the rubygem oneliner is a C/ruby implementation of &lt;a class="wiki_link_ext" href="http://en.wikipedia.org/wiki/Online_codes" rel="nofollow" style="text-decoration: none; color: rgb(0, 51, 204); background-image: url(http://www.wiki.sourceforge.net/i/a.gif); background-repeat: no-repeat; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; padding-right: 10px; background-position: 100% 50%; "&gt;online codes&lt;/a&gt;) and a few extras such as support for ACID transactions, remote execution, scalable data structures and a nifty graphical user interface.&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: 16px; line-height: normal; "&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px; "&gt;&lt;div id="pname" style="font-size: 24px; font-weight: bold; margin-top: 0px; margin-right: 0px; margin-bottom: -3px; margin-left: 0px; "&gt;&lt;a href="http://code.google.com/p/scalaris/" style="text-decoration: none; color: rgb(0, 0, 0); "&gt;scalaris&lt;/a&gt;&lt;/div&gt;&lt;div id="psum" style="font-style: italic; margin-top: 3px; "&gt;&lt;i&gt;&lt;a id="project_summary_link" href="http://code.google.com/p/scalaris/" style="text-decoration: none; color: rgb(0, 0, 0); "&gt;Distributed Transactional Key-Value Store&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: 16px; line-height: normal; "&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: 13px; "&gt;&lt;h3 style="font-size: medium; background-image: none; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; border-top-width: 0px; border-top-style: solid; border-top-color: rgb(51, 102, 204); padding-top: 0.5ex; padding-right: 0.5em; padding-bottom: 0.5ex; padding-left: 0px; margin-right: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;a name="Scalaris_is_a_distributed_key-value_store."&gt;Scalaris is a distributed key-value store.&lt;/a&gt;&lt;/h3&gt;&lt;a name="Scalaris_is_a_distributed_key-value_store."&gt;&lt;p style="max-width: 65em; "&gt;Scalaris is a scalable, transactional, distributed key-value store. It can be used for building scalable Web 2.0 services.&lt;/p&gt;&lt;p style="max-width: 65em; "&gt;Scalaris uses a structured overlay with a non-blocking Paxos commit protocol for transaction processing with strong consistency over replicas. Scalaris is implemented in Erlang.&lt;/p&gt;&lt;/a&gt;&lt;p style="max-width: 65em; "&gt;&lt;a name="Scalaris_is_a_distributed_key-value_store."&gt;Mailing list: &lt;/a&gt;&lt;a href="http://groups.google.com/group/scalaris" rel="nofollow" style="color: rgb(0, 0, 204); "&gt;http://groups.google.com/group/scalaris&lt;/a&gt;&lt;/p&gt;&lt;p style="max-width: 65em; "&gt;Documentation:&lt;/p&gt;&lt;ul style="max-width: 65em; padding-left: 40px; "&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/scalaris/wiki/GettingStarted" style="color: rgb(0, 0, 204); "&gt;GettingStarted&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/scalaris/wiki/APIs" style="color: rgb(0, 0, 204); "&gt;APIs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/scalaris/wiki/FAQ" style="color: rgb(0, 0, 204); "&gt;FAQ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Users and developers guide in the SVN: trunk/user-dev-guide/main.pdf&lt;/li&gt;&lt;/ul&gt;&lt;p style="max-width: 65em; "&gt;&lt;/p&gt;&lt;p style="max-width: 65em; "&gt;Related projects:&lt;/p&gt;&lt;ul style="max-width: 65em; padding-left: 40px; "&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/mochiweb-scalaris/" rel="nofollow" style="color: rgb(0, 0, 204); "&gt;http://code.google.com/p/mochiweb-scalaris/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="max-width: 65em; "&gt;The Scalaris project was initiated by Zuse Institute Berlin and onScale solutions GmbH and is partly funded by the EU projects Selfman and XtreemOS. More information (papers, videos) can be found at &lt;a href="http://www.zib.de/CSR/Projects/scalaris" rel="nofollow" style="color: rgb(0, 0, 204); "&gt;http://www.zib.de/CSR/Projects/scalaris&lt;/a&gt; and &lt;a href="http://www.onscale.de/scalaris.html" rel="nofollow" style="color: rgb(0, 0, 204); "&gt;http://www.onscale.de/scalaris.html&lt;/a&gt;.&lt;/p&gt;&lt;p style="max-width: 65em; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="max-width: 65em; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-6713951433645402531?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/6713951433645402531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=6713951433645402531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6713951433645402531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6713951433645402531'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/07/transactional-datastore.html' title='Transactional Datastore'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-4705500702551894004</id><published>2009-07-06T16:31:00.001-07:00</published><updated>2009-07-06T16:32:56.358-07:00</updated><title type='text'>Using JConsole to Monitor Applications</title><content type='html'>&lt;span class="Apple-style-span"  style=" ;font-family:'times new roman';"&gt;&lt;span class="Apple-style-span"   style="font-family:Arial;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: 16px; "&gt;&lt;div style="background-color: white; "&gt;&lt;h1 style="font-family: Arial, Helvetica, sans-serif; text-align: center; "&gt;Using jconsole&lt;/h1&gt;&lt;p style="margin-left: 0.5in; "&gt;Jconsole is a JMX-compliant monitoring tool.  It uses the extensive JMX instrumentation of the Java virtual machine to provide information on performance and resource consumption of applications running on the Java platform.&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#starting"&gt;Starting jconsole&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#interface"&gt;The jconsole interface&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#summary"&gt;Viewing summary information&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#memory"&gt;Monitoring Memory Consumption&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#thread"&gt;Monitoring Thread Use&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#class_loading"&gt;Monitoring Class Loading&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#MBeans"&gt;Monitoring and Managing MBeans&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#VM"&gt;Viewing VM Information&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html"&gt;Frequently Asked Questions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style="font-family: Arial, Helvetica, sans-serif; "&gt;&lt;a name="starting" id="starting"&gt;&lt;/a&gt;Starting jconsole&lt;/h2&gt;&lt;p style="margin-left: 0.5in; "&gt;The &lt;code&gt;jconsole&lt;/code&gt; executable is in &lt;code&gt;&lt;i&gt;JDK_HOME&lt;/i&gt;/bin&lt;/code&gt;, where &lt;i&gt;&lt;code&gt;JDK_HOME&lt;/code&gt;&lt;/i&gt; is the directory where the JDK is installed.  If this directory is on your system path, you can start the tool by simply typing &lt;code&gt;jconsole&lt;/code&gt;in a command (shell) prompt. Otherwise, you have to type the full path to the executable file.&lt;/p&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Command Syntax&lt;/h3&gt;&lt;p style="margin-left: 0.5in; "&gt;You can use jconsole to monitor both local applications (those running on the same system as &lt;code&gt;jconsole&lt;/code&gt;) and remote applications (those running on other systems). &lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;b&gt;Note&lt;/b&gt;: Using &lt;code&gt;jconsole&lt;/code&gt; to monitor a local application is useful for development and prototyping, but is not recommended for production environments, because &lt;code&gt;jconsole&lt;/code&gt; itself consumes significant system resources. Remote monitoring is recommended to isolate the &lt;code&gt;jconsole&lt;/code&gt; application from the platform being monitored.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;For a complete reference on &lt;code&gt;jconsole&lt;/code&gt; command syntax, see &lt;a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jconsole.html"&gt;jconsole - Java Monitoring and Management Console&lt;/a&gt;.&lt;/p&gt;&lt;h4 style="font-family: Arial, Helvetica, sans-serif; font-style: italic; margin-left: 0.5in; "&gt;Local Monitoring&lt;/h4&gt;&lt;p style="margin-left: 0.5in; "&gt;To monitor a local application, it must be running with the same user ID as &lt;code&gt;jconsole&lt;/code&gt;.  The command syntax to start &lt;code&gt;jconsole&lt;/code&gt; for local monitoring is:&lt;/p&gt;&lt;pre style="margin-left: 0.75in; "&gt;jconsole [&lt;i&gt;processID&lt;/i&gt;]&lt;/pre&gt;&lt;p style="margin-left: 0.5in; "&gt;where &lt;i&gt;processID&lt;/i&gt; is the application's process ID (PID). To determine an application's PID:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;On Unix or Linux systems, use the &lt;code&gt;ps&lt;/code&gt; command to find the PID of &lt;b&gt;java&lt;/b&gt;.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;On Windows systems, use Task Manager to find the PID of &lt;b&gt;java&lt;/b&gt; or &lt;b&gt;javaw&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-left: 0.5in; "&gt;You can also use the &lt;a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html"&gt;jps&lt;/a&gt; command-line utility to determine PIDs.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;For example, if you determined that the process ID of the &lt;i&gt;Notepad&lt;/i&gt; application is 2956, then you would start jconsole as follows:&lt;/p&gt;&lt;pre style="margin-left: 0.75in; "&gt;jconsole 2956&lt;/pre&gt;&lt;p style="margin-left: 0.5in; "&gt;Both &lt;code&gt;jconsole&lt;/code&gt; and the application must by executed by the same user name. The management and monitoring system uses the operating system's file permissions.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;If  you don't specify a process ID, jconsole will automatically detect all local Java applications, and display a dialog box that lets you select the one you want to monitor (see the next section).&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;For more information, see &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#local"&gt;Local JMX Monitoring and Management&lt;/a&gt;.&lt;/p&gt;&lt;h4 style="font-family: Arial, Helvetica, sans-serif; font-style: italic; margin-left: 0.5in; "&gt;Remote Monitoring&lt;/h4&gt;&lt;p style="margin-left: 0.5in; "&gt;To start &lt;code&gt;jconsole&lt;/code&gt; for remote monitoring, use this command syntax:&lt;/p&gt;&lt;pre style="margin-left: 0.75in; "&gt;jconsole [&lt;i&gt;hostName&lt;/i&gt;:&lt;i&gt;portNum&lt;/i&gt;]&lt;/pre&gt;&lt;p style="margin-left: 0.5in; "&gt;where &lt;i&gt;hostName&lt;/i&gt; is the name of the system running the application and &lt;i&gt;portNum&lt;/i&gt; is the port number you specified when you enabled the JMX agent when you started the JVM. For more information, see &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#remote"&gt;Remote JMX Monitoring and Management&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;If you do not specify a host name/port number combination, then jconsole will display a connection dialog box (see the next section) enabling you to enter a host name and port number.&lt;/p&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Connecting to a JMX Agent&lt;/h3&gt;&lt;p style="margin-left: 0.5in; "&gt;If you start &lt;code&gt;jconsole&lt;/code&gt; with arguments specifying a JMX agent to which to connect, it will automatically start monitoring the specified JVM. You can connect to a different host at any time by choosing&lt;b&gt;Connection | New Connection&lt;/b&gt;. and entering the necessary information.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;Otherwise, if you do not provide any arguments when you start &lt;code&gt;jconsole&lt;/code&gt;, the first thing you see is the connection dialog box.  This dialog box has three tabs:&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;Local&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Remote&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Advanced&lt;/li&gt;&lt;/ul&gt;&lt;h4 style="font-family: Arial, Helvetica, sans-serif; font-style: italic; margin-left: 0.5in; "&gt;Local Tab&lt;/h4&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/connect.jpg" title="" alt="Connection dialog" width="234" height="217" /&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The local tab lists any JVMs running on the local system started with the same user ID as jconsole, along with their process ID and class/argument information.  Select the application you want to monitor, then click Connect.&lt;/p&gt;&lt;h4 style="font-family: Arial, Helvetica, sans-serif; font-style: italic; margin-left: 0.5in; "&gt;Remote Tab&lt;/h4&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/connectrem.jpg" title="" alt="Connection dialog remote tab" width="234" height="217" /&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;To monitor a remote JVM, enter:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;Host name: name of the machine on which the JVM is running.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Port number: the JMX agent port number you specified when you started the JVM.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;User name and password: the user name and password to use (required only if monitoring a  JVM through a JMX agent that requires password authentication).&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-left: 0.5in; "&gt;For information on setting the port number of the JMX agent, see &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#jmxagent"&gt;Enabling the JMX Management Agent&lt;/a&gt;. For information on user names and passwords, see &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#PasswordAccessFiles"&gt;Using Password and Access Files&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;To monitor the JVM running jconsole, simply click Connect, using host localhost and the port zero (0).&lt;/p&gt;&lt;h4 style="font-family: Arial, Helvetica, sans-serif; font-style: italic; margin-left: 0.5in; "&gt;Advanced Tab&lt;/h4&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/connectadv.jpg" title="" alt="Connection dialog advanced tab" width="234" height="217" /&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The advanced tab enables you to connect to other JMX agents (MBean servers) by specifying their JMX URL, and the user name and password.  The syntax of a JMX URL is described in the API documentation for &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/management/remote/JMXServiceURL.html"&gt;javax.management.remote.JMXServiceURL&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;b&gt;Note&lt;/b&gt;: If the JMX agent is using in a connector which is not included in the Java platform, you need to add the connector classes to the classpath when running &lt;code&gt;jconsole&lt;/code&gt; as follow:&lt;/p&gt;&lt;pre style="margin-left: 0.75in; "&gt;jconsole -J-Djava.class.path=&lt;i&gt;JAVA_HOME&lt;/i&gt;/lib/jconsole.jar:&lt;i&gt;JAVA_HOME&lt;/i&gt;/lib/tools.jar:&lt;i&gt;connector-path&lt;/i&gt;&lt;/pre&gt;&lt;p style="margin-left: 0.5in; "&gt;where &lt;code&gt;&lt;i&gt;JAVA_HOME&lt;/i&gt;&lt;/code&gt; is the directory containing the JDK and &lt;i&gt;connector-path&lt;/i&gt; is the directory or the jar file containing the classes not included in JDK 5.0 to be used by jconsole for connecting to a JMX agent.&lt;/p&gt;&lt;h2 style="font-family: Arial, Helvetica, sans-serif; "&gt;&lt;a name="interface" id="interface"&gt;&lt;/a&gt;The jconsole interface&lt;/h2&gt;&lt;p style="margin-left: 0.5in; "&gt;The jconsole interface is composed of six tabs:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;Summary tab: displays summary information on the JVM and monitored values.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Memory tab: displays information on memory use.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Threads tab: displays information on thread use.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Classes tab: displays information on class loading&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;MBeans tab: displays information on MBeans&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;VM tab: displays information on the JVM&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-left: 0.5in; "&gt;The following sections provide information on each tab.&lt;/p&gt;&lt;h2 style="font-family: Arial, Helvetica, sans-serif; "&gt;&lt;a name="summary" id="summary"&gt;&lt;/a&gt;Viewing Summary Information&lt;/h2&gt;&lt;p style="margin-left: 0.5in; "&gt;The Summary tab displays some key monitoring information on thread usage, memory consumption, and class loading, plus information on the JVM and operating system.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/summarytab.jpg" title="" alt="Summary tab" width="646" height="512" /&gt;&lt;/p&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Summary&lt;/h3&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Uptime&lt;/b&gt;: how long the JVM has been running&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Total compile time&lt;/b&gt;: the amount of time spent in just-in-time (JIT) compilation.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Process CPU time&lt;/b&gt;: the total amount of CPU time consumed by the JVM&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Threads&lt;/h3&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Live threads&lt;/b&gt;: Current number of live daemon threads plus non-daemon threads&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Peak&lt;/b&gt;: Highest number of live threads since JVM started.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Daemon threads&lt;/b&gt;: Current number of live daemon threads&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Total started&lt;/b&gt;: Total number of threads started since JVM started (including daemon, non-daemon, and terminated).&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Memory&lt;/h3&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Current heap size&lt;/b&gt;: Number of Kbytes currently occupied by the heap.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Committed memory&lt;/b&gt;: Total amount of memory allocated for use by the heap.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Maximum heap size&lt;/b&gt;: Maximum number of Kbytes occupied by the heap.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Objects pending for finalization&lt;/b&gt;: &lt;span style="color:#000000;"&gt;Number of objects pending for finalization.&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Garbage collector information&lt;/b&gt;: Information on GC, including the garbage collector names, number of collections performed, and total time spent performing GC.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Classes&lt;/h3&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Current classes loaded&lt;/b&gt;: Number of classes currently loaded into memory.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Total classes loaded&lt;/b&gt;: Total number of classes loaded into memory since the JVM started, included those subsequently unloaded.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Total classes unloaded&lt;/b&gt;: Number of classes unloaded from memory since the JVM started.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Operating System&lt;/h3&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Total physical memory&lt;/b&gt;: Amount of random-access memory (RAM) that the OS has.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Free physical memory&lt;/b&gt;: Amount of free RAM the OS has.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Committed virtual memory&lt;/b&gt;: &lt;span style="color:#000000;"&gt;Amount of &lt;/span&gt;virtual memory guaranteed to be available to the running process.&lt;/li&gt;&lt;/ul&gt;&lt;h2 style="font-family: Arial, Helvetica, sans-serif; "&gt;&lt;a name="memory" id="memory"&gt;&lt;/a&gt;Monitoring Memory Consumption&lt;/h2&gt;&lt;p style="margin-left: 0.5in; "&gt;The Memory tab provides information on memory consumption and memory pools.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/memtab.jpg" title="" alt="jconsole memory tab" width="646" height="512" /&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The chart shows the JVM's memory use versus time, for heap and non-heap memory, and for specific memory pools. The memory pools available depend on the JVM being used. For the HotSpot JVM, the pools are:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;Eden Space (heap): pool from which memory is initially allocated for most objects.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Survivor Space (heap): pool containing objects that have survived GC of eden space.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Tenured Generation (heap): pool containing objects that have existed for some time in the survivor space.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Permanent Generation (non-heap): holds all the reflective data of the virtual machine itself, such as class and method objects. With JVMs that use &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/vm/class-data-sharing.html"&gt;class data sharing&lt;/a&gt;, this generation is divided into read-only and read-write areas.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Code Cache (non-heap): HotSpot JVM also includes a "code cache" containing memory used for compilation and storage of native code.&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-left: 0.5in; "&gt;For more information on these memory pools, see &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#gc"&gt;Garbage Collection.&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The &lt;b&gt;Details&lt;/b&gt; area shows several current memory metrics:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Used&lt;/b&gt;: the amount of memory currently used. Memory used includes the memory occupied by all objects including both reachable and unreachable objects.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Committed&lt;/b&gt;: the amount of memory guaranteed to be available for use by the JVM. The amount of committed memory may change over time. The Java virtual machine may release memory to the system and committed could be less than the amount of memory initially allocated at startup. Committed will always be greater than or equal to used.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Max&lt;/b&gt;: the maximum amount of memory that can be used for memory management. Its value may change or be undefined. A memory allocation may fail if the JVM attempts to increase the used memory to be greater than committed memory, even if the amount used is less than or equal to max (for example, when the system is low on virtual memory).&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-left: 0.5in; "&gt;The bar chart at the lower right shows memory consumed by the memory pools in heap and non-heap memory.  The bar will turn red when the memory used exceeds the memory usage threshold.  You can set the memory usage threshold through an attribute of the MemoryMXBean.&lt;/p&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Heap and Non-heap Memory&lt;/h3&gt;&lt;p style="margin-left: 0.5in; "&gt;The JVM manages two kinds of memory: heap and non-heap memory, both created when it starts.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;i&gt;Heap memory&lt;/i&gt; is the runtime data area from which the JVM allocates memory for all class instances and arrays. The heap may be of a fixed or variable size. The &lt;i&gt;garbage collector&lt;/i&gt; is an automatic memory management system that reclaims heap memory for objects.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;i&gt;Non-heap memory&lt;/i&gt; includes a method area shared among all threads and memory required for the internal processing or optimization for the JVM. It stores per-class structures such as a runtime constant pool, field and method data, and the code for methods and constructors. The method area is logically part of the heap but, depending on implementation, a JVM may not garbage collect or compact it. Like the heap, the method area may be of fixed or variable size. The memory for the method area does not need to be contiguous.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;In addition to the method area, a JVM implementation may require memory for internal processing or optimization which also belongs to non-heap memory. For example, the JIT compiler requires memory for storing the native machine code translated from the JVM code for high performance.&lt;/p&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Memory Pools and Memory Managers&lt;/h3&gt;&lt;p style="margin-left: 0.5in; "&gt;Memory pools and memory managers are key aspects of the JVM memory system.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;A &lt;i&gt;memory pool&lt;/i&gt; represents a memory area that the JVM manages. The JVM has at least one memory pool and it may create or remove memory pools during execution. A memory pool can belong to either heap or non-heap memory.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;A &lt;i&gt;memory manager&lt;/i&gt; manages one or more memory pools. The garbage collector is a type of memory manager responsible for reclaiming memory used by unreachable objects. A JVM may have one or more memory managers. It may add or remove memory managers during execution. A memory pool can be managed by more than one memory manager.&lt;/p&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;&lt;a name="gc" id="gc"&gt;&lt;/a&gt;Garbage Collection&lt;/h3&gt;&lt;p style="margin-left: 0.5in; "&gt;Garbage collection (GC) is how the JVM frees memory occupied by objects that are no longer referenced. It is common to think of objects that have active references as being "alive" and un-referenced (or unreachable) objects as "dead." Garbage collection is the process of releasing memory used by the dead objects. The algorithms and parameters used by GC can have dramatic effects on performance.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The HotSpot VM garbage collector uses &lt;i&gt;generational garbage collection&lt;/i&gt;. Generational GC takes advantage of the observation that, in practice, most programs create:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;many objects that have short lives (for example, iterators and local variables).&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;some objects that have very long lifetimes (for example, high level persistent objects)&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-left: 0.5in; "&gt;So, generational GC divides memory into several &lt;i&gt;generations&lt;/i&gt;, and assigns each a memory pool. When a generation uses up its allotted memory, the VM performs a partial garbage collection (also called a &lt;i&gt;minor collection&lt;/i&gt;) on that memory pool to reclaim memory used by dead objects. This partial GC is usually much faster than a full GC.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The HotSpot VM defines two generations: the &lt;b&gt;young generation&lt;/b&gt; (sometimes called the "nursery") and the &lt;b&gt;old generation&lt;/b&gt;. The young generation consists of an "eden space" and two "survivor spaces." The VM initially assigns all objects to the eden space, and most objects die there. When it performs a minor GC, the VM moves any remaining objects from the eden space to one of the survivor spaces. The VM moves objects that live long enough in the survivor spaces to the "tenured" space in the old generation. When the tenured generation fills up, there is a full GC that is often much slower because it involves all live objects. The permanent generation holds all the reflective data of the virtual machine itself, such as class and method objects.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The default arrangement of generations looks something like this:&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/generations.gif" name="Graphic4" alt="space usage by generations" border="0" title="" width="400" height="222" id="Graphic4" /&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;As explained in the following documents, if the garbage collector has become a bottleneck, you can improve performance by customizing the generation sizes. Using jconsole, explore the sensitivity of your performance metric to the garbage collector parameters. For more information, see:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;a href="http://java.sun.com/docs/hotspot/gc/index.html"&gt;Tuning Garbage collection with the 5.0 HotSpot VM&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style="font-family: Arial, Helvetica, sans-serif; "&gt;&lt;a name="thread" id="thread"&gt;&lt;/a&gt;Monitoring Thread Use&lt;/h2&gt;&lt;p style="margin-left: 0.5in; "&gt;The Threads tab provides information on thread use.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/threadtab.jpg" title="" alt="jconsole thread tab" width="646" height="512" /&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The Threads list in the lower left lists all the active threads. If you enter a string in the Filter field, the Threads list will show only those threads whose name contains the string you enter. Click on the name of a thread in the Threads list to display information about that thread to the right, including the thread name, state, and stack trace.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The chart shows the number of live threads versus time. Three lines are shown:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;Magenta: total number of threads&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Red: peak number of threads&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Blue: number of live threads.&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-left: 0.5in; "&gt;See &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/index.html"&gt;java.lang.Thread&lt;/a&gt; for more information about threads and daemon threads.&lt;/p&gt;&lt;h2 style="font-family: Arial, Helvetica, sans-serif; "&gt;&lt;a name="class_loading" id="class_loading"&gt;&lt;/a&gt;Monitoring Class Loading&lt;/h2&gt;&lt;p style="margin-left: 0.5in; "&gt;The Classes tab displays information on class loading.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/classtab.jpg" title="" alt="jconsole class tab" width="646" height="512" /&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The graph plots the number of classes loaded versus time:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;Red line is the total number of classes loaded (including those subsequently unloaded).&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;Blue line is the current number of classes loaded.&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-left: 0.5in; "&gt;The Details section at the bottom of the tab displays the total number of classes loaded since the JVM started, the number currently loaded and the number unloaded.&lt;/p&gt;&lt;h2 style="font-family: Arial, Helvetica, sans-serif; "&gt;&lt;a name="MBeans" id="MBeans"&gt;&lt;/a&gt;Monitoring and Managing MBeans&lt;/h2&gt;&lt;p style="margin-left: 0.5in; "&gt;The MBean tab displays information on all the MBeans registered with the platform MBean server.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/mbeantab.jpg" title="" alt="jconsole mbean tab" width="646" height="512" /&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The tree on the left shows all the MBeans, organized according to their objectNames. When you select an MBean in the tree, its attributes, operations, notifications and other information is displayed on the right.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;You can set the value of attributes, if they are writeable (the value will be displayed in blue).  You can also invoke operations displayed in the Operations tab.&lt;/p&gt;&lt;h3 style="font-family: Arial, Helvetica, sans-serif; "&gt;Displaying a Chart&lt;/h3&gt;&lt;p style="margin-left: 0.5in; "&gt;You can display a chart of an attribute's value versus time by double-clicking on the attribute value.  For example, if you click on the value of the CollectionTime property of java.lang.GarbageCollector.Copy MBean, you will see a chart that looks something like this:&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/chart.jpg" title="" alt="chart vs. time" width="357" height="250" /&gt;&lt;/p&gt;&lt;h2 style="font-family: Arial, Helvetica, sans-serif; "&gt;&lt;a name="VM" id="VM"&gt;&lt;/a&gt;Viewing VM Information&lt;/h2&gt;&lt;p style="margin-left: 0.5in; "&gt;The VM tab provides information on the JVM.&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;&lt;img src="http://java.sun.com/j2se/1.5.0/docs/guide/management/images/vmtab.jpg" title="" alt="VM tab" width="640" height="504" /&gt;&lt;/p&gt;&lt;p style="margin-left: 0.5in; "&gt;The information includes:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Uptime&lt;/b&gt;: Total amount of time since the JVM was started.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Process CPU Time&lt;/b&gt;: Total amount of CPU time that the JVM has consumed since it was started.&lt;/li&gt;&lt;li style="margin-left: 0.25in; "&gt;&lt;b&gt;Total Compile Time&lt;/b&gt;: Total accumulated time spent in just-in-time (JIT) compilation. The JVM implementation determines when JIT compilation occurs. The Hotspot VM uses &lt;i&gt;adaptive compilation&lt;/i&gt;, in which the VM launches an application using a standard interpreter, but then analyzes the code as it runs to detect performance bottlenecks, or "hot spots".&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-4705500702551894004?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/4705500702551894004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=4705500702551894004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/4705500702551894004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/4705500702551894004'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/07/using-jconsole-to-monitor-applications.html' title='Using JConsole to Monitor Applications'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-6246016421525747080</id><published>2009-07-06T16:16:00.000-07:00</published><updated>2009-07-06T16:23:19.872-07:00</updated><title type='text'>Apache ActiveMQ</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: verdana; font-size: 14px; line-height: 21px; "&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 21px; "&gt;&lt;span class="nobr"&gt;&lt;a href="http://activemq.apache.org/" title="Visit page outside Confluence" rel="nofollow" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Apache ActiveMQ&lt;sup&gt;&lt;img class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0" style="width: 0px; height: 0px; " /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt; is the most popular and powerful open source Enterprise Messaging and&lt;span class="nobr"&gt;&lt;a href="http://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=ACTIVEMQ&amp;amp;title=Integration%20Patterns&amp;amp;linkCreation=true&amp;amp;fromPageId=36041" title="Create Page: Integration Patterns" class="createlink" style="color: maroon; text-decoration: none; "&gt;Integration Patterns&lt;sup&gt;&lt;img class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/plus.gif" height="7" width="7" align="absmiddle" alt="" border="0" style="width: 0px; height: 0px; " /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt; provider.&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 21px; "&gt;Apache ActiveMQ is fast, supports many &lt;a href="http://activemq.apache.org/cross-language-clients.html" title="Cross Language Clients" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Cross Language Clients and Protocols&lt;/a&gt;, comes with easy to use &lt;a href="http://activemq.apache.org/enterprise-integration-patterns.html" title="Enterprise Integration Patterns" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Enterprise Integration Patterns&lt;/a&gt; and many &lt;a href="http://activemq.apache.org/features.html" title="Features" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;advanced features&lt;/a&gt; while fully supporting &lt;span class="nobr"&gt;&lt;a href="http://java.sun.com/products/jms/" title="Visit page outside Confluence" rel="nofollow" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;JMS 1.1&lt;sup&gt;&lt;img class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0" style="width: 0px; height: 0px; " /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;and J2EE 1.4. Apache ActiveMQ is released under the &lt;span class="nobr"&gt;&lt;a href="http://www.apache.org/" title="Visit page outside Confluence" rel="nofollow" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Apache&lt;sup&gt;&lt;img class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0" style="width: 0px; height: 0px; " /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="nobr"&gt;&lt;a href="http://www.apache.org/licenses/LICENSE-2.0.html" title="Visit page outside Confluence" rel="nofollow" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;2.0 License&lt;sup&gt;&lt;img class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0" style="width: 0px; height: 0px; " /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 21px; "&gt;Grab yourself a &lt;a href="http://activemq.apache.org/download.html" title="Download" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Download&lt;/a&gt;, try our &lt;a href="http://activemq.apache.org/getting-started.html" title="Getting Started" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Getting Started Guide&lt;/a&gt;, surf our &lt;a href="http://activemq.apache.org/faq.html" title="FAQ" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;FAQ&lt;/a&gt; or start &lt;a href="http://activemq.apache.org/contributing.html" title="Contributing" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Contributing&lt;/a&gt; and join us on our &lt;a href="http://activemq.apache.org/discussion-forums.html" title="Discussion Forums" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Discussion Forums&lt;/a&gt;.&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 21px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 21px; "&gt;&lt;span class="Apple-style-span" style="font-size: 10px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(192, 192, 192); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 21px; margin-right: 0px; margin-bottom: 4px; margin-left: -15px; font-size: 16px; "&gt;Features&lt;/h3&gt;&lt;ul style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; font-style: normal; font-weight: normal; margin-left: 15px; margin-top: 5px; margin-bottom: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;Supports a variety of &lt;a href="http://activemq.apache.org/cross-language-clients.html" title="Cross Language Clients" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Cross Language Clients and Protocols&lt;/a&gt; from Java, C, C++, C#, Ruby, Perl, Python, PHP&lt;ul style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; font-style: normal; font-weight: normal; margin-left: 15px; margin-top: 5px; margin-bottom: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-gray.png); "&gt;&lt;a href="http://activemq.apache.org/openwire.html" title="OpenWire" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;OpenWire&lt;/a&gt; for high performance clients in Java, C, C++, C#&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-gray.png); "&gt;&lt;a href="http://activemq.apache.org/stomp.html" title="Stomp" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Stomp&lt;/a&gt; support so that clients can be written easily in C, Ruby, Perl, Python, PHP, ActionScript/Flash, Smalltalk to talk to ActiveMQ as well as any other &lt;span class="nobr"&gt;&lt;a href="http://stomp.codehaus.org/StompConnect" title="Visit page outside Confluence" rel="nofollow" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;popular Message Broker&lt;sup&gt;&lt;img class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0" style="width: 0px; height: 0px; " /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;full support for the &lt;a href="http://activemq.apache.org/enterprise-integration-patterns.html" title="Enterprise Integration Patterns" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Enterprise Integration Patterns&lt;/a&gt; both in the JMS client and the Message Broker&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;Supports many &lt;a href="http://activemq.apache.org/features.html" title="Features" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;advanced features&lt;/a&gt; such as &lt;a href="http://activemq.apache.org/message-groups.html" title="Message Groups" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Message Groups&lt;/a&gt;, &lt;a href="http://activemq.apache.org/virtual-destinations.html" title="Virtual Destinations" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Virtual Destinations&lt;/a&gt;, &lt;a href="http://activemq.apache.org/wildcards.html" title="Wildcards" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Wildcards&lt;/a&gt; and &lt;a href="http://activemq.apache.org/composite-destinations.html" title="Composite Destinations" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Composite Destinations&lt;/a&gt;&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;Fully supports JMS 1.1 and J2EE 1.4 with support for transient, persistent, transactional and XA messaging&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;&lt;a href="http://activemq.apache.org/spring-support.html" title="Spring Support" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Spring Support&lt;/a&gt; so that ActiveMQ can be easily embedded into Spring applications and configured using Spring's XML configuration mechanism&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;Tested inside popular J2EE servers such as Geronimo, JBoss 4, GlassFish and WebLogic&lt;ul style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; font-style: normal; font-weight: normal; margin-left: 15px; margin-top: 5px; margin-bottom: 5px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-gray.png); "&gt;Includes &lt;a href="http://activemq.apache.org/resource-adapter.html" title="Resource Adapter" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;JCA 1.5 resource adaptors&lt;/a&gt; for inbound &amp;amp; outbound messaging so that ActiveMQ should auto-deploy in any J2EE 1.4 compliant server&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;Supports pluggable &lt;a href="http://activemq.apache.org/uri-protocols.html" title="URI Protocols" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;transport protocols&lt;/a&gt; such as &lt;a href="http://activemq.apache.org/how-do-i-use-activemq-using-in-jvm-messaging.html" title="How do I use ActiveMQ using in JVM messaging" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;in-VM&lt;/a&gt;, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;Supports very fast &lt;a href="http://activemq.apache.org/persistence.html" title="Persistence" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;persistence&lt;/a&gt; using JDBC along with a high performance journal&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;Designed for high performance clustering, client-server, peer based communication&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;&lt;a href="http://activemq.apache.org/rest.html" title="REST" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;REST&lt;/a&gt; API to provide technology agnostic and language neutral web based API to messaging&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;&lt;a href="http://activemq.apache.org/ajax.html" title="Ajax" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Ajax&lt;/a&gt; to support web streaming support to web browsers using pure DHTML, allowing web browsers to be part of the messaging fabric&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;&lt;a href="http://activemq.apache.org/axis-and-cxf-support.html" title="Axis and CXF Support" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;CXF and Axis Support&lt;/a&gt; so that ActiveMQ can be easily dropped into either of these web service stacks to provide reliable messaging&lt;/li&gt;&lt;li style="list-style-image: url(http://activemq.apache.org/images/small-bullet-red.png); "&gt;Can be used as an in memory JMS provider, ideal for &lt;a href="http://activemq.apache.org/how-to-unit-test-jms-code.html" title="How to unit test JMS code" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;unit testing JMS&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;span class="Apple-style-span" style="font-size: 10px; "&gt;&lt;h2 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(160, 160, 160); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 27px; margin-right: 0px; margin-bottom: 4px; margin-left: -20px; font-size: 18px; "&gt;Starting ActiveMQ&lt;/h2&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;There now follows instructions on how to &lt;a href="http://activemq.apache.org/run-broker.html" title="Run Broker" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;run the ActiveMQ Message Broker&lt;/a&gt;.&lt;/p&gt;&lt;h4 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(192, 192, 192); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 18px; margin-right: 0px; margin-bottom: 4px; margin-left: -10px; font-size: 15px; "&gt;&lt;a name="GettingStarted-OnWindows%3A"&gt;&lt;/a&gt;On Windows:&lt;/h4&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;From a console window, change to the installation directory and run &lt;tt&gt;ActiveMQ&lt;/tt&gt;:&lt;/p&gt;&lt;div class="code" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(60, 120, 181); border-right-color: rgb(60, 120, 181); border-bottom-color: rgb(60, 120, 181); border-left-color: rgb(60, 120, 181); font-size: 11px; font-family: Courier; margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; line-height: 13px; "&gt;&lt;div class="codeContent" style="text-align: left; background-color: rgb(240, 240, 240); padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; "&gt;&lt;pre class="code-java" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 5px; margin-left: 15px; margin-bottom: 5px; margin-right: 5px; text-align: left; "&gt;cd [activemq_install_dir]&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;where &lt;tt&gt;activemq_install_dir&lt;/tt&gt; is the directory in which ActiveMQ was installed, e.g., &lt;tt&gt;c:\Program Files\ActiveMQ-4.x&lt;/tt&gt;. &lt;br /&gt;Then type:&lt;/p&gt;&lt;div class="code" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(60, 120, 181); border-right-color: rgb(60, 120, 181); border-bottom-color: rgb(60, 120, 181); border-left-color: rgb(60, 120, 181); font-size: 11px; font-family: Courier; margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; line-height: 13px; "&gt;&lt;div class="codeContent" style="text-align: left; background-color: rgb(240, 240, 240); padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; "&gt;&lt;pre class="code-java" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 5px; margin-left: 15px; margin-bottom: 5px; margin-right: 5px; text-align: left; "&gt;bin\activemq&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;b&gt;NOTE:&lt;/b&gt; Working directories get created relative to the current directory. To create working directories in the proper place, ActiveMQ must be launched from its home/installation directory.&lt;/p&gt;&lt;h4 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(192, 192, 192); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 18px; margin-right: 0px; margin-bottom: 4px; margin-left: -10px; font-size: 15px; "&gt;&lt;a name="GettingStarted-OnUnix%3A"&gt;&lt;/a&gt;On Unix:&lt;/h4&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;From a command shell, change to the installation directory and run &lt;tt&gt;ActiveMQ&lt;/tt&gt;:&lt;/p&gt;&lt;div class="code" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(60, 120, 181); border-right-color: rgb(60, 120, 181); border-bottom-color: rgb(60, 120, 181); border-left-color: rgb(60, 120, 181); font-size: 11px; font-family: Courier; margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; line-height: 13px; "&gt;&lt;div class="codeContent" style="text-align: left; background-color: rgb(240, 240, 240); padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; "&gt;&lt;pre class="code-java" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 5px; margin-left: 15px; margin-bottom: 5px; margin-right: 5px; text-align: left; "&gt;cd [activemq_install_dir]&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;where &lt;tt&gt;activemq_install_dir&lt;/tt&gt; is the directory in which ActiveMQ was installed, e.g., &lt;tt&gt;/usr/local/activemq-4.x&lt;/tt&gt;. &lt;br /&gt;Then type:&lt;/p&gt;&lt;div class="code" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(60, 120, 181); border-right-color: rgb(60, 120, 181); border-bottom-color: rgb(60, 120, 181); border-left-color: rgb(60, 120, 181); font-size: 11px; font-family: Courier; margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; line-height: 13px; "&gt;&lt;div class="codeContent" style="text-align: left; background-color: rgb(240, 240, 240); padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; "&gt;&lt;pre class="code-java" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 5px; margin-left: 15px; margin-bottom: 5px; margin-right: 5px; text-align: left; "&gt;bin/activemq  OR  bin/activemq &gt; /tmp/smlog  2&gt;&amp;amp;1 &amp;amp;; Note: /tmp/smlog may be changed to another file name.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;b&gt;NOTE:&lt;/b&gt; Working directories get created relative to the current directory. To create working directories in the proper place, ActiveMQ must be launched from its home/installation directory.&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: 10px; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(192, 192, 192); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 21px; margin-right: 0px; margin-bottom: 4px; margin-left: -15px; font-size: 16px; "&gt;More help&lt;/h3&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;For other ways of running the broker see &lt;a href="http://activemq.apache.org/run-broker.html" title="Run Broker" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Here&lt;/a&gt;. For example you can run an &lt;a href="http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html" title="How do I embed a Broker inside a Connection" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;embedded broker&lt;/a&gt; inside your JMS Connection to avoid starting a separate process.&lt;/p&gt;&lt;h2 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(160, 160, 160); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 27px; margin-right: 0px; margin-bottom: 4px; margin-left: -20px; font-size: 18px; "&gt;&lt;a name="GettingStarted-TestingtheInstallation"&gt;&lt;/a&gt;&lt;a name="GettingStarted-TestingtheInstallation"&gt;&lt;/a&gt;Testing the Installation&lt;/h2&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;If ActiveMQ is up and running without problems, the Window's console window or the Unix command shell will display information similar to the following log line:&lt;/p&gt;&lt;div class="code" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(60, 120, 181); border-right-color: rgb(60, 120, 181); border-bottom-color: rgb(60, 120, 181); border-left-color: rgb(60, 120, 181); font-size: 11px; font-family: Courier; margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; line-height: 13px; "&gt;&lt;div class="codeContent" style="text-align: left; background-color: rgb(240, 240, 240); padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; "&gt;&lt;pre class="code-java" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 5px; margin-left: 15px; margin-bottom: 5px; margin-right: 5px; text-align: left; "&gt;INFO  ActiveMQ JMS Message Broker (ID:apple-s-Computer.local-51222-1140729837569-0:0) has started&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;br /&gt;ActiveMQ's default port is 61616. From another window run netstat and search for port 61616.&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;From a Windows console, type:&lt;/p&gt;&lt;div class="code" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(60, 120, 181); border-right-color: rgb(60, 120, 181); border-bottom-color: rgb(60, 120, 181); border-left-color: rgb(60, 120, 181); font-size: 11px; font-family: Courier; margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; line-height: 13px; "&gt;&lt;div class="codeContent" style="text-align: left; background-color: rgb(240, 240, 240); padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; "&gt;&lt;pre class="code-java" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 5px; margin-left: 15px; margin-bottom: 5px; margin-right: 5px; text-align: left; "&gt;netstat -an|find &lt;span class="code-quote" style="color: rgb(0, 145, 0); background-color: inherit; "&gt;"61616"&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;b&gt;OR&lt;/b&gt;&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;From a Unix command shell, type:&lt;/p&gt;&lt;div class="code" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(60, 120, 181); border-right-color: rgb(60, 120, 181); border-bottom-color: rgb(60, 120, 181); border-left-color: rgb(60, 120, 181); font-size: 11px; font-family: Courier; margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; line-height: 13px; "&gt;&lt;div class="codeContent" style="text-align: left; background-color: rgb(240, 240, 240); padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; "&gt;&lt;pre class="code-java" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 5px; margin-left: 15px; margin-bottom: 5px; margin-right: 5px; text-align: left; "&gt;netstat -an|grep 61616&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(160, 160, 160); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 27px; margin-right: 0px; margin-bottom: 4px; margin-left: -20px; font-size: 18px; "&gt;&lt;a name="GettingStarted-MonitoringActiveMQ"&gt;&lt;/a&gt;Monitoring ActiveMQ&lt;/h2&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;There are various ways to &lt;a href="http://activemq.apache.org/how-can-i-monitor-activemq.html" title="How can I monitor ActiveMQ" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;monitor ActiveMQ&lt;/a&gt;. If you are on version 4.2 or later of ActiveMQ you can then monitor ActiveMQ using the &lt;a href="http://activemq.apache.org/web-console.html" title="Web Console" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Web Console&lt;/a&gt; by pointing your browser at&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;span class="nobr"&gt;&lt;a href="http://localhost:8161/admin" title="Visit page outside Confluence" rel="nofollow" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;http://localhost:8161/admin&lt;sup&gt;&lt;img class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0" style="width: 0px; height: 0px; " /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Or you can use the &lt;a href="http://activemq.apache.org/jmx.html" title="JMX" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;JMX&lt;/a&gt; support to view the running state of ActiveMQ.&lt;/p&gt;&lt;h2 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(160, 160, 160); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 27px; margin-right: 0px; margin-bottom: 4px; margin-left: -20px; font-size: 18px; "&gt;&lt;a name="GettingStarted-StoppingActiveMQ"&gt;&lt;/a&gt;Stopping ActiveMQ&lt;/h2&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;For both Windows and Unix installations, terminate ActiveMQ by typing "CTRL-C" in the console or command shell in which it is running.&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;If ActiveMQ was started in the background on Unix, the process can be killed, with the following:&lt;/p&gt;&lt;div class="code" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(60, 120, 181); border-right-color: rgb(60, 120, 181); border-bottom-color: rgb(60, 120, 181); border-left-color: rgb(60, 120, 181); font-size: 11px; font-family: Courier; margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; line-height: 13px; "&gt;&lt;div class="codeContent" style="text-align: left; background-color: rgb(240, 240, 240); padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; "&gt;&lt;pre class="code-java" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 5px; margin-left: 15px; margin-bottom: 5px; margin-right: 5px; text-align: left; "&gt;ps -ef|grep activemq kill [PID]   where [PID] is the process id of the ActiveMQ process.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(160, 160, 160); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 27px; margin-right: 0px; margin-bottom: 4px; margin-left: -20px; font-size: 18px; "&gt;&lt;a name="GettingStarted-ConfiguringActiveMQ"&gt;&lt;/a&gt;Configuring ActiveMQ&lt;/h2&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;The ActiveMQ broker should now run. You can configure the broker by specifying an &lt;a href="http://activemq.apache.org/xml-configuration.html" title="Xml Configuration" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Xml Configuration&lt;/a&gt; file as a parameter to the&lt;em&gt;activemq&lt;/em&gt; command. An alternative is to use the &lt;a href="http://activemq.apache.org/broker-configuration-uri.html" title="Broker Configuration URI" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Broker Configuration URI&lt;/a&gt; to configure things on the command line in a concise format (though the configuration options are not as extensive as if you use Java or XML code). You can also&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Also see &lt;a href="http://activemq.apache.org/configuring-transports.html" title="Configuring Transports" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Configuring Transports&lt;/a&gt; to see how you can configure the various connection, transport and broker options using the connection URL in the ActiveMQConnectionFactory.&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;See the &lt;a href="http://activemq.apache.org/initial-configuration.html" title="Initial Configuration" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Initial Configuration&lt;/a&gt; for details of which jars you need to add to your classpath to start using ActiveMQ in your Java code&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;If you want to use JNDI to connect to your JMS provider then please view the &lt;a href="http://activemq.apache.org/jndi-support.html" title="JNDI Support" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;JNDI Support&lt;/a&gt;. If you are a Spring user you should read about &lt;a href="http://activemq.apache.org/spring-support.html" title="Spring Support" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Spring Support&lt;/a&gt;&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;After the installation, ActiveMQ is running with a basic configuration. For details on configuring options, please see refer to the&lt;a href="http://activemq.apache.org/configuration.html" title="Configuration" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Configuration&lt;/a&gt; section.&lt;/p&gt;&lt;h2 style="font-family: Georgia, 'Times New Roman', serif; line-height: normal; font-weight: bold; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(160, 160, 160); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; margin-top: 27px; margin-right: 0px; margin-bottom: 4px; margin-left: -20px; font-size: 18px; "&gt;&lt;a name="GettingStarted-AdditionalResources"&gt;&lt;/a&gt;Additional Resources&lt;/h2&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;If you are new to using ActiveMQ, running the &lt;a href="http://activemq.apache.org/web-samples.html" title="Web Samples" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Web Samples&lt;/a&gt; or the &lt;a href="http://activemq.apache.org/examples.html" title="Examples" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;Examples&lt;/a&gt; is a good next step to learn more about ActiveMQ.&lt;/p&gt;&lt;p style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;FUSE Source &lt;span class="nobr"&gt;&lt;a href="http://fusesource.com/docs/broker/5.0/getting_started/getting_started.pdf" title="Visit page outside Confluence" rel="nofollow" style="color: rgb(136, 0, 85); text-decoration: none; "&gt;ActiveMQ Getting Started Guide&lt;sup&gt;&lt;img class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0" style="width: 0px; height: 0px; " /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt; (&lt;b&gt;Note:&lt;/b&gt; FUSE Message Broker is an open source Apache licenced enterprise version of ActiveMQ)&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-6246016421525747080?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/6246016421525747080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=6246016421525747080' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6246016421525747080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6246016421525747080'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/07/apache-activemq.html' title='Apache ActiveMQ'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-3664621444718802362</id><published>2009-07-06T16:14:00.000-07:00</published><updated>2009-07-06T16:15:38.049-07:00</updated><title type='text'>The Grinder, a Java Load Testing Framework</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;h1 style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 0px; margin-bottom: 0.5em; font-size: 21px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(58, 75, 141); "&gt;The Grinder, a Java Load Testing Framework&lt;/h1&gt;&lt;div&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;What is The Grinder?&lt;/h2&gt;&lt;div class="section"&gt;&lt;p style="line-height: 19px; text-align: justify; margin-top: 0.5em; margin-bottom: 1em; "&gt;The Grinder is a Java&lt;sup&gt;TM&lt;/sup&gt; load testing framework that makes it easy to run a distributed test using many load injector machines. It is freely available under a BSD-style open-source &lt;a href="http://grinder.sourceforge.net/license.html" style="color: rgb(50, 78, 190); font-weight: bold; "&gt;license&lt;/a&gt;.&lt;/p&gt;&lt;p style="line-height: 19px; text-align: justify; margin-top: 0.5em; margin-bottom: 1em; "&gt;The latest news, downloads, and mailing list archives can be found on &lt;a class="external" href="http://www.sourceforge.net/projects/grinder" style="padding-top: 0px; padding-right: 20px; padding-bottom: 0px; padding-left: 0px; display: inline; background-repeat: no-repeat; background-image: url(http://grinder.sourceforge.net/skin/images/external-link.gif); color: rgb(50, 78, 190); font-weight: bold; background-position: 100% 50%; "&gt;SourceForge.net&lt;/a&gt;.&lt;/p&gt;&lt;a name="N10023" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="Key+features" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h3 class="underlined_5" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 0.8em; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 0px; border-bottom-color: rgb(0, 0, 0); color: rgb(85, 85, 85); "&gt;Key features&lt;/h3&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 25px; padding-bottom: 0px; padding-left: 25px; "&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 5px; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; line-height: 18px; "&gt;&lt;strong style="color: rgb(34, 34, 34); "&gt;Generic Approach&lt;/strong&gt; Load test anything that has a Java API. This includes common cases such as HTTP web servers, SOAP and REST web services, and application servers (CORBA, RMI, JMS, EJBs), as well as custom protocols.&lt;/li&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 5px; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; line-height: 18px; "&gt;&lt;strong style="color: rgb(34, 34, 34); "&gt;Flexible Scripting&lt;/strong&gt; Tests are written in the powerful Jython scripting language.&lt;/li&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 5px; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; line-height: 18px; "&gt;&lt;strong style="color: rgb(34, 34, 34); "&gt;Distributed Framework&lt;/strong&gt; A graphical console allows multiple load injectors to be monitored and controlled, and provides centralised script editing and distribution.&lt;/li&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 5px; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; line-height: 18px; "&gt;&lt;strong style="color: rgb(34, 34, 34); "&gt;Mature HTTP Support&lt;/strong&gt; Automatic management of client connections and cookies. SSL. Proxy aware. Connection throttling. Sophisticated record and replay of the interaction between a browser and a web site.&lt;/li&gt;&lt;/ul&gt;&lt;p style="line-height: 19px; text-align: justify; margin-top: 0.5em; margin-bottom: 1em; "&gt;See the longer &lt;a href="http://grinder.sourceforge.net/g3/features.html" style="color: rgb(50, 78, 190); font-weight: bold; "&gt;features list&lt;/a&gt; for further details.&lt;/p&gt;&lt;a name="N10048" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="History" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h3 class="underlined_5" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 0.8em; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 0px; border-bottom-color: rgb(0, 0, 0); color: rgb(85, 85, 85); "&gt;History&lt;/h3&gt;&lt;p style="line-height: 19px; text-align: justify; margin-top: 0.5em; margin-bottom: 1em; "&gt;The Grinder was originally developed for the book &lt;em&gt;Professional Java 2 Enterprise Edition with BEA WebLogic Server&lt;/em&gt;by Paco Gómez and Peter Zadrozny. Philip Aston took ownership of the code, reworked it to create The Grinder 2, and shortly after began work on The Grinder 3. The Grinder 3 provides &lt;a href="http://grinder.sourceforge.net/g3/whats-new.html" style="color: rgb(50, 78, 190); font-weight: bold; "&gt;many new features&lt;/a&gt;, the most significant of which is Jython scripting. Philip continues to enhance and maintain The Grinder.&lt;/p&gt;&lt;p style="line-height: 19px; text-align: justify; margin-top: 0.5em; margin-bottom: 1em; "&gt;In 2003, Peter, Philip and Ted Osborne published the book &lt;a href="http://grinder.sourceforge.net/links.html#book" style="color: rgb(50, 78, 190); font-weight: bold; "&gt;J2EE Performance Testing&lt;/a&gt; which makes extensive use of The Grinder 2.&lt;/p&gt;&lt;p style="line-height: 19px; text-align: justify; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="line-height: 19px; text-align: justify; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;span class="Apple-style-span" style="line-height: normal; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;Capabilities of The Grinder&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Load Testing&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Load Testing determines if an application can support a specified load (for example, 500 concurrent users) with specified response times. Load Testing is used to create benchmarks.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Capacity Testing&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Capacity Testing determines the maximum load that an application can sustain before system failure.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Functional Testing&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Functional Testing proves the correct behaviour of an application.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Stress Testing&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Stress Testing is load testing over an extended period of time. Stress Testing determines if an application can meet specified goals for stability and reliability, under a specified load, for a specified time period.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N10052" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="Open+Source" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;Open Source&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;BSD style license&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder is distributed under a BSD style license.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Dependencies&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder depends on a number of other open source products including&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 25px; padding-bottom: 0px; padding-left: 25px; "&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 5px; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; line-height: 18px; "&gt;&lt;a class="external" href="http://www.jython.org/" style="padding-top: 0px; padding-right: 20px; padding-bottom: 0px; padding-left: 0px; display: inline; background-repeat: no-repeat; background-image: url(http://grinder.sourceforge.net/skin/images/external-link.gif); color: rgb(50, 78, 190); font-weight: bold; background-position: 100% 50%; "&gt;Jython&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 5px; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; line-height: 18px; "&gt;&lt;a class="external" href="http://www.innovation.ch/java/HTTPClient/" style="padding-top: 0px; padding-right: 20px; padding-bottom: 0px; padding-left: 0px; display: inline; background-repeat: no-repeat; background-image: url(http://grinder.sourceforge.net/skin/images/external-link.gif); color: rgb(50, 78, 190); font-weight: bold; background-position: 100% 50%; "&gt;HTTPClient&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 5px; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; line-height: 18px; "&gt;&lt;a class="external" href="http://syntax.jedit.org/" style="padding-top: 0px; padding-right: 20px; padding-bottom: 0px; padding-left: 0px; display: inline; background-repeat: no-repeat; background-image: url(http://grinder.sourceforge.net/skin/images/external-link.gif); color: rgb(50, 78, 190); font-weight: bold; background-position: 100% 50%; "&gt;JEdit Syntax&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 5px; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; line-height: 18px; "&gt;&lt;a class="external" href="http://xmlbeans.apache.org/" style="padding-top: 0px; padding-right: 20px; padding-bottom: 0px; padding-left: 0px; display: inline; background-repeat: no-repeat; background-image: url(http://grinder.sourceforge.net/skin/images/external-link.gif); color: rgb(50, 78, 190); font-weight: bold; background-position: 100% 50%; "&gt;Apache XMLBeans&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 5px; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; line-height: 18px; "&gt;&lt;a class="external" href="http://picocontainer.codehaus.org/" style="padding-top: 0px; padding-right: 20px; padding-bottom: 0px; padding-left: 0px; display: inline; background-repeat: no-repeat; background-image: url(http://grinder.sourceforge.net/skin/images/external-link.gif); color: rgb(50, 78, 190); font-weight: bold; background-position: 100% 50%; "&gt;PicoContainer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N10092" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="Standards" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;Standards&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;100% Pure Java&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder works on any hardware platform and any operating system that supports J2SE 1.4 and above.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Web Browsers&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder can simulate web browsers and other devices that use HTTP, and HTTPS.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Web Services&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder can be used to test Web Service interfaces using protocols such as SOAP and XML-RPC.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Database&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder can be used to test databases using JDBC.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Middleware&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder can be used to test RPC and MOM based systems using protocols such as IIOP, RMI/IIOP, RMI/JRMP, and JMS.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Other Internet protocols&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder can be used to test systems that utilise other protocols such as POP3, SMTP, FTP, and LDAP.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N100EA" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="The+Grinder+Architecture" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;The Grinder Architecture&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Goal&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Minimize system resource requirements while maximizing the number of test contexts ("virtual users").&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Multi-threaded, multi-process&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Each test context runs in its own thread. The threads can be split over many processes depending on the requirements of the test and the capabilities of the load injection machine.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Distributed&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder makes it easy to coordinate and monitor the activity of processes across a network of many load injection machines from a central console.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Scalable&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder typically can support several hundred HTTP test contexts per load injection machine. (The number varies depending on the type of test client). More load injection machines can be added to generate bigger loads.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N10128" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="Console" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;Console&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Graphical Interface&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;100% Java Swing user interface.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Process coordination&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Worker processes can be started, stopped and reset from one central console.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Process monitoring&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Dynamic display of current worker processes and threads.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Internationalised and Localised&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;English, French, Spanish, and German translations are supplied. Users can add their own translations.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Script editing&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Central editing and management of test scripts.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N10173" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="Statistics%2C+Reports%2C+Charts" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;Statistics, Reports, Charts&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Test monitoring&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Pre-defined charts for response time, test throughput. Display the number of invocations, test result (pass/fail), average, minimum and maximum values for response time and tests per second for each test.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Data collation&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Collates data from worker processes. Data can be saved for import into a spreadsheet or other analysis tool.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Instrument anything&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder records statistics about the number of times each test has been called and the response times achieved. Any part of the test script can be marked as a test.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Statistics engine&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Scripts can declare their own statistics and report against them. The values will appear in the console and the data logs. Composite statistics can be specified as expressions involving other statistics.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N101B1" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="Script" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;Script&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Record real users&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Scripts can be created by recording actions of a real user using the TCP Proxy. The script can then be customised by hand.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Powerful scripting in Python&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Simple to use but powerful, fully object-oriented scripting.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Multiple scenarios&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Arbitrary looping and branching allows the simulation of multiple scenarios. Simple scenarios can be composed into more complex scenarios. For example, you might allocate 10% of test contexts to a login scenario, 70% to searching, 10% to browsing, and 10% to buying; or you might have different workloads for specific times of a day.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Access to any Java API&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Jython allows any Java-based API to be used directly from the test script.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Parameterization of input data&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Input data (e.g. URL parameters, form fields) can be dynamically generated. The source of the data can be anything including flat files, random generation, a database, or previously captured output.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Content Verification&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Scripts have full access to test results. In the future, The Grinder will include support for enhanced parsing of common results such as HTML pages.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N10209" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="The+Grinder+Plug-ins" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;The Grinder Plug-ins&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;HTTP&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder has special support for HTTP that automatically handles cookie and connection management for test contexts.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Custom&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Users can write their own plug-ins to a documented interface; although this is rarely necessary due to the powerful scripting facilities.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N1022D" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="HTTP+Plug-in" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;HTTP Plug-in&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;HTTP 1.0, HTTP 1.1&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Support for both HTTP 1.0 and HTTP 1.1 is provided.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;HTTPS&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder supports HTTP over SSL.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Cookies&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Full support for Cookies is provided.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Multi-part forms&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The Grinder supports multi-part forms.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Connection throttling&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Low bandwidth client connections can be simulated.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N10278" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="TCP+Proxy" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;TCP Proxy&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;TCP proxy&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;A TCP proxy utility is supplied that can be used to intercept system interaction at the protocol level. It is useful for recording scripts and as a debugging tool.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;HTTP Proxy&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The TCP proxy can be configured as an HTTP/HTTPS proxy for easy integration with web browsers.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;SSL Support&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The TCP proxy can simulate SSL sessions.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Filter-based architecture&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;The TCP proxy has a pluggable filter architecture. Users can write their own filters.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;a name="N102B6" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;a name="Documentation" style="font-weight: bold; "&gt;&lt;/a&gt;&lt;h2 class="underlined_10" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 2em; margin-bottom: 0.5em; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(128, 128, 128); color: rgb(58, 75, 141); "&gt;Documentation&lt;/h2&gt;&lt;div class="section"&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); width: 768px; font-size: 13px; empty-cells: show; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; background-position: initial initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;User Guide&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;&lt;a href="http://grinder.sourceforge.net/g3/whats-new.html" style="color: rgb(50, 78, 190); font-weight: bold; "&gt;http://grinder.sourceforge.net/g3/whats-new.html&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;FAQs&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;&lt;a href="http://grinder.sourceforge.net/faq.html" style="color: rgb(50, 78, 190); font-weight: bold; "&gt;http://grinder.sourceforge.net/faq.html&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Tutorial&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;&lt;a href="http://grinder.sourceforge.net/g3/tutorial-perks.html" style="color: rgb(50, 78, 190); font-weight: bold; "&gt;http://grinder.sourceforge.net/g3/tutorial-perks.html&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Script Gallery&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;&lt;a href="http://grinder.sourceforge.net/g3/script-gallery.html" style="color: rgb(50, 78, 190); font-weight: bold; "&gt;http://grinder.sourceforge.net/g3/script-gallery.html&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Articles&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;&lt;a href="http://grinder.sourceforge.net/links.html" style="color: rgb(50, 78, 190); font-weight: bold; "&gt;http://grinder.sourceforge.net/links.html&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;Commercial books&lt;/td&gt;&lt;td colspan="1" rowspan="1" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; vertical-align: top; "&gt;&lt;em&gt;Professional Java 2 Enterprise Edition with BEA WebLogic Server&lt;/em&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-3664621444718802362?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/3664621444718802362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=3664621444718802362' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3664621444718802362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3664621444718802362'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/07/grinder-java-load-testing-framework.html' title='The Grinder, a Java Load Testing Framework'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-8501118588165785786</id><published>2009-07-06T16:12:00.000-07:00</published><updated>2009-07-06T16:13:12.383-07:00</updated><title type='text'>Apache ZooKeeper</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;h1 style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 0px; margin-bottom: 0.5em; font-size: 20px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Welcome to Apache ZooKeeper!&lt;/h1&gt;&lt;div id="minitoc-area" style="border-top-style: solid; border-top-width: 1px; border-top-color: rgb(76, 108, 143); border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(76, 108, 143); margin-top: 15px; margin-right: 106px; margin-bottom: 5px; margin-left: 15px; padding-bottom: 7px; padding-top: 5px; "&gt;&lt;ul class="minitoc" style="list-style-image: url(http://hadoop.apache.org/zookeeper/skin/images/current.gif); font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 25px; padding-bottom: 0px; padding-left: 25px; "&gt;&lt;li style="margin-top: 0em; margin-bottom: 0em; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; "&gt;&lt;a href="http://hadoop.apache.org/zookeeper/#What+is+ZooKeeper%3F" style="color: rgb(0, 153, 153); "&gt;What is ZooKeeper?&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0em; margin-bottom: 0em; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; "&gt;&lt;a href="http://hadoop.apache.org/zookeeper/#Getting+Started" style="color: rgb(0, 153, 153); "&gt;Getting Started&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0em; margin-bottom: 0em; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; "&gt;&lt;a href="http://hadoop.apache.org/zookeeper/#Getting+Involved" style="color: rgb(0, 0, 255); "&gt;Getting Involved&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;/p&gt;&lt;a name="N1000F"&gt;&lt;/a&gt;&lt;a name="What+is+ZooKeeper%3F"&gt;&lt;/a&gt;&lt;h2 class="h3" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 22px; margin-bottom: 3px; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;What is ZooKeeper?&lt;/h2&gt;&lt;div class="section"&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;Learn more about Zookeeper on the &lt;a href="http://wiki.apache.org/hadoop/ZooKeeper" style="color: rgb(0, 153, 153); "&gt;ZooKeeper Wiki&lt;/a&gt;&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;span class="Apple-style-span" style="line-height: normal; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 class="h3" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 22px; margin-bottom: 3px; font-size: 18px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;ZooKeeper: A Distributed Coordination Service for Distributed Applications&lt;/h2&gt;&lt;div class="section"&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;ZooKeeper is a distributed, open-source coordination service for distributed applications. It exposes a simple set of primitives that distributed applications can build upon to implement higher level services for synchronization, configuration maintenance, and groups and naming. It is designed to be easy to program to, and uses a data model styled after the familiar directory tree structure of file systems. It runs in Java and has bindings for both Java and C.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;Coordination services are notoriously hard to get right. They are especially prone to errors such as race conditions and deadlock. The motivation behind ZooKeeper is to relieve distributed applications the responsibility of implementing coordination services from scratch.&lt;/p&gt;&lt;a name="N10015"&gt;&lt;/a&gt;&lt;a name="sc_designGoals"&gt;&lt;/a&gt;&lt;h3 class="h4" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 18px; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Design Goals&lt;/h3&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;strong&gt;ZooKeeper is simple.&lt;/strong&gt; ZooKeeper allows distributed processes to coordinate with each other through a shared hierarchal namespace which is organized similarly to a standard file system. The name space consists of data registers - called znodes, in ZooKeeper parlance - and these are similar to files and directories. Unlike a typical file system, which is designed for storage, ZooKeeper data is kept in-memory, which means ZooKeeper can acheive high throughput and low latency numbers.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;The ZooKeeper implementation puts a premium on high performance, highly available, strictly ordered access. The performance aspects of ZooKeeper means it can be used in large, distributed systems. The reliability aspects keep it from being a single point of failure. The strict ordering means that sophisticated synchronization primitives can be implemented at the client.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;strong&gt;ZooKeeper is replicated.&lt;/strong&gt; Like the distributed processes it coordinates, ZooKeeper itself is intended to be replicated over a sets of hosts called an ensemble.&lt;/p&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(204, 204, 204); width: 1063px; font-size: 13px; empty-cells: show; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;ZooKeeper Service&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;&lt;img alt="" src="http://hadoop.apache.org/zookeeper/docs/current/images/zkservice.jpg" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;The servers that make up the ZooKeeper service must all know about each other. They maintain an in-memory image of state, along with a transaction logs and snapshots in a persistent store. As long as a majority of the servers are available, the ZooKeeper service will be available.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;Clients connect to a single ZooKeeper server. The client maintains a TCP connection through which it sends requests, gets responses, gets watch events, and sends heart beats. If the TCP connection to the server breaks, the client will connect to a different server.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;strong&gt;ZooKeeper is ordered.&lt;/strong&gt; ZooKeeper stamps each update with a number that reflects the order of all ZooKeeper transactions. Subsequent operations can use the order to implement higher-level abstractions, such as synchronization primitives.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;strong&gt;ZooKeeper is fast.&lt;/strong&gt; It is especially fast in "read-dominant" workloads. ZooKeeper applications run on thousands of machines, and it performs best where reads are more common than writes, at ratios of around 10:1.&lt;/p&gt;&lt;a name="N10045"&gt;&lt;/a&gt;&lt;a name="sc_dataModelNameSpace"&gt;&lt;/a&gt;&lt;h3 class="h4" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 18px; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Data model and the hierarchical namespace&lt;/h3&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;The name space provided by ZooKeeper is much like that of a standard file system. A name is a sequence of path elements separated by a slash (/). Every node in ZooKeeper's name space is identified by a path.&lt;/p&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(204, 204, 204); width: 1063px; font-size: 13px; empty-cells: show; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;ZooKeeper's Hierarchical Namespace&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;&lt;img alt="" src="http://hadoop.apache.org/zookeeper/docs/current/images/zknamespace.jpg" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;a name="N1005B"&gt;&lt;/a&gt;&lt;a name="Nodes+and+ephemeral+nodes"&gt;&lt;/a&gt;&lt;h3 class="h4" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 18px; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Nodes and ephemeral nodes&lt;/h3&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;Unlike is standard file systems, each node in a ZooKeeper namespace can have data associated with it as well as children. It is like having a file-system that allows a file to also be a directory. (ZooKeeper was designed to store coordination data: status information, configuration, location information, etc., so the data stored at each node is usually small, in the byte to kilobyte range.) We use the term &lt;em&gt;znode&lt;/em&gt; to make it clear that we are talking about ZooKeeper data nodes.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;Znodes maintain a stat structure that includes version numbers for data changes, ACL changes, and timestamps, to allow cache validations and coordinated updates. Each time a znode's data changes, the version number increases. For instance, whenever a client retrieves data it also receives the version of the data.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;The data stored at each znode in a namespace is read and written atomically. Reads get all the data bytes associated with a znode and a write replaces all the data. Each node has an Access Control List (ACL) that restricts who can do what.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;ZooKeeper also has the notion of ephemeral nodes. These znodes exists as long as the session that created the znode is active. When the session ends the znode is deleted. Ephemeral nodes are useful when you want to implement &lt;em&gt;[tbd]&lt;/em&gt;.&lt;/p&gt;&lt;a name="N10074"&gt;&lt;/a&gt;&lt;a name="Conditional+updates+and+watches"&gt;&lt;/a&gt;&lt;h3 class="h4" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 18px; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Conditional updates and watches&lt;/h3&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;ZooKeeper supports the concept of &lt;em&gt;watches&lt;/em&gt;. Clients can set a watch on a znodes. A watch will be triggered and removed when the znode changes. When a watch is triggered the client receives a packet saying that the znode has changed. And if the connection between the client and one of the Zoo Keeper servers is broken, the client will receive a local notification. These can be used to &lt;em&gt;[tbd]&lt;/em&gt;.&lt;/p&gt;&lt;a name="N10084"&gt;&lt;/a&gt;&lt;a name="Guarantees"&gt;&lt;/a&gt;&lt;h3 class="h4" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 18px; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Guarantees&lt;/h3&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;ZooKeeper is very fast and very simple. Since its goal, though, is to be a basis for the construction of more complicated services, such as synchronization, it provides a set of guarantees. These are:&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 25px; padding-bottom: 0px; padding-left: 25px; "&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 0.5em; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; "&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0px; margin-bottom: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Sequential Consistency - Updates from a client will be applied in the order that they were sent.&lt;/p&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 0.5em; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; "&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0px; margin-bottom: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Atomicity - Updates either succeed or fail. No partial results.&lt;/p&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 0.5em; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; "&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0px; margin-bottom: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Single System Image - A client will see the same view of the service regardless of the server that it connects to.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 25px; padding-bottom: 0px; padding-left: 25px; "&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 0.5em; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; "&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0px; margin-bottom: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Reliability - Once an update has been applied, it will persist from that time forward until a client overwrites the update.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 25px; padding-bottom: 0px; padding-left: 25px; "&gt;&lt;li style="margin-top: 0.5em; margin-bottom: 0.5em; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; "&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0px; margin-bottom: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Timeliness - The clients view of the system is guaranteed to be up-to-date within a certain time bound.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;For more information on these, and how they can be used, see &lt;em&gt;[tbd]&lt;/em&gt;&lt;/p&gt;&lt;a name="N100BA"&gt;&lt;/a&gt;&lt;a name="Simple+API"&gt;&lt;/a&gt;&lt;h3 class="h4" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 18px; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Simple API&lt;/h3&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;One of the design goals of ZooKeeper is provide a very simple programming interface. As a result, it supports only these operations:&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;term&gt;create&lt;/term&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;creates a node at a location in the tree&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;term&gt;delete&lt;/term&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;deletes a node&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;term&gt;exists&lt;/term&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;tests if a node exists at a location&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;term&gt;get data&lt;/term&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;reads the data from a node&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;term&gt;set data&lt;/term&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;writes data to a node&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;term&gt;get children&lt;/term&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;retrieves a list of children of a node&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;term&gt;sync&lt;/term&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;waits for data to be propagated&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;For a more in-depth discussion on these, and how they can be used to implement higher level operations, please refer to &lt;em&gt;[tbd]&lt;/em&gt;&lt;/p&gt;&lt;a name="N100FD"&gt;&lt;/a&gt;&lt;a name="Implementation"&gt;&lt;/a&gt;&lt;h3 class="h4" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 18px; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Implementation&lt;/h3&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;&lt;a href="http://hadoop.apache.org/zookeeper/docs/current/zookeeperOver.html#fg_zkComponents" style="color: rgb(0, 0, 255); "&gt;ZooKeeper Components&lt;/a&gt; shows the high-level components of the ZooKeeper service. With the exception of the request processor, each of the servers that make up the ZooKeeper service replicates its own copy of each of components.&lt;/p&gt;&lt;table class="ForrestTable" cellspacing="1" cellpadding="4" style="color: rgb(255, 255, 255); background-color: rgb(204, 204, 204); width: 1063px; font-size: 13px; empty-cells: show; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;ZooKeeper Components&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="color: black; background-color: rgb(255, 255, 255); margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;&lt;img alt="" src="http://hadoop.apache.org/zookeeper/docs/current/images/zkcomponents.jpg" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;The replicated database is an in-memory database containing the entire data tree. Updates are logged to disk for recoverability, and writes are serialized to disk before they are applied to the in-memory database.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;Every ZooKeeper server services clients. Clients connect to exactly one server to submit irequests. Read requests are serviced from the local replica of each server database. Requests that change the state of the service, write requests, are processed by an agreement protocol.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;As part of the agreement protocol all write requests from clients are forwarded to a single server, called the &lt;em&gt;leader&lt;/em&gt;. The rest of the ZooKeeper servers, called&lt;em&gt;followers&lt;/em&gt;, receive message proposals from the leader and agree upon message delivery. The messaging layer takes care of replacing leaders on failures and syncing followers with leaders.&lt;/p&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;ZooKeeper uses a custom atomic messaging protocol. Since the messaging layer is atomic, ZooKeeper can guarantee that the local replicas never diverge. When the leader receives a write request, it calculates what the state of the system is when the write is to be applied and transforms this into a transaction that captures this new state.&lt;/p&gt;&lt;a name="N10128"&gt;&lt;/a&gt;&lt;a name="Uses"&gt;&lt;/a&gt;&lt;h3 class="h4" style="font-family: 'Trebuchet MS', verdana, arial, helvetica, sans-serif; font-weight: bold; margin-top: 18px; margin-bottom: 0px; font-size: 17px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Uses&lt;/h3&gt;&lt;p style="line-height: 15px; text-align: left; margin-top: 0.5em; margin-bottom: 1em; "&gt;The programming interface to ZooKeeper is deliberately simple. With it, however, you can implement higher order operations, such as synchronizations primitives, group membership, ownership, etc. Some distributed applications have used it to: &lt;em&gt;[tbd: add uses from white paper and video presentation.]&lt;/em&gt; For more information, see&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-8501118588165785786?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/8501118588165785786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=8501118588165785786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/8501118588165785786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/8501118588165785786'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/07/apache-zookeeper.html' title='Apache ZooKeeper'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-7157112991487607635</id><published>2009-07-06T16:10:00.000-07:00</published><updated>2009-07-06T16:11:27.174-07:00</updated><title type='text'>rsync</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; color: rgb(17, 17, 17); font-size: 10px; "&gt;&lt;div class="headline_area" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 2.2em; margin-left: 0px; "&gt;&lt;h1 class="entry-title" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 2.6em; font-weight: normal; line-height: 1.308em; "&gt;from: &lt;span class="Apple-style-span" style="font-size: 10px; line-height: normal; "&gt;&lt;a href="http://www.cyberciti.biz/tips/linux-use-rsync-transfer-mirror-files-directories.html"&gt;http://www.cyberciti.biz/tips/linux-use-rsync-transfer-mirror-files-directories.html&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1 class="entry-title" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 2.6em; font-weight: normal; line-height: 1.308em; "&gt;How to use rsync for transferring files under Linux or UNIX&lt;/h1&gt;&lt;/div&gt;&lt;div class="format_text entry-content" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 1.4em; line-height: 1.571em; "&gt;&lt;div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 5px; float: right; "&gt;&lt;a href="http://www.cyberciti.biz/tips/category/linux/" title="See all GNU/Linux related tips/articles" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(0, 102, 153); text-decoration: underline; "&gt;&lt;img src="http://figs.cyberciti.biz/3rdparty/linux-logo.png" border="0" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;How do you install and use rsync to synchronize files and directories from one location (or one server) to another location? - A common question asked by new sys admin.&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://samba.anu.edu.au/rsync/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(0, 102, 153); text-decoration: underline; "&gt;rsync&lt;/a&gt;&lt;/strong&gt; is a free software computer program for Unix and Linux like systems which synchronizes files and directories from one location to another while minimizing data transfer using delta encoding when appropriate. An important feature of rsync not found in most similar programs/protocols is that the mirroring takes place with only one transmission in each direction.&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;So what is unique about rsync?&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;It can perform differential uploads and downloads (synchronization) of files across the network, transferring only data that has changed. The rsync remote-update protocol allows rsync to transfer just the differences between two sets of files across the network connection.&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;How do I install rsync?&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;Use any one of the following commands to install rsync.&lt;/p&gt;&lt;h4 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 1em; font-weight: bold; "&gt;If you are using Debian or Ubuntu Linux, type the following command&lt;/h4&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;# apt-get install rsync&lt;/code&gt;&lt;br /&gt;OR&lt;br /&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;$ sudo apt-get install rsync&lt;/code&gt;&lt;/p&gt;&lt;h4 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 1em; font-weight: bold; "&gt;If you are using Red Hat Enterprise Linux (RHEL), type the following command&lt;/h4&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;# up2date rsync&lt;/code&gt;&lt;/p&gt;&lt;h4 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 1em; font-weight: bold; "&gt;If you are using CentOS/Fedora Core Linux, type the following command&lt;/h4&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;# yum install rsync&lt;/code&gt;&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Always use rsync over ssh&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;Since rsync does not provide any security while transferring data it is recommended that you use rsync over ssh . This allows a secure remote connection. Now let us see some examples of rsync.&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;rsync command common options&lt;/h3&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; list-style-type: square; list-style-position: initial; list-style-image: initial; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;--delete&lt;/strong&gt; : delete files that don't exist on sender (system)&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;-v&lt;/strong&gt; : Verbose (try &lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;-vv&lt;/strong&gt; for more detailed information)&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;-e "ssh options"&lt;/strong&gt; : specify the ssh as remote shell&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;-a&lt;/strong&gt; : archive mode&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;-r&lt;/strong&gt; : recurse into directories&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;-z&lt;/strong&gt; : compress file data&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Task : Copy file from a local computer to a remote server&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;Copy file from /www/backup.tar.gz to a remote server called openbsd.nixcraft.in&lt;br /&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;$ rsync -v -e ssh /www/backup.tar.gz jerry@openbsd.nixcraft.in:~&lt;/code&gt;Output:&lt;/p&gt;&lt;pre style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); overflow-x: auto; overflow-y: auto; clear: both; font-size: 0.929em; line-height: 1.385em; background-position: initial initial; "&gt;Password: sent 19099 bytes  received 36 bytes  1093.43 bytes/sec total size is 19014  speedup is 0.99&lt;/pre&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;Please note that symbol &lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;~&lt;/strong&gt; indicate the users home directory (/home/jerry).&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Task : Copy file from a remote server to a local computer&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;Copy file /home/jerry/webroot.txt from a remote server openbsd.nixcraft.in to a local computer /tmp directory:&lt;br /&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;$ rsync -v -e ssh jerry@openbsd.nixcraft.in:~/webroot.txt /tmp&lt;/code&gt;&lt;br /&gt;Password&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Task: Synchronize a local directory with a remote directory&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;$ rsync -r -a -v -e "ssh -l jerry" --delete openbsd.nixcraft.in:/webroot/ /local/webroot&lt;/code&gt;&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Task: Synchronize a remote directory with a local directory&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;$ rsync -r -a -v -e "ssh -l jerry" --delete /local/webroot openbsd.nixcraft.in:/webroot&lt;/code&gt;&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Task: Synchronize a local directory with a remote rsync server&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;$ rsync -r -a -v --delete rsync://rsync.nixcraft.in/cvs /home/cvs&lt;/code&gt;&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Task: Mirror a directory between my "old" and "new" web server/ftp&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;You can mirror a directory between my "old" (my.old.server.com) and "new" web server with the command (assuming that ssh keys are set for password less authentication)&lt;br /&gt;&lt;code style="padding-top: 0.615em; padding-right: 0.846em; padding-bottom: 0.615em; padding-left: 0.846em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.692em; margin-left: 0px; font-family: Consolas, 'Andale Mono', Courier, 'Courier New'; line-height: 1.385em; background-image: none; background-repeat: repeat; background-attachment: scroll; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(238, 238, 238); font-size: 0.929em; display: block; overflow-x: auto; overflow-y: auto; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); background-position: 0px 0px; "&gt;$ rsync -zavrR --delete --links --rsh="ssh -l vivek" my.old.server.com:/home/lighttpd /home/lighttpd&lt;/code&gt;&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Read related previous articles&lt;/h3&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; list-style-type: square; list-style-position: initial; list-style-image: initial; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.cyberciti.biz/tips/how-do-i-sync-data-between-two-load-balanced-linuxunix-servers.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(0, 102, 153); text-decoration: underline; "&gt;How do I sync data between two Load balanced Linux/UNIX servers?&lt;/a&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.cyberciti.biz/tips/how-do-i-sync-data-between-two-load-balanced-windows-2003-servers.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(0, 102, 153); text-decoration: underline; "&gt;How do I sync data between two Load balanced Windows 2003 servers?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Other options - rdiff and rdiff-backup&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;There also exists a utility called rdiff, which uses the rsync algorithm to generate delta files Using rdiff. A utility called rdiff-backup has been created which is capable of maintaining a backup mirror of a file or directory over the network, on another server. rdiff-backup stores incremental rdiff deltas with the backup, with which it is possible to recreate any backup point. Next time I will write about these Utilities :)&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;rsync for Windows server/XP&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;Please note if you are using Windows, try any one of the program:&lt;/p&gt;&lt;ol style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(0, 102, 153); text-decoration: underline; "&gt;DeltaCopy&lt;/a&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.nasbackup.com/index.php/Main_Page" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(0, 102, 153); text-decoration: underline; "&gt;NasBackup&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;Further readings&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;=&gt; Read rsync man page&lt;br /&gt;=&gt; &lt;a href="http://samba.anu.edu.au/rsync/documentation.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(0, 102, 153); text-decoration: underline; "&gt;Official rsync documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-7157112991487607635?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/7157112991487607635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=7157112991487607635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7157112991487607635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7157112991487607635'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/07/rsync.html' title='rsync'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-9062121457065518724</id><published>2009-06-04T15:11:00.000-07:00</published><updated>2009-06-04T15:12:00.429-07:00</updated><title type='text'>The Ten Minute Guide to diff and patch</title><content type='html'>&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 13px; "&gt;&lt;h1 style="font-family: Verdana, Arial, sans-serif; color: rgb(32, 144, 32); font-weight: normal; border-top-width: 1px; border-top-style: dashed; border-top-color: rgb(170, 170, 170); background-color: rgb(239, 239, 255); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; font-size: 1.7em; margin-top: 0px; "&gt;from: &lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; "&gt;&lt;a href="http://stephenjungels.com/jungels.net/articles/diff-patch-ten-minutes.html"&gt;http://stephenjungels.com/jungels.net/articles/diff-patch-ten-minutes.html&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style="font-family: Verdana, Arial, sans-serif; color: rgb(32, 144, 32); font-weight: normal; border-top-width: 1px; border-top-style: dashed; border-top-color: rgb(170, 170, 170); background-color: rgb(239, 239, 255); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; font-size: 1.7em; margin-top: 0px; "&gt;&lt;br /&gt;&lt;/h1&gt;&lt;h1 style="font-family: Verdana, Arial, sans-serif; color: rgb(32, 144, 32); font-weight: normal; border-top-width: 1px; border-top-style: dashed; border-top-color: rgb(170, 170, 170); background-color: rgb(239, 239, 255); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; font-size: 1.7em; margin-top: 0px; "&gt;The Ten Minute Guide to diff and patch&lt;/h1&gt;&lt;p&gt;Situation one: you are trying to compile a package from source and you discover that somebody has already done the work for you of modifying it slightly to compile on your system. They have made their work available as a "patch", but you're not sure how to make use of it. The answer is that you apply the patch to the original source code with a command line tool called, appropriately, patch.&lt;/p&gt;&lt;p&gt;Situation two: you have downloaded the source code to an open source package and after an hour or so of minor edits, you manage to make it compile on your system. You would like to make your work available to other programmers, or to the authors of the package, without redistributing the entire modified package. Now you are in a situation where you need to create a patch of your own, and the tool you need is diff.&lt;/p&gt;&lt;p&gt;This is a quick guide to diff and patch which will help you in these situations by describing the tools as they are most commonly used. It tells you enough to get started right away. Later, you can learn the ins and outs of diff and patch at your leisure, using the man pages.&lt;/p&gt;&lt;h2 style="font-family: Verdana, Arial, sans-serif; color: rgb(32, 144, 32); font-weight: normal; border-top-width: 1px; border-top-style: dashed; border-top-color: rgb(170, 170, 170); background-color: rgb(239, 239, 255); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; font-size: 1.45em; "&gt;Applying patches with patch&lt;/h2&gt;&lt;p&gt;To apply a patch to a single file, change to the directory where the file is located and call patch:&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;patch &lt;&gt;&lt;/pre&gt;&lt;p&gt;These instructions assume the patch is distributed in unified format, which identifies the file the patch should be applied to. If not, you can specify the file on the command line:&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;patch foo.txt &lt;&gt;&lt;/pre&gt;&lt;p&gt;Applying patches to entire directories (perhaps the more common case) is similar, but you have to be careful about setting a "p level". What this means is that, within patch files, the files to be patched are identified by path names which may be different now that the files are located on your computer rather than on the computer where the patch was created. The p level instructs patch to ignore parts of the path name so that it can identify the files correctly. Most often a p level of one will work, so you use:&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;patch -p1 &lt;&gt;&lt;/pre&gt;&lt;p&gt;You should change to the top level source directory before running this command. If a patch level of one does not correctly identify any files to patch, inspect the patch file for file names. If you see a name like&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;/users/stephen/package/src/net/http.c &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and you are working in a directory that contains net/http.c, use&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;patch -p5 &lt;&gt;&lt;/pre&gt;&lt;p&gt;In general, count up one for each path separator (slash character) that you remove from the beginning of the path, until what's left is a path that exists in your working directory. The count you reach is the p level.&lt;/p&gt;&lt;p&gt;To remove a patch, use the -R flag, ie&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;patch -p5 -R &lt;&gt;&lt;/pre&gt;&lt;h2 style="font-family: Verdana, Arial, sans-serif; color: rgb(32, 144, 32); font-weight: normal; border-top-width: 1px; border-top-style: dashed; border-top-color: rgb(170, 170, 170); background-color: rgb(239, 239, 255); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; font-size: 1.45em; "&gt;Creating patches with diff&lt;/h2&gt;&lt;p&gt;Using diff is simple whether you are working with single files or entire source directories. To create a patch for a single file, use the form:&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;diff -u original.c new.c &gt; original.patch &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To create a patch for an entire source tree, make a copy of the tree:&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;cp -R original new &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Make any changes required in the directory new/. Then create a patch with the following command:&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;diff -rupN original/ new/ &gt; original.patch &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That's all you need to get started with diff and patch. For more information use:&lt;/p&gt;&lt;pre style="background-color: rgb(239, 239, 255); padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; font-size: 1em; "&gt;&lt;code style="font-size: 1em; "&gt;man diff man patch &lt;/code&gt;&lt;/pre&gt;&lt;h2 style="font-family: Verdana, Arial, sans-serif; color: rgb(32, 144, 32); font-weight: normal; border-top-width: 1px; border-top-style: dashed; border-top-color: rgb(170, 170, 170); background-color: rgb(239, 239, 255); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; font-size: 1.45em; "&gt;Translations&lt;/h2&gt;&lt;p&gt;This article has been translated and republished in the following languages:&lt;/p&gt;&lt;p&gt;Spanish: &lt;a href="http://www.rat.uclatux.org.ve/2009/05/guia-de-10-minutos-de-diff-y-patch/" style="text-decoration: none; "&gt;Guia de 10 minutos de diff y patch&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Copyright © 2006-2008 Stephen Jungels. Written permission is required to repost or reprint this article&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-9062121457065518724?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/9062121457065518724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=9062121457065518724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/9062121457065518724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/9062121457065518724'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/06/ten-minute-guide-to-diff-and-patch.html' title='The Ten Minute Guide to diff and patch'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-1119390452086532088</id><published>2009-05-16T13:53:00.000-07:00</published><updated>2009-05-16T13:55:40.918-07:00</updated><title type='text'>Jabber Client with Flex &amp; PureMVC</title><content type='html'>&lt;span class="Apple-style-span" style="color: rgb(68, 68, 68); font-family: Arial; font-size: 14px; line-height: 21px; "&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 28px; font-weight: bold; line-height: 28px; text-transform: uppercase;"&gt;From: &lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: 'Lucida Grande'; font-size: 12px; font-weight: normal; line-height: normal; text-transform: none; white-space: pre; "&gt;http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-conclusion-demo-downloads/&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: 'Lucida Grande'; font-size: 12px; line-height: normal; white-space: pre; "&gt;&amp;amp; http://actionscriptnotes.com/blog/2008/07/21/jabber-client-with-flex-puremvc/&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1 style="display: inline; font-size: 2em; line-height: 1em; text-transform: uppercase; "&gt;&lt;a href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-conclusion-demo-downloads/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;PUREMVC TUTORIAL - FLEX, PUREMVC, JABBER AND XIFF 3: CONCLUSION, DEMO &amp;amp; DOWNLOADS&lt;/a&gt;&lt;/h1&gt;&lt;div style="margin-top: -2px; "&gt;&lt;small style="color: rgb(119, 119, 119); "&gt;07.19.08 &lt;b&gt;|&lt;/b&gt; 34 Comments&lt;/small&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="post" style="margin-bottom: 1em; "&gt;&lt;p&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Introduction" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-introduction/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Introduction&lt;/a&gt;&lt;br /&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Part 1 - Frameworks" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-part-1-frameworks/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Part 1 - Frameworks&lt;/a&gt;&lt;br /&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Part 2 - Directory structure" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-part-2-directory-structure/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Part 2 - Directory structure&lt;/a&gt;&lt;br /&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Part 3 - Application and ApplicationFacade" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-part-3-application-and-applicationfacade/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Part 3 - Application and ApplicationFacade&lt;/a&gt;&lt;br /&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Part 4 - Notifications, Commands &amp;amp; Use Cases" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-part-4-notifications-commands-use-cases/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Part 4 - Notifications, Commands &amp;amp; Use Cases&lt;/a&gt;&lt;br /&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Part 5 - Model &amp;amp; Proxy" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-part-5-model-proxy/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Part 5 - Model &amp;amp; Proxy&lt;/a&gt;&lt;br /&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Part 6 - The Application View &amp;amp; Mediator" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-part-6-the-application-view-mediator/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Part 6 - The Application View &amp;amp; Mediator&lt;/a&gt;&lt;br /&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Part 7 - The Login View &amp;amp; Mediator" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-part-7-the-login-view-mediator/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Part 7 - The Login View &amp;amp; Mediator&lt;/a&gt;&lt;br /&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Part 8 - The Roster View &amp;amp; Mediator" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-part-8-the-roster-view-mediator/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Part 8 - The Roster View &amp;amp; Mediator&lt;/a&gt;&lt;br /&gt;&lt;a title="PureMVC Tutorial - Flex, PureMVC, Jabber and XIFF 3: Part 9 - The Chat View &amp;amp; Mediator" href="http://www.actionscriptdeveloper.co.uk/puremvc-tutorial-flex-puremvc-jabber-and-xiff-3-part-9-the-chat-view-mediator/" style="color: rgb(102, 153, 204); text-decoration: none; font-weight: bold; "&gt;Part 9 - The Chat View &amp;amp; Mediator&lt;/a&gt;&lt;br /&gt;Conclusion, Demo &amp;amp; Downloads&lt;/p&gt;&lt;p&gt;Here is a working demo of the application!&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-1119390452086532088?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/1119390452086532088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=1119390452086532088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1119390452086532088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1119390452086532088'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/jabber-client-with-flex-puremvc.html' title='Jabber Client with Flex &amp; PureMVC'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-3369128559347016511</id><published>2009-05-15T20:13:00.000-07:00</published><updated>2009-05-15T20:15:13.764-07:00</updated><title type='text'>libketama - a consistent hashing algo for memcache clients</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; font-weight: bold; line-height: 14px; "&gt;libketama - a consistent hashing algo for memcache clients&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; font-weight: bold; line-height: 14px;"&gt;from: &lt;span class="Apple-style-span" style="font-weight: normal; line-height: normal; white-space: pre; "&gt;http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: rgb(27, 27, 27); line-height: 18px; white-space: normal; "&gt;&lt;div class="journalBody" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;&lt;div class="bbcode" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;We wrote ketama to replace how our memcached clients mapped keys to servers. Previously, clients mapped keys-&gt;servers like this:&lt;br /&gt;&lt;br /&gt;&lt;code style="font-style: normal; font-weight: normal; "&gt;server = serverlist[hash(key)%serverlist.length];&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This meant that whenever we added or removed servers from the pool, everything hashed to different servers, which effectively wiped the entire cache. We add (and sometimes remove) servers from the memcached pool often enough to warrant writing this - if your memcached pool never changes, you can probably stop reading now :)&lt;br /&gt;&lt;br /&gt;Ketama is an implementation of a consistent hashing algorithm, meaning you can add or remove servers from the memcached pool without causing a complete remap of all keys.&lt;br /&gt;&lt;br /&gt;Here's how it works:&lt;br /&gt;&lt;br /&gt;* Take your list of servers (eg: 1.2.3.4:11211, 5.6.7.8:11211, 9.8.7.6:11211)&lt;br /&gt;* Hash each server string to several (100-200) unsigned ints&lt;br /&gt;* Conceptually, these numbers are placed on a circle called the continuum. (imagine a clock face that goes from 0 to 2^32)&lt;br /&gt;* Each number links to the server it was hashed from, so servers appear at several points on the continuum, by each of the numbers they hashed to.&lt;br /&gt;* To map a key-&gt;server, hash your key to a single unsigned int, and find the next biggest number on the continuum. The server linked to that number is the correct server for that key.&lt;br /&gt;* If you hash your key to a value near 2^32 and there are no points on the continuum greater than your hash, return the first server in the continuum.&lt;br /&gt;&lt;br /&gt;If you then add or remove a server from the list, only a small proportion of keys end up mapping to different servers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The majority of the code is a C library (libketama) and a php4 extension that wraps it. I've also included a class from our Java client. (Java Collections makes it rather easy). We use a single-server memcache client wrapped with a native php class to make it multi-server capable, so we just replaced the hashing method with a ketama_find_server call. (should be easy enough to plug this into libmemcache if need be)&lt;br /&gt;&lt;br /&gt;&lt;del&gt;&lt;a href="http://static.last.fm/rj/ketama.tar.bz2" style="color: rgb(1, 135, 197); text-decoration: none; "&gt;http://static.last.fm/rj/ketama.tar.bz2&lt;/a&gt;&lt;/del&gt;&lt;br /&gt;&lt;del&gt;&lt;a href="http://static.last.fm/ketama/ketama-0.1.1.tar.bz2" style="color: rgb(1, 135, 197); text-decoration: none; "&gt;http://static.last.fm/ketama/ketama-0.1.1.tar.bz2&lt;/a&gt;&lt;/del&gt;&lt;br /&gt;svn://svn.audioscrobbler.net/misc/ketama/&lt;br /&gt;&lt;br /&gt;We've been using this in production for all our php installs and java services at Last.fm for around 10 days now. We deployed it just in time to smooth over moving loads of webservers between datacenters.&lt;/div&gt;&lt;/div&gt;&lt;div class="acceptedGroupSubmissions" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;&lt;h5 style="color: rgb(0, 0, 0); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; font-size: 100%; font-weight: bold; "&gt;Accepted Submissions&lt;/h5&gt;&lt;a href="http://www.last.fm/group/Programmers+-+Anyone+who+writes+code" style="color: rgb(1, 135, 197); text-decoration: none; "&gt;Programmers - Anyone who writes code&lt;/a&gt;&lt;/div&gt;&lt;div class="acceptedGroupSubmissions" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; vertical-align: top; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-3369128559347016511?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/3369128559347016511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=3369128559347016511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3369128559347016511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3369128559347016511'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/libketama-consistent-hashing-algo-for.html' title='libketama - a consistent hashing algo for memcache clients'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-5851008060053219748</id><published>2009-05-15T19:12:00.000-07:00</published><updated>2009-05-15T19:13:53.400-07:00</updated><title type='text'>DRBD</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; "&gt;from: http://www.drbd.org/ and http://oss.linbit.com/drbd/&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 11px; white-space: normal; "&gt;&lt;div class="csc-header csc-header-n1"&gt;&lt;h1 style="font-family: Arial, Verdana; font-size: 20px; "&gt;&lt;img src="http://www.drbd.org/typo3temp/GB/bfc765b59e.gif" width="197" height="26" border="0" alt="" title="" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; " /&gt;&lt;/h1&gt;&lt;/div&gt;&lt;a id="c38" style="font-family: Verdana, Geneva, Arial, helvetica, sans-serif; font-size: 11px; color: rgb(255, 102, 0); text-decoration: none; "&gt;&lt;/a&gt;&lt;div class="csc-textpic csc-textpic-center csc-textpic-above" style="text-align: center; "&gt;&lt;div class="csc-textpic-imagewrap" style="width: 630px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; "&gt;&lt;dl class="csc-textpic-image csc-textpic-lastcol" style="width: 630px; margin-top: 0px; display: inline; margin-left: 10px; margin-bottom: 5px; margin-right: 0px !important; text-align: left; float: left; "&gt;&lt;dt style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; display: inline; float: none; "&gt;&lt;img src="http://www.drbd.org/uploads/pics/overview_02.gif" width="630" height="344" border="0" alt="" style="border-width: initial; border-color: initial; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="csc-textpic-clear" style="clear: both; "&gt;&lt;/div&gt;&lt;a id="c37" style="font-family: Verdana, Geneva, Arial, helvetica, sans-serif; font-size: 11px; color: rgb(255, 102, 0); text-decoration: none; "&gt;&lt;/a&gt;&lt;p class="bodytext"&gt;DRBD&lt;sup&gt;®&lt;/sup&gt; refers to block devices designed as a building block to form high availability (HA) clusters. This is done by mirroring a whole block device via an assigned network. DRBD can be understood as network based raid-1.&lt;/p&gt;&lt;p class="bodytext"&gt;In the illustration above, the two orange boxes represent two servers that form an HA cluster. The boxes contain the usual components of a Linux™ kernel: file system, buffer cache, disk scheduler, disk drivers, TCP/IP stack and network interface card (NIC) driver. The black arrows illustrate the flow of data between these components.&lt;/p&gt;&lt;p class="bodytext"&gt;The orange arrows show the flow of data, as DRBD mirrors the data of a high availably service from the active node of the HA cluster to the standby node of the HA cluster.&lt;/p&gt;&lt;p class="bodytext"&gt;&lt;a href="http://www.drbd.org/home/what-is-ha/" target="_top" class="internal-link" style="font-family: Verdana, Geneva, Arial, helvetica, sans-serif; font-size: 11px; color: rgb(255, 102, 0); text-decoration: none; "&gt;→ Continue with &lt;em&gt;What is HA&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="bodytext"&gt;&lt;em&gt;DRBD&lt;/em&gt;&lt;sup&gt;®&lt;/sup&gt; &lt;em&gt;and the DRBD&lt;/em&gt;&lt;sup&gt;®&lt;/sup&gt;&lt;em&gt; logo&lt;/em&gt;&lt;em&gt; are trademarks or registered trademarks of LINBIT&lt;/em&gt;&lt;sup&gt;®&lt;/sup&gt;&lt;em&gt; in Austria, the United States and other countries. &lt;/em&gt;&lt;/p&gt;&lt;p class="bodytext"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="bodytext"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: 16px; font-style: normal; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;pre&gt;DRBD is a block device which is designed to build high availability clusters.    This is done by mirroring a whole block device via (a dedicated) network. You    could see it as a network raid-1.        DRBD takes over the data, writes it to the local disk and sends it to the other    host. On the other host, it takes it to the disk there.        The other components needed are a cluster membership service, which is supposed    to be heartbeat, and some kind of application that works on top of a block    device.        Each device (DRBD provides more than one of these devices) has a state, which    can be 'primary' or 'secondary'. On the node with the primary device the    application is supposed to run and to access the device (/dev/drbdX; used to be    /dev/nbX). Every write is sent to the local 'lower level block device' and to    the node with the device in 'secondary' state. The secondary device simply    writes the data to its lower level block device. Reads are always carried out    locally.        If the primary node fails, heartbeat is switching the secondary device into    primary state and starts the application there. (If you are using it with a    non-journaling FS this involves running fsck)        If the failed node comes up again, it is a new secondary node and has to    synchronise its content to the primary. This, of course, will happen whithout    interruption of service in the background.         And, of course, we only will resynchronize those parts of the device that    actually have been changed. DRBD has always done intelligent resynchronization    when possible. Starting with the DBRD-0.7 series, you can define an "active    set" of a certain size. This makes it possible to have a total resync time of    1--3 min, regardless of device size (currently up to 4TB), even after a hard    crash of an active node.         The ChangeLogs can be found here:    &lt;a href="http://git.drbd.org/?p=drbd-8.0.git;a=blob;f=ChangeLog;hb=HEAD"&gt;http://git.drbd.org/?p=drbd-8.0.git;a=blob;f=ChangeLog;hb=HEAD&lt;/a&gt;    &lt;a href="http://git.drbd.org/?p=drbd-8.2.git;a=blob;f=ChangeLog;hb=HEAD"&gt;http://git.drbd.org/?p=drbd-8.2.git;a=blob;f=ChangeLog;hb=HEAD&lt;/a&gt;    &lt;a href="http://git.drbd.org/"&gt;http://git.drbd.org/&lt;/a&gt;        The DRBD Homepage is &lt;a href="http://www.drbd.org/"&gt;http://www.drbd.org/&lt;/a&gt;.&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-5851008060053219748?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/5851008060053219748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=5851008060053219748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/5851008060053219748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/5851008060053219748'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/drbd.html' title='DRBD'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-1072049842858246334</id><published>2009-05-14T14:26:00.000-07:00</published><updated>2009-05-14T14:27:17.601-07:00</updated><title type='text'>Nagios</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; "&gt;http://www.nagios.org/&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: verdana; font-size: 11px; white-space: normal; "&gt;&lt;table border="0" class="Content" cellspacing="0" cellpadding="0" style="font-family: verdana, arial, serif; font-size: 8pt; background-color: white; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td height="450"&gt;&lt;img src="http://www.nagios.org/images/pixel.gif" border="0" width="1" height="450" /&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;table border="0" class="Content" cellspacing="0" cellpadding="0" style="font-family: verdana, arial, serif; font-size: 8pt; background-color: white; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td height="5"&gt;&lt;img src="http://www.nagios.org/images/pixel.gif" width="1" height="5" alt="" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;div class="ContentTitle" style="font-family: arial, verdana, serif; background-color: white; color: black; font-size: 18pt; font-weight: bold; "&gt;About Nagios&lt;/div&gt;&lt;img src="http://www.nagios.org/images/pixel.gif" border="0" width="1" height="2" /&gt;&lt;div class="ContentBreadcrumbs" style="font-family: verdana, arial, serif; background-color: white; color: black; font-size: 7pt; "&gt;&lt;a href="http://www.nagios.org/" style="font-family: verdana, arial, serif; color: black; font-weight: normal; "&gt;Home&lt;/a&gt; &gt; About&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td height="15"&gt;&lt;img src="http://www.nagios.org/images/pixel.gif" width="1" height="15" alt="" border="0" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="Content" valign="top" style="font-family: verdana, arial, serif; font-size: 8pt; background-color: white; "&gt;&lt;div class="aboutpage" style="font-size: 10pt; font-family: arial, verdana; width: 770px; "&gt;&lt;div class="aboutleft" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 0px; margin-left: 0px; width: 510px; "&gt;&lt;h1 style="font-size: 14pt; font-weight: bold; "&gt;Get proactive.&lt;div class="sub" style="font-size: 13pt; font-weight: bold; margin-top: 3px; margin-right: 0px; margin-bottom: 0px; margin-left: 50px; "&gt;Save time, money, and your sanity.&lt;/div&gt;&lt;/h1&gt;&lt;h2 style="font-size: 10pt; font-weight: normal; "&gt;Nagios is the industry standard in enterprise-class monitoring for good reason. It allows you to gain insight into your network and fix problems before customers know they even exist. It's stable, scalable, supported, and extensible. Most importantly, &lt;u&gt;it works&lt;/u&gt;.&lt;/h2&gt;&lt;h3 style="font-size: 10pt; font-weight: normal; "&gt;What does Nagios provide?&lt;/h3&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Comprehensive Network Monitoring&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;Windows&lt;/li&gt;&lt;li&gt;Linux/Unix&lt;/li&gt;&lt;li&gt;Routers, Switches, Firewalls&lt;/li&gt;&lt;li&gt;Printers&lt;/li&gt;&lt;li&gt;Services&lt;/li&gt;&lt;li&gt;Applications&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="aboutfeatureimage" style="float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; "&gt;&lt;img src="http://www.nagios.org/images/about/network.png" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Immediate Awareness and Insight&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;Receive immediate notifications of problems via email, pager and cellphone&lt;/li&gt;&lt;li&gt;Multi-user notification escalation capabilities&lt;/li&gt;&lt;li&gt;See detailed status information through the Nagios web interface&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="aboutfeatureimage" style="float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; "&gt;&lt;img src="http://www.nagios.org/images/about/awareness.png" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Problem Remediation&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;Acknowledge problems through the web interface&lt;/li&gt;&lt;li&gt;Automatically restart failed applications, services and hosts with event handlers&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="aboutfeatureimage" style="float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; "&gt;&lt;img src="http://www.nagios.org/images/about/remediation.png" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Proactive Planning&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;Schedule downtime for anticipated host, service, and network upgrades&lt;/li&gt;&lt;li&gt;Capacity planning capabilites through usage monitoring&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Reporting Options&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;SLA availability reports&lt;/li&gt;&lt;li&gt;Alert and notification history reports&lt;/li&gt;&lt;li&gt;Trending reports through integration with Cacti and RRD-based addons&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Multi-Tenant/Multi-User Capabilites&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;Multiple users can access the web interface&lt;/li&gt;&lt;li&gt;Each user can have their own unique, restricted view&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="aboutfeatureimage" style="float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; "&gt;&lt;img src="http://www.nagios.org/images/about/tenant.png" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Integration With Your Existing Applications&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;Trouble ticket systems&lt;/li&gt;&lt;li&gt;Wikis&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Easily Extendable Architecture&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;Over 200 community addons are available to enhance Nagios&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="aboutfeatureimage" style="float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; "&gt;&lt;img src="http://www.nagios.org/images/about/architecture.png" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Stable, Reliable, and Respected Platform&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;10 years in development&lt;/li&gt;&lt;li&gt;Scales to monitor 100,000+ nodes&lt;/li&gt;&lt;li&gt;Failover protection capabilities&lt;/li&gt;&lt;li&gt;Winner of multiple awards&lt;/li&gt;&lt;li&gt;Constant media coverage&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="aboutfeatureimage" style="float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; "&gt;&lt;img src="http://www.nagios.org/images/about/awards.png" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Huge Community&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;250,000+ users worldwide&lt;/li&gt;&lt;li&gt;Active mailing lists&lt;/li&gt;&lt;li&gt;Extensive community website network&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="aboutfeatureimage" style="float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; "&gt;&lt;img src="http://www.nagios.org/images/about/community.png" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="step" style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; "&gt;&lt;h2 style="font-weight: bold; font-size: 12pt; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Customizable Code&lt;/h2&gt;&lt;hr class="stepbar" style="border-top-width: 3px; border-right-width: 3px; border-bottom-width: 3px; border-left-width: 3px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(201, 201, 201); border-right-color: rgb(201, 201, 201); border-bottom-color: rgb(201, 201, 201); border-left-color: rgb(201, 201, 201); background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(201, 201, 201); margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-position: initial initial; "&gt;&lt;br /&gt;&lt;div class="aboutfeatures" style="margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; width: 385px; "&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 25px; margin-left: 0px; list-style-type: circle; list-style-position: initial; list-style-image: initial; "&gt;&lt;li&gt;Open Source Software&lt;/li&gt;&lt;li&gt;Full access to source code&lt;/li&gt;&lt;li&gt;Released under the GPL license&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-1072049842858246334?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/1072049842858246334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=1072049842858246334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1072049842858246334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1072049842858246334'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/nagios.html' title='Nagios'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-8121139438666087123</id><published>2009-05-14T14:00:00.001-07:00</published><updated>2009-05-14T14:05:00.151-07:00</updated><title type='text'>Ganglia</title><content type='html'>&lt;span class="Apple-style-span"   style="color: rgb(51, 51, 51);   font-family:Verdana;font-size:21px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="color: rgb(0, 0, 0);   white-space: pre; font-family:'Lucida Grande';font-size:12px;"&gt;http://ganglia.info/&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="color: rgb(0, 0, 0);   white-space: pre;font-family:'Lucida Grande';font-size:12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="color: rgb(0, 0, 0);   white-space: pre;font-family:'Lucida Grande';font-size:12px;"&gt;&lt;span class="Apple-style-span" style="color: rgb(68, 68, 68); white-space: normal; "&gt;&lt;h2 style="font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, sans-serif; font-weight: bold; font-size: 1.6em; color: rgb(51, 51, 51); text-decoration: none; "&gt;What is Ganglia?&lt;/h2&gt;&lt;div class="entry"&gt;&lt;p&gt;Ganglia is a scalable distributed monitoring system for high-performance computing systems such as clusters and Grids. It is based on a hierarchical design targeted at federations of clusters. It leverages widely used technologies such as XML for data representation, XDR for compact, portable data transport, and RRDtool for data storage and visualization. It uses carefully engineered data structures and algorithms to achieve very low per-node overheads and high concurrency. The implementation is robust, has been ported to an extensive set of operating systems and processor architectures, and is currently in use on thousands of clusters around the world. It has been used to link clusters across university campuses and around the world and can scale to handle clusters with 2000 nodes.&lt;/p&gt;&lt;p&gt;Ganglia is an open-source project that grew out of the &lt;strong&gt;University of California, Berkeley &lt;a href="http://www.millennium.berkeley.edu/" style="color: rgb(0, 102, 204); text-decoration: none; outline-width: 0px; outline-style: initial; outline-color: initial; "&gt;Millennium Project&lt;/a&gt;&lt;/strong&gt; which was initially funded in large part by the &lt;a href="http://www.npaci.edu/" style="color: rgb(0, 102, 204); text-decoration: none; outline-width: 0px; outline-style: initial; outline-color: initial; "&gt;National Partnership for Advanced Computational Infrastructure&lt;/a&gt; (NPACI) and &lt;a href="http://www.nsf.gov/" style="color: rgb(0, 102, 204); text-decoration: none; outline-width: 0px; outline-style: initial; outline-color: initial; "&gt;National Science Foundation&lt;/a&gt; RI Award EIA-9802069. NPACI is funded by the &lt;a href="http://www.nsf.gov/" style="color: rgb(0, 102, 204); text-decoration: none; outline-width: 0px; outline-style: initial; outline-color: initial; "&gt;National Science Foundation&lt;/a&gt; and strives to advance science by creating a ubiquitous, continuous, and pervasive national computational infrastructure: the Grid. Current support comes from &lt;a href="http://www.planet-lab.org/" style="color: rgb(0, 102, 204); text-decoration: none; outline-width: 0px; outline-style: initial; outline-color: initial; "&gt;Planet Lab&lt;/a&gt;: an open platform for developing, deploying, and accessing planetary-scale services.&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Ganglia&lt;a name="IDX-CHP-10-0558"&gt;&lt;/a&gt; (&lt;a class="docLink" target="_blank" href="http://ganglia.sourceforge.net/" style="color: rgb(0, 51, 153); "&gt;http://ganglia.sourceforge.net/&lt;/a&gt;) takes a stab at answering all of these questions. Ganglia is comprised of several components: gmond, gmetad, and gmetric (pronounced gee-mon-dee and so forth), which perform the roles of sending data, aggregating data, and collecting data, respectively. gmond, the Ganglia-monitoring daemon, runs on each host we want to monitor. It collects core statistics like processor, memory, and network usage and deals with sending them to the spokesperson for the server cluster. The spokesperson for a cluster collects all of the data for the machine in a cluster (such as web servers or database servers) and then sends them on to the central logging host. gmetad is used for aggregating together cluster data at intermediate nodes. gmetric allows you to inject extra metric data into the Ganglia multicast channel, sending your statistics to the central repository.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 48px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 48px;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Arial; font-size: 33px; "&gt;&lt;p class="docText" style="font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(51, 51, 51); font-size: x-small; "&gt;One of the really useful abilities of the Ganglia system is how easy it is to extend the monitoring with custom metrics. We can write a program or script that runs periodically via cron to check on our statistic and then feed it into the Ganglia aggregation and recording framework by using the gmetric program. Our custom scripts can collect the data using whatever means necessary and then inject a single value (for each sampling run) along with the metric they're collecting for, its format, and units:&lt;/p&gt;&lt;pre style="color: rgb(121, 0, 41); font-family: 'Andale Mono', 'Courier New', Courier, monospace; font-size: x-small; "&gt;/usr/bin/gmetric -tuint32 -nmemcachced_hitratio -v92 -u% &lt;/pre&gt;&lt;br /&gt;&lt;p class="docText" style="font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(51, 51, 51); font-size: x-small; "&gt;This example feeds data into Ganglia for a statistic called &lt;tt style="color: rgb(121, 0, 41); font-family: 'Andale Mono', 'Courier New', Courier, monospace; font-size: 90%; "&gt;memcached_hitratio&lt;/tt&gt;. If Ganglia hasn't seen this statistic before, it will create a new RRDTool database for storing it, using the data type specified by the &lt;tt style="color: rgb(121, 0, 41); font-family: 'Andale Mono', 'Courier New', Courier, monospace; font-size: 90%; "&gt;-t&lt;/tt&gt; flag (unsigned 32-bit integer in this example). The value 92 is then stored for this sampling period. Once two sampling periods have been completed, we can see a graph of the &lt;tt style="color: rgb(121, 0, 41); font-family: 'Andale Mono', 'Courier New', Courier, monospace; font-size: 90%; "&gt;memcached_hitratio&lt;/tt&gt; statistic on the Ganglia status page for that node. The final &lt;tt style="color: rgb(121, 0, 41); font-family: 'Andale Mono', 'Courier New', Courier, monospace; font-size: 90%; "&gt;-u&lt;/tt&gt;flag lets us tell Ganglia what units the statistic is being gathered in, which then displays on the output graphs, as shown in &lt;a class="docLink" href="file:///D:/EBook/SYSTEM/BuildingScalableWebSites_2006/0596102356/web2apps-CHP-10-SECT-2.html#web2apps-CHP-10-FIG-8" style="color: rgb(0, 51, 153); "&gt;Figure 10-8&lt;/a&gt;.&lt;/p&gt;&lt;a name="web2apps-CHP-10-FIG-8"&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;h5 class="docFigureTitle" style="font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); font-size: small; font-weight: bold; "&gt;Figure 10-8. Output graph with units&lt;/h5&gt;&lt;br /&gt;&lt;/center&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-8121139438666087123?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/8121139438666087123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=8121139438666087123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/8121139438666087123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/8121139438666087123'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/ganglia.html' title='Ganglia'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-3648437360697170699</id><published>2009-05-14T13:58:00.001-07:00</published><updated>2009-05-14T13:58:33.683-07:00</updated><title type='text'>RRDtool</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; "&gt;http://oss.oetiker.ch/rrdtool/&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: -webkit-sans-serif; font-size: 16px; white-space: normal; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;h2 style="margin-top: 0.6em; margin-bottom: 0.1em; color: rgb(96, 96, 96); "&gt;What RRDtool does&lt;/h2&gt;&lt;p&gt;RRDtool is the OpenSource industry standard, high performance data logging and graphing system for time series data. Use it to write your custom monitoring shell scripts or create whole applications using its Perl, Python, Ruby, TCL or PHP bindings.&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-3648437360697170699?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/3648437360697170699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=3648437360697170699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3648437360697170699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3648437360697170699'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/rrdtool.html' title='RRDtool'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-1168574830825728932</id><published>2009-05-14T13:51:00.000-07:00</published><updated>2009-05-14T13:52:43.199-07:00</updated><title type='text'>Tobi Oetiker's Toolbox</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; "&gt;From: http://tobi.oetiker.ch/hp/&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS'; font-size: 16px; white-space: normal; "&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;I work as an IT-Specialist for &lt;a href="http://www.oetiker.ch/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;&lt;span class="caps"&gt;OETIKER&lt;/span&gt;+PARTNER AG&lt;/a&gt; a consultancy company based in Olten, Switzerland.&lt;/p&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;We use OpenSource Software extensively in all of our projects. So I made it a habit to open source code we write whenever possible. Below is a list of notable projects I have created or been involved with over the years.&lt;/p&gt;&lt;h2 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); font-size: 130%; "&gt;Monitoring&lt;/h2&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://oss.oetiker.ch/rrdtool/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;&lt;span class="caps"&gt;RRD&lt;/span&gt;tool&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;A industry standard database for logging and graphing time-series data.&lt;/p&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://oss.oetiker.ch/mrtg/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;&lt;span class="caps"&gt;MRTG&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;The first widely used, long term network monitoring tool on the Internet. I created it in 1995 and still update it regularly as people send in patches.&lt;/p&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://oss.oetiker.ch/smokeping/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;SmokePing&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;Monitor latency on your network. By default it uses ping to track the latency on your network links.&lt;/p&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://oss.oetiker.ch/optools/wiki/du2rrd/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;du2rrd&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;Running a large storage server. This highly configurable tool lets you keep track of disk usage per directory. It comes with a Ajax front end and needs classic du for input.&lt;/p&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://oss.oetiker.ch/optools/wiki/w32apimon" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;Perl Win32::Monitoring Modules&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;A set of perl modules helping to write user interactivity monitoring systems.&lt;/p&gt;&lt;h2 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); font-size: 130%; "&gt;Database Development&lt;/h2&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://isg.ee.ethz.ch/tools/gedafe/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;Gedafe the Generic Database Frontend&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;Developed with David Schweikert, this neat tool lets you write database centric web applications by simple setting up a postgresql database while following a few simple design and naming rules.&lt;/p&gt;&lt;h2 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); font-size: 130%; "&gt;System Management&lt;/h2&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://insights.oetiker.ch/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;O+P Insights&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;A website where me and my colleagues document our insights connected with all things system management.&lt;/p&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://isg.ee.ethz.ch/tools/realmen/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;Windows System Management: Real Men Don't Click&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;A website about windows system management setup I helped setup while I was working for &lt;span class="caps"&gt;ETH&lt;/span&gt; Zurich.&lt;/p&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://oss.oetiker.ch/op-sepp/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;OP &lt;span class="caps"&gt;SEPP&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;A software deployment system for large Unix systems. It deals with multi architecture issues, multiple versions of the same package installed in parallel.&lt;/p&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://isg.ee.ethz.ch/tools/isgtc/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;&lt;span class="caps"&gt;ISG&lt;/span&gt; Toolchest&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;A system for keeping track of all the little scripts you write while sysadmining. Also on this page you find a large collection of tools developed at &lt;span class="caps"&gt;ETH&lt;/span&gt; Zurich using the system.&lt;/p&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://tobi.oetiker.ch/solaris/sambasamfs/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;SamFS Support for Samba&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;This patch teaches Samba to handle SamFS offline files.&lt;/p&gt;&lt;h2 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); font-size: 130%; "&gt;Miscellaneous&lt;/h2&gt;&lt;h3 style="margin-top: 1.5ex; margin-bottom: 1ex; color: rgb(66, 71, 69); "&gt;&lt;a href="http://tobi.oetiker.ch/lshort/" style="color: rgb(71, 156, 7); text-decoration: none; "&gt;The not so Short Introduction to LaTeX2e&lt;/a&gt;&lt;/h3&gt;&lt;p style="margin-top: 0.5ex; margin-bottom: 2ex; line-height: 3.2ex; "&gt;LaTeX is a system for writing documents with perfect looks while fully concentrating on the content. This document shows you how to do this.&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-1168574830825728932?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/1168574830825728932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=1168574830825728932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1168574830825728932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1168574830825728932'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/tobi-oetikers-toolbox.html' title='Tobi Oetiker&apos;s Toolbox'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-2738962880544690331</id><published>2009-05-14T13:46:00.000-07:00</published><updated>2009-05-14T13:47:16.150-07:00</updated><title type='text'>TUX</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; "&gt;http://www.redhat.com/docs/manuals/tux/&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; white-space: normal; "&gt;&lt;table width="100%" border="0" cellspacing="0" cellpadding="0" style="font-size: x-small; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="left" style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; text-align: left; vertical-align: top; "&gt;&lt;h1 style="margin-top: 0px; margin-bottom: 0.5em; padding-bottom: 0px; padding-top: 0px; font-size: x-large; "&gt;Red Hat Content Accelerator Manuals&lt;/h1&gt;&lt;/td&gt;&lt;td align="right" style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; text-align: left; vertical-align: top; "&gt;&lt;a href="http://www.redhat.com/docs/help/" style="color: rgb(0, 102, 204); "&gt;&lt;h1 style="margin-top: 0px; margin-bottom: 0.5em; padding-bottom: 0px; padding-top: 0px; font-size: x-large; "&gt;&lt;span style="color:#990000;"&gt;?&lt;/span&gt;&lt;/h1&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="line-height: 1.25em; "&gt;Red Hat Content Accelerator is a kernel-based, multi-threaded, extremely high performance HTTP server with the ability to serve both static and dynamic data. TUX is also an architecture for kernel-accelerated network services.&lt;/p&gt;&lt;table bgcolor="#cccccc" width="100%" border="0" cellspacing="0" cellpadding="5" style="font-size: x-small; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; text-align: left; vertical-align: top; "&gt;&lt;span class="titletextbig"&gt;Red Hat Content Accelerator 2.2&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p style="line-height: 1.25em; "&gt;&lt;a href="http://www.redhat.com/docs/manuals/tux/TUX-2.2-Manual/" class="titletextbig" style="color: rgb(0, 102, 204); "&gt;Reference Manual&lt;/a&gt;&lt;br /&gt;&lt;span class="smalltext"&gt;&lt;a href="http://www.redhat.com/docs/manuals/tux/pdf/rh-content-accelerator-2.2.pdf" style="color: rgb(0, 102, 204); "&gt;PDF&lt;/a&gt; (208 KB)    &lt;span class="darkgreytext"&gt;|&lt;/span&gt;    &lt;a href="http://www.redhat.com/docs/manuals/tux/tarball/rh-content-accelerator-2.2.tgz" style="color: rgb(0, 102, 204); "&gt;HTML Tarball&lt;/a&gt; (28 KB)&lt;/span&gt;&lt;/p&gt;&lt;table bgcolor="#cccccc" width="100%" border="0" cellspacing="0" cellpadding="5" style="font-size: x-small; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; text-align: left; vertical-align: top; "&gt;&lt;span class="titletextbig"&gt;Red Hat Content Accelerator 2.1&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p style="line-height: 1.25em; "&gt;&lt;a href="http://www.redhat.com/docs/manuals/tux/TUX-2.1-Manual/" class="titletextbig" style="color: rgb(0, 102, 204); "&gt;Reference Manual&lt;/a&gt;&lt;br /&gt;&lt;span class="smalltext"&gt;&lt;a href="http://www.redhat.com/docs/manuals/tux/pdf/tux-21.pdf" style="color: rgb(0, 102, 204); "&gt;PDF&lt;/a&gt; (144 KB)   &lt;span class="darkgreytext"&gt;|&lt;/span&gt;   &lt;a href="http://www.redhat.com/docs/manuals/tux/tarball/TUXrg-2.1.tar.gz" style="color: rgb(0, 102, 204); "&gt;HTML Tarball&lt;/a&gt; (24 KB)&lt;/span&gt;&lt;/p&gt;&lt;table bgcolor="#cccccc" width="100%" border="0" cellspacing="0" cellpadding="5" style="font-size: x-small; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; text-align: left; vertical-align: top; "&gt;&lt;span class="titletextbig"&gt;Red Hat Content Accelerator 2.0&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p style="line-height: 1.25em; "&gt;&lt;a href="http://www.redhat.com/docs/manuals/tux/TUX-2.0-Manual/" class="titletextbig" style="color: rgb(0, 102, 204); "&gt;Reference Manual&lt;/a&gt;&lt;br /&gt;&lt;span class="smalltext"&gt;&lt;a href="http://www.redhat.com/docs/manuals/tux/pdf/tux-20.pdf" style="color: rgb(0, 102, 204); "&gt;PDF&lt;/a&gt; (76 KB)   &lt;span class="darkgreytext"&gt;|&lt;/span&gt;   &lt;a href="http://www.redhat.com/docs/manuals/tux/tarball/TUXrg-2.0.tar.gz" style="color: rgb(0, 102, 204); "&gt;HTML Tarball&lt;/a&gt; (22 KB)&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-2738962880544690331?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/2738962880544690331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=2738962880544690331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/2738962880544690331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/2738962880544690331'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/tux.html' title='TUX'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-6666214555455005722</id><published>2009-05-14T13:45:00.000-07:00</published><updated>2009-05-14T13:46:14.914-07:00</updated><title type='text'>MogileFS is our open source distributed filesystem</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; "&gt;http://www.danga.com/mogilefs/&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 16px; white-space: normal; "&gt;&lt;h2 style="font-size: 1em; margin-bottom: 0px; "&gt;About MogileFS&lt;/h2&gt;&lt;p&gt;MogileFS is our open source distributed filesystem. Its properties and features include:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;Application level&lt;/b&gt; -- no special kernel modules required.&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;No single point of failure&lt;/b&gt; -- all three components of a MogileFS setup (storage nodes, trackers, and the tracker's database(s)) can be run on multiple machines, so there's no single point of failure. (you can run trackers on the same machines as storage nodes, too, so you don't need 4 machines...) A minimum of 2 machines is recommended.&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;Automatic file replication&lt;/b&gt; -- files, based on their "class", are automatically replicated between enough different storage nodes as to satisfy the minimum replica count as requested by their class. For instance, for a photo hosting site you can make original JPEGs have a minimum replica count of 3, but thumbnails and scaled versions only have a replica count of 1 or 2. If you lose the only copy of a thumbnail, the application can just rebuild it. In this way, MogileFS (without RAID) can save money on disks that would otherwise be storing multiple copies of data unnecessarily.&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;"Better than RAID"&lt;/b&gt; -- in a non-SAN RAID setup, the disks are redundant, but the host isn't. If you lose the entire machine, the files are inaccessible. MogileFS replicates the files between devices which are on different hosts, so files are always available.&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;Flat Namespace&lt;/b&gt; -- Files are identified by named keys in a flat, global namespace. You can create as many namespaces as you'd like, so multiple applications with potentially conflicting keys can run on the same MogileFS installation.&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;Shared-Nothing&lt;/b&gt; -- MogileFS doesn't depend on a pricey SAN with shared disks. Every machine maintains its own local disks.&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;No RAID required&lt;/b&gt; -- Local disks on MogileFS storage nodes can be in a RAID, or not. It's cheaper not to, as RAID doesn't buy you any safety that MogileFS doesn't already provide.&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;Local filesystem agnostic&lt;/b&gt; -- Local disks on MogileFS storage nodes can be formatted with your filesystem of choice (ext3, XFS, etc..). MogileFS does its own internal directory hashing so it doesn't hit filesystem limits such as "max files per directory" or "max directories per directory". Use what you're comfortable with.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;MogileFS is not:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;POSIX Compliant&lt;/b&gt; -- you don't run regular Unix applications or databases against MogileFS. It's meant for archiving write-once files and doing only sequential reads. (though you can modify a file by way of overwriting it with a new version) Notes:&lt;ul&gt;&lt;li style="margin-top: 0.5em; "&gt;Yes, this means your application has to specifically use a MogileFS client library to store and retrieve files. The &lt;a href="http://mogilefs.pbwiki.com/HighLevelOverview"&gt;steps in general&lt;/a&gt; are 1) talk to a tracker about what you want to put or get, 2) read/write to one of the places it told you you could (it'll pick storage node(s) for you as part of its load balancing), using HTTP GET/PUT&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;We've prototyped a FUSE binding, so you could use MogileFS without application support, but it's not production-ready.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;b&gt;Completely portable ... yet&lt;/b&gt; -- we have some Linux-isms in our code, at least in the HTTP transport code. Our plan is to scrap that and make it portable, though.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Please see one of these Wiki pages for more information:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;a href="http://mogilefs.pbwiki.com/HighLevelOverview"&gt;High-level overview of MogileFS&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;a href="http://mogilefs.pbwiki.com/ObtainingMogileFS"&gt;Obtaining MogileFS&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;a href="http://mogilefs.pbwiki.com/SetupConfig"&gt;Setup and Configuration&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;a href="http://www.danga.com/mogilefs/usage.bml"&gt;Using MogileFS from Perl&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Need help? Have Questions?&lt;/h3&gt;&lt;ul&gt;&lt;li style="margin-top: 0.5em; "&gt;Join &lt;a href="http://groups.google.com/group/mogile"&gt;the mailing list&lt;/a&gt;! We'd love to help you out.&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;&lt;a href="http://lists.danga.com/pipermail/mogilefs/"&gt;MogileFS List Archives&lt;/a&gt; - For postings until June 2008&lt;/li&gt;&lt;li style="margin-top: 0.5em; "&gt;Check out &lt;a href="http://mogilefs.pbwiki.com/"&gt;the MogileFS Wiki&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-6666214555455005722?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/6666214555455005722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=6666214555455005722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6666214555455005722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/6666214555455005722'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/mogilefs-is-our-open-source-distributed.html' title='MogileFS is our open source distributed filesystem'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-220456855899340836</id><published>2009-05-14T13:44:00.000-07:00</published><updated>2009-05-14T13:45:01.756-07:00</updated><title type='text'>squid-cache.org: Optimising Web Delivery</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; "&gt;http://www.squid-cache.org/&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: rgb(30, 30, 30); font-family: 'Trebuchet MS'; white-space: normal; "&gt;&lt;h2 style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: normal; color: rgb(0, 0, 0); margin-bottom: 10px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(223, 223, 223); font-size: 26px; "&gt;Squid: Optimising Web Delivery&lt;/h2&gt;&lt;p style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; line-height: 24px; "&gt;Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. Squid has extensive access controls and makes a great server accelerator. It runs on most available operating systems, including Windows and is licensed under the GNU GPL.&lt;/p&gt;&lt;h3 style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; color: rgb(0, 0, 0); padding-bottom: 5px; font-size: 16px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(223, 223, 223); "&gt;Making the most of your Internet Connection&lt;/h3&gt;&lt;p style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; line-height: 24px; "&gt;Squid is used by hundreds of Internet Providers world-wide to provide their users with the best possible web access. Squid optimises the data flow between client and server to improve performance and caches frequently-used content to save bandwidth. Squid can also route content requests to servers in a wide variety of ways to build cache server hierarchies which optimise network throughput.&lt;/p&gt;&lt;h3 style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; color: rgb(0, 0, 0); padding-bottom: 5px; font-size: 16px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(223, 223, 223); "&gt;Website Content Acceleration and Distribution&lt;/h3&gt;&lt;p style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; line-height: 24px; "&gt;Thousands of web-sites around the Internet use Squid to drastically increase their content delivery. Squid can reduce your server load and improve delivery speeds to clients. Squid can also be used to deliver content from around the world - copying only the content being used, rather than inefficiently copying everything. Finally, Squid's advanced content routing configuration allows you to build content clusters to route and load balance requests via a variety of web servers.&lt;/p&gt;&lt;p style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; line-height: 24px; "&gt;&lt;q style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; "&gt; [The Squid systems] are currently running at a hit-rate of approximately 75%, effectively quadrupling the capacity of the Apache servers behind them. This is particularly noticeable when a large surge of traffic arrives directed to a particular page via a web link from another site, as the caching efficiency for that page will be nearly 100%. &lt;/q&gt; - Wikemedia Deployment Information.&lt;/p&gt;&lt;h3 style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; color: rgb(0, 0, 0); padding-bottom: 5px; font-size: 16px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(223, 223, 223); "&gt;Want to learn more?&lt;/h3&gt;&lt;p style="font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif; line-height: 24px; "&gt;The Squid project provides a number of resources to assist users design, implement and support Squid installations. Please browse the Documentation and Support sections for more information.&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-220456855899340836?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/220456855899340836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=220456855899340836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/220456855899340836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/220456855899340836'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/squid-cacheorg-optimising-web-delivery.html' title='squid-cache.org: Optimising Web Delivery'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-1942889691175709982</id><published>2009-05-14T13:42:00.000-07:00</published><updated>2009-05-14T13:43:09.831-07:00</updated><title type='text'>The Spread Toolkit</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; "&gt;http://www.spread.org/&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial; "&gt;&lt;table width="100%" border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="13" align="left"&gt; &lt;/td&gt;&lt;td align="left" valign="top"&gt;&lt;br /&gt;&lt;table width="100%" border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="61%" align="left" valign="top"&gt;&lt;h2 style="font-family: arial, helvetica; color: rgb(0, 43, 127); font-size: 18px; font-weight: normal; "&gt;Welcome to the Spread Toolkit!&lt;/h2&gt;&lt;p style="font-family: arial, helvetica; color: rgb(0, 0, 0); font-size: 12px; "&gt;Spread is an open source toolkit that provides a high performance messaging service that is resilient to faults across local and wide area networks. Spread functions as a unified message bus for distributed applications, and provides highly tuned application-level multicast, group communication, and point to point support. Spread services range from reliable messaging to fully ordered messages with delivery guarantees.&lt;/p&gt;&lt;p style="font-family: arial, helvetica; color: rgb(0, 0, 0); font-size: 12px; "&gt;Spread can be used in many distributed applications that require high reliability, high performance, and robust communication among various subsets of members. The toolkit is designed to encapsulate the challenging aspects of asynchronous networks and enable the construction of reliable and scalable distributed applications.&lt;/p&gt;&lt;p style="font-family: arial, helvetica; color: rgb(0, 0, 0); font-size: 12px; "&gt;Spread consists of a library that user applications are linked with, a binary daemon which runs on each computer that is part of the processor group, and various utility and demonstration programs.&lt;/p&gt;&lt;p style="font-family: arial, helvetica; color: rgb(0, 0, 0); font-size: 12px; "&gt;&lt;b&gt;Some of the services and benefits provided by Spread:&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style="font-family: arial, helvetica; color: rgb(0, 0, 0); font-size: 12px; "&gt;&lt;li&gt;Reliable and scalable messaging and group communication.&lt;/li&gt;&lt;li&gt;A very powerful but simple API simplifies the construction of distributed architectures.&lt;/li&gt;&lt;li&gt;Easy to use, deploy and maintain.&lt;/li&gt;&lt;li&gt;Highly scalable from one local area network to complex wide area networks.&lt;/li&gt;&lt;li&gt;Supports thousands of groups with different sets of members.&lt;/li&gt;&lt;li&gt;Enables message reliability in the presence of machine failures, process crashes and recoveries, and network partitions and merges.&lt;/li&gt;&lt;li&gt;Provides a range of reliability, ordering and stability guarantees for messages.&lt;/li&gt;&lt;li&gt;Emphasis on robustness and high performance.&lt;/li&gt;&lt;li&gt;Completely distributed algorithms with no central point of failure.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-1942889691175709982?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/1942889691175709982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=1942889691175709982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1942889691175709982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1942889691175709982'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/05/spread-toolkit.html' title='The Spread Toolkit'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-1927657440248603196</id><published>2009-04-22T17:03:00.000-07:00</published><updated>2009-04-22T17:04:08.529-07:00</updated><title type='text'>Bazaar</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 12px; "&gt;&lt;span style="font-size:130%;"&gt;&lt;u&gt;Introduction&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Bazaar (or bzr) is a project of Canonical to develop an open source distributed version control system that is powerful, friendly, and scalable. &lt;/i&gt;... It is used by Launchpad for managing revisions with packages. If you have never created a Launchpad project because bzr scared you, fear no more!&lt;br /&gt;&lt;br /&gt;To get started, you should install the bzr application by running:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;sudo apt-get install bzr&lt;/pre&gt;&lt;/div&gt;Bazaar relies on SSH keys to transfer files to your Launchpad account. If you don't have a SSH key, you can follow the next steps to get your SSH key on Launchpad. If you already have your SSH key on Launchpad, you can skip this section to "Using Bazaar".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;u&gt;Launchpad / SSH Key&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To create your SSH key, open a terminal and run:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;ssh-keygen -t dsa&lt;/pre&gt;&lt;/div&gt;Leave the first prompt (for the key location) at default, by pressing Enter, then enter a passphrase for your private SSH key. When complete, run:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;cat ~/.ssh/id_dsa.pub&lt;/pre&gt;&lt;/div&gt;Copy your public key, from the previous command, then go to Launchpad to edit your SSH key:&lt;br /&gt;&lt;a href="https://launchpad.net/~username/+editsshkeys" target="_blank" style="color: rgb(68, 68, 68); text-decoration: underline; "&gt;https://launchpad.net/~username/+editsshkeys&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Paste the key into "Add an SSH key" then click "Import Public Key". You should be all set now!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;u&gt;Using Bazaar&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Suppose you found a project on Launchpad, that you wanted to help out with, or wanted to download their project source to tweak it to your own likings. I'll give my perlbot project as a quick example. If you go to:&lt;br /&gt;&lt;a href="https://code.launchpad.net/~drsmall/perlbot/trunk" target="_blank" style="color: rgb(68, 68, 68); text-decoration: underline; "&gt;https://code.launchpad.net/~drsmall/perlbot/trunk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can view the trunk, and revisions for that project. If you wanted to download a copy of this trunk to your local system, you would issue this command:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr pull lp:perlbot&lt;/pre&gt;&lt;/div&gt;This would then download the source files of perlbot to ~/perlbot on your system. You can then execute, run, or send the revisions back to the trunk (with proper permission).&lt;br /&gt;&lt;br /&gt;Ok. So let's say you want to start your own branch, where you can host your own edited version of some software, or it could be something you created by yourself that you want to be worked on by a team. Gather up all of the files you want to placed in your launchpad branch, and place them in one directory. cd to this directory, and then run:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr init&lt;/pre&gt;&lt;/div&gt;This makes the directory into a version branch. If you take the time to notice, there is now a hidden directory called .bzr in here. This is where all the revisions, and files are stored to be used by bzr. Now, add all of the files to the branch:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr add *&lt;/pre&gt;&lt;/div&gt;It is a good idea to get in the habit of running the next command for checking the difference between your last revision and the current one. You shouldn't have to do this on your first time around, though.&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr diff&lt;/pre&gt;&lt;/div&gt;With this next step, we are committing our edits into the current revision. It is a good idea to label your revisions with meaningful comments.&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr commit -m "Revision 1 Comment"&lt;/pre&gt;&lt;/div&gt;You may now upload your revision to your Launchpad branch. If the branch does not exist, it will be created. You can have multiple branches, so name them accordingly. This command may take a few minutes, but it is creating the branch, uploading your files, creating revisions and alot of other things.&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr push lp:~user/projectname/branchname&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;u&gt;Commands&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Make directory a bzr branch:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr init&lt;/pre&gt;&lt;/div&gt;Download a branch:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr pull &lt;location&gt;&lt;/pre&gt;&lt;/div&gt;Update a branch:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr push &lt;location&gt;&lt;/pre&gt;&lt;/div&gt;Add files to branch:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr add &lt;filename&gt;&lt;/pre&gt;&lt;/div&gt;Check the difference between revisions:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr diff&lt;/pre&gt;&lt;/div&gt;Commit the revision:&lt;br /&gt;&lt;div style="margin-right: 20px; margin-bottom: 20px; margin-left: 20px; margin-top: 5px; "&gt;&lt;div class="smallfont" style="margin-bottom: 2px; color: rgb(0, 0, 0); margin-top: 2px; "&gt;Code:&lt;/div&gt;&lt;pre class="alt2" dir="ltr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 6px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: inset; border-right-style: inset; border-bottom-style: inset; border-left-style: inset; border-color: initial; width: 640px; height: 34px; text-align: left; overflow-x: auto; overflow-y: auto; background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); background-position: initial initial; "&gt;bzr commit -m "Revision Comment"&lt;/pre&gt;&lt;/div&gt;(These are just the basic commands. You can find the complete list of commands by running 'man bzr' in your terminal.)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-1927657440248603196?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/1927657440248603196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=1927657440248603196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1927657440248603196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/1927657440248603196'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/04/bazaar.html' title='Bazaar'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-8007032409310625239</id><published>2009-04-19T19:14:00.001-07:00</published><updated>2009-04-19T19:18:43.955-07:00</updated><title type='text'>Performance Timer ..</title><content type='html'>&lt;div&gt;From &lt;span class="Apple-style-span"   style="  white-space: pre; font-family:'Lucida Grande';font-size:12px;"&gt;&lt;a href="http://java.sun.com/developer/JDCTechTips/2002/tt0305.html"&gt;http://java.sun.com/developer/JDCTechTips/2002/tt0305.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Arial;font-size:12px;"&gt;&lt;pre   style=" color: rgb(68, 68, 68);  font-family:Monaco, Courier, 'Courier New', monospace;font-size:11px;"&gt;&lt;span class="Apple-style-span"   style="color: rgb(0, 0, 0);   white-space: normal;font-family:Georgia;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-family: Monaco, Courier, 'Courier New', monospace; color: rgb(68, 68, 68); font-size: 11px; "&gt;class MyTimer {         &lt;/pre&gt;&lt;pre style="font-family: Monaco, Courier, 'Courier New', monospace; color: rgb(68, 68, 68); font-size: 11px; "&gt;private final long start;              &lt;/pre&gt;&lt;pre style="font-family: Monaco, Courier, 'Courier New', monospace; color: rgb(68, 68, 68); font-size: 11px; "&gt;public MyTimer() {             &lt;/pre&gt;&lt;pre style="font-family: Monaco, Courier, 'Courier New', monospace; color: rgb(68, 68, 68); font-size: 11px; "&gt;start = System.currentTimeMillis();         &lt;/pre&gt;&lt;pre style="font-family: Monaco, Courier, 'Courier New', monospace; color: rgb(68, 68, 68); font-size: 11px; "&gt;}              &lt;/pre&gt;&lt;pre style="font-family: Monaco, Courier, 'Courier New', monospace; color: rgb(68, 68, 68); font-size: 11px; "&gt;public long getElapsed() {             &lt;/pre&gt;&lt;pre style="font-family: Monaco, Courier, 'Courier New', monospace; color: rgb(68, 68, 68); font-size: 11px; "&gt;return System.currentTimeMillis() - start;         &lt;/pre&gt;&lt;pre style="font-family: Monaco, Courier, 'Courier New', monospace; color: rgb(68, 68, 68); font-size: 11px; "&gt;}     &lt;/pre&gt;&lt;pre style="font-family: Monaco, Courier, 'Courier New', monospace; color: rgb(68, 68, 68); font-size: 11px; "&gt;}&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Arial;font-size:12px;"&gt;&lt;p style="margin-top: 3px; margin-bottom: 17px; "&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Arial;font-size:12px;"&gt;&lt;p style="margin-top: 3px; margin-bottom: 17px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 3px; margin-bottom: 17px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 3px; margin-bottom: 17px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-8007032409310625239?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/8007032409310625239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=8007032409310625239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/8007032409310625239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/8007032409310625239'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/04/performance-timer.html' title='Performance Timer ..'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-4459342002973152470</id><published>2009-04-18T15:41:00.001-07:00</published><updated>2009-04-18T15:41:55.994-07:00</updated><title type='text'>Summary of techniques used in Dynamo and their advantages.</title><content type='html'>&lt;div&gt;From "Amazon Dynamo" paper ..&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 'trebuchet ms'; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;&lt;i&gt;Table 1: Summary of techniques used in Dynamo and their advantages.&lt;/i&gt;&lt;/p&gt;&lt;table border="1" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;&lt;b&gt;Problem&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;&lt;b&gt;Technique&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;&lt;b&gt;Advantage&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Partitioning&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Consistent Hashing&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Incremental Scalability&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;High Availability for writes&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Vector clocks with reconciliation during reads&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Version size is decoupled from update rates.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Handling temporary failures&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Sloppy Quorum and hinted handoff&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Provides high availability and durability guarantee when some of the replicas are not available.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Recovering from permanent failures&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Anti-entropy using Merkle trees&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Synchronizes divergent replicas in the background.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Membership and failure detection&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Gossip-based membership protocol and failure detection.&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;p align="center" style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 0.75em; "&gt;Preserves symmetry and avoids having a centralized registry for storing membership and node liveness information.&lt;/p&gt;&lt;div style="text-align: -webkit-center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-4459342002973152470?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/4459342002973152470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=4459342002973152470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/4459342002973152470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/4459342002973152470'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/04/summary-of-techniques-used-in-dynamo.html' title='Summary of techniques used in Dynamo and their advantages.'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-7861765295557194537</id><published>2009-04-18T15:14:00.000-07:00</published><updated>2009-04-18T15:15:05.057-07:00</updated><title type='text'>Object versioning</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px; "&gt;&lt;div class="attribute-heading"&gt;&lt;h1 style="font-style: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; font-weight: normal; margin-top: 0.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-size: 1.7em; "&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;From (&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; white-space: pre; font-size: 12px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;http://ez.no/doc/ez_publish/technical_manual/3_9/concepts_and_basics/content_management/object_versioning)&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style="font-style: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; font-weight: normal; font-size: 1.7em; margin-top: 0.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; color: rgb(241, 94, 34); "&gt;Object versioning&lt;/h1&gt;&lt;/div&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;eZ publish comes with a built in versioning system which is implemented at the object level. This mechanism makes it possible to have several versions of the contents (attributes) of an object. It basically provides a generic, out-of-the-box version control framework that can be used with any kind of content. The different versions are encapsulated by the object itself. The following illustration shows a more detailed example of the object structure seen from the outside world.&lt;/p&gt;&lt;div class="object-center" style="text-align: center; margin-top: 1.5em; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "&gt;&lt;img src="http://ez.no/var/doc/storage/images/ez_publish/technical_manual/3_9/images/concepts_and_basics/object_structure_basic_versions/1182-2-eng-GB/object_structure_basic_versions_doc.png" alt="Example of a content object that consists of two versions." /&gt;&lt;p style="margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; margin-top: 1em; font-style: italic; color: rgb(64, 64, 64); "&gt;Example of a content object that consists of two versions.&lt;/p&gt;&lt;/div&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;Every time an object is edited, a new version of the object's contents will be created. It is always the new version that will be edited, the old version(s) remains untouched. This is how eZ publish keeps track of changes made by various users. An accidental or unwanted change can thus be undone by simply reverting an object back to the previous version.&lt;/p&gt;&lt;a name="eztoc63286_1" id="eztoc63286_1" style="color: rgb(33, 87, 138); text-decoration: underline; "&gt;&lt;/a&gt;&lt;h2 style="font-style: normal; margin-top: 1.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; color: rgb(51, 51, 51); font-size: 1.4em; font-weight: normal; "&gt;Version limitations&lt;/h2&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;Since every edit procedure results in the creation of a new version (unless the new version is discarded), the database can be quickly filled up by different versions of the same content. In order to prevent this problem, the versioning system can be limited to a certain number of versions per object. It is possible to assign different version limitations for different object types (different classes). The default limitation is 10, which means that every object can have a maximum number of 10 versions of its content. If the maximum count is reached, the oldest version will be automatically deleted and thus a free slot will be available for the new one. This is the default behavior. An alternative setting can be used to disallow the creation of new versions until an existing version is manually deleted by a user.&lt;/p&gt;&lt;a name="eztoc63286_2" id="eztoc63286_2" style="color: rgb(33, 87, 138); text-decoration: underline; "&gt;&lt;/a&gt;&lt;h2 style="font-style: normal; margin-top: 1.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; color: rgb(51, 51, 51); font-size: 1.4em; font-weight: normal; "&gt;Version structure&lt;/h2&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;A version consist of the following elements:&lt;/p&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0.75em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; list-style-type: none; "&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Version number&lt;/div&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Creation time&lt;/div&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Modification time&lt;/div&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Creator&lt;/div&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Status&lt;/div&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Translations&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a name="eztoc63286_2_1" id="eztoc63286_2_1" style="color: rgb(33, 87, 138); text-decoration: underline; "&gt;&lt;/a&gt;&lt;h3 style="font-weight: bold; font-style: normal; margin-top: 1.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; color: rgb(128, 128, 128); font-size: 1.1em; "&gt;Version number&lt;/h3&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;Every version has a unique version number. This number is used by the system to organize and keep track of the different versions of an object. The version number is automatically increased for each version that is created inside an object.&lt;/p&gt;&lt;a name="eztoc63286_2_2" id="eztoc63286_2_2" style="color: rgb(33, 87, 138); text-decoration: underline; "&gt;&lt;/a&gt;&lt;h3 style="font-weight: bold; font-style: normal; margin-top: 1.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; color: rgb(128, 128, 128); font-size: 1.1em; "&gt;Creation time&lt;/h3&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;The creation time contains a timestamp pinpointing the exact date and time when the version was initially created. This information is set by the system and will remain the same regardless of what happens to the version.&lt;/p&gt;&lt;a name="eztoc63286_2_3" id="eztoc63286_2_3" style="color: rgb(33, 87, 138); text-decoration: underline; "&gt;&lt;/a&gt;&lt;h3 style="font-weight: bold; font-style: normal; margin-top: 1.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; color: rgb(128, 128, 128); font-size: 1.1em; "&gt;Modification time&lt;/h3&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;The modification time contains a timestamp revealing the exact date and time when the version was last modified. This information is set by the system every time the version is stored and when the version is finally published. When a version is published, the modification time of the object itself will be updated (it will simply be set to the same value as modification time of the version that was published).&lt;/p&gt;&lt;a name="eztoc63286_2_4" id="eztoc63286_2_4" style="color: rgb(33, 87, 138); text-decoration: underline; "&gt;&lt;/a&gt;&lt;h3 style="font-weight: bold; font-style: normal; margin-top: 1.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; color: rgb(128, 128, 128); font-size: 1.1em; "&gt;Creator&lt;/h3&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;The version's creator contains a reference to the user that created the version. Although a content object can only belong to a single user (revealed by the "Owner" field), each version may belong different users. The creator reference is set by the system when the version is created. It can not be manipulated and will not change even if the user who created the version is removed from the system.&lt;/p&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;&lt;a name="status" style="color: rgb(0, 0, 0); text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(210, 210, 210); "&gt;&lt;/a&gt;&lt;/p&gt;&lt;a name="eztoc63286_2_5" id="eztoc63286_2_5" style="color: rgb(33, 87, 138); text-decoration: underline; "&gt;&lt;/a&gt;&lt;h3 style="font-weight: bold; font-style: normal; margin-top: 1.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; color: rgb(128, 128, 128); font-size: 1.1em; "&gt;Status&lt;/h3&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;The state of a version is determined by its status. There are five possibilities:&lt;/p&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0.75em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; list-style-type: none; "&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Draft (0)&lt;/div&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Published (1)&lt;/div&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Pending (2)&lt;/div&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Archived (3)&lt;/div&gt;&lt;/li&gt;&lt;li style="color: rgb(51, 51, 51); margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0.25em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 14px; background-image: url(http://ez.no/extension/ezdoc/design/doc/images/mainlist-bullet.gif); background-repeat: no-repeat; line-height: 1.25em; background-position: 0px 0.3em; "&gt;&lt;div&gt;Rejected (4)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;In eZ Publish versions 3.8 and later, there is an additional possibility: if a version of a content object is created but not modified (for example, if someone clicked an "Add comments" button but didn't actually post anything), the status of the version will be "Internal draft (5)". In the administration interface, status "5" drafts are called "untouched drafts". From 3.9, you can set the number of days, hours, minutes and seconds before an internal draft is considered old and removed by the "&lt;a href="http://ez.no/doc/ez_publish/technical_manual/3_9/features/cronjobs/the_cronjob_scripts#internal_drafts_cleanup" style="color: rgb(0, 0, 0); text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(210, 210, 210); "&gt;internal_drafts_cleanup.php&lt;/a&gt;" cronjob script. Another cronjob script called "&lt;a href="http://ez.no/doc/ez_publish/technical_manual/3_9/features/cronjobs/the_cronjob_scripts#old_drafts_cleanup" style="color: rgb(0, 0, 0); text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(210, 210, 210); "&gt;old_drafts_cleanup.php&lt;/a&gt;" can be configured to remove status "0" drafts that have been in the system for a specified period of time.&lt;/p&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;A newly created version is a &lt;i&gt;draft&lt;/i&gt;. This status will remain until that version becomes&lt;i&gt;published&lt;/i&gt;. Although an object can have many versions, there can only be one published version (the others are usually drafts and archived versions). The published version can be considered as the "current" version and it is the one that is accessed when the object is viewed. A published version can not become a draft. However, it will become &lt;i&gt;archived&lt;/i&gt; as soon as another version is published. The following illustration shows how the versioning system actually works.&lt;/p&gt;&lt;div class="object-center" style="text-align: center; margin-top: 1.5em; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "&gt;&lt;img src="http://ez.no/var/doc/storage/images/ez_publish/technical_manual/3_9/images/concepts_and_basics/object_states/1224-2-eng-GB/object_states_doc.png" alt="Overview of the object states." /&gt;&lt;p style="margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; margin-top: 1em; font-style: italic; color: rgb(64, 64, 64); "&gt;Overview of the object states.&lt;/p&gt;&lt;/div&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;The illustration above shows the most common states of a content object. When a new object is created (step 1), eZ publish will also create a new draft version. Because the object has not been published yet, its status is set to draft and the current version is unknown. Storing the draft (steps 2a and 2b) will not change the state of the object. The only thing that will happen is that the contents of the draft will be stored in version 1. If the draft (which is the only existing version) is discarded, the object is completely removed from the system (step 2c). When the draft is published (step 2), both the draft and the object's states will be set to published. In addition, the current version will be set to 1, which reveals the currently published version of the object. When published, the contents of the object can be viewed by others. A published object can be removed/deleted from the system (step 3a). When removed, the object's state will be set to "Archived" and thus it will be in the trash. The object can be recovered from the trash to its previous state. Among other things, this involves the status field being set to "Published" again. When a published object is edited (step 4), the current version (version 1 in this case) will remain untouched and a completely new version will be created. The contents of the new version (version 2 in this case) will be a copy of the contents of the current version. Again, storing the draft (steps 4b and 4c) will not change the state of the object. If the draft is discarded (step 4a), it will be completely removed from the system and thus the object will be in the exact same state as it was in before it was edited. If the newly created and edited draft is published, it will become the current version of the object and thus the previous version (version 1 in this case) will be set to "Archived". Step 5a illustrates what would happen if the object (now with two versions) would be removed.&lt;/p&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;The pending and the rejected states are used by the collaboration system. When a version is waiting to be approved by an editor, the status is set to &lt;i&gt;pending&lt;/i&gt;. If the version is approved, it will be automatically published and thus the status will be set to &lt;i&gt;published&lt;/i&gt;. On the other hand, if a &lt;i&gt;pending&lt;/i&gt; version is rejected by the editor, the status will be set to &lt;i&gt;rejected&lt;/i&gt;.&lt;/p&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;A version can only be edited if it is a draft and it can only be edited by the same user who initially created it. In addition, rejected versions can also be edited. When a rejected version is edited, it will become a draft. Published and archived versions can not be edited. However, it is possible to make copies of them. When a published or an archived version is copied, the status of the copy is set to draft and thus it becomes editable. When/if the new draft is published, the system automatically sets the status of the previously published version to archived and the new draft will become the published version.&lt;/p&gt;&lt;a name="eztoc63286_2_6" id="eztoc63286_2_6" style="color: rgb(33, 87, 138); text-decoration: underline; "&gt;&lt;/a&gt;&lt;h3 style="font-weight: bold; font-style: normal; margin-top: 1.25em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: left; color: rgb(128, 128, 128); font-size: 1.1em; "&gt;Translations&lt;/h3&gt;&lt;p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.25em; color: rgb(51, 51, 51); "&gt;The actual contents of a version is stored inside different translations. A translation is a representation of the information in a specific language. In other words, the translation layer allows a version of the object's actual contents to exist in different languages. A version always has at least one translation of the content (which represents the data in the default/standard language).&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-7861765295557194537?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/7861765295557194537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=7861765295557194537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7861765295557194537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/7861765295557194537'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/04/object-versioning.html' title='Object versioning'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-3373654994403206485</id><published>2009-04-18T15:11:00.000-07:00</published><updated>2009-04-18T15:12:14.652-07:00</updated><title type='text'>Consistent Hashing</title><content type='html'>&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Trebuchet; font-size: 13px; "&gt;&lt;h3 class="post-title entry-title" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 125%; font-weight: bold; line-height: 1.1em; "&gt;FRom &lt;span class="Apple-style-span" style="color: rgb(25, 25, 25); font-size: 13px; line-height: 16px; "&gt;Tom White's Blog (&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: 'Lucida Grande'; font-size: 12px; font-weight: normal; line-height: normal; white-space: pre; "&gt;http://www.lexemetech.com/2007/11/consistent-hashing.html) &lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3 class="post-title entry-title" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 125%; font-weight: bold; line-height: 1.1em; "&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 class="post-title entry-title" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 125%; font-weight: bold; line-height: 1.1em; "&gt;&lt;a href="http://www.lexemetech.com/2007/11/consistent-hashing.html" style="text-decoration: none; color: rgb(51, 51, 51); font-weight: bold; "&gt;Consistent Hashing&lt;/a&gt;&lt;/h3&gt;&lt;div class="post-header-line-1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;/div&gt;&lt;div class="post-body entry-content" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;I've bumped into consistent hashing a couple of times lately. The paper that introduced the idea (&lt;a href="http://citeseer.ist.psu.edu/karger97consistent.html" style="color: rgb(148, 15, 4); "&gt;Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web&lt;/a&gt; by &lt;a href="http://people.csail.mit.edu/karger/" style="color: rgb(148, 15, 4); "&gt;David Karger&lt;/a&gt; &lt;i&gt;et al&lt;/i&gt;) appeared ten years ago, although recently it seems the idea has quietly been finding its way into more and more services, from Amazon's&lt;a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html" style="color: rgb(148, 15, 4); "&gt;Dynamo&lt;/a&gt; to &lt;a href="http://www.danga.com/memcached/" style="color: rgb(148, 15, 4); "&gt;memcached&lt;/a&gt; (courtesy of &lt;a href="http://www.last.fm/" style="color: rgb(148, 15, 4); "&gt;Last.fm&lt;/a&gt;). So what is consistent hashing and why should you care?&lt;br /&gt;&lt;br /&gt;The need for consistent hashing arose from limitations experienced while running collections of caching machines - web caches, for example. If you have a collection of &lt;i&gt;n&lt;/i&gt; cache machines then a common way of load balancing across them is to put object &lt;i&gt;o&lt;/i&gt; in cache machine number &lt;i&gt;hash(o)&lt;/i&gt; mod &lt;i&gt;n&lt;/i&gt;. This works well until you add or remove cache machines (for whatever reason), for then &lt;i&gt;n&lt;/i&gt;changes and &lt;i&gt;every object is hashed to a new location&lt;/i&gt;. This can be catastrophic since the originating content servers are swamped with requests from the cache machines. It's as if the cache suddenly disappeared. Which it has, in a sense. (This is why you should care - consistent hashing is needed to avoid swamping your servers!)&lt;br /&gt;&lt;br /&gt;It would be nice if, when a cache machine was added, it took its fair share of objects from all the other cache machines. Equally, when a cache machine was removed, it would be nice if its objects were shared between the remaining machines. This is exactly what consistent hashing does - &lt;i&gt;consistently&lt;/i&gt; maps objects to the same cache machine, as far as is possible, at least.&lt;br /&gt;&lt;br /&gt;The basic idea behind the consistent hashing algorithm is to hash both objects and caches using the same hash function. The reason to do this is to map the cache to an interval, which will contain a number of object hashes. If the cache is removed then its interval is taken over by a cache with an adjacent interval. All the other caches remain unchanged.&lt;br /&gt;&lt;h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Demonstration&lt;/h3&gt;Let's look at this in more detail. The hash function actually maps objects and caches to a number range. This should be familiar to every Java programmer - the &lt;code&gt;hashCode&lt;/code&gt; method on &lt;code&gt;Object&lt;/code&gt; returns an &lt;code&gt;int&lt;/code&gt;, which lies in the range -2&lt;sup&gt;31&lt;/sup&gt; to 2&lt;sup&gt;31&lt;/sup&gt;-1. Imagine mapping this range into a circle so the values wrap around. Here's a picture of the circle with a number of objects (1, 2, 3, 4) and caches (A, B, C) marked at the points that they hash to (based on a diagram from &lt;a href="http://www8.org/w8-papers/2a-webserver/caching/paper2.html" style="color: rgb(148, 15, 4); "&gt;Web Caching with Consistent Hashing&lt;/a&gt; by David Karger &lt;i&gt;et al&lt;/i&gt;):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_IhqEHw4_Ick/Rz9cjSPnAEI/AAAAAAAAAA4/hc2tot8SWVw/s1600-h/consistent_hashing_1.png" style="color: rgb(148, 15, 4); "&gt;&lt;img src="http://2.bp.blogspot.com/_IhqEHw4_Ick/Rz9cjSPnAEI/AAAAAAAAAA4/hc2tot8SWVw/s400/consistent_hashing_1.png" alt="" id="BLOGGER_PHOTO_ID_5133923861488140354" border="0" style="cursor: pointer; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To find which cache an object goes in, we move clockwise round the circle until we find a cache point. So in the diagram above, we see object 1 and 4 belong in cache A, object 2 belongs in cache B and object 3 belongs in cache C. Consider what happens if cache C is removed: object 3 now belongs in cache A, and all the other object mappings are unchanged. If then another cache D is added in the position marked it will take objects 3 and 4, leaving only object 1 belonging to A.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_IhqEHw4_Ick/Rz9cwyPnAFI/AAAAAAAAABA/aW5zxmOIIN0/s1600-h/consistent_hashing_2.png" style="color: rgb(148, 15, 4); "&gt;&lt;img src="http://4.bp.blogspot.com/_IhqEHw4_Ick/Rz9cwyPnAFI/AAAAAAAAABA/aW5zxmOIIN0/s400/consistent_hashing_2.png" alt="" id="BLOGGER_PHOTO_ID_5133924093416374354" border="0" style="cursor: pointer; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This works well, except the size of the intervals assigned to each cache is pretty hit and miss. Since it is essentially random it is possible to have a very non-uniform distribution of objects between caches. The solution to this problem is to introduce the idea of "virtual nodes", which are replicas of cache points in the circle. So whenever we add a cache we create a number of points in the circle for it.&lt;br /&gt;&lt;br /&gt;You can see the effect of this in the following plot which I produced by simulating storing 10,000 objects in 10 caches using the code described below. On the x-axis is the number of replicas of cache points (with a logarithmic scale). When it is small, we see that the distribution of objects across caches is unbalanced, since the standard deviation as a percentage of the mean number of objects per cache (on the y-axis, also logarithmic) is high. As the number of replicas increases the distribution of objects becomes more balanced. This experiment shows that a figure of one or two hundred replicas achieves an acceptable balance (a standard deviation that is roughly between 5% and 10% of the mean).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_IhqEHw4_Ick/Rz9daCPnAGI/AAAAAAAAABI/xjtbuG8Knx0/s1600-h/ch-graph.png" style="color: rgb(148, 15, 4); "&gt;&lt;img src="http://1.bp.blogspot.com/_IhqEHw4_Ick/Rz9daCPnAGI/AAAAAAAAABI/xjtbuG8Knx0/s400/ch-graph.png" alt="" id="BLOGGER_PHOTO_ID_5133924802085978210" border="0" style="cursor: pointer; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Implementation&lt;/h3&gt;For completeness here is a simple implementation in Java. In order for consistent hashing to be effective it is important to have a hash function that&lt;a href="http://problemsworthyofattack.blogspot.com/2007/10/mixing-with-md5.html" style="color: rgb(148, 15, 4); "&gt;mixes&lt;/a&gt; well. Most implementations of &lt;code&gt;Object&lt;/code&gt;'s &lt;code&gt;hashCode&lt;/code&gt; do &lt;i&gt;not&lt;/i&gt; mix well - for example, they typically produce a restricted number of small integer values - so we have a &lt;code&gt;HashFunction&lt;/code&gt; interface to allow a custom hash function to be used. MD5 hashes are recommended here.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.util.Collection;&lt;br /&gt;import java.util.SortedMap;&lt;br /&gt;import java.util.TreeMap;&lt;br /&gt;&lt;br /&gt;public class ConsistentHash&lt;t&gt; {&lt;br /&gt;&lt;br /&gt; private final HashFunction hashFunction;&lt;br /&gt; private final int numberOfReplicas;&lt;br /&gt; private final SortedMap&lt;integer,&gt; circle =&lt;br /&gt;   new TreeMap&lt;integer,&gt;();&lt;br /&gt;&lt;br /&gt; public ConsistentHash(HashFunction hashFunction,&lt;br /&gt;   int numberOfReplicas, Collection&lt;t&gt; nodes) {&lt;br /&gt;&lt;br /&gt;   this.hashFunction = hashFunction;&lt;br /&gt;   this.numberOfReplicas = numberOfReplicas;&lt;br /&gt;&lt;br /&gt;   for (T node : nodes) {&lt;br /&gt;     add(node);&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void add(T node) {&lt;br /&gt;   for (int i = 0; i &lt; numberOfReplicas; i++) {&lt;br /&gt;     circle.put(hashFunction.hash(node.toString() + i),&lt;br /&gt;       node);&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void remove(T node) {&lt;br /&gt;   for (int i = 0; i &lt; numberOfReplicas; i++) {&lt;br /&gt;     circle.remove(hashFunction.hash(node.toString() + i));&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public T get(Object key) {&lt;br /&gt;   if (circle.isEmpty()) {&lt;br /&gt;     return null;&lt;br /&gt;   }&lt;br /&gt;   int hash = hashFunction.hash(key);&lt;br /&gt;   if (!circle.containsKey(hash)) {&lt;br /&gt;     SortedMap&lt;integer,&gt; tailMap =&lt;br /&gt;       circle.tailMap(hash);&lt;br /&gt;     hash = tailMap.isEmpty() ?&lt;br /&gt;            circle.firstKey() : tailMap.firstKey();&lt;br /&gt;   }&lt;br /&gt;   return circle.get(hash);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The circle is represented as a sorted map of integers, which represent the hash values, to caches (of type &lt;code&gt;T&lt;/code&gt; here).&lt;br /&gt;When a &lt;code&gt;ConsistentHash&lt;/code&gt; object is created each node is added to the circle map a number of times (controlled by &lt;code&gt;numberOfReplicas&lt;/code&gt;). The location of each replica is chosen by hashing the node's name along with a numerical suffix, and the node is stored at each of these points in the map.&lt;br /&gt;&lt;br /&gt;To find a node for an object (the &lt;code&gt;get&lt;/code&gt; method), the &lt;i&gt;hash value of the object&lt;/i&gt; is used to look in the map. Most of the time there will not be a node stored at this hash value (since the hash value space is typically much larger than the number of nodes, even with replicas), so the next node is found by looking for the first key in the tail map. If the tail map is empty then we wrap around the circle by getting the first key in the circle.&lt;br /&gt;&lt;h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Usage&lt;/h3&gt;So how can you use consistent hashing? You are most likely to meet it in a library, rather than having to code it yourself. For example, as mentioned above, memcached, a distributed memory object caching system, now has clients that support consistent hashing. Last.fm's &lt;a href="http://www.audioscrobbler.net/development/ketama/" style="color: rgb(148, 15, 4); "&gt;ketama&lt;/a&gt; by &lt;a href="http://www.last.fm/user/RJ/" style="color: rgb(148, 15, 4); "&gt;Richard Jones&lt;/a&gt; was the first, and there is now a &lt;a href="http://bleu.west.spy.net/%7Edustin/projects/memcached/" style="color: rgb(148, 15, 4); "&gt;Java implementation&lt;/a&gt; by &lt;a href="http://bleu.west.spy.net/%7Edustin/" style="color: rgb(148, 15, 4); "&gt;Dustin Sallings&lt;/a&gt; (which inspired my simplified demonstration implementation above). It is interesting to note that it is only the client that needs to implement the consistent hashing algorithm - the memcached server is unchanged. Other systems that employ consistent hashing include &lt;a href="http://pdos.csail.mit.edu/chord/" style="color: rgb(148, 15, 4); "&gt;Chord&lt;/a&gt;, which is a distributed hash table implementation, and Amazon's Dynamo, which is a key-value store (not available outside Amazon).&lt;div style="clear: both; margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="post-footer" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;div class="post-footer-line post-footer-line-1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;span class="post-author vcard"&gt;Posted by &lt;span class="fn"&gt;Tom White&lt;/span&gt; &lt;/span&gt;&lt;span class="post-timestamp"&gt;at &lt;a class="timestamp-link" href="http://www.lexemetech.com/2007/11/consistent-hashing.html" rel="bookmark" title="permanent link" style="color: rgb(148, 15, 4); "&gt;&lt;abbr class="published" title="2007-11-27T17:26:00Z"&gt;17:26&lt;/abbr&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="post-comment-link"&gt;&lt;/span&gt;&lt;span class="post-icons"&gt;&lt;/span&gt;&lt;span class="post-backlinks post-comment-link"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="post-footer-line post-footer-line-2" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;span class="post-labels"&gt;Labels: &lt;a href="http://www.lexemetech.com/search/label/Distributed%20Systems" rel="tag" style="color: rgb(148, 15, 4); "&gt;Distributed Systems&lt;/a&gt;, &lt;a href="http://www.lexemetech.com/search/label/Hashing" rel="tag" style="color: rgb(148, 15, 4); "&gt;Hashing&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5753436922335124458-3373654994403206485?l=soohwan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soohwan.blogspot.com/feeds/3373654994403206485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5753436922335124458&amp;postID=3373654994403206485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3373654994403206485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5753436922335124458/posts/default/3373654994403206485'/><link rel='alternate' type='text/html' href='http://soohwan.blogspot.com/2009/04/consistent-hashing_18.html' title='Consistent Hashing'/><author><name>SooHwan Park</name><uri>http://www.blogger.com/profile/14792297003575855624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_vKKQB1JGh0k/SclfB7EJ_uI/AAAAAAAAAEo/g5HW_Hu_GIA/S220/n1081580192_30094015_4892.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_IhqEHw4_Ick/Rz9cjSPnAEI/AAAAAAAAAA4/hc2tot8SWVw/s72-c/consistent_hashing_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5753436922335124458.post-7165340305131906936</id><published>2009-04-18T14:07:00.000-07:00</published><updated>2009-04-18T14:13:21.441-07:00</updated><title type='text'>Mercurial &amp; Maven</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; line-height: 20px; "&gt;&lt;h2 id="head-410e2e8c21378de378be2770bd490d7bb023f732" style="margin-top: 1.5em; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; line-height: 1.2em; font-size: 1.6em; "&gt;Tutorial - Cloning a repository&lt;/h2&gt;&lt;span class="anchor" id="line-2"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-3"&gt;&lt;/span&gt;&lt;p class="line867"&gt;&lt;em&gt;(This page is part 2 of 9 of the &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(89, 123, 179); "&gt;Tutorial&lt;/a&gt; series. Previous part is &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/TutorialInstall" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;TutorialInstall&lt;/a&gt;, next part is &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/TutorialHistory" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;TutorialHistory&lt;/a&gt;)&lt;/em&gt;&lt;span class="anchor" id="line-4"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-5"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line862"&gt;You have followed &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/TutorialInstall" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;TutorialInstall&lt;/a&gt; to install Mercurial already, right? Good!&lt;span class="anchor" id="line-6"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-7"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line862"&gt;In Mercurial, we do all of our work inside a &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Repository" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;repository&lt;/a&gt;. A repository is a directory that contains all of the source files that we want to keep history of, along with complete histories of those source files.&lt;span class="anchor" id="line-8"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-9"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line874"&gt;The easiest way to get started with Mercurial is to use a repository that already contains some files and some history.&lt;span class="anchor" id="line-10"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-11"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line862"&gt;To do this, we use the &lt;tt&gt;clone&lt;/tt&gt; command. This makes a &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Clone" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;clone&lt;/a&gt; of a repository; it makes a complete copy of another repository so that we will have our own local, private one to work in.&lt;span class="anchor" id="line-12"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-13"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line874"&gt;Let's clone a small "hello, world" repository hosted at selenic.com:&lt;span class="anchor" id="line-14"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-15"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line867"&gt;&lt;span class="anchor" id="line-16"&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style="border-top-width: 1pt; border-right-width: 1pt; border-bottom-width: 1pt; border-left-width: 1pt; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(174, 189, 204); border-right-color: rgb(174, 189, 204); border-bottom-color: rgb(174, 189, 204); border-left-color: rgb(174, 189, 204); background-color: rgb(243, 245, 247); padding-top: 5pt; padding-right: 5pt; padding-bottom: 5pt; padding-left: 5pt; font-family: courier, monospace; white-space: pre-wrap; word-wrap: break-word; "&gt;$ hg clone http://www.selenic.com/repo/hello my-hello &lt;span class="anchor" id="line-17"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="anchor" id="line-18"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-19"&gt;&lt;/span&gt;&lt;p class="line862"&gt;If all goes well, the &lt;tt&gt;clone&lt;/tt&gt; command prints this (Mercurial 1.0):&lt;span class="anchor" id="line-20"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-21"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line867"&gt;&lt;span class="anchor" id="line-22"&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style="border-top-width: 1pt; border-right-width: 1pt; border-bottom-width: 1pt; border-left-width: 1pt; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(174, 189, 204); border-right-color: rgb(174, 189, 204); border-bottom-color: rgb(174, 189, 204); border-left-color: rgb(174, 189, 204); background-color: rgb(243, 245, 247); padding-top: 5pt; padding-right: 5pt; padding-bottom: 5pt; padding-left: 5pt; font-family: courier, monospace; white-space: pre-wrap; word-wrap: break-word; "&gt;requesting all changes &lt;span class="anchor" id="line-23"&gt;&lt;/span&gt;adding changesets &lt;span class="anchor" id="line-24"&gt;&lt;/span&gt;adding manifests &lt;span class="anchor" id="line-25"&gt;&lt;/span&gt;adding file changes &lt;span class="anchor" id="line-26"&gt;&lt;/span&gt;added 2 changesets with 2 changes to 2 files &lt;span class="anchor" id="line-27"&gt;&lt;/span&gt;updating working directory &lt;span class="anchor" id="line-28"&gt;&lt;/span&gt;2 files updated, 0 files merged, 0 files removed, 0 files unresolved &lt;span class="anchor" id="line-29"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="anchor" id="line-30"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-31"&gt;&lt;/span&gt;&lt;p class="line862"&gt;We should now find a directory called &lt;tt&gt;my-hello&lt;/tt&gt; in our current directory:&lt;span class="anchor" id="line-32"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-33"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line867"&gt;&lt;span class="anchor" id="line-34"&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style="border-top-width: 1pt; border-right-width: 1pt; border-bottom-width: 1pt; border-left-width: 1pt; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(174, 189, 204); border-right-color: rgb(174, 189, 204); border-bottom-color: rgb(174, 189, 204); border-left-color: rgb(174, 189, 204); background-color: rgb(243, 245, 247); padding-top: 5pt; padding-right: 5pt; padding-bottom: 5pt; padding-left: 5pt; font-family: courier, monospace; white-space: pre-wrap; word-wrap: break-word; "&gt;$ ls &lt;span class="anchor" id="line-35"&gt;&lt;/span&gt;my-hello &lt;span class="anchor" id="line-36"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="anchor" id="line-37"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-38"&gt;&lt;/span&gt;&lt;p class="line862"&gt;Inside the &lt;tt&gt;my-hello&lt;/tt&gt; directory, we should find some files:&lt;span class="anchor" id="line-39"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-40"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line867"&gt;&lt;span class="anchor" id="line-41"&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style="border-top-width: 1pt; border-right-width: 1pt; border-bottom-width: 1pt; border-left-width: 1pt; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(174, 189, 204); border-right-color: rgb(174, 189, 204); border-bottom-color: rgb(174, 189, 204); border-left-color: rgb(174, 189, 204); background-color: rgb(243, 245, 247); padding-top: 5pt; padding-right: 5pt; padding-bottom: 5pt; padding-left: 5pt; font-family: courier, monospace; white-space: pre-wrap; word-wrap: break-word; "&gt;$ ls my-hello &lt;span class="anchor" id="line-42"&gt;&lt;/span&gt;Makefile  hello.c &lt;span class="anchor" id="line-43"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="anchor" id="line-44"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-45"&gt;&lt;/span&gt;&lt;p class="line874"&gt;These files are exact copies of the files in the repository we just cloned.&lt;span class="anchor" id="line-46"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-47"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line867"&gt;&lt;strong&gt;Note:&lt;/strong&gt; in Mercurial, each repository is self-contained. When you clone a repository, the new repository becomes an exact copy of the existing one at the time of the clone, but subsequent changes in either one &lt;em&gt;will not show up&lt;/em&gt; in the other unless you explicitly transfer them, by either &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Pull" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;pulling&lt;/a&gt; or &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Push" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;pushing&lt;/a&gt;.&lt;span class="anchor" id="line-48"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-49"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line862"&gt;By default, &lt;tt class="backtick"&gt;hg clone&lt;/tt&gt; checks out (see &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Update" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;Update&lt;/a&gt;) the &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Tip" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;tip&lt;/a&gt;most &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Revision" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;revision&lt;/a&gt; of the repository &lt;span class="anchor" id="line-50"&gt;&lt;/span&gt;into the repository's &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/WorkingDirectory" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;working directory&lt;/a&gt;. To see which revision is currently checked out, &lt;span class="anchor" id="line-51"&gt;&lt;/span&gt;we can use the &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/Parent" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;parents&lt;/a&gt; command:&lt;span class="anchor" id="line-52"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-53"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="line867"&gt;&lt;span class="anchor" id="line-54"&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre style="border-top-width: 1pt; border-right-width: 1pt; border-bottom-width: 1pt; border-left-width: 1pt; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(174, 189, 204); border-right-color: rgb(174, 189, 204); border-bottom-color: rgb(174, 189, 204); border-left-color: rgb(174, 189, 204); background-color: rgb(243, 245, 247); padding-top: 5pt; padding-right: 5pt; padding-bottom: 5pt; padding-left: 5pt; font-family: courier, monospace; white-space: pre-wrap; word-wrap: break-word; "&gt;$ cd my-hello &lt;span class="anchor" id="line-55"&gt;&lt;/span&gt;$ hg parents &lt;span class="anchor" id="line-56"&gt;&lt;/span&gt;changeset:   1:82e55d328c8c &lt;span class="anchor" id="line-57"&gt;&lt;/span&gt;tag:         tip &lt;span class="anchor" id="line-58"&gt;&lt;/span&gt;user:        mpm@selenic.com &lt;span class="anchor" id="line-59"&gt;&lt;/span&gt;date:        Fri Aug 26 01:21:28 2005 -0700 &lt;span class="anchor" id="line-60"&gt;&lt;/span&gt;summary:     Create a makefile &lt;span class="anchor" id="line-61"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="anchor" id="line-62"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-63"&gt;&lt;/span&gt;&lt;p class="line862"&gt;At this point, we can start examining some of the history of our new repository, by continuing to &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/TutorialHistory" style="color: rgb(0, 68, 179); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; "&gt;TutorialHistory&lt;/a&gt;.&lt;/p&gt;&lt;p class="line862"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="line862"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; line-height: normal; "&gt;&lt;h2 style="font-size: 17px; color: rgb(51, 51, 51); "&gt;Maven in 5 Minutes&lt;/h2&gt;&lt;div class="section" style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; "&gt;&lt;h3 style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 24px; color: rgb(102, 102, 102); background-color: rgb(204, 204, 204); font-weight: bold; font-size: 14px; background-image: url(http://maven.apache.org/images/h3.jpg); background-repeat: no-repeat; background-position: 0% 100%; "&gt;Installation&lt;/h3&gt;&lt;p style="line-height: 1.3em; font-size: 12px; color: rgb(0, 0, 0); "&gt;&lt;i&gt;Maven is a Java tool, so you must have &lt;a href="http://java.sun.com/" class="externalLink" style="text-decoration: none; color: rgb(68, 119, 170); background-image: none; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: initial; padding-right: 0px; background-position: initial initial; "&gt;Java&lt;/a&gt; installed in order to proceed.&lt;/i&gt;&lt;/p&gt;&lt;p style="line-height: 1.3em; font-size: 12px; color: rgb(0, 0, 0); "&gt;First, &lt;a href="http://maven.apache.org/download.html" style="text-decoration: none; color: rgb(68, 119, 170); "&gt;download Maven&lt;/a&gt; and follow the &lt;a href="http://maven.apache.org/download.html#Installation" style="text-decoration: none; color: rgb(68, 119, 170); "&gt;installation instructions&lt;/a&gt;. After that, type the following in a terminal or in a command prompt:&lt;/p&gt;&lt;div class="source" style="padding-top: 12px; padding-right: 12px; padding-bottom: 12px; padding-left: 12px; margin-top: 1em; margin-right: 7px; margin-bottom: 1em; margin-left: 7px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); overflow-x: auto; overflow-y: auto; "&gt;&lt;pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;mvn --version &lt;/pre&gt;&lt;/div&gt;&lt;p style="line-height: 1.3em; font-size: 12px; color: rgb(0, 0, 0); "&gt;It should print out your installed version of Maven, for example:&lt;/p&gt;&lt;div class="source" style="padding-top: 12px; padding-right: 12px; padding-bottom: 12px; padding-left: 12px; margin-top: 1em; margin-right: 7px; margin-bottom: 1em; margin-left: 7px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); overflow-x: auto; overflow-y: auto; "&gt;&lt;pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;Maven version: 2.0.8 Java version: 1.5.0_12 OS name: "windows 2003" version: "5.2" arch: "x86" Family: "windows" &lt;/pre&gt;&lt;/div&gt;&lt;p style="line-height: 1.3em; font-size: 12px; color: rgb(0, 0, 0); "&gt;Depending upon your network setup, you may require extra configuration. Check out the &lt;a href="http://maven.apache.org/guides/mini/guide-configuring-maven.html" style="text-decoration: none; color: rgb(68, 119, 170); "&gt;Guide to Configuring Maven&lt;/a&gt; if necessary.&lt;/p&gt;&lt;/div&gt;&lt;div class="section" style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; "&gt;&lt;h3 style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 24px; color: rgb(102, 102, 102); background-color: rgb(204, 204, 204); font-weight: bold; font-size: 14px; background-image: url(http://maven.apache.org/images/h3.jpg); background-repeat: no-repeat; background-position: 0% 100%; "&gt;Creating a Project&lt;/h3&gt;&lt;p style="line-height: 1.3em; font-size: 12px; color: rgb(0, 0, 0); "&gt;On your command line, execute the following Maven goal:&lt;/p&gt;&lt;div class="source" style="padding-top: 12px; padding-right: 12px; padding-bottom: 12px; padding-left: 12px; margin-top: 1em; margin-right: 7px; margin-bottom: 1em; margin-left: 7px; border-top-width: 1px; border-right-
