<?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-7899977601826599708</id><updated>2012-02-16T14:14:27.766+07:00</updated><category term='php5'/><category term='install'/><category term='node.js'/><category term='Windows XP'/><category term='dso'/><category term='comment'/><category term='bug text2wave'/><category term='javascript'/><category term='adodb'/><category term='ant build jar'/><category term='cache'/><category term='html5'/><category term='htaccess not working'/><category term='class object'/><category term='perl'/><category term='secure'/><category term='ActionScript'/><category term='load'/><category term='festival voice'/><category term='pdo'/><category term='wp-cache'/><category term='memcache'/><category term='delphi'/><category term='ICH9M'/><category term='redhat'/><category term='webserver'/><category term='MySQL partitions'/><category term='Tokyo Tyrant'/><category term='shell'/><category term='python'/><category term='Song World cup 2010 South Africa'/><category term='nginx'/><category term='extension'/><category term='spam'/><category term='AHCI'/><category term='dell inspiron 1440'/><category term='video'/><category term='Blogger Navbar'/><category term='performance'/><category term='PHP Advent 2010'/><category term='c++'/><category term='crontab'/><category term='cpu'/><category term='monggoDB'/><category term='thrift'/><category term='apache'/><category term='linux'/><category term='memcache php'/><category term='facebook'/><category term='hiphop php'/><category term='java'/><category term='mysql'/><category term='tool'/><category term='jpeg'/><category term='php'/><category term='httpd'/><category term='rehat linux'/><category term='modal box'/><category term='ICH'/><category term='navicate'/><category term='MemcacheDB'/><category term='bug pdo_mysql'/><category term='ssh'/><category term='ZendFrmaework for sharing hostin'/><category term='modules'/><category term='nofollow and noindex'/><category term='apxs'/><category term='autocomplete'/><category term='css background-posision'/><category term='Deathmatch'/><category term='jquery'/><category term='Redis'/><category term='MySQL Server'/><category term='SATA'/><category term='COBOL'/><category term='BigPipe Facebook'/><category term='language programming'/><category term='mysql query cache'/><category term='garbage collection'/><category term='webp'/><category term='ssl'/><category term='rehat'/><category term='memcached'/><category term='Hard facts'/><category term='software behind Facebook'/><category term='Protocol Buffers'/><category term='rank'/><category term='LaTex'/><category term='ubuntu'/><category term='apc'/><category term='benchmakeking'/><category term='Java Decompiler'/><category term='My Heart Will Go On'/><category term='google'/><category term='Error code shell php'/><title type='text'>WE  STUDY TOGETHER</title><subtitle type='html'>Experiences From My Life</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-2572660537885131376</id><published>2012-01-15T16:43:00.002+07:00</published><updated>2012-01-15T16:43:44.009+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>C++ step by step</title><content type='html'>&lt;a href="http://www.cplusplus.com/doc/tutorial/"&gt;http://www.cplusplus.com/doc/tutorial/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-2572660537885131376?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.cplusplus.com/doc/tutorial/' title='C++ step by step'/><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/2572660537885131376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2012/01/c-step-by-step.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2572660537885131376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2572660537885131376'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2012/01/c-step-by-step.html' title='C++ step by step'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-6393213345732491640</id><published>2011-12-01T12:44:00.002+07:00</published><updated>2011-12-01T12:44:48.269+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nofollow and noindex'/><title type='text'>http://www.blueglass.com/blog/to-nofollow-or-to-noindex-that-is-the-question/</title><content type='html'>&lt;a href="http://www.blueglass.com/blog/to-nofollow-or-to-noindex-that-is-the-question/"&gt;http://www.blueglass.com/blog/to-nofollow-or-to-noindex-that-is-the-question/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-6393213345732491640?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/6393213345732491640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/12/httpwwwblueglasscomblogto-nofollow-or.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6393213345732491640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6393213345732491640'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/12/httpwwwblueglasscomblogto-nofollow-or.html' title='http://www.blueglass.com/blog/to-nofollow-or-to-noindex-that-is-the-question/'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-4114525443017320118</id><published>2011-10-29T12:59:00.002+07:00</published><updated>2011-10-29T12:59:51.622+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='garbage collection'/><title type='text'>garbage collection</title><content type='html'>&lt;a href="http://www.slideshare.net/khuonganpt/basic-garbage-collection-techniques-vi"&gt;http://www.slideshare.net/khuonganpt/basic-garbage-collection-techniques-vi&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-4114525443017320118?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/4114525443017320118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/10/garbage-collection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/4114525443017320118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/4114525443017320118'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/10/garbage-collection.html' title='garbage collection'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-1277334644632543438</id><published>2011-09-29T11:46:00.002+07:00</published><updated>2011-09-29T11:46:53.556+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Decompiler'/><title type='text'>Java Decompiler</title><content type='html'>&lt;a href="http://java.decompiler.free.fr/"&gt;http://java.decompiler.free.fr&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-1277334644632543438?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/1277334644632543438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/09/java-decompiler.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/1277334644632543438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/1277334644632543438'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/09/java-decompiler.html' title='Java Decompiler'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-8358353527358941067</id><published>2011-09-16T23:41:00.000+07:00</published><updated>2011-09-16T23:41:46.099+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ant build jar'/><title type='text'>Use antto build a jar with version/build number</title><content type='html'>&lt;a href="http://www.rgagnon.com/javadetails/java-0532.html"&gt;http://www.rgagnon.com/javadetails/java-0532.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-8358353527358941067?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/8358353527358941067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/09/use-antto-build-jar-with-versionbuild.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8358353527358941067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8358353527358941067'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/09/use-antto-build-jar-with-versionbuild.html' title='Use antto build a jar with version/build number'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-8862216327288488748</id><published>2011-09-13T13:33:00.000+07:00</published><updated>2011-09-13T13:33:16.179+07:00</updated><title type='text'>Advices for freelancers</title><content type='html'>&lt;a href="http://ntuts.com/tong-hop/20-loi-khuyen-giup-ban-tro-thanh-mot-freelancer-thanh-cong"&gt;http://ntuts.com/tong-hop/20-loi-khuyen-giup-ban-tro-thanh-mot-freelancer-thanh-cong&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-8862216327288488748?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/8862216327288488748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/09/advices-for-freelancers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8862216327288488748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8862216327288488748'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/09/advices-for-freelancers.html' title='Advices for freelancers'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-3326937990983848052</id><published>2011-08-07T15:33:00.000+07:00</published><updated>2011-08-07T15:33:23.051+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bug text2wave'/><title type='text'>Fix bug Segmentation fault text2wave when setting new voice</title><content type='html'>Replace content of text2wave in /usr/bin/text2wave with:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;#!/bin/sh&lt;br /&gt;"true" ; exec /usr/bin/festival --script $0 $*&lt;br /&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-*-mode:scheme-*-&lt;br /&gt;;;                                                                       ;;&lt;br /&gt;;;                Centre for Speech Technology Research                  ;;&lt;br /&gt;;;                     University of Edinburgh, UK                       ;;&lt;br /&gt;;;                       Copyright (c) 1996,1997                         ;;&lt;br /&gt;;;                        All Rights Reserved.                           ;;&lt;br /&gt;;;                                                                       ;;&lt;br /&gt;;;  Permission is hereby granted, free of charge, to use and distribute  ;;&lt;br /&gt;;;  this software and its documentation without restriction, including   ;;&lt;br /&gt;;;  without limitation the rights to use, copy, modify, merge, publish,  ;;&lt;br /&gt;;;  distribute, sublicense, and/or sell copies of this work, and to      ;;&lt;br /&gt;;;  permit persons to whom this work is furnished to do so, subject to   ;;&lt;br /&gt;;;  the following conditions:                                            ;;&lt;br /&gt;;;   1. The code must retain the above copyright notice, this list of    ;;&lt;br /&gt;;;      conditions and the following disclaimer.                         ;;&lt;br /&gt;;;   2. Any modifications must be clearly marked as such.                ;;&lt;br /&gt;;;   3. Original authors' names are not deleted.                         ;;&lt;br /&gt;;;   4. The authors' names are not used to endorse or promote products   ;;&lt;br /&gt;;;      derived from this software without specific prior written        ;;&lt;br /&gt;;;      permission.                                                      ;;&lt;br /&gt;;;                                                                       ;;&lt;br /&gt;;;  THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK        ;;&lt;br /&gt;;;  DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING      ;;&lt;br /&gt;;;  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT   ;;&lt;br /&gt;;;  SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE     ;;&lt;br /&gt;;;  FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES    ;;&lt;br /&gt;;;  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN   ;;&lt;br /&gt;;;  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,          ;;&lt;br /&gt;;;  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF       ;;&lt;br /&gt;;;  THIS SOFTWARE.                                                       ;;&lt;br /&gt;;;                                                                       ;;&lt;br /&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;;;;           Author:  Alan W Black&lt;br /&gt;;;;           Date:    November 1997&lt;br /&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;;;;&lt;br /&gt;;;;  Text to a single waveform like festival_client but without&lt;br /&gt;;;;  starting the server&lt;br /&gt;;;;&lt;br /&gt;&lt;br /&gt;;;; Because this is a --script type file I has to explicitly&lt;br /&gt;;;; load the initfiles: init.scm and user's .festivalrc&lt;br /&gt;(load (path-append libdir "init.scm"))&lt;br /&gt;&lt;br /&gt;;;; Process command line arguments&lt;br /&gt;(define (text2wave_help)&lt;br /&gt;  (format t "%s\n"&lt;br /&gt;  "text2wave [options] textfile&lt;br /&gt;  Convert a textfile to a waveform&lt;br /&gt;  Options&lt;br /&gt;  -mode &amp;lt;string&amp;gt;  Explicit tts mode.&lt;br /&gt;  -o ofile        File to save waveform (default is stdout).&lt;br /&gt;  -otype &amp;lt;string&amp;gt; Output waveform type: ulaw, snd, aiff, riff, nist etc.&lt;br /&gt;                  (default is riff)&lt;br /&gt;  -F &amp;lt;int&amp;gt;        Output frequency.&lt;br /&gt;  -scale &amp;lt;float&amp;gt;  Volume factor&lt;br /&gt;  -eval &amp;lt;string&amp;gt;  File or lisp s-expression to be evaluated before&lt;br /&gt;                  synthesis.&lt;br /&gt;")&lt;br /&gt;  (quit))&lt;br /&gt;&lt;br /&gt;;;; No gc messages&lt;br /&gt;(gc-status nil)&lt;br /&gt;&lt;br /&gt;;;; Default argument values&lt;br /&gt;(defvar outfile "-")&lt;br /&gt;(defvar output_type 'riff)&lt;br /&gt;(defvar frequency nil)  ;; default is no frequency modification&lt;br /&gt;(defvar text_files '("-"))&lt;br /&gt;(defvar mode nil)&lt;br /&gt;(defvar volume "1.0")&lt;br /&gt;(defvar wavefiles nil)&lt;br /&gt;&lt;br /&gt;;;; Get options&lt;br /&gt;(define (get_options)&lt;br /&gt;&lt;br /&gt;  (let ((files nil)&lt;br /&gt; (o argv))&lt;br /&gt;    (if (or (member_string "-h" argv)&lt;br /&gt;     (member_string "-help" argv)&lt;br /&gt;     (member_string "--help" argv)&lt;br /&gt;     (member_string "-?" argv))&lt;br /&gt; (text2wave_help))&lt;br /&gt;    (while o&lt;br /&gt;      (begin&lt;br /&gt; (cond&lt;br /&gt;  ((string-equal "-o" (car o))&lt;br /&gt;   (if (not (cdr o))&lt;br /&gt;       (text2wave_error "no output file specified"))&lt;br /&gt;   (set! outfile (car (cdr o)))&lt;br /&gt;   (set! o (cdr o)))&lt;br /&gt;  ((string-equal "-otype" (car o))&lt;br /&gt;   (if (not (cdr o))&lt;br /&gt;       (text2wave_error "no output filetype specified"))&lt;br /&gt;   (set! output_type (car (cdr o)))&lt;br /&gt;   (set! o (cdr o)))&lt;br /&gt;  ((or (string-equal "-f" (car o)) ;; for compatibility and memory loss&lt;br /&gt;       (string-equal "-F" (car o)))&lt;br /&gt;   (if (not (cdr o))&lt;br /&gt;       (text2wave_error "no frequency specified"))&lt;br /&gt;   (set! frequency (car (cdr o)))&lt;br /&gt;   (set! o (cdr o)))&lt;br /&gt;  ((string-equal "-scale" (car o))&lt;br /&gt;   (if (not (cdr o))&lt;br /&gt;       (text2wave_error "no scale specified"))&lt;br /&gt;   (set! volume (car (cdr o)))&lt;br /&gt;   (set! o (cdr o)))&lt;br /&gt;  ((string-equal "-mode" (car o))&lt;br /&gt;   (if (not (cdr o))&lt;br /&gt;       (text2wave_error "no mode specified"))&lt;br /&gt;   (set! mode (car (cdr o)))&lt;br /&gt;   (set! o (cdr o)))&lt;br /&gt;  ((string-equal "-eval" (car o))&lt;br /&gt;   (if (not (cdr o))&lt;br /&gt;       (text2wave_error "no file specified to load"))&lt;br /&gt;   (if (string-matches (car (cdr o)) "^(.*")&lt;br /&gt;       (eval (read-from-string (car (cdr o))))&lt;br /&gt;       (load (car (cdr o))))&lt;br /&gt;   (set! o (cdr o)))&lt;br /&gt;  (t&lt;br /&gt;   (set! files (cons (car o) files))))&lt;br /&gt; (set! o (cdr o))))&lt;br /&gt;    (if files&lt;br /&gt; (set! text_files (reverse files)))))&lt;br /&gt;&lt;br /&gt;(define (text2wave_error message)&lt;br /&gt;  (format stderr "%s: %s\n" "text2wave" message)&lt;br /&gt;  (text2wave_help))&lt;br /&gt;&lt;br /&gt;(define (save_record_wave utt)&lt;br /&gt;"Saves the waveform and records its so it can be joined into a &lt;br /&gt;a single waveform at the end."&lt;br /&gt;  (let ((fn (make_tmp_filename)))&lt;br /&gt;    (utt.save.wave utt fn)&lt;br /&gt;    (set! wavefiles (cons fn wavefiles))&lt;br /&gt;    utt))&lt;br /&gt;&lt;br /&gt;(define (combine_waves)&lt;br /&gt;  "Join all the waves together into the desired output file&lt;br /&gt;and delete the intermediate ones."&lt;br /&gt;  (let ((wholeutt (Utterance Text "")))&lt;br /&gt;    (mapcar&lt;br /&gt;     (lambda (d) &lt;br /&gt;       (utt.import.wave wholeutt d t)&lt;br /&gt;       (delete-file d))&lt;br /&gt;     (reverse wavefiles))&lt;br /&gt;    (if frequency&lt;br /&gt; (utt.wave.resample wholeutt (parse-number frequency)))&lt;br /&gt;    (if (not (equal? volume "1.0"))&lt;br /&gt; (begin&lt;br /&gt;   (format t "doing v\n")&lt;br /&gt;   (utt.wave.rescale wholeutt (parse-number volume))))&lt;br /&gt;    (utt.save.wave wholeutt outfile output_type)&lt;br /&gt;    ))&lt;br /&gt;&lt;br /&gt;;;;&lt;br /&gt;;;; Redefine what happens to utterances during text to speech &lt;br /&gt;;;;&lt;br /&gt;(set! tts_hooks (list utt.synth save_record_wave))&lt;br /&gt;&lt;br /&gt;(define (main)&lt;br /&gt;  (get_options)&lt;br /&gt;&lt;br /&gt;  ;; do the synthesis&lt;br /&gt;  (mapcar&lt;br /&gt;   (lambda (f) &lt;br /&gt;     (if mode&lt;br /&gt;  (tts_file f mode)&lt;br /&gt;  (tts_file f (tts_find_text_mode f auto-text-mode-alist))))&lt;br /&gt;   text_files)&lt;br /&gt;&lt;br /&gt;  ;; Now put the waveforms together at again&lt;br /&gt;  (combine_waves)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;;;;  Do the work&lt;br /&gt;(main)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-3326937990983848052?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/3326937990983848052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/08/fix-bug-segmentation-fault-text2wave.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3326937990983848052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3326937990983848052'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/08/fix-bug-segmentation-fault-text2wave.html' title='Fix bug Segmentation fault text2wave when setting new voice'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-6362220372816085508</id><published>2011-08-07T15:30:00.001+07:00</published><updated>2011-08-07T15:35:22.589+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='festival voice'/><title type='text'>Festival and setting voice to female</title><content type='html'>First you need&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;to&lt;/span&gt;&amp;nbsp;install&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;&amp;nbsp;package&lt;em&gt;&lt;br /&gt;&lt;br /&gt;# aptitude install&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;-freebsoft-utils&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;In a terminal:&lt;br /&gt;&lt;br /&gt;Test&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;:&lt;br /&gt;&lt;em&gt;# echo "Hello World"|&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;&amp;nbsp;--tts&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="highlightedSearchTerm"&gt;To&lt;/span&gt;&amp;nbsp;copy&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;to&lt;/span&gt;&amp;nbsp;wav:&lt;br /&gt;&lt;em&gt;# echo "Hello World" |&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;text2wave&lt;/span&gt;&amp;nbsp;-o Hello_World.wav&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="highlightedSearchTerm"&gt;To&lt;/span&gt;&amp;nbsp;read man pages of cron:&lt;br /&gt;&lt;em&gt;#man cron |&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;&amp;nbsp;--tts&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="highlightedSearchTerm"&gt;To&lt;/span&gt;&amp;nbsp;read a saved file:&lt;br /&gt;&lt;em&gt;#&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;&amp;nbsp;--tts snort-usage.odt&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="highlightedSearchTerm"&gt;To&lt;/span&gt;&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;change&lt;/span&gt;&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;to&lt;/span&gt;&amp;nbsp;a&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;female&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#cd /usr/share/&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;/&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;s/english&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#wget http://festvox.org/packed/&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;/latest/festvox_cmu_us_slt_arctic_hts.tar.gz&lt;/em&gt;&lt;br /&gt;&lt;em&gt;#tar xvf festvox_cmu_us_slt_arctic_hts.tar.gz&lt;/em&gt;&lt;br /&gt;&lt;em&gt;#mv&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;/lib/&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;s/us/cmu_us_slt_arctic_hts&lt;/em&gt;&amp;nbsp;.&lt;br /&gt;&lt;br /&gt;Check if the&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;female&lt;/span&gt;&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;&amp;nbsp;is loading&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="highlightedSearchTerm"&gt;Festival&lt;/span&gt;&amp;nbsp;Speech Synthesis System 1.95:beta July 2004&lt;br /&gt;Copyright (C) University of Edinburgh, 1996-2004. All rights reserved.&lt;br /&gt;For details type `(&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;_warranty)'&lt;br /&gt;&lt;em&gt;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;&amp;gt; (&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;_cmu_us_slt_arctic_hts)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;== Set&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;Voice&lt;/span&gt;&lt;/em&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;cmu_us_slt_arctic_hts&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;div&gt;&lt;em&gt;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;&amp;gt; (SayText "this is a test text for demo") &amp;lt;==&amp;nbsp;&lt;/em&gt;Hear the&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&amp;nbsp;#&amp;lt;Utterance 0xb7216598&amp;gt;&lt;em&gt;&lt;br /&gt;&lt;span class="highlightedSearchTerm"&gt;festival&lt;/span&gt;&amp;gt;&amp;nbsp;&lt;/em&gt;&lt;/div&gt;If it works,&lt;br /&gt;&lt;div&gt;PHPAGI for asterisk uses&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;text2wave&lt;/span&gt;&amp;nbsp;which is a script based on&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;Festival&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="highlightedSearchTerm"&gt;text2wave&lt;/span&gt;&amp;nbsp;can be set&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;to&lt;/span&gt;&amp;nbsp;the&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;&amp;nbsp;using&lt;br /&gt;&lt;div&gt;&lt;em&gt;#&lt;span class="highlightedSearchTerm"&gt;text2wave&lt;/span&gt;&amp;nbsp;-eval "(&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;_cmu_us_slt_arctic_hts)"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;so a wrapper script is created in /usr/local/bin/&lt;span class="highlightedSearchTerm"&gt;text2wave&lt;/span&gt;&lt;br /&gt;&lt;em&gt;#!/bin/bash&lt;br /&gt;/usr/bin/&lt;span class="highlightedSearchTerm"&gt;text2wave&lt;/span&gt;&amp;nbsp;-eval "(&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;_cmu_us_slt_arctic_hts)" "$@"&lt;/em&gt;&lt;br /&gt;this script will give sometimes "Segmentation fault"&lt;br /&gt;so a replacement of&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;text2wave&lt;/span&gt;&amp;nbsp;is taken from&amp;nbsp;&lt;a href="http://trantrietvn.blogspot.com/2011/08/fix-bug-segmentation-fault-text2wave.html"&gt;http://trantrietvn.blogspot.com/2011/08/fix-bug-segmentation-fault-text2wave.html&lt;/a&gt;&lt;span class="link-external"&gt;&lt;span class="link-external"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;and copied&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;to&lt;/span&gt;&amp;nbsp;/usr/bin&lt;br /&gt;(this one is bug-fixed version)&lt;br /&gt;&lt;br /&gt;You have a successfully&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;change&lt;/span&gt;&amp;nbsp;the&amp;nbsp;&lt;span class="highlightedSearchTerm"&gt;voice&lt;/span&gt;!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Source:&amp;nbsp;&lt;a href="http://www.poespoes.nl/log/installing-festival-and-setting-voice-to-female.html"&gt;http://www.poespoes.nl/log/installing-festival-and-setting-voice-to-female.html&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-6362220372816085508?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/6362220372816085508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/08/festival-and-setting-voice-to-female.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6362220372816085508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6362220372816085508'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/08/festival-and-setting-voice-to-female.html' title='Festival and setting voice to female'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-7178106914011754280</id><published>2011-08-07T09:47:00.000+07:00</published><updated>2011-08-07T09:47:06.748+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='class object'/><title type='text'>Difference between class vs object</title><content type='html'>&lt;span class="Apple-style-span" style="background-color: #e4e2db; font-family: Arial, Helvetica, sans-serif; font-size: 17px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="line-height: 27px; margin-bottom: 15px; margin-top: 15px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Class vs. Object&lt;/strong&gt;&lt;/div&gt;&lt;div style="line-height: 27px; margin-bottom: 15px; margin-top: 15px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;Object Oriented Programming, or OOP, is a very popular style of programming, due to its ability to handle more complex applications with a lot more code. This is because it organizes the&amp;nbsp;&lt;a href="http://www.differencebetween.net/language/difference-between-data-and-information/" style="color: #83a7ba; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Data vs Information"&gt;data&amp;nbsp;&lt;/a&gt;into objects that are comparable to real life objects. Class and object are two terms that are commonly used in OOP. In its most basic form, objects are the instantiation of classes.&lt;/div&gt;&lt;div style="line-height: 27px; margin-bottom: 15px; margin-top: 15px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;In&amp;nbsp;&lt;a href="http://www.differencebetween.net/miscellaneous/difference-between-judgment-and-order/" style="color: #83a7ba; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Order vs Judgement"&gt;order&amp;nbsp;&lt;/a&gt;to use objects in a program, you need to declare the properties and procedures in a class. For us to visualize this better, let’s discuss this using an example. If you want to create a program that deals with vehicles, you will need to create a class for vehicles. In the class you would create variables that will hold information relevant to vehicles. Values like passenger capacity, top speed and fuel capacity are typical along with procedures like start and stop. After creating the class for vehicles, you can now create objects in your application that are based on the vehicle class. You can create an object called car or motorcycle that is based on vehicles. You can then fill up the relevant information on the&amp;nbsp;&lt;a href="http://www.differencebetween.net/category/object/page/2/" style="color: #83a7ba; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Comparisons of objects"&gt;object&lt;/a&gt;, and use it as you deem fit in your application.&lt;/div&gt;&lt;div style="line-height: 27px; margin-bottom: 15px; margin-top: 15px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;As you already may have deduced from the example discussed above, the information that you will really use in an application are stored in the object, and not in the class. The class only defines the structure of the data, and what each procedure or function does.&lt;/div&gt;&lt;div style="line-height: 27px; margin-bottom: 15px; margin-top: 15px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;Another excellent feature of classes is the ability to inherit properties and procedures from another class. Classes that inherit the properties of other classes are called subclasses. This shortens the work needed to define another class. If you want to define a class specific to cars, you can simply inherit the properties and procedures in the vehicle’s class, as all cars are vehicles and will exhibit the same characteristics. The same is not done with objects, as there is really no practical use for globally inheriting an object’s data. The basic practice for programmers is to create a subclass, and create the object from the subclass.&lt;/div&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #1d1d1d; font-family: Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px;"&gt;Summary:&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: #e4e2db; font-family: Arial, Helvetica, sans-serif; font-size: 17px;"&gt;&lt;div style="line-height: 27px; margin-bottom: 15px; margin-top: 15px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;1. An object is an instance of a class.&lt;/div&gt;&lt;div style="line-height: 27px; margin-bottom: 15px; margin-top: 15px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;2. You define all the properties and functions in a class, while you use them in an object.&lt;/div&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: #e4e2db; font-family: Arial, Helvetica, sans-serif; font-size: 17px;"&gt;&lt;div style="line-height: 27px; margin-bottom: 15px; margin-top: 15px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;3. Classes do not hold any information, while an object does.&lt;/div&gt;&lt;div style="line-height: 27px; margin-bottom: 15px; margin-top: 15px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: justify;"&gt;4. You can create subclasses, but not sub-objects.&lt;/div&gt;&lt;span style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Source:&amp;nbsp;&lt;a href="http://www.differencebetween.net/technology/difference-between-class-and-object/"&gt;http://www.differencebetween.net/technology/difference-between-class-and-object/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-7178106914011754280?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/7178106914011754280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/08/difference-between-class-vs-object.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7178106914011754280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7178106914011754280'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/08/difference-between-class-vs-object.html' title='Difference between class vs object'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-2606378801234459852</id><published>2011-07-24T10:31:00.000+07:00</published><updated>2011-07-24T10:31:31.011+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Error code shell php'/><title type='text'>Error code when excute shell in php script</title><content type='html'>Code Description&lt;br /&gt;0 The operation completed successfully.&lt;br /&gt;1 Incorrect function.&lt;br /&gt;2 The system cannot find the file specified.&lt;br /&gt;3 The system cannot find the path specified.&lt;br /&gt;4 The system cannot open the file.&lt;br /&gt;5 Access is denied.&lt;br /&gt;6 The handle is invalid.&lt;br /&gt;7 The storage control blocks were destroyed.&lt;br /&gt;8 Not enough storage is available to process this command.&lt;br /&gt;9 The storage control block address is invalid.&lt;br /&gt;10 The environment is incorrect.&lt;br /&gt;11 An attempt was made to load a program with an incorrect format.&lt;br /&gt;12 The access code is invalid.&lt;br /&gt;13 The data is invalid.&lt;br /&gt;14 Not enough storage is available to complete this operation.&lt;br /&gt;15 The system cannot find the drive specified.&lt;br /&gt;16 The directory cannot be removed.&lt;br /&gt;17 The system cannot move the file to a different disk drive.&lt;br /&gt;18 There are no more files.&lt;br /&gt;19 The media is write protected.&lt;br /&gt;20 The system cannot find the device specified.&lt;br /&gt;21 The device is not ready.&lt;br /&gt;22 The device does not recognize the command.&lt;br /&gt;23 Data error (cyclic redundancy check).&lt;br /&gt;24 The program issued a command but the command length is incorrect.&lt;br /&gt;25 The drive cannot locate a specific area or track on the disk.&lt;br /&gt;26 The specified disk or diskette cannot be accessed.&lt;br /&gt;27 The drive cannot find the sector requested.&lt;br /&gt;28 The printer is out of paper.&lt;br /&gt;29 The system cannot write to the specified device.&lt;br /&gt;30 The system cannot read from the specified device.&lt;br /&gt;31 A device attached to the system is not functioning.&lt;br /&gt;32 The process cannot access the file because it is being used by another process.&lt;br /&gt;33 The process cannot access the file because another process has locked a portion of the file.&lt;br /&gt;34 The wrong diskette is in the drive. Insert %2 (Volume Serial Number: %3) into drive %1.&lt;br /&gt;36 Too many files opened for sharing.&lt;br /&gt;38 Reached the end of the file.&lt;br /&gt;39 The disk is full.&lt;br /&gt;50 The request is not supported.&lt;br /&gt;51 Windows cannot find the network path. Verify that the network  path is correct and the destination computer is not busy or turned off.  If Windows still cannot find the network path, contact your network  administrator.&lt;br /&gt;52 You were not connected because a duplicate name exists on the  network. Go to System in the Control Panel to change the computer name  and try again.&lt;br /&gt;53 The network path was not found.&lt;br /&gt;54 The network is busy.&lt;br /&gt;55 The specified network resource or device is no longer available.&lt;br /&gt;56 The network BIOS command limit has been reached.&lt;br /&gt;57 A network adapter hardware error occurred.&lt;br /&gt;58 The specified server cannot perform the requested operation.&lt;br /&gt;59 An unexpected network error occurred.&lt;br /&gt;60 The remote adapter is not compatible.&lt;br /&gt;61 The printer queue is full.&lt;br /&gt;62 Space to store the file waiting to be printed is not available on the server.&lt;br /&gt;63 Your file waiting to be printed was deleted.&lt;br /&gt;64 The specified network name is no longer available.&lt;br /&gt;65 Network access is denied.&lt;br /&gt;66 The network resource type is not correct.&lt;br /&gt;67 The network name cannot be found.&lt;br /&gt;68 The name limit for the local computer network adapter card was exceeded.&lt;br /&gt;69 The network BIOS session limit was exceeded.&lt;br /&gt;70 The remote server has been paused or is in the process of being started.&lt;br /&gt;71 No more connections can be made to this remote computer at  this time because there are already as many connections as the computer  can accept.&lt;br /&gt;72 The specified printer or disk device has been paused.&lt;br /&gt;80 The file exists.&lt;br /&gt;82 The directory or file cannot be created.&lt;br /&gt;83 Fail on INT 24.&lt;br /&gt;84 Storage to process this request is not available.&lt;br /&gt;85 The local device name is already in use.&lt;br /&gt;86 The specified network password is not correct.&lt;br /&gt;87 The parameter is incorrect.&lt;br /&gt;88 A write fault occurred on the network.&lt;br /&gt;89 The system cannot start another process at this time.&lt;br /&gt;100 Cannot create another system semaphore.&lt;br /&gt;101 The exclusive semaphore is owned by another process.&lt;br /&gt;102 The semaphore is set and cannot be closed.&lt;br /&gt;103 The semaphore cannot be set again.&lt;br /&gt;104 Cannot request exclusive semaphores at interrupt time.&lt;br /&gt;105 The previous ownership of this semaphore has ended.&lt;br /&gt;106 Insert the diskette for drive %1.&lt;br /&gt;107 The program stopped because an alternate diskette was not inserted.&lt;br /&gt;108 The disk is in use or locked by another process.&lt;br /&gt;109 The pipe has been ended.&lt;br /&gt;110 The system cannot open the device or file specified.&lt;br /&gt;111 The file name is too long.&lt;br /&gt;112 There is not enough space on the disk.&lt;br /&gt;113 No more internal file identifiers available.&lt;br /&gt;114 The target internal file identifier is incorrect.&lt;br /&gt;117 The IOCTL call made by the application program is not correct.&lt;br /&gt;118 The verify-on-write switch parameter value is not correct.&lt;br /&gt;119 The system does not support the command requested.&lt;br /&gt;120 This function is not supported on this system.&lt;br /&gt;121 The semaphore timeout period has expired.&lt;br /&gt;122 The data area passed to a system call is too small.&lt;br /&gt;123 The filename, directory name, or volume label syntax is incorrect.&lt;br /&gt;124 The system call level is not correct.&lt;br /&gt;125 The disk has no volume label.&lt;br /&gt;126 The specified module could not be found.&lt;br /&gt;127 The specified procedure could not be found.&lt;br /&gt;128 There are no child processes to wait for.&lt;br /&gt;129 The %1 application cannot be run in Win32 mode.&lt;br /&gt;130 Attempt to use a file handle to an open disk partition for an operation other than raw disk I/O.&lt;br /&gt;131 An attempt was made to move the file pointer before the beginning of the file.&lt;br /&gt;132 The file pointer cannot be set on the specified device or file.&lt;br /&gt;133 A JOIN or SUBST command cannot be used for a drive that contains previously joined drives.&lt;br /&gt;134 An attempt was made to use a JOIN or SUBST command on a drive that has already been joined.&lt;br /&gt;135 An attempt was made to use a JOIN or SUBST command on a drive that has already been substituted.&lt;br /&gt;136 The system tried to delete the JOIN of a drive that is not joined.&lt;br /&gt;137 The system tried to delete the substitution of a drive that is not substituted.&lt;br /&gt;138 The system tried to join a drive to a directory on a joined drive.&lt;br /&gt;139 The system tried to substitute a drive to a directory on a substituted drive.&lt;br /&gt;140 The system tried to join a drive to a directory on a substituted drive.&lt;br /&gt;141 The system tried to SUBST a drive to a directory on a joined drive.&lt;br /&gt;142 The system cannot perform a JOIN or SUBST at this time.&lt;br /&gt;143 The system cannot join or substitute a drive to or for a directory on the same drive.&lt;br /&gt;144 The directory is not a subdirectory of the root directory.&lt;br /&gt;145 The directory is not empty.&lt;br /&gt;146 The path specified is being used in a substitute.&lt;br /&gt;147 Not enough resources are available to process this command.&lt;br /&gt;148 The path specified cannot be used at this time.&lt;br /&gt;149 An attempt was made to join or substitute a drive for which a  directory on the drive is the target of a previous substitute.&lt;br /&gt;150 System trace information was not specified in your CONFIG.SYS file, or tracing is disallowed.&lt;br /&gt;151 The number of specified semaphore events for DosMuxSemWait is not correct.&lt;br /&gt;152 DosMuxSemWait did not execute; too many semaphores are already set.&lt;br /&gt;153 The DosMuxSemWait list is not correct.&lt;br /&gt;154 The volume label you entered exceeds the label character limit of the target file system.&lt;br /&gt;155 Cannot create another thread.&lt;br /&gt;156 The recipient process has refused the signal.&lt;br /&gt;157 The segment is already discarded and cannot be locked.&lt;br /&gt;158 The segment is already unlocked.&lt;br /&gt;159 The address for the thread ID is not correct.&lt;br /&gt;160 The argument string passed to DosExecPgm is not correct.&lt;br /&gt;161 The specified path is invalid.&lt;br /&gt;162 A signal is already pending.&lt;br /&gt;164 No more threads can be created in the system.&lt;br /&gt;167 Unable to lock a region of a file.&lt;br /&gt;170 The requested resource is in use.&lt;br /&gt;173 A lock request was not outstanding for the supplied cancel region.&lt;br /&gt;174 The file system does not support atomic changes to the lock type.&lt;br /&gt;180 The system detected a segment number that was not correct.&lt;br /&gt;182 The operating system cannot run %1.&lt;br /&gt;183 Cannot create a file when that file already exists.&lt;br /&gt;186 The flag passed is not correct.&lt;br /&gt;187 The specified system semaphore name was not found.&lt;br /&gt;188 The operating system cannot run %1.&lt;br /&gt;189 The operating system cannot run %1.&lt;br /&gt;190 The operating system cannot run %1.&lt;br /&gt;191 Cannot run %1 in Win32 mode.&lt;br /&gt;192 The operating system cannot run %1.&lt;br /&gt;193 %1 is not a valid Win32 application.&lt;br /&gt;194 The operating system cannot run %1.&lt;br /&gt;195 The operating system cannot run %1.&lt;br /&gt;196 The operating system cannot run this application program.&lt;br /&gt;197 The operating system is not presently configured to run this application.&lt;br /&gt;198 The operating system cannot run %1.&lt;br /&gt;199 The operating system cannot run this application program.&lt;br /&gt;200 The code segment cannot be greater than or equal to 64K.&lt;br /&gt;201 The operating system cannot run %1.&lt;br /&gt;202 The operating system cannot run %1.&lt;br /&gt;203 The system could not find the environment option that was entered.&lt;br /&gt;205 No process in the command subtree has a signal handler.&lt;br /&gt;206 The filename or extension is too long.&lt;br /&gt;207 The ring 2 stack is in use.&lt;br /&gt;208 The global filename characters, * or ?, are entered  incorrectly or too many global filename characters are specified.&lt;br /&gt;209 The signal being posted is not correct.&lt;br /&gt;210 The signal handler cannot be set.&lt;br /&gt;212 The segment is locked and cannot be reallocated.&lt;br /&gt;214 Too many dynamic-link modules are attached to this program or dynamic-link module.&lt;br /&gt;215 Cannot nest calls to LoadModule.&lt;br /&gt;216 The image file %1 is valid, but is for a machine type other than the current machine.&lt;br /&gt;230 The pipe state is invalid.&lt;br /&gt;231 All pipe instances are busy.&lt;br /&gt;232 The pipe is being closed.&lt;br /&gt;233 No process is on the other end of the pipe.&lt;br /&gt;234 More data is available.&lt;br /&gt;240 The session was canceled.&lt;br /&gt;254 The specified extended attribute name was invalid.&lt;br /&gt;255 The extended attributes are inconsistent.&lt;br /&gt;258 The wait operation timed out.&lt;br /&gt;259 No more data is available.&lt;br /&gt;266 The copy functions cannot be used.&lt;br /&gt;267 The directory name is invalid.&lt;br /&gt;275 The extended attributes did not fit in the buffer.&lt;br /&gt;276 The extended attribute file on the mounted file system is corrupt.&lt;br /&gt;277 The extended attribute table file is full.&lt;br /&gt;278 The specified extended attribute handle is invalid.&lt;br /&gt;282 The mounted file system does not support extended attributes.&lt;br /&gt;288 Attempt to release mutex not owned by caller.&lt;br /&gt;298 Too many posts were made to a semaphore.&lt;br /&gt;299 Only part of a ReadProcessMemory or WriteProcessMemory request was completed.&lt;br /&gt;300 The oplock request is denied.&lt;br /&gt;301 An invalid oplock acknowledgment was received by the system.&lt;br /&gt;302 The volume is too fragmented to complete this operation.&lt;br /&gt;303 The file cannot be opened because it is in the process of being deleted.&lt;br /&gt;317 The system cannot find message text for message number 0x%1 in the message file for %2.&lt;br /&gt;487 Attempt to access invalid address.&lt;br /&gt;534 Arithmetic result exceeded 32 bits.&lt;br /&gt;535 There is a process on other end of the pipe.&lt;br /&gt;536 Waiting for a process to open the other end of the pipe.&lt;br /&gt;994 Access to the extended attribute was denied.&lt;br /&gt;995 The I/O operation has been aborted because of either a thread exit or an application request.&lt;br /&gt;996 Overlapped I/O event is not in a signaled state.&lt;br /&gt;997 Overlapped I/O operation is in progress.&lt;br /&gt;998 Invalid access to memory location.&lt;br /&gt;999 Error performing inpage operation.&lt;br /&gt;1001 Recursion too deep; the stack overflowed.&lt;br /&gt;1002 The window cannot act on the sent message.&lt;br /&gt;1003 Cannot complete this function.&lt;br /&gt;1004 Invalid flags.&lt;br /&gt;1005 The volume does not contain a recognized file system.  Please make sure that all required file system drivers are loaded and  that the volume is not corrupted.&lt;br /&gt;1006 The volume for a file has been externally altered so that the opened file is no longer valid.&lt;br /&gt;1007 The requested operation cannot be performed in full-screen mode.&lt;br /&gt;1008 An attempt was made to reference a token that does not exist.&lt;br /&gt;1009 The configuration registry database is corrupt.&lt;br /&gt;1010 The configuration registry key is invalid.&lt;br /&gt;1011 The configuration registry key could not be opened.&lt;br /&gt;1012 The configuration registry key could not be read.&lt;br /&gt;1013 The configuration registry key could not be written.&lt;br /&gt;1014 One of the files in the registry database had to be  recovered by use of a log or alternate copy. The recovery was  successful.&lt;br /&gt;1015 The registry is corrupted. The structure of one of the  files containing registry data is corrupted, or the system's memory  image of the file is corrupted, or the file could not be recovered  because the alternate copy or log was absent or corrupted.&lt;br /&gt;1016 An I/O operation initiated by the registry failed  unrecoverably. The registry could not read in, or write out, or flush,  one of the files that contain the system's image of the registry.&lt;br /&gt;1017 The system has attempted to load or restore a file into the  registry, but the specified file is not in a registry file format.&lt;br /&gt;1018 Illegal operation attempted on a registry key that has been marked for deletion.&lt;br /&gt;1019 System could not allocate the required space in a registry log.&lt;br /&gt;1020 Cannot create a symbolic link in a registry key that already has subkeys or values.&lt;br /&gt;1021 Cannot create a stable subkey under a volatile parent key.&lt;br /&gt;1022 A notify change request is being completed and the  information is not being returned in the caller's buffer. The caller now  needs to enumerate the files to find the changes.&lt;br /&gt;1051 A stop control has been sent to a service that other running services are dependent on.&lt;br /&gt;1052 The requested control is not valid for this service.&lt;br /&gt;1053 The service did not respond to the start or control request in a timely fashion.&lt;br /&gt;1054 A thread could not be created for the service.&lt;br /&gt;1055 The service database is locked.&lt;br /&gt;1056 An instance of the service is already running.&lt;br /&gt;1057 The account name is invalid or does not exist, or the password is invalid for the account name specified.&lt;br /&gt;1058 The service cannot be started, either because it is  disabled or because it has no enabled devices associated with it.&lt;br /&gt;1059 Circular service dependency was specified.&lt;br /&gt;1060 The specified service does not exist as an installed service.&lt;br /&gt;1061 The service cannot accept control messages at this time.&lt;br /&gt;1062 The service has not been started.&lt;br /&gt;1063 The service process could not connect to the service controller.&lt;br /&gt;1064 An exception occurred in the service when handling the control request.&lt;br /&gt;1065 The database specified does not exist.&lt;br /&gt;1066 The service has returned a service-specific error code.&lt;br /&gt;1067 The process terminated unexpectedly.&lt;br /&gt;1068 The dependency service or group failed to start.&lt;br /&gt;1069 The service did not start due to a logon failure.&lt;br /&gt;1070 After starting, the service hung in a start-pending state.&lt;br /&gt;1071 The specified service database lock is invalid.&lt;br /&gt;1072 The specified service has been marked for deletion.&lt;br /&gt;1073 The specified service already exists.&lt;br /&gt;1074 The system is currently running with the last-known-good configuration.&lt;br /&gt;1075 The dependency service does not exist or has been marked for deletion.&lt;br /&gt;1076 The current boot has already been accepted for use as the last-known-good control set.&lt;br /&gt;1077 No attempts to start the service have been made since the last boot.&lt;br /&gt;1078 The name is already in use as either a service name or a service display name.&lt;br /&gt;1079 The account specified for this service is different from  the account specified for other services running in the same process.&lt;br /&gt;1080 Failure actions can only be set for Win32 services, not for drivers.&lt;br /&gt;1081 This service runs in the same process as the service  control manager. Therefore, the service control manager cannot take  action if this service's process terminates unexpectedly.&lt;br /&gt;1082 No recovery program has been configured for this service.&lt;br /&gt;1083 The executable program that this service is configured to run in does not implement the service.&lt;br /&gt;1084 This service cannot be started in Safe Mode.&lt;br /&gt;1100 The physical end of the tape has been reached.&lt;br /&gt;1101 A tape access reached a filemark.&lt;br /&gt;1102 The beginning of the tape or a partition was encountered.&lt;br /&gt;1103 A tape access reached the end of a set of files.&lt;br /&gt;1104 No more data is on the tape.&lt;br /&gt;1105 Tape could not be partitioned.&lt;br /&gt;1106 When accessing a new tape of a multivolume partition, the current block size is incorrect.&lt;br /&gt;1107 Tape partition information could not be found when loading a tape.&lt;br /&gt;1108 Unable to lock the media eject mechanism.&lt;br /&gt;1109 Unable to unload the media.&lt;br /&gt;1110 The media in the drive may have changed.&lt;br /&gt;1111 The I/O bus was reset.&lt;br /&gt;1112 No media in drive.&lt;br /&gt;1113 No mapping for the Unicode character exists in the target multi-byte code page.&lt;br /&gt;1114 A dynamic link library (DLL) initialization routine failed.&lt;br /&gt;1115 A system shutdown is in progress.&lt;br /&gt;1116 Unable to abort the system shutdown because no shutdown was in progress.&lt;br /&gt;1117 The request could not be performed because of an I/O device error.&lt;br /&gt;1118 No serial device was successfully initialized. The serial driver will unload.&lt;br /&gt;1119 Unable to open a device that was sharing an interrupt  request (IRQ) with other devices. At least one other device that uses  that IRQ was already opened.&lt;br /&gt;1120 A serial I/O operation was completed by another write to  the serial port. (The IOCTL_SERIAL_XOFF_COUNTER reached zero.)&lt;br /&gt;1121 A serial I/O operation completed because the timeout period  expired. (The IOCTL_SERIAL_XOFF_COUNTER did not reach zero.)&lt;br /&gt;1122 No ID address mark was found on the floppy disk.&lt;br /&gt;1123 Mismatch between the floppy disk sector ID field and the floppy disk controller track address.&lt;br /&gt;1124 The floppy disk controller reported an error that is not recognized by the floppy disk driver.&lt;br /&gt;1125 The floppy disk controller returned inconsistent results in its registers.&lt;br /&gt;1126 While accessing the hard disk, a recalibrate operation failed, even after retries.&lt;br /&gt;1127 While accessing the hard disk, a disk operation failed even after retries.&lt;br /&gt;1128 While accessing the hard disk, a disk controller reset was needed, but even that failed.&lt;br /&gt;1129 Physical end of tape encountered.&lt;br /&gt;1130 Not enough server storage is available to process this command.&lt;br /&gt;1131 A potential deadlock condition has been detected.&lt;br /&gt;1132 The base address or the file offset specified does not have the proper alignment.&lt;br /&gt;1140 An attempt to change the system power state was vetoed by another application or driver.&lt;br /&gt;1141 The system BIOS failed an attempt to change the system power state.&lt;br /&gt;1142 An attempt was made to create more links on a file than the file system supports.&lt;br /&gt;1150 The specified program requires a newer version of Windows.&lt;br /&gt;1151 The specified program is not a Windows or MS-DOS program.&lt;br /&gt;1152 Cannot start more than one instance of the specified program.&lt;br /&gt;1153 The specified program was written for an earlier version of Windows.&lt;br /&gt;1154 One of the library files needed to run this application is damaged.&lt;br /&gt;1155 No application is associated with the specified file for this operation.&lt;br /&gt;1156 An error occurred in sending the command to the application.&lt;br /&gt;1157 One of the library files needed to run this application cannot be found.&lt;br /&gt;1158 The current process has used all of its system allowance of handles for Window Manager objects.&lt;br /&gt;1159 The message can be used only with synchronous operations.&lt;br /&gt;1160 The indicated source element has no media.&lt;br /&gt;1161 The indicated destination element already contains media.&lt;br /&gt;1162 The indicated element does not exist.&lt;br /&gt;1163 The indicated element is part of a magazine that is not present.&lt;br /&gt;1164 The indicated device requires reinitialization due to hardware errors.&lt;br /&gt;1165 The device has indicated that cleaning is required before further operations are attempted.&lt;br /&gt;1166 The device has indicated that its door is open.&lt;br /&gt;1167 The device is not connected.&lt;br /&gt;1168 Element not found.&lt;br /&gt;1169 There was no match for the specified key in the index.&lt;br /&gt;1170 The property set specified does not exist on the object.&lt;br /&gt;1171 The point passed to GetMouseMovePointsEx is not in the buffer.&lt;br /&gt;1172 The tracking (workstation) service is not running.&lt;br /&gt;1173 The Volume ID could not be found.&lt;br /&gt;1175 Unable to remove the file to be replaced.&lt;br /&gt;1176 Unable to move the replacement file to the file to be  replaced. The file to be replaced has retained its original name.&lt;br /&gt;1177 Unable to move the replacement file to the file to be  replaced. The file to be replaced has been renamed using the backup  name.&lt;br /&gt;1178 The volume change journal is being deleted.&lt;br /&gt;1179 The volume change journal is not active.&lt;br /&gt;1180 A file was found, but it may not be the correct file.&lt;br /&gt;1181 The journal entry has been deleted from the journal.&lt;br /&gt;1200 The specified device name is invalid.&lt;br /&gt;1201 The device is not currently connected but it is a remembered connection.&lt;br /&gt;1202 The local device name has a remembered connection to another network resource.&lt;br /&gt;1203 No network provider accepted the given network path.&lt;br /&gt;1204 The specified network provider name is invalid.&lt;br /&gt;1205 Unable to open the network connection profile.&lt;br /&gt;1206 The network connection profile is corrupted.&lt;br /&gt;1207 Cannot enumerate a noncontainer.&lt;br /&gt;1208 An extended error has occurred.&lt;br /&gt;1209 The format of the specified group name is invalid.&lt;br /&gt;1210 The format of the specified computer name is invalid.&lt;br /&gt;1211 The format of the specified event name is invalid.&lt;br /&gt;1212 The format of the specified domain name is invalid.&lt;br /&gt;1213 The format of the specified service name is invalid.&lt;br /&gt;1214 The format of the specified network name is invalid.&lt;br /&gt;1215 The format of the specified share name is invalid.&lt;br /&gt;1216 The format of the specified password is invalid.&lt;br /&gt;1217 The format of the specified message name is invalid.&lt;br /&gt;1218 The format of the specified message destination is invalid.&lt;br /&gt;1219 Multiple connections to a server or shared resource by the  same user, using more than one user name, are not allowed. Disconnect  all previous connections to the server or shared resource and try  again.&lt;br /&gt;1220 An attempt was made to establish a session to a network  server, but there are already too many sessions established to that  server.&lt;br /&gt;1221 The workgroup or domain name is already in use by another computer on the network.&lt;br /&gt;1222 The network is not present or not started.&lt;br /&gt;1223 The operation was canceled by the user.&lt;br /&gt;1224 The requested operation cannot be performed on a file with a user-mapped section open.&lt;br /&gt;1225 The remote system refused the network connection.&lt;br /&gt;1226 The network connection was gracefully closed.&lt;br /&gt;1227 The network transport endpoint already has an address associated with it.&lt;br /&gt;1228 An address has not yet been associated with the network endpoint.&lt;br /&gt;1229 An operation was attempted on a nonexistent network connection.&lt;br /&gt;1230 An invalid operation was attempted on an active network connection.&lt;br /&gt;1231 The network location cannot be reached. For information about network troubleshooting, see Windows Help.&lt;br /&gt;1232 The network location cannot be reached. For information about network troubleshooting, see Windows Help.&lt;br /&gt;1233 The network location cannot be reached. For information about network troubleshooting, see Windows Help.&lt;br /&gt;1234 No service is operating at the destination network endpoint on the remote system.&lt;br /&gt;1235 The request was aborted.&lt;br /&gt;1236 The network connection was aborted by the local system.&lt;br /&gt;1237 The operation could not be completed. A retry should be performed.&lt;br /&gt;1238 A connection to the server could not be made because the  limit on the number of concurrent connections for this account has been  reached.&lt;br /&gt;1239 Attempting to log in during an unauthorized time of day for this account.&lt;br /&gt;1240 The account is not authorized to log in from this station.&lt;br /&gt;1241 The network address could not be used for the operation requested.&lt;br /&gt;1242 The service is already registered.&lt;br /&gt;1243 The specified service does not exist.&lt;br /&gt;1244 The operation being requested was not performed because the user has not been authenticated.&lt;br /&gt;1245 The operation being requested was not performed because the  user has not logged on to the network. The specified service does not  exist.&lt;br /&gt;1246 Continue with work in progress.&lt;br /&gt;1247 An attempt was made to perform an initialization operation when initialization has already been completed.&lt;br /&gt;1248 No more local devices.&lt;br /&gt;1249 The specified site does not exist.&lt;br /&gt;1250 A domain controller with the specified name already exists.&lt;br /&gt;1251 This operation is supported only when you are connected to the server.&lt;br /&gt;1252 The group policy framework should call the extension even if there are no changes.&lt;br /&gt;1253 The specified user does not have a valid profile.&lt;br /&gt;1254 This operation is not supported on a Microsoft Small Business Server.&lt;br /&gt;1255 The server machine is shutting down.&lt;br /&gt;1256 The remote system is not available. For information about network troubleshooting, see Windows Help.&lt;br /&gt;1257 The security identifier provided is not from an account domain.&lt;br /&gt;1258 The security identifier provided does not have a domain component.&lt;br /&gt;1259 AppHelp dialog canceled thus preventing the application from starting.&lt;br /&gt;1260 Windows cannot open this program because it has been  prevented by a software restriction policy. For more information, open  Event Viewer or contact your system administrator.&lt;br /&gt;1261 A program attempt to use an invalid register value.  Normally caused by an uninitialized register. This error is Itanium  specific.&lt;br /&gt;1262 The share is currently offline or does not exist.&lt;br /&gt;1263 The kerberos protocol encountered an error while validating the KDC certificate during smartcard logon.&lt;br /&gt;1264 The kerberos protocol encountered an error while attempting to utilize the smartcard subsystem.&lt;br /&gt;1265 The system detected a possible attempt to compromise  security. Please ensure that you can contact the server that  authenticated you.&lt;br /&gt;1266 The smartcard certificate used for authentication has been  revoked. Please contact your system administrator. There may be  additional information in the event log.&lt;br /&gt;1267 An untrusted certificate authority was detected while  processing the smartcard certificate used for authentication. Please  contact your system administrator.&lt;br /&gt;1268 The revocation status of the smartcard certificate used for  authentication could not be determined. Please contact your system  administrator.&lt;br /&gt;1269 The smartcard certificate used for authentication was not trusted. Please contact your system administrator.&lt;br /&gt;1270 The smartcard certificate used for authentication has expired. Please contact your system administrator.&lt;br /&gt;1271 The machine is locked and cannot be shut down without the force option.&lt;br /&gt;1273 An application-defined callback gave invalid data when called.&lt;br /&gt;1274 The group policy framework should call the extension in the synchronous foreground policy refresh.&lt;br /&gt;1275 This driver has been blocked from loading.&lt;br /&gt;1276 A dynamic link library (DLL) referenced a module that was neither a DLL nor the process's executable image.&lt;br /&gt;1300 Not all privileges referenced are assigned to the caller.&lt;br /&gt;1301 Some mapping between account names and security IDs was not done.&lt;br /&gt;1302 No system quota limits are specifically set for this account.&lt;br /&gt;1303 No encryption key is available. A well-known encryption key was returned.&lt;br /&gt;1304 The password is too complex to be converted to a LAN  Manager password. The LAN Manager password returned is a NULL string.&lt;br /&gt;1305 The revision level is unknown.&lt;br /&gt;1306 Indicates two revision levels are incompatible.&lt;br /&gt;1307 This security ID may not be assigned as the owner of this object.&lt;br /&gt;1308 This security ID may not be assigned as the primary group of an object.&lt;br /&gt;1309 An attempt has been made to operate on an impersonation  token by a thread that is not currently impersonating a client.&lt;br /&gt;1310 The group may not be disabled.&lt;br /&gt;1311 There are currently no logon servers available to service the logon request.&lt;br /&gt;1312 A specified logon session does not exist. It may already have been terminated.&lt;br /&gt;1313 A specified privilege does not exist.&lt;br /&gt;1314 A required privilege is not held by the client.&lt;br /&gt;1315 The name provided is not a properly formed account name.&lt;br /&gt;1316 The specified user already exists.&lt;br /&gt;1317 The specified user does not exist.&lt;br /&gt;1318 The specified group already exists.&lt;br /&gt;1319 The specified group does not exist.&lt;br /&gt;1320 Either the specified user account is already a member of  the specified group, or the specified group cannot be deleted because it  contains a member.&lt;br /&gt;1321 The specified user account is not a member of the specified group account.&lt;br /&gt;1322 The last remaining administration account cannot be disabled or deleted.&lt;br /&gt;1323 Unable to update the password. The value provided as the current password is incorrect.&lt;br /&gt;1324 Unable to update the password. The value provided for the  new password contains values that are not allowed in passwords.&lt;br /&gt;1325 Unable to update the password. The value provided for the  new password does not meet the length, complexity, or history  requirement of the domain.&lt;br /&gt;1326 Logon failure: unknown user name or bad password.&lt;br /&gt;1327 Logon failure: user account restriction. Possible reasons  are blank passwords not allowed, logon hour restrictions, or a policy  restriction has been enforced.&lt;br /&gt;1328 Logon failure: account logon time restriction violation.&lt;br /&gt;1329 Logon failure: user not allowed to log on to this computer.&lt;br /&gt;1330 Logon failure: the specified account password has expired.&lt;br /&gt;1331 Logon failure: account currently disabled.&lt;br /&gt;1332 No mapping between account names and security IDs was done.&lt;br /&gt;1333 Too many local user identifiers (LUIDs) were requested at one time.&lt;br /&gt;1334 No more local user identifiers (LUIDs) are available.&lt;br /&gt;1335 The subauthority part of a security ID is invalid for this particular use.&lt;br /&gt;1336 The access control list (ACL) structure is invalid.&lt;br /&gt;1337 The security ID structure is invalid.&lt;br /&gt;1338 The security descriptor structure is invalid.&lt;br /&gt;1340 The inherited access control list (ACL) or access control entry (ACE) could not be built.&lt;br /&gt;1341 The server is currently disabled.&lt;br /&gt;1342 The server is currently enabled.&lt;br /&gt;1343 The value provided was an invalid value for an identifier authority.&lt;br /&gt;1344 No more memory is available for security information updates.&lt;br /&gt;1345 The specified attributes are invalid, or incompatible with the attributes for the group as a whole.&lt;br /&gt;1346 Either a required impersonation level was not provided, or the provided impersonation level is invalid.&lt;br /&gt;1347 Cannot open an anonymous level security token.&lt;br /&gt;1348 The validation information class requested was invalid.&lt;br /&gt;1349 The type of the token is inappropriate for its attempted use.&lt;br /&gt;1350 Unable to perform a security operation on an object that has no associated security.&lt;br /&gt;1351 Configuration information could not be read from the domain  controller, either because the machine is unavailable, or access has  been denied.&lt;br /&gt;1352 The security account manager (SAM) or local security  authority (LSA) server was in the wrong state to perform the security  operation.&lt;br /&gt;1353 The domain was in the wrong state to perform the security operation.&lt;br /&gt;1354 This operation is only allowed for the Primary Domain Controller of the domain.&lt;br /&gt;1355 The specified domain either does not exist or could not be contacted.&lt;br /&gt;1356 The specified domain already exists.&lt;br /&gt;1357 An attempt was made to exceed the limit on the number of domains per server.&lt;br /&gt;1358 Unable to complete the requested operation because of  either a catastrophic media failure or a data structure corruption on  the disk.&lt;br /&gt;1359 An internal error occurred.&lt;br /&gt;1360 Generic access types were contained in an access mask which should already be mapped to nongeneric types.&lt;br /&gt;1361 A security descriptor is not in the right format (absolute or self-relative).&lt;br /&gt;1362 The requested action is restricted for use by logon  processes only. The calling process has not registered as a logon  process.&lt;br /&gt;1363 Cannot start a new logon session with an ID that is already in use.&lt;br /&gt;1364 A specified authentication package is unknown.&lt;br /&gt;1365 The logon session is not in a state that is consistent with the requested operation.&lt;br /&gt;1366 The logon session ID is already in use.&lt;br /&gt;1367 A logon request contained an invalid logon type value.&lt;br /&gt;1368 Unable to impersonate using a named pipe until data has been read from that pipe.&lt;br /&gt;1369 The transaction state of a registry subtree is incompatible with the requested operation.&lt;br /&gt;1370 An internal security database corruption has been encountered.&lt;br /&gt;1371 Cannot perform this operation on built-in accounts.&lt;br /&gt;1372 Cannot perform this operation on this built-in special group.&lt;br /&gt;1373 Cannot perform this operation on this built-in special user.&lt;br /&gt;1374 The user cannot be removed from a group because the group is currently the user's primary group.&lt;br /&gt;1375 The token is already in use as a primary token.&lt;br /&gt;1376 The specified local group does not exist.&lt;br /&gt;1377 The specified account name is not a member of the local group.&lt;br /&gt;1378 The specified account name is already a member of the local group.&lt;br /&gt;1379 The specified local group already exists.&lt;br /&gt;1380 Logon failure: the user has not been granted the requested logon type at this computer.&lt;br /&gt;1381 The maximum number of secrets that may be stored in a single system has been exceeded.&lt;br /&gt;1382 The length of a secret exceeds the maximum length allowed.&lt;br /&gt;1383 The local security authority database contains an internal inconsistency.&lt;br /&gt;1384 During a logon attempt, the user's security context accumulated too many security IDs.&lt;br /&gt;1385 Logon failure: the user has not been granted the requested logon type at this computer.&lt;br /&gt;1386 A cross-encrypted password is necessary to change a user password.&lt;br /&gt;1387 A new member could not be added to or removed from the local group because the member does not exist.&lt;br /&gt;1388 A new member could not be added to a local group because the member has the wrong account type.&lt;br /&gt;1389 Too many security IDs have been specified.&lt;br /&gt;1390 A cross-encrypted password is necessary to change this user password.&lt;br /&gt;1391 Indicates an ACL contains no inheritable components.&lt;br /&gt;1392 The file or directory is corrupted and unreadable.&lt;br /&gt;1393 The disk structure is corrupted and unreadable.&lt;br /&gt;1394 There is no user session key for the specified logon session.&lt;br /&gt;1395 The service being accessed is licensed for a particular  number of connections. No more connections can be made to the service at  this time because there are already as many connections as the service  can accept.&lt;br /&gt;1396 Logon Failure: The target account name is incorrect.&lt;br /&gt;1397 Mutual Authentication failed. The server's password is out of date at the domain controller.&lt;br /&gt;1398 There is a time and/or date difference between the client and server.&lt;br /&gt;1399 This operation cannot be performed on the current domain.&lt;br /&gt;1400 Invalid window handle.&lt;br /&gt;1401 Invalid menu handle.&lt;br /&gt;1402 Invalid cursor handle.&lt;br /&gt;1403 Invalid accelerator table handle.&lt;br /&gt;1404 Invalid hook handle.&lt;br /&gt;1405 Invalid handle to a multiple-window position structure.&lt;br /&gt;1406 Cannot create a top-level child window.&lt;br /&gt;1407 Cannot find window class.&lt;br /&gt;1408 Invalid window; it belongs to other thread.&lt;br /&gt;1409 Hot key is already registered.&lt;br /&gt;1410 Class already exists.&lt;br /&gt;1411 Class does not exist.&lt;br /&gt;1412 Class still has open windows.&lt;br /&gt;1413 Invalid index.&lt;br /&gt;1414 Invalid icon handle.&lt;br /&gt;1415 Using private DIALOG window words.&lt;br /&gt;1416 The list box identifier was not found.&lt;br /&gt;1417 No wildcards were found.&lt;br /&gt;1418 Thread does not have a clipboard open.&lt;br /&gt;1419 Hot key is not registered.&lt;br /&gt;1420 The window is not a valid dialog window.&lt;br /&gt;1421 Control ID not found.&lt;br /&gt;1422 Invalid message for a combo box because it does not have an edit control.&lt;br /&gt;1423 The window is not a combo box.&lt;br /&gt;1424 Height must be less than 256.&lt;br /&gt;1425 Invalid device context (DC) handle.&lt;br /&gt;1426 Invalid hook procedure type.&lt;br /&gt;1427 Invalid hook procedure.&lt;br /&gt;1428 Cannot set nonlocal hook without a module handle.&lt;br /&gt;1429 This hook procedure can only be set globally.&lt;br /&gt;1430 The journal hook procedure is already installed.&lt;br /&gt;1431 The hook procedure is not installed.&lt;br /&gt;1432 Invalid message for single-selection list box.&lt;br /&gt;1433 LB_SETCOUNT sent to non-lazy list box.&lt;br /&gt;1434 This list box does not support tab stops.&lt;br /&gt;1435 Cannot destroy object created by another thread.&lt;br /&gt;1436 Child windows cannot have menus.&lt;br /&gt;1437 The window does not have a system menu.&lt;br /&gt;1438 Invalid message box style.&lt;br /&gt;1439 Invalid system-wide (SPI_*) parameter.&lt;br /&gt;1440 Screen already locked.&lt;br /&gt;1441 All handles to windows in a multiple-window position structure must have the same parent.&lt;br /&gt;1442 The window is not a child window.&lt;br /&gt;1443 Invalid GW_* command.&lt;br /&gt;1444 Invalid thread identifier.&lt;br /&gt;1445 Cannot process a message from a window that is not a multiple document interface (MDI) window.&lt;br /&gt;1446 Popup menu already active.&lt;br /&gt;1447 The window does not have scroll bars.&lt;br /&gt;1448 Scroll bar range cannot be greater than MAXLONG.&lt;br /&gt;1449 Cannot show or remove the window in the way specified.&lt;br /&gt;1450 Insufficient system resources exist to complete the requested service.&lt;br /&gt;1451 Insufficient system resources exist to complete the requested service.&lt;br /&gt;1452 Insufficient system resources exist to complete the requested service.&lt;br /&gt;1453 Insufficient quota to complete the requested service.&lt;br /&gt;1454 Insufficient quota to complete the requested service.&lt;br /&gt;1455 The paging file is too small for this operation to complete.&lt;br /&gt;1456 A menu item was not found.&lt;br /&gt;1457 Invalid keyboard layout handle.&lt;br /&gt;1458 Hook type not allowed.&lt;br /&gt;1459 This operation requires an interactive window station.&lt;br /&gt;1460 This operation returned because the timeout period expired.&lt;br /&gt;1461 Invalid monitor handle.&lt;br /&gt;1500 The event log file is corrupted.&lt;br /&gt;1501 No event log file could be opened, so the event logging service did not start.&lt;br /&gt;1502 The event log file is full.&lt;br /&gt;1503 The event log file has changed between read operations.&lt;br /&gt;1601 The Windows Installer service could not be accessed. This  can occur if you are running Windows in safe mode, or if the Windows  Installer is not correctly installed. Contact your support personnel for  assistance.&lt;br /&gt;1602 User cancelled installation.&lt;br /&gt;1603 Fatal error during installation.&lt;br /&gt;1604 Installation suspended, incomplete.&lt;br /&gt;1605 This action is only valid for products that are currently installed.&lt;br /&gt;1606 Feature ID not registered.&lt;br /&gt;1607 Component ID not registered.&lt;br /&gt;1608 Unknown property.&lt;br /&gt;1609 Handle is in an invalid state.&lt;br /&gt;1610 The configuration data for this product is corrupt. Contact your support personnel.&lt;br /&gt;1611 Component qualifier not present.&lt;br /&gt;1612 The installation source for this product is not available.  Verify that the source exists and that you can access it.&lt;br /&gt;1613 This installation package cannot be installed by the  Windows Installer service. You must install a Windows service pack that  contains a newer version of the Windows Installer service.&lt;br /&gt;1614 Product is uninstalled.&lt;br /&gt;1615 SQL query syntax invalid or unsupported.&lt;br /&gt;1616 Record field does not exist.&lt;br /&gt;1617 The device has been removed.&lt;br /&gt;1618 Another installation is already in progress. Complete that installation before proceeding with this install.&lt;br /&gt;1619 This installation package could not be opened. Verify that  the package exists and that you can access it, or contact the  application vendor to verify that this is a valid Windows Installer  package.&lt;br /&gt;1620 This installation package could not be opened. Contact the  application vendor to verify that this is a valid Windows Installer  package.&lt;br /&gt;1621 There was an error starting the Windows Installer service user interface. Contact your support personnel.&lt;br /&gt;1622 Error opening installation log file. Verify that the  specified log file location exists and that you can write to it.&lt;br /&gt;1623 The language of this installation package is not supported by your system.&lt;br /&gt;1624 Error applying transforms. Verify that the specified transform paths are valid.&lt;br /&gt;1625 This installation is forbidden by system policy. Contact your system administrator.&lt;br /&gt;1626 Function could not be executed.&lt;br /&gt;1627 Function failed during execution.&lt;br /&gt;1628 Invalid or unknown table specified.&lt;br /&gt;1629 Data supplied is of wrong type.&lt;br /&gt;1630 Data of this type is not supported.&lt;br /&gt;1631 The Windows Installer service failed to start. Contact your support personnel.&lt;br /&gt;1632 The Temp folder is on a drive that is full or inaccessible.  Free up space on the drive or verify that you have write permission on  the Temp folder.&lt;br /&gt;1633 This installation package is not supported by this processor type. Contact your product vendor.&lt;br /&gt;1634 Component not used on this computer.&lt;br /&gt;1635 This patch package could not be opened. Verify that the  patch package exists and that you can access it, or contact the  application vendor to verify that this is a valid Windows Installer  patch package.&lt;br /&gt;1636 This patch package could not be opened. Contact the  application vendor to verify that this is a valid Windows Installer  patch package.&lt;br /&gt;1637 This patch package cannot be processed by the Windows  Installer service. You must install a Windows service pack that contains  a newer version of the Windows Installer service.&lt;br /&gt;1638 Another version of this product is already installed.  Installation of this version cannot continue. To configure or remove the  existing version of this product, use Add/Remove Programs on the  Control Panel.&lt;br /&gt;1639 Invalid command line argument. Consult the Windows Installer SDK for detailed command line help.&lt;br /&gt;1640 Only administrators have permission to add, remove, or  configure server software during a Terminal Services remote session. If  you want to install or configure software on the server, contact your  network administrator.&lt;br /&gt;1641 The requested operation completed successfully. The system will be restarted so the changes can take effect.&lt;br /&gt;1642 The upgrade patch cannot be installed by the Windows  Installer service because the program to be upgraded may be missing, or  the upgrade patch may update a different version of the program. Verify  that the program to be upgraded exists on your computer and that you  have the correct upgrade patch.&lt;br /&gt;1643 The patch package is not permitted by software restriction policy.&lt;br /&gt;1644 One or more customizations are not permitted by software restriction policy.&lt;br /&gt;1700 The string binding is invalid.&lt;br /&gt;1701 The binding handle is not the correct type.&lt;br /&gt;1702 The binding handle is invalid.&lt;br /&gt;1703 The RPC protocol sequence is not supported.&lt;br /&gt;1704 The RPC protocol sequence is invalid.&lt;br /&gt;1705 The string universal unique identifier (UUID) is invalid.&lt;br /&gt;1706 The endpoint format is invalid.&lt;br /&gt;1707 The network address is invalid.&lt;br /&gt;1708 No endpoint was found.&lt;br /&gt;1709 The timeout value is invalid.&lt;br /&gt;1710 The object universal unique identifier (UUID) was not found.&lt;br /&gt;1711 The object universal unique identifier (UUID) has already been registered.&lt;br /&gt;1712 The type universal unique identifier (UUID) has already been registered.&lt;br /&gt;1713 The RPC server is already listening.&lt;br /&gt;1714 No protocol sequences have been registered.&lt;br /&gt;1715 The RPC server is not listening.&lt;br /&gt;1716 The manager type is unknown.&lt;br /&gt;1717 The interface is unknown.&lt;br /&gt;1718 There are no bindings.&lt;br /&gt;1719 There are no protocol sequences.&lt;br /&gt;1720 The endpoint cannot be created.&lt;br /&gt;1721 Not enough resources are available to complete this operation.&lt;br /&gt;1722 The RPC server is unavailable.&lt;br /&gt;1723 The RPC server is too busy to complete this operation.&lt;br /&gt;1724 The network options are invalid.&lt;br /&gt;1725 There are no remote procedure calls active on this thread.&lt;br /&gt;1726 The remote procedure call failed.&lt;br /&gt;1727 The remote procedure call failed and did not execute.&lt;br /&gt;1728 A remote procedure call (RPC) protocol error occurred.&lt;br /&gt;1730 The transfer syntax is not supported by the RPC server.&lt;br /&gt;1732 The universal unique identifier (UUID) type is not supported.&lt;br /&gt;1733 The tag is invalid.&lt;br /&gt;1734 The array bounds are invalid.&lt;br /&gt;1735 The binding does not contain an entry name.&lt;br /&gt;1736 The name syntax is invalid.&lt;br /&gt;1737 The name syntax is not supported.&lt;br /&gt;1739 No network address is available to use to construct a universal unique identifier (UUID).&lt;br /&gt;1740 The endpoint is a duplicate.&lt;br /&gt;1741 The authentication type is unknown.&lt;br /&gt;1742 The maximum number of calls is too small.&lt;br /&gt;1743 The string is too long.&lt;br /&gt;1744 The RPC protocol sequence was not found.&lt;br /&gt;1745 The procedure number is out of range.&lt;br /&gt;1746 The binding does not contain any authentication information.&lt;br /&gt;1747 The authentication service is unknown.&lt;br /&gt;1748 The authentication level is unknown.&lt;br /&gt;1749 The security context is invalid.&lt;br /&gt;1750 The authorization service is unknown.&lt;br /&gt;1751 The entry is invalid.&lt;br /&gt;1752 The server endpoint cannot perform the operation.&lt;br /&gt;1753 There are no more endpoints available from the endpoint mapper.&lt;br /&gt;1754 No interfaces have been exported.&lt;br /&gt;1755 The entry name is incomplete.&lt;br /&gt;1756 The version option is invalid.&lt;br /&gt;1757 There are no more members.&lt;br /&gt;1758 There is nothing to unexport.&lt;br /&gt;1759 The interface was not found.&lt;br /&gt;1760 The entry already exists.&lt;br /&gt;1761 The entry is not found.&lt;br /&gt;1762 The name service is unavailable.&lt;br /&gt;1763 The network address family is invalid.&lt;br /&gt;1764 The requested operation is not supported.&lt;br /&gt;1765 No security context is available to allow impersonation.&lt;br /&gt;1766 An internal error occurred in a remote procedure call (RPC).&lt;br /&gt;1767 The RPC server attempted an integer division by zero.&lt;br /&gt;1768 An addressing error occurred in the RPC server.&lt;br /&gt;1769 A floating-point operation at the RPC server caused a division by zero.&lt;br /&gt;1770 A floating-point underflow occurred at the RPC server.&lt;br /&gt;1771 A floating-point overflow occurred at the RPC server.&lt;br /&gt;1772 The list of RPC servers available for the binding of auto handles has been exhausted.&lt;br /&gt;1773 Unable to open the character translation table file.&lt;br /&gt;1774 The file containing the character translation table has fewer than 512 bytes.&lt;br /&gt;1775 A null context handle was passed from the client to the host during a remote procedure call.&lt;br /&gt;1777 The context handle changed during a remote procedure call.&lt;br /&gt;1778 The binding handles passed to a remote procedure call do not match.&lt;br /&gt;1779 The stub is unable to get the remote procedure call handle.&lt;br /&gt;1780 A null reference pointer was passed to the stub.&lt;br /&gt;1781 The enumeration value is out of range.&lt;br /&gt;1782 The byte count is too small.&lt;br /&gt;1783 The stub received bad data.&lt;br /&gt;1784 The supplied user buffer is not valid for the requested operation.&lt;br /&gt;1785 The disk media is not recognized. It may not be formatted.&lt;br /&gt;1786 The workstation does not have a trust secret.&lt;br /&gt;1787 The security database on the server does not have a computer account for this workstation trust relationship.&lt;br /&gt;1788 The trust relationship between the primary domain and the trusted domain failed.&lt;br /&gt;1789 The trust relationship between this workstation and the primary domain failed.&lt;br /&gt;1790 The network logon failed.&lt;br /&gt;1791 A remote procedure call is already in progress for this thread.&lt;br /&gt;1792 An attempt was made to logon, but the network logon service was not started.&lt;br /&gt;1793 The user's account has expired.&lt;br /&gt;1794 The redirector is in use and cannot be unloaded.&lt;br /&gt;1795 The specified printer driver is already installed.&lt;br /&gt;1796 The specified port is unknown.&lt;br /&gt;1797 The printer driver is unknown.&lt;br /&gt;1798 The print processor is unknown.&lt;br /&gt;1799 The specified separator file is invalid.&lt;br /&gt;1800 The specified priority is invalid.&lt;br /&gt;1801 The printer name is invalid.&lt;br /&gt;1802 The printer already exists.&lt;br /&gt;1803 The printer command is invalid.&lt;br /&gt;1804 The specified datatype is invalid.&lt;br /&gt;1805 The environment specified is invalid.&lt;br /&gt;1806 There are no more bindings.&lt;br /&gt;1807 The account used is an interdomain trust account. Use your  global user account or local user account to access this server.&lt;br /&gt;1808 The account used is a computer account. Use your global user account or local user account to access this server.&lt;br /&gt;1809 The account used is a server trust account. Use your global  user account or local user account to access this server.&lt;br /&gt;1810 The name or security ID (SID) of the domain specified is inconsistent with the trust information for that domain.&lt;br /&gt;1811 The server is in use and cannot be unloaded.&lt;br /&gt;1812 The specified image file did not contain a resource section.&lt;br /&gt;1813 The specified resource type cannot be found in the image file.&lt;br /&gt;1814 The specified resource name cannot be found in the image file.&lt;br /&gt;1815 The specified resource language ID cannot be found in the image file.&lt;br /&gt;1816 Not enough quota is available to process this command.&lt;br /&gt;1817 No interfaces have been registered.&lt;br /&gt;1818 The remote procedure call was cancelled.&lt;br /&gt;1819 The binding handle does not contain all required information.&lt;br /&gt;1820 A communications failure occurred during a remote procedure call.&lt;br /&gt;1821 The requested authentication level is not supported.&lt;br /&gt;1822 No principal name registered.&lt;br /&gt;1823 The error specified is not a valid Windows RPC error code.&lt;br /&gt;1824 A UUID that is valid only on this computer has been allocated.&lt;br /&gt;1825 A security package specific error occurred.&lt;br /&gt;1826 Thread is not canceled.&lt;br /&gt;1827 Invalid operation on the encoding/decoding handle.&lt;br /&gt;1828 Incompatible version of the serializing package.&lt;br /&gt;1829 Incompatible version of the RPC stub.&lt;br /&gt;1830 The RPC pipe object is invalid or corrupted.&lt;br /&gt;1831 An invalid operation was attempted on an RPC pipe object.&lt;br /&gt;1832 Unsupported RPC pipe version.&lt;br /&gt;1898 The group member was not found.&lt;br /&gt;1899 The endpoint mapper database entry could not be created.&lt;br /&gt;1900 The object universal unique identifier (UUID) is the nil UUID.&lt;br /&gt;1901 The specified time is invalid.&lt;br /&gt;1902 The specified form name is invalid.&lt;br /&gt;1903 The specified form size is invalid.&lt;br /&gt;1904 The specified printer handle is already being waited on&lt;br /&gt;1905 The specified printer has been deleted.&lt;br /&gt;1906 The state of the printer is invalid.&lt;br /&gt;1907 The user's password must be changed before logging on the first time.&lt;br /&gt;1908 Could not find the domain controller for this domain.&lt;br /&gt;1909 The referenced account is currently locked out and may not be logged on to.&lt;br /&gt;1910 The object exporter specified was not found.&lt;br /&gt;1911 The object specified was not found.&lt;br /&gt;1912 The object resolver set specified was not found.&lt;br /&gt;1913 Some data remains to be sent in the request buffer.&lt;br /&gt;1914 Invalid asynchronous remote procedure call handle.&lt;br /&gt;1915 Invalid asynchronous RPC call handle for this operation.&lt;br /&gt;1916 The RPC pipe object has already been closed.&lt;br /&gt;1917 The RPC call completed before all pipes were processed.&lt;br /&gt;1918 No more data is available from the RPC pipe.&lt;br /&gt;1919 No site name is available for this machine.&lt;br /&gt;1920 The file cannot be accessed by the system.&lt;br /&gt;1921 The name of the file cannot be resolved by the system.&lt;br /&gt;1922 The entry is not of the expected type.&lt;br /&gt;1923 Not all object UUIDs could be exported to the specified entry.&lt;br /&gt;1924 Interface could not be exported to the specified entry.&lt;br /&gt;1925 The specified profile entry could not be added.&lt;br /&gt;1926 The specified profile element could not be added.&lt;br /&gt;1927 The specified profile element could not be removed.&lt;br /&gt;1928 The group element could not be added.&lt;br /&gt;1929 The group element could not be removed.&lt;br /&gt;1930 The printer driver is not compatible with a policy enabled on your computer that blocks NT 4.0 drivers.&lt;br /&gt;1931 The context has expired and can no longer be used.&lt;br /&gt;2000 The pixel format is invalid.&lt;br /&gt;2001 The specified driver is invalid.&lt;br /&gt;2002 The window style or class attribute is invalid for this operation.&lt;br /&gt;2003 The requested metafile operation is not supported.&lt;br /&gt;2004 The requested transformation operation is not supported.&lt;br /&gt;2005 The requested clipping operation is not supported.&lt;br /&gt;2010 The specified color management module is invalid.&lt;br /&gt;2011 The specified color profile is invalid.&lt;br /&gt;2012 The specified tag was not found.&lt;br /&gt;2013 A required tag is not present.&lt;br /&gt;2014 The specified tag is already present.&lt;br /&gt;2015 The specified color profile is not associated with any device.&lt;br /&gt;2016 The specified color profile was not found.&lt;br /&gt;2017 The specified color space is invalid.&lt;br /&gt;2018 Image Color Management is not enabled.&lt;br /&gt;2019 There was an error while deleting the color transform.&lt;br /&gt;2020 The specified color transform is invalid.&lt;br /&gt;2021 The specified transform does not match the bitmap's color space.&lt;br /&gt;2022 The specified named color index is not present in the profile.&lt;br /&gt;2108 The network connection was made successfully, but the user  had to be prompted for a password other than the one originally  specified.&lt;br /&gt;2109 The network connection was made successfully using default credentials.&lt;br /&gt;2202 The specified username is invalid.&lt;br /&gt;2250 This network connection does not exist.&lt;br /&gt;2401 This network connection has files open or requests pending.&lt;br /&gt;2402 Active connections still exist.&lt;br /&gt;2404 The device is in use by an active process and cannot be disconnected.&lt;br /&gt;3000 The specified print monitor is unknown.&lt;br /&gt;3001 The specified printer driver is currently in use.&lt;br /&gt;3002 The spool file was not found.&lt;br /&gt;3003 A StartDocPrinter call was not issued.&lt;br /&gt;3004 An AddJob call was not issued.&lt;br /&gt;3005 The specified print processor has already been installed.&lt;br /&gt;3006 The specified print monitor has already been installed.&lt;br /&gt;3007 The specified print monitor does not have the required functions.&lt;br /&gt;3008 The specified print monitor is currently in use.&lt;br /&gt;3009 The requested operation is not allowed when there are jobs queued to the printer.&lt;br /&gt;3010 The requested operation is successful. Changes will not be effective until the system is rebooted.&lt;br /&gt;3011 The requested operation is successful. Changes will not be effective until the service is restarted.&lt;br /&gt;3012 No printers were found.&lt;br /&gt;3013 The printer driver is known to be unreliable.&lt;br /&gt;3014 The printer driver is known to harm the system.&lt;br /&gt;4000 WINS encountered an error while processing the command.&lt;br /&gt;4001 The local WINS cannot be deleted.&lt;br /&gt;4002 The importation from the file failed.&lt;br /&gt;4003 The backup failed. Was a full backup done before?&lt;br /&gt;4004 The backup failed. Check the directory to which you are backing the database.&lt;br /&gt;4005 The name does not exist in the WINS database.&lt;br /&gt;4006 Replication with a nonconfigured partner is not allowed.&lt;br /&gt;4100 The DHCP client has obtained an IP address that is already  in use on the network. The local interface will be disabled until the  DHCP client can obtain a new address.&lt;br /&gt;4200 The GUID passed was not recognized as valid by a WMI data provider.&lt;br /&gt;4201 The instance name passed was not recognized as valid by a WMI data provider.&lt;br /&gt;4202 The data item ID passed was not recognized as valid by a WMI data provider.&lt;br /&gt;4203 The WMI request could not be completed and should be retried.&lt;br /&gt;4204 The WMI data provider could not be located.&lt;br /&gt;4205 The WMI data provider references an instance set that has not been registered.&lt;br /&gt;4206 The WMI data block or event notification has already been enabled.&lt;br /&gt;4207 The WMI data block is no longer available.&lt;br /&gt;4208 The WMI data service is not available.&lt;br /&gt;4209 The WMI data provider failed to carry out the request.&lt;br /&gt;4210 The WMI MOF information is not valid.&lt;br /&gt;4211 The WMI registration information is not valid.&lt;br /&gt;4212 The WMI data block or event notification has already been disabled.&lt;br /&gt;4213 The WMI data item or data block is read only.&lt;br /&gt;4214 The WMI data item or data block could not be changed.&lt;br /&gt;4300 The media identifier does not represent a valid medium.&lt;br /&gt;4301 The library identifier does not represent a valid library.&lt;br /&gt;4302 The media pool identifier does not represent a valid media pool.&lt;br /&gt;4303 The drive and medium are not compatible or exist in different libraries.&lt;br /&gt;4304 The medium currently exists in an offline library and must be online to perform this operation.&lt;br /&gt;4305 The operation cannot be performed on an offline library.&lt;br /&gt;4306 The library, drive, or media pool is empty.&lt;br /&gt;4307 The library, drive, or media pool must be empty to perform this operation.&lt;br /&gt;4308 No media is currently available in this media pool or library.&lt;br /&gt;4309 A resource required for this operation is disabled.&lt;br /&gt;4310 The media identifier does not represent a valid cleaner.&lt;br /&gt;4311 The drive cannot be cleaned or does not support cleaning.&lt;br /&gt;4312 The object identifier does not represent a valid object.&lt;br /&gt;4313 Unable to read from or write to the database.&lt;br /&gt;4314 The database is full.&lt;br /&gt;4315 The medium is not compatible with the device or media pool.&lt;br /&gt;4316 The resource required for this operation does not exist.&lt;br /&gt;4317 The operation identifier is not valid.&lt;br /&gt;4318 The media is not mounted or ready for use.&lt;br /&gt;4319 The device is not ready for use.&lt;br /&gt;4320 The operator or administrator has refused the request.&lt;br /&gt;4321 The drive identifier does not represent a valid drive.&lt;br /&gt;4322 Library is full. No slot is available for use.&lt;br /&gt;4323 The transport cannot access the medium.&lt;br /&gt;4324 Unable to load the medium into the drive.&lt;br /&gt;4325 Unable to retrieve status about the drive.&lt;br /&gt;4326 Unable to retrieve status about the slot.&lt;br /&gt;4327 Unable to retrieve status about the transport.&lt;br /&gt;4328 Cannot use the transport because it is already in use.&lt;br /&gt;4329 Unable to open or close the inject/eject port.&lt;br /&gt;4330 Unable to eject the media because it is in a drive.&lt;br /&gt;4331 A cleaner slot is already reserved.&lt;br /&gt;4332 A cleaner slot is not reserved.&lt;br /&gt;4333 The cleaner cartridge has performed the maximum number of drive cleanings.&lt;br /&gt;4334 Unexpected on-medium identifier.&lt;br /&gt;4335 The last remaining item in this group or resource cannot be deleted.&lt;br /&gt;4336 The message provided exceeds the maximum size allowed for this parameter.&lt;br /&gt;4337 The volume contains system or paging files.&lt;br /&gt;4338 The media type cannot be removed from this library since at  least one drive in the library reports it can support this media type.&lt;br /&gt;4339 This offline media cannot be mounted on this system since no enabled drives are present which can be used.&lt;br /&gt;4340 A cleaner cartridge is present in the tape library.&lt;br /&gt;4350 The remote storage service was not able to recall the file.&lt;br /&gt;4351 The remote storage service is not operational at this time.&lt;br /&gt;4352 The remote storage service encountered a media error.&lt;br /&gt;4390 The file or directory is not a reparse point.&lt;br /&gt;4391 The reparse point attribute cannot be set because it conflicts with an existing attribute.&lt;br /&gt;4392 The data present in the reparse point buffer is invalid.&lt;br /&gt;4393 The tag present in the reparse point buffer is invalid.&lt;br /&gt;4394 There is a mismatch between the tag specified in the request and the tag present in the reparse point.&lt;br /&gt;4500 Single Instance Storage is not available on this volume.&lt;br /&gt;5001 The cluster resource cannot be moved to another group because other resources are dependent on it.&lt;br /&gt;5002 The cluster resource dependency cannot be found.&lt;br /&gt;5003 The cluster resource cannot be made dependent on the specified resource because it is already dependent.&lt;br /&gt;5004 The cluster resource is not online.&lt;br /&gt;5005 A cluster node is not available for this operation.&lt;br /&gt;5006 The cluster resource is not available.&lt;br /&gt;5007 The cluster resource could not be found.&lt;br /&gt;5008 The cluster is being shut down.&lt;br /&gt;5009 A cluster node cannot be evicted from the cluster unless the node is down.&lt;br /&gt;5010 The object already exists.&lt;br /&gt;5011 The object is already in the list.&lt;br /&gt;5012 The cluster group is not available for any new requests.&lt;br /&gt;5013 The cluster group could not be found.&lt;br /&gt;5014 The operation could not be completed because the cluster group is not online.&lt;br /&gt;5015 The cluster node is not the owner of the resource.&lt;br /&gt;5016 The cluster node is not the owner of the group.&lt;br /&gt;5017 The cluster resource could not be created in the specified resource monitor.&lt;br /&gt;5018 The cluster resource could not be brought online by the resource monitor.&lt;br /&gt;5019 The operation could not be completed because the cluster resource is online.&lt;br /&gt;5020 The cluster resource could not be deleted or brought offline because it is the quorum resource.&lt;br /&gt;5021 The cluster could not make the specified resource a quorum  resource because it is not capable of being a quorum resource.&lt;br /&gt;5022 The cluster software is shutting down.&lt;br /&gt;5023 The group or resource is not in the correct state to perform the requested operation.&lt;br /&gt;5024 The properties were stored but not all changes will take  effect until the next time the resource is brought online.&lt;br /&gt;5025 The cluster could not make the specified resource a quorum  resource because it does not belong to a shared storage class.&lt;br /&gt;5026 The cluster resource could not be deleted since it is a core resource.&lt;br /&gt;5027 The quorum resource failed to come online.&lt;br /&gt;5028 The quorum log could not be created or mounted successfully.&lt;br /&gt;5029 The cluster log is corrupt.&lt;br /&gt;5030 The record could not be written to the cluster log since it exceeds the maximum size.&lt;br /&gt;5031 The cluster log exceeds its maximum size.&lt;br /&gt;5032 No checkpoint record was found in the cluster log.&lt;br /&gt;5033 The minimum required disk space needed for logging is not available.&lt;br /&gt;5034 The cluster node failed to take control of the quorum  resource because the resource is owned by another active node.&lt;br /&gt;5035 A cluster network is not available for this operation.&lt;br /&gt;5036 A cluster node is not available for this operation.&lt;br /&gt;5037 All cluster nodes must be running to perform this operation.&lt;br /&gt;5038 A cluster resource failed.&lt;br /&gt;5039 The cluster node is not valid.&lt;br /&gt;5040 The cluster node already exists.&lt;br /&gt;5041 A node is in the process of joining the cluster.&lt;br /&gt;5042 The cluster node was not found.&lt;br /&gt;5043 The cluster local node information was not found.&lt;br /&gt;5044 The cluster network already exists.&lt;br /&gt;5045 The cluster network was not found.&lt;br /&gt;5046 The cluster network interface already exists.&lt;br /&gt;5047 The cluster network interface was not found.&lt;br /&gt;5048 The cluster request is not valid for this object.&lt;br /&gt;5049 The cluster network provider is not valid.&lt;br /&gt;5050 The cluster node is down.&lt;br /&gt;5051 The cluster node is not reachable.&lt;br /&gt;5052 The cluster node is not a member of the cluster.&lt;br /&gt;5053 A cluster join operation is not in progress.&lt;br /&gt;5054 The cluster network is not valid.&lt;br /&gt;5056 The cluster node is up.&lt;br /&gt;5057 The cluster IP address is already in use.&lt;br /&gt;5058 The cluster node is not paused.&lt;br /&gt;5059 No cluster security context is available.&lt;br /&gt;5060 The cluster network is not configured for internal cluster communication.&lt;br /&gt;5061 The cluster node is already up.&lt;br /&gt;5062 The cluster node is already down.&lt;br /&gt;5063 The cluster network is already online.&lt;br /&gt;5064 The cluster network is already offline.&lt;br /&gt;5065 The cluster node is already a member of the cluster.&lt;br /&gt;5066 The cluster network is the only one configured for internal  cluster communication between two or more active cluster nodes. The  internal communication capability cannot be removed from the network.&lt;br /&gt;5067 One or more cluster resources depend on the network to  provide service to clients. The client access capability cannot be  removed from the network.&lt;br /&gt;5068 This operation cannot be performed on the cluster resource  as it the quorum resource. You may not bring the quorum resource offline  or modify its possible owners list.&lt;br /&gt;5069 The cluster quorum resource is not allowed to have any dependencies.&lt;br /&gt;5070 The cluster node is paused.&lt;br /&gt;5071 The cluster resource cannot be brought online. The owner node cannot run this resource.&lt;br /&gt;5072 The cluster node is not ready to perform the requested operation.&lt;br /&gt;5073 The cluster node is shutting down.&lt;br /&gt;5074 The cluster join operation was aborted.&lt;br /&gt;5075 The cluster join operation failed due to incompatible software versions between the joining node and its sponsor.&lt;br /&gt;5076 This resource cannot be created because the cluster has  reached the limit on the number of resources it can monitor.&lt;br /&gt;5077 The system configuration changed during the cluster join or  form operation. The join or form operation was aborted.&lt;br /&gt;5078 The specified resource type was not found.&lt;br /&gt;5079 The specified node does not support a resource of this  type. This may be due to version inconsistencies or due to the absence  of the resource DLL on this node.&lt;br /&gt;5080 The specified resource name is supported by this resource  DLL. This may be due to a bad (or changed) name supplied to the resource  DLL.&lt;br /&gt;5081 No authentication package could be registered with the RPC server.&lt;br /&gt;5082 You cannot bring the group online because the owner of the  group is not in the preferred list for the group. To change the owner  node for the group, move the group.&lt;br /&gt;5083 The join operation failed because the cluster database  sequence number has changed or is incompatible with the locker node.  This may happen during a join operation if the cluster database was  changing during the join.&lt;br /&gt;5084 The resource monitor will not allow the fail operation to  be performed while the resource is in its current state. This may happen  if the resource is in a pending state.&lt;br /&gt;5085 A non locker code got a request to reserve the lock for making global updates.&lt;br /&gt;5086 The quorum disk could not be located by the cluster service.&lt;br /&gt;5087 The backup up cluster database is possibly corrupt.&lt;br /&gt;5088 A DFS root already exists in this cluster node.&lt;br /&gt;5089 An attempt to modify a resource property failed because it conflicts with another existing property.&lt;br /&gt;5890 An operation was attempted that is incompatible with the current membership state of the node.&lt;br /&gt;5891 The quorum resource does not contain the quorum log.&lt;br /&gt;5892 The membership engine requested shutdown of the cluster service on this node.&lt;br /&gt;5893 The join operation failed because the cluster instance ID  of the joining node does not match the cluster instance ID of the  sponsor node.&lt;br /&gt;5894 A matching network for the specified IP address could not  be found. Please also specify a subnet mask and a cluster network.&lt;br /&gt;5895 The actual data type of the property did not match the expected data type of the property.&lt;br /&gt;5896 The cluster node was evicted from the cluster successfully,  but the node was not cleaned up. Extended status information explaining  why the node was not cleaned up is available.&lt;br /&gt;5897 Two or more parameter values specified for a resource's properties are in conflict.&lt;br /&gt;5898 This computer cannot be made a member of a cluster.&lt;br /&gt;5899 This computer cannot be made a member of a cluster because  it does not have the correct version of Windows installed.&lt;br /&gt;5900 A cluster cannot be created with the specified cluster name  because that cluster name is already in use. Specify a different name  for the cluster.&lt;br /&gt;6000 The specified file could not be encrypted.&lt;br /&gt;6001 The specified file could not be decrypted.&lt;br /&gt;6002 The specified file is encrypted and the user does not have the ability to decrypt it.&lt;br /&gt;6003 There is no valid encryption recovery policy configured for this system.&lt;br /&gt;6004 The required encryption driver is not loaded for this system.&lt;br /&gt;6005 The file was encrypted with a different encryption driver than is currently loaded.&lt;br /&gt;6006 There are no EFS keys defined for the user.&lt;br /&gt;6007 The specified file is not encrypted.&lt;br /&gt;6008 The specified file is not in the defined EFS export format.&lt;br /&gt;6009 The specified file is read only.&lt;br /&gt;6010 The directory has been disabled for encryption.&lt;br /&gt;6011 The server is not trusted for remote encryption operation.&lt;br /&gt;6012 Recovery policy configured for this system contains invalid recovery certificate.&lt;br /&gt;6013 The encryption algorithm used on the source file needs a bigger key buffer than the one on the destination file.&lt;br /&gt;6014 The disk partition does not support file encryption.&lt;br /&gt;6015 This machine is disabled for file encryption.&lt;br /&gt;6016 A newer system is required to decrypt this encrypted file.&lt;br /&gt;6118 The list of servers for this workgroup is not currently available.&lt;br /&gt;6200 The Task Scheduler service must be configured to run in the  System account to function properly. Individual tasks may be configured  to run in other accounts.&lt;br /&gt;7001 The specified session name is invalid.&lt;br /&gt;7002 The specified protocol driver is invalid.&lt;br /&gt;7003 The specified protocol driver was not found in the system path.&lt;br /&gt;7004 The specified terminal connection driver was not found in the system path.&lt;br /&gt;7005 A registry key for event logging could not be created for this session.&lt;br /&gt;7006 A service with the same name already exists on the system.&lt;br /&gt;7007 A close operation is pending on the session.&lt;br /&gt;7008 There are no free output buffers available.&lt;br /&gt;7009 The MODEM.INF file was not found.&lt;br /&gt;7010 The modem name was not found in MODEM.INF.&lt;br /&gt;7011 The modem did not accept the command sent to it. Verify that the configured modem name matches the attached modem.&lt;br /&gt;7012 The modem did not respond to the command sent to it. Verify that the modem is properly cabled and powered on.&lt;br /&gt;7013 Carrier detect has failed or carrier has been dropped due to disconnect.&lt;br /&gt;7014 Dial tone not detected within the required time. Verify that the phone cable is properly attached and functional.&lt;br /&gt;7015 Busy signal detected at remote site on callback.&lt;br /&gt;7016 Voice detected at remote site on callback.&lt;br /&gt;7017 Transport driver error&lt;br /&gt;7022 The specified session cannot be found.&lt;br /&gt;7023 The specified session name is already in use.&lt;br /&gt;7024 The requested operation cannot be completed because the  terminal connection is currently busy processing a connect, disconnect,  reset, or delete operation.&lt;br /&gt;7025 An attempt has been made to connect to a session whose video mode is not supported by the current client.&lt;br /&gt;7035 The application attempted to enable DOS graphics mode. DOS graphics mode is not supported.&lt;br /&gt;7037 Your interactive logon privilege has been disabled. Please contact your administrator.&lt;br /&gt;7038 The requested operation can be performed only on the system  console. This is most often the result of a driver or system DLL  requiring direct console access.&lt;br /&gt;7040 The client failed to respond to the server connect message.&lt;br /&gt;7041 Disconnecting the console session is not supported.&lt;br /&gt;7042 Reconnecting a disconnected session to the console is not supported.&lt;br /&gt;7044 The request to control another session remotely was denied.&lt;br /&gt;7045 The requested session access is denied.&lt;br /&gt;7049 The specified terminal connection driver is invalid.&lt;br /&gt;7050 The requested session cannot be controlled remotely. This  may be because the session is disconnected or does not currently have a  user logged on.&lt;br /&gt;7051 The requested session is not configured to allow remote control.&lt;br /&gt;7052 Your request to connect to this Terminal Server has been  rejected. Your Terminal Server client license number is currently being  used by another user. Please call your system administrator to obtain a  unique license number.&lt;br /&gt;7053 Your request to connect to this Terminal Server has been  rejected. Your Terminal Server client license number has not been  entered for this copy of the Terminal Server client. Please contact your  system administrator.&lt;br /&gt;7054 The system has reached its licensed logon limit. Please try again later.&lt;br /&gt;7055 The client you are using is not licensed to use this system. Your logon request is denied.&lt;br /&gt;7056 The system license has expired. Your logon request is denied.&lt;br /&gt;7057 Remote control could not be terminated because the specified session is not currently being remotely controlled.&lt;br /&gt;7058 The remote control of the console was terminated because  the display mode was changed. Changing the display mode in a remote  control session is not supported.&lt;br /&gt;8001 The file replication service API was called incorrectly.&lt;br /&gt;8002 The file replication service cannot be started.&lt;br /&gt;8003 The file replication service cannot be stopped.&lt;br /&gt;8004 The file replication service API terminated the request. The event log may have more information.&lt;br /&gt;8005 The file replication service terminated the request. The event log may have more information.&lt;br /&gt;8006 The file replication service cannot be contacted. The event log may have more information.&lt;br /&gt;8007 The file replication service cannot satisfy the request  because the user has insufficient privileges. The event log may have  more information.&lt;br /&gt;8008 The file replication service cannot satisfy the request  because authenticated RPC is not available. The event log may have more  information.&lt;br /&gt;8009 The file replication service cannot satisfy the request  because the user has insufficient privileges on the domain controller.  The event log may have more information.&lt;br /&gt;8010 The file replication service cannot satisfy the request  because authenticated RPC is not available on the domain controller. The  event log may have more information.&lt;br /&gt;8011 The file replication service cannot communicate with the  file replication service on the domain controller. The event log may  have more information.&lt;br /&gt;8012 The file replication service on the domain controller  cannot communicate with the file replication service on this computer.  The event log may have more information.&lt;br /&gt;8013 The file replication service cannot populate the system  volume because of an internal error. The event log may have more  information.&lt;br /&gt;8014 The file replication service cannot populate the system  volume because of an internal timeout. The event log may have more  information.&lt;br /&gt;8015 The file replication service cannot process the request. The system volume is busy with a previous request.&lt;br /&gt;8016 The file replication service cannot stop replicating the  system volume because of an internal error. The event log may have more  information.&lt;br /&gt;8017 The file replication service detected an invalid parameter.&lt;br /&gt;8200 An error occurred while installing the directory service. For more information, see the event log.&lt;br /&gt;8201 The directory service evaluated group memberships locally.&lt;br /&gt;8202 The specified directory service attribute or value does not exist.&lt;br /&gt;8203 The attribute syntax specified to the directory service is invalid.&lt;br /&gt;8204 The attribute type specified to the directory service is not defined.&lt;br /&gt;8205 The specified directory service attribute or value already exists.&lt;br /&gt;8206 The directory service is busy.&lt;br /&gt;8207 The directory service is unavailable.&lt;br /&gt;8208 The directory service was unable to allocate a relative identifier.&lt;br /&gt;8209 The directory service has exhausted the pool of relative identifiers.&lt;br /&gt;8210 The requested operation could not be performed because the  directory service is not the master for that type of operation.&lt;br /&gt;8211 The directory service was unable to initialize the subsystem that allocates relative identifiers.&lt;br /&gt;8212 The requested operation did not satisfy one or more constraints associated with the class of the object.&lt;br /&gt;8213 The directory service can perform the requested operation only on a leaf object.&lt;br /&gt;8214 The directory service cannot perform the requested operation on the RDN attribute of an object.&lt;br /&gt;8215 The directory service detected an attempt to modify the object class of an object.&lt;br /&gt;8216 The requested cross-domain move operation could not be performed.&lt;br /&gt;8217 Unable to contact the global catalog server.&lt;br /&gt;8218 The policy object is shared and can only be modified at the root.&lt;br /&gt;8219 The policy object does not exist.&lt;br /&gt;8220 The requested policy information is only in the directory service.&lt;br /&gt;8221 A domain controller promotion is currently active.&lt;br /&gt;8222 A domain controller promotion is not currently active&lt;br /&gt;8224 An operations error occurred.&lt;br /&gt;8225 A protocol error occurred.&lt;br /&gt;8226 The time limit for this request was exceeded.&lt;br /&gt;8227 The size limit for this request was exceeded.&lt;br /&gt;8228 The administrative limit for this request was exceeded.&lt;br /&gt;8229 The compare response was false.&lt;br /&gt;8230 The compare response was true.&lt;br /&gt;8231 The requested authentication method is not supported by the server.&lt;br /&gt;8232 A more secure authentication method is required for this server.&lt;br /&gt;8233 Inappropriate authentication.&lt;br /&gt;8234 The authentication mechanism is unknown.&lt;br /&gt;8235 A referral was returned from the server.&lt;br /&gt;8236 The server does not support the requested critical extension.&lt;br /&gt;8237 This request requires a secure connection.&lt;br /&gt;8238 Inappropriate matching.&lt;br /&gt;8239 A constraint violation occurred.&lt;br /&gt;8240 There is no such object on the server.&lt;br /&gt;8241 There is an alias problem.&lt;br /&gt;8242 An invalid dn syntax has been specified.&lt;br /&gt;8243 The object is a leaf object.&lt;br /&gt;8244 There is an alias dereferencing problem.&lt;br /&gt;8245 The server is unwilling to process the request.&lt;br /&gt;8246 A loop has been detected.&lt;br /&gt;8247 There is a naming violation.&lt;br /&gt;8248 The result set is too large.&lt;br /&gt;8249 The operation affects multiple DSAs&lt;br /&gt;8250 The server is not operational.&lt;br /&gt;8251 A local error has occurred.&lt;br /&gt;8252 An encoding error has occurred.&lt;br /&gt;8253 A decoding error has occurred.&lt;br /&gt;8254 The search filter cannot be recognized.&lt;br /&gt;8255 One or more parameters are illegal.&lt;br /&gt;8256 The specified method is not supported.&lt;br /&gt;8257 No results were returned.&lt;br /&gt;8258 The specified control is not supported by the server.&lt;br /&gt;8259 A referral loop was detected by the client.&lt;br /&gt;8260 The preset referral limit was exceeded.&lt;br /&gt;8261 The search requires a SORT control.&lt;br /&gt;8262 The search results exceed the offset range specified.&lt;br /&gt;8301 The root object must be the head of a naming context. The root object cannot have an instantiated parent.&lt;br /&gt;8302 The add replica operation cannot be performed. The naming context must be writable in order to create the replica.&lt;br /&gt;8303 A reference to an attribute that is not defined in the schema occurred.&lt;br /&gt;8304 The maximum size of an object has been exceeded.&lt;br /&gt;8305 An attempt was made to add an object to the directory with a name that is already in use.&lt;br /&gt;8306 An attempt was made to add an object of a class that does not have an RDN defined in the schema.&lt;br /&gt;8307 An attempt was made to add an object using an RDN that is not the RDN defined in the schema.&lt;br /&gt;8308 None of the requested attributes were found on the objects.&lt;br /&gt;8309 The user buffer is too small.&lt;br /&gt;8310 The attribute specified in the operation is not present on the object.&lt;br /&gt;8311 Illegal modify operation. Some aspect of the modification is not permitted.&lt;br /&gt;8312 The specified object is too large.&lt;br /&gt;8313 The specified instance type is not valid.&lt;br /&gt;8314 The operation must be performed at a master DSA.&lt;br /&gt;8315 The object class attribute must be specified.&lt;br /&gt;8316 A required attribute is missing.&lt;br /&gt;8317 An attempt was made to modify an object to include an attribute that is not legal for its class&lt;br /&gt;8318 The specified attribute is already present on the object.&lt;br /&gt;8320 The specified attribute is not present, or has no values.&lt;br /&gt;8321 Multiple values were specified for an attribute that can have only one value.&lt;br /&gt;8322 A value for the attribute was not in the acceptable range of values.&lt;br /&gt;8323 The specified value already exists.&lt;br /&gt;8324 The attribute cannot be removed because it is not present on the object.&lt;br /&gt;8325 The attribute value cannot be removed because it is not present on the object.&lt;br /&gt;8326 The specified root object cannot be a subref.&lt;br /&gt;8327 Chaining is not permitted.&lt;br /&gt;8328 Chained evaluation is not permitted.&lt;br /&gt;8329 The operation could not be performed because the object's parent is either uninstantiated or deleted.&lt;br /&gt;8330 Having a parent that is an alias is not permitted. Aliases are leaf objects.&lt;br /&gt;8331 The object and parent must be of the same type, either both masters or both replicas.&lt;br /&gt;8332 The operation cannot be performed because child objects  exist. This operation can only be performed on a leaf object.&lt;br /&gt;8333 Directory object not found.&lt;br /&gt;8334 The aliased object is missing.&lt;br /&gt;8335 The object name has bad syntax.&lt;br /&gt;8336 It is not permitted for an alias to refer to another alias.&lt;br /&gt;8337 The alias cannot be dereferenced.&lt;br /&gt;8338 The operation is out of scope.&lt;br /&gt;8339 The operation cannot continue because the object is in the process of being removed.&lt;br /&gt;8340 The DSA object cannot be deleted.&lt;br /&gt;8341 A directory service error has occurred.&lt;br /&gt;8342 The operation can only be performed on an internal master DSA object.&lt;br /&gt;8343 The object must be of class DSA.&lt;br /&gt;8344 Insufficient access rights to perform the operation.&lt;br /&gt;8345 The object cannot be added because the parent is not on the list of possible superiors.&lt;br /&gt;8346 Access to the attribute is not permitted because the attribute is owned by the Security Accounts Manager (SAM).&lt;br /&gt;8347 The name has too many parts.&lt;br /&gt;8348 The name is too long.&lt;br /&gt;8349 The name value is too long.&lt;br /&gt;8350 The directory service encountered an error parsing a name.&lt;br /&gt;8351 The directory service cannot get the attribute type for a name.&lt;br /&gt;8352 The name does not identify an object; the name identifies a phantom.&lt;br /&gt;8353 The security descriptor is too short.&lt;br /&gt;8354 The security descriptor is invalid.&lt;br /&gt;8355 Failed to create name for deleted object.&lt;br /&gt;8356 The parent of a new subref must exist.&lt;br /&gt;8357 The object must be a naming context.&lt;br /&gt;8358 It is not permitted to add an attribute which is owned by the system.&lt;br /&gt;8359 The class of the object must be structural; you cannot instantiate an abstract class.&lt;br /&gt;8360 The schema object could not be found.&lt;br /&gt;8361 A local object with this GUID (dead or alive) already exists.&lt;br /&gt;8362 The operation cannot be performed on a back link.&lt;br /&gt;8363 The cross reference for the specified naming context could not be found.&lt;br /&gt;8364 The operation could not be performed because the directory service is shutting down.&lt;br /&gt;8365 The directory service request is invalid.&lt;br /&gt;8366 The role owner attribute could not be read.&lt;br /&gt;8367 The requested FSMO operation failed. The current FSMO holder could not be reached.&lt;br /&gt;8368 Modification of a DN across a naming context is not permitted.&lt;br /&gt;8369 The attribute cannot be modified because it is owned by the system.&lt;br /&gt;8370 Only the replicator can perform this function.&lt;br /&gt;8371 The specified class is not defined.&lt;br /&gt;8372 The specified class is not a subclass.&lt;br /&gt;8373 The name reference is invalid.&lt;br /&gt;8374 A cross reference already exists.&lt;br /&gt;8375 It is not permitted to delete a master cross reference.&lt;br /&gt;8376 Subtree notifications are only supported on NC heads.&lt;br /&gt;8377 Notification filter is too complex.&lt;br /&gt;8378 Schema update failed: duplicate RDN.&lt;br /&gt;8379 Schema update failed: duplicate OID&lt;br /&gt;8380 Schema update failed: duplicate MAPI identifier.&lt;br /&gt;8381 Schema update failed: duplicate schema-id GUID.&lt;br /&gt;8382 Schema update failed: duplicate LDAP display name.&lt;br /&gt;8383 Schema update failed: range-lower less than range upper&lt;br /&gt;8384 Schema update failed: syntax mismatch&lt;br /&gt;8385 Schema deletion failed: attribute is used in must-contain&lt;br /&gt;8386 Schema deletion failed: attribute is used in may-contain&lt;br /&gt;8387 Schema update failed: attribute in may-contain does not exist&lt;br /&gt;8388 Schema update failed: attribute in must-contain does not exist&lt;br /&gt;8389 Schema update failed: class in aux-class list does not exist or is not an auxiliary class&lt;br /&gt;8390 Schema update failed: class in poss-superiors does not exist&lt;br /&gt;8391 Schema update failed: class in subclassof list does not exist or does not satisfy hierarchy rules&lt;br /&gt;8392 Schema update failed: Rdn-Att-Id has wrong syntax&lt;br /&gt;8393 Schema deletion failed: class is used as auxiliary class&lt;br /&gt;8394 Schema deletion failed: class is used as sub class&lt;br /&gt;8395 Schema deletion failed: class is used as poss superior&lt;br /&gt;8396 Schema update failed in recalculating validation cache.&lt;br /&gt;8397 The tree deletion is not finished.&lt;br /&gt;8398 The requested delete operation could not be performed.&lt;br /&gt;8399 Cannot read the governs class identifier for the schema record.&lt;br /&gt;8400 The attribute schema has bad syntax.&lt;br /&gt;8401 The attribute could not be cached.&lt;br /&gt;8402 The class could not be cached.&lt;br /&gt;8403 The attribute could not be removed from the cache.&lt;br /&gt;8404 The class could not be removed from the cache.&lt;br /&gt;8405 The distinguished name attribute could not be read.&lt;br /&gt;8406 A required subref is missing.&lt;br /&gt;8407 The instance type attribute could not be retrieved.&lt;br /&gt;8408 An internal error has occurred.&lt;br /&gt;8409 A database error has occurred.&lt;br /&gt;8410 The attribute GOVERNSID is missing.&lt;br /&gt;8411 An expected attribute is missing.&lt;br /&gt;8412 The specified naming context is missing a cross reference.&lt;br /&gt;8413 A security checking error has occurred.&lt;br /&gt;8414 The schema is not loaded.&lt;br /&gt;8415 Schema allocation failed. Please check if the machine is running low on memory.&lt;br /&gt;8416 Failed to obtain the required syntax for the attribute schema.&lt;br /&gt;8417 The global catalog verification failed. The global catalog  is not available or does not support the operation. Some part of the  directory is currently not available.&lt;br /&gt;8418 The replication operation failed because of a schema mismatch between the servers involved.&lt;br /&gt;8419 The DSA object could not be found.&lt;br /&gt;8420 The naming context could not be found.&lt;br /&gt;8421 The naming context could not be found in the cache.&lt;br /&gt;8422 The child object could not be retrieved.&lt;br /&gt;8423 The modification was not permitted for security reasons.&lt;br /&gt;8424 The operation cannot replace the hidden record.&lt;br /&gt;8425 The hierarchy file is invalid.&lt;br /&gt;8426 The attempt to build the hierarchy table failed.&lt;br /&gt;8427 The directory configuration parameter is missing from the registry.&lt;br /&gt;8428 The attempt to count the address book indices failed.&lt;br /&gt;8429 The allocation of the hierarchy table failed.&lt;br /&gt;8430 The directory service encountered an internal failure.&lt;br /&gt;8431 The directory service encountered an unknown failure.&lt;br /&gt;8432 A root object requires a class of 'top'.&lt;br /&gt;8433 This directory server is shutting down, and cannot take ownership of new floating single-master operation roles.&lt;br /&gt;8434 The directory service is missing mandatory configuration  information, and is unable to determine the ownership of floating  single-master operation roles.&lt;br /&gt;8435 The directory service was unable to transfer ownership of  one or more floating single-master operation roles to other servers.&lt;br /&gt;8436 The replication operation failed.&lt;br /&gt;8437 An invalid parameter was specified for this replication operation.&lt;br /&gt;8438 The directory service is too busy to complete the replication operation at this time.&lt;br /&gt;8439 The distinguished name specified for this replication operation is invalid.&lt;br /&gt;8440 The naming context specified for this replication operation is invalid.&lt;br /&gt;8441 The distinguished name specified for this replication operation already exists.&lt;br /&gt;8442 The replication system encountered an internal error.&lt;br /&gt;8443 The replication operation encountered a database inconsistency.&lt;br /&gt;8444 The server specified for this replication operation could not be contacted.&lt;br /&gt;8445 The replication operation encountered an object with an invalid instance type.&lt;br /&gt;8446 The replication operation failed to allocate memory.&lt;br /&gt;8447 The replication operation encountered an error with the mail system.&lt;br /&gt;8448 The replication reference information for the target server already exists.&lt;br /&gt;8449 The replication reference information for the target server does not exist.&lt;br /&gt;8450 The naming context cannot be removed because it is replicated to another server.&lt;br /&gt;8451 The replication operation encountered a database error.&lt;br /&gt;8452 The naming context is in the process of being removed or is not replicated from the specified server.&lt;br /&gt;8453 Replication access was denied.&lt;br /&gt;8454 The requested operation is not supported by this version of the directory service.&lt;br /&gt;8455 The replication remote procedure call was cancelled.&lt;br /&gt;8456 The source server is currently rejecting replication requests.&lt;br /&gt;8457 The destination server is currently rejecting replication requests.&lt;br /&gt;8458 The replication operation failed due to a collision of object names.&lt;br /&gt;8459 The replication source has been reinstalled.&lt;br /&gt;8460 The replication operation failed because a required parent object is missing.&lt;br /&gt;8461 The replication operation was preempted.&lt;br /&gt;8462 The replication synchronization attempt was abandoned because of a lack of updates.&lt;br /&gt;8463 The replication operation was terminated because the system is shutting down.&lt;br /&gt;8464 The replication synchronization attempt failed as the  destination partial attribute set is not a subset of source partial  attribute set.&lt;br /&gt;8465 The replication synchronization attempt failed because a master replica attempted to sync from a partial replica.&lt;br /&gt;8466 The server specified for this replication operation was  contacted, but that server was unable to contact an additional server  needed to complete the operation.&lt;br /&gt;8467 The version of the Active Directory schema of the source  forest is not compatible with the version of Active Directory on this  computer. You must upgrade the operating system on a domain controller  in the source forest before this computer can be added as a domain  controller to that forest.&lt;br /&gt;8468 Schema update failed: An attribute with the same link identifier already exists.&lt;br /&gt;8469 Name translation: Generic processing error.&lt;br /&gt;8470 Name translation: Could not find the name or insufficient right to see name.&lt;br /&gt;8471 Name translation: Input name mapped to more than one output name.&lt;br /&gt;8472 Name translation: Input name found, but not the associated output format.&lt;br /&gt;8473 Name translation: Unable to resolve completely, only the domain was found.&lt;br /&gt;8474 Name translation: Unable to perform purely syntactical mapping at the client without going out to the wire.&lt;br /&gt;8475 Modification of a constructed att is not allowed.&lt;br /&gt;8476 The OM-Object-Class specified is incorrect for an attribute with the specified syntax.&lt;br /&gt;8477 The replication request has been posted; waiting for reply.&lt;br /&gt;8478 The requested operation requires a directory service, and none was available.&lt;br /&gt;8479 The LDAP display name of the class or attribute contains non-ASCII characters.&lt;br /&gt;8480 The requested search operation is only supported for base searches.&lt;br /&gt;8481 The search failed to retrieve attributes from the database.&lt;br /&gt;8482 The schema update operation tried to add a backward link attribute that has no corresponding forward link.&lt;br /&gt;8483 Source and destination of a cross domain move do not agree  on the object's epoch number. Either source or destination does not have  the latest version of the object.&lt;br /&gt;8484 Source and destination of a cross domain move do not agree  on the object's current name. Either source or destination does not have  the latest version of the object.&lt;br /&gt;8485 Source and destination of a cross domain move operation are  identical. Caller should use local move operation instead of cross  domain move operation.&lt;br /&gt;8486 Source and destination for a cross domain move are not in  agreement on the naming contexts in the forest. Either source or  destination does not have the latest version of the Partitions  container.&lt;br /&gt;8487 Destination of a cross domain move is not authoritative for the destination naming context.&lt;br /&gt;8488 Source and destination of a cross domain move do not agree  on the identity of the source object. Either source or destination does  not have the latest version of the source object.&lt;br /&gt;8489 Object being moved across domains is already known to be  deleted by the destination server. The source server does not have the  latest version of the source object.&lt;br /&gt;8490 Another operation which requires exclusive access to the PDC PSMO is already in progress.&lt;br /&gt;8491 A cross domain move operation failed such that the two  versions of the moved object exist - one each in the source and  destination domains. The destination object needs to be removed to  restore the system to a consistent state.&lt;br /&gt;8492 This object may not be moved across domain boundaries  either because cross domain moves for this class are disallowed, or the  object has some special characteristics, eg: trust account or restricted  RID, which prevent its move.&lt;br /&gt;8493 Can't move objects with memberships across domain  boundaries as once moved, this would violate the membership conditions  of the account group. Remove the object from any account group  memberships and retry.&lt;br /&gt;8494 A naming context head must be the immediate child of another naming context head, not of an interior node.&lt;br /&gt;8495 The directory cannot validate the proposed naming context  name because it does not hold a replica of the naming context above the  proposed naming context. Please ensure that the domain naming master  role is held by a server that is configured as a global catalog server,  and that the server is up to date with its replication partners.  (Applies only to Windows 2000 Domain Naming masters)&lt;br /&gt;8496 Destination domain must be in native mode.&lt;br /&gt;8497 The operation cannot be performed because the server does  not have an infrastructure container in the domain of interest.&lt;br /&gt;8498 Cross-domain move of non-empty account groups is not allowed.&lt;br /&gt;8499 Cross-domain move of non-empty resource groups is not allowed.&lt;br /&gt;8500 The search flags for the attribute are invalid. The ANR bit  is valid only on attributes of Unicode or Teletex strings.&lt;br /&gt;8501 Tree deletions starting at an object which has an NC head as a descendant are not allowed.&lt;br /&gt;8502 The directory service failed to lock a tree in preparation for a tree deletion because the tree was in use.&lt;br /&gt;8503 The directory service failed to identify the list of objects to delete while attempting a tree deletion.&lt;br /&gt;8504 Security Accounts Manager initialization failed because of the following error: %1.&lt;br /&gt;&lt;br /&gt;Error Status: 0x%2. Click OK to shut down the system and reboot into  Directory Services Restore Mode. Check the event log for detailed  information.&lt;br /&gt;&lt;br /&gt;8505 Only an administrator can modify the membership list of an administrative group.&lt;br /&gt;8506 Cannot change the primary group ID of a domain controller account.&lt;br /&gt;8507 An attempt is made to modify the base schema.&lt;br /&gt;8508 Adding a new mandatory attribute to an existing class,  deleting a mandatory attribute from an existing class, or adding an  optional attribute to the special class Top that is not a backlink  attribute (directly or through inheritance, for example, by adding or  deleting an auxiliary class) is not allowed.&lt;br /&gt;8509 Schema update is not allowed on this DC because the DC is not the schema FSMO Role Owner.&lt;br /&gt;8510 An object of this class cannot be created under the schema  container. You can only create attribute-schema and class-schema objects  under the schema container.&lt;br /&gt;8511 The replica/child install failed to get the objectVersion  attribute on the schema container on the source DC. Either the attribute  is missing on the schema container or the credentials supplied do not  have permission to read it.&lt;br /&gt;8512 The replica/child install failed to read the objectVersion  attribute in the SCHEMA section of the file schema.ini in the system32  directory.&lt;br /&gt;8513 The specified group type is invalid.&lt;br /&gt;8514 Cannot nest global groups in a mixed domain if the group is security-enabled.&lt;br /&gt;8515 Cannot nest local groups in a mixed domain if the group is security-enabled.&lt;br /&gt;8516 A global group cannot have a local group as a member.&lt;br /&gt;8517 A global group cannot have a universal group as a member.&lt;br /&gt;8518 A universal group cannot have a local group as a member.&lt;br /&gt;8519 A global group cannot have a cross-domain member.&lt;br /&gt;8520 A local group cannot have another cross-domain local group as a member.&lt;br /&gt;8521 A group with primary members cannot change to a security-disabled group.&lt;br /&gt;8522 The schema cache load failed to convert the string default SD on a class-schema object.&lt;br /&gt;8523 Only DSAs configured to be Global Catalog servers should be  allowed to hold the Domain Naming Master FSMO role. (Applies only to  Windows 2000 servers)&lt;br /&gt;8524 The DSA operation is unable to proceed because of a DNS lookup failure.&lt;br /&gt;8525 While processing a change to the DNS Host Name for an  object, the Service Principal Name values could not be kept in sync.&lt;br /&gt;8526 The Security Descriptor attribute could not be read.&lt;br /&gt;8527 The object requested was not found, but an object with that key was found.&lt;br /&gt;8528 The syntax of the linked attributed being added is  incorrect. Forward links can only have syntax 2.5.5.1, 2.5.5.7, and  2.5.5.14, and backlinks can only have syntax 2.5.5.1.&lt;br /&gt;8529 Security Account Manager needs to get the boot password.&lt;br /&gt;8530 Security Account Manager needs to get the boot key from floppy disk.&lt;br /&gt;8531 Directory Service cannot start.&lt;br /&gt;8532 Directory Services could not start.&lt;br /&gt;8533 The connection between client and server requires packet privacy or better.&lt;br /&gt;8534 The source domain may not be in the same forest as destination.&lt;br /&gt;8535 The destination domain must be in the forest.&lt;br /&gt;8536 The operation requires that destination domain auditing be enabled.&lt;br /&gt;8537 The operation couldn't locate a DC for the source domain.&lt;br /&gt;8538 The source object must be a group or user.&lt;br /&gt;8539 The source object's SID already exists in destination forest.&lt;br /&gt;8540 The source and destination object must be of the same type.&lt;br /&gt;8541 Security Accounts Manager initialization failed because of the following error: %1.&lt;br /&gt;&lt;br /&gt;Error Status: 0x%2. Click OK to shut down the system and reboot into Safe Mode. Check the event log for detailed information.&lt;br /&gt;&lt;br /&gt;8542 Schema information could not be included in the replication request.&lt;br /&gt;8543 The replication operation could not be completed due to a schema incompatibility.&lt;br /&gt;8544 The replication operation could not be completed due to a previous schema incompatibility.&lt;br /&gt;8545 The replication update could not be applied because either  the source or the destination has not yet received information regarding  a recent cross-domain move operation.&lt;br /&gt;8546 The requested domain could not be deleted because there exist domain controllers that still host this domain.&lt;br /&gt;8547 The requested operation can be performed only on a global catalog server.&lt;br /&gt;8548 A local group can only be a member of other local groups in the same domain.&lt;br /&gt;8549 Foreign security principals cannot be members of universal groups.&lt;br /&gt;8550 The attribute is not allowed to be replicated to the GC because of security reasons.&lt;br /&gt;8551 The checkpoint with the PDC could not be taken because there are too many modifications being processed currently.&lt;br /&gt;8552 The operation requires that source domain auditing be enabled.&lt;br /&gt;8553 Security principal objects can only be created inside domain naming contexts.&lt;br /&gt;8554 A Service Principal Name (SPN) could not be constructed  because the provided hostname is not in the necessary format.&lt;br /&gt;8555 A Filter was passed that uses constructed attributes.&lt;br /&gt;8556 The unicodePwd attribute value must be enclosed in double quotes.&lt;br /&gt;8557 Your computer could not be joined to the domain. You have  exceeded the maximum number of computer accounts you are allowed to  create in this domain. Contact your system administrator to have this  limit reset or increased.&lt;br /&gt;8558 For security reasons, the operation must be run on the destination DC.&lt;br /&gt;8559 For security reasons, the source DC must be NT4SP4 or greater.&lt;br /&gt;8560 Critical Directory Service System objects cannot be deleted  during tree delete operations. The tree delete may have been partially  performed.&lt;br /&gt;8561 Directory Services could not start because of the following error: %1.&lt;br /&gt;&lt;br /&gt;Error Status: 0x%2. Please click OK to shutdown the system. You can use the recovery console to diagnose the system further.&lt;br /&gt;&lt;br /&gt;8562 Security Accounts Manager initialization failed because of the following error: %1.&lt;br /&gt;&lt;br /&gt;Error Status: 0x%2. Please click OK to shutdown the system. You can use the recovery console to diagnose the system further.&lt;br /&gt;&lt;br /&gt;8563 This version of Windows is too old to support the current  directory forest behavior. You must upgrade the operating system on this  server before it can become a domain controller in this forest.&lt;br /&gt;8564 This version of Windows is too old to support the current  domain behavior. You must upgrade the operating system on this server  before it can become a domain controller in this domain.&lt;br /&gt;8565 This version of Windows no longer supports the behavior  version in use in this directory forest. You must advance the forest  behavior version before this server can become a domain controller in  the forest.&lt;br /&gt;8566 This version of Windows no longer supports the behavior  version in use in this domain. You must advance the domain behavior  version before this server can become a domain controller in the  domain.&lt;br /&gt;8567 The version of Windows is incompatible with the behavior version of the domain or forest.&lt;br /&gt;8568 The behavior version cannot be increased to the requested  value because Domain Controllers still exist with versions lower than  the requested value.&lt;br /&gt;8569 The behavior version value cannot be increased while the  domain is still in mixed domain mode. You must first change the domain  to native mode before increasing the behavior version.&lt;br /&gt;8570 The sort order requested is not supported.&lt;br /&gt;8571 Found an object with a non unique name.&lt;br /&gt;8572 The machine account was created pre-NT4. The account needs to be recreated.&lt;br /&gt;8573 The database is out of version store.&lt;br /&gt;8574 Unable to continue operation because multiple conflicting controls were used.&lt;br /&gt;8575 Unable to find a valid security descriptor reference domain for this partition.&lt;br /&gt;8576 Schema update failed: The link identifier is reserved.&lt;br /&gt;8577 Schema update failed: There are no link identifiers available.&lt;br /&gt;8578 An account group cannot have a universal group as a member.&lt;br /&gt;8579 Rename or move operations on naming context heads or read-only objects are not allowed.&lt;br /&gt;8580 Move operations on objects in the schema naming context are not allowed.&lt;br /&gt;8581 A system flag has been set on the object and does not allow the object to be moved or renamed.&lt;br /&gt;8582 This object is not allowed to change its grandparent  container. Moves are not forbidden on this object, but are restricted to  sibling containers.&lt;br /&gt;8583 Unable to resolve completely, a referral to another forest is generated.&lt;br /&gt;8584 The requested action is not supported on standard server.&lt;br /&gt;8585 Could not access a partition of the Active Directory  located on a remote server. Make sure at least one server is running for  the partition in question.&lt;br /&gt;8586 The directory cannot validate the proposed naming context  (or partition) name because it does not hold a replica nor can it  contact a replica of the naming context above the proposed naming  context. Please ensure that the parent naming context is properly  registered in DNS, and at least one replica of this naming context is  reachable by the Domain Naming master.&lt;br /&gt;8587 The thread limit for this request was exceeded.&lt;br /&gt;8588 The Global catalog server is not in the closet site.&lt;br /&gt;8589 The DS cannot derive a service principal name (SPN) with  which to mutually authenticate the target server because the  corresponding server object in the local DS database has no  serverReference attribute.&lt;br /&gt;8590 The Directory Service failed to enter single user mode.&lt;br /&gt;8591 The Directory Service cannot parse the script because of a syntax error.&lt;br /&gt;8592 The Directory Service cannot process the script because of an error.&lt;br /&gt;8593 The directory service cannot perform the requested  operation because the servers involved are of different replication  epochs (which is usually related to a domain rename that is in  progress).&lt;br /&gt;8594 The directory service binding must be renegotiated due to a change in the server extensions information.&lt;br /&gt;8595 Operation not allowed on a disabled cross ref.&lt;br /&gt;8596 Schema update failed: No values for msDS-IntId are available.&lt;br /&gt;8597 Schema update failed: Duplicate msDS-INtId. Retry the operation.&lt;br /&gt;8598 Schema deletion failed: attribute is used in rDNAttID.&lt;br /&gt;8599 The directory service failed to authorize the request.&lt;br /&gt;8600 The Directory Service cannot process the script because it is invalid.&lt;br /&gt;8601 The remote create cross reference operation failed on the  Domain Naming Master FSMO. The operation's error is in the extended  data.&lt;br /&gt;9001 DNS server unable to interpret format.&lt;br /&gt;9002 DNS server failure.&lt;br /&gt;9003 DNS name does not exist.&lt;br /&gt;9004 DNS request not supported by name server.&lt;br /&gt;9005 DNS operation refused.&lt;br /&gt;9006 DNS name that ought not exist, does exist.&lt;br /&gt;9007 DNS RR set that ought not exist, does exist.&lt;br /&gt;9008 DNS RR set that ought to exist, does not exist.&lt;br /&gt;9009 DNS server not authoritative for zone.&lt;br /&gt;9010 DNS name in update or prereq is not in zone.&lt;br /&gt;9016 DNS signature failed to verify.&lt;br /&gt;9017 DNS bad key.&lt;br /&gt;9018 DNS signature validity expired.&lt;br /&gt;9501 No records found for given DNS query.&lt;br /&gt;9502 Bad DNS packet.&lt;br /&gt;9503 No DNS packet.&lt;br /&gt;9504 DNS error, check rcode.&lt;br /&gt;9505 Unsecured DNS packet.&lt;br /&gt;9551 Invalid DNS type.&lt;br /&gt;9552 Invalid IP address.&lt;br /&gt;9553 Invalid property.&lt;br /&gt;9554 Try DNS operation again later.&lt;br /&gt;9555 Record for given name and type is not unique.&lt;br /&gt;9556 DNS name does not comply with RFC specifications.&lt;br /&gt;9557 DNS name is a fully-qualified DNS name.&lt;br /&gt;9558 DNS name is dotted (multi-label).&lt;br /&gt;9559 DNS name is a single-part name.&lt;br /&gt;9560 DSN name contains an invalid character.&lt;br /&gt;9561 DNS name is entirely numeric.&lt;br /&gt;9562 The operation requested is not permitted on a DNS root server.&lt;br /&gt;9601 DNS zone does not exist.&lt;br /&gt;9602 DNS zone information not available.&lt;br /&gt;9603 Invalid operation for DNS zone.&lt;br /&gt;9604 Invalid DNS zone configuration.&lt;br /&gt;9605 DNS zone has no start of authority (SOA) record.&lt;br /&gt;9606 DNS zone has no name server (NS) record.&lt;br /&gt;9607 DNS zone is locked.&lt;br /&gt;9608 DNS zone creation failed.&lt;br /&gt;9609 DNS zone already exists.&lt;br /&gt;9610 DNS automatic zone already exists.&lt;br /&gt;9611 Invalid DNS zone type.&lt;br /&gt;9612 Secondary DNS zone requires master IP address.&lt;br /&gt;9613 DNS zone not secondary.&lt;br /&gt;9614 Need secondary IP address.&lt;br /&gt;9615 WINS initialization failed.&lt;br /&gt;9616 Need WINS servers.&lt;br /&gt;9617 NBTSTAT initialization call failed.&lt;br /&gt;9618 Invalid delete of start of authority (SOA)&lt;br /&gt;9619 A conditional forwarding zone already exists for that name.&lt;br /&gt;9620 This zone must be configured with one or more master DNS server IP addresses.&lt;br /&gt;9621 The operation cannot be performed because this zone is shutdown.&lt;br /&gt;9651 Primary DNS zone requires datafile.&lt;br /&gt;9652 Invalid datafile name for DNS zone.&lt;br /&gt;9653 Failed to open datafile for DNS zone.&lt;br /&gt;9654 Failed to write datafile for DNS zone.&lt;br /&gt;9655 Failure while reading datafile for DNS zone.&lt;br /&gt;9701 DNS record does not exist.&lt;br /&gt;9702 DNS record format error.&lt;br /&gt;9703 Node creation failure in DNS.&lt;br /&gt;9704 Unknown DNS record type.&lt;br /&gt;9705 DNS record timed out.&lt;br /&gt;9706 Name not in DNS zone.&lt;br /&gt;9707 CNAME loop detected.&lt;br /&gt;9708 Node is a CNAME DNS record.&lt;br /&gt;9709 A CNAME record already exists for given name.&lt;br /&gt;9710 Record only at DNS zone root.&lt;br /&gt;9711 DNS record already exists.&lt;br /&gt;9712 Secondary DNS zone data error.&lt;br /&gt;9713 Could not create DNS cache data.&lt;br /&gt;9714 DNS name does not exist.&lt;br /&gt;9715 Could not create pointer (PTR) record.&lt;br /&gt;9716 DNS domain was undeleted.&lt;br /&gt;9717 The directory service is unavailable.&lt;br /&gt;9718 DNS zone already exists in the directory service.&lt;br /&gt;9719 DNS server not creating or reading the boot file for the directory service integrated DNS zone.&lt;br /&gt;9751 DNS AXFR (zone transfer) complete.&lt;br /&gt;9752 DNS zone transfer failed.&lt;br /&gt;9753 Added local WINS server.&lt;br /&gt;9801 Secure update call needs to continue update request.&lt;br /&gt;9851 TCP/IP network protocol not installed.&lt;br /&gt;9852 No DNS servers configured for local system.&lt;br /&gt;9901 The specified directory partition does not exist.&lt;br /&gt;9902 The specified directory partition already exists.&lt;br /&gt;9903 The DS is not enlisted in the specified directory partition.&lt;br /&gt;9904 The DS is already enlisted in the specified directory partition.&lt;br /&gt;10004 A blocking operation was interrupted by a call to WSACancelBlockingCall.&lt;br /&gt;10009 The file handle supplied is not valid.&lt;br /&gt;10013 An attempt was made to access a socket in a way forbidden by its access permissions.&lt;br /&gt;10014 The system detected an invalid pointer address in attempting to use a pointer argument in a call.&lt;br /&gt;10022 An invalid argument was supplied.&lt;br /&gt;10024 Too many open sockets.&lt;br /&gt;10035 A non-blocking socket operation could not be completed immediately.&lt;br /&gt;10036 A blocking operation is currently executing.&lt;br /&gt;10037 An operation was attempted on a non-blocking socket that already had an operation in progress.&lt;br /&gt;10038 An operation was attempted on something that is not a socket.&lt;br /&gt;10039 A required address was omitted from an operation on a socket.&lt;br /&gt;10040 A message sent on a datagram socket was larger than the  internal message buffer or some other network limit, or the buffer used  to receive a datagram into was smaller than the datagram itself.&lt;br /&gt;10041 A protocol was specified in the socket function call that  does not support the semantics of the socket type requested.&lt;br /&gt;10042 An unknown, invalid, or unsupported option or level was specified in a getsockopt or setsockopt call.&lt;br /&gt;10043 The requested protocol has not been configured into the system, or no implementation for it exists.&lt;br /&gt;10044 The support for the specified socket type does not exist in this address family.&lt;br /&gt;10045 The attempted operation is not supported for the type of object referenced.&lt;br /&gt;10046 The protocol family has not been configured into the system or no implementation for it exists.&lt;br /&gt;10047 An address incompatible with the requested protocol was used.&lt;br /&gt;10048 Only one usage of each socket address (protocol/network address/port) is normally permitted.&lt;br /&gt;10049 The requested address is not valid in its context.&lt;br /&gt;10050 A socket operation encountered a dead network.&lt;br /&gt;10051 A socket operation was attempted to an unreachable network.&lt;br /&gt;10052 The connection has been broken due to keep-alive activity  detecting a failure while the operation was in progress.&lt;br /&gt;10053 An established connection was aborted by the software in your host machine.&lt;br /&gt;10054 An existing connection was forcibly closed by the remote host.&lt;br /&gt;10055 An operation on a socket could not be performed because  the system lacked sufficient buffer space or because a queue was full.&lt;br /&gt;10056 A connect request was made on an already connected socket.&lt;br /&gt;10057 A request to send or receive data was disallowed because  the socket is not connected and (when sending on a datagram socket using  a sendto call) no address was supplied.&lt;br /&gt;10058 A request to send or receive data was disallowed because  the socket had already been shut down in that direction with a previous  shutdown call.&lt;br /&gt;10059 Too many references to some kernel object.&lt;br /&gt;10060 A connection attempt failed because the connected party  did not properly respond after a period of time, or established  connection failed because connected host has failed to respond.&lt;br /&gt;10061 No connection could be made because the target machine actively refused it.&lt;br /&gt;10062 Cannot translate name.&lt;br /&gt;10063 Name component or name was too long.&lt;br /&gt;10064 A socket operation failed because the destination host was down.&lt;br /&gt;10065 A socket operation was attempted to an unreachable host.&lt;br /&gt;10066 Cannot remove a directory that is not empty.&lt;br /&gt;10067 A Windows Sockets implementation may have a limit on the number of applications that may use it simultaneously.&lt;br /&gt;10068 Ran out of quota.&lt;br /&gt;10069 Ran out of disk quota.&lt;br /&gt;10070 File handle reference is no longer available.&lt;br /&gt;10071 Item is not available locally.&lt;br /&gt;10091 WSAStartup cannot function at this time because the  underlying system it uses to provide network services is currently  unavailable.&lt;br /&gt;10092 The Windows Sockets version requested is not supported.&lt;br /&gt;10093 Either the application has not called WSAStartup, or WSAStartup failed.&lt;br /&gt;10101 Returned by WSARecv or WSARecvFrom to indicate the remote party has initiated a graceful shutdown sequence.&lt;br /&gt;10102 No more results can be returned by WSALookupServiceNext.&lt;br /&gt;10103 A call to WSALookupServiceEnd was made while this call was still processing. The call has been canceled.&lt;br /&gt;10104 The procedure call table is invalid.&lt;br /&gt;10105 The requested service provider is invalid.&lt;br /&gt;10106 The requested service provider could not be loaded or initialized.&lt;br /&gt;10107 A system call that should never fail has failed.&lt;br /&gt;10108 No such service is known. The service cannot be found in the specified name space.&lt;br /&gt;10109 The specified class was not found.&lt;br /&gt;10110 No more results can be returned by WSALookupServiceNext.&lt;br /&gt;10111 A call to WSALookupServiceEnd was made while this call was still processing. The call has been canceled.&lt;br /&gt;10112 A database query failed because it was actively refused.&lt;br /&gt;11001 No such host is known.&lt;br /&gt;11002 This is usually a temporary error during hostname  resolution and means that the local server did not receive a response  from an authoritative server.&lt;br /&gt;11003 A non-recoverable error occurred during a database lookup.&lt;br /&gt;11004 The requested name is valid and was found in the database,  but it does not have the correct associated data being resolved for.&lt;br /&gt;11005 At least one reserve has arrived.&lt;br /&gt;11006 At least one path has arrived.&lt;br /&gt;11007 There are no senders.&lt;br /&gt;11008 There are no receivers.&lt;br /&gt;11009 Reserve has been confirmed.&lt;br /&gt;11010 Error due to lack of resources.&lt;br /&gt;11011 Rejected for administrative reasons - bad credentials.&lt;br /&gt;11012 Unknown or conflicting style.&lt;br /&gt;11013 Problem with some part of the filterspec or providerspecific buffer in general.&lt;br /&gt;11014 Problem with some part of the flowspec.&lt;br /&gt;11015 General QOS error.&lt;br /&gt;11016 An invalid or unrecognized service type was found in the flowspec.&lt;br /&gt;11017 An invalid or inconsistent flowspec was found in the QOS structure.&lt;br /&gt;11018 Invalid QOS provider-specific buffer.&lt;br /&gt;11019 An invalid QOS filter style was used.&lt;br /&gt;11020 An invalid QOS filter type was used.&lt;br /&gt;11021 An incorrect number of QOS FILTERSPECs were specified in the FLOWDESCRIPTOR.&lt;br /&gt;11022 An object with an invalid ObjectLength field was specified in the QOS provider-specific buffer.&lt;br /&gt;11023 An incorrect number of flow descriptors was specified in the QOS structure.&lt;br /&gt;11024 An unrecognized object was found in the QOS provider-specific buffer.&lt;br /&gt;11025 An invalid policy object was found in the QOS provider-specific buffer.&lt;br /&gt;11026 An invalid QOS flow descriptor was found in the flow descriptor list.&lt;br /&gt;11027 An invalid or inconsistent flowspec was found in the QOS provider-specific buffer.&lt;br /&gt;11028 An invalid FILTERSPEC was found in the QOS provider-specific buffer.&lt;br /&gt;11029 An invalid shape discard mode object was found in the QOS provider-specific buffer.&lt;br /&gt;11030 An invalid shaping rate object was found in the QOS provider-specific buffer.&lt;br /&gt;11031 A reserved policy element was found in the QOS provider-specific buffer.&lt;br /&gt;13000 The specified quick mode policy already exists.&lt;br /&gt;13001 The specified quick mode policy was not found.&lt;br /&gt;13002 The specified quick mode policy is being used.&lt;br /&gt;13003 The specified main mode policy already exists.&lt;br /&gt;13004 The specified main mode policy was not found.&lt;br /&gt;13005 The specified main mode policy is being used.&lt;br /&gt;13006 The specified main mode filter already exists.&lt;br /&gt;13007 The specified main mode filter was not found.&lt;br /&gt;13008 The specified transport mode filter already exists.&lt;br /&gt;13009 The specified transport mode filter does not exist.&lt;br /&gt;13010 The specified main mode authentication list exists.&lt;br /&gt;13011 The specified main mode authentication list was not found.&lt;br /&gt;13012 The specified quick mode policy is being used.&lt;br /&gt;13013 The specified main mode policy was not found.&lt;br /&gt;13014 The specified quick mode policy was not found.&lt;br /&gt;13015 The manifest file contains one or more syntax errors.&lt;br /&gt;13016 The application attempted to activate a disabled activation context.&lt;br /&gt;13017 The requested lookup key was not found in any active activation context.&lt;br /&gt;13018 The Main Mode filter is pending deletion.&lt;br /&gt;13019 The transport filter is pending deletion.&lt;br /&gt;13020 The tunnel filter is pending deletion.&lt;br /&gt;13021 The Main Mode policy is pending deletion.&lt;br /&gt;13022 The Main Mode authentication bundle is pending deletion.&lt;br /&gt;13023 The Quick Mode policy is pending deletion.&lt;br /&gt;13801 IKE authentication credentials are unacceptable.&lt;br /&gt;13802 IKE security attributes are unacceptable.&lt;br /&gt;13803 IKE Negotiation in progress.&lt;br /&gt;13804 General processing error.&lt;br /&gt;13805 Negotiation timed out.&lt;br /&gt;13806 IKE failed to find valid machine certificate.&lt;br /&gt;13807 IKE SA deleted by peer before establishment completed.&lt;br /&gt;13808 IKE SA deleted before establishment completed.&lt;br /&gt;13809 Negotiation request sat in Queue too long.&lt;br /&gt;13810 Negotiation request sat in Queue too long.&lt;br /&gt;13811 Negotiation request sat in Queue too long.&lt;br /&gt;13812 Negotiation request sat in Queue too long.&lt;br /&gt;13813 No response from peer.&lt;br /&gt;13814 Negotiation took too long.&lt;br /&gt;13815 Negotiation took too long.&lt;br /&gt;13816 Unknown error occurred.&lt;br /&gt;13817 Certificate Revocation Check failed.&lt;br /&gt;13818 Invalid certificate key usage.&lt;br /&gt;13819 Invalid certificate type.&lt;br /&gt;13820 No private key associated with machine certificate.&lt;br /&gt;13822 Failure in Diffie-Helman computation.&lt;br /&gt;13824 Invalid header.&lt;br /&gt;13825 No policy configured.&lt;br /&gt;13826 Failed to verify signature.&lt;br /&gt;13827 Failed to authenticate using Kerberos.&lt;br /&gt;13828 Peer's certificate did not have a public key.&lt;br /&gt;13829 Error processing error payload.&lt;br /&gt;13830 Error processing SA payload.&lt;br /&gt;13831 Error processing Proposal payload.&lt;br /&gt;13832 Error processing Transform payload.&lt;br /&gt;13833 Error processing KE payload.&lt;br /&gt;13834 Error processing ID payload.&lt;br /&gt;13835 Error processing Cert payload.&lt;br /&gt;13836 Error processing Certificate Request payload.&lt;br /&gt;13837 Error processing Hash payload.&lt;br /&gt;13838 Error processing Signature payload.&lt;br /&gt;13839 Error processing Nonce payload.&lt;br /&gt;13840 Error processing Notify payload.&lt;br /&gt;13841 Error processing Delete Payload.&lt;br /&gt;13842 Error processing VendorId payload.&lt;br /&gt;13843 Invalid payload received.&lt;br /&gt;13844 Soft SA loaded.&lt;br /&gt;13845 Soft SA torn down.&lt;br /&gt;13846 Invalid cookie received..&lt;br /&gt;13847 Peer failed to send valid machine certificate.&lt;br /&gt;13848 Certification Revocation check of peer's certificate failed.&lt;br /&gt;13849 New policy invalidated SAs formed with old policy.&lt;br /&gt;13850 There is no available Main Mode IKE policy.&lt;br /&gt;13851 Failed to enabled TCB privilege.&lt;br /&gt;13852 Failed to load SECURITY.DLL.&lt;br /&gt;13853 Failed to obtain security function table dispatch address from SSPI.&lt;br /&gt;13854 Failed to query Kerberos package to obtain max token size.&lt;br /&gt;13855 Failed to obtain Kerberos server credentials for  ISAKMP/ERROR_IPSEC_IKE service. Kerberos authentication will not  function. The most likely reason for this is lack of domain membership.  This is normal if your computer is a member of a workgroup.&lt;br /&gt;13856 Failed to determine SSPI principal name for ISAKMP/ERROR_IPSEC_IKE service (QueryCredentialsAttributes).&lt;br /&gt;13857 Failed to obtain new SPI for the inbound SA from Ipsec  driver. The most common cause for this is that the driver does not have  the correct filter. Check your policy to verify the filters.&lt;br /&gt;13858 Given filter is invalid.&lt;br /&gt;13859 Memory allocation failed.&lt;br /&gt;13860 Failed to add Security Association to IPSec Driver. The  most common cause for this is if the IKE negotiation took too long to  complete. If the problem persists, reduce the load on the faulting  machine.&lt;br /&gt;13861 Invalid policy.&lt;br /&gt;13862 Invalid DOI.&lt;br /&gt;13863 Invalid situation.&lt;br /&gt;13864 Diffie-Hellman failure.&lt;br /&gt;13865 Invalid Diffie-Hellman group.&lt;br /&gt;13866 Error encrypting payload.&lt;br /&gt;13867 Error decrypting payload.&lt;br /&gt;13868 Policy match error.&lt;br /&gt;13869 Unsupported ID.&lt;br /&gt;13870 Hash verification failed.&lt;br /&gt;13871 Invalid hash algorithm.&lt;br /&gt;13872 Invalid hash size.&lt;br /&gt;13873 Invalid encryption algorithm.&lt;br /&gt;13874 Invalid authentication algorithm.&lt;br /&gt;13875 Invalid certificate signature.&lt;br /&gt;13876 Load failed.&lt;br /&gt;13877 Deleted via RPC call.&lt;br /&gt;13878 Temporary state created to perform reinit. This is not a real failure.&lt;br /&gt;13879 The lifetime value received in the Responder Lifetime  Notify is below the Windows 2000 configured minimum value. Please fix  the policy on the peer machine.&lt;br /&gt;13881 Key length in certificate is too small for configured security requirements.&lt;br /&gt;13882 Max number of established MM SAs to peer exceeded.&lt;br /&gt;13883 IKE received a policy that disables negotiation.&lt;br /&gt;13884 ERROR_IPSEC_IKE_NEG_STATUS_END&lt;br /&gt;14000 The requested section was not present in the activation context.&lt;br /&gt;14001 This application has failed to start because the  application configuration is incorrect. Reinstalling the application may  fix this problem.&lt;br /&gt;14002 The application binding data format is invalid.&lt;br /&gt;14003 The referenced assembly is not installed on your system.&lt;br /&gt;14004 The manifest file does not begin with the required tag and format information.&lt;br /&gt;14005 The manifest file contains one or more syntax errors.&lt;br /&gt;14006 The application attempted to activate a disabled activation context.&lt;br /&gt;14007 The requested lookup key was not found in any active activation context.&lt;br /&gt;14008 A component version required by the application conflicts with another component version already active.&lt;br /&gt;14009 The type requested activation context section does not match the query API used.&lt;br /&gt;14010 Lack of system resources has required isolated activation to be disabled for the current thread of execution.&lt;br /&gt;14011 An attempt to set the process default activation context  failed because the process default activation context was already set.&lt;br /&gt;14012 The encoding group identifier specified is not recognized.&lt;br /&gt;14013 The encoding requested is not recognized.&lt;br /&gt;14014 The manifest contains a reference to an invalid URI.&lt;br /&gt;14015 The application manifest contains a reference to a dependent assembly which is not installed.&lt;br /&gt;14016 The manifest for an assembly used by the application has a  reference to a dependent assembly which is not installed.&lt;br /&gt;14017 The manifest contains an attribute for the assembly identity which is not valid.&lt;br /&gt;14018 The manifest is missing the required default namespace specification on the assembly element.&lt;br /&gt;14019 The manifest has a default namespace specified on the  assembly element but its value is not  "urn:schemas-microsoft-com:asm.v1".&lt;br /&gt;14020 The private manifest probe has crossed the reparse-point-associated path.&lt;br /&gt;14021 Two or more components referenced directly or indirectly by the application manifest have files by the same name.&lt;br /&gt;14022 Two or more components referenced directly or indirectly  by the application manifest have window classes with the same name.&lt;br /&gt;14023 Two or more components referenced directly or indirectly  by the application manifest have the same COM server CLSIDs.&lt;br /&gt;14024 Two or more components referenced directly or indirectly  by the application manifest have proxies for the same COM interface  IIDs.&lt;br /&gt;14025 Two or more components referenced directly or indirectly  by the application manifest have the same COM type library TLBIDs.&lt;br /&gt;14026 Two or more components referenced directly or indirectly by the application manifest have the same COM ProgIDs.&lt;br /&gt;14027 Two or more components referenced directly or indirectly  by the application manifest are different versions of the same component  which is not permitted.&lt;br /&gt;14028 A component's file does not match the verification information present in the component manifest.&lt;br /&gt;14029 The policy manifest contains one or more syntax errors.&lt;br /&gt;14030 Manifest Parse Error : A string literal was expected, but no opening quote character was found.&lt;br /&gt;14031 Manifest Parse Error : Incorrect syntax was used in a comment.&lt;br /&gt;14032 Manifest Parse Error : A name was started with an invalid character.&lt;br /&gt;14033 Manifest Parse Error : A name contained an invalid character.&lt;br /&gt;14034 Manifest Parse Error : A string literal contained an invalid character.&lt;br /&gt;14035 Manifest Parse Error : Invalid syntax for an XML declaration.&lt;br /&gt;14036 Manifest Parse Error : An invalid character was found in text content.&lt;br /&gt;14037 Manifest Parse Error : Required white space was missing.&lt;br /&gt;14038 Manifest Parse Error : The character '&amp;gt;' was expected.&lt;br /&gt;14039 Manifest Parse Error : A semi colon character was expected.&lt;br /&gt;14040 Manifest Parse Error : Unbalanced parentheses.&lt;br /&gt;14041 Manifest Parse Error : Internal error.&lt;br /&gt;14042 Manifest Parse Error : White space is not allowed at this location.&lt;br /&gt;14043 Manifest Parse Error : End of file reached in invalid state for current encoding.&lt;br /&gt;14044 Manifest Parse Error : Missing parenthesis.&lt;br /&gt;14045 Manifest Parse Error : A single or double closing quote character (\' or \") is missing.&lt;br /&gt;14046 Manifest Parse Error : Multiple colons are not allowed in a name.&lt;br /&gt;14047 Manifest Parse Error : Invalid character for decimal digit.&lt;br /&gt;14048 Manifest Parse Error : Invalid character for hexadecimal digit.&lt;br /&gt;14049 Manifest Parse Error : Invalid Unicode character value for this platform.&lt;br /&gt;14050 Manifest Parse Error : Expecting white space or '?'.&lt;br /&gt;14051 Manifest Parse Error : End tag was not expected at this location.&lt;br /&gt;14052 Manifest Parse Error : The following tags were not closed: %1.&lt;br /&gt;14053 Manifest Parse Error : Duplicate attribute.&lt;br /&gt;14054 Manifest Parse Error : Only one top level element is allowed in an XML document.&lt;br /&gt;14055 Manifest Parse Error : Invalid at the top level of the document.&lt;br /&gt;14056 Manifest Parse Error : Invalid XML declaration.&lt;br /&gt;14057 Manifest Parse Error : XML document must have a top level element.&lt;br /&gt;14058 Manifest Parse Error : Unexpected end of file.&lt;br /&gt;14059 Manifest Parse Error : Parameter entities cannot be used inside markup declarations in an internal subset.&lt;br /&gt;14060 Manifest Parse Error : Element was not closed.&lt;br /&gt;14061 Manifest Parse Error : End element was missing the character '&amp;gt;'.&lt;br /&gt;14062 Manifest Parse Error : A string literal was not closed.&lt;br /&gt;14063 Manifest Parse Error : A comment was not closed.&lt;br /&gt;14064 Manifest Parse Error : A declaration was not closed.&lt;br /&gt;14065 Manifest Parse Error : A CDATA section was not closed.&lt;br /&gt;14066 Manifest Parse Error : The namespace prefix is not allowed to start with the reserved string "xml".&lt;br /&gt;14067 Manifest Parse Error : System does not support the specified encoding.&lt;br /&gt;14068 Manifest Parse Error : Switch from current encoding to specified encoding not supported.&lt;br /&gt;14069 Manifest Parse Error : The name 'xml' is reserved and must be lower case.&lt;br /&gt;14070 Manifest Parse Error : The standalone attribute must have the value 'yes' or 'no'.&lt;br /&gt;14071 Manifest Parse Error : The standalone attribute cannot be used in external entities.&lt;br /&gt;14072 Manifest Parse Error : Invalid version number.&lt;br /&gt;14073 Manifest Parse Error : Missing equals sign between attribute and attribute value.&lt;br /&gt;14074 Assembly Protection Error: Unable to recover the specified assembly.&lt;br /&gt;14075 Assembly Protection Error: The public key for an assembly was too short to be allowed.&lt;br /&gt;14076 Assembly Protection Error: The catalog for an assembly is not valid, or does not match the assembly's manifest.&lt;br /&gt;14077 An HRESULT could not be translated to a corresponding Win32 error code.&lt;br /&gt;14078 Assembly Protection Error: The catalog for an assembly is missing.&lt;br /&gt;14079 The supplied assembly identity is missing one or more attributes which must be present in this context.&lt;br /&gt;14080 The supplied assembly identity has one or more attribute  names that contain characters not permitted in XML names.&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-2606378801234459852?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/2606378801234459852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/07/error-code-when-excute-shell-in-php.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2606378801234459852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2606378801234459852'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/07/error-code-when-excute-shell-in-php.html' title='Error code when excute shell in php script'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-5640070179670036070</id><published>2011-07-16T19:53:00.001+07:00</published><updated>2011-07-16T19:54:20.470+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bug pdo_mysql'/><title type='text'>fix bug pdo_mysql</title><content type='html'>This is bug of pdo_mysql that I lost many time to fix it:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;This is a solution when using pdo in zendframeword, it is very simple:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $objDB &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;= Zend_Registry::get('objDBReadWrite');&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $stmt &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;= $objDB-&amp;gt;prepare('call storedprocedure_name(:type, :start,:limit,@total);');&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $stmt -&amp;gt; bindParam("type", $type, PDO::PARAM_INT, 1);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $stmt -&amp;gt; bindParam("start", $start, PDO::PARAM_INT, 10);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $stmt -&amp;gt; bindParam("limit", $limit, PDO::PARAM_INT, 10);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $stmt -&amp;gt; execute();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $arrResults = $stmt-&amp;gt;fetchAll();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $stmt -&amp;gt; closeCursor();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $objOut = $objDB -&amp;gt; query("select @total");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $arrOut = $objOut -&amp;gt; fetch();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $total = $arrOut['@total'];&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $stmt -&amp;gt; closeCursor();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $objDB-&amp;gt;closeConnection();&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-5640070179670036070?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/5640070179670036070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2011/07/fix-bug-pdomysql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5640070179670036070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5640070179670036070'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2011/07/fix-bug-pdomysql.html' title='fix bug pdo_mysql'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-7762350685484067589</id><published>2010-12-15T16:37:00.002+07:00</published><updated>2010-12-15T16:37:38.973+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP Advent 2010'/><title type='text'>PHP Advent 2010</title><content type='html'>&lt;a href="http://phpadvent.org/2010/usage-statistics-by-ilia-alshanetsky"&gt;http://phpadvent.org/2010/usage-statistics-by-ilia-alshanetsky&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-7762350685484067589?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/7762350685484067589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/12/php-advent-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7762350685484067589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7762350685484067589'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/12/php-advent-2010.html' title='PHP Advent 2010'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-8554842267256736010</id><published>2010-12-07T17:49:00.002+07:00</published><updated>2010-12-07T17:49:40.710+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thrift'/><category scheme='http://www.blogger.com/atom/ns#' term='Protocol Buffers'/><title type='text'>Thrift vs. Protocol Buffers</title><content type='html'>&lt;a href="http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers"&gt;http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-8554842267256736010?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/8554842267256736010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/12/thrift-vs-protocol-buffers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8554842267256736010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8554842267256736010'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/12/thrift-vs-protocol-buffers.html' title='Thrift vs. Protocol Buffers'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-3050358267694064896</id><published>2010-11-23T13:33:00.002+07:00</published><updated>2010-11-23T13:34:36.484+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL partitions'/><title type='text'>MySQL partitions tutorial</title><content type='html'>&lt;div id="__ss_1344181" style="width: 425px;"&gt;&lt;b style="display: block; margin: 12px 0pt 4px;"&gt;&lt;a href="http://www.slideshare.net/datacharmer/mysql-partitions-tutorial" title="MySQL partitions tutorial"&gt;MySQL partitions tutorial&lt;/a&gt;&lt;/b&gt;&lt;object height="355" id="__sse1344181" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=partitionstutorial-090426130303-phpapp02&amp;stripped_title=mysql-partitions-tutorial&amp;userName=datacharmer" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse1344181" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=partitionstutorial-090426130303-phpapp02&amp;stripped_title=mysql-partitions-tutorial&amp;userName=datacharmer" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0pt 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/datacharmer"&gt;Giuseppe Maxia&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-3050358267694064896?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/3050358267694064896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/11/mysql-partitions-tutorial.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3050358267694064896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3050358267694064896'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/11/mysql-partitions-tutorial.html' title='MySQL partitions tutorial'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-5938533003140925334</id><published>2010-10-08T10:34:00.002+07:00</published><updated>2010-10-08T10:34:33.120+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='css background-posision'/><title type='text'>Mastering CSS background-position</title><content type='html'>&lt;a href="http://yensdesign.com/2009/01/mastering-css-background-position/"&gt;http://yensdesign.com/2009/01/mastering-css-background-position/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-5938533003140925334?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/5938533003140925334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/10/mastering-css-background-position.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5938533003140925334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5938533003140925334'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/10/mastering-css-background-position.html' title='Mastering CSS background-position'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-1596324274555881694</id><published>2010-10-02T08:38:00.000+07:00</published><updated>2010-10-02T08:38:42.987+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webp'/><category scheme='http://www.blogger.com/atom/ns#' term='jpeg'/><title type='text'>WEBP will replace JPEG in the future???</title><content type='html'>&lt;a href="http://code.google.com/speed/webp/gallery.html"&gt;http://code.google.com/speed/webp/gallery.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-1596324274555881694?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/1596324274555881694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/10/webp-will-replace-jpeg-in-future.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/1596324274555881694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/1596324274555881694'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/10/webp-will-replace-jpeg-in-future.html' title='WEBP will replace JPEG in the future???'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-76867891279366750</id><published>2010-08-05T14:55:00.000+07:00</published><updated>2010-08-05T14:55:16.244+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='node.js'/><title type='text'>Learning Server-Side JavaScript with Node.js</title><content type='html'>&lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; is all the buzz at the moment, and makes creating high performance, real-time web applications easy. It allows JavaScript to be used end to end, both on the server and on the client. This tutorial will walk you through the installation of Node and your first “Hello World” program, to building a scalable streaming Twitter server.&lt;br /&gt;&lt;span id="more-10044"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;What is Node.js? &lt;/h2&gt;&lt;div class="tutorial_image"&gt;&lt;a href="http://nodejs.org/"&gt;&lt;br /&gt;&lt;img alt="NodeJS" original="http://nettuts.s3.amazonaws.com/601_node/node.jpg" src="http://nettuts.s3.amazonaws.com/601_node/node.jpg" style="display: inline;" /&gt;&lt;br /&gt;&lt;/a&gt; &lt;/div&gt;JavaScript has traditionally only run in the web browser, but recently there has been considerable interest in bringing it to the server side as well, thanks to the &lt;a href="http://commonjs.org/"&gt;CommonJS project&lt;/a&gt;.  Other server-side JavaScript environments include &lt;a href="http://www.jaxer.org/"&gt;Jaxer&lt;/a&gt; and &lt;a href="http://narwhaljs.org/"&gt;Narwhal&lt;/a&gt;.  However, &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; is a bit different from these solutions, because it is event-based rather than thread based. Web servers like Apache that are used to serve PHP and other CGI scripts are thread based because they spawn a system thread for every incoming request. While this is fine for many applications, the thread based model does not scale well with many long-lived connections like you would need in order to serve real-time applications like &lt;a href="http://friendfeed.com/"&gt;Friendfeed&lt;/a&gt; or &lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt;.  &lt;br /&gt;&lt;blockquote class="pullquote pqRight"&gt;“Every I/O operation in Node.js is asynchronous…” &lt;/blockquote&gt;Node.js, uses an event loop instead of threads, and is able to scale to millions of concurrent connections. It takes advantage of the fact that servers spend most of their time waiting for I/O operations, like reading a file from a hard drive, accessing an external web service or waiting for a file to finish being uploaded, because these operations are much slower than in memory operations. Every I/O operation in Node.js is asynchronous, meaning that the server can continue to process incoming requests while the I/O operation is taking place. JavaScript is extremely well suited to event-based programming because it has anonymous functions and closures which make defining inline callbacks a cinch, and JavaScript developers already know how to program in this way. This event-based model makes Node.js very fast, and makes scaling real-time applications very easy.&lt;br /&gt;&lt;hr /&gt;&lt;h2&gt;Step 1 Installation &lt;/h2&gt;Node.js runs on Unix based systems, such as Mac OS X, Linux, and FreeBSD. Unfortunately, Windows is not yet supported, so if you are a Windows user, you can install it on Ubuntu Linux using Virtualbox. To do so, follow &lt;a href="http://www.psychocats.net/ubuntu/virtualbox"&gt;this tutorial&lt;/a&gt;.  You will need to use the terminal to install and run Node.js.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download the latest release of Node.js from &lt;a href="http://nodejs.org/#download"&gt;nodejs.org&lt;/a&gt; (the latest version at the time of this writing is 0.1.31) and unzip it.&lt;/li&gt;&lt;li&gt;Open the terminal, and run the following commands. &lt;br /&gt;&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;ol class="dp-xml" start="1"&gt;&lt;li class="alt"&gt;cd&amp;nbsp;/path/to/nodejs&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;make&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;sudo&amp;nbsp;make&amp;nbsp;install&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="html" name="code" style="display: none;"&gt;cd /path/to/nodejs&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;  &lt;/pre&gt;A lot of messages will be outputted to the terminal as Node.js is compiled and installed.     &lt;/li&gt;&lt;/ol&gt;&lt;div class="tutorial_image"&gt;&lt;img border="0" original="http://nettuts.s3.amazonaws.com/601_node/1.jpg" src="http://nettuts.s3.amazonaws.com/601_node/1.jpg" style="display: inline;" /&gt;&lt;/div&gt;&lt;hr /&gt;&lt;h2&gt;Step 2 Hello World! &lt;/h2&gt;Every new technology starts with a “Hello World!” tutorial, so we will create a simple HTTP server that serves up that message. First, however, you have to understand the Node.js module system. In Node, functionality is encapsulated in modules which must be loaded in order to be used. There are many modules listed in the &lt;a href="http://nodejs.org/api.html"&gt;Node.js documentation&lt;/a&gt;.  You load these modules by using the &lt;code&gt;require&lt;/code&gt; function like so: &lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;sys&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"sys"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="js" name="code" style="display: none;"&gt;var sys = require("sys");&lt;br /&gt;&lt;/pre&gt;This loads the sys module, which contains functions for dealing with system level tasks like printing output to the terminal. To use a function in a module, you call it on the variable that you stored the module in, in our case &lt;code&gt;sys&lt;/code&gt;.&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;sys.puts(&lt;span class="string"&gt;"Hello&amp;nbsp;World!"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="js" name="code" style="display: none;"&gt;sys.puts("Hello World!");&lt;br /&gt;&lt;/pre&gt;Running these two lines is as simple as running the &lt;code&gt;node&lt;/code&gt; command with the filename of the javascript file as an argument.&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;ol class="dp-xml" start="1"&gt;&lt;li class="alt"&gt;node&amp;nbsp;test.js&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="html" name="code" style="display: none;"&gt;node test.js&lt;br /&gt;&lt;/pre&gt;This will output “Hello World!” to the command line when run.&lt;br /&gt;&lt;div class="tutorial_image"&gt;&lt;img border="0" original="http://nettuts.s3.amazonaws.com/601_node/2.jpg" src="http://nettuts.s3.amazonaws.com/601_node/2.jpg" style="display: inline;" /&gt;&lt;/div&gt;To create an HTTP server, you must &lt;code&gt;require&lt;/code&gt; the &lt;code&gt;http&lt;/code&gt; module.&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;sys&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"sys"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"http"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;http.createServer(&lt;span class="keyword"&gt;function&lt;/span&gt;(request,&amp;nbsp;response)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.sendHeader(200,&amp;nbsp;{&lt;span class="string"&gt;"Content-Type"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"text/html"&lt;/span&gt;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.write(&lt;span class="string"&gt;"Hello&amp;nbsp;World!"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;}).listen(8080);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;sys.puts(&lt;span class="string"&gt;"Server&amp;nbsp;running&amp;nbsp;at&amp;nbsp;http://localhost:8080/"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="js" name="code" style="display: none;"&gt;var sys = require("sys"),&lt;br /&gt;    http = require("http");&lt;br /&gt;&lt;br /&gt;http.createServer(function(request, response) {&lt;br /&gt;    response.sendHeader(200, {"Content-Type": "text/html"});&lt;br /&gt;    response.write("Hello World!");&lt;br /&gt;    response.close();&lt;br /&gt;}).listen(8080);&lt;br /&gt;&lt;br /&gt;sys.puts("Server running at http://localhost:8080/");&lt;br /&gt;&lt;/pre&gt;This script imports the &lt;code&gt;sys&lt;/code&gt; and &lt;code&gt;http&lt;/code&gt; modules, and creates an HTTP server.  The anonymous function that is passed into &lt;code&gt;http.createServer&lt;/code&gt; will be called whenever a request comes in to the server. Once the server is created, it is told to listen on port 8080. When a request to the server comes in, we first send HTTP headers with the content type and status code of 200 (successful). Then we send “Hello World!” and close the connection. You might notice that we have to explicitly close the connection. This will make it very easy to stream data to the client without closing the connection. If you run this script and go to &lt;code&gt;http://localhost:8080/&lt;/code&gt; in your browser, you will see “Hello World!”&lt;br /&gt;&lt;div class="tutorial_image"&gt;&lt;img border="0" original="http://nettuts.s3.amazonaws.com/601_node/3.jpg" src="http://nettuts.s3.amazonaws.com/601_node/3.jpg" style="display: inline;" /&gt;&lt;/div&gt;&lt;hr /&gt;&lt;h2&gt;Step 3 A Simple Static File Server &lt;/h2&gt;OK, so we have built an HTTP server, but it doesn’t send anything except for “Hello World,” no matter what URL you go to. Any HTTP server must be able to send static files such as HTML files, images and other files. The following code does just that:&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;sys&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"sys"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"http"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"url"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"path"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"fs"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;http.createServer(&lt;span class="keyword"&gt;function&lt;/span&gt;(request,&amp;nbsp;response)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;uri&amp;nbsp;=&amp;nbsp;url.parse(request.url).pathname;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;filename&amp;nbsp;=&amp;nbsp;path.join(process.cwd(),&amp;nbsp;uri);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path.exists(filename,&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;(exists)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;(!exists)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.sendHeader(404,&amp;nbsp;{&lt;span class="string"&gt;"Content-Type"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"text/plain"&lt;/span&gt;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.write(&lt;span class="string"&gt;"404&amp;nbsp;Not&amp;nbsp;Found\n"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;return&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.readFile(filename,&amp;nbsp;&lt;span class="string"&gt;"binary"&lt;/span&gt;,&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;(err,&amp;nbsp;file)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;(err)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.sendHeader(500,&amp;nbsp;{&lt;span class="string"&gt;"Content-Type"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"text/plain"&lt;/span&gt;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.write(err&amp;nbsp;+&amp;nbsp;&lt;span class="string"&gt;"\n"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;return&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.sendHeader(200);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.write(file,&amp;nbsp;&lt;span class="string"&gt;"binary"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;}).listen(8080);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;sys.puts(&lt;span class="string"&gt;"Server&amp;nbsp;running&amp;nbsp;at&amp;nbsp;http://localhost:8080/"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="js" name="code" style="display: none;"&gt;var sys = require("sys"),&lt;br /&gt;    http = require("http"),&lt;br /&gt;    url = require("url"),&lt;br /&gt;    path = require("path"),&lt;br /&gt;    fs = require("fs");&lt;br /&gt;&lt;br /&gt;http.createServer(function(request, response) {&lt;br /&gt;    var uri = url.parse(request.url).pathname;&lt;br /&gt;    var filename = path.join(process.cwd(), uri);&lt;br /&gt;    path.exists(filename, function(exists) {&lt;br /&gt;     if(!exists) {&lt;br /&gt;      response.sendHeader(404, {"Content-Type": "text/plain"});&lt;br /&gt;      response.write("404 Not Found\n");&lt;br /&gt;      response.close();&lt;br /&gt;      return;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     fs.readFile(filename, "binary", function(err, file) {&lt;br /&gt;      if(err) {&lt;br /&gt;       response.sendHeader(500, {"Content-Type": "text/plain"});&lt;br /&gt;       response.write(err + "\n");&lt;br /&gt;       response.close();&lt;br /&gt;       return;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      response.sendHeader(200);&lt;br /&gt;      response.write(file, "binary");&lt;br /&gt;      response.close();&lt;br /&gt;     });&lt;br /&gt;    });&lt;br /&gt;}).listen(8080);&lt;br /&gt;&lt;br /&gt;sys.puts("Server running at http://localhost:8080/");&lt;br /&gt;&lt;/pre&gt;We start by requiring all of the modules that we will need in our code.  This includes the &lt;code&gt;sys&lt;/code&gt;, &lt;code&gt;http&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, and &lt;code&gt;fs&lt;/code&gt; or filesystem modules.  Next we create an HTTP server like we did before.  This time, we will use the &lt;code&gt;url&lt;/code&gt; module to parse the incoming URL of the request and find the pathname of the file being accessed. We find the actual filename on the server’s hard drive by using &lt;code&gt;path.join&lt;/code&gt;, which joins &lt;code&gt;process.cwd()&lt;/code&gt;, or the current working directory, with the path to the file being requested. Next, we check if the file exists, which is an asynchronous operation and thus requires a callback. If the file does not exist, a 404 Not Found message is sent to the user and the function returns. Otherwise, we read the file using the &lt;code&gt;fs&lt;/code&gt; module using the “binary” encoding, and send the file to the user. If there is an error reading the file, we present the error message to the user, and close the connection. Because all of this is asynchronous, the server is able to serve other requests while reading the file from the disk no matter how large it is.&lt;br /&gt;If you run this example, and navigate to &lt;code&gt;http://localhost:8080/path/to/file&lt;/code&gt;, that file will be shown in your browser.&lt;br /&gt;&lt;div class="tutorial_image"&gt;&lt;img border="0" original="http://nettuts.s3.amazonaws.com/601_node/4.jpg" src="http://nettuts.s3.amazonaws.com/601_node/4.jpg" style="display: inline;" /&gt;&lt;/div&gt;&lt;hr /&gt;&lt;h2&gt;Step 4 A Real Time Tweet Streamer &lt;/h2&gt;Building on our static file server, we will build a server in Node.js that streams tweets to a client that is served through our static file server. To start, we will need one extra module in this example: the &lt;code&gt;events&lt;/code&gt; module.  Node has a concept called an &lt;code&gt;EventEmitter&lt;/code&gt;, which is used all over to handle event listeners for asynchronous tasks. Much like in jQuery or another client side JavaScript framework where you bind event listeners to things like mouse clicks, and AJAX requests, Node allows you to bind event listeners to many things, some of which we have already used. These include every I/O operation, such as reading a file, writing a file, checking if a file exists, waiting for HTTP requests, etc. The &lt;code&gt;EventEmitter&lt;/code&gt; abstracts the logic of binding, unbinding, and triggering such event listeners.  We will be using an &lt;code&gt;EventEmitter&lt;/code&gt; to notify listeners when new tweets are loaded. The first few lines of our tweet streamer imports all of the required modules, and defines a function for handling static files, which was taken from our previous example.&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;sys&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"sys"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"http"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"url"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"path"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"fs"&lt;/span&gt;),&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;events&amp;nbsp;=&amp;nbsp;require(&lt;span class="string"&gt;"events"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&lt;span class="keyword"&gt;function&lt;/span&gt;&amp;nbsp;load_static_file(uri,&amp;nbsp;response)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;filename&amp;nbsp;=&amp;nbsp;path.join(process.cwd(),&amp;nbsp;uri);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path.exists(filename,&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;(exists)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;(!exists)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.sendHeader(404,&amp;nbsp;{&lt;span class="string"&gt;"Content-Type"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"text/plain"&lt;/span&gt;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.write(&lt;span class="string"&gt;"404&amp;nbsp;Not&amp;nbsp;Found\n"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;return&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.readFile(filename,&amp;nbsp;&lt;span class="string"&gt;"binary"&lt;/span&gt;,&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;(err,&amp;nbsp;file)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;(err)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.sendHeader(500,&amp;nbsp;{&lt;span class="string"&gt;"Content-Type"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"text/plain"&lt;/span&gt;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.write(err&amp;nbsp;+&amp;nbsp;&lt;span class="string"&gt;"\n"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;return&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.sendHeader(200);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.write(file,&amp;nbsp;&lt;span class="string"&gt;"binary"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="js" name="code" style="display: none;"&gt;var sys = require("sys"),&lt;br /&gt;    http = require("http"),&lt;br /&gt;    url = require("url"),&lt;br /&gt;    path = require("path"),&lt;br /&gt;    fs = require("fs"),&lt;br /&gt;    events = require("events");&lt;br /&gt;&lt;br /&gt;function load_static_file(uri, response) {&lt;br /&gt; var filename = path.join(process.cwd(), uri);&lt;br /&gt; path.exists(filename, function(exists) {&lt;br /&gt;  if(!exists) {&lt;br /&gt;   response.sendHeader(404, {"Content-Type": "text/plain"});&lt;br /&gt;   response.write("404 Not Found\n");&lt;br /&gt;   response.close();&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  fs.readFile(filename, "binary", function(err, file) {&lt;br /&gt;   if(err) {&lt;br /&gt;    response.sendHeader(500, {"Content-Type": "text/plain"});&lt;br /&gt;    response.write(err + "\n");&lt;br /&gt;    response.close();&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   response.sendHeader(200);&lt;br /&gt;   response.write(file, "binary");&lt;br /&gt;   response.close();&lt;br /&gt;  });&lt;br /&gt; });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;We have used the &lt;code&gt;http&lt;/code&gt; module to create a server before, but it is also possible to create an HTTP client using the module. We will be creating an HTTP client to load tweets from Twitter’s public timeline, which is performed by the &lt;code&gt;get_tweets&lt;/code&gt; function.&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;twitter_client&amp;nbsp;=&amp;nbsp;http.createClient(80,&amp;nbsp;&lt;span class="string"&gt;"api.twitter.com"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;tweet_emitter&amp;nbsp;=&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;events.EventEmitter();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;function&lt;/span&gt;&amp;nbsp;get_tweets()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;request&amp;nbsp;=&amp;nbsp;twitter_client.request(&lt;span class="string"&gt;"GET"&lt;/span&gt;,&amp;nbsp;&lt;span class="string"&gt;"/1/statuses/public_timeline.json"&lt;/span&gt;,&amp;nbsp;{&lt;span class="string"&gt;"host"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"api.twitter.com"&lt;/span&gt;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.addListener(&lt;span class="string"&gt;"response"&lt;/span&gt;,&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;(response)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;body&amp;nbsp;=&amp;nbsp;&lt;span class="string"&gt;""&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.addListener(&lt;span class="string"&gt;"data"&lt;/span&gt;,&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;(data)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body&amp;nbsp;+=&amp;nbsp;data;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.addListener(&lt;span class="string"&gt;"end"&lt;/span&gt;,&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;tweets&amp;nbsp;=&amp;nbsp;JSON.parse(body);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;(tweets.length&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tweet_emitter.emit(&lt;span class="string"&gt;"tweets"&lt;/span&gt;,&amp;nbsp;tweets);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;setInterval(get_tweets,&amp;nbsp;5000);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="js" name="code" style="display: none;"&gt;var twitter_client = http.createClient(80, "api.twitter.com");&lt;br /&gt;&lt;br /&gt;var tweet_emitter = new events.EventEmitter();&lt;br /&gt;&lt;br /&gt;function get_tweets() {&lt;br /&gt; var request = twitter_client.request("GET", "/1/statuses/public_timeline.json", {"host": "api.twitter.com"});&lt;br /&gt;&lt;br /&gt; request.addListener("response", function(response) {&lt;br /&gt;  var body = "";&lt;br /&gt;  response.addListener("data", function(data) {&lt;br /&gt;   body += data;&lt;br /&gt;  });&lt;br /&gt;&lt;br /&gt;  response.addListener("end", function() {&lt;br /&gt;   var tweets = JSON.parse(body);&lt;br /&gt;   if(tweets.length &amp;gt; 0) {&lt;br /&gt;    tweet_emitter.emit("tweets", tweets);&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt; });&lt;br /&gt;&lt;br /&gt; request.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;setInterval(get_tweets, 5000);&lt;br /&gt;&lt;/pre&gt;First, we create an HTTP client on port 80 to api.twitter.com, and create a new &lt;code&gt;EventEmitter&lt;/code&gt;.  The &lt;code&gt;get_tweets&lt;/code&gt; function creates an HTTP “GET” request to Twitter’s public timeline, and adds an event listener that will be triggered when Twitter’s servers respond. Because Node.js is asynchronous, the data in the body of the response comes in chunks, which are picked up by the response’s “data” listener. This listener simply appends the chunk to the &lt;code&gt;body&lt;/code&gt; variable. Once all of the chunks have come in, the “end” listener is triggered, and we parse the incoming JSON data. If more than one tweet is returned, we &lt;code&gt;emit&lt;/code&gt; the “tweets” event on our &lt;code&gt;tweet_emitter&lt;/code&gt;, and pass in the array of new tweets. This will trigger all of the event listeners listening for the “tweets” event, and send the new tweets to each client. We retreive the new tweets every five seconds, by using &lt;code&gt;setInterval&lt;/code&gt;.&lt;br /&gt;Finally, we need to create the HTTP server to handle requests.&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;http.createServer(&lt;span class="keyword"&gt;function&lt;/span&gt;(request,&amp;nbsp;response)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;uri&amp;nbsp;=&amp;nbsp;url.parse(request.url).pathname;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;(uri&amp;nbsp;===&amp;nbsp;&lt;span class="string"&gt;"/stream"&lt;/span&gt;)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;listener&amp;nbsp;=&amp;nbsp;tweet_emitter.addListener(&lt;span class="string"&gt;"tweets"&lt;/span&gt;,&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;(tweets)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.sendHeader(200,&amp;nbsp;{&amp;nbsp;&lt;span class="string"&gt;"Content-Type"&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span class="string"&gt;"text/plain"&lt;/span&gt;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.write(JSON.stringify(tweets));&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clearTimeout(timeout);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;timeout&amp;nbsp;=&amp;nbsp;setTimeout(&lt;span class="keyword"&gt;function&lt;/span&gt;()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.sendHeader(200,&amp;nbsp;{&amp;nbsp;&lt;span class="string"&gt;"Content-Type"&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span class="string"&gt;"text/plain"&lt;/span&gt;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.write(JSON.stringify([]));&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.close();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tweet_emitter.removeListener(listener);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;10000);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;else&lt;/span&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;load_static_file(uri,&amp;nbsp;response);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;}).listen(8080);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;sys.puts(&lt;span class="string"&gt;"Server&amp;nbsp;running&amp;nbsp;at&amp;nbsp;http://localhost:8080/"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="js" name="code" style="display: none;"&gt;http.createServer(function(request, response) {&lt;br /&gt;    var uri = url.parse(request.url).pathname;&lt;br /&gt;    if(uri === "/stream") {&lt;br /&gt;&lt;br /&gt;     var listener = tweet_emitter.addListener("tweets", function(tweets) {&lt;br /&gt;      response.sendHeader(200, { "Content-Type" : "text/plain" });&lt;br /&gt;      response.write(JSON.stringify(tweets));&lt;br /&gt;      response.close();&lt;br /&gt;&lt;br /&gt;      clearTimeout(timeout);&lt;br /&gt;     });&lt;br /&gt;&lt;br /&gt;     var timeout = setTimeout(function() {&lt;br /&gt;      response.sendHeader(200, { "Content-Type" : "text/plain" });&lt;br /&gt;      response.write(JSON.stringify([]));&lt;br /&gt;      response.close();&lt;br /&gt;&lt;br /&gt;      tweet_emitter.removeListener(listener);&lt;br /&gt;     }, 10000);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;     load_static_file(uri, response);&lt;br /&gt;    }&lt;br /&gt;}).listen(8080);&lt;br /&gt;&lt;br /&gt;sys.puts("Server running at http://localhost:8080/");&lt;br /&gt;&lt;/pre&gt;Just as we did with our static file server, we create an HTTP server that listens on port 8080. We parse the requested URL, and if the URL is equal to &lt;code&gt;"/stream"&lt;/code&gt;, we will handle it, otherwise we pass the request off to our static file server. Streaming consists of creating a listener to listen for new tweets on our &lt;code&gt;tweet_emitter&lt;/code&gt;, which will be triggered by our &lt;code&gt;get_tweets&lt;/code&gt; function. We also create a timer to kill requests tht last over 10 seconds by sending them an empty array. When new tweets come in, we send the tweets as JSON data, and clear the timer. You will see how this works better after seeing the client side code, which is below. Save it as &lt;code&gt;test.html&lt;/code&gt; in the same directory as the server side JavaScript.&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol class="dp-xml" start="1"&gt;&lt;li class="alt"&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;html&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;head&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;title&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;Tweet&amp;nbsp;Streamer&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;title&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span class="attribute"&gt;type&lt;/span&gt;=&lt;span class="attribute-value"&gt;"text/javascript"&lt;/span&gt;&amp;nbsp;&lt;span class="attribute"&gt;src&lt;/span&gt;=&lt;span class="attribute-value"&gt;"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;script&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;head&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;body&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;ul&lt;/span&gt;&amp;nbsp;&lt;span class="attribute"&gt;id&lt;/span&gt;=&lt;span class="attribute-value"&gt;"tweets"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;ul&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span class="attribute"&gt;type&lt;/span&gt;=&lt;span class="attribute-value"&gt;"text/javascript"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;&lt;span class="attribute"&gt;tweet_list&lt;/span&gt;&amp;nbsp;=&amp;nbsp;$("#tweets");&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;load_tweets()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.getJSON("/stream",&amp;nbsp;function(tweets)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.each(tweets,&amp;nbsp;function()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$("&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;li&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;").html(this.text).prependTo(tweet_list);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;load_tweets();&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(load_tweets,&amp;nbsp;1000);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;script&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;body&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;html&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class="html" name="code" style="display: none;"&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;Tweet Streamer&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.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;ul id="tweets"&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;  &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;  var tweet_list = $("#tweets");&lt;br /&gt;&lt;br /&gt;  function load_tweets() {&lt;br /&gt;   $.getJSON("/stream", function(tweets) {&lt;br /&gt;    $.each(tweets, function() {&lt;br /&gt;     $("&amp;lt;li&amp;gt;").html(this.text).prependTo(tweet_list);&lt;br /&gt;    });&lt;br /&gt;    load_tweets();&lt;br /&gt;   });&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  setTimeout(load_tweets, 1000);&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;/pre&gt;Here, we have a simple HTML page that imports the jQuery library and defines an unordered list to put the tweets in. Our client side JavaScript caches the tweet list, and runs the &lt;code&gt;load_tweets&lt;/code&gt; function after one second. This gives the browser enough time to finish loading the page before we start the AJAX request to the server. The &lt;code&gt;load_tweets&lt;/code&gt; function is very simple: It uses jQuery’s &lt;code&gt;getJSON&lt;/code&gt; function to load &lt;code&gt;/stream&lt;/code&gt;.  When a response comes in, we loop through all of the tweets and prepend them to the tweet list.  Then, we call &lt;code&gt;load_tweets&lt;/code&gt; again. This effectively creates a loop that loads new tweets, which times out after ten seconds because of the timeout on the server. Whenever there are new tweets, they are pushed to the client which maintains a continuous connection to the server. This technique is called long-polling.&lt;br /&gt;If you run the server using &lt;code&gt;node&lt;/code&gt; and go to &lt;code&gt;http://localhost:8080/test.html&lt;/code&gt;, you will see the Twitter public timeline stream into your browser.&lt;br /&gt;&lt;div class="tutorial_image"&gt;&lt;img border="0" original="http://nettuts.s3.amazonaws.com/601_node/5.jpg" src="http://nettuts.s3.amazonaws.com/601_node/5.jpg" style="display: inline;" /&gt;&lt;/div&gt;&lt;hr /&gt;&lt;h2&gt;Next Steps &lt;/h2&gt;Node.js is a very exciting technology that makes it easy to create high performance real time applications. I hope you can see its benefit, and can use it in some of your own applications. Because of Node’s great module system, it is easy to use prewritten code in your application, and there are many third party modules available for just about everything – including database connection layers, templating engines, mail clients, and even entire frameworks connecting all of these things together. You can see a complete list of modules on the &lt;a href="http://wiki.github.com/ry/node/modules"&gt;Node.js wiki&lt;/a&gt;, and more Node tutorials can be found on &lt;a href="http://howtonode.org/"&gt;How To Node&lt;/a&gt;. I would also recommend that you watch a video from JSConf, in which Ryan Dahl, the creator of Node, describes the design philosophy behind Node. That is available &lt;a href="http://blip.tv/file/2899135"&gt;here&lt;/a&gt;.&lt;br /&gt;I hope you have enjoyed this tutorial.  If you have any comments, you can leave one here or send me a message on &lt;a href="http://twitter.com/devongovett"&gt;Twitter&lt;/a&gt;.  Happy noding!&lt;br /&gt;&lt;br /&gt;Source: http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-76867891279366750?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/76867891279366750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/08/learning-server-side-javascript-with.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/76867891279366750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/76867891279366750'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/08/learning-server-side-javascript-with.html' title='Learning Server-Side JavaScript with Node.js'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-2629904792133378502</id><published>2010-08-05T14:04:00.000+07:00</published><updated>2010-08-05T14:04:10.745+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monggoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Redis'/><title type='text'>MongoDB or Redis</title><content type='html'>&lt;h2&gt;MongoDB&lt;/h2&gt;MongoDB is a &lt;a href="http://en.wikipedia.org/wiki/Document-oriented_database"&gt;document oriented database&lt;/a&gt;.  MongoDB stores structured data, as documents:&lt;br /&gt;&lt;div class="code"&gt; &lt;div class="CodeRay"&gt;&lt;pre&gt;&lt;span class="no"&gt;1&lt;/span&gt; {&lt;br /&gt;&lt;span class="no"&gt;2&lt;/span&gt;   &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;: &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;François Beausoleil&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;&lt;span class="no"&gt;3&lt;/span&gt;   &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;: &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;francois@teksol.info&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;&lt;span class="no"&gt;4&lt;/span&gt;   &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;year-of-birth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;: &lt;span class="i"&gt;1973&lt;/span&gt;,&lt;br /&gt;&lt;span class="no"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/span&gt;   &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;: [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;friendly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;ruby&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;coder&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;father&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;]&lt;br /&gt;&lt;span class="no"&gt;6&lt;/span&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Since MongoDB stores structured data, it has a richer query language:&lt;br /&gt;&lt;div class="code"&gt; &lt;div class="CodeRay"&gt;&lt;pre&gt;&lt;span class="no"&gt; 1&lt;/span&gt; &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt; &lt;span class="co"&gt;Find&lt;/span&gt; people that are fathers &lt;span class="co"&gt;OR&lt;/span&gt; coders&lt;br /&gt;&lt;span class="no"&gt; 2&lt;/span&gt; db.people.find( { &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt; : { &lt;span class="gv"&gt;$in&lt;/span&gt; : [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;father&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;coder&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;] } } );&lt;br /&gt;&lt;span class="no"&gt; 3&lt;/span&gt; &lt;br /&gt;&lt;span class="no"&gt; 4&lt;/span&gt; &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt; &lt;span class="co"&gt;Find&lt;/span&gt; people that are fathers &lt;span class="co"&gt;AND&lt;/span&gt; coders&lt;br /&gt;&lt;span class="no"&gt; &lt;strong&gt;5&lt;/strong&gt;&lt;/span&gt; db.people.find( { &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt; : { &lt;span class="gv"&gt;$all&lt;/span&gt; : [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;father&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;coder&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;] } } );&lt;br /&gt;&lt;span class="no"&gt; 6&lt;/span&gt; &lt;br /&gt;&lt;span class="no"&gt; 7&lt;/span&gt; &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt; &lt;span class="co"&gt;Index&lt;/span&gt; the email member of documents&lt;br /&gt;&lt;span class="no"&gt; 8&lt;/span&gt; db.people.ensureIndex({email: &lt;span class="i"&gt;1&lt;/span&gt;});&lt;br /&gt;&lt;span class="no"&gt; 9&lt;/span&gt; &lt;br /&gt;&lt;span class="no"&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/span&gt; &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt; &lt;span class="co"&gt;Query&lt;/span&gt; using the index&lt;br /&gt;&lt;span class="no"&gt;11&lt;/span&gt; db.people.findOne({email: &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;francois@teksol.info&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;})&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Redis&lt;/h2&gt;Redis is a key-value store that is strongly typed. Redis has three types of values: strings, sets and lists. Out of the box, you cannot store structured data in Redis. You have to build the index manually, storing yet other keys.&lt;br /&gt;Redis is conceptually simple.  All operations are either stores or fetches:&lt;br /&gt;&lt;div class="code"&gt; &lt;div class="CodeRay"&gt;&lt;pre&gt;&lt;span class="no"&gt;1&lt;/span&gt; &lt;span class="co"&gt;PUT&lt;/span&gt; key value&lt;br /&gt;&lt;span class="no"&gt;2&lt;/span&gt; &lt;span class="co"&gt;GET&lt;/span&gt; key&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;You can think of Redis as a persistent Hash or Dictionary. The fact that Redis is strongly typed makes some operations very interesting.&lt;br /&gt;&lt;div class="code"&gt; &lt;div class="CodeRay"&gt;&lt;pre&gt;&lt;span class="no"&gt; 1&lt;/span&gt; &lt;span class="c"&gt;# Store other data as serialized JSON object, but we won't be able to query the value itself&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt; 2&lt;/span&gt; &lt;span class="co"&gt;SET&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;people:francois&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;{'name': 'François Beausoleil', 'email': 'francois@teksol.info', 'year-of-birth': 1973, 'tags': ['friendly', 'ruby', 'coder', 'father']}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt; 3&lt;/span&gt; &lt;br /&gt;&lt;span class="no"&gt; 4&lt;/span&gt; &lt;span class="c"&gt;# Build ourselves an index on the email value&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt; &lt;strong&gt;5&lt;/strong&gt;&lt;/span&gt; &lt;span class="co"&gt;SET&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;email:francois@teksol.info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;francois&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt; 6&lt;/span&gt; &lt;br /&gt;&lt;span class="no"&gt; 7&lt;/span&gt; &lt;span class="c"&gt;# Build another index for tags&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt; 8&lt;/span&gt; &lt;span class="co"&gt;SADD&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;tags:friendly&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;francois&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt; 9&lt;/span&gt; &lt;span class="co"&gt;SADD&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;tags:ruby&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;     &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;francois&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/span&gt; &lt;span class="co"&gt;SADD&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;tags:coder&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;francois&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt;11&lt;/span&gt; &lt;span class="co"&gt;SADD&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;tags:father&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;   &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;francois&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt;12&lt;/span&gt; &lt;br /&gt;&lt;span class="no"&gt;13&lt;/span&gt; &lt;span class="c"&gt;# During authentication, we would find the person using the email address&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt;14&lt;/span&gt; &lt;span class="co"&gt;GET&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;email:francois@teksol.info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="no"&gt;16&lt;/span&gt; &lt;span class="c"&gt;# Get the rest of the data&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt;17&lt;/span&gt; &lt;span class="co"&gt;GET&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;people:francois&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt;18&lt;/span&gt; &lt;br /&gt;&lt;span class="no"&gt;19&lt;/span&gt; &lt;span class="c"&gt;# Find the keys that have both father AND coder as tags&lt;/span&gt;&lt;br /&gt;&lt;span class="no"&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;/span&gt; &lt;span class="co"&gt;SINTER&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;tags:father&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="k"&gt;tags:coder&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;So, which one should you choose?  The short answer is “it depends”.&lt;br /&gt;The longer answer is to use the best tool for the job. Storing documents is different than storing simple key values. Of course, both can be used for the same job, but Redis will be easier if you need a simple Hash/Dictionary. Use MongoDB for storing structured data.&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-2629904792133378502?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/2629904792133378502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/08/mongodb-or-redis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2629904792133378502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2629904792133378502'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/08/mongodb-or-redis.html' title='MongoDB or Redis'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-3665205430565386881</id><published>2010-07-16T09:07:00.001+07:00</published><updated>2010-07-16T09:36:43.249+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BigPipe Facebook'/><title type='text'>BigPipe: Pipelining web pages for high performance</title><content type='html'>Site speed is one of the most critical company goals for Facebook. In 2009, we successfully made Facebook site twice as fast, which was blogged in this &lt;a href="http://www.facebook.com/note_redirect.php?note_id=389414033919&amp;amp;h=1520d1c8107efc8f97456084716d8595&amp;amp;url=http%3A%2F%2Fwww.facebook.com%2Fnote.php%3Fnote_id%3D307069903919" target="_blank" title="http://www.facebook.com/note.php?note_id=307069903919"&gt;post&lt;/a&gt;. Several key innovations from our engineering team made this possible. In this blog post, I will describe one of the secret weapons we used called BigPipe that underlies this great technology achievement.&lt;br /&gt;&lt;br /&gt;BigPipe is a fundamental redesign of the dynamic web page serving system. The general idea is to decompose web pages into small chunks called pagelets, and pipeline them through several execution stages inside web servers and browsers. This is similar to the pipelining performed by most modern microprocessors: multiple instructions are pipelined through different execution units of the processor to achieve the best performance. Although BigPipe is a fundamental redesign of the existing web serving process, it does not require changing existing web browsers or servers; it is implemented entirely in PHP and JavaScript.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Motivation&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;To understand BigPipe, it's helpful to take a look at the problems with the existing dynamic web page serving system, which dates back to the early days of the World Wide Web and has not changed much since then. Modern websites have become dramatically more dynamic and interactive than 10 years ago, and the traditional page serving model has not kept up with the speed requirements of today's Internet. In the traditional model, the life cycle of a user request is the following:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Browser sends an HTTP request to web server.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Web server parses the request, pulls data from storage tier then formulates an HTML document and sends it to the client in an HTTP response. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;HTTP response is transferred over the Internet to browser. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Browser parses the response from web server, constructs a DOM tree representation of the HTML document, and downloads CSS and JavaScript resources referenced by the document. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;After downloading CSS resources, browser parses them and applies them to the DOM tree.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;After downloading JavaScript resources, browser parses and executes them.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The traditional model is very inefficient for modern web sites, because a lot of the operations in the system are sequential and can’t be overlapped with each other. Some optimization techniques such as delaying JavaScript downloading, parallelizing resource downloading etc. have been widely adopted in the web community to overcome some of the limitations. However, very few of these optimizations touch the bottleneck caused by the web server and browser executing sequentially. When the web server is busy generating a page, the browser is idle and wasting its cycles doing nothing. When web server finishes generating the page and sends it to the browser, the browser becomes the performance bottleneck and the web server cannot help any more. By overlapping the web server’s generation time with the browser’s rendering time, we can not only reduce the end-to-end latency but also make the initial response of the web page visible to the user much earlier, thereby significantly reducing user perceived latency.&lt;br /&gt;&lt;br /&gt;The overlapping of web server generation time and browser’s render time is especially useful for content-rich web sites like Facebook. A typical Facebook page contains data from many different data sources: friend list, new feeds, ads, and so on. In a traditional page rendering model a user would have to wait until all of these queries have returned data before building the final document and sending it to the user's computer. One slow query holds up the train for everything else.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;How BigPipe works &lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;To exploit the parallelism between web server and browser, BigPipe first breaks web pages into multiple chunks called pagelets. Just as a &lt;a href="http://www.facebook.com/note_redirect.php?note_id=389414033919&amp;amp;h=5fe35816186aa75edbaf9c9338f44eab&amp;amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FInstruction_pipeline" target="_blank" title="http://en.wikipedia.org/wiki/Instruction_pipeline"&gt;pipelining microprocessor&lt;/a&gt; divides an instruction’s life cycle into multiple stages (such as “instruction fetch”, “instruction decode”, “execution”, “register write back” etc.), BigPipe breaks the page generation process into several stages:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Request parsing: web server parses and sanity checks the HTTP request. &lt;br /&gt;&lt;/li&gt;&lt;li&gt; Data fetching: web server fetches data from storage tier.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Markup generation: web server generates HTML markup for the response. &lt;br /&gt;&lt;/li&gt;&lt;li&gt; Network transport: the response is transferred from web server to browser.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; CSS downloading: browser downloads CSS required by the page.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; DOM tree construction and CSS styling: browser constructs DOM tree of the document, and then applies CSS rules on it. &lt;br /&gt;&lt;/li&gt;&lt;li&gt; JavaScript downloading: browser downloads JavaScript resources referenced by the page.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; JavaScript execution: browser executes JavaScript code of the page.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The first three stages are executed by the web server, and the last four stages are executed by the browser. Each pagelet must go through all these stages sequentially, but BigPipe enables several pagelets to be executed simultaneously in different stages.&lt;br /&gt;&lt;br /&gt;&lt;div class="photo photo_none"&gt;&lt;div class="photo_img"&gt;&lt;a href="http://www.facebook.com/photo.php?pid=3988037&amp;amp;op=1&amp;amp;view=all&amp;amp;subj=389414033919&amp;amp;aid=-1&amp;amp;auser=0&amp;amp;oid=389414033919&amp;amp;id=9445547199"&gt;&lt;img class="img" onload="var img = this; onloadRegister(function() { adjustImage(img); });" src="http://sphotos.ak.fbcdn.net/hphotos-ak-snc3/hs539.snc3/30586_396762827199_9445547199_3988037_2012363_n.jpg" style="width: 460px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="caption"&gt;Pagelets in Facebook home page. Each rectangle corresponds to one pagelet.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The picture above uses Facebook’s home page as an example to demonstrate how web pages are decomposed into pagelets. The home page consists of several pagelets: “composer pagelet”, “navigation pagelet”, “news feed pagelet”, “request box pagelet”, “ads pagelet”, “friend suggestion box” and “connection box”, etc. Each of them is independent of each. When the "navigation pagelet" is displayed to the user, the "news feed pagelet" can still be being generated at the server.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In BigPipe, the life cycle of a user request is the following: The browser sends an HTTP request to web server. After receiving the HTTP request and performing some sanity check on it, web server immediately sends back an unclosed HTML document that includes an HTML  tag and the first part of the  tag. The  tag includes BigPipe’s JavaScript library to interpret pagelet responses to be received later. In the  tag, there is a template that specifies the logical structure of page and the placeholders for pagelets. For example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;lt;div id=”left_column”&amp;gt;&lt;br /&gt;&lt;span&gt;         &amp;lt;div id=”pagelet_navigation”&amp;gt;&amp;lt;/&lt;/span&gt;&lt;wbr&gt;&lt;/wbr&gt;&lt;span class="word_break"&gt;&lt;/span&gt;div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=”middle_column”&amp;gt;&lt;br /&gt;&lt;span&gt;         &amp;lt;div id=”pagelet_composer”&amp;gt;&amp;lt;/di&lt;/span&gt;&lt;wbr&gt;&lt;/wbr&gt;&lt;span class="word_break"&gt;&lt;/span&gt;v&amp;gt;&lt;br /&gt;&amp;lt;div id=”pagelet_stream”&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=”right_column”&amp;gt;&lt;br /&gt;&amp;lt;div id=”pagelet_pymk”&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=”pagelet_ads”&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;span&gt;         &amp;lt;div id=”pagelet_connect”&amp;gt;&amp;lt;/div&lt;/span&gt;&lt;wbr&gt;&lt;/wbr&gt;&lt;span class="word_break"&gt;&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;div&gt;&lt;div id="”left_column”"&gt; &lt;br /&gt;After flushing the first response to the client, web server continues to generate pagelets one by one. As soon as a pagelet is generated, its response is flushed to the client immediately in a JSON-encoded object that includes all the CSS, JavaScript resources needed for the pagelet, and its HTML content, as well as some meta data. For example:&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &lt;script type="text/javascript"&gt;&lt;span&gt;    big_pipe.onPageletArrive({&lt;/span&gt;&lt;wbr&gt;&lt;span class="word_break"&gt;&lt;/span&gt;id: “pagelet_composer”, content=&lt;html&gt;, css=[..], js=[..], …})&lt;/script&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;span&gt;     big_pipe.onPageletArrive({&lt;/span&gt;&lt;wbr&gt;&lt;/wbr&gt;&lt;span class="word_break"&gt;&lt;/span&gt;id: “pagelet_composer”, content=&amp;lt;HTML&amp;gt;, css=[..], js=[..], …})&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;At the client side, upon receiving a pagelet response via “onPageletArrive” call, BigPipe’s JavaScript library first downloads its CSS resources; after the CSS resources are downloaded, BigPipe displays the pagelet by setting its corresponding placeholder div’s innerHTML to the pagelet’s HTML markup. Multiple pagelets’ CSS can be downloaded at the same time, and they can be displayed out-of-order depending on whose CSS download finishes earlier. In BigPipe, JavaScript resource is given lower priority than CSS and page content. Therefore, BigPipe won’t start downloading JavaScript for any pagelet until all pagelets in the page have been displayed. After that all pagelets’ JavaScript are downloaded asynchronously. Pagelet’s JavaScript initialization code would then be executed out-of-order depending on whose JavaScript download finishes earlier.&lt;br /&gt;&lt;br /&gt;The end result of this highly parallel system is that several pagelets are executed simultaneously in different stages. For example, the browser can be downloading CSS resources for three pagelets while rendering the content for another pagelet, and meanwhile the server is still generating the response for yet another pagelet. From the user’s perspective, the page is rendered progressively. The initial page content becomes visible much earlier, which dramatically improves user perceived latency of the page. To see the difference for yourself, you can try the following links: &lt;a href="http://www.facebook.com/note_redirect.php?note_id=389414033919&amp;amp;h=7881ebc6175d8c06d62bb604e354b8ae&amp;amp;url=http%3A%2F%2Fwww.facebook.com%2Fhome.php%3Fbig_pipe%3Dsingleflush" target="_blank" title="http://www.facebook.com/home.php?big_pipe=singleflush"&gt;Traditional model&lt;/a&gt; and &lt;a href="http://www.facebook.com/note_redirect.php?note_id=389414033919&amp;amp;h=c3b197ac9970238bbf1f81b97560d4c1&amp;amp;url=http%3A%2F%2Fwww.facebook.com%2Fhome.php%3Fbig_pipe%3Dpipeline" target="_blank" title="http://www.facebook.com/home.php?big_pipe=pipeline"&gt;BigPipe&lt;/a&gt;. The first link renders the page in the traditional single flush model. The second link renders the page in BigPipe’s pipeline model. The difference between the two pages’ load times will be much more significant if your browser version is old, your network speed is slow, and your browser cache is not warmed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Performance results&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;The graph below shows the performance data comparing the 75th percentile user perceived latency for seeing the most important content in a page (e.g. news feed is considered the most important content on Facebook home page) on traditional model and BigPipe. The data is collected by loading Facebook home page 50 times using browsers with cold browser cache. The graph shows that BigPipe reduces user perceived latency by half in most browsers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="photo photo_none"&gt;&lt;div class="photo_img"&gt;&lt;a href="http://www.facebook.com/photo.php?pid=3988332&amp;amp;op=1&amp;amp;view=all&amp;amp;subj=389414033919&amp;amp;aid=-1&amp;amp;auser=0&amp;amp;oid=389414033919&amp;amp;id=9445547199"&gt;&lt;img class="img" onload="var img = this; onloadRegister(function() { adjustImage(img); });" src="http://sphotos.ak.fbcdn.net/hphotos-ak-snc3/hs539.snc3/30586_396772147199_9445547199_3988332_604391_n.jpg" style="width: 460px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="caption"&gt;Time to interact latency on Facebook's home page&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It is worth noting that BigPipe was inspired by pipelining microprocessors. However, there are some differences between the pipelining performed by them. For example, although most stages in BigPipe can only operate on one pagelet at a time, some stages such as CSS downloading and JavaScript downloading can operate on multiple pagelets simultaneously, which is similar to superscalar microprocessors. Another important difference is that in BigPipe, we have implemented a ‘barrier’ concept borrowed from parallel programming, where all pagelets have to finish a particular stage, e.g. pagelet displaying stage, before any one of them can proceed further to download JavaScript and execute them. &lt;br /&gt;&lt;br /&gt;At Facebook, we encourage thinking outside the box. We are constantly innovating on new technologies to make our site faster.&lt;br /&gt;&lt;br /&gt;&lt;i&gt; Changhao Jiang is a Research Scientist at Facebook who enjoys making the site faster in innovative ways.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Source:http://www.facebook.com/note.php?note_id=389414033919 &lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-3665205430565386881?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/3665205430565386881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/07/bigpipe-pipelining-web-pages-for-high.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3665205430565386881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3665205430565386881'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/07/bigpipe-pipelining-web-pages-for-high.html' title='BigPipe: Pipelining web pages for high performance'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-6351665376094969641</id><published>2010-07-16T09:05:00.000+07:00</published><updated>2010-07-16T09:05:07.008+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software behind Facebook'/><title type='text'>Exploring the software behind Facebook</title><content type='html'>&lt;h3&gt;Facebook’s scaling challenge&lt;/h3&gt;Before we get into the details, here are a few factoids to give you an idea of the scaling challenge that Facebook has to deal with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Facebook serves &lt;strong&gt;570 billion page views per month&lt;/strong&gt; (according to Google Ad Planner).&lt;/li&gt;&lt;li&gt;There are more photos on Facebook than all other photo sites combined (including sites like Flickr).&lt;/li&gt;&lt;li&gt;More than &lt;strong&gt;3 billion photos&lt;/strong&gt; are uploaded every month.&lt;/li&gt;&lt;li&gt;Facebook’s systems serve &lt;strong&gt;1.2 million photos per second&lt;/strong&gt;. This doesn’t include the images served by Facebook’s CDN.&lt;/li&gt;&lt;li&gt;More than &lt;strong&gt;25 billion pieces of content&lt;/strong&gt; (status updates, comments, etc) are shared every month.&lt;/li&gt;&lt;li&gt;Facebook has more than &lt;strong&gt;30,000 servers&lt;/strong&gt; (and this number is from last year!)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Software that helps Facebook scale&lt;/h3&gt;In some ways Facebook is still a LAMP site (kind of), but it has had to change and extend its operation to incorporate a lot of other elements and services, and modify the approach to existing ones.&lt;br /&gt;For example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Facebook still uses PHP, but it has built a compiler for it so it can be turned into native code on its web servers, thus boosting performance.&lt;/li&gt;&lt;li&gt;Facebook uses Linux, but has optimized it for its own purposes (especially in terms of network throughput).&lt;/li&gt;&lt;li&gt;Facebook uses MySQL, but primarily as a key-value persistent storage, moving joins and logic onto the web servers since optimizations are easier to perform there (on the “other side” of the Memcached layer).&lt;/li&gt;&lt;/ul&gt;Then there are the custom-written systems, like Haystack, a highly scalable object store used to serve Facebook’s immense amount of photos, or Scribe, a logging system that can operate at the scale of Facebook (which is far from trivial).&lt;br /&gt;But enough of that. Let’s present (some of) the software that Facebook uses to provide us all with the world’s largest social network site.&lt;br /&gt;&lt;h4&gt;Memcached&lt;/h4&gt;&lt;a href="http://memcached.org/"&gt;Memcached&lt;/a&gt; is by now one of the most famous pieces of software on the internet. It’s a distributed memory caching system which Facebook (and a ton of other sites) use as a caching layer between the web servers and MySQL servers (since database access is relatively slow). Through the years, Facebook has made a ton of optimizations to Memcached and the surrounding software (like optimizing the network stack).&lt;br /&gt;Facebook runs thousands of Memcached servers with tens of terabytes of cached data at any one point in time. It is likely the world’s largest Memcached installation.&lt;br /&gt;&lt;h4&gt;HipHop for PHP&lt;/h4&gt;PHP, being a scripting language, is relatively slow when compared to code that runs natively on a server. &lt;a href="http://wiki.github.com/facebook/hiphop-php/"&gt;HipHop&lt;/a&gt; converts PHP into C++ code which can then be compiled for better performance. This has allowed Facebook to get much more out of its web servers since Facebook relies heavily on PHP to serve content.&lt;br /&gt;A small team of engineers (initially just three of them) at Facebook spent 18 months developing HipHop, and it is now live in production.&lt;br /&gt;&lt;h4&gt;Haystack&lt;/h4&gt;&lt;a href="http://www.facebook.com/note.php?note_id=76191543919"&gt;Haystack&lt;/a&gt; is Facebook’s high-performance photo storage/retrieval system (strictly speaking, Haystack is an object store, so it doesn’t necessarily have to store photos). It has a ton of work to do; there are more than 20 billion uploaded photos on Facebook, and each one is saved in four different resolutions, resulting in more than 80 billion photos.&lt;br /&gt;And it’s not just about being able to handle billions of photos, performance is critical. As we mentioned previously, Facebook serves around 1.2 million photos &lt;em&gt;per second&lt;/em&gt;, a number which doesn’t include images served by Facebook’s CDN. That’s a staggering number.&lt;br /&gt;&lt;h4&gt;BigPipe&lt;/h4&gt;&lt;a href="http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919"&gt;BigPipe&lt;/a&gt; is a dynamic web page serving system that Facebook has developed. Facebook uses it to serve each web page in sections (called “pagelets”) for optimal performance.&lt;br /&gt;For example, the chat window is retrieved separately, the news feed is retrieved separately, and so on. These pagelets can be retrieved in parallel, which is where the performance gain comes in, and it also gives users a site that works even if some part of it would be deactivated or broken.&lt;br /&gt;&lt;h4&gt;Cassandra&lt;/h4&gt;&lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt; is a distributed storage system with no single point of failure. It’s one of the poster children for the NoSQL movement and has been made open source (it’s even become an Apache project). Facebook uses it for its Inbox search.&lt;br /&gt;Other than Facebook, a number of other services use it, for example Digg. We’re even considering some uses for it here at Pingdom.&lt;br /&gt;&lt;h4&gt;Scribe&lt;/h4&gt;&lt;a href="http://github.com/facebook/scribe"&gt;Scribe&lt;/a&gt; is a flexible logging system that Facebook uses for a multitude of purposes internally. It’s been built to be able to handle logging at the scale of Facebook, and automatically handles new logging categories as they show up (Facebook has hundreds).&lt;br /&gt;&lt;h4&gt;Hadoop and Hive&lt;/h4&gt;&lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt; is an open source map-reduce implementation that makes it possible to perform calculations on massive amounts of data. Facebook uses this for data analysis (and as we all know, Facebook has massive amounts of data). &lt;a href="http://hadoop.apache.org/hive/"&gt;Hive&lt;/a&gt; originated from within Facebook, and makes it possible to use SQL queries against Hadoop, making it easier for non-programmers to use.&lt;br /&gt;Both Hadoop and Hive are open source (Apache projects) and are used by a number of big services, for example Yahoo and Twitter.&lt;br /&gt;&lt;h4&gt;Thrift&lt;/h4&gt;Facebook uses several different languages for its different services. PHP is used for the front-end, Erlang is used for Chat, Java and C++ are also used in several places (and perhaps other languages as well). &lt;a href="http://incubator.apache.org/thrift/"&gt;Thrift&lt;/a&gt; is an internally developed cross-language framework that ties all of these different languages together, making it possible for them to talk to each other. This has made it much easier for Facebook to keep up its cross-language development.&lt;br /&gt;Facebook has made Thrift open source and support for even more languages has been added.&lt;br /&gt;&lt;h4&gt;Varnish&lt;/h4&gt;&lt;a href="http://varnish-cache.org/"&gt;Varnish&lt;/a&gt; is an HTTP accelerator which can act as a load balancer and also cache content which can then be served lightning-fast.&lt;br /&gt;Facebook uses Varnish to serve photos and profile pictures, handling billions of requests every day. Like almost everything Facebook uses, Varnish is open source.&lt;br /&gt;&lt;h3&gt;Other things that help Facebook run smoothly&lt;/h3&gt;We have mentioned some of the software that makes up Facebook’s system(s) and helps the service scale properly. But handling such a large system is a complex task, so we thought we would list a few more things that Facebook does to keep its service running smoothly.&lt;br /&gt;&lt;h4&gt;Gradual releases and dark launches&lt;/h4&gt;Facebook has a system they called Gatekeeper that lets them run different code for different sets of users (it basically introduces different conditions in the code base). This lets Facebook do gradual releases of new features, A/B testing, activate certain features only for Facebook employees, etc.&lt;br /&gt;Gatekeeper also lets Facebook do something called “dark launches”, which is to activate elements of a certain feature behind the scenes before it goes live (without users noticing since there will be no corresponding UI elements). This acts as a real-world stress test and helps expose bottlenecks and other problem areas before a feature is officially launched. Dark launches are usually done two weeks before the actual launch.&lt;br /&gt;&lt;h4&gt;Profiling of the live system&lt;/h4&gt;Facebook carefully monitors its systems (something we here at Pingdom of course approve of), and interestingly enough it also monitors the performance of every single PHP function in the live production environment. This profiling of the live PHP environment is done using an open source tool called &lt;a href="http://pecl.php.net/package/xhprof"&gt;XHProf&lt;/a&gt;.&lt;br /&gt;&lt;h4&gt;Gradual feature disabling for added performance&lt;/h4&gt;If Facebook runs into performance issues, there are a large number of levers that let them gradually disable less important features to boost performance of Facebook’s core features.&lt;br /&gt;&lt;h4&gt;The things we didn’t mention&lt;/h4&gt;We didn’t go much into the hardware side in this article, but of course that is also an important aspect when it comes to scalability. For example, like many other big sites, Facebook uses a CDN to help serve static content. And then of course there is &lt;a href="http://www.facebook.com/prinevilledatacenter"&gt;the huge data center&lt;/a&gt; Facebook is building in Oregon to help it scale out with even more servers.&lt;br /&gt;And aside from what we have already mentioned, there is of course a ton of other software involved. However, we hope we were able to highlight some of the more interesting choices Facebook has made.&lt;br /&gt;&lt;h3&gt;Facebook’s love affair with open source&lt;/h3&gt;We can’t complete this article without mentioning how much Facebook likes open source. Or perhaps we should say, “loves”.&lt;br /&gt;Not only is Facebook using (and contributing to) open source software such as Linux, Memcached, MySQL, Hadoop, and many others, it has also made much of its internally developed software available as open source.&lt;br /&gt;Examples of open source projects that originated from inside Facebook include HipHop, Cassandra, Thrift and Scribe. Facebook has also open-sourced Tornado, a high-performance web server framework developed by the team behind FriendFeed (which Facebook bought in August 2009).&lt;br /&gt;(A list of open source software that Facebook is involved with can be found on &lt;a href="http://facebook.com/opensource"&gt;Facebook’s Open Source page&lt;/a&gt;.)&lt;br /&gt;&lt;h3&gt;More scaling challenges to come&lt;/h3&gt;Facebook has been growing at an incredible pace. Its user base is increasing almost exponentially and is now close to half a billion active users, and who knows what it will be by the end of the year. The site seems to be growing with about 100 million users every six months or so.&lt;br /&gt;Facebook even has a dedicated “growth team” that constantly tries to figure out how to make people use and interact with the site even more.&lt;br /&gt;This rapid growth means that Facebook will keep running into various performance bottlenecks as it’s challenged by more and more page views, searches, uploaded images, status messages, and all the other ways that Facebook users interact with the site and each other.&lt;br /&gt;But this is just a fact of life for a service like Facebook. Facebook’s engineers will keep iterating and coming up with new ways to scale (it’s not just about adding more servers). For example, Facebook’s photo storage system has already been completely rewritten several times as the site has grown.&lt;br /&gt;So, we’ll see what the engineers at Facebook come up with next. We bet it’s something interesting. After all, they are scaling a mountain that most of us can only dream of; a site with more users than most countries. When you do that, you better get creative.&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-6351665376094969641?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/6351665376094969641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/07/exploring-software-behind-facebook.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6351665376094969641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6351665376094969641'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/07/exploring-software-behind-facebook.html' title='Exploring the software behind Facebook'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-5344628978054991607</id><published>2010-07-14T12:26:00.000+07:00</published><updated>2010-07-14T12:26:13.204+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZendFrmaework for sharing hostin'/><title type='text'>Using ZendFrmaework for sharing hosting</title><content type='html'>Here's a short tip for those who need to publish a Zend Framework project on a shared hosting. The typical project structure for a Zend Framework project is something like this:&lt;br /&gt;view sourceprint?&lt;br /&gt;1.projectname/&lt;br /&gt;2.   application/&lt;br /&gt;3.      controllers/&lt;br /&gt;4.      views/&lt;br /&gt;5.         scripts/&lt;br /&gt;6.   library/&lt;br /&gt;7.   public/&lt;br /&gt;8.   tests/&lt;br /&gt;&lt;br /&gt;The public directory contains all the files that should be directly accessible via the web server, so you must set your web server's document root to this directory.&lt;br /&gt;The problem is, in most shared hosting setups you can't change the document root, and the root directory of your account (i.e. the uppermost level you see when you connect via FTP) is the public document root.&lt;br /&gt;&lt;br /&gt;To solve this problem without changing the above directory structure, you can remove the .htaccess file from the public directory, and place this one in the root directory instead:&lt;br /&gt;view sourceprint?&lt;br /&gt;01.RewriteEngine On&lt;br /&gt;02.  &lt;br /&gt;03.RewriteRule ^\.htaccess$ - [F]&lt;br /&gt;04.  &lt;br /&gt;05.RewriteCond %{REQUEST_URI} =""&lt;br /&gt;06.RewriteRule ^.*$ /public/index.php [NC,L]&lt;br /&gt;07.  &lt;br /&gt;08.RewriteCond %{REQUEST_URI} !^/public/.*$&lt;br /&gt;09.RewriteRule ^(.*)$ /public/$1&lt;br /&gt;10.  &lt;br /&gt;11.RewriteCond %{REQUEST_FILENAME} -f&lt;br /&gt;12.RewriteRule ^.*$ - [NC,L]&lt;br /&gt;13.  &lt;br /&gt;14.RewriteRule ^public/.*$ /public/index.php [NC,L]&lt;br /&gt;&lt;br /&gt;This is an effective way to "move" the document root up one level to the public directory.&lt;br /&gt;Source:http://www.alberton.info/zend_framework_mod_rewrite_shared_hosting.html&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-5344628978054991607?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/5344628978054991607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/07/using-zendfrmaework-for-sharing-hosting.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5344628978054991607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5344628978054991607'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/07/using-zendfrmaework-for-sharing-hosting.html' title='Using ZendFrmaework for sharing hosting'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-2749646044163630782</id><published>2010-07-01T16:51:00.003+07:00</published><updated>2010-07-01T16:58:20.535+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger Navbar'/><title type='text'>Remove Blogger Navbar and top space</title><content type='html'>&lt;b&gt;Step1:&lt;/b&gt;&lt;br /&gt;Add this line above Variable definitions&lt;br /&gt;#navbar-iframe{ display: none !important; }&lt;br /&gt;&lt;b&gt;Step2:&lt;/b&gt;&lt;br /&gt;Update CSS:&lt;br /&gt;Add this in body {}&lt;br /&gt;margin-top:0px;&lt;br /&gt;position: relative;&lt;br /&gt;top: -50px;&lt;br /&gt;&lt;b&gt;Step3:&lt;/b&gt;&lt;br /&gt;Save Template and View Your Blog&lt;br /&gt;&lt;br /&gt;Good Luck!&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-2749646044163630782?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/2749646044163630782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/07/remove-blogger-navbar-and-top-space.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2749646044163630782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2749646044163630782'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/07/remove-blogger-navbar-and-top-space.html' title='Remove Blogger Navbar and top space'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-6143169915940037264</id><published>2010-06-24T13:01:00.000+07:00</published><updated>2010-06-24T13:01:14.613+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LaTex'/><title type='text'>Using LaTex for your website</title><content type='html'>LaTex is a tool to write math, &lt;span class="short_text" id="result_box"&gt;&lt;span title=""&gt;physical&lt;/span&gt;&lt;/span&gt;, chemical &lt;span class="short_text" id="result_box"&gt;&lt;span style="background-color: white; color: black;" title=""&gt;formula on website.This is a step by step to setup LaTex on Website:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="short_text" id="result_box"&gt;&lt;span style="background-color: white; color: black;" title=""&gt;Download and Setup &lt;/span&gt;&lt;/span&gt;Miktex from &lt;a class="postlink" href="http://www.miktex.org/" onclick="this.target='_blank';" rel="nofollow"&gt;http://www.miktex.org .&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Download and Setup LaTex editor &lt;a class="postlink" href="http://www.xm1math.net/texmaker/" onclick="this.target='_blank';" rel="nofollow"&gt;http://www.xm1math.net/texmaker/&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div dir="ltr"&gt;&lt;div class=" " id="tts_button" style="display: block;" title="Nghe bản dịch này"&gt;&lt;object data="http://www.gstatic.com/translate/sound_player.swf" height="18" id="tts_flash" type="application/x-shockwave-flash" width="18"&gt;&lt;param value="http://www.gstatic.com/translate/sound_player.swf" name="movie"&gt;&lt;param value="sound_name=&amp;amp;sound_name_cb=_TTSSoundFile" name="flashvars"&gt;&lt;param value="transparent" name="wmode"&gt;&lt;param value="always" name="allowScriptAccess"&gt;&lt;/object&gt;&lt;/div&gt;&lt;span class="short_text" id="result_box"&gt;&lt;span style="background-color: white; color: black;" title=""&gt;See more :&lt;a href="http://www.latex-project.org/"&gt; http://www.latex-project.org/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-6143169915940037264?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/6143169915940037264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/06/using-latex-for-your-website.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6143169915940037264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6143169915940037264'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/06/using-latex-for-your-website.html' title='Using LaTex for your website'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-6747459163715229887</id><published>2010-06-22T21:38:00.003+07:00</published><updated>2010-06-22T21:40:47.811+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='My Heart Will Go On'/><title type='text'>My Heart Will Go On</title><content type='html'>&lt;span id="ctl00_MainArea_lblSongContent"&gt;Every night in my dreams&lt;br /&gt;I see you, I feel you,&lt;br /&gt;That is how I know you go on&lt;br /&gt;&lt;br /&gt;Far across the distance&lt;br /&gt;And spaces between us&lt;br /&gt;You have come to show you go on &lt;br /&gt;&lt;br /&gt;Near, far, wherever you are&lt;br /&gt;I believe that the heart does go on&lt;br /&gt;Once more you open the door&lt;br /&gt;And you're here in my heart&lt;br /&gt;And my heart will go on and on&lt;br /&gt;&lt;br /&gt;Love can touch us one time&lt;br /&gt;And last for a lifetime&lt;br /&gt;And never let go till we're gone &lt;br /&gt;&lt;br /&gt;Love was when I loved you&lt;br /&gt;One true time I hold you&lt;br /&gt;In my life we'll always go on &lt;br /&gt;&lt;br /&gt;Near, far, wherever you are&lt;br /&gt;I believe that the heart does go on&lt;br /&gt;Once more you open the door&lt;br /&gt;And you're here in my heart&lt;br /&gt;And my heart will go on and on&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You're here, there's nothing I fear,&lt;br /&gt;And I know that my heart will go on&lt;br /&gt;We'll stay forever this way&lt;br /&gt;You are safe in my heart &lt;br /&gt;And my heart will go on and on&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-6747459163715229887?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/6747459163715229887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/06/song-my-heart-will-go-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6747459163715229887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6747459163715229887'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/06/song-my-heart-will-go-on.html' title='My Heart Will Go On'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-394190576321397255</id><published>2010-06-22T08:49:00.002+07:00</published><updated>2010-06-22T08:53:00.561+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Song World cup 2010 South Africa'/><title type='text'>Wavin' Flag (World cup 2010 South Africa)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Ooooooh Wooooooh&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Give me freedom, give me fire, give me reason, take me higher&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; See the champions, take the field now, you define us, make us feel proud&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; In the streets our hands are lifting as we lose our inhabition,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Celebration its around us, every nations, all around us&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Singin forever young, singin songs underneath the sun&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Lets rejoice in the beautiful game.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And together at the end of the day.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; WE ALL SAY&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; When I get older I will be stronger&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; They'll call me freedom &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Just like a wavin' flag&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; When I get older I will be stronger&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; They'll call me freedom&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Just like a wavin' flag&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Oooooooooooooh woooooooooohh hohoho&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; [Repeat all]&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; WE ALL SAY !&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; When I get older I will be stronger&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; They'll call me freedom&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Just like a wavin' flag&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; When I get older I will be stronger&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; They'll call me freedom&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Just like a wavin' flag&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes back&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And then it goes&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Wooo hooooo hohohohoooooo&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; And everybody will be singinit&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Wooooooooo ohohohooooo&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-394190576321397255?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/394190576321397255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/06/wavin-flag-world-cup-2010-south-africa.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/394190576321397255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/394190576321397255'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/06/wavin-flag-world-cup-2010-south-africa.html' title='Wavin&apos; Flag (World cup 2010 South Africa)'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-3920666298951174119</id><published>2010-04-03T09:21:00.000+07:00</published><updated>2010-04-03T09:22:44.344+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='htaccess not working'/><title type='text'>mod_rewrite Not Working in .htaccess - Solution</title><content type='html'>&lt;p&gt;I faced a hair-tearing problem. mod_rewrite was loaded and yet it was not &lt;span class="IL_AD" id="IL_AD8"&gt;working&lt;/span&gt; in .&lt;span class="IL_AD" id="IL_AD9"&gt;htaccess&lt;/span&gt; files (and httpd.conf initially). Here is the solution along with how you can debug mod_rewrite problems.&lt;/p&gt; &lt;p&gt;&lt;span id="more-1385"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Debugging procedure:&lt;br /&gt;Add these two line to your httpd.conf immediately after &lt;em&gt;RewriteEngine On&lt;/em&gt;.&lt;br /&gt;&lt;em&gt;RewriteLog "/var/log/httpd/rewrite_log"&lt;br /&gt;RewriteLogLevel 9&lt;/em&gt;&lt;br /&gt;After that I added the required RewriteRule etc.&lt;/p&gt; &lt;p&gt;The reason for testing directly in httpd.conf is to ensure that mod_rewrite is working in the first place. After some debugging I realized my expression was wrong. So now I fohtaccess und mod_rewrite was working in httpd.conf. However it still wasn't working in .files. &lt;/p&gt; &lt;p&gt;Solution:&lt;br /&gt;I found &lt;em&gt;AllowOverride&lt;/em&gt; was set to None in httpd.conf. I changed it to &lt;em&gt;All&lt;/em&gt; (after all I am the only user of the machine). And it finally started working everywhere (after a restart).&lt;/p&gt;&lt;p&gt;Source:http://blog.taragana.com/index.php/archive/mod_rewrite-not-working-in-htaccess-solution/&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-3920666298951174119?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/3920666298951174119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/04/modrewrite-not-working-in-htaccess.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3920666298951174119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3920666298951174119'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/04/modrewrite-not-working-in-htaccess.html' title='mod_rewrite Not Working in .htaccess - Solution'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-3931672033358557621</id><published>2010-02-23T09:37:00.001+07:00</published><updated>2010-02-23T09:40:10.500+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crontab'/><title type='text'>crontab</title><content type='html'>[root@tran_triet~]# crontab -l -u apache&lt;br /&gt;*/5 * * * * /scripts/start-convertdocs.sh&lt;br /&gt;*/30 * * * * /usr/local/Zend/Core/bin/php  /home/crontjobs/cront_counter.php&lt;br /&gt;(:wq!)&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-3931672033358557621?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/3931672033358557621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/02/crontab.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3931672033358557621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3931672033358557621'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/02/crontab.html' title='crontab'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-2482428359939076731</id><published>2010-02-03T12:51:00.000+07:00</published><updated>2010-02-03T12:54:04.437+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hiphop php'/><title type='text'>HipHop for PHP: Move Fast</title><content type='html'>&lt;div class="body clearfix"&gt;&lt;p&gt;One of the key values at Facebook is to move fast. For the past six years, we have been able to accomplish a lot thanks to rapid pace of development that PHP offers. As a programming language, PHP is simple. Simple to learn, simple to write, simple to read, and simple to debug. We are able to get new engineers ramped up at Facebook a lot faster with PHP than with other languages, which allows us to innovate faster.&lt;/p&gt;  &lt;img src="http://wiki.developers.facebook.com/images/a/ac/HipHop_logo_white.png" style="float: left; padding-right: 10px;" /&gt;&lt;p&gt;Today I'm excited to share the project a small team of amazing people and I have been working on for the past two years; HipHop for PHP. With HipHop we've reduced the CPU usage on our Web servers on average by about fifty percent, depending on the page. Less CPU means fewer servers, which means less overhead. This project has had a tremendous impact on Facebook. We feel the Web at large can benefit from HipHop, so we are releasing it as open source this evening in hope that it brings a new focus toward scaling large complex websites with PHP. While HipHop has shown us incredible results, it's certainly not complete and you should be comfortable with beta software before trying it out.&lt;/p&gt;  &lt;p&gt;HipHop for PHP isn't technically a compiler itself. Rather it is a source code transformer. HipHop programmatically transforms your PHP source code into highly optimized C++ and then uses g++ to compile it. HipHop executes the source code in a semantically equivalent manner and sacrifices some rarely used features — such as eval() — in exchange for improved performance. HipHop includes a code transformer, a reimplementation of PHP's runtime system, and a rewrite of many common PHP Extensions to take advantage of these performance optimizations.&lt;/p&gt;  &lt;h2&gt;Scaling PHP as a Scripting Language&lt;/h2&gt;  &lt;p&gt;PHP's roots are those of a &lt;a href="http://en.wikipedia.org/wiki/Server-side_scripting"&gt;scripting language&lt;/a&gt;, like Perl, Python, and Ruby, all of which have major benefits in terms of programmer productivity and the ability to iterate quickly on products. This is compared to more traditional &lt;a href="http://en.wikipedia.org/wiki/Compiled_language"&gt;compiled languages&lt;/a&gt; like C++ and &lt;a href="http://en.wikipedia.org/wiki/Interpreted_language"&gt;interpreted languages&lt;/a&gt; like Java. On the other hand, scripting languages are known to generally be less efficient when it comes to CPU and memory usage. Because of this, it's been challenging to scale Facebook to over 400 billion PHP-based page views every month.&lt;/p&gt;  &lt;p&gt;One common way to address these inefficiencies is to rewrite the more complex parts of your PHP application directly in C++ as PHP Extensions. This largely transforms PHP into a glue language between your front end HTML and application logic in C++. From a technical perspective this works well, but drastically reduces the number of engineers who are able to work on your entire application. Learning C++ is only the first step to writing PHP Extensions, the second is understanding the &lt;a href="http://theserverpages.com/php/manual/en/zend.php"&gt;Zend APIs&lt;/a&gt;. Given that our engineering team is relatively small — there are over one million users to every engineer — we can't afford to make parts of our codebase less accessible than others.&lt;/p&gt;  &lt;p&gt;Scaling Facebook is particularly challenging because almost every page view is a logged-in user with a customized experience. When you view your home page we need to look up all of your friends, query their most relevant updates (from a custom service we've built called Multifeed), filter the results based on your privacy settings, then fill out the stories with comments, photos, likes, and all the rich data that people love about Facebook. All of this in just under a second. HipHop allows us to write the logic that does the final page assembly in PHP and iterate it quickly while relying on custom back-end services in C++, Erlang, Java, or Python to service the News Feed, search, Chat, and other core parts of the site.&lt;/p&gt;  &lt;p&gt;Since 2007 we've thought about a few different ways to solve these problems and have even tried implementing a few of them. The common suggestion is to just rewrite Facebook in another language, but given the complexity and speed of development of the site this would take some time to accomplish. We've rewritten aspects of the &lt;a href="http://en.wikipedia.org/wiki/Zend_Engine"&gt;Zend Engine&lt;/a&gt; — PHP's internals — and contributed those patches back into the PHP project, but ultimately haven't seen the sort of performance increases that are needed. HipHop's benefits are nearly transparent to our development speed.&lt;/p&gt;  &lt;h2&gt;Hacking Up HipHop&lt;/h2&gt;  &lt;p&gt;One night at a Hackathon a few years ago (see &lt;a href="http://www.facebook.com/video/video.php?v=124728580468&amp;amp;ref=mf"&gt;Prime Time Hack&lt;/a&gt;), I started my first piece of code transforming PHP into C++. The languages are fairly similar syntactically and C++ drastically outperforms PHP when it comes to both CPU and memory usage. Even PHP itself is written in C. We knew that it was impossible to successfully rewrite an entire codebase of this size by hand, but wondered what would happen if we built a system to do it programmatically.&lt;/p&gt;  &lt;p&gt;Finding new ways to improve PHP performance isn't a new concept. At run time the Zend Engine turns your PHP source into opcodes which are then run through the Zend Virtual Machine. Open source projects such as &lt;a href="http://pecl.php.net/package/APC"&gt;APC&lt;/a&gt; and &lt;a href="http://eaccelerator.net/"&gt;eAccelerator&lt;/a&gt; cache this output and are used by the majority of PHP powered websites.  There's also &lt;a href="http://en.wikipedia.org/wiki/Zend_Server"&gt;Zend Server&lt;/a&gt;, a commercial product which makes PHP faster via opcode optimization and caching. Instead, we were thinking about transforming PHP source directly into C++ which can then be turned into native machine code. Even compiling PHP isn't a new idea, open source projects like &lt;a href="http://www.roadsend.com/"&gt;Roadsend&lt;/a&gt; and &lt;a href="http://www.phpcompiler.org/"&gt;phc&lt;/a&gt; compile PHP to C, &lt;a href="http://www.caucho.com/resin-3.0/quercus/"&gt;Quercus&lt;/a&gt; compiles PHP to Java, and &lt;a href="http://www.php-compiler.net/"&gt;Phalanger&lt;/a&gt; compiles PHP to .Net.&lt;/p&gt;  &lt;p&gt;Needless to say, it took longer than that single Hackathon. Eight months later, I had enough code to demonstrate it is indeed possible to run faster with compiled code. We quickly added Iain Proctor and Minghui Yang to the team to speed up the pace of the project. We spent the next ten months finishing up all the coding and the following six months testing on production servers. We are proud to say that at this point, we are serving over 90% of our Web traffic using HipHop, all only six months after deployment.&lt;/p&gt;  &lt;h2&gt;How HipHop Works&lt;/h2&gt;  &lt;p&gt;The main challenge of the project was bridging the gap between PHP and C++. PHP is a scripting language with dynamic, weak typing. C++ is a compiled language with static typing. While PHP allows you to write magical dynamic features, most PHP is relatively straightforward. It's more likely that you see &lt;code&gt;if (...) {...} else {..}&lt;/code&gt; than it is to see &lt;code&gt;function foo($x) { include $x; }&lt;/code&gt;. This is where we gain in performance. Whenever possible our generated code uses static binding for functions and variables. We also use type inference to pick the most specific type possible for our variables and thus save memory.&lt;/p&gt;  &lt;p&gt;The transformation process includes three main steps:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Static analysis where we collect information on who declares what and dependencies,&lt;/li&gt;&lt;li&gt;Type inference where we choose the most specific type between C++ scalars, String, Array, classes, Object, and Variant, and&lt;/li&gt;&lt;li&gt;Code generation which for the most part is a direct correspondence from PHP statements and expressions to C++ statements and expressions.&lt;/li&gt;&lt;/ol&gt;  &lt;a href="http://wiki.developers.facebook.com/images/2/23/HipHop_transformation_process.png"&gt;&lt;img src="http://wiki.developers.facebook.com/images/2/23/HipHop_transformation_process.png" height="281" width="450" /&gt;&lt;/a&gt;  &lt;p&gt;We have also developed HPHPi, which is an experimental interpreter designed for development. When using HPHPi you don't need to compile your PHP source code before running it. It's helped us catch bugs in HipHop itself and provides engineers a way to use HipHop without changing how they write PHP.&lt;/p&gt;  &lt;p&gt;Overall HipHop allows us to keep the best aspects of PHP while taking advantage of the performance benefits of C++. In total, we have written over 300,000 lines of code and more than 5,000 unit tests. All of this will be released this evening on GitHub under the open source PHP license.&lt;/p&gt;  &lt;h2&gt;Learn More this Evening&lt;/h2&gt;  &lt;p&gt;This evening we're hosting a small group of developers to dive deeper into HipHop for PHP and will be streaming this tech talk live. Check back here around 7:30pm Pacific time if you'd like to watch.&lt;/p&gt;  &lt;p&gt;As I'm sure there will be plenty of questions, starting this evening take a look at the &lt;a href="http://github.com/facebook/hiphop-php/wikis"&gt;HipHop wiki&lt;/a&gt; or join the &lt;a href="http://groups.google.com/group/hiphop-php-dev"&gt;HipHop developer mailing list&lt;/a&gt;.  You'll also find us at &lt;a href="http://www.fosdem.org/2010/schedule/events/scalingfacebook"&gt;FOSDEM&lt;/a&gt;, &lt;a href="http://www.socallinuxexpo.org/scale8x/"&gt;SCALE&lt;/a&gt;, &lt;a href="http://www.phpconference.co.uk/"&gt;PHP UK&lt;/a&gt;, &lt;a href="http://www.confoo.ca/"&gt;ConFoo&lt;/a&gt;, &lt;a href="http://tek.phparch.com/"&gt;TEK X&lt;/a&gt;, and &lt;a href="http://en.oreilly.com/oscon2010"&gt;OSCON&lt;/a&gt; over the next few months talking about HipHop for PHP. We're very excited to evolve HipHop into a thriving open source project along with all of you.&lt;/p&gt;  &lt;div style="text-align: center;"&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" id="utv226710" height="320" width="400"&gt;&lt;param name="flashvars" value="autoplay=false&amp;amp;brand=embed&amp;amp;cid=508916"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://www.ustream.tv/flash/live/1/508916"&gt;&lt;embed flashvars="autoplay=false&amp;amp;brand=embed&amp;amp;cid=508916" allowfullscreen="true" allowscriptaccess="always" id="utv226710" name="utv_n_417317" src="http://www.ustream.tv/flash/live/1/508916" type="application/x-shockwave-flash" height="320" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;  &lt;p&gt;&lt;em&gt;Haiping Zhao, a senior engineer, has found Facebook to be a programmer's paradise.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-2482428359939076731?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/2482428359939076731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/02/hiphop-for-php-move-fast.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2482428359939076731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2482428359939076731'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/02/hiphop-for-php-move-fast.html' title='HipHop for PHP: Move Fast'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-4197567689399833156</id><published>2010-02-01T14:30:00.002+07:00</published><updated>2010-02-01T14:36:39.170+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><title type='text'>Differences Between HTML 4.01 and HTML 5</title><content type='html'>&lt;a href="http://html5demos.com/"&gt;http://html5demos.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-4197567689399833156?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/4197567689399833156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/02/differences-between-html-401-and-html-5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/4197567689399833156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/4197567689399833156'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/02/differences-between-html-401-and-html-5.html' title='Differences Between HTML 4.01 and HTML 5'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-9010455651342645507</id><published>2010-01-28T08:48:00.001+07:00</published><updated>2010-01-28T08:49:45.705+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><title type='text'>HTML 5 differences from HTML 4</title><content type='html'>&lt;a href="http:http://www.w3.org/TR/2008/WD-html5-diff-20080122/"&gt;http://www.w3.org/TR/2008/WD-html5-diff-20080122/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-9010455651342645507?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/9010455651342645507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2010/01/html-5-differences-from-html-4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/9010455651342645507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/9010455651342645507'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2010/01/html-5-differences-from-html-4.html' title='HTML 5 differences from HTML 4'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-4596924589234193348</id><published>2009-12-25T16:01:00.000+07:00</published><updated>2009-12-25T16:02:23.127+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tokyo Tyrant'/><category scheme='http://www.blogger.com/atom/ns#' term='MemcacheDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Redis'/><title type='text'>MemcacheDB, Tokyo Tyrant, Redis performance test</title><content type='html'>&lt;a href="http://timyang.net/data/mcdb-tt-redis/"&gt;http://timyang.net/data/mcdb-tt-redis/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-4596924589234193348?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/4596924589234193348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/12/memcachedb-tokyo-tyrant-redis.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/4596924589234193348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/4596924589234193348'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/12/memcachedb-tokyo-tyrant-redis.html' title='MemcacheDB, Tokyo Tyrant, Redis performance test'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-5544637315801649472</id><published>2009-12-01T13:17:00.000+07:00</published><updated>2009-12-01T13:19:16.336+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hard facts'/><category scheme='http://www.blogger.com/atom/ns#' term='rank'/><category scheme='http://www.blogger.com/atom/ns#' term='comment'/><category scheme='http://www.blogger.com/atom/ns#' term='spam'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Hard facts about comment spam</title><content type='html'>It has probably happened to you: you're reading articles or watching videos on the web, and you come across some unrelated, gibberish comments. You may wonder what this is all about. Some webmasters abuse other sites by exploiting their comment fields, posting tons of links that point back to the poster's site in an attempt to boost their site's ranking. Others might tweak this approach a bit by posting a generic comment (like "Nice site!") with a commercial user name linking to their site.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why is it bad?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;FACT: Abusing comment fields of innocent sites is a bad and risky way of getting links to your site. If you choose to do so, you are tarnishing other people's hard work and lowering the quality of the web, transforming a potentially good resource of additional information into a list of nonsense keywords.&lt;br /&gt;&lt;br /&gt;FACT: Comment spammers are often trying to improve their site's organic search ranking by creating dubious inbound links to their site. Google has an understanding of the link graph of the web, and has algorithmic ways of discovering those alterations and tackling them. At best, a link spammer might spend hours doing spammy linkdrops which would count for little or nothing because Google is pretty good at devaluing these types of links. Think of all the more productive things one could do with that time and energy that would provide much more value for one's site in the long run.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_o5Na_9269nA/Sw31rgutH0I/AAAAAAAADPk/qt0DM02fcEA/s1600/comment-spam"&gt;&lt;img style="cursor: pointer; width: 400px; height: 264px;" src="http://3.bp.blogspot.com/_o5Na_9269nA/Sw31rgutH0I/AAAAAAAADPk/qt0DM02fcEA/s400/comment-spam" alt="" id="BLOGGER_PHOTO_ID_5408248855410843458" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Promote your site without comment spam&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you want to improve your site's visibility in the search results, spamming comments is definitely not the way to go. Instead, think about whether your site offers what people are looking for, such as useful information and tools.&lt;br /&gt;&lt;br /&gt;FACT: Having original and useful content and making your site search engine friendly is the best strategy for better ranking. With an appealing site, you'll be recognized by the web community as a reliable source and &lt;a href="http://googlewebmastercentral.blogspot.com/2008/10/links-information-straight-from-source.html"&gt;links to your site&lt;/a&gt; will build naturally.&lt;br /&gt;&lt;br /&gt;Moreover, Google provides a list of advice in order to improve the crawlability and indexability of your site. Check out our &lt;a href="http://www.google.com/webmasters/docs/search-engine-optimization-starter-guide.pdf"&gt;Search Engine Optimization Starter Guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What can I do to avoid spam on my site?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Comments can be a really good source of information and an efficient way of engaging a site's users in discussions. This valuable content should not be replaced by gibberish nonsense keywords and links. For this reason there are many ways of securing your application and disincentivizing spammers.&lt;ul&gt;&lt;li&gt;Disallow anonymous posting.&lt;/li&gt;&lt;li&gt;Use CAPTCHAs and other methods to prevent automated comment spamming.&lt;/li&gt;&lt;li&gt;Turn on comment moderation.&lt;/li&gt;&lt;li&gt;Use the "nofollow" attribute for links in the comment field.&lt;/li&gt;&lt;li&gt;Disallow hyperlinks in comments.&lt;/li&gt;&lt;li&gt;Block comment pages using robots.txt or meta tags.&lt;/li&gt;&lt;/ul&gt;For detailed information about these topics, check out our Help Center document on &lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=81749"&gt;comment spam&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;My site is full of comment spam, what should I do?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It's never too late! Don't let spammers ruin the experience for others. Adopt security measures discussed above to stop the spam activity, then invest some time to clean up the spammy comments and ban the spammers from your site. Depending on you site's system, you may be able to save time by banning spammers and removing their comments all at once, rather than one by one.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;If I spammed comment fields of third party sites, what should I do?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you used this approach in the past and you want to solve this issue, you should have a look at your incoming links in Webmaster Tools. To do so, go to the &lt;i&gt;Your site on the web&lt;/i&gt; section and click on &lt;i&gt;&lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=55281"&gt;Links to your site&lt;/a&gt;&lt;/i&gt;. If you see suspicious links coming from blogs or other platforms allowing comments, you should check these URLs. If you see a spammy link you created, try to delete it, else contact the webmaster to ask to remove the link. Once you've cleared the spammy inbound links you made, you can file a &lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=35843"&gt;reconsideration request&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For more information about this topic and to discuss it with others, join us in the &lt;a href="http://www.google.com/support/forum/p/Webmasters"&gt;Webmaster Help Forum&lt;/a&gt;. (But don't leave spammy comments!)&lt;br /&gt;&lt;br /&gt;Source: http://googlewebmastercentral.blogspot.com/2009/11/hard-facts-about-comment-spam.html&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-5544637315801649472?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/5544637315801649472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/12/hard-facts-about-comment-spam.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5544637315801649472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5544637315801649472'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/12/hard-facts-about-comment-spam.html' title='Hard facts about comment spam'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_o5Na_9269nA/Sw31rgutH0I/AAAAAAAADPk/qt0DM02fcEA/s72-c/comment-spam' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-5853338718704656569</id><published>2009-11-18T08:51:00.003+07:00</published><updated>2009-11-18T08:56:10.999+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='COBOL'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='language programming'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>TIOBE Programming Community Index for November 2009</title><content type='html'>&lt;h1&gt; November Headline: C is closing its gap with Java  &lt;/h1&gt; &lt;p&gt;The difference between the number 1 and 2 of the TIOBE index is getting smaller.  C is only a little over 1% behind Java now. Last time C and Java were so close was  in 2005. Both languages show a long-term downtrend, but Java's downtrend appears to  be steeper. In two months' time TIOBE will announce the programming language of the year 2009. Candidates so far are: C, C#, PHP and may be even Objective-C.    &lt;/p&gt; &lt;p&gt;The TIOBE Programming Community index gives an indication of the popularity of programming  languages. The index is updated once a month. The ratings are based on the number of  skilled engineers world-wide, courses and third party vendors. The popular search engines Google, MSN, Yahoo!, Wikipedia and  YouTube are used to calculate the ratings. Observe that the TIOBE index is not about the &lt;i&gt;best&lt;/i&gt; programming  language or the language in which &lt;i&gt;most lines of code&lt;/i&gt; have been written.&lt;/p&gt; &lt;p&gt;The index can be used to check whether your programming skills are still up to date or to make a  strategic decision about what programming language should be adopted when starting to build a new  software system. The definition of the TIOBE index can be found &lt;a href="http://www.tiobe.com/content/paperinfo/tpci/tpci_definition.htm"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;table class="TpciTable" bordercolordark="#003366" bordercolorlight="#c0c0c0" id="Table2" align="center" border="1"&gt;&lt;colgroup&gt; &lt;col align="center"&gt; &lt;col align="center"&gt; &lt;col align="center"&gt; &lt;col&gt; &lt;col align="center"&gt; &lt;col align="center"&gt; &lt;col align="center"&gt;  &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th align="center" nowrap="nowrap"&gt;Position&lt;br /&gt;Nov 2009&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Position&lt;br /&gt;Nov 2008&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Delta in Position&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Programming Language&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Ratings&lt;br /&gt;Nov 2009&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Delta&lt;br /&gt;Nov 2008&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Status&lt;/th&gt;&lt;/tr&gt; &lt;tr height="25"&gt;  &lt;td align="center"&gt;1&lt;/td&gt;  &lt;td align="center"&gt;1&lt;/td&gt;  &lt;td align="center"&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Same.gif" border="0" /&gt;&lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Java.html"&gt;Java&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;18.373%&lt;/td&gt;  &lt;td align="center"&gt;-1.93%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;2&lt;/td&gt;  &lt;td align="center"&gt;2&lt;/td&gt;  &lt;td align="center"&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Same.gif" border="0" /&gt;&lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/C.html"&gt;C&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;17.315%&lt;/td&gt;  &lt;td align="center"&gt;+2.04%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;3&lt;/td&gt;  &lt;td align="center"&gt;5&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/PHP.html"&gt;PHP&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;10.176%&lt;/td&gt;  &lt;td align="center"&gt;+1.24%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;4&lt;/td&gt;  &lt;td align="center"&gt;3&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/C__.html"&gt;C++&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;10.002%&lt;/td&gt;  &lt;td align="center"&gt;-0.36%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;5&lt;/td&gt;  &lt;td align="center"&gt;4&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/%28Visual%29_Basic.html"&gt;(Visual) Basic&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;8.171%&lt;/td&gt;  &lt;td align="center"&gt;-1.10%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;6&lt;/td&gt;  &lt;td align="center"&gt;7&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/C_.html"&gt;C#&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;5.346%&lt;/td&gt;  &lt;td align="center"&gt;+1.32%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;7&lt;/td&gt;  &lt;td align="center"&gt;6&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Python.html"&gt;Python&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;4.672%&lt;/td&gt;  &lt;td align="center"&gt;-0.47%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;8&lt;/td&gt;  &lt;td align="center"&gt;9&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Perl.html"&gt;Perl&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;3.490%&lt;/td&gt;  &lt;td align="center"&gt;-0.39%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;9&lt;/td&gt;  &lt;td align="center"&gt;10&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/JavaScript.html"&gt;JavaScript&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;2.916%&lt;/td&gt;  &lt;td align="center"&gt;-0.01%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;10&lt;/td&gt;  &lt;td align="center"&gt;11&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Ruby.html"&gt;Ruby&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;2.404%&lt;/td&gt;  &lt;td align="center"&gt;-0.47%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;11&lt;/td&gt;  &lt;td align="center"&gt;8&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Delphi.html"&gt;Delphi&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;2.127%&lt;/td&gt;  &lt;td align="center"&gt;-1.88%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;12&lt;/td&gt;  &lt;td align="center"&gt;13&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/PL_SQL.html"&gt;PL/SQL&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;0.908%&lt;/td&gt;  &lt;td align="center"&gt;-0.03%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;13&lt;/td&gt;  &lt;td align="center"&gt;38&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Objective-C.html"&gt;Objective-C&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;0.893%&lt;/td&gt;  &lt;td align="center"&gt;+0.74%&lt;/td&gt;  &lt;td align="left"&gt;  A-&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;14&lt;/td&gt;  &lt;td align="center"&gt;14&lt;/td&gt;  &lt;td align="center"&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Same.gif" border="0" /&gt;&lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/SAS.html"&gt;SAS&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;0.816%&lt;/td&gt;  &lt;td align="center"&gt;+0.09%&lt;/td&gt;  &lt;td align="left"&gt;  A&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;15&lt;/td&gt;  &lt;td align="center"&gt;16&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Pascal.html"&gt;Pascal&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;0.654%&lt;/td&gt;  &lt;td align="center"&gt;+0.14%&lt;/td&gt;  &lt;td align="left"&gt;  A--&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;16&lt;/td&gt;  &lt;td align="center"&gt;15&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/ABAP.html"&gt;ABAP&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;0.643%&lt;/td&gt;  &lt;td align="center"&gt;+0.07%&lt;/td&gt;  &lt;td align="left"&gt;  A--&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;17&lt;/td&gt;  &lt;td align="center"&gt;21&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Lisp_Scheme.html"&gt;Lisp/Scheme&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;0.618%&lt;/td&gt;  &lt;td align="center"&gt;+0.15%&lt;/td&gt;  &lt;td align="left"&gt;  B&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;18&lt;/td&gt;  &lt;td align="center"&gt;22&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/MATLAB.html"&gt;MATLAB&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;0.611%&lt;/td&gt;  &lt;td align="center"&gt;+0.15%&lt;/td&gt;  &lt;td align="left"&gt;  B&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;19&lt;/td&gt;  &lt;td align="center"&gt;20&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Up.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Lua.html"&gt;Lua&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;0.544%&lt;/td&gt;  &lt;td align="center"&gt;+0.07%&lt;/td&gt;  &lt;td align="left"&gt;  B&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td align="center"&gt;20&lt;/td&gt;  &lt;td align="center"&gt;12&lt;/td&gt;  &lt;td align="center"&gt; &lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt;&lt;img src="http://www.tiobe.com/tiobe_index/images/Down.gif" border="0" /&gt; &lt;/td&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/D.html"&gt;D&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;0.543%&lt;/td&gt;  &lt;td align="center"&gt;-0.90%&lt;/td&gt;  &lt;td align="left"&gt;  B&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;h2&gt;Long term trends&lt;/h2&gt; &lt;p&gt; The long term trends for the top 10 programming languages can be found in the  line diagram below.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h1 align="center"&gt;&lt;img src="http://www.tiobe.com/content/paperinfo/tpci/images/tpci_trends.png" /&gt;&lt;/h1&gt; &lt;hr /&gt; &lt;h2&gt;Other programming languages&lt;/h2&gt; &lt;p&gt;The complete top 50 of programming languages is listed below. This overview is  published unofficially, because it could be the case that we missed a language. If  you have the impression there is a programming language lacking, please notify us  at &lt;a href="mailto:tpci@tiobe.com"&gt;tpci@tiobe.com&lt;/a&gt;.&lt;/p&gt; &lt;table class="TpciTable" bordercolordark="#003366" bordercolorlight="#c0c0c0" id="Table2" align="center" border="1"&gt; &lt;colgroup&gt; &lt;col align="right"&gt; &lt;col&gt; &lt;col align="right"&gt;  &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th nowrap="nowrap"&gt;Position&lt;/th&gt;&lt;th nowrap="nowrap"&gt;Programming Language&lt;/th&gt;&lt;th nowrap="nowrap"&gt;Ratings&lt;/th&gt;&lt;/tr&gt; &lt;tr height="25"&gt;  &lt;td&gt;21&lt;/td&gt;  &lt;td&gt;ActionScript&lt;/td&gt;  &lt;td&gt;0.519%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;22&lt;/td&gt;  &lt;td&gt;COBOL&lt;/td&gt;  &lt;td&gt;0.430%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;23&lt;/td&gt;  &lt;td&gt;Transact-SQL&lt;/td&gt;  &lt;td&gt;0.412%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;24&lt;/td&gt;  &lt;td&gt;FoxPro/xBase&lt;/td&gt;  &lt;td&gt;0.379%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;25&lt;/td&gt;  &lt;td&gt;Fortran&lt;/td&gt;  &lt;td&gt;0.376%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;26&lt;/td&gt;  &lt;td&gt;Logo&lt;/td&gt;  &lt;td&gt;0.361%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;27&lt;/td&gt;  &lt;td&gt;Scratch&lt;/td&gt;  &lt;td&gt;0.346%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;28&lt;/td&gt;  &lt;td&gt;Alice&lt;/td&gt;  &lt;td&gt;0.329%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;29&lt;/td&gt;  &lt;td&gt;Ada&lt;/td&gt;  &lt;td&gt;0.305%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;30&lt;/td&gt;  &lt;td&gt;S-lang&lt;/td&gt;  &lt;td&gt;0.292%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;31&lt;/td&gt;  &lt;td&gt;RPG (OS/400)&lt;/td&gt;  &lt;td&gt;0.285%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;32&lt;/td&gt;  &lt;td&gt;Erlang&lt;/td&gt;  &lt;td&gt;0.261%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;33&lt;/td&gt;  &lt;td&gt;PowerShell&lt;/td&gt;  &lt;td&gt;0.259%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;34&lt;/td&gt;  &lt;td&gt;Scala&lt;/td&gt;  &lt;td&gt;0.244%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;35&lt;/td&gt;  &lt;td&gt;Awk&lt;/td&gt;  &lt;td&gt;0.243%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;36&lt;/td&gt;  &lt;td&gt;Prolog&lt;/td&gt;  &lt;td&gt;0.234%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;37&lt;/td&gt;  &lt;td&gt;NXT-G&lt;/td&gt;  &lt;td&gt;0.234%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;38&lt;/td&gt;  &lt;td&gt;Tcl/Tk&lt;/td&gt;  &lt;td&gt;0.221%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;39&lt;/td&gt;  &lt;td&gt;Focus&lt;/td&gt;  &lt;td&gt;0.209%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;40&lt;/td&gt;  &lt;td&gt;LabWindows/CVI&lt;/td&gt;  &lt;td&gt;0.193%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;41&lt;/td&gt;  &lt;td&gt;Haskell&lt;/td&gt;  &lt;td&gt;0.183%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;42&lt;/td&gt;  &lt;td&gt;PL/I&lt;/td&gt;  &lt;td&gt;0.177%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;43&lt;/td&gt;  &lt;td&gt;JavaFX Script&lt;/td&gt;  &lt;td&gt;0.176%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;44&lt;/td&gt;  &lt;td&gt;MAX/MSP&lt;/td&gt;  &lt;td&gt;0.161%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;45&lt;/td&gt;  &lt;td&gt;LabVIEW&lt;/td&gt;  &lt;td&gt;0.157%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;46&lt;/td&gt;  &lt;td&gt;Falcon&lt;/td&gt;  &lt;td&gt;0.156%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;47&lt;/td&gt;  &lt;td&gt;Groovy&lt;/td&gt;  &lt;td&gt;0.152%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;48&lt;/td&gt;  &lt;td&gt;Modula-3&lt;/td&gt;  &lt;td&gt;0.146%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;49&lt;/td&gt;  &lt;td&gt;Forth&lt;/td&gt;  &lt;td&gt;0.144%&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;50&lt;/td&gt;  &lt;td&gt;Smalltalk&lt;/td&gt;  &lt;td&gt;0.135%&lt;/td&gt; &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;                    &lt;br /&gt;&lt;hr /&gt; &lt;h2&gt;The Next 50 Programming Languages&lt;/h2&gt; &lt;p&gt;The following list of languages denotes #51 to #100. Since the differences are  relatively small, the programming languages are only listed (in alphabetical  order). &lt;/p&gt; &lt;ul&gt;&lt;li&gt;4th Dimension/4D, ABC, AD, Algol, APL, Applescript, Beta, Boo, Bourne shell, C shell, Caml/F#, cg, CL (OS/400), Clean, Clojure, Cobra, cT, Curl, Euphoria, Factor, Fan, Icon, IDL, Inform, Informix-4GL, Io, J, Lingo, MAD, Mathematica, ML, Modula-2, MOO, MUMPS, Natural, Occam, Oz, PowerBuilder, Progress, Q, R, REALbasic, Revolution, SIGNAL, SPSS, SuperCollider, VBScript, Verilog, VHDL, XSLT&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;hr /&gt; &lt;h2&gt; November Newsflash - &lt;i&gt;Brought to you by Paul Jansen&lt;/i&gt;&lt;/h2&gt; &lt;ul&gt;&lt;li&gt; This month the following changes have been made to the definition of the index: &lt;ul&gt;&lt;li&gt; Jean-Michel Biraghi suggested to add the programming language "4D" (formerly known as "4th Dimension") to the index. It enters the chart at position 91. &lt;/li&gt;&lt;li&gt; Michael Richter noted that SQL as of SQL-99 is Turing Complete and thus should be counted as a programming language. This is true. But the necessary extension to deserve this predicate, Persisent Stored Modules (SQL/PSM), has never really taken off. So I think it is unfair to call SQL a programming language without renaming it to SQL/PSM. And if we do so, it would not be in the chart because it has for instance only 5 hits for the Google query "SQL/PSM programming". &lt;/li&gt;&lt;li&gt; There are still lots of mail that need to be processed. As soon as I have got some time I will answer them. Please be patient.  &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;To see the bigger picture, please find the positions of the top 10 programming languages from 4, 10 and 25 years ago in the table below.&lt;br /&gt;&lt;br /&gt; &lt;table class="TpciTable" bordercolordark="#003366" bordercolorlight="#c0c0c0" id="Table2" align="center" border="1"&gt; &lt;colgroup&gt; &lt;col align="center"&gt; &lt;col align="center"&gt; &lt;col align="center"&gt; &lt;col&gt; &lt;col align="center"&gt; &lt;col align="center"&gt;  &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th align="center" nowrap="nowrap"&gt;Programming Language&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Position&lt;br /&gt;Nov 2009&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Position&lt;br /&gt;Nov 2005&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Position&lt;br /&gt;Nov 1999&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Position&lt;br /&gt;Nov 1984&lt;/th&gt; &lt;/tr&gt;&lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Java.html"&gt;Java&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;1&lt;/td&gt;  &lt;td align="center"&gt;1&lt;/td&gt;  &lt;td align="center"&gt;3&lt;/td&gt;  &lt;td align="center"&gt;-&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/C.html"&gt;C&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;2&lt;/td&gt;  &lt;td align="center"&gt;2&lt;/td&gt;  &lt;td align="center"&gt;1&lt;/td&gt;  &lt;td align="center"&gt;1&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/PHP.html"&gt;PHP&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;3&lt;/td&gt;  &lt;td align="center"&gt;4&lt;/td&gt;  &lt;td align="center"&gt;25&lt;/td&gt;  &lt;td align="center"&gt;-&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/C__.html"&gt;C++&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;4&lt;/td&gt;  &lt;td align="center"&gt;3&lt;/td&gt;  &lt;td align="center"&gt;2&lt;/td&gt;  &lt;td align="center"&gt;10&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/%28Visual%29_Basic.html"&gt;(Visual) Basic&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;5&lt;/td&gt;  &lt;td align="center"&gt;5&lt;/td&gt;  &lt;td align="center"&gt;5&lt;/td&gt;  &lt;td align="center"&gt;4&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/C_.html"&gt;C#&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;6&lt;/td&gt;  &lt;td align="center"&gt;7&lt;/td&gt;  &lt;td align="center"&gt;23&lt;/td&gt;  &lt;td align="center"&gt;-&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Python.html"&gt;Python&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;7&lt;/td&gt;  &lt;td align="center"&gt;8&lt;/td&gt;  &lt;td align="center"&gt;20&lt;/td&gt;  &lt;td align="center"&gt;-&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Perl.html"&gt;Perl&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;8&lt;/td&gt;  &lt;td align="center"&gt;6&lt;/td&gt;  &lt;td align="center"&gt;4&lt;/td&gt;  &lt;td align="center"&gt;-&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/JavaScript.html"&gt;JavaScript&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;9&lt;/td&gt;  &lt;td align="center"&gt;9&lt;/td&gt;  &lt;td align="center"&gt;17&lt;/td&gt;  &lt;td align="center"&gt;-&lt;/td&gt; &lt;/tr&gt;  &lt;tr height="25"&gt;  &lt;td&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Ruby.html"&gt;Ruby&lt;/a&gt;&lt;/td&gt;  &lt;td align="center"&gt;10&lt;/td&gt;  &lt;td align="center"&gt;24&lt;/td&gt;  &lt;td align="center"&gt;-&lt;/td&gt;  &lt;td align="center"&gt;-&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; The previous winners of the "Language of the Year" award are shown below.&lt;br /&gt;&lt;br /&gt;&lt;table class="TpciTable" bordercolordark="#003366" bordercolorlight="#c0c0c0" id="Table2" align="center" border="1"&gt; &lt;colgroup&gt; &lt;col align="center"&gt; &lt;col align="center"&gt; &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th align="center" nowrap="nowrap"&gt;Year&lt;/th&gt;&lt;th align="center" nowrap="nowrap"&gt;Winner&lt;/th&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt; 2008 &lt;/td&gt; &lt;td&gt; C &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; 2007 &lt;/td&gt; &lt;td&gt; Python &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; 2006 &lt;/td&gt; &lt;td&gt; Ruby &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; 2005 &lt;/td&gt; &lt;td&gt; Java &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; 2004 &lt;/td&gt; &lt;td&gt; PHP &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; 2003 &lt;/td&gt; &lt;td&gt; C++ &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; In the tables below some long term trends are listed about categories of languages.  The object-oriented paradigm won another 2% to procedural languages in one month's time.  The popularity of dynamically typed languages seems to stabilize (see trend diagram below).&lt;br /&gt;&lt;br /&gt;&lt;table class="TpciTable" bordercolordark="#003366" bordercolorlight="#c0c0c0" id="Table4" align="center" border="1"&gt;     &lt;colgroup&gt; &lt;col&gt; &lt;col align="right"&gt; &lt;col align="right"&gt;  &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th nowrap="nowrap"&gt;Category&lt;/th&gt;&lt;th nowrap="nowrap"&gt;Ratings Nov 2009&lt;/th&gt;&lt;th nowrap="nowrap"&gt;Delta Nov 2008&lt;/th&gt;&lt;/tr&gt; &lt;tr&gt;       &lt;td&gt; Object-Oriented Languages &lt;/td&gt; &lt;td&gt; 54.4% &lt;/td&gt; &lt;td&gt; -3.2% &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; Procedural Languages &lt;/td&gt; &lt;td&gt; 41.6% &lt;/td&gt; &lt;td&gt; +2.8% &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; Functional Languages &lt;/td&gt; &lt;td&gt; 2.8% &lt;/td&gt; &lt;td&gt; +0.2% &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; Logical Languages &lt;/td&gt; &lt;td&gt; 1.3% &lt;/td&gt; &lt;td&gt; +0.1% &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table class="TpciTable" bordercolordark="#003366" bordercolorlight="#c0c0c0" id="Table5" align="center" border="1"&gt;     &lt;colgroup&gt; &lt;col&gt; &lt;col align="right"&gt; &lt;col align="right"&gt;  &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th nowrap="nowrap"&gt;Category&lt;/th&gt;&lt;th nowrap="nowrap"&gt;Ratings Nov 2009&lt;/th&gt;&lt;th nowrap="nowrap"&gt;Delta Nov 2008&lt;/th&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt; Statically Typed Languages &lt;/td&gt; &lt;td&gt; 59.2% &lt;/td&gt; &lt;td&gt; -0.2% &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; Dynamically Typed Languages &lt;/td&gt; &lt;td&gt; 40.8% &lt;/td&gt; &lt;td&gt; +0.2% &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;h1 align="center"&gt;&lt;img src="http://www.tiobe.com/content/paperinfo/tpci/images/history_paradigm_type%20system.png" /&gt;&lt;/h1&gt; &lt;/li&gt;&lt;/ul&gt; Source: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-5853338718704656569?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/5853338718704656569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/11/tiobe-programming-community-index-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5853338718704656569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/5853338718704656569'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/11/tiobe-programming-community-index-for.html' title='TIOBE Programming Community Index for November 2009'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-8380368738433963607</id><published>2009-10-13T12:31:00.002+07:00</published><updated>2009-10-13T12:41:47.375+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='adodb'/><category scheme='http://www.blogger.com/atom/ns#' term='pdo'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmakeking'/><title type='text'>Benchmarking PDO and ADOdb Database Abstraction Libraries</title><content type='html'>I was unable to locate a satisfactory benchmark of PDO vs. ADOdb, so I decided create some to get an idea of the performance differences.&lt;br /&gt;&lt;br /&gt;I expected PDO to beat ADOdb easily, since PDO is a native PHP library and requires no run-time include. See my Web App benchmarking methodology here to understand why I was unsatisfied with the existing PDO vs ADOdb and PEAR::NET library benchmarks I found online.&lt;br /&gt;&lt;br /&gt;PDO vs ADOdb Benchmark - Select and Loop&lt;br /&gt;&lt;br /&gt;&lt;?php&lt;br /&gt; &lt;br /&gt;#Quick and dirty PDO vs ADOdb benchmark&lt;br /&gt; &lt;br /&gt;#PDO benchmark script:&lt;br /&gt;$db = new PDO("mysql:dbname=logs;host=127.0.0.1", "root", "");&lt;br /&gt;$rs = $db-&gt;query("select * from ses limit 10")-&gt;fetchAll(PDO::FETCH_ASSOC);&lt;br /&gt;foreach($rs as $r) {}&lt;br /&gt; &lt;br /&gt;#ADOdb benchmark script&lt;br /&gt;require_once("adodb5/adodb.inc.php");&lt;br /&gt;$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;&lt;br /&gt;$db = NewADOConnection("mysql://root:@127.0.0.1/logs");&lt;br /&gt;$rs = $db-&gt;Execute("select * from ses limit 10");&lt;br /&gt;foreach($rs as $r) {}&lt;br /&gt; &lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;view raw This Gist brought to you by GitHub.&lt;br /&gt;MySQL SELECT Benchmark Results, 1000 Requests, APC Disabled&lt;br /&gt;Library  Concurrency  Total Time  Requests/Sec.  Speedup/Slowdown&lt;br /&gt;ADOdb  1  20.90/sec  47.84  -&lt;br /&gt;PDO  1  0.73/sec  1358.62  +2840%&lt;br /&gt;ADOdb  50  10.78/sec  99.23  -&lt;br /&gt;PDO  50  0.54/sec  1850.90  +1865%&lt;br /&gt;ADOdb  100  10.44/sec  95.78  -&lt;br /&gt;PDO  100  0.53/sec  1869.33  +1952%&lt;br /&gt;&lt;br /&gt;APC should give ADOdb an advantage, here are the results of the same benchmark with APC enabled. The performance times for the PDO benchmarks with APC enabled did not change significantly as there were only 3 lines of code for APC to cache.&lt;br /&gt;MySQL SELECT Benchmark Results, 1000 Requests, APC Enabled&lt;br /&gt;Library  Concurrency  Total Time  Requests/Sec.  APC Speedup&lt;br /&gt;ADOdb  1  1.65/sec  604.52  +1264% (vs no APC)&lt;br /&gt;PDO  1  -  -  +225% (vs ADOdb)&lt;br /&gt;ADOdb  50  1.25/sec  798.26  +795% (vs no APC)&lt;br /&gt;PDO  50  -  -  +232% (vs ADOdb)&lt;br /&gt;ADOdb  100  1.33/sec  751.72  +785% (vs no APC)&lt;br /&gt;PDO  100  -  -  +249% (vs ADOdb)&lt;br /&gt;Conclusion&lt;br /&gt;&lt;br /&gt;If performance is critical, don’t consider ADOdb unless an optimizer such as APC is installed. Even then, I do not recommend ADOdb unless ADOdb offers some critical feature that is missing in PDO. Even with APC installed the best run of ADOdb was 225% slower than with PDO.&lt;br /&gt;&lt;br /&gt;Why? PDO is a native compiled library and not loaded at runtime.&lt;br /&gt;&lt;br /&gt;What about PEAR::NET? I have never used this library so I didn’t go to the bother of including it in my benchmark. Also, the purpose of this benchmark was to demonstrate the speedup of using the native PHP library vs a large included library, and I feel that the PEAR library will perform in a similar fashion as the ADOdb library if it is anywhere near the same size and complexity. That is an assumption however…&lt;br /&gt;Addendum&lt;br /&gt;&lt;br /&gt;6/5/2008&lt;br /&gt;&lt;br /&gt;I was questioned on my choice to exclude ADOdb with the ADOdb extension from this benchmark. I had given it little though at the start of this benchmark and decided to run the benchmark again to compare ADOdb with the extension installed to PDO’s best performance. I ran each benchmark here with and without APC enabled.&lt;br /&gt;MySQL SELECT Benchmark Results, 1000 Requests, ADOdb Extension&lt;br /&gt;APC  Concurrency  Total Time  Requests/Sec.  Slowdown vs. PDO&lt;br /&gt;No  1  18.38/sec  54.39  2498%&lt;br /&gt;Yes  1  1.63/sec  613.87  221%&lt;br /&gt;No  50  9.98/sec  100.18  1848%&lt;br /&gt;Yes  50  1.13/sec  878.63  211%&lt;br /&gt;No  100  9.75/sec  102.55  1823%&lt;br /&gt;Yes  100  1.2/sec  832.71  224%&lt;br /&gt;&lt;br /&gt;My conclusion regarding the ADOdb extension: Using my benchmarking methodology, there is little gain to be had with the extension enabled vs without it. I feel this is due to the fact that the ADOdb library must still be included at runtime even with the extension enabled in php.ini.&lt;br /&gt;&lt;br /&gt;In my environment, to get within almost half of the speed of PDO, I need two PHP extensions enabled - APC and the ADOdb C extension. PDO remains my recommendation for a database abstraction library from a performance standpoint.&lt;br /&gt;&lt;br /&gt;Another addition regarding my test environment: Intel Duo 2Ghz, 2GB RAM, Ubuntu 7.10, PHP 5.2.3 CGI, lighttpd 1.4.18. The disk is slow (5400rpm) so I suspect the slower IO is is increasing the library inclusion load time.&lt;br /&gt;source:&lt;a href="http://http://tonylandis.com/perfomance/php-adodb-pdo-mysql-database-apc-benchmark/"&gt;http://tonylandis.com/perfomance/php-adodb-pdo-mysql-database-apc-benchmark/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-8380368738433963607?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/8380368738433963607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/10/benchmarking-pdo-and-adodb-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8380368738433963607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8380368738433963607'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/10/benchmarking-pdo-and-adodb-database.html' title='Benchmarking PDO and ADOdb Database Abstraction Libraries'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-2221316214614536820</id><published>2009-10-02T11:09:00.001+07:00</published><updated>2009-10-02T14:19:08.606+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='cpu'/><category scheme='http://www.blogger.com/atom/ns#' term='webserver'/><category scheme='http://www.blogger.com/atom/ns#' term='nginx'/><category scheme='http://www.blogger.com/atom/ns#' term='Deathmatch'/><category scheme='http://www.blogger.com/atom/ns#' term='load'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Apache vs Nginx : Web Server Performance Deathmatch</title><content type='html'>&lt;div class="entry-content"&gt;     &lt;p&gt;Deathmatch may be an overstatement but here are the results from some performance benchmarking.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The Setup:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Server:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;CENTOS 5.1&lt;/li&gt;&lt;li&gt;Dual 2.4GHz Xeon CPUs&lt;/li&gt;&lt;li&gt;4GB RAM&lt;/li&gt;&lt;li&gt;RAID5 (4 x 15k disks)&lt;/li&gt;&lt;li&gt;Server and test client were connected via a consumer grade 10/100 switch&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Configurations:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Basic static vhost&lt;/li&gt;&lt;li&gt;Keepalive turned on and with timeout of 15 seconds&lt;/li&gt;&lt;li&gt;GZIP turned on&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I used &lt;a href="http://www.xenoclast.org/autobench/" onclick="javascript:urchinTracker('/outbound/www.xenoclast.org');"&gt;autobench&lt;/a&gt; to perform the tests. Basically this is a perl script that sits on top of &lt;a href="http://www.hpl.hp.com/research/linux/httperf/" onclick="javascript:urchinTracker('/outbound/www.hpl.hp.com');"&gt;httperf&lt;/a&gt; and will run multiple tests in succession outputing the results to CSV. Awfully convenient.&lt;/p&gt; &lt;p&gt;All the tests were run against the same robots.txt file. Autobench ran the following command 20 times incrementing the request rate by 10 each time. I started at 10 requests per second and went up to 200.&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt; httperf –timeout=5 –client=0/1 –server=HOST –port=80 –uri=/robots.txt –rate=X –send-buffer=4096 –recv-buffer=16384 –num-conns=5000 –num-calls=10&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I performed two samples and arbitrarily used the second as the results shown here. At the bottom of this post I will have spreadsheet containing the data from these tests so you can check out all the results.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The Results:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Both web servers performed well in all the tests and had no issues completing the requests. So I will not mention the metrics that they finished very closely on, only the ones that they did not have similar results.&lt;/p&gt; &lt;p&gt;There were three httperf related tests that Nginx and Apache differed on more than small amount, reply rate, network I/O and response time.&lt;/p&gt; &lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2235/2298818585_3baeeeb8a7.jpg?v=0" width="500" height="293" /&gt;&lt;/p&gt; &lt;p&gt;This one really piqued my interest. It seems strange to me why we would see such a result from Apache. In both tests there was a big difference at the 700 request mark. Statistically the difference was only on the max reply rate. The average and minimum are within a few tenths of a percent consistent through the tests. The max for Apache in the first test was 734.7 and in the second 758.7, standard deviations of 13.9 and 22.9 respectively. I suppose the real question here is whether or not this is my test or how Apache acts. If it is the later it seems strange that dealing with 700 requests would be any different than dealing with 800. From 800 requests to 2000, the larger differences in these results seems more realistic, controlled and gradual.&lt;/p&gt; &lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2207/2298695415_878064086a.jpg?v=0" width="500" height="305" /&gt;&lt;/p&gt; &lt;p&gt;The network I/O graph I find interesting mostly because I don’t know how to take it. On one hand it seems Apache is simply using more bandwidth to do the same number of requests as Nginx. Which would seem bad. On the other it could just mean that Apache does a better job of consuming and using the available pipe. Which would seem good. My hunch is that it is the former.&lt;/p&gt; &lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3241/2298693485_df1606c495.jpg?v=0" width="500" height="331" /&gt;&lt;/p&gt; &lt;p&gt;The response times are also interesting since Nginx responds consistently at 0.4 ms. I am not sure why this is since I don’t know the internals to Nginx but I imagine that it is something that is built into how it deals with requests.&lt;/p&gt; &lt;p&gt;While the httperf tests were running I collected sar data from that time. The results show that Nginx uses a good amount less CPU and produces equally less load.&lt;/p&gt; &lt;p&gt;Apache:&lt;/p&gt; &lt;p&gt;CPU:&lt;/p&gt; &lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3106/2298664881_4a3d493ec9.jpg?v=0" width="500" height="214" /&gt;&lt;/p&gt; &lt;p&gt;Load:&lt;/p&gt; &lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2306/2298664819_bfe6cc2483.jpg?v=0" width="500" height="143" /&gt;&lt;/p&gt; &lt;p&gt;Nginx:&lt;/p&gt; &lt;p&gt;CPU:&lt;/p&gt; &lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3069/2298664689_2312632a86.jpg?v=0" width="500" height="214" /&gt;&lt;/p&gt; &lt;p&gt;Load:&lt;/p&gt; &lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3229/2299462026_eb9032c6a1.jpg?v=0" width="500" height="143" /&gt;&lt;/p&gt; &lt;p&gt;Thats all I got, pretty cool. Nginx seems to compete pretty well with Apache and there doesn’t seem like there is a good reason not to use it especially in CPU usage constrained situations (ie huge traffic, slow machines and etc).&lt;/p&gt; &lt;p&gt;Here’s my results &lt;a href="http://www.joeandmotorboat.com/wp-content/files/bench_results-comb-static.ods"&gt;spreadsheet&lt;/a&gt; for the detailed results of each httperf metric.&lt;/p&gt;                        &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-2221316214614536820?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/2221316214614536820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/10/apache-vs-nginx-web-server-performance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2221316214614536820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/2221316214614536820'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/10/apache-vs-nginx-web-server-performance.html' title='Apache vs Nginx : Web Server Performance Deathmatch'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-7479470451619745665</id><published>2009-09-10T10:08:00.000+07:00</published><updated>2009-09-10T10:18:00.545+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='AHCI'/><category scheme='http://www.blogger.com/atom/ns#' term='SATA'/><category scheme='http://www.blogger.com/atom/ns#' term='ICH'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows XP'/><category scheme='http://www.blogger.com/atom/ns#' term='ICH9M'/><category scheme='http://www.blogger.com/atom/ns#' term='dell inspiron 1440'/><title type='text'>Install Windows XP on SATA without a Floppy (F6)</title><content type='html'>&lt;table style="margin-bottom: 20px;" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;       &lt;tr&gt;&lt;td colspan="2"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;        &lt;tr&gt;         &lt;td colspan="2" class="contentheadings"  style="padding-top: 15px; text-align: justify;font-size:11px;" id="article_container"&gt;          &lt;span id="intelliTxt"&gt;          &lt;div class="KonaBody"&gt;          &lt;!-- google_ad_section_start --&gt;          &lt;img src="http://news.softpedia.com/images/news2/Install-Windows-XP-On-SATA-Without-a-Floppy-F6-2.png" style="margin: 0pt 10px 10px 0pt; float: left;" border="0" /&gt; SATA hard drives have become more and more appreciated tending to substitute the IDE drives due to the increasing speed they offer. Motherboard manufacturers started to implement the new standard years ago, when the technology was young and expensive. Now, as the SATA HDD prices have lowered to a level where anybody can afford to choose a SATA enabled HDD instead of an IDE one, a great migration has been observed among the common computer users.&lt;br /&gt;&lt;br /&gt;They choose to install Windows and applications on SATA drives because they provide more speed which determines the system to run smoother. Thus, for those owning older mainboards with SATA support an extra step is required while attempting to install Windows XP. Windows XP does not provide drivers for all the SATA controllers, therefore, during the installation procedure, the user must insert a floppy with the drivers that came in the package along with the motherboard.&lt;br /&gt;&lt;br /&gt;Not a big deal, not much effort, but the funny thing is that a great number of people passed on their floppy drives. Under these circumstances, no floppy means the impossibility to install Windows XP on SATA (on some mainboards). The result? The installation guide simply won't detect the SATA HDD.&lt;br /&gt;&lt;br /&gt;People that were happy they got rid of the old removable drive have now motives to worry. Some may reconsider buying new floppy drives for their computers. Even if I wrote in a precedent article about the utility of the floppy drive, I do not encourage spending your money buying back an obsolete piece of hardware. I will present you a method to avoid this inconvenient by doing a software trick.&lt;br /&gt;&lt;br /&gt;Let's take it slow. Where is the problem? We have a driver problem strictly because the SATA driver we need does not come embedded in the Windows XP installation package. What if we add the driver by ourselves before installing Windows?&lt;br /&gt;&lt;br /&gt;What ingredients are involved in this operation? The original Windows XP Installation CD, a freeware application named &lt;a target="_blank" href="http://www.softpedia.com/get/System/OS-Enhancements/nLite.shtml"&gt;&lt;b&gt;NLite&lt;/b&gt;&lt;/a&gt; and a blank CD. Moreover, we need the drivers for the SATA controller provided by the manufacturer. In case you did not find any floppy inside the motherboard package or you cannot locate them on the mainboard installation CD, you can consult the manufacturer's website to download the latest versions. To do the trick I have been talking about, it is assumed that you already have a Windows installed on an IDE drive. In case you don't, pay a visit to a friend and ask him to let you use his computer. It won't take too much time, I guarantee.&lt;br /&gt;&lt;br /&gt;So, download the drivers and unzip them (in case they come archived) in a desired location. Then download and install the Nlite application. When you start the Nlite application, you will be asked to provide the location for the Windows installation package. Insert the genuine Windows Installation CD into the CD drive and, inside the application, select the CD drive letter.&lt;br /&gt;&lt;br /&gt;To insert the SATA drivers within the installation package, you need to have it saved on the HDD. Hence, when the warning window appears click OK and select the destination folder for the files to be saved. Make sure that the destination partition / HDD has enough space to store the contents of the installation CD.&lt;br /&gt;&lt;br /&gt;I tested a Windows XP Home Edition and it seems that it required about 566 MB. Immediately after you have chosen the destination folder, the application will start copying the Windows installation files. When finished, it will display some version information regarding the newly copied Windows Installation Package.&lt;br /&gt;&lt;br /&gt;Now, click next twice until you get to a screen where you get options sorted in 4 categories: Integrate, Remove, Setup, Create. We are interested in the integration procedure, therefore select the Drivers button and click next. From the next menu window, click Insert and select multiple drive folder option from the drop down menu. This option permits you to browse to the location where the downloaded drivers are found.&lt;br /&gt;&lt;br /&gt;Select the containing directory and click next. You will get a list with the available drivers (in case there are more than one) or simply one driver. Select it (them) and click next. Now the application will ask for the permission to start the integration procedure. Choose Yes and wait for the drivers to be inserted into the installation package.&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_001-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_001-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_002-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_002-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_003-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_003-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_004-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_004-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_005-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_005-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_006-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_006-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_007-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_007-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_008-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_008-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_009-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_009-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;With problematic driver being included in the installation package you can install Windows XP on your SATA HDD...but...the installation package is on the HDD. You need a bootable CD in order to start an installation. Don't worry, once the installation package has been adorned with additional user selected drivers it can be transformed into a bootable disk image and later burned on a CD. To encapsulate the installation into a ISO image use the same Nlite application.&lt;br /&gt;&lt;br /&gt;Open it, make sure the HDD installation folder is selected and click next. Select "Last session" preset and click next again. Now from the options menu choose Bootable ISO and click next. In the following window, make sure that the mode is set to "Create Image" and click Make ISO. A destination folder is required where the resulting ISO image will be saved. Once the image saving process finished you have the freedom to burn it on a blank CD with whatever you favorite CD burner software may be.&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_010-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_010-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://news.softpedia.com/images/reviews/large/SATAWIN_011-large.png" target="_blank" title="Click to view large image"&gt;&lt;img alt="Review image" src="http://news.softpedia.com/images/reviews/small/SATAWIN_011-small.png" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The new CD will be the twin copy of the Windows Installation CD but with one difference, it includes the SATA driver.&lt;/div&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-7479470451619745665?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/7479470451619745665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/09/install-windows-xp-on-sata-without.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7479470451619745665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7479470451619745665'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/09/install-windows-xp-on-sata-without.html' title='Install Windows XP on SATA without a Floppy (F6)'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-1958515346899053421</id><published>2009-06-19T11:36:00.000+07:00</published><updated>2009-06-19T12:08:05.879+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='modal box'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='autocomplete'/><title type='text'>Useful scripts and resources Facebook-inspired for web developers</title><content type='html'>&lt;div class="bigInt"&gt;&lt;img style="border: 1px solid rgb(222, 222, 222); padding: 4px; float: right; margin-left: 14px;" src="http://lh3.ggpht.com/_TqPdHmAEwTM/SfNmsCVvIvI/AAAAAAAAD-w/u0DcICpd8Jo/Picture%2011.png"/&gt;&lt;strong&gt;1. FaceBoox Search&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;  &lt;a href="http://web2ajax.fr/examples/facebook_searchengine/"&gt;FaceBoox&lt;/a&gt; is an autosuggest search engine inspired from Facebook for design which uses jQuery as ajax framework and BSN Autosuggest libs.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;2. Autobox 2&lt;/strong&gt;&lt;br/&gt;&lt;a href="http://www.bigredswitch.com/blog/2008/12/autobox2/"&gt;Autobox 2&lt;/a&gt; is an update of Autobox, a popular jQuery plugin to create input textbox with autosuggest features Facebook-like.&lt;br/&gt;&lt;br/&gt;&lt;img style="float: right; margin-left: 14px;" src="http://lh4.ggpht.com/_TqPdHmAEwTM/SfNi7yelpBI/AAAAAAAAD-g/0BUEgz9bkNg/Picture%208.png"/&gt;&lt;strong&gt;3. TextboxList&lt;/strong&gt;&lt;br/&gt;&lt;a href="http://devthought.com/blog/projects-news/2009/04/the-new-textboxlist-is-here/"&gt;TextboxList&lt;/a&gt; is a MooTools script similar to Autobox for jQuery.  This script turns normal textboxes into a widget which can be navigated with the keyboard, effectively turning your input into a list of items that can be easily deleted. It comes with an Autocomplete plugin.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;4. Modal Box&lt;/strong&gt;&lt;br/&gt;&lt;a href="http://davidwalsh.name/facebook-modal-mootools"&gt;This script&lt;/a&gt; is a MooTools clone of Facebook modal box. It’s lightweight, subtle, and very stylish.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;5. Facebook Pagination&lt;/strong&gt;&lt;br/&gt;&lt;a href="http://davidwparker.com/2008/09/30/facebook-style-unobrusive-ajax-pagination-for-will_paginate-with-jquery/"&gt;This script&lt;/a&gt; is a Facebook style, unobrusive ajax pagination plug-in for jQuery.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;6. Elastic&lt;/strong&gt;&lt;br/&gt;&lt;a href="http://www.unwrongest.com/projects/elastic/"&gt;Elastic&lt;/a&gt; is a jQuery plugin which makes your textareas grow and shrink to fit it’s content. It was inspired by the auto growing textareas on Facebook. The major difference between Elastic and it’s competitors is its weight.&lt;br/&gt;&lt;br/&gt;&lt;img style="float: right; margin-left: 14px;" src="http://lh5.ggpht.com/_TqPdHmAEwTM/SfNSHrp37lI/AAAAAAAAD-A/j0QOxNUf92I/fb.png"/&gt;&lt;strong&gt;7. Facebox&lt;/strong&gt;&lt;br/&gt;&lt;a href="http://famspam.com/facebox"&gt;Facebox&lt;/a&gt; is a jQuery-based, Facebook-style lightbox which can display images, divs, or entire remote pages. It's simple to use and easy on the eyes. Download the tarball, view the examples, then start enjoying the curves.&lt;br/&gt;&lt;br/&gt;&lt;img style="float: right; margin-left: 14px;" src="http://lh5.ggpht.com/_TqPdHmAEwTM/SfNkQdZ0XaI/AAAAAAAAD-o/KZwpXheMrgo/fb4.png"/&gt;&lt;strong&gt;8. Tipsy&lt;/strong&gt;&lt;br/&gt;&lt;a href="http://onehackoranother.com/projects/jquery/tipsy/"&gt;Tipsy&lt;/a&gt; is a jQuery plugin for creating a Facebook-like tooltips effect based on an anchor tag's title attribute.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;9. Action Streams&lt;/strong&gt;&lt;br/&gt;The &lt;a href="http://plugins.movabletype.org/action-streams/index.html"&gt;Action Streams plugin&lt;/a&gt; is an amazing new plugin (which imitates Facebook streams on your Wall) for Movable Type 4.1 that lets you aggregate, control, and share your actions around the web as well as a list of your profiles on various services.&lt;br/&gt;&lt;br/&gt;&lt;img style="border: 1px solid rgb(222, 222, 222); padding: 4px; float: right; margin-left: 14px;" src="http://lh5.ggpht.com/_TqPdHmAEwTM/SfOA3bdcqEI/AAAAAAAAD-4/IA8U_V1mRs8/fb5.png"/&gt;&lt;strong&gt;10. Facebook Application Icons&lt;/strong&gt;&lt;br/&gt;This is a collection of 28 free &lt;a href="http://www.visual-blast.com/graphics/icons/free-facebook-application-icons-in-vector-format/"&gt;facebook application icons&lt;/a&gt; in a high resolution .PNG and .SVG format.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;11. mooFacebook&lt;/strong&gt;&lt;br/&gt;&lt;a href="http://code.google.com/p/moofacebox/"&gt;mooFacebook&lt;/a&gt; is a port to Mootools of the original Facebox written by Chris Wanstrath with some added features like drag support and titles.&lt;br/&gt;&lt;br/&gt;&lt;img style="float: right; margin-left: 14px;" src="http://lh3.ggpht.com/_TqPdHmAEwTM/SfNX6YQyrpI/AAAAAAAAD-I/nPhofgwI04w/fb2.png"/&gt;&lt;strong&gt;12. Facebook Sliders With Mootools and CSS&lt;/strong&gt;&lt;br/&gt;David Walsh has created a very simple &lt;a href="http://davidwalsh.name/facebook-sliders-mootools"&gt;3-slider system Facebook-like&lt;/a&gt; that allows a user to modify the height, width, and opacity of an image using just sliders.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-1958515346899053421?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/1958515346899053421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/useful-scripts-and-resources-facebook.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/1958515346899053421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/1958515346899053421'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/useful-scripts-and-resources-facebook.html' title='Useful scripts and resources Facebook-inspired for web developers'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_TqPdHmAEwTM/SfNmsCVvIvI/AAAAAAAAD-w/u0DcICpd8Jo/s72-c/Picture%2011.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-8927196126086858796</id><published>2009-06-11T16:59:00.002+07:00</published><updated>2010-02-23T11:10:24.259+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apc'/><category scheme='http://www.blogger.com/atom/ns#' term='memcache'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql query cache'/><category scheme='http://www.blogger.com/atom/ns#' term='wp-cache'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><title type='text'>MySQL Query Cache, WP-Cache, APC, Memcache – What to choose</title><content type='html'>&lt;p&gt;Hello Cache Freaks,&lt;/p&gt; &lt;p&gt;Ever since I changed my job (from Business Intelligence to Web development) and started working with my present employer, I have had a chance to work on a lot of scalable projects. From making my project to scale from 20 Million PV’s to 100 Million PV’s to development of an internal tool, the answer to all scalable applications have been caching. &lt;/p&gt; &lt;p&gt;There are a lot of caching techniques which are being employed by sites worldwide. &lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;strong&gt;WP-Cache&lt;/strong&gt; used in wordpress – a file system based caching mechanism&lt;/li&gt;&lt;li&gt;&lt;strong&gt;APC Cache&lt;/strong&gt; – an opcode based caching system&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Memcache&lt;/strong&gt; – an in memory caching system&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Query Cache&lt;/strong&gt; – caching mechanism employed in MySQL&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Here in this post I would like to pen down my experiences while working with all the caching mechanism. Their pros and cons. What things you need to take care while working with them and every little tit bit which comes to my mind while writing this post.&lt;/p&gt; &lt;p&gt;&lt;strong style="font-size: 18px;"&gt;&lt;u&gt;Query Cache – inbuilt cache mechanism in MySQL&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;Query cache is an inbuilt cache mechanism for MySQL. Basically when you fire a query against a MySQL database, it goes through a lot of core modules. e.g. Connection Manager, Thread Manager, Connection Thread, User Authentication Module, Parse Module, Command Dispatcher, Optimizer Module, Table Manager, Query Cache Module and blah blah. Discussing these modules is out of scope of this blog post. The only module we are interested here is Query Cache Module. &lt;/p&gt; &lt;p&gt;Suppose I fire a query:&lt;br /&gt;$query = “Select * from users”;&lt;/p&gt; &lt;p&gt;MySQL fetches it for the first time from the database and caches the result for further similar query. Next time when you fire a similar query, it picks the result from the cache and deliver it back to you.&lt;/p&gt; &lt;p&gt;However, there are a few &lt;u&gt;drawbacks&lt;/u&gt; with Query Cache:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;If there is a new entry in the &lt;em&gt;users&lt;/em&gt; table, the cache is cleared.&lt;/li&gt;&lt;li&gt;Secondly, even if the result of your query is cached, MySQL has to go through a number of core modules before it give back the cached result to you.&lt;/li&gt;&lt;li&gt;Thirdly, even if your results are caches, you need to connect to your MySQL database, which generally have a bottleneck with number of connections allowed.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;One thing which you should take care while replying on Query Cache is that, your query must not have any parameter which is random or changes quite often. For e.g. If you wish to fetch url’s of 100 photo from the database, and then you want to present them in a random fashion every time, you might be tempted to use &lt;strong&gt;rand()&lt;/strong&gt; somewhere in your MySQL queries. However by using rand() you ensure that the query is never returned from cache, since rand() parameter always makes the query look different.&lt;/p&gt; &lt;p&gt;Similarly, If you have a case where you need to show data not older than 15 days, and by mistake you also include the seconds parameter in your SQL query, then the query will never return from cache.&lt;/p&gt; &lt;p&gt;Hence for a scalable site, with 100 Million PV’s you can’t really survive with a simple query cache provided by MySQL database.&lt;/p&gt; &lt;p&gt;&lt;strong style="font-size: 18px;"&gt;&lt;u&gt;WP-Cache – Caching mechanism for Wordpress blogs&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;WP-Cache is a file system based caching mechanism i.e. it caches your blog posts in form of simple text files which are saved on your file system. You can have a look at these cached files by visiting &lt;em&gt;&lt;u&gt;wp-content/cache&lt;/u&gt;&lt;/em&gt; folder inside your blog directory. Generally you will find two set of files for a single blog post. One .html and another .meta file.&lt;/p&gt; &lt;p&gt;&lt;u&gt;&lt;em&gt;.html file&lt;/em&gt;&lt;/u&gt; generally contains the static html content for your blog post. Once published, the blog post content is static, hence instead of fetching it’s data from the database, WP-Cache serves it from the &lt;em&gt;cache&lt;/em&gt; directory.&lt;/p&gt; &lt;p&gt;&lt;u&gt;&lt;em&gt;.meta file&lt;/em&gt;&lt;/u&gt; contains serialized information such as Last Modified, Content-Type, URI which WP-Cache uses to maintain cache expiry on your blog.&lt;/p&gt; &lt;p&gt;WP-Cache works really well, however if the traffic starts increasing on your blog, then the bottleneck will be maximum number of child processes which apache can create (&lt;em&gt;For starters you can think, each user connecting to your blog as one apache process, hence there is a restriction on number of users who can connect to your blog at a particular time&lt;/em&gt;). In such case the solution can be either to have multiple front end servers with a load balancer to distribute the traffic among front end servers, or to have a better cache solution such as a memory based caching mechanism (e.g. Memcache). Also since memory read is always faster than file read, you must go for a memory based cache system.&lt;/p&gt; &lt;p&gt;&lt;strong style="font-size: 18px;"&gt;&lt;u&gt;APC Cache – An opcode based cache for PHP&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;APC stands for Alternative PHP Cache. In one of my previous post &lt;a target="_blank" href="http://abhinavsingh.com/blog/2008/11/how-does-php-echos-a-hello-world-behind-the-scene/"&gt;How does PHP echo’s a “Hello World”? – Behind the scene&lt;/a&gt;, I talk about how PHP churns out “Hello World” for you. &lt;/p&gt; &lt;p&gt;PHP takes your code through various steps:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Scanning – The human readable source code is turned into tokens.&lt;/li&gt;&lt;li&gt;Parsing – Groups of tokens are collected into simple, meaningful expressions.&lt;/li&gt;&lt;li&gt;Compilation – Expressions are translated into instruction (opcodes)&lt;/li&gt;&lt;li&gt;Execution – Opcode stacks are processed (one opcode at a time) to perform the scripted tasks.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Opcode caches let the ZEND engine perform the first three of these steps, then store that compiled form (opcodes) so that the next time a given script is used, it can use the stored version without having to redo those steps only to come to the same result.&lt;/p&gt; &lt;p&gt;However the problem with APC cache is that it is not a distributed cache system. By distributed cache I mean, if you have 3 frontend server then you need to have a copy of this opcode on all the three fronend server. &lt;del datetime="2009-01-16T14:17:16+00:00"&gt;Also like WP-Cache APC is again a file system driven cache system, which is not the optimal solution.&lt;/del&gt; Also with APC cache, PHP still has to go through the last step as described above.&lt;/p&gt; &lt;p&gt;&lt;strong style="font-size: 18px;"&gt;&lt;u&gt;Memcache – In memory based cache mechanism&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;Memcache is the solution when you talk about million PV’s on your site. &lt;em&gt;It is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;For starters, Memcache is not PHP, nor Python or any other thing as you may think. It’s a deamon which runs in the background on your server. Your code connects to it and cache query results, JS, CSS and other cachable data in the server’s memory (RAM). Since its an in-memory caching system, it is faster than any of the discussed caching system above. However it is unreliable and unsecure but then there are ways to tackle this unreliable and unsecure nature of memcache.&lt;/p&gt; &lt;p&gt;Memcache is unreliable because it resides in your system memory. So an event like system reboot or power failure will result in loss of all your cache. Also memcache provides no mechanism to take backup of your caches. Hence once lost, you need to programmatically warmup your caches.&lt;/p&gt; &lt;p&gt;Memcache is unsecure because it doesn’t require any authentication mechanism. There is no username or password with which your code connects to it. (Hence it is super fast, unlike Query cache which has to go through auth module even if the query result is cached). It usually runs at port 11211 on your server and if not taken care, anyone can telnet to port 11211 on your server and steal your caches.&lt;/p&gt; &lt;p&gt;Below are the steps which are being followed on a memcache enabled website:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;User enter your site’s url in his browser, say http://localhost&lt;/li&gt;&lt;li&gt;There are about 6 queries which drives your opening page&lt;/li&gt;&lt;li&gt;Lets assume one of the query for this page is &lt;em&gt;$query = “SELECT photo_url from photos LIMIT 0,10″&lt;/em&gt;&lt;/li&gt;&lt;li&gt;When the user visit http://localhost, your code will first connect to memcache deamon on port 11211&lt;/li&gt;&lt;li&gt;If memcache deamon is running, it checks if the result of this query are already cached. Generally data is cached in memcache as (key,value) pair&lt;/li&gt;&lt;li&gt;Since this is the first visit on your site, ofcourse there is no query being cached till now. Hence your code now connect to your MySQL database and fetched the resultset. Something like this probably. &lt;em&gt;$resultset = mysql_query($query);&lt;/em&gt;&lt;/li&gt;&lt;li&gt;After successfully fetching the resultset, your code will cache this resultset in memcache. The code connects to memcache deamon and saves this (key,value) pair in memory, where $key = md5($query) and $value = serialize($resultset)&lt;/li&gt;&lt;li&gt;After caching the (key,value) pair, your code returns back the fetched resultset to the frontpage where it is being displayed to the user&lt;/li&gt;&lt;li&gt;Similarly all the 6 queries which drives your front page are being cached one by one&lt;/li&gt;&lt;li&gt;Now the next time when another user visit this page i.e. http://localhost, your code will first see if $key = md5($query) is already present in cache. It will find the $key being cached, fetches the serialized resultset from memory, unserialize it and throws back to the front page where it is displayed as intended&lt;/li&gt;&lt;li&gt;While caching (key,value) pair you also have a provision to specify a TTL (time to live) after which memcache will automatically expire your cached result&lt;/li&gt;&lt;li&gt;Suppose you specifies a TTL = 15 Minutes for all the above queries and now a visitor visit http://localhost after 30 minutes&lt;/li&gt;&lt;li&gt;Your code will again first connect to memcache deamon and check if $key = md5($query) is present in cache. Memcache deamon will see that this $key is present but it has expired. It will return a result saying $key is not cached and internally flushes out $key. Your code then again connect to MySQL database, fetches the resultset and cache back the results in memcache for further use&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;I will leave you with a presentation on memcache which I gave sometime back at office. I hope it will help you gain more understanding of memcache.&lt;/p&gt; &lt;center&gt; &lt;div style="width: 425px; text-align: left;" id="__ss_917157"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/imoracle/memcache-presentation?type=powerpoint" title="Memcache"&gt;Memcache&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=memcache-1231956637654098-1&amp;amp;stripped_title=memcache-presentation"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=memcache-1231956637654098-1&amp;amp;stripped_title=memcache-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt; &lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View SlideShare &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/imoracle/memcache-presentation?type=powerpoint" title="View Memcache on SlideShare"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/upload?type=powerpoint"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/caching"&gt;caching&lt;/a&gt; &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/memcache"&gt;memcache&lt;/a&gt;)&lt;/div&gt; &lt;/div&gt; &lt;/center&gt;&lt;br /&gt;&lt;p&gt;In my next posts, I will be covering a few code samples and use cases of memcache which you wouldn’t even heard of. If you liked the post don’t forget to promote it on social networking sites and do subscribe to my blog. &lt;img src="http://abhinavsingh.com/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /&gt;&lt;/p&gt;&lt;p&gt;source: &lt;a href="http://abhinavsingh.com/blog/2009/01/mysql-query-cache-wp-cache-apc-memcache-what-to-choose"&gt;http://abhinavsingh.com/blog/2009/01/mysql-query-cache-wp-cache-apc-memcache-what-to-choose&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-8927196126086858796?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/8927196126086858796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/mysql-query-cache-wp-cache-apc-memcache.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8927196126086858796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8927196126086858796'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/mysql-query-cache-wp-cache-apc-memcache.html' title='MySQL Query Cache, WP-Cache, APC, Memcache – What to choose'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-8806055307934683712</id><published>2009-06-10T12:33:00.000+07:00</published><updated>2009-06-10T12:36:39.239+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Install Configure Apache Localhost Perl on Linux Ubuntu</title><content type='html'>This article teaches those who want to run Perl scripts from browser on Ubuntu Linux with Apache HTTP Server.&lt;br /&gt;&lt;br /&gt;1. First, you need to install apache2 by executing the following command from the terminal:&lt;br /&gt;&lt;br /&gt;sudo apt-get install apache2&lt;br /&gt;&lt;br /&gt;2. Now you can install mod_perl by executing the following command from the terminal:&lt;br /&gt;&lt;br /&gt;apt-get install libapache2-mod-perl2&lt;br /&gt;&lt;br /&gt;3. If you know how to set up a local server directory to let files like example.html running from browser like http://localhost/example.html or you previously installed LAMP, then you can read on, if not, please read this article first before continue.&lt;br /&gt;&lt;br /&gt;4. Now you may need to edit Apache Configuration file in order to tell Apache Perl where your .pl script is located, so that the server can execute it as Perl script. So let’s say if you put your Perl script example.pl inside a folder located at your defined local server directory for instance /home/shi/Documents/Host/perl/example.pl, you need to open apache2.conf:&lt;br /&gt;&lt;br /&gt;sudo gedit /etc/apache2/apache2.conf&lt;br /&gt;&lt;br /&gt;add in the code:&lt;br /&gt;view source&lt;br /&gt;print?&lt;br /&gt;01.Alias /perl/ /home/shi/Documents/Host/perl/&lt;br /&gt;02. &lt;br /&gt;03.PerlModule ModPerl::Registry&lt;br /&gt;04. &lt;br /&gt;05.&lt;Location /perl/&gt;&lt;br /&gt;06.   SetHandler perl-script&lt;br /&gt;07.   PerlHandler ModPerl::Registry&lt;br /&gt;08.   #PerlHandler ModPerl::PerlRun&lt;br /&gt;09.   Options +ExecCGI&lt;br /&gt;10.   #PerlSendHeader On&lt;br /&gt;11.&lt;/Location&gt;&lt;br /&gt;(change the line /home/shi/Documents/Host/perl/ to your server directory name)&lt;br /&gt;&lt;br /&gt;And now restart your server by running the following command in terminal:&lt;br /&gt;&lt;br /&gt;sudo /etc/init.d/apache2 restart&lt;br /&gt;&lt;br /&gt;Now write a test.pl file with the test script below:&lt;br /&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;use CGI;&lt;br /&gt;my $query= new CGI;&lt;br /&gt;print $query-&gt;header;&lt;br /&gt;print "hello people in my head\n";&lt;br /&gt;&lt;br /&gt;set the test.pl file permission to 755 and put it in your local server directory and type the url path in the browser and you should see the message: ‘hello people in my head’.&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-8806055307934683712?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/8806055307934683712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/install-configure-apache-localhost-perl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8806055307934683712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/8806055307934683712'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/install-configure-apache-localhost-perl.html' title='Install Configure Apache Localhost Perl on Linux Ubuntu'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-3485168368743889834</id><published>2009-06-08T13:08:00.000+07:00</published><updated>2009-08-14T11:09:10.634+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='memcache php'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='memcached'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='rehat'/><title type='text'>How to install memcached and php memcache  on linux server</title><content type='html'>&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;&lt;strong&gt;memcached&lt;/strong&gt; is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;&lt;strong&gt;memcached&lt;/strong&gt; is meant to work in concert with something like the MySQL query cache, not replace it. The two implementations excel at vastly different things: &lt;strong&gt;memcached&lt;/strong&gt; is an object cache, while MySQL provides a query cache.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;&lt;strong&gt;memcached&lt;/strong&gt; is extremely fast. It uses &lt;strong&gt;libevent&lt;/strong&gt;, which provides a mechanism to execute a callback function when a specific event occurs on a file descriptor, to scale to any number of open connections. On a modern Linux system memcached utilizes epoll, is completely non-blocking for network I/O, ensures memory never gets fragmented, and uses its own slab allocator and hash table to achieve 0(1) virtual memory allocation.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;How it install it on Linux server ?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;Install dependency software (Libevent)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;pre&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;#curl -O http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz&lt;br /&gt;#tar -xzvf libevent-1.4.9-stable.tar.gz&lt;br /&gt;#cd libevent*&lt;br /&gt;#./configure&lt;br /&gt;#make&lt;br /&gt;#make install&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;Now let’s download the newest Memcached source&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;pre&gt;&lt;strong&gt;#curl -O http://www.danga.com/memcached/dist/memcached-1.3.0.tar.gz&lt;br /&gt;#tar zxf memcached-1.3.0.tar.gz&lt;br /&gt;#cd memcached-1.3.0&lt;br /&gt;#./configure&lt;br /&gt;#make&lt;br /&gt;#make install&lt;/strong&gt;&lt;/pre&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;Then add /usr/local/lib to LD_LIBRARY_PATH in your .bash_profile&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;pre&gt;&lt;strong&gt;LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib&lt;br /&gt;export LD_LIBRARY_PATH&lt;/strong&gt;&lt;/pre&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;How it Works&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;First, you start up the memcached daemon on as many spare machines as you have. The daemon has no configuration file, just a few command line options, only 3 or 4 of which you’ll likely use:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;Run Memcached as a daemon (d = daemon, m = memory, u = user, l = IP to listen to, p = port)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;pre&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;#memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211 –u nobody&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;This starts memcached as a &lt;strong&gt;daemon (-d)&lt;/strong&gt; on the&lt;strong&gt; IP addres&lt;/strong&gt;s and &lt;strong&gt;port&lt;/strong&gt; specified with&lt;strong&gt; -l &lt;/strong&gt;and &lt;strong&gt;-p&lt;/strong&gt;, respectively, running as the &lt;strong&gt;user nobody (-u),&lt;/strong&gt; allocating&lt;strong&gt; 1024  for object storage (-m)&lt;/strong&gt;. You should adjust the amount of storage to suit your needs; many memcached installs run with 4 GB. Once you are comfortable with your startup options, add the appropriate command to your startup scripts.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;Create a &lt;strong&gt;/etc/init.d/memcached&lt;/strong&gt; file and add above line to start memcached when the server boots&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;With memcached installed and running, it’s time to get PHP talking to the object cache. While multiple PHP API exists, the one in the PECL repository is recommended. If you are running a newer version of PHP, installation is as simple as:&lt;/span&gt;&lt;/p&gt; &lt;pre&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;# pecl install memcache&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;Or you can use following steps to install PECL memcache manually.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;pre&gt;&lt;strong&gt;#cd /usr/local/src&lt;br /&gt;#curl -O http://pecl.php.net/get/memcache&lt;br /&gt;#tar zxvf memcache*&lt;br /&gt;#cd memcache-*&lt;br /&gt;#phpize&lt;br /&gt;#./configure&lt;br /&gt;#make &amp;amp;&amp;amp; make install&lt;/strong&gt;&lt;/pre&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;Now we have to make sure PHP loads the newly built memcache.so library by adding the following line to php.ini:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt;"&gt;extension=memcache.so&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;Now restart Apache:&lt;/span&gt;&lt;/p&gt; &lt;pre&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;Service httpd restart&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 10pt; font-family: Georgia;"&gt;&lt;span&gt; &lt;/span&gt;Once it sucussfully install you can create&lt;span&gt; &lt;/span&gt;phpinfo() on your webserver should now confirm that memcache is installed.&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 10pt; font-family: Georgia;"&gt;&lt;a href="http://linuxwindowsmaster.com/how-to-install-memcache/" onclick=""&gt;&lt;img class="aligncenter size-full wp-image-225" title="memcache" src="http://linuxwindowsmaster.com/wp-content/uploads/2009/04/memcache.jpg" alt="memcache How to install memcache on linux server?" height="393" width="600" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-3485168368743889834?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/3485168368743889834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/how-to-install-memcached-and-php.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3485168368743889834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/3485168368743889834'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/how-to-install-memcached-and-php.html' title='How to install memcached and php memcache  on linux server'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-6464680228152624485</id><published>2009-06-05T12:31:00.001+07:00</published><updated>2009-06-05T12:32:33.502+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='extension'/><category scheme='http://www.blogger.com/atom/ns#' term='modules'/><category scheme='http://www.blogger.com/atom/ns#' term='dso'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='httpd'/><category scheme='http://www.blogger.com/atom/ns#' term='apxs'/><title type='text'>apxs - APache eXtenSion tool</title><content type='html'>&lt;p&gt;&lt;code&gt;apxs&lt;/code&gt; is a tool for building and installing extension     modules for the Apache HyperText Transfer Protocol (HTTP) server. This is     achieved by building a dynamic shared object (DSO) from one or more source     or object &lt;var&gt;files&lt;/var&gt; which then can be loaded into the Apache server     under runtime via the &lt;code class="directive"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_so.html#loadmodule"&gt;LoadModule&lt;/a&gt;&lt;/code&gt;     directive from &lt;code class="module"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_so.html"&gt;mod_so&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt;      &lt;p&gt;So to use this extension mechanism your platform has to support the DSO     feature and your Apache &lt;code class="program"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/programs/httpd.html"&gt;httpd&lt;/a&gt;&lt;/code&gt; binary has to be built with the     &lt;code class="module"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_so.html"&gt;mod_so&lt;/a&gt;&lt;/code&gt; module. The &lt;code&gt;apxs&lt;/code&gt; tool automatically     complains if this is not the case. You can check this yourself by manually     running the command&lt;/p&gt;      &lt;div class="example"&gt;&lt;p&gt;&lt;code&gt;       $ httpd -l     &lt;/code&gt;&lt;/p&gt;&lt;/div&gt;      &lt;p&gt;The module &lt;code class="module"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_so.html"&gt;mod_so&lt;/a&gt;&lt;/code&gt; should be part of the displayed list.     If these requirements are fulfilled you can easily extend your Apache     server's functionality by installing your own modules with the DSO mechanism     by the help of this &lt;code&gt;apxs&lt;/code&gt; tool:&lt;/p&gt;      &lt;div class="example"&gt;&lt;p&gt;&lt;code&gt;       $ apxs -i -a -c mod_foo.c&lt;br /&gt;     gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c&lt;br /&gt;     ld -Bshareable -o mod_foo.so mod_foo.o&lt;br /&gt;     cp mod_foo.so /path/to/apache/modules/mod_foo.so&lt;br /&gt;     chmod 755 /path/to/apache/modules/mod_foo.so&lt;br /&gt;     [activating module `foo' in /path/to/apache/etc/httpd.conf]&lt;br /&gt;     $ apachectl restart&lt;br /&gt;     /path/to/apache/sbin/apachectl restart: httpd not running, trying to start&lt;br /&gt;     [Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module&lt;br /&gt;     /path/to/apache/sbin/apachectl restart: httpd started&lt;br /&gt;     $ _     &lt;/code&gt;&lt;/p&gt;&lt;/div&gt;      &lt;p&gt;The arguments &lt;var&gt;files&lt;/var&gt; can be any C source file (.c), a object     file (.o) or even a library archive (.a). The &lt;code&gt;apxs&lt;/code&gt; tool     automatically recognizes these extensions and  automatically used the C     source files for compilation while just using the object and archive files     for the linking phase. But when using such pre-compiled objects make sure     they are compiled for position independent code (PIC) to be able to use them     for a dynamically loaded shared object. For instance with GCC you always     just have to use &lt;code&gt;-fpic&lt;/code&gt;. For other C compilers consult its     manual page or at watch for the flags &lt;code&gt;apxs&lt;/code&gt; uses to compile the     object files.&lt;/p&gt;      &lt;p&gt;For more details about DSO support in Apache read the documentation of     &lt;code class="module"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_so.html"&gt;mod_so&lt;/a&gt;&lt;/code&gt; or perhaps even read the     &lt;code&gt;src/modules/standard/mod_so.c&lt;/code&gt; source file.&lt;/p&gt;  &lt;div id="quickview"&gt;&lt;ul id="toc"&gt;&lt;li&gt;&lt;img alt="" src="http://httpd.apache.org/docs/2.2/images/down.gif" /&gt; &lt;a href="http://httpd.apache.org/docs/2.2/programs/apxs.html#synopsis"&gt;Synopsis&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;img alt="" src="http://httpd.apache.org/docs/2.2/images/down.gif" /&gt; &lt;a href="http://httpd.apache.org/docs/2.2/programs/apxs.html#options"&gt;Options&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;img alt="" src="http://httpd.apache.org/docs/2.2/images/down.gif" /&gt; &lt;a href="http://httpd.apache.org/docs/2.2/programs/apxs.html#examples"&gt;Examples&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;See also&lt;/h3&gt;&lt;ul class="seealso"&gt;&lt;li&gt;&lt;code class="program"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/programs/apachectl.html"&gt;apachectl&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class="program"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/programs/httpd.html"&gt;httpd&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; &lt;div class="top"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/programs/apxs.html#page-header"&gt;&lt;img alt="top" src="http://httpd.apache.org/docs/2.2/images/up.gif" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;div class="section"&gt; &lt;h2&gt;&lt;a name="synopsis" id="synopsis"&gt;Synopsis&lt;/a&gt;&lt;/h2&gt;     &lt;p&gt;&lt;code&gt;&lt;strong&gt;apxs&lt;/strong&gt; -&lt;strong&gt;g&lt;/strong&gt;     [ -&lt;strong&gt;S&lt;/strong&gt; &lt;var&gt;name&lt;/var&gt;=&lt;var&gt;value&lt;/var&gt; ]     -&lt;strong&gt;n&lt;/strong&gt; &lt;var&gt;modname&lt;/var&gt;&lt;/code&gt;&lt;/p&gt;      &lt;p&gt;&lt;code&gt;&lt;strong&gt;apxs&lt;/strong&gt; -&lt;strong&gt;q&lt;/strong&gt;     [ -&lt;strong&gt;S&lt;/strong&gt; &lt;var&gt;name&lt;/var&gt;=&lt;var&gt;value&lt;/var&gt; ]     &lt;var&gt;query&lt;/var&gt; ...&lt;/code&gt;&lt;/p&gt;      &lt;p&gt;&lt;code&gt;&lt;strong&gt;apxs&lt;/strong&gt; -&lt;strong&gt;c&lt;/strong&gt;     [ -&lt;strong&gt;S&lt;/strong&gt; &lt;var&gt;name&lt;/var&gt;=&lt;var&gt;value&lt;/var&gt; ]     [ -&lt;strong&gt;o&lt;/strong&gt; &lt;var&gt;dsofile&lt;/var&gt; ]     [ -&lt;strong&gt;I&lt;/strong&gt; &lt;var&gt;incdir&lt;/var&gt; ]     [ -&lt;strong&gt;D&lt;/strong&gt; &lt;var&gt;name&lt;/var&gt;=&lt;var&gt;value&lt;/var&gt; ]     [ -&lt;strong&gt;L&lt;/strong&gt; &lt;var&gt;libdir&lt;/var&gt; ]     [ -&lt;strong&gt;l&lt;/strong&gt; &lt;var&gt;libname&lt;/var&gt; ]     [ -&lt;strong&gt;Wc,&lt;/strong&gt;&lt;var&gt;compiler-flags&lt;/var&gt; ]     [ -&lt;strong&gt;Wl,&lt;/strong&gt;&lt;var&gt;linker-flags&lt;/var&gt; ]     &lt;var&gt;files&lt;/var&gt; ...&lt;/code&gt;&lt;/p&gt;      &lt;p&gt;&lt;code&gt;&lt;strong&gt;apxs&lt;/strong&gt; -&lt;strong&gt;i&lt;/strong&gt;     [ -&lt;strong&gt;S&lt;/strong&gt; &lt;var&gt;name&lt;/var&gt;=&lt;var&gt;value&lt;/var&gt; ]     [ -&lt;strong&gt;n&lt;/strong&gt; &lt;var&gt;modname&lt;/var&gt; ]     [ -&lt;strong&gt;a&lt;/strong&gt; ]     [ -&lt;strong&gt;A&lt;/strong&gt; ]     &lt;var&gt;dso-file&lt;/var&gt; ...&lt;/code&gt;&lt;/p&gt;      &lt;p&gt;&lt;code&gt;&lt;strong&gt;apxs&lt;/strong&gt; -&lt;strong&gt;e&lt;/strong&gt;     [ -&lt;strong&gt;S&lt;/strong&gt; &lt;var&gt;name&lt;/var&gt;=&lt;var&gt;value&lt;/var&gt; ]     [ -&lt;strong&gt;n&lt;/strong&gt; &lt;var&gt;modname&lt;/var&gt; ]     [ -&lt;strong&gt;a&lt;/strong&gt; ]     [ -&lt;strong&gt;A&lt;/strong&gt; ]     &lt;var&gt;dso-file&lt;/var&gt; ...&lt;/code&gt;&lt;/p&gt; &lt;/div&gt;&lt;div class="top"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/programs/apxs.html#page-header"&gt;&lt;img alt="top" src="http://httpd.apache.org/docs/2.2/images/up.gif" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;div class="section"&gt; &lt;h2&gt;&lt;a name="options" id="options"&gt;Options&lt;/a&gt;&lt;/h2&gt;     &lt;h3&gt;&lt;a name="options.common" id="options.common"&gt;Common Options&lt;/a&gt;&lt;/h3&gt;       &lt;dl&gt;&lt;dt&gt;&lt;code&gt;-n &lt;var&gt;modname&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This explicitly sets the module name for the &lt;code&gt;-i&lt;/code&gt; (install)       and &lt;code&gt;-g&lt;/code&gt; (template generation) option. Use this to explicitly       specify the module name. For option &lt;code&gt;-g&lt;/code&gt; this is required, for       option &lt;code&gt;-i&lt;/code&gt; the &lt;code&gt;apxs&lt;/code&gt; tool tries to determine the       name from the source or (as a fallback) at least by guessing it from the       filename.&lt;/dd&gt;&lt;/dl&gt;           &lt;h3&gt;&lt;a name="options.query" id="options.query"&gt;Query Options&lt;/a&gt;&lt;/h3&gt;       &lt;dl&gt;&lt;dt&gt;&lt;code&gt;-q&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Performs a query for &lt;code&gt;apxs&lt;/code&gt;'s knowledge about certain       settings. The &lt;var&gt;query&lt;/var&gt; parameters can be one or more of the       following strings: &lt;code&gt;CC&lt;/code&gt;, &lt;code&gt;CFLAGS&lt;/code&gt;,       &lt;code&gt;CFLAGS_SHLIB&lt;/code&gt;, &lt;code&gt;INCLUDEDIR&lt;/code&gt;, &lt;code&gt;LD_SHLIB&lt;/code&gt;,       &lt;code&gt;LDFLAGS_SHLIB&lt;/code&gt;, &lt;code&gt;LIBEXECDIR&lt;/code&gt;,       &lt;code&gt;LIBS_SHLIB&lt;/code&gt;, &lt;code&gt;SBINDIR&lt;/code&gt;, &lt;code&gt;SYSCONFDIR&lt;/code&gt;,       &lt;code&gt;TARGET&lt;/code&gt;.        &lt;p&gt;Use this for manually determining settings. For instance use&lt;/p&gt;       &lt;div class="example"&gt;&lt;p&gt;&lt;code&gt;         INC=-I`apxs -q INCLUDEDIR`       &lt;/code&gt;&lt;/p&gt;&lt;/div&gt;        &lt;p&gt;inside your own Makefiles if you need manual access to Apache's C       header files.&lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;           &lt;h3&gt;&lt;a name="options.conf" id="options.conf"&gt;Configuration Options&lt;/a&gt;&lt;/h3&gt;       &lt;dl&gt;&lt;dt&gt;&lt;code&gt;-S &lt;var&gt;name&lt;/var&gt;=&lt;var&gt;value&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This option changes the apxs settings described above.&lt;/dd&gt;&lt;/dl&gt;           &lt;h3&gt;&lt;a name="options.template" id="options.template"&gt;Template Generation Options&lt;/a&gt;&lt;/h3&gt;       &lt;dl&gt;&lt;dt&gt;&lt;code&gt;-g&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This generates a subdirectory &lt;var&gt;name&lt;/var&gt; (see option       &lt;code&gt;-n&lt;/code&gt;) and there two files: A sample module source file named       &lt;code&gt;mod_&lt;var&gt;name&lt;/var&gt;.c&lt;/code&gt; which can be used as a template for       creating your own modules or as a quick start for playing with the       apxs mechanism. And a corresponding &lt;code&gt;Makefile&lt;/code&gt; for even easier       build and installing of this module.&lt;/dd&gt;&lt;/dl&gt;           &lt;h3&gt;&lt;a name="options.dso" id="options.dso"&gt;DSO Compilation Options&lt;/a&gt;&lt;/h3&gt;       &lt;dl&gt;&lt;dt&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This indicates the compilation operation. It first compiles the C       source files (.c) of &lt;var&gt;files&lt;/var&gt; into corresponding object files (.o)       and then builds a dynamically shared object in &lt;var&gt;dsofile&lt;/var&gt; by       linking these object files plus the remaining object files (.o and .a) of       &lt;var&gt;files&lt;/var&gt;. If no &lt;code&gt;-o&lt;/code&gt; option is specified the output       file is guessed from the first filename in &lt;var&gt;files&lt;/var&gt; and thus       usually defaults to &lt;code&gt;mod_&lt;var&gt;name&lt;/var&gt;.so&lt;/code&gt;.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-o &lt;var&gt;dsofile&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Explicitly specifies the filename of the created dynamically shared       object. If not specified and the name cannot be guessed from the       &lt;var&gt;files&lt;/var&gt; list, the fallback name &lt;code&gt;mod_unknown.so&lt;/code&gt; is       used.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-D &lt;var&gt;name&lt;/var&gt;=&lt;var&gt;value&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This option is directly passed through to the compilation command(s).       Use this to add your own defines to the build process.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-I &lt;var&gt;incdir&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This option is directly passed through to the compilation command(s).       Use this to add your own include directories to search to the build       process.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-L &lt;var&gt;libdir&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This option is directly passed through to the linker command. Use this       to add your own library directories to search to the build  process.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-l &lt;var&gt;libname&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This option is directly passed through to the linker command. Use this       to add your own libraries to search to the build process.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-Wc,&lt;var&gt;compiler-flags&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This option passes &lt;var&gt;compiler-flags&lt;/var&gt; as additional flags to       the &lt;code&gt;libtool --mode=compile&lt;/code&gt; command. Use this to add local       compiler-specific options.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-Wl,&lt;var&gt;linker-flags&lt;/var&gt;&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This option passes &lt;var&gt;linker-flags&lt;/var&gt; as additional       flags to the &lt;code&gt;libtool --mode=link&lt;/code&gt; command. Use this       to add local linker-specific options.&lt;/dd&gt;&lt;/dl&gt;           &lt;h3&gt;&lt;a name="options.dsoinstall" id="options.dsoinstall"&gt;DSO Installation and Configuration Options&lt;/a&gt;&lt;/h3&gt;            &lt;dl&gt;&lt;dt&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This indicates the installation operation and installs one or more       dynamically shared objects into the server's &lt;var&gt;modules&lt;/var&gt;       directory.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-a&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This activates the module by automatically adding a corresponding       &lt;code class="directive"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_so.html#loadmodule"&gt;LoadModule&lt;/a&gt;&lt;/code&gt; line to Apache's       &lt;code&gt;httpd.conf&lt;/code&gt; configuration file, or by enabling it if it       already exists.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-A&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;Same as option &lt;code&gt;-a&lt;/code&gt; but the created &lt;code class="directive"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_so.html#loadmodule"&gt;LoadModule&lt;/a&gt;&lt;/code&gt; directive is prefixed with a hash       sign (&lt;code&gt;#&lt;/code&gt;), &lt;em&gt;i.e.&lt;/em&gt;, the module is just prepared for       later activation but initially disabled.&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;-e&lt;/code&gt;&lt;/dt&gt;&lt;dd&gt;This indicates the editing operation, which can be used with the       &lt;code&gt;-a&lt;/code&gt; and &lt;code&gt;-A&lt;/code&gt; options similarly to the       &lt;code&gt;-i&lt;/code&gt; operation to edit Apache's &lt;code&gt;httpd.conf&lt;/code&gt;       configuration file without attempting to install the module.&lt;/dd&gt;&lt;/dl&gt;      &lt;/div&gt;&lt;div class="top"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/programs/apxs.html#page-header"&gt;&lt;img alt="top" src="http://httpd.apache.org/docs/2.2/images/up.gif" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;div class="section"&gt; &lt;h2&gt;&lt;a name="examples" id="examples"&gt;Examples&lt;/a&gt;&lt;/h2&gt;     &lt;p&gt;Assume you have an Apache module named &lt;code&gt;mod_foo.c&lt;/code&gt; available     which should extend Apache's server functionality. To accomplish this you     first have to compile the C source into a shared object suitable for loading     into the Apache server under runtime via the following command:&lt;/p&gt;      &lt;div class="example"&gt;&lt;p&gt;&lt;code&gt;       $ apxs -c mod_foo.c&lt;br /&gt;     /path/to/libtool --mode=compile gcc ... -c mod_foo.c&lt;br /&gt;     /path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo&lt;br /&gt;     $ _     &lt;/code&gt;&lt;/p&gt;&lt;/div&gt;      &lt;p&gt;Then you have to update the Apache configuration by making sure a     &lt;code class="directive"&gt;&lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_so.html#loadmodule"&gt;LoadModule&lt;/a&gt;&lt;/code&gt; directive is present to     load this shared object. To simplify this step &lt;code&gt;apxs&lt;/code&gt; provides     an automatic way to install the shared object in its "modules" directory     and updating the &lt;code&gt;httpd.conf&lt;/code&gt; file accordingly. This can be     achieved by running:&lt;/p&gt;      &lt;div class="example"&gt;&lt;p&gt;&lt;code&gt;       $ apxs -i -a mod_foo.la&lt;br /&gt;     /path/to/instdso.sh mod_foo.la /path/to/apache/modules&lt;br /&gt;     /path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules       ...       chmod 755 /path/to/apache/modules/mod_foo.so&lt;br /&gt;     [activating module `foo' in /path/to/apache/conf/httpd.conf]&lt;br /&gt;     $ _     &lt;/code&gt;&lt;/p&gt;&lt;/div&gt;      &lt;p&gt;This way a line named&lt;/p&gt;      &lt;div class="example"&gt;&lt;p&gt;&lt;code&gt;       LoadModule foo_module modules/mod_foo.so     &lt;/code&gt;&lt;/p&gt;&lt;/div&gt;      &lt;p&gt;is added to the configuration file if still not present. If you want to     have this disabled per default use the &lt;code&gt;-A&lt;/code&gt; option,     &lt;em&gt;i.e.&lt;/em&gt;&lt;/p&gt;      &lt;div class="example"&gt;&lt;p&gt;&lt;code&gt;       $ apxs -i -A mod_foo.c     &lt;/code&gt;&lt;/p&gt;&lt;/div&gt;      &lt;p&gt;For a quick test of the apxs mechanism you can create a sample Apache     module template plus a corresponding Makefile via:&lt;/p&gt;      &lt;div class="example"&gt;&lt;p&gt;&lt;code&gt;       $ apxs -g -n foo&lt;br /&gt;     Creating [DIR]  foo&lt;br /&gt;     Creating [FILE] foo/Makefile&lt;br /&gt;     Creating [FILE] foo/modules.mk&lt;br /&gt;     Creating [FILE] foo/mod_foo.c&lt;br /&gt;     Creating [FILE] foo/.deps&lt;br /&gt;     $ _     &lt;/code&gt;&lt;/p&gt;&lt;/div&gt;      &lt;p&gt;Then you can immediately compile this sample module into a shared object     and load it into the Apache server:&lt;/p&gt;      &lt;div class="example"&gt;&lt;p&gt;&lt;code&gt;       $ cd foo&lt;br /&gt;     $ make all reload&lt;br /&gt;     apxs -c mod_foo.c&lt;br /&gt;     /path/to/libtool --mode=compile gcc ... -c mod_foo.c&lt;br /&gt;     /path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo&lt;br /&gt;     apxs -i -a -n "foo" mod_foo.la&lt;br /&gt;     /path/to/instdso.sh mod_foo.la /path/to/apache/modules&lt;br /&gt;     /path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules       ...       chmod 755 /path/to/apache/modules/mod_foo.so&lt;br /&gt;     [activating module `foo' in /path/to/apache/conf/httpd.conf]&lt;br /&gt;     apachectl restart&lt;br /&gt;     /path/to/apache/sbin/apachectl restart: httpd not running, trying to start&lt;br /&gt;     [Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module&lt;br /&gt;     /path/to/apache/sbin/apachectl restart: httpd started&lt;br /&gt;     $ _     &lt;/code&gt;&lt;/p&gt;&lt;/div&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-6464680228152624485?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/6464680228152624485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/apxs-apache-extension-tool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6464680228152624485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/6464680228152624485'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/apxs-apache-extension-tool.html' title='apxs - APache eXtenSion tool'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-7023897310130553848</id><published>2009-06-05T08:19:00.000+07:00</published><updated>2009-06-05T08:21:41.221+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webserver'/><category scheme='http://www.blogger.com/atom/ns#' term='php5'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Fix error start apache :Cannot load /usr/local/apache2/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: cannot restore segment p</title><content type='html'>Error:&lt;br /&gt;&lt;br /&gt;httpd: Syntax error on line 53 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied&lt;br /&gt;&lt;br /&gt;Fix:chcon -t texrel_shlib_t /usr/local/apache2/modules/libphp5.so&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-7023897310130553848?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/7023897310130553848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/fix-error-start-apache-cannot-load.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7023897310130553848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7023897310130553848'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/fix-error-start-apache-cannot-load.html' title='Fix error start apache :Cannot load /usr/local/apache2/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: cannot restore segment p'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-7269436210013587462</id><published>2009-06-04T13:05:00.000+07:00</published><updated>2009-06-04T13:07:13.727+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='ssl'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Compile Apache (with SSL), PHP 5 and MySQL on Linux</title><content type='html'>&lt;div class="itembody"&gt; &lt;p&gt;This article comes with a full reference on how to compile from source  latest Apache 2.0.53 server, including support for  SSL, PHP 5.0.3 as a module, and MySQL 4.1.10 database on a Linux. It was fully tested under &lt;strong&gt;SUSE Linux 9.1&lt;/strong&gt;, &lt;strong&gt;SUSE Linux 9.2&lt;/strong&gt; and &lt;strong&gt;Fedora Core 3&lt;/strong&gt;, but  shall work with any Linux distribution (only on Debian you will have to  change RPMs for proper deb packages).&lt;/p&gt;  &lt;p&gt;Today, when almost every Linux distribution comes with a binary form of Apache 2.0.x, PHP 4.3.x and MySQL 4.0.x, it may seem a bit unnecessary to compile these, but, if you want some special configuration, latest components, or simply tune performance of your Apache, PHP and MySQL, compilation from source is the only possibility.&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;Basic system description:&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;PHP 5.0.3 will be compiled with support for: bz2, cpdflib, ctype, curllib, dom,  ftp, gd2, freetype2, gettext, libiconv, libxml, mbstring, mysql, openssl, pcre,  posix, session, SimpleXML, SPL, SQLite, tokenizer, xml, and zlib.&lt;/p&gt;  &lt;p&gt;Apache 2.0.53 will be compiled with support for mod_access, mod_auth, mod_auth_digest, mod_deflate, mod_env, mod_headers, mod_setenvif, mod_ssl, mod_mime, mod_imap,  mod_alias and mod_rewrite.&lt;/p&gt;   &lt;h4&gt;&lt;strong&gt;Compilation options:&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;Compilation can be customized by passing several parameters to gcc at runtime, for my Pentium-IV/HT/3.2GHz, this is a good starting set of parameters:&lt;/p&gt;  &lt;p&gt;&lt;code&gt; export CFLAGS="-march=pentium4 -mfpmath=sse -msse2 -O2 -pipe -s -fomit-frame-pointer" &lt;/code&gt;&lt;/p&gt;  &lt;p&gt;You may get a list of gcc compilation options for your CPU at  &lt;a href="http://gcc.gnu.org/onlinedocs/gcc-3.3.3/gcc/Option-Summary.html#Option%20Summary"&gt;gcc.gnu.org&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;All these scripts were fully tested under SESE Linux 9.1 with custom-built kernel 2.6.8.1 and Fedora Core 3 with custom-built kernel 2.6.9.1, and gcc version 3.3.3 / 3.4.2, but they shall work with any Linux distro (only on Debian you may need to change &lt;code&gt;rpm&lt;/code&gt; packages for &lt;code&gt;deb&lt;/code&gt; ones).&lt;/p&gt;  &lt;p&gt;This manual assumes that all source files are located (downloaded to) &lt;code&gt;/usr/local/src&lt;/code&gt; directory, SSL keys are placed into &lt;code&gt;/home/ssl&lt;/code&gt; directory, and web root is located at &lt;code&gt;/home/www&lt;/code&gt; directory.&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;Compile from source (Open) SSL:&lt;/strong&gt;&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;We will need OpenSSL library: &lt;a href="http://www.openssl.org/source/openssl-0.9.7e.tar.gz"&gt;openssl-0.9.7e.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Compilation of OpenSSL:&lt;/p&gt;  &lt;pre&gt;su&lt;br /&gt;cd /usr/local/src&lt;br /&gt;tar -zxvf openssl-0.9.7e.tar.gz&lt;br /&gt;cd openssl-0.9.7e&lt;br /&gt;./config --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;  &lt;p&gt;Create a private key and place it into directory &lt;code&gt;/home/ssl&lt;/code&gt;:&lt;/p&gt;  &lt;pre&gt;mkdir /home/ssl&lt;br /&gt;cd /home/ssl&lt;br /&gt;/usr/local/bin/openssl genrsa -des3 -rand \&lt;br /&gt;some_big_file_1:some_big_file_2 \&lt;br /&gt;-out localhost.key 1024&lt;/pre&gt;  &lt;p&gt;Next, we will create a private key without a pass-phrase, this is less secure, but it allows us to bootup the server without manually entering the pass-phrase every time…&lt;/p&gt;  &lt;pre&gt;/usr/local/bin/openssl rsa \&lt;br /&gt;-in localhost.key \&lt;br /&gt;-out localhost.key.unsecure&lt;/pre&gt;  &lt;p&gt;We will also create a request file that will be emailed to proper certification authority for getting a trusted SSL certificate  (if needed) under file &lt;code&gt;localhost.key.csr&lt;/code&gt;:&lt;/p&gt;  &lt;pre&gt;/usr/local/bin/openssl req -new \&lt;br /&gt;-key localhost.key \&lt;br /&gt;-out localhost.key.csr&lt;/pre&gt;  &lt;p&gt;While waiting for the certification authority, we can create a temporary self-signed certificate, good for 30 days:&lt;/p&gt;  &lt;pre&gt;/usr/local/bin/openssl x509 -req \&lt;br /&gt;-days 30 \&lt;br /&gt;-in localhost.key.csr \&lt;br /&gt;-signkey localhost.key \&lt;br /&gt;-out localhost.cert&lt;br /&gt;chmod 400 localhost.cert&lt;br /&gt;chmod 400 localhost.key&lt;br /&gt;chmod 400 localhost.key.unsecure&lt;/pre&gt;  &lt;h4&gt;&lt;strong&gt;Compile MySQL 4.1.10 database from source:&lt;/strong&gt;&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;MySQL 4.1.10 source codes - &lt;a href="http://dev.mysql.com/get/Downloads/MySQL-4.1/mysql-4.1.10.tar.gz/from/pick#mirrors"&gt;mysql-4.1.10.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;libtermcap library (&lt;em&gt;most distros have it already&lt;/em&gt;) - &lt;a href="http://rpmseek.com/rpm-dl/libtermcap-2.0.8-35.i386.html?hl=com&amp;amp;cs=libtermcap:PN:0:0:0:0:558329"&gt;libtermcap-2.0.8-35.i386.rpm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;libtermcap-devel library (&lt;em&gt;most distros have it already&lt;/em&gt;) - &lt;a href="http://rpmseek.com/rpm-dl/libtermcap-devel-2.0.8-35.i386.html?hl=com&amp;amp;cs=libtermcap-devel:PN:0:0:0:0:558330"&gt;libtermcap-devel-2.0.8-35.i386.rpm&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;blockquote&gt;&lt;p&gt;MySQL 4.1.10 has a completely different communication protocol and associated PHP &lt;code&gt;mysqli&lt;/code&gt; functions. If your  scripts were not designed for MySQL 4.1, you shall rather get &lt;a href="http://dev.mysql.com/get/Downloads/MySQL-4.0/mysql-4.0.23.tar.gz/from/pick#mirrors"&gt;MySQL release 4.0.23&lt;/a&gt;, to stay 100% compatible! Compilation options for MYSQL 4.0.23 will be the same, just remove one line with &lt;code&gt;mysqli&lt;/code&gt; from PHP &lt;code&gt;./configure&lt;/code&gt; script. &lt;/p&gt; &lt;p&gt;However for any new development, MySQL 4.1.10 is recommended.&lt;/p&gt;&lt;/blockquote&gt;  &lt;p&gt;Compiling MySQL from source, and creating user / group called &lt;code&gt;mysql&lt;/code&gt;:&lt;/p&gt;  &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar -zxvf mysql-4.1.10.tar.gz&lt;br /&gt;cd mysql-4.1.10&lt;br /&gt;./configure \&lt;br /&gt;--prefix=/usr/local/mysql \&lt;br /&gt;--with-unix-sock-path=/tmp/mysql.sock \&lt;br /&gt;--with-charset=utf8&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;  &lt;pre&gt;groupadd mysql&lt;br /&gt;useradd -g mysql mysql&lt;br /&gt;cp support-files/my-medium.cnf /etc/my.cnf&lt;br /&gt;cd /usr/local/mysql&lt;br /&gt;bin/mysql_install_db --user=mysql&lt;br /&gt;chown -R root  .&lt;br /&gt;chown -R mysql var&lt;br /&gt;chgrp -R mysql .&lt;/pre&gt;  &lt;p&gt;MySQL configuration file &lt;code&gt;/etc/my.cnf&lt;/code&gt; can (for our local testing) look like this:&lt;/p&gt;  &lt;pre&gt;[client]&lt;br /&gt;port = 3306&lt;br /&gt;socket = /tmp/mysql.sock&lt;br /&gt;[mysqld]&lt;br /&gt;port = 3306&lt;br /&gt;socket = /tmp/mysql.sock&lt;br /&gt;skip-locking&lt;br /&gt;key_buffer = 16K&lt;br /&gt;max_allowed_packet = 1M&lt;br /&gt;table_cache = 4&lt;br /&gt;sort_buffer_size = 64K&lt;br /&gt;net_buffer_length = 2K&lt;br /&gt;thread_stack = 64K&lt;br /&gt;skip-networking&lt;br /&gt;server-id = 1&lt;br /&gt;[mysqldump]&lt;br /&gt;quick&lt;br /&gt;max_allowed_packet = 16M&lt;br /&gt;[mysql]&lt;br /&gt;no-auto-rehash&lt;br /&gt;[isamchk]&lt;br /&gt;key_buffer = 8M&lt;br /&gt;sort_buffer_size = 8M&lt;br /&gt;[myisamchk]&lt;br /&gt;key_buffer = 8M&lt;br /&gt;sort_buffer_size = 8M&lt;br /&gt;[mysqlhotcopy]&lt;br /&gt;interactive-timeout&lt;/pre&gt;  &lt;h4&gt;&lt;strong&gt;Compile from source Apache 2.0.53 web server:&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;Quite a few web-hosting companies still use Apache 1.3.x, but time of Apache 2.0 incompatibilities and problems is long gone, so 2.0 is a better choice now. &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;We will need Apache 2.0.53 source codes - &lt;a href="http://apache.towardex.com/httpd/httpd-2.0.53.tar.gz"&gt;httpd-2.0.53.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;RPM: libxml2 library (&lt;em&gt;most distros have it already&lt;/em&gt;) - &lt;a href="http://rpmseek.com/rpm-dl/libxml2-devel-2.6.7-28.i586.html?hl=com&amp;amp;cs=libxml2-devel:PN:0:0:0:0:1501856"&gt;libxml2-devel-2.6.7-28.i586.rpm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;RPM: zlib library (&lt;em&gt;most distros have it already&lt;/em&gt;) - &lt;a href="http://rpmseek.com/rpm-dl/zlib-devel-1.2.1-70.i586.html?hl=com&amp;amp;cs=zlib-devel:PN:0:0:0:0:1503074"&gt;zlib-devel-1.2.1-70.i586.rpm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;RPM: readline-devel library (&lt;em&gt;most distros have it already&lt;/em&gt;) - &lt;a href="http://rpmseek.com/rpm-dl/readline-devel-4.3-306.i586.html?hl=com&amp;amp;cs=readline-devel:PN:0:0:0:0:1502559"&gt;readline-devel-4.3-306.i586.rpm&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;And compile it:&lt;/p&gt;  &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar -zxvf httpd-2.0.53.tar.gz&lt;br /&gt;cd httpd-2.0.53&lt;br /&gt;./configure \&lt;br /&gt; --prefix=/usr/local/apache2 \&lt;br /&gt; --enable-so \&lt;br /&gt; --enable-auth-digest \&lt;br /&gt; --enable-rewrite \&lt;br /&gt; --enable-setenvif \&lt;br /&gt; --enable-mime \&lt;br /&gt; --enable-deflate \&lt;br /&gt; --enable-ssl \&lt;br /&gt; --with-ssl=/usr/local \&lt;br /&gt; --enable-headers&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;  &lt;p&gt;Next we have to modify (alter) main Apache config file located at &lt;code&gt;/usr/local/apache2/conf/httpd.conf&lt;/code&gt; (this also assumes your web root is located at &lt;code&gt;/home/www&lt;/code&gt;):&lt;/p&gt;  &lt;pre&gt;DocumentRoot "/home/www"&lt;/pre&gt;  &lt;p&gt;And we well add support for PHP 5 (as a module):&lt;/p&gt;  &lt;pre&gt;LoadModule php5_module modules/libphp5.so&lt;br /&gt;DirectoryIndex index.html index.htm index.php&lt;br /&gt;AddType application/x-httpd-php .php&lt;br /&gt;AddType application/x-httpd-php-source .phps&lt;/pre&gt;  &lt;p&gt;We also have to allow / create basic mod_rewrite rules:&lt;/p&gt;  &lt;pre&gt;&lt;directory&gt;&lt;br /&gt;Options Indexes Includes FollowSymLinks MultiViews&lt;br /&gt;AllowOverride All&lt;br /&gt;Order allow,deny&lt;br /&gt;Allow from all&lt;br /&gt;&lt;/directory&gt;&lt;/pre&gt;  &lt;p&gt;And dissalow clients to access &lt;code&gt;.htaccess&lt;/code&gt;:&lt;/p&gt; &lt;pre&gt;&lt;files&gt;&lt;br /&gt; Order allow,deny&lt;br /&gt; Deny from all&lt;br /&gt;&lt;/files&gt;&lt;/pre&gt;  &lt;p&gt;Next, if using SSL (on standard port 443), we will have to modify file &lt;code&gt;/usr/local/apache2/conf/ssl.conf&lt;/code&gt; as follows (just replace the file content with this):&lt;/p&gt;  &lt;pre&gt;Listen 443&lt;br /&gt;&lt;virtualhost&gt;&lt;br /&gt;ServerName localhost&lt;br /&gt;SSLEngine on&lt;br /&gt;SSLCertificateFile /home/ssl/localhost.cert&lt;br /&gt;SSLCertificateKeyFile /home/ssl/localhost.key.unsecure&lt;br /&gt;&lt;/virtualhost&gt;&lt;/pre&gt;  &lt;h4&gt;&lt;strong&gt;Compile from source PHP 5.0.3:&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;For compiling PHP, we will need quite a few external libraries, like libcurl, libiconv, libjpeg, libpng, and few others, which we have to download and compile first:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;PHP 5.0.3 itself - &lt;a href="http://www.php.net/get/php-5.0.3.tar.bz2/from/a/mirror"&gt;php-5.0.3.tar.bz2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;CURL library - &lt;a href="http://curl.haxx.se/latest.cgi?curl=tar.gz"&gt;curl-7.12.1.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;libiconv library - &lt;a href="http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.2.tar.gz"&gt;libiconv-1.9.2.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;JPEG library: &lt;a href="http://freshmeat.net/redir/libjpeg/5665/url_tgz/jpegsrc.v6b.tar.gz"&gt;jpegsrc.v6b.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PNG library: &lt;a href="http://prdownloads.sourceforge.net/libpng/libpng-1.2.8.tar.gz?download"&gt;libpng-1.2.8.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;cpdflib library: &lt;a href="http://www.fastio.com/clibpdf202r1.tar.gz"&gt;clibpdf202r1.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Freetype 2 library: &lt;a href="http://prdownloads.sourceforge.net/freetype/freetype-2.1.9.tar.bz2?download"&gt;freetype-2.1.9.tar.bz2&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Compile libiconv from source:&lt;/p&gt;  &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar -zxvf libiconv-1.9.2.tar.gz&lt;br /&gt;cd libiconv-1.9.2&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;  &lt;p&gt;Compile libjpeg from source:&lt;/p&gt;  &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar -zxvf jpegsrc.v6b.tar.gz&lt;br /&gt;cd jpeg-6b&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;make install-lib&lt;/pre&gt;  &lt;p&gt;Compile libpng from source:&lt;/p&gt;  &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar -zxvf libpng-1.2.8.tar.gz&lt;br /&gt;cd libpng-1.2.8&lt;br /&gt;cp scripts/makefile.linux makefile&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;  &lt;p&gt;Compile cpdflib from source:&lt;/p&gt;  &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar -zxvf clibpdf202r1.tar.gz&lt;br /&gt;cd ClibPDF/source&lt;br /&gt;cp Makefile.Linux makefile&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;  &lt;p&gt;Compile curl from source:&lt;/p&gt;  &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar -zxvf curl-7.12.1.tar.gz&lt;br /&gt;cd curl-7.12.1&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;  &lt;p&gt;Compile freetype 2 from source:&lt;/p&gt;  &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar -jxvf freetype-2.1.9.tar.bz2&lt;br /&gt;cd freetype-2.1.9&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;  &lt;p&gt;Next, we will compile PHP, with support for MySQL, iconv, curl, zlib,  gd2, mbstring, SSL and many other modules:&lt;/p&gt;  &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar -jxvf php-5.0.3.tar.bz2&lt;br /&gt;cd php-5.0.3&lt;br /&gt;./configure \&lt;br /&gt;--with-apxs2=/usr/local/apache2/bin/apxs \&lt;br /&gt;--with-mysql=/usr/local/mysql  \&lt;br /&gt;--with-mysqli=/usr/local/mysql/bin/mysql_config  \&lt;br /&gt;--with-mysql-sock=/tmp/mysql.sock \&lt;br /&gt;--with-sqlite \&lt;br /&gt;--enable-sqlite-utf8 \&lt;br /&gt;--with-zlib \&lt;br /&gt;--with-zlib-dir \&lt;br /&gt;--with-bz2 \&lt;br /&gt;--with-gd \&lt;br /&gt;--enable-gd \&lt;br /&gt;--enable-gd-native-ttf \&lt;br /&gt;--with-jpeg-dir=/usr/local \&lt;br /&gt;--with-png-dir=/usr/local \&lt;br /&gt;--with-ttf \&lt;br /&gt;--with-freetype-dir=/usr/local \&lt;br /&gt;--with-iconv=/usr/local \&lt;br /&gt;--with-curl=/usr/local \&lt;br /&gt;--enable-track-vars \&lt;br /&gt;--with-gettext \&lt;br /&gt;--with-config-file-path=/usr/local/apache2/conf \&lt;br /&gt;--enable-trans-id \&lt;br /&gt;--enable-ftp \&lt;br /&gt;--with-cpdflib=/usr/local \&lt;br /&gt;--enable-mbstring \&lt;br /&gt;--with-openssl=/usr/local&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;cp php.ini-dist /usr/local/apache2/conf/php.ini&lt;/pre&gt;  &lt;p&gt;Next, we have to modify PHP configuration in file &lt;code&gt;/usr/local/apache2/conf/php.ini&lt;/code&gt;, including basic PHP security settings:&lt;/p&gt;  &lt;pre&gt;mysql.default_socket = /tmp/mysql.sock&lt;br /&gt;short_open_tag = Off&lt;br /&gt;register_globals = Off&lt;br /&gt;allow_url_fopen = Off&lt;/pre&gt;  &lt;h4&gt;&lt;strong&gt;How to start Apache and MySQL at bootup?&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;The last thing left is to create a startup script, whitch will allow to run Apache and MySQL at bootup, automatically, so that we don’t have to do it manually. We will create a new file (for SuSE Linux 9.1, other ditros may vary here) &lt;code&gt;/etc/init.d/web&lt;/code&gt; and set “executable” flag to it.&lt;/p&gt;  &lt;pre&gt;#! /bin/sh&lt;br /&gt;#&lt;br /&gt;# /etc/init.d/web&lt;br /&gt;#&lt;br /&gt;# (c) Radek HULAN&lt;br /&gt;# http://hulan.info/&lt;br /&gt;#&lt;br /&gt;### BEGIN INIT INFO&lt;br /&gt;# Provides:       apache-mysql&lt;br /&gt;# Default-Start:  5&lt;br /&gt;# Default-Stop:   5&lt;br /&gt;# Description:    Starts Apache2 and MySQL 4&lt;br /&gt;### END INIT INFO&lt;br /&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;      start)&lt;br /&gt;      /usr/local/apache2/bin/apachectl start&lt;br /&gt;      /usr/local/mysql/share/mysql/mysql.server start&lt;br /&gt;              ;;&lt;br /&gt;      stop)&lt;br /&gt;      /usr/local/apache2/bin/apachectl stop&lt;br /&gt;      /usr/local/mysql/share/mysql/mysql.server stop&lt;br /&gt;              ;;&lt;br /&gt;      restart)&lt;br /&gt;      /usr/local/apache2/bin/apachectl restart&lt;br /&gt;      /usr/local/mysql/share/mysql/mysql.server restart&lt;br /&gt;              ;;&lt;br /&gt;esac&lt;/pre&gt;  &lt;p&gt;Next we will run YaST, section “System”, sub-section “Run level editor”, where we will enable service &lt;code&gt;web&lt;/code&gt; for runlevel 3 and 5. &lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;Testing the system?&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;First, start Apache and MySQL servers by entering:&lt;/p&gt;  &lt;pre&gt;/etc/init.d/web start&lt;/pre&gt;  &lt;p&gt;Next, create file &lt;code&gt;/home/www/index.php&lt;/code&gt; with the following content:&lt;/p&gt;  &lt;pre&gt;&lt;/pre&gt;     &lt;p&gt;In your browser, type URL &lt;code&gt;http://localhost/&lt;/code&gt; and &lt;code&gt;https://localhost/&lt;/code&gt;,  and if everything is installed fine, you will see a lot of information about your new  Apache/PHP/MySQL installation.&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;phpMyAdmin:&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;We will also need phpMyAdmin to manage MySQL database, by entering &lt;code&gt;http://localhost/db/&lt;/code&gt; into our browser:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;phpMyAdmin 2.6.1 - &lt;a href="http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-2.6.1.tar.bz2?download"&gt;phpMyAdmin-2.6.1.tar.bz2&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Installation of phpMyAdmin into &lt;code&gt;/home/www/db&lt;/code&gt;:&lt;/p&gt;  &lt;pre&gt;mkdir /home/www&lt;br /&gt;cd /home/www&lt;br /&gt;tar -jxvf /usr/local/src/phpMyAdmin-2.6.1.tar.bz2&lt;br /&gt;ln -s phpMyAdmin-2.6.1 db&lt;/pre&gt;   &lt;p&gt;Next, we will configure phpMyAdmin’s advanced feaures, by modifying file &lt;code&gt;/home/www/db/config.inc.php&lt;/code&gt;:&lt;/p&gt;  &lt;pre&gt;// URL to phpMyAdmin&lt;br /&gt;$cfg['PmaAbsoluteUri'] = 'http://localhost/db/';&lt;br /&gt;&lt;br /&gt;//connection settings&lt;br /&gt;$cfg['Servers'][$i]['connect_type'] = 'socket';&lt;br /&gt;$cfg['Servers'][$i]['extension'] = 'mysqli';&lt;br /&gt;&lt;br /&gt;// user na password&lt;br /&gt;$cfg['Servers'][$i]['auth_type'] = 'config';&lt;br /&gt;$cfg['Servers'][$i]['user'] = 'root';&lt;br /&gt;$cfg['Servers'][$i]['password'] = '';&lt;br /&gt;&lt;br /&gt;// PMA settings&lt;br /&gt;$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';&lt;br /&gt;$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';&lt;br /&gt;$cfg['Servers'][$i]['relation'] = 'pma_relation';&lt;br /&gt;$cfg['Servers'][$i]['table_info'] = 'pma_table_info';&lt;br /&gt;$cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';&lt;br /&gt;$cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';&lt;br /&gt;$cfg['Servers'][$i]['column_info'] = 'pma_column_info';&lt;br /&gt;$cfg['Servers'][$i]['history'] = 'pma_history';&lt;br /&gt;$cfg['Servers'][$i]['verbose_check'] = FALSE;&lt;br /&gt;&lt;br /&gt;// persistent connections&lt;br /&gt;$cfg['PersistentConnections'] = TRUE;&lt;br /&gt;&lt;br /&gt;// do not display logo on the left&lt;br /&gt;$cfg['LeftDisplayLogo'] = FALSE;&lt;br /&gt;&lt;br /&gt;// show MySQL and PHP info&lt;br /&gt;$cfg['ShowMysqlInfo'] = TRUE;&lt;br /&gt;$cfg['ShowMysqlVars'] = TRUE;&lt;br /&gt;$cfg['ShowPhpInfo'] = TRUE;&lt;br /&gt;&lt;br /&gt;// show BLOBs&lt;br /&gt;$cfg['ShowBlob'] = TRUE;&lt;/pre&gt;  &lt;p&gt;After everything is installed, use phpMyAdmin SQL window to run script &lt;code&gt;/home/www/db/scripts/create_tables_mysql_4_1_2+.sql&lt;/code&gt; to create PMA tables, needed by phpMyAdmin.&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;Debugging PHP:&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;There are several tools, like &lt;a href="http://phpeclipse.de/tiki-view_articles.php"&gt;PHPeclipse&lt;/a&gt;, which allow to debug PHP, in a full-featured IDE. In order to use PHPeclipse, you need to install PHP debugger first.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Get Nusphere DBG: &lt;a href="http://dd.cron.ru/dbg/download.php?h=211.32-src"&gt;dbg-2.11.32-src.tar.gz&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Installation:&lt;/p&gt; &lt;pre style="clear: both;"&gt;cd /usr/local/src&lt;br /&gt;tar -zxvf dbg-2.11.32-src.tar.gz&lt;br /&gt;cd dbg-2.11.32&lt;br /&gt;./deferphpize&lt;br /&gt;mkdir /usr/local/modules&lt;br /&gt;cp modules/dbg.so /usr/local/modules&lt;br /&gt;cp modules/dbg.la /usr/local/modules&lt;/pre&gt; &lt;p&gt;Next, you will have to modify PHP configuration file located at &lt;code&gt;/usr/local/apache2/conf/php.ini&lt;/code&gt;, add here:&lt;/p&gt; &lt;pre&gt;; load debugger&lt;br /&gt;extension_dir = "/usr/local/modules"&lt;br /&gt;extension=dbg.so&lt;br /&gt;&lt;br /&gt;; debugger configuration&lt;br /&gt;[debugger]&lt;br /&gt;debugger.enabled = true&lt;br /&gt;debugger.profiler_enabled = true&lt;br /&gt;debugger.JIT_host = localhost&lt;br /&gt;debugger.JIT_port = 10001&lt;br /&gt;debugger.JIT_enabled = on&lt;br /&gt;&lt;br /&gt;; implicint flush - use only when debugging&lt;br /&gt;implicit_flush = On&lt;/pre&gt; &lt;h4&gt;&lt;strong&gt;Do you need mod_perl as well?&lt;/strong&gt;&lt;/h4&gt; &lt;ul&gt;&lt;li&gt;Get &lt;a href="http://perl.apache.org/dist/mod_perl-2.0-current.tar.gz"&gt;mod_perl-2.0-current.tar.gz&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Installation and compilation:&lt;/p&gt; &lt;pre&gt;cd /usr/local/src&lt;br /&gt;tar zxvf mod_perl-2.0-current.tar.gz&lt;br /&gt;cd mod_perl-1.99_16&lt;br /&gt;perl Makefile.PL MP_APXS=/usr/local/apache2/bin/apxs&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt; &lt;p&gt;Next, you have to modify Apache configuration file located at &lt;code&gt;/usr/local/apache2/conf/httpd.conf&lt;/code&gt; to load mod_perl, and set to use perl at directory &lt;code&gt;/home/www/perl&lt;/code&gt;:&lt;/p&gt; &lt;pre&gt;LoadModule perl_module modules/mod_perl.so&lt;br /&gt;PerlModule Apache2&lt;br /&gt;Alias /perl/ /home/www/perl/&lt;br /&gt;&lt;location&gt;&lt;br /&gt;  SetHandler perl-script&lt;br /&gt;  PerlResponseHandler ModPerl::Registry&lt;br /&gt;  PerlOptions +ParseHeaders&lt;br /&gt;  Options +ExecCGI&lt;br /&gt;&lt;/location&gt;&lt;/pre&gt; &lt;p&gt;Testing? Create file &lt;code&gt;/home/www/perl/test.pl&lt;/code&gt;, issue &lt;code&gt;chmod 755 test.pl&lt;/code&gt; on it, and type &lt;code&gt;http://localhost/perl/test.pl&lt;/code&gt; in your browser to test your mod_perl installation.&lt;/p&gt; &lt;pre&gt;#!/usr/bin/perl&lt;br /&gt;print "Content-type: text/plain\n\n";&lt;br /&gt;print "mod_perl 2.0 rocks!\n";&lt;/pre&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-7269436210013587462?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/7269436210013587462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/compile-apache-with-ssl-php-5-and-mysql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7269436210013587462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/7269436210013587462'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/compile-apache-with-ssl-php-5-and-mysql.html' title='Compile Apache (with SSL), PHP 5 and MySQL on Linux'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899977601826599708.post-4984317235561216725</id><published>2009-06-03T08:39:00.000+07:00</published><updated>2009-06-04T13:08:57.991+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redhat'/><category scheme='http://www.blogger.com/atom/ns#' term='navicate'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='rehat linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='secure'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Server'/><title type='text'>Using Navicat SSH Tunneling for secure MySQL Server management</title><content type='html'>&lt;p class="Content style1"&gt;Many of the web hosting companies has blocked port 3306 to prevent access from outside, to defend against from security threats. As a consequence, users are required to use web-based client to access their MySQL Server provided by the hosting companies. These web-based clients are usually not visually appealing with annoying page refreshes.&lt;br /&gt;&lt;br /&gt;However, with the increasing demand from users to connect from remote MySQL clients, some web hosting companies provides SSH Connection which allows user to login remotely across the Internet and support connection through the software based clients.&lt;br /&gt;&lt;br /&gt;SSH stands for Secure Shell and is a communication protocol for connecting to remote computers over TCP/IP. Encryption provides confidentiality and data integrity, and SSH uses public-key cryptography to authenticate the remote computer and to allow the remote computer to authenticate the user if necessary.&lt;br /&gt;&lt;br /&gt;There are several benefits to using SSH:&lt;/p&gt;&lt;ul class="style1"&gt;&lt;li&gt; Connect to a MySQL server from behind a firewall when the MySQL server port is blocked.  &lt;/li&gt;&lt;li&gt; Automate the authentication of users, no passwords sent in plain text to prevent the stealing of passwords.  &lt;/li&gt;&lt;li&gt; Offers Multiple strong authentication methods that prevent such security threats as spoofing identity.  &lt;/li&gt;&lt;li&gt; Offers Encryption and compression of data for security and speed.  &lt;/li&gt;&lt;li&gt; Secure the file transfer.&lt;/li&gt;&lt;/ul&gt;   &lt;span class="style1"&gt;        &lt;/span&gt;   &lt;ul class="style1"&gt;&lt;img src="http://mysql.navicat.com/images/share/ssh_tunnel.jpg" height="187" width="426" /&gt;&lt;br /&gt;&lt;/ul&gt;   &lt;span class="style1"&gt;&lt;br /&gt;&lt;strong&gt;Setting up a SSH Connection to your MySQL Server with Navicat&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;To successfully establish a SSH connection, set the SSH connection properties in the corresponding boxes: Host name/IP address, Port number, User name, Authentication Method and Password. &lt;/span&gt;   &lt;ul class="style1"&gt;1. Click &lt;img src="http://mysql.navicat.com/images/SSH/openConnection.gif" /&gt; or choose File -&gt; &lt;img src="http://mysql.navicat.com/images/SSH/addConnection.gif" /&gt;  New Connection to set up the Connection Properties. &lt;br /&gt;2. Select the SSH tab and enable Use SSH Tunnel. &lt;br /&gt;3. Fill in the required information in the SSH Tab:&lt;/ul&gt; &lt;ul class="style1"&gt;&lt;ul class="Content"&gt;&lt;strong&gt;Host name/IP address  &lt;/strong&gt;&lt;br /&gt;A host where SSH server is activated. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Port&lt;/strong&gt;&lt;br /&gt;A port where SSH server is activated, by default it is 22. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;User name  &lt;/strong&gt;&lt;br /&gt;A user on Linux machine. (It is a Linux user. It is not the user of MySQL Server.) &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Authentication Method  &lt;/strong&gt;&lt;br /&gt;Choose Password Authentication  &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Password  &lt;/strong&gt;&lt;br /&gt;The password of your user account in linux &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mysql.navicat.com/images/SSH/sshPassValue.gif" /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/ul&gt;   &lt;span class="style1"&gt;&lt;br /&gt;4. In the General Settings Tab, the settings should be set relatively to the SSH server. For example, host_of_mysqldatabase shown below is the host address, which is provided by your hosting company of your remote MySQL database.&lt;br /&gt;&lt;/span&gt;   &lt;ul class="Content style1"&gt;&lt;strong&gt;Connection Name&lt;/strong&gt;&lt;br /&gt; A friendly name to best describe your connection.     &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Host name/IP&lt;/strong&gt;&lt;br /&gt;address The host where MySQL Server is located in point of view SSH server. If SSH and MySQL Server are on the same machine, it is equal to SSH Host, or may be 'localhost'.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Port&lt;/strong&gt;&lt;br /&gt; The port of MySQL Server on Remote Host, by default it is 3306.     &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;User name&lt;/strong&gt;&lt;br /&gt; The username of your MySQL Server.     &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Password &lt;/strong&gt;&lt;br /&gt; The password of your MySQL user. &lt;br /&gt;&lt;img src="http://mysql.navicat.com/images/SSH/sshGenValue.gif" /&gt;&lt;br /&gt;&lt;/ul&gt;    &lt;p class="content style1"&gt;By clicking OK, the SSH connection is made.&lt;/p&gt;    &lt;p class="Content style1"&gt;&lt;strong&gt;Hosting Companies providing SSH Connections &lt;/strong&gt;&lt;br /&gt;Listed below are some hosting companies which provide SSH connections and remote MySQL Connection can be setup with Navicat. &lt;/p&gt;    &lt;table class="content" border="0" width="727"&gt;      &lt;tbody&gt;&lt;tr&gt;        &lt;th class="style1" scope="col"&gt;&lt;table class="content" border="0" cellpadding="0" cellspacing="0" width="232"&gt;          &lt;tbody&gt;&lt;tr&gt;            &lt;td class="content" nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;1&amp;amp;1&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;1and1    Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;1Host    Web Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;3FN.net&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;A2    Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Advanced    Network Hosts&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;AN    Host&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;AN    Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Aplus.net&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Apollo    Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Argon    Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Blue    Host&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Bounceweb&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Cirtexhosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Crucial    Paradigm&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Dotservant.com&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Dreamhost&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;eChristian    Web Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;FastDomain&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Flux    Services&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;                  &lt;/tbody&gt;&lt;/table&gt;&lt;/th&gt;        &lt;th class="style1" scope="col"&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="232"&gt;          &lt;tbody&gt;&lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Hagen    Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;HostGator.com&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;HostHead&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Hostican&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Hostland&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;HostMonster.com&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Hostpapa&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;HostRocket.com&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Imhosted&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;InMotion    Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Intermedia&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;iTeraWeb    Solutions&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;IX    Web Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Joyent&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Liquid    Web&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Lunarpages.com&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;ME    Webhost&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Media    Temple&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Naked    Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Netfirms&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Net-Trend&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Omnis    Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;PowWeb&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;        &lt;/tbody&gt;&lt;/table&gt;&lt;/th&gt;        &lt;th class="style1" scope="col"&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="232"&gt;          &lt;tbody&gt;&lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Practical    Webhost&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Server    Pronto&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;ServerPro    Web Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;SimpleHelix&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Start    Logic&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Superbhosting.net&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Tbhost.com&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;techhosting.com&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;The    Host Group&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;ThinkHost&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;UK2NET&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Velcom.com&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Verio&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Vision    Web Hosting&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Web    Hosting Buzz&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Web    Hosting Pad&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;WebWizards.net&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;WestHost&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;WireNine&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;YourServing&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td nowrap="nowrap" valign="bottom" width="232"&gt;&lt;p&gt;Your-Site.com&lt;/p&gt;&lt;/td&gt;          &lt;/tr&gt;        &lt;/tbody&gt;&lt;/table&gt;&lt;/th&gt;      &lt;/tr&gt;      &lt;/tbody&gt;&lt;/table&gt;    &lt;p class="Content style1"&gt;In the following section, we have selected one of a popular hosting companies and show how a SSH Connection to the MySQL Database can be established with Navicat.&lt;br /&gt;  &lt;br /&gt;      &lt;strong&gt;Tutorial on how to establish SSH Connection to a MySQL database hosted in Dreamhost&lt;/strong&gt; &lt;/p&gt;    &lt;p class="Content style1"&gt;&lt;a href="http://wiki.dreamhost.com/DreamHost"&gt;DreamHost&lt;/a&gt; provides shell access to all of its customers, but it needs to be specifically enabled for each user added to a customer's account. By default, the Type of the user is set to be “FTP”, you will need to enable the shell access before you can connect through SSH.&lt;br /&gt;  &lt;br /&gt;    &lt;strong&gt;Enabling the Shell access for an existing user:&lt;/strong&gt;&lt;br /&gt;  &lt;/p&gt;&lt;ul&gt; 1) In your Control Panel, Visit User &gt; Manage Users.&lt;br /&gt;   2) Click the [ edit ] link located next to the user you'd like to enable shell access for.   &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mysql.navicat.com/images/SSH/screen01.jpg" height="350" width="500" /&gt;&lt;br /&gt;&lt;br /&gt;    3) Check the 'Enable ssh/telnet?' box for that user.&lt;br /&gt;   4) Leave the 'Type' as it is unless you need it to be something other than bash.   &lt;br /&gt;   5) Click Save   &lt;br /&gt;&lt;/ul&gt;              Keep in mind that it takes about 20 minutes for this change to take effect.&lt;br /&gt;&lt;br /&gt; &lt;span class="style1"&gt;&lt;img src="http://mysql.navicat.com/images/SSH/screen02.jpg" height="350" width="500" /&gt;&lt;br /&gt;          &lt;/span&gt;    &lt;p class="Content style1"&gt;After changing the user account to Shell Type, you’ll also need to grant rights for your local machine to connect to the database server, before you can connect remotely by Navicat. This must be done for all MySQL user accounts you plan on logging in from your local machine.&lt;br /&gt;         &lt;br /&gt;            Granting rights for your SSH Host:   &lt;br /&gt;         &lt;br /&gt;            &lt;img src="http://mysql.navicat.com/images/SSH/screen03.jpg" height="350" width="500" /&gt;&lt;br /&gt;           &lt;/p&gt;&lt;ul class="style1"&gt;                 1) Login to your Dreamhost Control Panel             &lt;br /&gt;            2) Select the &lt;strong&gt;Manage MySQL&lt;/strong&gt; link under the Goodies section.             &lt;br /&gt;            3) Under the Database(s) on this server section, find the desired database and click the &lt;strong&gt;username&lt;/strong&gt; you wish to grant access to.             &lt;br /&gt;            4) Under the section titled &lt;strong&gt;Allowable Hosts&lt;/strong&gt;, type in the domain or subdomain or your IP Address the machine which your SSH Host identifies itself as on the public internet.&lt;br /&gt;            5) Click Save             &lt;/ul&gt;                           &lt;span class="style1"&gt;&lt;img src="http://mysql.navicat.com/images/SSH/screen04.jpg" height="350" width="500" /&gt;&lt;br /&gt;           &lt;/span&gt;              &lt;p class="Content style1"&gt;You have completed the settings required in your Dreamhost account, now you will go to Navicat to create the Connection.&lt;br /&gt;          &lt;br /&gt;             In Navicat, click the Connection button to New a Connection.&lt;br /&gt;          &lt;br /&gt;             &lt;img src="http://mysql.navicat.com/images/SSH/screen05.jpg" height="350" width="500" /&gt;&lt;br /&gt;          &lt;br /&gt;             In the General Tab of the Connecting Setting box,              &lt;br /&gt;          &lt;br /&gt;             &lt;strong&gt;Hostname/IP address: &lt;/strong&gt;the hostname of your mysql server at dreamhost, you can check this at Control Panel &gt; Goodies  &gt; Manage MySQL&lt;br /&gt;             &lt;strong&gt;Port:&lt;/strong&gt; 3306 (this is the default port number for the MySQL Server)             &lt;br /&gt;             &lt;strong&gt;Username&lt;/strong&gt;: username with access right granted in Manage MySQL section             &lt;br /&gt;             &lt;strong&gt;Password: &lt;/strong&gt;password           &lt;br /&gt;          &lt;br /&gt;             &lt;img src="http://mysql.navicat.com/images/SSH/screen06.jpg" height="350" width="500" /&gt;&lt;br /&gt;              &lt;br /&gt;             In the SSH Tab of the Connecting Setting box,              &lt;br /&gt;             &lt;br /&gt;                          &lt;strong&gt;Hostname / IP Address:&lt;/strong&gt;  machine_name.dreamhost.com             &lt;br /&gt;                          &lt;strong&gt;Port:&lt;/strong&gt; 22 (this is the port for SSH connection)             &lt;br /&gt;                          &lt;strong&gt;Username:&lt;/strong&gt; username which you have changed the account to Shell type in Dreamhost              &lt;br /&gt;                          &lt;strong&gt;Password:&lt;/strong&gt; password&lt;br /&gt;             &lt;br /&gt;                &lt;img src="http://mysql.navicat.com/images/SSH/screen07.jpg" height="350" width="500" /&gt;&lt;br /&gt;             &lt;br /&gt;             To test if the Connection settings are correct, you may click the “Test Connection” button to check.&lt;br /&gt;             &lt;br /&gt;Connecting to your MySQL Database from remote client Navicat offers you a greater flexibility on working with your data in MySQL. With Navicat, you can easily import your data in to your MySQL database from various file formats, build queries visually, set a schedule to perform backup, generate report from your raw data and more.&lt;/p&gt;              &lt;p class="style1"&gt;For more information on how Navicat helps you to manage your  MySQL database effectively, please visit here: &lt;a href="http://mysql.navicat.com/details.html"&gt;http://mysql.navicat.com/details.html&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;triettv@gmail.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899977601826599708-4984317235561216725?l=trantrietvn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trantrietvn.blogspot.com/feeds/4984317235561216725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/using-navicat-ssh-tunneling-for-secure.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/4984317235561216725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899977601826599708/posts/default/4984317235561216725'/><link rel='alternate' type='text/html' href='http://trantrietvn.blogspot.com/2009/06/using-navicat-ssh-tunneling-for-secure.html' title='Using Navicat SSH Tunneling for secure MySQL Server management'/><author><name>Tran Van Triet</name><uri>http://www.blogger.com/profile/14013795992222652550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
