<?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-8729798332371031173</id><updated>2011-10-26T13:39:46.088-07:00</updated><category term='chunked'/><category term='large file'/><category term='uploader'/><category term='web'/><category term='silverlight'/><category term='chunk'/><category term='upload'/><category term='chunking'/><category term='uploading'/><title type='text'>ZombieBob's Weblog</title><subtitle type='html'>Zombie coding is fun coding.  You don't have to be an expert to want or learn to code, you just need passion.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-7470917030824458912</id><published>2011-10-26T13:38:00.000-07:00</published><updated>2011-10-26T13:39:46.103-07:00</updated><title type='text'>Move over Siri - Google Voice translates to text the darndest things</title><content type='html'>I have a Google Voice account that rings everywhere and it auto translates speech to text.  Sometimes it's pretty funny what comes out.&lt;br /&gt;&lt;br /&gt;This is what it page me with as the translation.&lt;br /&gt;&lt;br /&gt;Hi anywhere in Iraq are you. It's like the almost 7 o'clock and. Right here during this guy chin denominator molesting in this God's is almost done. And and and you're not answering your phone. Where are you. If you do Yeah, okay Hope you're well. Bye, c. &lt;br /&gt;&lt;br /&gt;What was said was something like &lt;a href="https://skydrive.live.com/?cid=6f5be171033c1ac2&amp;amp;sc=documents&amp;amp;nl=1&amp;amp;uc=1&amp;amp;id=6F5BE171033C1AC2%21130#"&gt;this&lt;/a&gt;. &amp;nbsp;Here is the text if you don't want to play that MP3 link.&lt;br /&gt;&lt;br /&gt;Honey, where the heck are you.  Rick's here drinking Scotch and dinners on the table, what and the scotch is almost gone and and and your not answering your phone where are you. Yeah Ok, hope your on your way home, bye.&lt;br /&gt;&lt;br /&gt;Cheers&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-7470917030824458912?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/7470917030824458912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/7470917030824458912'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2011/10/move-over-siri-google-voice-translates.html' title='Move over Siri - Google Voice translates to text the darndest things'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-5181465601150068867</id><published>2010-08-24T21:34:00.000-07:00</published><updated>2010-08-24T21:35:16.339-07:00</updated><title type='text'>New Core i7 Computer Build</title><content type='html'>Well I've got my dream machine together aside from the graphics card it's finally ready.&lt;br /&gt;&lt;br /&gt;Intel mobo, Core i7 980x CPM, 6GB fast RAM supporting XMP profiles, Intel SSD drive, Win 7 X64, silent Noctura case and CPU cooling fans.&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a target="_blank" href="http://picasaweb.google.com/pirklk/NewCoreI7ComputerBuild#" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" src="http://3.bp.blogspot.com/_szAd7h9ckRM/THSchEvUVsI/AAAAAAAAFmU/Q-rrBSGPH2E/s320/DSCN0856.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;See the slides &lt;a href="http://picasaweb.google.com/pirklk/NewCoreI7ComputerBuild"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-5181465601150068867?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/5181465601150068867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=5181465601150068867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/5181465601150068867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/5181465601150068867'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2010/08/new-core-i7-computer-build.html' title='New Core i7 Computer Build'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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/_szAd7h9ckRM/THSchEvUVsI/AAAAAAAAFmU/Q-rrBSGPH2E/s72-c/DSCN0856.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-6670300635429086798</id><published>2010-08-04T20:22:00.000-07:00</published><updated>2010-08-04T21:03:06.956-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='large file'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='chunked'/><category scheme='http://www.blogger.com/atom/ns#' term='uploader'/><category scheme='http://www.blogger.com/atom/ns#' term='chunk'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='uploading'/><category scheme='http://www.blogger.com/atom/ns#' term='upload'/><category scheme='http://www.blogger.com/atom/ns#' term='chunking'/><title type='text'>Large File Upload in Silverlight Part II</title><content type='html'>This is the second part of my &lt;a href="http://zombiebob.blogspot.com/2010/08/large-file-upload-in-silverlight.html"&gt;Large File Upload in Silverlight&lt;/a&gt; code using chunking.&lt;br /&gt;&lt;br /&gt;I made some changes that I think will give some better performance. &amp;nbsp;I changed Backgroundworker Thread to report back the number of bytes read as opposed to a percentage. &amp;nbsp;My brother suggested that having that bytes processed total available at the main UI thread level would be of more use and tend to agree. &amp;nbsp;While Microsoft might be trying to be helpful in naming the&amp;nbsp;ProgressChangedEvent property&amp;nbsp;ProgressPercentage it's actually kind of dumb. &amp;nbsp;They should have just called it Progress and let the developers decide how to use it.&lt;br /&gt;&lt;br /&gt;I also added some code to allow the Backgroundworker to keep two WebClients running all the time and that increases the potential throughput by about 50%. &amp;nbsp;While this was fine for IE and Firefox, Chrome and Safari don't like it at all and the latter two tend to bog down while waiting for the underlying browser requests &amp;nbsp;complete their work. I need to test this on a real web server and not under the ASP.Net developer server.&lt;br /&gt;&lt;br /&gt;The second set of change had to do with how I pass the data to the back end. &amp;nbsp;I added an offset and number of pass to back end call and implemented a shared file write approach that back in the 80's we called &lt;a href="http://support.microsoft.com/kb/150700"&gt;Random Access Files&lt;/a&gt; and I guess that still hold water. &amp;nbsp;I didn't bother adding FileStream range locking as my code is running very sequential and I'm not doing retries or pausing yet.&lt;br /&gt;&lt;br /&gt;Well the XAML is the same so you can that that from the previous post. Note: Blogger editor does not handle the XML injected into the article well once it posted and when you edit it the you have to re-insert it from scratch.&lt;br /&gt;&lt;br /&gt;First the new .ASHX code that allows for simultaneous byte range writes.&lt;br /&gt;&lt;br /&gt;&lt;pre class="c#" name="code"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;&lt;br /&gt;namespace LargeFileUpload.Web&lt;br /&gt;{&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// Summary description for StoreFile&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    public class StoreFile : IHttpHandler&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        private const int READ_BUFFER_LEN = 57344;&lt;br /&gt;&lt;br /&gt;        public void ProcessRequest(HttpContext context)&lt;br /&gt;        {&lt;br /&gt;            context.Response.ContentType = "text/plain";&lt;br /&gt;            context.Response.Write("Hello World");&lt;br /&gt;            string check = context.Request["filestream"];&lt;br /&gt;            int offset = Convert.ToInt32(context.Request["offset"]);&lt;br /&gt;&lt;br /&gt;            check = Regex.Replace(check, " ", "+");&lt;br /&gt;            byte[] bytes = Convert.FromBase64String(check);&lt;br /&gt;            string fileName = context.Server.MapPath(context.Request["filename"]);&lt;br /&gt;&lt;br /&gt;            FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);&lt;br /&gt;            fs.Seek(READ_BUFFER_LEN * offset, SeekOrigin.Begin);&lt;br /&gt;            fs.Write(bytes, 0, bytes.Length);&lt;br /&gt;            fs.Close();&lt;br /&gt;            fs.Dispose();&lt;br /&gt;            //System.Threading.Thread.Sleep(500);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void fileit()&lt;br /&gt;        {&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        public bool IsReusable&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return false;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Next is the main pages code and it's changes&lt;br /&gt;&lt;br /&gt;&lt;pre class="c#" name="code"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Net;&lt;br /&gt;using System.Windows;&lt;br /&gt;using System.Windows.Controls;&lt;br /&gt;using System.Windows.Documents;&lt;br /&gt;using System.Windows.Input;&lt;br /&gt;using System.Windows.Media;&lt;br /&gt;using System.Windows.Media.Animation;&lt;br /&gt;using System.Windows.Shapes;&lt;br /&gt;using System.Threading;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;&lt;br /&gt;namespace LargeFileUpload&lt;br /&gt;{&lt;br /&gt;    public partial class MainPage : UserControl&lt;br /&gt;    {&lt;br /&gt;        public static System.IO.Stream fs;&lt;br /&gt;        private BackgroundWorker bw = new BackgroundWorker();&lt;br /&gt;        private long bytesReadTotal = 0;&lt;br /&gt;        private const int READ_BUFFER_LEN = 57344;&lt;br /&gt;&lt;br /&gt;        public MainPage()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;&lt;br /&gt;            bw.WorkerReportsProgress = true;&lt;br /&gt;            bw.WorkerSupportsCancellation = true;&lt;br /&gt;            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);&lt;br /&gt;            bw.ProgressChanged += (s, e) =&amp;gt; {&lt;br /&gt;                // e.ProgressPercentage is actually the number of bytes last read&lt;br /&gt;                bytesReadTotal += e.ProgressPercentage;&lt;br /&gt;                int percentComplete = (int)((float)bytesReadTotal / (float)fs.Length * 100);&lt;br /&gt;                textBox1.Text = String.Format("Transferred {0} out of {1}"&lt;br /&gt;                    , fileSizeString(bytesReadTotal), fileSizeString(fs.Length));&lt;br /&gt;                progressBar1.Value = percentComplete;&lt;br /&gt;            };&lt;br /&gt;            bw.DoWork += (s, e) =&amp;gt; {uploadFileToWeb((string)e.Argument, (BackgroundWorker)s, e);  }; &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        string fileSizeString(long bytes)&lt;br /&gt;        {&lt;br /&gt;            string f;&lt;br /&gt;            if (bytes &amp;gt; 1073741824)&lt;br /&gt;                f = String.Format("{0:0.00} GB", (float)bytes / (float)1073741824);&lt;br /&gt;            else if (bytes &amp;gt; 1048576)&lt;br /&gt;                f = String.Format("{0:0.00} MB", (float)bytes / (float)1048576);&lt;br /&gt;            else if (bytes &amp;gt; 1024)&lt;br /&gt;                f = String.Format("{0:0.00} KB", (float)bytes / (float)1024);&lt;br /&gt;            else&lt;br /&gt;                f = String.Format("{0:0.00} Bytes", bytes);&lt;br /&gt;            return f;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            if ((e.Cancelled == true))&lt;br /&gt;            {&lt;br /&gt;                progressBar1.Value = 0;&lt;br /&gt;                textBox1.Text = "Upload Canceled!";&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            else if (!(e.Error == null))&lt;br /&gt;            {&lt;br /&gt;                textBox1.Text = ("Error: " + e.Error.Message);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                progressBar1.Value = 100;&lt;br /&gt;                cmdCancelUpload.IsEnabled = false;&lt;br /&gt;                textBox1.Text = "File upload completed!";&lt;br /&gt;            }&lt;br /&gt;            bytesReadTotal = 0; &lt;br /&gt;            cmdStartUpload.IsEnabled = true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void cmdCancelUpload_Click(object sender, RoutedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            bw.CancelAsync();&lt;br /&gt;            cmdCancelUpload.IsEnabled = false;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        private void cmdStartUpload_Click(object sender, RoutedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            OpenFileDialog of = new OpenFileDialog();&lt;br /&gt;            &lt;br /&gt;            bool? userClickedOK = of.ShowDialog();&lt;br /&gt;            if (userClickedOK == true)&lt;br /&gt;            {&lt;br /&gt;                progressBar1.Value = 0;&lt;br /&gt;                progressBar1.Maximum = 100;&lt;br /&gt;&lt;br /&gt;                textBox1.Text = of.File.Name;&lt;br /&gt;&lt;br /&gt;                fs = of.File.OpenRead();&lt;br /&gt;                string fileName = of.File.Name;&lt;br /&gt;&lt;br /&gt;                cmdCancelUpload.IsEnabled = true;&lt;br /&gt;                cmdStartUpload.IsEnabled = false;&lt;br /&gt;                bw.RunWorkerAsync(fileName); // calls DoWork()&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void uploadFileToWeb(string fileName, BackgroundWorker worker, DoWorkEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            byte[] b = new byte[READ_BUFFER_LEN];&lt;br /&gt;            int bytesRead = fs.Read(b, 0, READ_BUFFER_LEN);&lt;br /&gt;            int offset = 0;&lt;br /&gt;            int allow_at_most_two = 1;&lt;br /&gt;            while (bytesRead &amp;gt; 0)&lt;br /&gt;            {&lt;br /&gt;                // has request to stop early been made?&lt;br /&gt;                if (worker.CancellationPending)  &lt;br /&gt;                {&lt;br /&gt;                    e.Cancel = true;&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;                &lt;br /&gt;                AutoResetEvent a = new  AutoResetEvent(false);&lt;br /&gt;&lt;br /&gt;                WebClient wc = new WebClient();&lt;br /&gt;                wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";&lt;br /&gt;                string errormessage = "";&lt;br /&gt;                wc.UploadStringCompleted += (s, e1) =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    string result = "";&lt;br /&gt;                    if (e1.Error == null)&lt;br /&gt;                        result = e1.Result;&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        errormessage = e1.Error.Message.ToString();&lt;br /&gt;                        e.Cancel = true;  // set worker.CancellationPending&lt;br /&gt;                    }&lt;br /&gt;                    Interlocked.Decrement(ref allow_at_most_two);&lt;br /&gt;                    a.Set();&lt;br /&gt;                };&lt;br /&gt;&lt;br /&gt;                wc.UploadStringAsync(new Uri("/StoreFile.ashx", UriKind.Relative), "POST"&lt;br /&gt;                    , "filename=+" + fileName + "&amp;amp;offset=" + offset.ToString() + "&amp;amp;filestream=" &lt;br /&gt;                    + Convert.ToBase64String(b, 0, bytesRead));&lt;br /&gt;&lt;br /&gt;                if (allow_at_most_two == 2)&lt;br /&gt;                    a.WaitOne();&lt;br /&gt;&lt;br /&gt;                Interlocked.Increment(ref allow_at_most_two);&lt;br /&gt;&lt;br /&gt;                Interlocked.Increment(ref offset);&lt;br /&gt;&lt;br /&gt;                worker.ReportProgress(bytesRead);&lt;br /&gt;                if (worker.CancellationPending)&lt;br /&gt;                {&lt;br /&gt;                    e.Cancel = true;&lt;br /&gt;                    break;  // request is stopping&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                bytesRead = fs.Read(b, 0, READ_BUFFER_LEN);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Hope you like the new stuff.  Let me know what you think or what improvements can be made.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-6670300635429086798?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/6670300635429086798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=6670300635429086798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6670300635429086798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6670300635429086798'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2010/08/large-file-upload-in-silverlight-part.html' title='Large File Upload in Silverlight Part II'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-8010445633909746815</id><published>2010-08-01T12:29:00.000-07:00</published><updated>2010-08-02T21:56:00.609-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='large file'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='chunked'/><category scheme='http://www.blogger.com/atom/ns#' term='uploader'/><category scheme='http://www.blogger.com/atom/ns#' term='chunk'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='uploading'/><category scheme='http://www.blogger.com/atom/ns#' term='upload'/><category scheme='http://www.blogger.com/atom/ns#' term='chunking'/><title type='text'>Large File Upload in Silverlight - Chunked</title><content type='html'>I'm going to show what I think is a good solid basic Large File Upload tool written for Silverlight 4.0 that supports a nice responsive UI yet maintains simplicity in allowing files to be uploaded to most web servers. &amp;nbsp;I would not at all say this is the best or most efficient way to do this and it will be slower than stream transfers but I think it pretty stable and simple. &amp;nbsp;At the end of this I will try and address what I think are some of the pro's and cons of this code.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_szAd7h9ckRM/TFYoBxtUdbI/AAAAAAAAFhE/WXTvYPlDjqc/s1600/2010-08-01_1904.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_szAd7h9ckRM/TFYoBxtUdbI/AAAAAAAAFhE/WXTvYPlDjqc/s320/2010-08-01_1904.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;LOL - the progress bar's not showing anything yet&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;It seems funny to say that one of my ambitions over the last six years has been to find a common technology that would enable large file uploads to the web. &amp;nbsp;When I say large files I mean files that are 100Mb, 10GB or bigger. &amp;nbsp;There are so may things that just make large file uploads to website a complete pain in the ass so let me just list a few.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;HTML INPUT TYPE=FILE just plain sucks&lt;/li&gt;&lt;li&gt;Example when a browsers tries to POST a 10Mb file it loads the entire file into that single HTTP call - It's just too much data for one call to a web server (needs to be multiple small calls in parts, chunking)&lt;/li&gt;&lt;li&gt;One most web servers - Large file uploads require web servers scripts timeouts to be changed&lt;/li&gt;&lt;li&gt;If you get the file to a web server there is a chance that it will be deleted because some web servers put up file size restrictions that are not enforced till the entire file is completely there (more server tuning required)&lt;/li&gt;&lt;li&gt;Have you ever tried to HTTP POST a 10GB file to the web - If it worked it would take forever and you get no progress indicators of any kind (all browsers behave the same way on this.)&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;The second category to the pain in the ass for large file uploads is available technologies. &amp;nbsp;I've tried Java large file upload tools that worked with non-specific back end server, server specific ASP.Net ActiveX solutions that use ISAPI and I have even played around with Adobe Air (no threading support) and Flash a little bit and last would be Google Gears. &amp;nbsp;Gears was the only one that just worked but it took a hard deep dive into some working code on YouTube Video uploader to understand it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I believe that Google Gears uploader is still using the same underpinnings but &amp;nbsp;you can check for yourself in the site at &lt;a href="http://upload.youtube.com/my_videos_upload"&gt;http://upload.youtube.com/my_videos_upload&lt;/a&gt;. &amp;nbsp;Years back and peer an myself spent some time looking at their code and he made it work for an internal PHP sites used by only a few persons. &amp;nbsp;Note that no one seemed to like the fact that they had to install Gears though. &amp;nbsp;Interesting things to note about the YouTube uploader is that it's written with worker process support (a separate thread) and thus provided a responsive&amp;nbsp;UI that did not block while uploading the file. &amp;nbsp;The YouTube solution took file selected for upload and stored it in the Gears SQLite DB and then processed the upload in chunks. &amp;nbsp;I think they might of even had a pause/resume but when it comes right down to it the solution just worked. &amp;nbsp;More under the covers of the YouTube uploader was the use of a separate domain name for the file upload &amp;nbsp;that I suspect was a special web server farm. &amp;nbsp;I believe this nature of upload would bind the users session to a single server till the file upload was complete. &amp;nbsp;If they have since updated the solution to a cloud computing formation then they would likely upload in parts (probably to server DB) to the cloud and then signal completion when all done and the have a back-end cloud worked process reassemble the file for subsequent conversion/processing. &amp;nbsp;All in all it worked and it was great!&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I've actually thought about this on and off over the years but aside from some attempts to do this with Adobe Air (no success there) I had not found a technology that I could make this work in till recently when I started programming in Silverlight. &amp;nbsp;I'm sure it could be done as a Java Applet but I've no desire to learn Java (sorry.)&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;So let me just litter out what I think the necessary basics are here for the upload and after I present my code I will suggest some additions for later.&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;File Dialog Selector that runs in all browsers, filters by extensions or other.&lt;/li&gt;&lt;li&gt;Once a file is selected the ability to check the size before starting an upload&lt;/li&gt;&lt;li&gt;The ability to break the file into manageable chunks that uploaded to any web server&lt;/li&gt;&lt;li&gt;A cancel button to stop the upload&lt;/li&gt;&lt;li&gt;Chunking capability for transfer in a format that can be decoded by any web server code (base64)&lt;/li&gt;&lt;li&gt;Progress indicators so you know that work is going on.&lt;/li&gt;&lt;li&gt;Responsive UI that does not bog web client down.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;Thats about all I can think of at the moment but I can edit this later. &lt;br /&gt;&lt;br /&gt;I picked Silverlight because it works a lot like Gears but it's gaining adoption a monster fast rate since companies like Hulu are using it for their Video Players and you will find one version or another on about 60% of all Windows boxes (I looked that up that stat but don't have the link to provide here to back it up, sorry.) Silverlight runs in most modern browsers and on OSX (you can see the System Requirements here&amp;nbsp;&lt;a href="http://www.microsoft.com/getsilverlight/Get-Started/Install/Default.aspx"&gt;http://www.microsoft.com/getsilverlight/Get-Started/Install/Default.aspx&lt;/a&gt;.) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Silverlight has limitations but supports a good strong threading model and making browser based web requests. &amp;nbsp;Note - Silverlight in-browser web requests uses the exact same underlying browser mechanism for web requests and hence carry with them some of the same limitations (like same domain security restrictions and two simultaneous&amp;nbsp;connection limits to a domain (IE8 supports eight I think.) &amp;nbsp; Silverlight can work around the cross domain issue with server landed cross-domain policy file which is cool but you still take up one of your two browser connections so it's something you should be aware of. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I'm going to give this in the following pieces&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;a href="http://4.bp.blogspot.com/_szAd7h9ckRM/TFW-8BZISII/AAAAAAAAFgg/PR0pPPEeg2U/s1600/2010-08-01_1119.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_szAd7h9ckRM/TFW-8BZISII/AAAAAAAAFgg/PR0pPPEeg2U/s320/2010-08-01_1119.png" /&gt;&lt;/a&gt;&lt;li&gt;UI - XAML that has two buttons, a progress indicator and and text box for status details.&lt;/li&gt;&lt;li&gt;Code behind the XAML&lt;/li&gt;&lt;li&gt;Code in an ASP.Net ASHX file for this demo but could be PHP or anything that supports Base64 encoded chunks of file&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;If you want to do this on your own you can just create a new Silverlight 4.0 project in Visual Studio or Visual Web Developer Express (I used version 2010 for this project.) &amp;nbsp;Then add an ASHX file to the web part of the project (name of the file is embedded in the code below.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Here is the XAML&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="xml" name="code"&gt;&lt;usercontrol background="Transparent" d:designheight="92" d:designwidth="244" mc:ignorable="d" x:class="LargeFileUpload.MainPage" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;&lt;br /&gt;    &lt;grid x:name="LayoutRoot"&gt;&lt;br /&gt;        &lt;button click="cmdStartUpload_Click" content="Select File" height="23" horizontalalignment="Left" margin="8,8,0,0" name="cmdStartUpload" verticalalignment="Top" width="75"&gt;&lt;br /&gt;        &lt;progressbar height="19" horizontalalignment="Left" margin="7,37,0,0" name="progressBar1" value="0" verticalalignment="Top" width="231"&gt;&lt;br /&gt;        &lt;textbox height="23" horizontalalignment="Left" margin="7,62,0,0" name="textBox1" verticalalignment="Top" width="231"&gt;&lt;br /&gt;        &lt;/textbox&gt;&lt;/progressbar&gt;&lt;/button&gt;&lt;button click="cmdCancelUpload_Click" content="Cancel" height="23" horizontalalignment="Left" isenabled="False" margin="92,8,0,0" name="cmdCancelUpload" verticalalignment="Top" width="75"&gt;&lt;br /&gt;    &lt;/button&gt;&lt;/grid&gt;&lt;br /&gt;&lt;/usercontrol&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;And now the code behind the XAML&lt;br /&gt;&lt;br /&gt;&lt;pre class="c#" name="code"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Net;&lt;br /&gt;using System.Windows;&lt;br /&gt;using System.Windows.Controls;&lt;br /&gt;using System.Windows.Documents;&lt;br /&gt;using System.Windows.Input;&lt;br /&gt;using System.Windows.Media;&lt;br /&gt;using System.Windows.Media.Animation;&lt;br /&gt;using System.Windows.Shapes;&lt;br /&gt;using System.Threading;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;&lt;br /&gt;namespace LargeFileUpload&lt;br /&gt;{&lt;br /&gt;    public partial class MainPage : UserControl&lt;br /&gt;    {&lt;br /&gt;        public static System.IO.Stream fs;&lt;br /&gt;        private BackgroundWorker bw = new BackgroundWorker();&lt;br /&gt;&lt;br /&gt;        public MainPage()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;            &lt;br /&gt;            bw.WorkerReportsProgress = true;&lt;br /&gt;            bw.WorkerSupportsCancellation = true;&lt;br /&gt;            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);&lt;br /&gt;            bw.ProgressChanged += (s, e) =&amp;gt; {&lt;br /&gt;                long bytesReadTotal = (long)e.UserState;&lt;br /&gt;                textBox1.Text = String.Format("Sent {0} out of {1}"&lt;br /&gt;                    , fileSizeString(bytesReadTotal), fileSizeString(fs.Length));&lt;br /&gt;                progressBar1.Value = e.ProgressPercentage;&lt;br /&gt;            };&lt;br /&gt;            bw.DoWork += (s, e) =&amp;gt; {uploadFileToWeb((string)e.Argument, (BackgroundWorker)s, e);  }; &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        string fileSizeString(long bytes)&lt;br /&gt;        {&lt;br /&gt;            string f;&lt;br /&gt;            if (bytes &amp;gt; 1073741824)&lt;br /&gt;                f = String.Format("{0:0.00} Gb", (float)bytes / (float)1073741824);&lt;br /&gt;            else if (bytes &amp;gt; 1048576)&lt;br /&gt;                f = String.Format("{0:0.00} Mb", (float)bytes / (float)1048576);&lt;br /&gt;            else if (bytes &amp;gt; 1024)&lt;br /&gt;                f = String.Format("{0:0.00} Kb", (float)bytes / (float)1024);&lt;br /&gt;            else&lt;br /&gt;                f = String.Format("{0:0.00} bytes", bytes);&lt;br /&gt;            return f;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            if ((e.Cancelled == true))&lt;br /&gt;            {&lt;br /&gt;                progressBar1.Value = 0;&lt;br /&gt;                textBox1.Text = "Upload Canceled!";&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            else if (!(e.Error == null))&lt;br /&gt;            {&lt;br /&gt;                textBox1.Text = ("Error: " + e.Error.Message);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                progressBar1.Value = 100;&lt;br /&gt;                cmdCancelUpload.IsEnabled = false;&lt;br /&gt;                textBox1.Text = "File upload completed!";&lt;br /&gt;            }&lt;br /&gt;            cmdStartUpload.IsEnabled = true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void cmdCancelUpload_Click(object sender, RoutedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            bw.CancelAsync();&lt;br /&gt;            cmdCancelUpload.IsEnabled = false;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        private void cmdStartUpload_Click(object sender, RoutedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            OpenFileDialog of = new OpenFileDialog();&lt;br /&gt;            &lt;br /&gt;            bool? userClickedOK = of.ShowDialog();&lt;br /&gt;            if (userClickedOK == true)&lt;br /&gt;            {&lt;br /&gt;                progressBar1.Value = 0;&lt;br /&gt;                progressBar1.Maximum = 100;&lt;br /&gt;&lt;br /&gt;                textBox1.Text = of.File.Name;&lt;br /&gt;&lt;br /&gt;                fs = of.File.OpenRead();&lt;br /&gt;                string fileName = of.File.Name;&lt;br /&gt;&lt;br /&gt;                cmdCancelUpload.IsEnabled = true;&lt;br /&gt;                cmdStartUpload.IsEnabled = false;&lt;br /&gt;                bw.RunWorkerAsync(fileName); // calls DoWork()&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void uploadFileToWeb(string fileName, BackgroundWorker worker, DoWorkEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            byte[] b = new byte[57344];&lt;br /&gt;            int bytesRead = fs.Read(b, 0, b.Length);&lt;br /&gt;            long bytesReadTotal = bytesRead;&lt;br /&gt;            while (bytesRead &amp;gt; 0)&lt;br /&gt;            {&lt;br /&gt;                // has request to stop early been made?&lt;br /&gt;                if (worker.CancellationPending)  &lt;br /&gt;                {&lt;br /&gt;                    e.Cancel = true;&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;                &lt;br /&gt;                AutoResetEvent a = new  AutoResetEvent(false);&lt;br /&gt;&lt;br /&gt;                WebClient wc = new WebClient();&lt;br /&gt;                wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";&lt;br /&gt;                string errormessage = "";&lt;br /&gt;                wc.UploadStringCompleted += (s, e1) =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    string result = "";&lt;br /&gt;                    if (e1.Error == null)&lt;br /&gt;                        result = e1.Result;&lt;br /&gt;                    else&lt;br /&gt;                    {&lt;br /&gt;                        errormessage = e1.Error.Message.ToString();&lt;br /&gt;                        e.Cancel = true;  // set worker.CancellationPending&lt;br /&gt;                    }&lt;br /&gt;                    a.Set();&lt;br /&gt;                };&lt;br /&gt;&lt;br /&gt;                wc.UploadStringAsync(new Uri("/StoreFile.ashx", UriKind.Relative), "POST"&lt;br /&gt;                    , "filename=+" + fileName + "&amp;amp;filestream=" &lt;br /&gt;                    + Convert.ToBase64String(b, 0, bytesRead));&lt;br /&gt;&lt;br /&gt;                a.WaitOne();&lt;br /&gt;&lt;br /&gt;                int percentComplete = (int)((float)bytesReadTotal / (float)fs.Length * 100);&lt;br /&gt;                worker.ReportProgress(percentComplete,(Object)bytesReadTotal);&lt;br /&gt;                if (worker.CancellationPending)&lt;br /&gt;                {&lt;br /&gt;                    e.Cancel = true;&lt;br /&gt;                    break;  // request is stopping&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                bytesRead = fs.Read(b, 0, b.Length);&lt;br /&gt;                bytesReadTotal += bytesRead;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;And last but not least the ASHX code behind&lt;br /&gt;&lt;br /&gt;&lt;pre class="c#" name="code"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Text.RegularExpressions;&lt;br /&gt;&lt;br /&gt;namespace LargeFileUpload.Web&lt;br /&gt;{&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// Summary description for StoreFile&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    public class StoreFile : IHttpHandler&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        public void ProcessRequest(HttpContext context)&lt;br /&gt;        {&lt;br /&gt;            context.Response.ContentType = "text/plain";&lt;br /&gt;            context.Response.Write("Hello World");&lt;br /&gt;            string check = context.Request["filestream"];&lt;br /&gt;            check = Regex.Replace(check, " ", "+");&lt;br /&gt;            byte[] bytes = Convert.FromBase64String(check);&lt;br /&gt;            string fileName = context.Server.MapPath(context.Request["filename"]);&lt;br /&gt;&lt;br /&gt;            FileStream fs;&lt;br /&gt;            if ( !File.Exists(fileName))&lt;br /&gt;                fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);&lt;br /&gt;            else&lt;br /&gt;                fs = new FileStream(fileName, FileMode.Append);&lt;br /&gt;            fs.Write(bytes, 0, bytes.Length);&lt;br /&gt;            fs.Close();&lt;br /&gt;            fs.Dispose();&lt;br /&gt;            //System.Threading.Thread.Sleep(500);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void fileit()&lt;br /&gt;        {&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        public bool IsReusable&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return false;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;The first&amp;nbsp;iteration&amp;nbsp;of this code blew because I tried wrote a quick sample to read a file into isolated storage as I reasoned that it would be a good place to put the file in case I wanted to add pause/resume features down the line. &amp;nbsp;What I learned is that moving a 6GB file from disk to isolated storage is just as slow as moving the file from one drive to another one and I did not want to slow this solution down so I scrapped that approach. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;The second try had me trying to read the file on the UI thread alone and simulating a file upload but I never thought would work anyway as all busy work on the same thread make it non responsive and with a very large file you get a bricked app.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;The next try I wanted to use a standard Thread to read the file. &amp;nbsp;Since Silverlight uses a pretty strong sandbox and my Threading skill are newbie at best it for the life of me I could not fathom how to get an open FileStream handle over to a new Thread. After a ton of playing around I found a way around this using a&amp;nbsp;public static variable.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;The next bit of fun came in trying to decide how to send the large chunks of data to the web server. &amp;nbsp;HTTP GET has a typical query string size limit in most browsers of 2048 characters so I wanted to use an HTTP POST. &amp;nbsp;This led to&amp;nbsp;HttpWebRequest with led to a crappy bunch of hard to read code. &amp;nbsp;Silverlight HTTP communications are asynchronous which means you have to wrap your head around a different way of doing things.&amp;nbsp;&amp;nbsp;WebRequest.Create,&amp;nbsp;BeginGetRequestStream, AsyncCallback, GetRequestStreamCallback, blah, blah, blah, blah blah. &amp;nbsp;How can Microsoft take something that was once simple and make into a monster is beyond me. Some digging later on Google (hours later) I found a simple WebClient, UploadStringAsync and&amp;nbsp;UploadStringCompleted which was much more simple and worked.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;With the final pieces in place the above is basically what I came up with and though it slow it seems pretty reliable. &amp;nbsp;Start the 6GB file upload, go away for 6 hours and then come back to a just about to finish up upload. &amp;nbsp;Some of this slowness might be attributed to the fact that I'm doing all this in debug mode but I'm sure a lot of it has to do with the base 64 encoding overhead. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Cons for this solution ---&lt;/b&gt;&lt;/div&gt;A major cons of using Base64 encoded strings for chunked transfer is bloat. &amp;nbsp;Turning byte data into a string representation makes the number of bytes transferred grow quite a bit. I ran this one a 6GB file and it took five hours to transfer it to my own machine but that a debug build. &lt;br /&gt;&lt;br /&gt;&lt;div&gt;Some enhancements that I would make would be&lt;/div&gt;&lt;ol&gt;&lt;li&gt;To change over to using a random access file and on creation of the file for the first time I would create the file to the actual size and just write the bytes into the file in their respective locations. &amp;nbsp;In Silverlight there is no FilStream Open with&amp;nbsp;FileShare.ReadWrite capability but on the back end ASP.Net code I can do that then I would be able to have multiple writers lock, write, then unlock sections of the file. &amp;nbsp;&lt;/li&gt;&lt;li&gt;In Silverlight I would also carry some structure of the blocks not yet written in case of server side error and the need to resend a block multiple times.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Pause and resume would be nice with the only caveat that the Silverlight control will need to remain open in the browser to keep the file handle open. &amp;nbsp;If you close and come back even if I stored the block list in IsolatedStorage Silverlight's security sandbox would require you to click a button action to get the file handle back open. &amp;nbsp;&lt;/li&gt;&lt;li&gt;I would add a lot of error handling code to this solution but I wanted to keep it as simple as possible to convey the basics as I found them out. &amp;nbsp;&lt;/li&gt;&lt;/ol&gt;Enhancement and discovery beyond this point would be up to you and comments appreciated and wanted in case I did something lame in my code (please call it out as I strive to always get better.)&lt;br /&gt;&lt;br /&gt;Drop me comments if you see something or a cleaner use of Thread control for holding up the WebClient's asynchronous call using proper Thread locking code or whatever. I'm new to using Threading so I will likely have done something not quite right about that area of the code.&lt;br /&gt;&lt;br /&gt;Cheers and hope you like this.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-8010445633909746815?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/8010445633909746815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=8010445633909746815' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8010445633909746815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8010445633909746815'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2010/08/large-file-upload-in-silverlight.html' title='Large File Upload in Silverlight - Chunked'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://4.bp.blogspot.com/_szAd7h9ckRM/TFYoBxtUdbI/AAAAAAAAFhE/WXTvYPlDjqc/s72-c/2010-08-01_1904.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-2495570952864376935</id><published>2009-07-19T13:31:00.000-07:00</published><updated>2009-07-19T15:31:00.880-07:00</updated><title type='text'>Browser Responsiveness Testing</title><content type='html'>I play a game on Facebook called Hatchlings.  Part of the game is going out to other persons Hatchlings nests and finding new eggs.  The object is to collect all the eggs available with new ones being released every week or so.  Some of the eggs are rare and only come up randomly based on some unknown statistical calculation.&lt;br /&gt;&lt;br /&gt;Being the happy web hacker I found that not all player profiles are open to finding eggs but quite a few are open.  I made bookmark sets of these open baskets numbering about forty-five per folder so I could gather the eggs and this process led me to wondering which browser could do this process for me faster.&lt;br /&gt;&lt;br /&gt;Opening 45 bookmarks at once requires some good computing power but my home PC is an Intel  Quad Core Q9650 with 8Gb ram and a 25Mbps connect speed. My PC is also quite optimized.&lt;br /&gt;&lt;br /&gt;Here are some of my observations&lt;br /&gt;&lt;br /&gt;45 tabs opening&lt;br /&gt;&lt;br /&gt;Firefox 3.5.1&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Con - Runs in a single instance unless you set up multiple profiles which is PITA&lt;/li&gt;&lt;li&gt; Con - UI becomes unresponsive while the pages are rendering. You can move without experiencing a big responsiveness delay of like 5-10 seconds and.&lt;/li&gt;&lt;li&gt;Con - Running another instance of the browser while the main is loading is impossible&lt;/li&gt;&lt;li&gt;Con - Even after a new browser is open it will not function sometimes for loading a new URL.  Sort of like the other instance is preventing it from working.&lt;/li&gt;&lt;li&gt;Pro - Tab views of same domain and path scale together. If you scale the view window all the windows with the same domain and path scale to the same size for easier viewing&lt;/li&gt;&lt;li&gt;Pro -Add Block Plus allows me to not have to see the junk advertising&lt;/li&gt;&lt;li&gt;Pro - Flash Block allows me block Flash from running&lt;/li&gt;&lt;li&gt;Con - View Scaling only allows you to go so small&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Safari 4.0.2&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Con - View scaling is not bound together and is forgotten between window opens&lt;/li&gt;&lt;li&gt;Con - UI suffers slight non-responsiveness &lt;/li&gt;&lt;li&gt;Con - CPU Utilization is much higher and causes my CPU fan to kick up a notch&lt;/li&gt;&lt;li&gt;Con - No Plugins - AddBlock or FlashBlock &lt;/li&gt;&lt;li&gt;Con - Runs under a single instance which might account for some of the UI non-responsiveness&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Pro - All tabs render much faster than the compared Chrome or Firefox&lt;/li&gt;&lt;li&gt;Pro - By far the fastest web page rendering &lt;/li&gt;&lt;/ol&gt;Chrome 2.0.172.37&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Pro - Most responsive outer UI.  Can be moved around the screen will the tabs are being rendered&lt;/li&gt;&lt;li&gt;Con - "Aw Snap" errors quite often stating that something went wrong while displaying the web page&lt;/li&gt;&lt;li&gt;Con - Error "Script on the page used too much memory. Reload to enable scripts again" Which I checked into and there is a bug report out (support issue reported)&lt;/li&gt;&lt;li&gt;Pro - I can still launch a new browser instance and browse while the other instance is working (or failing)&lt;/li&gt;&lt;li&gt;Pro - Seems to run multiple instances as you open new windows but groups are opened under only one instance (it appears)&lt;/li&gt;&lt;li&gt;Pro - You can rip a tab out from the tab bar to it's own window&lt;/li&gt;&lt;/ol&gt;Internet Explorer 8.0&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Pro - Seems to run multiple instances of the browser (seen in task manager) to provide the browsing and rendering speed&lt;/li&gt;&lt;li&gt;Con - Browser outter UI is not responsive at all till all tabs rendering is completed. You can open a new browser instance but it suffers the same non responsiveness.&lt;/li&gt;&lt;li&gt;Pro - Supports view scaling like Firefox and remembers it between browser sessions&lt;/li&gt;&lt;li&gt;Con - Uses the highest CPU utilization spiking my entire Windows Vista experience&lt;/li&gt;&lt;li&gt;Pro - View Scaling allows you to go very very small.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: -webkit-monospace; font-size: 13px; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;Experience Summary&lt;br /&gt;&lt;br /&gt;While Chrome 2.0.172.37, Internet Explorer 8 and Safari 4.0.2 seem to be close on par for page rendering time the Safari UI lead in responsiveness even though it runs under a single instance.  Note that Safari also seemed to kick my CPU fan up a notch and appeared to use more of the CPU to do it's work.&lt;br /&gt;&lt;br /&gt;Of this entire bunch tested all support very similar navigation options of Ctrl+tab to move from tab to tab and Ctrl+W to close a tab and commonly Ctrl+Shift+Tab no navigate back on tab.  I like that in all of these Alt+F4 closes the browser.&lt;br /&gt;&lt;br /&gt;Firefox's implementation of the screen scaling by domain+path and the fact that it remembers your last preference is better than the others I looked at.&lt;br /&gt;&lt;br /&gt;Firefox was the slowest to render all the tabs in all cases.&lt;br /&gt;&lt;br /&gt;Safari seems to be the fastest at page rendering but it could be just UI responsiveness that gave me that impression since all but Firefox seemed to close.  I would perhaps rank my speed/responsiveness with the following&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Safari (best)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Chrome (second)&lt;/li&gt;&lt;li&gt;IE (third)&lt;/li&gt;&lt;li&gt;Firefox (last)&lt;/li&gt;&lt;/ol&gt;Overall I am still going to use Firefox for my primary work because of plug-in support.  It would be good to note that perhaps without the add-ons that Firefox might have worked much for my speed experience.&lt;br /&gt;&lt;br /&gt;I'm not a fan of the Chrome UI at all but I do like the ability to rip a tab to it's own window (not sure why I like that ability but I do)&lt;br /&gt;&lt;br /&gt;I'm not a fan of how all Microsoft Products seem to be digging a grave by per-suing UI updates to their products that mean the end-user has to re-learn where everything is again and again.  I F'n hate that shit..&lt;br /&gt;&lt;br /&gt;My overall suprise here is that though I use Safari the least I think it kicked butt overall.  If they would implement View a scaling remember then I'd use it all the time and only user Firefox when I'm doing web page development.&lt;br /&gt;&lt;br /&gt;Kevin Pirkl&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-2495570952864376935?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/2495570952864376935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=2495570952864376935' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2495570952864376935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2495570952864376935'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2009/07/browser-responsiveness-testing.html' title='Browser Responsiveness Testing'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-4915274879672641524</id><published>2009-06-20T23:42:00.000-07:00</published><updated>2009-06-21T00:39:53.330-07:00</updated><title type='text'>Overclocking the Q9650</title><content type='html'>I'm the first to admit that I am a complete newb to overclocking so this is a kind of project and learning experience for me.&lt;br /&gt;&lt;br /&gt;Main necessary parts:&lt;br /&gt;&lt;br /&gt;One fully assembled computer&lt;br /&gt; ASUS P5Q motherboard&lt;br /&gt;&lt;a href="http://ark.intel.com/Product.aspx?id=35428&amp;amp;processor=Q9650&amp;amp;spec-codes=SLB8W"&gt;3GHz Intel Core 2 Quad Q9650 &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One Computing Bookazine called the Ultimate Overclocking Handbook price $25&lt;br /&gt;&lt;br /&gt;Finding books or instruction material on overclocking is quite tricky business and almost like a mysterious arcane art passed down on from person to person but seldom documented in such a way as to make things easy.&lt;br /&gt;&lt;br /&gt;FSB on the Q9650 CPU starts off at 333 with a multiplier of 9 but the Intel Speed Step tech and C1E moves the multiplier from 6,7 to 9 to keep electricity usage down.  Faster clock means hotter operation and more electricity.&lt;br /&gt;&lt;br /&gt;First round I pushed the FSB to 413 and turned off C1E and Intel Speed Step technology but I found that pushing the CPU to 100% for any longer than a minute caused the CPU temp to rise over 75 degrees Celsius which can be bad news for the processor. ASUS Suite provides an easy to use temp monitoring utility.&lt;br /&gt;&lt;br /&gt;So out of this first pass I learned my first lesson is that if you want to overclock you need to be able to keep the temperature down.   Pushing the processor to 100% and having the FSB set over 333 produces temperatures that quickly go over CPU temp tolerances.&lt;br /&gt;&lt;br /&gt;Off to the store for a new cooling fan since any FSB setting over 333 with the stock Intel fan and the CPU running at 100% pushes the temperature right up there.  I looked over the reviews at Toms Hardware and finally settled on a Zalman CPU cooler (also because they had it in stock at at ENU locally.) Added one &lt;a href="http://www.zalman.com/ENG/product/Product_Read.asp?idx=333"&gt;Zalman CNPS9900 LED&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This increased the noise output but the ASUS Suite tool provides easy to manage fan profiles which allows better calibration and hence reduced noise levels.  The big bonus here is that even right now my CPU is running around 24 degrees Celsius and the fan is only humming at 958 RPM (max over 2000 RPM.)&lt;br /&gt;&lt;br /&gt;FSB pushed to about 483 before the BIOS post failed..  I backed it off by 10 and tried a boot but that failed so I backed it off another 10 and then it booted up fine.  After about an hour of operation I got a blue screen so I backed it off by 10 more before finally settling in at FSB 453 and I have been running tests for about four hours now and no problems.  My games run fine and I'm getting 4GHz off the processor which is great.&lt;br /&gt;&lt;br /&gt;Through this during some early testing I had turned off Intel Speed Step and C1E. Later on I decided to turn them back on as those technologies really help keep the core temperature down and will lengthen the life of the CPU so I don't see any reason to leave them off.&lt;br /&gt;&lt;br /&gt;Overall with the fan installed I think the only thing preventing me from pushing things even higher is the DDR2 Ram that's installed.  I plan to update to some DDR2 1066MHz memory which should allow me some more room for overclocking.&lt;br /&gt;&lt;br /&gt;This looks like a good price and level of quality for my needs.&lt;br /&gt;&lt;br /&gt;$56 each (I will need two pairs)&lt;br /&gt;&lt;a href="http://www.tigerdirect.com/applications/SearchTools/item-details.asp?EdpNo=3803377&amp;amp;CatId=3413"&gt;OCZ Dual Channel Platinum 4096MB PC8500 DDR2 1066MHz Memory (2 x 2048MB)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The BIOS supports the ability to select the RAM speed and should allow me another boost on speed and memory/FSB overclocking.&lt;br /&gt;&lt;br /&gt;I'll post again in a paycheck or two when I can afford the new memory for testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-4915274879672641524?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/4915274879672641524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=4915274879672641524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/4915274879672641524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/4915274879672641524'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2009/06/overclocking-q9650.html' title='Overclocking the Q9650'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-4316905450151718534</id><published>2009-05-27T14:30:00.001-07:00</published><updated>2009-05-27T14:30:39.705-07:00</updated><title type='text'>Sleep</title><content type='html'>&lt;h3 class="UIIntentionalStory_Message"&gt;Sleep is an elusive ghost. In front of you one second, then hiding behind the next.&lt;/h3&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-4316905450151718534?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/4316905450151718534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=4316905450151718534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/4316905450151718534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/4316905450151718534'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2009/05/sleep.html' title='Sleep'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-5120415685612318414</id><published>2008-10-30T10:02:00.001-07:00</published><updated>2008-10-30T10:02:02.154-07:00</updated><title type='text'>Google Search Appliance - My latest drop-in implementation</title><content type='html'>&lt;blockquote&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Intel Software Network (ISN) recently migrated to a whole new system implementation with everything re-written.&amp;#160; The new domain is &lt;a href="http://software.intel.com"&gt;software.intel.com&lt;/a&gt; and all our Forums, Blogs, Articles, Videos systems are completely new.&lt;/p&gt;  &lt;p&gt;One cool small bit of work that I thought worth talking about is our new Goggle Intel Search appliance implementation in an AJAX HTML drop-in object. On the page look for the item below circled in red to see the current implementation&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_szAd7h9ckRM/SQnocY3RyDI/AAAAAAAACnE/5nVh4W4RSoA/image%5B2%5D.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/_szAd7h9ckRM/SQnocrYSshI/AAAAAAAACnI/X0PTQFZg-gE/image_thumb.png" width="244" height="171" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Search is cool and wrapping Intel's search appliance web service with a &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; / &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; wrapper was quite a bit of fun and the end results looks excellent.&lt;/p&gt;  &lt;p&gt;Here is the search box&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_szAd7h9ckRM/SQnocxB4Z-I/AAAAAAAACnM/_2ooMJAmKu0/image%5B8%5D.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/_szAd7h9ckRM/SQnod0XCf2I/AAAAAAAACnQ/Ms6yQWe2uOU/image_thumb%5B2%5D.png" width="228" height="96" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The &amp;quot;Go&amp;quot; button is wrapped with a drop down site filter selector that essentially pushes a &amp;quot;site:software.intel.com/en-us/xxxx&amp;quot; into the final Google run query.&amp;#160; This is just part of &lt;a href="http://www.googleguide.com/using_advanced_operators.html"&gt;Google Searches advanced search syntax&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_szAd7h9ckRM/SQnoeIT-X_I/AAAAAAAACnU/a_UqNumOlH8/image%5B11%5D.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/_szAd7h9ckRM/SQnoeWeUVpI/AAAAAAAACnY/QhsqMysNUoI/image_thumb%5B3%5D.png" width="232" height="204" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;The new version to be release adds in Spelling suggestion, sort by date/relevance and how many results returned in however many seconds.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_szAd7h9ckRM/SQnoekwA4EI/AAAAAAAACnc/s0m3smegpio/image%5B14%5D.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/_szAd7h9ckRM/SQnoe_6GsrI/AAAAAAAACng/ys8mnlbTYic/image_thumb%5B4%5D.png" width="244" height="112" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_szAd7h9ckRM/SQnofArtTGI/AAAAAAAACnk/vde-LcmXY0Y/image%5B17%5D.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh4.ggpht.com/_szAd7h9ckRM/SQnofgX0WfI/AAAAAAAACno/x55UQv521Hc/image_thumb%5B5%5D.png" width="244" height="111" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The code below while interesting is of no value but does show off and example of &lt;a href="http://docs.jquery.com/Plugins/Authoring"&gt;jQuery plug-in authoring&lt;/a&gt;. The &lt;a href="http://www.learningjquery.com/2007/10/a-plugin-development-pattern"&gt;jQuery plug-in development pattern&lt;/a&gt; is a bit of work to first understand but once you get the hang of it writing them is quite easy.&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;//KMP     &lt;br /&gt;document.writeln(&amp;quot;&amp;lt;style&amp;gt;&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchBox {font-family:verdana,sans-serif;font-size:10px;color:#555555;width:220px;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchBox input {font-size:11px;margin:0px;padding:0px;margin-left:2px;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchSAL {margin:0px;padding:0px;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchResults, #srchPager {word-wrap:break-word;font-family:verdana,sans-serif;font-size:10px;color:#555555;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchResults a {cursor:pointer;color:#0000CC;text-decoration:underline;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchBaseURL {color:#008000;text-decoration:none;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchTerm {width:120px;font-size:11px;border:1px solid #BCCDF0;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchBranding {font-size:11px;padding-top:2px;padding-bottom:5px;border-bottom:1px solid #E9E9E9;text-align:right;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchExpander {font-size:14px;font-weight:bold;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchMenu {width:200px;display:none;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchMenu li:hover {background:white;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#srchMenu li {cursor:pointer;margin:0px;padding:5px;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;.filterHover {display:block;position:absolute;padding:0px;margin:0px;border:1px solid #82A1BC;background:#ECEEED;list-style-image:none;list-style-position:outside;list-style-type:none;font-size:11px;font-family:verdana,sans-serif;color:#555555;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;.srchMenuHover {background:white;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;.srchPgr, .srchPgrSel&amp;#160; {color:#000000;font-size:11px;font-weight:bold;cursor:pointer;text-decoration:underline;display:inline;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;.srchPgrSel {color:#A90A08;text-decoration:none;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#searchResultsTime{text-align:right;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#searchSortByDateRelevance{text-align:right;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;#searchSpelling{color:red;}&amp;quot;);      &lt;br /&gt;document.writeln(&amp;quot;&amp;lt;/style&amp;gt;&amp;quot;); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;(function($) {&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; var relativepath = &amp;quot;&lt;/font&gt;&lt;a href="http://xxxxx.corp.intel.com/salsearch/";"&gt;&lt;font size="1" face="Courier New"&gt;http://xxxxx.corp.intel.com/salsearch/&amp;quot;;&lt;/font&gt;&lt;/a&gt;    &lt;br /&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; $.SearchObj = function(options){ &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.init = true;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (options)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.extend($.SearchObj.defaults, options); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.sortBy = $.SearchObj.defaults.searchSortBy; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ($(&amp;quot;#srchBox&amp;quot;).length &amp;gt; 0)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchBox&amp;quot;).append(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; '&amp;lt;div id=&amp;quot;srchInput&amp;quot;&amp;gt;'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + '&amp;lt;form id=&amp;quot;srchSAL&amp;quot; onSubmit=&amp;quot;return $.SearchObj.searchSAL(true);&amp;quot;&amp;gt;'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + '&amp;lt;input id=&amp;quot;srchTerm&amp;quot; type=&amp;quot;text&amp;quot; size=&amp;quot;10&amp;quot; autocomplete=&amp;quot;off&amp;quot;&amp;gt;'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + '&amp;lt;input id=&amp;quot;srchButton&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;Go&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + '&amp;lt;div id=&amp;quot;srchBranding&amp;quot;&amp;gt;'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + '&amp;lt;span id=&amp;quot;srchExpander&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + '&amp;lt;span id=&amp;quot;srchBrand&amp;quot;&amp;gt;powered by &amp;lt;image align=&amp;quot;top&amp;quot; src=&amp;quot;' + relativepath + 'ISNLogo.jpg&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; '      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; +'&amp;lt;/div&amp;gt;'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ($(&amp;quot;#srchResults&amp;quot;).length == 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchBox&amp;quot;).append('&amp;lt;div id=&amp;quot;srchResults&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; +'&amp;lt;div id=&amp;quot;srchPager&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;');      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchResults&amp;quot;).after('&amp;lt;div id=&amp;quot;srchPager&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;');      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchBrand&amp;quot;).html($.SearchObj.defaults.branding); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchTerm&amp;quot;).width($(&amp;quot;#srchInput&amp;quot;).width() - ($(&amp;quot;#srchButton&amp;quot;).width()+10));     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ($.browser.msie) // fix IE issue with LI element width      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchMenu li&amp;quot;).css({width:&amp;quot;100%&amp;quot;}); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchButton,#srchMenu&amp;quot;).hover(     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function(){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchMenu&amp;quot;).css(&amp;quot;top&amp;quot;,$(&amp;quot;#srchButton&amp;quot;).position().top + $(&amp;quot;#srchButton&amp;quot;).height() + 2 + &amp;quot;px&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchMenu&amp;quot;).css(&amp;quot;left&amp;quot;,$(&amp;quot;#srchButton&amp;quot;).position().left + $(&amp;quot;#srchButton&amp;quot;).width() + 4 - $(&amp;quot;#srchMenu&amp;quot;).width() + &amp;quot;px&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchMenu&amp;quot;).show().addClass(&amp;quot;filterHover&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,function(){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchMenu&amp;quot;).removeClass(&amp;quot;filterHover&amp;quot;).hide();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchMenu li&amp;quot;).hover(     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function(){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(this).addClass(&amp;quot;srchMenuHover&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,function(){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(this).removeClass(&amp;quot;srchMenuHover&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchMenu li&amp;quot;).click(function(){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchCheckImg&amp;quot;).remove();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(this).html('&amp;lt;img id=&amp;quot;srchCheckImg&amp;quot; src=&amp;quot;' + relativepath + 'checksmall.gif&amp;quot;&amp;gt;' + $(this).html());      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchExpander&amp;quot;).click(function(){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( $(this).html() == &amp;quot;- &amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(this).html(&amp;quot;+ &amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(this).html(&amp;quot;- &amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchResults&amp;quot;).toggle();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchPager&amp;quot;).toggle();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( $.SearchObj.defaults.searchStartupQuery.length &amp;gt; 0)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchTerm&amp;quot;).val($.SearchObj.defaults.searchStartupQuery);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.searchSAL(true);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.init = false; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.defaults = {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; filter:&amp;quot;&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; branding:'powered by &amp;lt;image align=&amp;quot;top&amp;quot; src=&amp;quot;' + relativepath + 'ISNLogo.jpg&amp;quot;&amp;gt;',      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; searchPg:1,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; searchTerm:&amp;quot;&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resultsPerPage:10,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; maxPagesToShow:5,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; searchAPIKey:&amp;quot;&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; searchStartupQuery:&amp;quot;&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; searchSpellingSuggestion:&amp;quot;&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; searchLanguageCode:&amp;quot;lang_en&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stripBreaks:true,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; searchSortBy:&amp;quot;&amp;quot;, /* 1=By Date,Blank or 0=Relevance */      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; showResultTime:true,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; showSortByDateRelevance:true,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; trimURI:true      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; };      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; function srchFormatter(r){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var baseURL = r.U.replace(&amp;quot;&lt;/font&gt;&lt;a href="http://","");"&gt;&lt;font size="1" face="Courier New"&gt;http://&amp;quot;,&amp;quot;&amp;quot;);&lt;/font&gt;&lt;/a&gt;    &lt;br /&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var size = &amp;quot;&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var dateTime = &amp;quot;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ($.SearchObj.defaults.trimURI)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; baseURL = baseURL.split(&amp;quot;/&amp;quot;)[0];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(r.HAS.C &amp;amp;&amp;amp; r.HAS.C.SZ)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; size = &amp;quot; - &amp;quot; + r.HAS.C.SZ;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(r.FS.VALUE)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dateTime = &amp;quot; - &amp;quot; + r.FS.VALUE;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( $.SearchObj.defaults.stripBreaks)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; r.S = (r.S == null ? r.T : r.S.replace(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;,&amp;quot;&amp;quot;));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; r.S = (r.S == null ? r.T : r.S);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var mimeType = &amp;quot;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch(r.MIME)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case &amp;quot;text/plain&amp;quot;:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mimeType = &amp;quot;[TEXT] &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case &amp;quot;application/rtf&amp;quot;:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mimeType = &amp;quot;[RTF] &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case &amp;quot;application/pdf&amp;quot;:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mimeType = &amp;quot;[PDF] &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case &amp;quot;application/postscript&amp;quot;:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mimeType = &amp;quot;[PS] &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case &amp;quot;application/vnd.ms-powerpoint&amp;quot;:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mimeType = &amp;quot;[MS POWERPOINT] &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case &amp;quot;application/vnd.ms-excel&amp;quot;:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mimeType = &amp;quot;[MS EXCEL] &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case &amp;quot;application/msword&amp;quot;:      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mimeType = &amp;quot;[MS WORD] &amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return ( &amp;quot;&amp;lt;div&amp;gt;&amp;lt;a target='_blank' href='&amp;quot; + r.U + &amp;quot;'&amp;gt;&amp;quot; + mimeType&amp;#160; + r.T + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + r.S + &amp;quot;&amp;lt;br/&amp;gt;&amp;lt;div id='srchBaseURL'&amp;gt;&amp;quot; + baseURL + size + dateTime + &amp;quot;&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; };      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.submitSuggestion = function(srcVal){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchTerm&amp;quot;).val(srcVal);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.searchSAL(true);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; };      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.changeSort = function(srcVal){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.defaults.searchPg = 1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.sortBy = srcVal ? srcVal:&amp;quot;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.searchSAL(false);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; };      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.searchSAL = function(resetSearchPage){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (resetSearchPage)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.defaults.searchPg = 1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.defaults.searchTerm = $(&amp;quot;#srchTerm&amp;quot;).val();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.sortBy = $.SearchObj.defaults.searchSortBy;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var siteSearch = &amp;quot;&amp;quot;; // get the filter if one is selected     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchMenu li&amp;quot;).each(function(){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ($(this).find(&amp;quot;#srchCheckImg&amp;quot;).length &amp;gt; 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; siteSearch = $(this).attr(&amp;quot;id&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( siteSearch.length &amp;gt; 0)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.defaults.searchTerm += (&amp;quot; &amp;quot; + siteSearch);&amp;#160; // space the search terms      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ($.SearchObj.defaults.filter.length &amp;gt; 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.defaults.searchTerm += (&amp;quot; &amp;quot; + $.SearchObj.defaults.filter);&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchBrand&amp;quot;).html($.SearchObj.defaults.branding + '&amp;lt;img src=&amp;quot;' + relativepath + 'ajax-loader.gif&amp;quot;&amp;gt;');     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( $.SearchObj.defaults.searchAPIKey.length == 0)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; alert(&amp;quot;searchAPIKey Required&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.getScript(relativepath + &amp;quot;ajaxsearch.aspx?F=Search&amp;amp;P1=&amp;quot; + encodeURIComponent($.SearchObj.defaults.searchAPIKey) + &amp;quot;&amp;amp;P2=&amp;quot; + encodeURIComponent($.SearchObj.defaults.searchTerm) + &amp;quot;&amp;amp;P3=&amp;quot; + $.SearchObj.defaults.resultsPerPage + &amp;quot;&amp;amp;P4=&amp;quot; + (($.SearchObj.defaults.searchPg - 1) * $.SearchObj.defaults.resultsPerPage) + &amp;quot;&amp;amp;P5=&amp;quot; + encodeURIComponent($.SearchObj.defaults.searchLanguageCode)+ &amp;quot;&amp;amp;P6=&amp;quot; + encodeURIComponent($.SearchObj.sortBy)); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; };      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.searchCallback = function (jsonData) { &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Spelling errors checks - Walczewski     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( jsonData.GSP.Spelling)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.defaults.searchSpellingSuggestion = jsonData.GSP.Spelling.Suggestion.q;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchBrand&amp;quot;).html($.SearchObj.defaults.branding); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var showLessThanThisManyPages = $.SearchObj.defaults.maxPagesToShow + 1;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var rslt = &amp;quot;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchExpander&amp;quot;).html(&amp;quot;&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchPager&amp;quot;).html(&amp;quot;&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchPager&amp;quot;).hide(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //add spelling suggestion     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( jsonData.GSP.Spelling)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rslt += &amp;quot;&amp;lt;div id=\&amp;quot;searchSpelling\&amp;quot;&amp;gt;Did you mean: &amp;quot; + &amp;quot;&amp;lt;a href='javascript:$.SearchObj.submitSuggestion(\&amp;quot;&amp;quot; + $.SearchObj.defaults.searchSpellingSuggestion +&amp;#160; &amp;quot;\&amp;quot;);'&amp;gt;&amp;quot; + $.SearchObj.defaults.searchSpellingSuggestion + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( $.SearchObj.defaults.showResultTime)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rslt += &amp;quot;&amp;lt;div id=\&amp;quot;searchResultsTime\&amp;quot;&amp;gt;&amp;quot; + ( !jsonData.GSP.RES ? &amp;quot;0&amp;quot;: jsonData.GSP.RES.M) + &amp;quot; search results (&amp;quot; + Math.round(jsonData.GSP.TM*100)/100 + &amp;quot; seconds)&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( jsonData.GSP.RES)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( $.SearchObj.defaults.showSortByDateRelevance)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ($.SearchObj.sortBy == &amp;quot;1&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rslt += &amp;quot;&amp;lt;div id=\&amp;quot;searchSortByDateRelevance\&amp;quot;&amp;gt;Sort by date / &amp;lt;a href='javascript:$.SearchObj.changeSort();'&amp;gt;Sort by relevance&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rslt += &amp;quot;&amp;lt;div id=\&amp;quot;searchSortByDateRelevance\&amp;quot;&amp;gt;&amp;lt;a href='javascript:$.SearchObj.changeSort(1);'&amp;gt;Sort by date&amp;lt;/a&amp;gt; / Sort by relevance&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Pager &amp;quot;1 2 3 4..&amp;quot;&amp;#160; etc Population     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (var s = 1; s &amp;lt;= (jsonData.GSP.RES.M/$.SearchObj.defaults.resultsPerPage) &amp;amp;&amp;amp; s &amp;lt; showLessThanThisManyPages; s++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( $.SearchObj.defaults.searchPg == s)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchPager&amp;quot;).append(&amp;quot;&amp;lt;div class='srchPgrSel'&amp;gt;&amp;quot; + s + &amp;quot;&amp;lt;/div&amp;gt;&amp;amp;nbsp;&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchPager&amp;quot;).append(&amp;quot;&amp;lt;div class='srchPgr'&amp;gt;&amp;quot; + s + &amp;quot;&amp;lt;/div&amp;gt;&amp;amp;nbsp;&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( (jsonData.GSP.RES.M/$.SearchObj.defaults.resultsPerPage) &amp;gt; showLessThanThisManyPages)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchPager&amp;quot;).append(&amp;quot;...&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchPager div&amp;quot;).click(function(){      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ($(this).hasClass(&amp;quot;srchPgr&amp;quot;))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.defaults.searchPg = $(this).html();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $.SearchObj.searchSAL(false);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // ----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchPager&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchExpander&amp;quot;).html(&amp;quot;- &amp;quot;); // match count      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchResults&amp;quot;).show();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchPager&amp;quot;).show(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // special code for non arrary return results for only one search hit     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!jsonData.GSP.RES.R.length)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rslt += srchFormatter(jsonData.GSP.RES.R);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for ( var s = 0; s &amp;lt; jsonData.GSP.RES.R.length; s++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rslt += srchFormatter(jsonData.GSP.RES.R[s]);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#srchResults&amp;quot;).html(rslt);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1" face="Courier New"&gt;// end of closure     &lt;br /&gt;})(jQuery);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;So for the coolness factor with such a tool I can format the results set into the right hand navigation like you see in the screen shots above.&amp;#160; The code easily extends to different formatting's as well.&amp;#160; Examples:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_szAd7h9ckRM/SQnofyBTnGI/AAAAAAAACns/1Bi6i3v9Fck/image%5B42%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/_szAd7h9ckRM/SQnogLB3TpI/AAAAAAAACnw/iOUVQslsfUc/image_thumb%5B16%5D.png" width="491" height="208" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_szAd7h9ckRM/SQnoguvDB1I/AAAAAAAACn0/fexQf2PtXGQ/image%5B46%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/_szAd7h9ckRM/SQnohBjOA2I/AAAAAAAACn4/XuTG0_A8F-s/image_thumb%5B18%5D.png" width="497" height="306" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_szAd7h9ckRM/SQnohdgRDqI/AAAAAAAACn8/lO2zjR_OfxI/image%5B56%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/_szAd7h9ckRM/SQnoiZNKS6I/AAAAAAAACoA/Ecm8JjcTf-8/image_thumb%5B24%5D.png" width="504" height="353" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Pretty isn't it..&amp;#160; Look for the new changes in the next couple of weeks.&lt;/p&gt;  &lt;p&gt;Kevin &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-5120415685612318414?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/5120415685612318414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=5120415685612318414' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/5120415685612318414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/5120415685612318414'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/10/google-search-appliance-my-latest-drop.html' title='Google Search Appliance - My latest drop-in implementation'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://lh6.ggpht.com/_szAd7h9ckRM/SQnocrYSshI/AAAAAAAACnI/X0PTQFZg-gE/s72-c/image_thumb.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-2027867576458935178</id><published>2008-09-19T15:04:00.000-07:00</published><updated>2008-09-19T15:07:04.266-07:00</updated><title type='text'>Upload file using Google Gears - Looking at YouTube</title><content type='html'>&lt;span style="font-family:Tahoma, sans-serif;font-size:100%;"&gt; &lt;div style="padding-left: 72pt; text-indent: -72pt;"&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Wow this is pretty interesting…   Here are the details on how they are doing this…&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;They only offer a cancel on the upload but the do provide a % indicator while the upload is happening..&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;I can verify that once you add the file it appears that they store that item into the Local Gears Database because when you come back to the page it is still there.&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Here is the upload screen..&lt;br /&gt;&lt;/span&gt;&lt;a href="http://4.bp.blogspot.com/_szAd7h9ckRM/SNQiEtLDwRI/AAAAAAAACbw/Qcp1jDEyda4/s1600-h/ATT02640+1-706035.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_szAd7h9ckRM/SNQiEtLDwRI/AAAAAAAACbw/Qcp1jDEyda4/s320/ATT02640+1-706035.jpg" alt="" id="BLOGGER_PHOTO_ID_5247856930034270482" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;   &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;br /&gt;Here is the initial page loadout in Fiddler&lt;br /&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/_szAd7h9ckRM/SNQiEwztZlI/AAAAAAAACb4/d1GRiii10uY/s1600-h/ATT29709+2-707146.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_szAd7h9ckRM/SNQiEwztZlI/AAAAAAAACb4/d1GRiii10uY/s320/ATT29709+2-707146.jpg" alt="" id="BLOGGER_PHOTO_ID_5247856931010078290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:Arial, sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://www.youtube.com/my_videos_multiupload"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://www.youtube.com/my_videos_multiupload&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=ABQIAAAAA6ElvpTmZs4PUpZpSAoK6BSHXJsp5oogWH5jZodYSc2VMsh-GBSvecccQD_seEoYLmo-SsWfitQQEw&amp;amp;hl=en"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=ABQIAAAAA6ElvpTmZs4PUpZpSAoK6BSHXJsp5oogWH5jZodYSc2VMsh-GBSvecccQD_seEoYLmo-SsWfitQQEw&amp;amp;hl=en&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://www.youtube.com/js/lang.js"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://www.youtube.com/js/lang.js&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://www.youtube.com/js/gears_init.js"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://www.youtube.com/js/gears_init.js&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://www.youtube.com/js/gears_common.js"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://www.youtube.com/js/gears_common.js&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://www.youtube.com/js/gears_request.js"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://www.youtube.com/js/gears_request.js&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://www.youtube.com/js/gears_database.js"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://www.youtube.com/js/gears_database.js&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://www.youtube.com/js/gears_upload.js"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://www.youtube.com/js/gears_upload.js&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://s.ytimg.com/yt/img/pic_curvebox_top_yellow_530x6-vfl15849.gif"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://s.ytimg.com/yt/img/pic_curvebox_top_yellow_530x6-vfl15849.gif&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://s.ytimg.com/yt/img/pic_curvebox_bottom_yellow_530x6-vfl15849.gif"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://s.ytimg.com/yt/img/pic_curvebox_bottom_yellow_530x6-vfl15849.gif&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;The after I select a video and click upload these come into play&lt;/span&gt;&lt;a href="http://4.bp.blogspot.com/_szAd7h9ckRM/SNQiE28K6VI/AAAAAAAACcA/Vk2k_f6jaD8/s1600-h/ATT64762+3-707588.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_szAd7h9ckRM/SNQiE28K6VI/AAAAAAAACcA/Vk2k_f6jaD8/s320/ATT64762+3-707588.jpg" alt="" id="BLOGGER_PHOTO_ID_5247856932656179538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://upload.youtube.com/static/uploader_worker.js"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://upload.youtube.com/static/uploader_worker.js&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://s.ytimg.com/yt/img/btn_gradient_grey_1x23-vfl34546.png"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://s.ytimg.com/yt/img/btn_gradient_grey_1x23-vfl34546.png&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://upload.youtube.com/login"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://upload.youtube.com/login&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://upload.youtube.com/stat"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://upload.youtube.com/stat&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://upload.youtube.com/upload"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://upload.youtube.com/upload&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://upload.youtube.com/upload"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://upload.youtube.com/upload&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;etc…&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://upload.youtube.com/upload"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://upload.youtube.com/upload&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;I have attached some of the headers and footers in this email (please don’t hack my account with the cookies :)&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;/login call on upload.youtube.com is of interest as they carry a cookie along for the ride that appears to be the YouTube "user identifier" but on the body of the request it contains the following&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;        login=uploader%40youtube.com&amp;amp;password=&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;plus the Login Request header used a Content-Type: application/octet-stream which is very interesting.  There is also a couple of "Miscellaneous" headers but one of them interests me and is X-GUploader-Client-Version: 2.0.0 (make a mental note of that for future reference.)   Note that in the Respone the send back a Cookie (&lt;span style="font-family:Lucida Console;font-size:85%;"&gt;Set-Cookie: SID=ukWauHLkGDpxrm-s&lt;/span&gt;) &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;The /stat call sent a 404 but that really means nothing. They probably recorded some info but what I do see of interest is the following&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;They do send an Entity Request Header of Content-Disposition: attachment; filename="ukWauHLkGDpxrm-s" which came from the /login call which appears to prep the upload.youtube.com system for the beginning of the upload.&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;The "first", "second" and "last" upload requests are of interest and all carry the SID Cookie above to let the system know which file is being uploaded.  They all also carry &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Type: application/octet-stream&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;X-GUploader-Metadata: filename="ShanghaiIntelView.MOV"; title="ThisIsATestDelete"; token="6829462C852ABA9D:53C662DC848F75CD"&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;This token appears first in the upload page HTML &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;&lt;a href="http://www.youtube.com/my_videos_multiupload"&gt;&lt;span style="color:#0000ff;"&gt;&lt;u&gt;http://www.youtube.com/my_videos_multiupload&lt;/u&gt;&lt;/span&gt;&lt;/a&gt; in a code call to SetMetaData(f, 's', '6829462C852ABA9D:53C662DC848F75CD'); in the page..  I made a couple of page requests to this file and note that it changes the value every time (each re-request.)&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;"first" one contains (of interest) the HTTP FORM FIELD DATA but none of the actual file being uploaded&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Range: bytes 0-2115/8607324&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;--kK1mHUax0A+vuOerE5s8BMA/j1FLMJlytSBbNMRWo0zpfXMA9FpJ1FrYnRvipSjq&lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Disposition: form-data; name="vidcap_upload_key"&lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;EFF11E961367C812-0BC76299C778F30A&lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;--kK1mHUax0A+vuOerE5s8BMA/j1FLMJlytSBbNMRWo0zpfXMA9FpJ1FrYnRvipSjq&lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Disposition: form-data; name="field_myvideo_categories"&lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;22&lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;etc… and at the end this...&lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;--kK1mHUax0A+vuOerE5s8BMA/j1FLMJlytSBbNMRWo0zpfXMA9FpJ1FrYnRvipSjq&lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Disposition: form-data; name="Filedata"; filename="ShanghaiIntelView.MOV"&lt;/span&gt;&lt;/div&gt; &lt;div style="padding-left: 19pt;"&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Type: application/octet-stream&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;"second" contains &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Length: 1048576&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Range: bytes 2116-1050691/8607324&lt;span style="font-family:Arial, sans-serif;"&gt;  Which looks like a split of the first part of the MOV file into sections with the first section being a partial (less the initial part of the POST data)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;etc.. with each next part a split of the file&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Length: 1048576&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Length: 1048576&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Length: 1048576&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;till the "last" part which is the final part of the file..&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Content-Length: 72&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;They do have a cancel button which causes the process to abort but no information is sent back to the server that the upload was stopped..&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt;Kevin&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial, sans-serif;font-size:85%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-2027867576458935178?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/2027867576458935178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=2027867576458935178' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2027867576458935178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2027867576458935178'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/09/upload-file-using-google-gears-looking.html' title='Upload file using Google Gears - Looking at YouTube'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://4.bp.blogspot.com/_szAd7h9ckRM/SNQiEtLDwRI/AAAAAAAACbw/Qcp1jDEyda4/s72-c/ATT02640+1-706035.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-7490067745407335610</id><published>2008-06-07T10:37:00.000-07:00</published><updated>2008-06-07T11:19:42.683-07:00</updated><title type='text'>Intel Hit With Subpoena - AMD gripe about agressive tactics</title><content type='html'>&lt;a href="http://abcnews.go.com/Technology/wireStory?id=5014806"&gt;Intel Hit With Subpoena&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I work for Intel but these opinions are my own and me speaking on my own behalf and not Intel's.&lt;br /&gt;&lt;br /&gt;I for one can say that Intel is aggressive, via layoffs, head count reduction, yearly raise reduction, working their employees to the brink and cutting costs all the way across the board. &lt;br /&gt;&lt;br /&gt;I can bitch about the fact that I've heard that the current hiring practices favors younger fresh out of college persons that show aptitude and understanding of technology as opposed to higher paid talents that come with 10-20+ years of experience. &lt;br /&gt;&lt;br /&gt;I could complain that last week I worked 60-70 hours on support &amp;amp; my current web project the Visual Computing Developer Center Landing page (up and out the door in record time.)&lt;br /&gt;&lt;br /&gt;Intel's has cut down on support overhead, laid off IT staff, cut travel budgets and cut about a ton of other items as well.  I would not be alone in saying that Intel's much leaner and 100x faster on bringing about the "Change" bandwagon. &lt;br /&gt;&lt;br /&gt;Intel teams have cut QA cycles out (software development) and relies even more on Open Source communities. Intel's developers wear every hat now instead of just one.  Intel's teams are well formed and can typically do in seven days what used to take seven months in the old ways/days.  So hell yeah they are getting down to business and working in the dirt and it is good.&lt;br /&gt;&lt;br /&gt;What's great is good and what's great is also a pain in the ass for a typical Intel employee but that is what makes Intel an exciting place to work.&lt;br /&gt;&lt;br /&gt;Let AMD bitch all they want but the fact is Intel's 100,000 (whatever) employees are working at an insane pace cutting down barriers at record rates and that's why we are doing such a damn good job of leading the cutting edge of technology.  Who can say what AMD has done to compete with that?&lt;br /&gt;&lt;br /&gt;Aggressive, sure but look at the world today and you will see an aggressive and almost hostile country called the USA with gas, travel, food, etc. costs soaring and people getting seriously pissed off at it all.  I would say that Intel is a seriously pissed off company and making up for laziness of the past and paying what is owed to get back to where they should be and that there is nothing unfair about that.&lt;br /&gt;&lt;br /&gt;IMHO Intel is doing a damn good job.  Intel's technology innovations are making this world a better place.  Give me my faster Internet, give me a faster computer and leave me the hell alone so I can write my code and play my games and socialize on the net in a way I see fit to do so. If I want AMD let them put out a good processor that specs out as my dream ticket of computing desire and hell I will buy it when the time comes.&lt;br /&gt;&lt;br /&gt;Intel needs healthy competition and if no one is willing to rise to the challenge then people should not just stand back and bitch about Intel and toss lawsuits their way to try stall Intel because I doubt that it will work anyway. &lt;br /&gt;&lt;br /&gt;Hell, looking at the future China and the Saudis will probably out pace Intel in the next ten years anyway.&lt;br /&gt;&lt;br /&gt;Kevin Pirkl&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-7490067745407335610?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/7490067745407335610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=7490067745407335610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/7490067745407335610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/7490067745407335610'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/06/intel-hit-with-subpoena-amd-gripe-about.html' title='Intel Hit With Subpoena - AMD gripe about agressive tactics'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-1194633570750300583</id><published>2008-05-29T16:40:00.001-07:00</published><updated>2008-05-29T16:40:12.484-07:00</updated><title type='text'>Google IO Conference - Day 2</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;From day 1 registration    &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/pirklk/SD8-wa_E1mI/AAAAAAAACMo/9LjCaBje86Y/image15.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/pirklk/SD8-w6_E1nI/AAAAAAAACMw/jDOLDhepF88/image_thumb5.png" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I'm going to let this one ride all the way as it (I'm not big on spelling corrections, etc..)&amp;#160; I've typed enough notes today and I'll have to take another look at it tomorrow and perhaps then make additions and/or corrections.&lt;/p&gt;  &lt;p&gt;Enjoy, KP&lt;/p&gt;  &lt;p&gt;Day 2 begins with Keynote speaker Marissa Mayer, Vice President of Search and User Experience talking about &amp;quot;Imagination, Immediacy and Innovation... plus a little glimpse under the hood at Google&amp;quot;&lt;/p&gt;  &lt;p&gt;Blah, blah, blah, laughter, blah, blah blah nothing we have not heard before for those that have seen the TV documentary.&lt;/p&gt;  &lt;p&gt;Here's a cool fact I noticed..&amp;#160; The main stage has the Google IO logo and the left and right are top and bottom like so&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/pirklk/SD8-xa_E1oI/AAAAAAAACM4/p12-V6qvS0k/image12.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/pirklk/SD8-xq_E1pI/AAAAAAAACNA/NP6Gj52wnTo/image_thumb4.png" width="244" height="61" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160; 1111      &lt;br /&gt;&lt;u&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160; 1&amp;#160; 1&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/u&gt;01001001&amp;#160;&amp;#160;&amp;#160; 1&amp;#160; 1&amp;#160; 1&amp;#160;&amp;#160; 01001001       &lt;br /&gt;01001111&amp;#160;&amp;#160;&amp;#160; 1&amp;#160; 1111&amp;#160;&amp;#160; 01001111&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The bottom left and right are displayed as black dots and white dots in a set of eight or Binary to ASCII that is &amp;quot;IO&amp;quot; which is a nice little play on the whole Google IO thing.&amp;#160; (??Hint: Times Squaring the Circle???)&lt;/p&gt;  &lt;p&gt;Ok back to the keynote: This story Marissa is telling is the one about Google Home Page A/B testing and returning more than 20 results with the end result being &amp;quot;It's not about the number of results but it's about the speed at which those results are delivered.&amp;quot;&amp;#160; Nothing that I didn't already know.&amp;#160; What crazes me about this is that they cite a falloff based on speed when it is a know fact that user percentages that go beyond page two of&amp;#160; a search fall off considerably.&amp;#160; With today's faster net speeds there is no way you will convince me that this is not about advertising $$ based on this logic.&lt;/p&gt;  &lt;p&gt;I didn't know about the Swedish Chef Easter Egg. (&lt;a href="http://en.wikipedia.org/wiki/Google's_hoaxes" target="_blank"&gt;Egg's and Hoaxes&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;--&lt;/p&gt;  &lt;p&gt;Note: There are more laptops here that I have ever seen before at a conference.&amp;#160; It looks like 90% of the people here are wired in.&lt;/p&gt;  &lt;p&gt;Note2: The provided WiFi is not keeping up with demand so I am glad I am putting these notes together in Windows Live Writer.&lt;/p&gt;  &lt;p&gt;Note3: The told us that all the sessions will be online next week (I guess that means videos will be online.)&lt;/p&gt;  &lt;p&gt;Note 4: Open Social API gadgets.util.sanitizeHtml() for HTML cleanup and protection.&amp;#160; Funny thing is that you can find this in the &lt;a href="http://code.google.com/apis/opensocial/docs/releasenotes.html" target="_blank"&gt;version .8 release&lt;/a&gt; notes but not in the API reference.&lt;/p&gt;  &lt;p&gt;Note 5: Need power strips everywhere considering the number of laptops here.&amp;#160; The future is having a good laptop and conferences will continue to have more and more laptop percentages.&lt;/p&gt;  &lt;p&gt;Note 6: I hear there are around/over 3000 persons here.&amp;#160; I think 2/3rds of the group are using Mac's and the rest a mix of PC's, Mids,iPhones, other mobile types.&lt;/p&gt;  &lt;p&gt;Note 7: I need to get a &lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=40318&amp;amp;hl=en" target="_blank"&gt;sitemap&lt;/a&gt; so sites like Google can better find out content.&lt;/p&gt;  &lt;p&gt;Note 8: &lt;a href="http://www.flickr.com/photos/tags/io2008" target="_blank"&gt;Images from Google IO 2008&lt;/a&gt; (tagged with the io2008 tag)&lt;/p&gt;  &lt;p&gt;Note 9: I keep seeing something called &lt;a href="http://hi5.com/" target="_blank"&gt;hi5&lt;/a&gt; mentioned with this logo&lt;/p&gt;  &lt;p&gt;&lt;img src="http://images.hi5.com/images/header_logo2.gif" /&gt;&amp;#160; and along with that and a &lt;a href="http://code.google.com/apis/opensocial/gettingstarted.html" target="_blank"&gt;few other OpenSocial containers&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Note 10: Tons of people taking pictures of slides in lectures and even saw a few webcams recording or broadcasting perhaps...&amp;#160; Hmm I wonder if I would blue-screen my T61 if I try a Yahoo Broadcast. I better save this document first.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For my session lineup today:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session 1: I picked &amp;quot;HTML5, Brought to You by Gears&amp;quot; - Speaker Aaron Boodman - (Room 1)&lt;/p&gt;  &lt;p&gt;One other interesting note is that I think most of yesterday's sessions I picked were in smaller rooms that did not fill.&amp;#160; This session is in a double size room and packed tight onto the floors as well.&lt;/p&gt;  &lt;p&gt;Gears and &lt;a href="http://www.w3.org/html/wg/html5/" target="_blank"&gt;HTML5&lt;/a&gt; web standards - Gears is incrementally implementing HTML5 standards as they release new and exciting features.&amp;#160; They consider themselves ahead of the curve on this because they are doing things that are being set as standards later on.&amp;#160; This means they have to come back and the adhere to the accepted approach that gets put forts by bodies like the W3C.&lt;/p&gt;  &lt;p&gt;Gears core functions are is typically wrapped in their own JavaScript Namespaces so they can later fix the underpinnings to be HTML5 compliant.&lt;/p&gt;  &lt;p&gt;The DB demo that they were going to show didn't work which was kind of annoying IMHO. Ok with some help from the crowd they did get it finally working.&amp;#160; Basically it was a demo of native implementation of the new HTML5 DB API using Safari 3.n and then switched to using Gears which in essence makes it backwards compatible with older browsers not yet supporting HTML5 DB.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session 2: OpenSocial, OpenID, and OAuth: Oh, My! (Room 4) - Joseph Smarr -&lt;/p&gt;  &lt;p&gt;I was going to go to &amp;quot;A World Beyond AJAX: Accessing Google's API's from Flash and other Non-JavaScript Environments - Speaker Vadim Spivak - (Room 9)&amp;quot; but I think those are things I could learn for myself so I picked the OpenSocial,OpenId track in hope of getting a future Intel integration up and running.&lt;/p&gt;  &lt;p&gt;OpenID enables one place storage of Personal Profile information and allowing sharing that information with websites that you trust.&amp;#160; (Note: I don't honestly understand what this speaker is suggesting here using the Google offerings.)&lt;/p&gt;  &lt;p&gt;My interest in the OpenSocial side of this talk is honestly nill and I am more interested in knowing more about the OpenID and OAuth integration points.&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;Joseph mentions that all social apps are broken or act like silos.&amp;#160; I tend to agree with that.&amp;#160; OpenID would be a good thing for Intel.com to work out.&amp;#160; Hell for that matter working with Google Auth would make Intel.com about 1000x better.&lt;/p&gt;  &lt;p&gt;Crumb I think this whole Social web talk was an excuse to show us &lt;a href="http://www.plaxo.com/" target="_blank"&gt;Plaxo&lt;/a&gt; (From their site &lt;a href="http://blog.plaxo.com/archives/2008/05/post.html" target="_blank"&gt;Plaxo is about the be bought by Comcast&lt;/a&gt;.) I have heard all I care to hear about OpenSocial and what it is and I thought this talk was going to be about OpenID integration process steps etc..&amp;#160; When the frick is Joseph going to dive into OpenID and OAuth?&amp;#160; &lt;/p&gt;  &lt;p&gt;I'm personally not very excited about ever allowing third parties to access my online address book or personal details beyond the information I wish to give.&amp;#160; The thought putting all my interconnections in one place thinks that it creates a ripe place for thievery or scam.&lt;/p&gt;  &lt;p&gt;Finally a two second mention about XRDS but so far that was it.&lt;/p&gt;  &lt;p&gt;This was not really a session for developers.&lt;/p&gt;  &lt;p&gt;Lunch&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session 3: Inside the Android Application Framework    &lt;br /&gt;(Room 3) - Android Engineering Team -&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/pirklk/SD8-yK_E1qI/AAAAAAAACNI/5uJT7567qqM/image9.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/pirklk/SD8-yq_E1rI/AAAAAAAACNQ/OS7IPm2sths/image_thumb3.png" width="244" height="182" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;APK Runs on a single process&lt;/p&gt;  &lt;p&gt;Activities - Concrete API&lt;/p&gt;  &lt;p&gt;Task - are a Runtime Sequence of Activities - Tasks can span Activities&lt;/p&gt;  &lt;p&gt;Process Basics - One per APK - By default one thread per process and all APK run within that thread. Process is started for a given UserId&lt;/p&gt;  &lt;p&gt;Activities Lifecycle - &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Starting Up (Created(), onStart(), onRestart(),onResume()) &lt;/li&gt;    &lt;li&gt;Normal Execution (onFreeze(),onPause()) &lt;/li&gt;    &lt;li&gt;Shutdown (onStop(),onDestroy()) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Example Lifecycle -When a child Activity is launched&lt;/p&gt;  &lt;p&gt;Live sucker...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/pirklk/SD8-y6_E1sI/AAAAAAAACNY/i2sF8TBW6K0/image22.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/pirklk/SD8-za_E1tI/AAAAAAAACNg/96o2l8UiqKM/image_thumb8.png" width="329" height="243" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Die sucker&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/pirklk/SD8-z6_E1uI/AAAAAAAACNo/IxxLu1034F8/image26.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/pirklk/SD8-0a_E1vI/AAAAAAAACNw/ybE1mCF2sSo/image_thumb10.png" width="334" height="255" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Threads and Loops - Loopers Assume they are associated with a single process and are not intended to be thread safe. Loopers cannot tolerate multi-threaded access and must use message passing/handlers instead.&lt;/p&gt;  &lt;p&gt;The thread handling was quite interesting&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/pirklk/SD8-06_E1wI/AAAAAAAACN4/qe7zqqfbXgc/image18.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://lh6.ggpht.com/pirklk/SD8-1q_E1xI/AAAAAAAACOA/E9LtzTFMqdU/image_thumb6.png" width="244" height="181" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Process Resource Management&lt;/p&gt;  &lt;p&gt;Only three process run as root&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;init &lt;/li&gt;    &lt;li&gt;Zygote &lt;/li&gt;    &lt;li&gt;main runtime &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;To connect distinct process's, for that process you have explicitly expose it via Services API and Inter-process communication bridges.&lt;/p&gt;  &lt;p&gt;Dalvik VM - The Virtual Machine that hosts a running Android Application instance running in a single process. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session (Long break): I plan to take a break now instead of a session to see all the offerings on the main display floor..&amp;#160; I will tell what I see and what piqued me here later...&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/apis/health/" target="_blank"&gt;&lt;img align="right" src="https://www.google.com/health/html/images/logo_beta.gif" /&gt; Google Health API&lt;/a&gt; - &lt;a href="http://www.google.com/health/" target="_blank"&gt;Google Health TOS&lt;/a&gt; gets around normal HIPAA requirements (If you create, transmit, or display health or other information while using Google Health, you may provide only information that you own or have the right to use. When you provide your information through Google Health, you give Google a license to use and distribute it in connection with Google Health and other Google services. However, Google may only use health information you provide as permitted by the Google Health Privacy Policy, your Sharing Authorization, and applicable law. Google is not a &amp;quot;covered entity&amp;quot; under the Health Insurance Portability and Accountability Act of 1996 and the regulations promulgated thereunder (&amp;quot;HIPAA&amp;quot;). As a result, HIPAA does not apply to the transmission of health information by Google to any third party.)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/apis/ajaxlibs/" target="_blank"&gt;Google AJAX Libraries API&lt;/a&gt; - Provides hosting and loader for various JavaScript Libraries and a &lt;a href="http://code.google.com/apis/ajaxlibs/documentation/index.html#jquery" target="_blank"&gt;loader for my favorite jQuery&lt;/a&gt; - &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/pirklk/SD8-16_E1yI/AAAAAAAACOI/LhnFfZakndg/image31.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/pirklk/SD8-2a_E1zI/AAAAAAAACOQ/VfxMyH5UArw/image_thumb13.png" width="416" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I met Vadim Spivak the person who put together the hosting of all these various OpenSource JavaScript libraries and gained a few insights into the loader mechanisms.&amp;#160; You can now reference your favorite JS library directly from Google CDN but for even better loading speed Vadim recommends you use the .load() API in the HEAD section with explicit versioning (actually does a document.write) which will get you the file from cache servers much faster than direct linking.&amp;#160; Cool detail to know.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session: Creating a Client Side Search Engine with Gears - Brad Neuberg -&lt;/p&gt;  &lt;p&gt;What would be very cool to get out of this session would be the ability to take our Intel CD system (internally called Redfort at Intel) offline for and make it searchable.&amp;#160; Imagine thousands of Intel.com technical documents at your fingertips for easy reference.&lt;/p&gt;  &lt;p&gt;Demo was awesome..&amp;#160; Brad showed a web app that loaded a text document containing URI's of E-Books.&amp;#160; This app parsed and pulled all those E-Books local and then provided a search interface that used FTS2 (Full Text Search2) Gears API function to search the entire database and return results.&amp;#160; Wow!!! &lt;/p&gt;  &lt;p&gt;Sample used Gears threads to do all the work making the app run without stuttering.&amp;#160; Brad's explanations were excellent and he showed a lot of code which was very cool.&amp;#160; I'm not a Dojo fan but between Dojo,Google style code and jQuery, I think I will learn more about those first two.&amp;#160; Different style and approaches teach a person more than just knowing one style of coding.&lt;/p&gt;  &lt;p&gt;The project is not available for download as it is not completed but I did find a Google reference that led me to &lt;a href="http://code.google.com/p/gears-pubtools/" target="_blank"&gt;gears-pubtools&lt;/a&gt; (confirmed, it will be there when it is completed.)&lt;/p&gt;  &lt;p&gt;Kick Azz demo for sure and I will look forward to see it.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Kevin Pirkl&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-1194633570750300583?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/1194633570750300583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=1194633570750300583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/1194633570750300583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/1194633570750300583'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/05/google-io-conference-day-2.html' title='Google IO Conference - Day 2'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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/pirklk/SD8-w6_E1nI/AAAAAAAACMw/jDOLDhepF88/s72-c/image_thumb5.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-441787370262524050</id><published>2008-05-28T20:49:00.001-07:00</published><updated>2008-05-28T20:49:57.153-07:00</updated><title type='text'>Google IO Conference - Day 1</title><content type='html'>&lt;p&gt;Well I'm &lt;a href="http://code.google.com/events/io/location.html" target="_blank"&gt;here&lt;/a&gt; at the &lt;a href="http://code.google.com/events/io/index.html" target="_blank"&gt;Google IO Conference 2008&lt;/a&gt; and the lines are long and they are getting a late start due to very long lines still waiting to get checked in. (10 Minutes late so far.)&lt;/p&gt;  &lt;p&gt;Quick Thoughts: 15 minutes late now, this place is packed, great round style layout, they finally caved in and just let everyone upstairs (without badges or checking if they have paid.)&amp;#160; They are starting the event now...&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://code.google.com/events/io/sessions.html" target="_blank"&gt;sessions&lt;/a&gt; lineup looks great for me today..&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Keynote: Client, Connectivity, and the Cloud - Vic Gundotra, Vice President, Engineering&lt;/li&gt;    &lt;li&gt;Extend the Reach of your Google Apps Environment with Google APIs      &lt;br /&gt;(Room 9)&lt;/li&gt;    &lt;li&gt;Lunch&lt;/li&gt;    &lt;li&gt;Rapid Development with Python, Django and Google App Engine (Room 1)&amp;#160; (Skipped this for Building an Android Application 101 (Room 3))&lt;/li&gt;    &lt;li&gt;Can We Get There From Here?      &lt;br /&gt;(Room 4)&lt;/li&gt;    &lt;li&gt;Secure Collaboration - How Web Applications can Share and Still Be Paranoid      &lt;br /&gt;(Room 4)&lt;/li&gt;    &lt;li&gt;Authenticating to Google Data Services      &lt;br /&gt;(Room 9)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Keynote - Google/Other announcements so far..&lt;/p&gt;  &lt;p&gt;MySpace Mail Message center goes Mobile with announced Gears&amp;#160; support&lt;/p&gt;  &lt;p&gt;Google App Engine (GAE) announces two new API additions, the ever popular MEMCACHE and a Image Manipulation API. GAE Opens up the doors from limited beta by waiting list invite to all are welcome. They also announced their &lt;a href="http://googleappengine.blogspot.com/2008/05/announcing-open-signups-expected.html" target="_blank"&gt;pricing plan&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Keynote showed a demo using the AJAX API of not yet fully release jQuery 1.2.6.&amp;#160; No longer do you have to maintain your own versions of jQuery but the ever popular Google will do that an load the API for you. &lt;a href="http://code.google.com/apis/ajaxlibs/" target="_blank"&gt;AJAX Libraries API&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;GWT 1.5 Released available today with JAVA 5 Language/Feature support.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session: Extend the Reach of your Google Apps Environment with Google APIs - Lots more JSON-Script style support for web apps.&amp;#160; I liked the &lt;a href="http://code.google.com/support/bin/answer.py?answer=86805&amp;amp;topic=11369" target="_blank"&gt;information for .Net&lt;/a&gt; about the &lt;a href="http://code.google.com/apis/documents/overview.html" target="_blank"&gt;Google Document List Data&amp;#160; API&lt;/a&gt; that allows you upload multiple DOCS into Google documents.&amp;#160; SalesForce.com did not interest me much..&amp;#160; Wish I had gone to the AJAX track but was good information.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session: Building an &lt;a href="http://code.google.com/android/what-is-android.html" target="_blank"&gt;Android&lt;/a&gt; Application 101 (Room 3) - &lt;/p&gt;  &lt;p&gt;&lt;img align="right" src="http://code.google.com/android/images/logo_android.gif" /&gt; &lt;/p&gt;  &lt;p&gt;IntentRecievers are listeners designed to respond to broadcasts. They are like a verb and object; a description of what you want done or an action (VIEW, PLAY.)&amp;#160; The core System matches Intent with actions. One cool thing about Android is the Integrated Browser called &lt;a href="http://webkit.org/" target="_blank"&gt;WebKit&lt;/a&gt; which is an open source project.&amp;#160; This API set is so cool I think that I might drop my iPhone just to write apps for it.&amp;#160; Well perhaps not but I could get another phone. Wow the whole hour is already gone..&lt;/p&gt;  &lt;p&gt;Retweeting @gmitsopoulos: #IO2008 Android is scheduled to ship on first handhelds in second half of this year&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I stumbled into the end of another session and managed to get in a question as they were talking about the Google Language Translation API.&amp;#160; I fired off a question about contextual HTML parsing and after the event on of the API team approached and told me he had read my post and reviews on the Translator API over the last year. Very cool to know that I'm being read.. Wowza..&amp;#160; They did mention some improvements in the API with HTML handling and leaving it alone which is cool (somewhat prompted by my earlier blog posts) &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session: Can we get there from here? - This is a tough topic for the speaker to take on.&amp;#160; They had to delve quite a bit into overview and historical tense to get to the root of where things are going and what the needs are now and later.&amp;#160; Lowest browser sets the ruddy bar we get stuck with.&amp;#160; We need tools that allow for faster newer version of browsers supporting latest standards. Alex Russell the speaker is of the opinion that the Browser Sucks in two ways.&amp;#160; So many browsers that just don't work together, provide standard API's, standard formatting on platforms from desktop to mobile phones.&amp;#160; His opinion of what will make these browser vendors to make this happen is competition. New versions out for all major browsers (perhaps) before the end of the year.&lt;/p&gt;  &lt;p&gt;Mono-cultures reduce costs in the short run - (Not sure what that exactly means)&lt;/p&gt;  &lt;p&gt;There exists an idea that web developers are hostage to deployed web browsers and the realm of web-ish applications although cool do not get us to the desktop-ish applications that Silverlight and FX take us too.&lt;/p&gt;  &lt;p&gt;BTW - Alex Russell is a frigging genius and I need to get on board with his preaching's.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session: Secure Collaboration - How Web Applications can Share and Still Be Paranoid    &lt;br /&gt;(Room 4) - Mike Samuel&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.360.yahoo.com/blog-TBPekxc1dLNy5DOloPfzVvFIVOWMB0li?p=706" target="_blank"&gt;Douglas Crockford's ADSafe&lt;/a&gt; and &lt;a href="http://code.google.com/p/google-caja/" target="_blank"&gt;Google Code Caja Project&lt;/a&gt; are just to approaches to securing third party code.&lt;/p&gt;  &lt;p&gt;Turns out that Caja is not yet usable today but there are prototypes.&amp;#160; Not much use to me though since this is just all theory.&lt;/p&gt;  &lt;p&gt;Was very short presentation..&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Break - Sitting around attempting to digest the new and old.&amp;#160; It's amazing how far things have moved since Google Dev Days about a year plus ago.&amp;#160; Software changes are so much more rapid these days and that is for sure one thing to look for in my own work and designs.&amp;#160; I think foundations for rapid change is a better sought after approach than doing things the manual way.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Session: Authenticating to Google Data Services    &lt;br /&gt;(Room 9) - &lt;a href="http://code.google.com/apis/gdata/auth.html" target="_blank"&gt;Google Data API Authentication Overview&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/apis/gdata/" target="_blank"&gt;Google Data API's about&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ClientLogin - Stored on the client machine only. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;When you cant always do a browser redirection.&amp;#160; Typically uses HTTPS and sometimes CAPTCHA when negotiating security authorization. &lt;/p&gt;    &lt;p&gt;HTTP POST URL - CGI Headers (accountType,Email,password,service,source) and gets back plaintext key-value pairs SID LSID and Auth.&amp;#160; Auth is the important token that you use in the authorization header to get a users data for them.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;AuthSub - redirection style login using redirection.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Redirects to a Google branded web page and gives approval for your web application and redirects the user back to the originating page.&amp;#160; Apps have to be registered with Google for this to work.&amp;#160; Remember that this is all about Google user personal data access.&lt;/p&gt;    &lt;p&gt;Scope - &lt;strong&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;New&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; Is a new feature that allows coverage over many different user Google Data sets (Calendar,Email,Contacts,etc..)&lt;/p&gt;    &lt;p&gt;This is a more complex approach and to protect against this the web app domain must be registered with Google in order to use AuthSub.&amp;#160; This approach uses Asymmetric Cryptography with Public/Private keys for verification.&amp;#160; You own your Private Key signature and it's a PKI like exchange.&lt;/p&gt;    &lt;p&gt;myrsakey.pem - private RSA key&lt;/p&gt;    &lt;p&gt;myrsacert.pem - public RSA certificate&lt;/p&gt;    &lt;p&gt;opensll req -x509 -nodes -days etc...&lt;/p&gt;    &lt;p&gt;This poor iPhone screen print sort of shows it working (I forgot to bring a camera.)&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh3.ggpht.com/pirklk/SD4n4K_E1kI/AAAAAAAACMY/58OXpz-Hf6I/image%5B2%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://lh6.ggpht.com/pirklk/SD4n46_E1lI/AAAAAAAACMg/4Xwp5fvjmb0/image_thumb.png" width="244" height="187" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;1&amp;gt; Register your account domain with Google (for example softwarecommunity.intel.com.&amp;#160; They use an HTML file you place into the root of the server.&lt;/p&gt;    &lt;p&gt;2&amp;gt; Then you Agree to a TOS and upload your certificate till it becomes active.&lt;/p&gt;    &lt;p&gt;When complete your ready to roll&lt;/p&gt;    &lt;p&gt;Client Libraries are available in Java,.Net,Python,PHP,Objective-C&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/OAuth" target="_blank"&gt;OAuth&lt;/a&gt; - net step for AuthSub just more complex.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Open standard with specification still being developed with Open Source Libraries already available.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Most of this stuff I already know but what the heck it was very good to get the juices flowing to see how I can better our SoftwareCommunity.intel.com offerings.&lt;/p&gt;  &lt;p&gt;End Day 1&lt;/p&gt;  &lt;p&gt;Kevin Pirkl&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-441787370262524050?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/441787370262524050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=441787370262524050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/441787370262524050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/441787370262524050'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/05/google-io-conference-day-1.html' title='Google IO Conference - Day 1'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://lh6.ggpht.com/pirklk/SD4n46_E1lI/AAAAAAAACMg/4Xwp5fvjmb0/s72-c/image_thumb.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-6720593589154500100</id><published>2008-05-28T09:33:00.000-07:00</published><updated>2008-05-28T09:35:14.114-07:00</updated><title type='text'>Bandwidth saturation - Google IO</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://bp1.blogger.com/_szAd7h9ckRM/SD2Jwq_E1jI/AAAAAAAACMQ/tQs7rc-iVtg/s1600-h/photo-714117.jpg"&gt;&lt;img src="http://bp1.blogger.com/_szAd7h9ckRM/SD2Jwq_E1jI/AAAAAAAACMQ/tQs7rc-iVtg/s320/photo-714117.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5205468213575734834" /&gt;&lt;/a&gt;&lt;/p&gt;Looks like they didn&amp;#39;t plan Inet sopport very well. I&amp;#39;m getting pages  &lt;br&gt;now but very slow to nothing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-6720593589154500100?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/6720593589154500100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=6720593589154500100' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6720593589154500100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6720593589154500100'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/05/bandwidth-saturation-google-io.html' title='Bandwidth saturation - Google IO'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://bp1.blogger.com/_szAd7h9ckRM/SD2Jwq_E1jI/AAAAAAAACMQ/tQs7rc-iVtg/s72-c/photo-714117.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-8682803588777246275</id><published>2008-05-28T08:58:00.000-07:00</published><updated>2008-05-28T09:01:08.203-07:00</updated><title type='text'>How not to run a conference - Google IO</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://bp3.blogger.com/_szAd7h9ckRM/SD2BxK_E1iI/AAAAAAAACMI/XtABxgDMSRo/s1600-h/photo-768212.jpg"&gt;&lt;img src="http://bp3.blogger.com/_szAd7h9ckRM/SD2BxK_E1iI/AAAAAAAACMI/XtABxgDMSRo/s320/photo-768212.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5205459426072647202" /&gt;&lt;/a&gt;&lt;/p&gt;Making a few thousand people wait in line when event start is in 30 min.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-8682803588777246275?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/8682803588777246275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=8682803588777246275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8682803588777246275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8682803588777246275'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/05/how-not-to-run-conference-google-io.html' title='How not to run a conference - Google IO'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://bp3.blogger.com/_szAd7h9ckRM/SD2BxK_E1iI/AAAAAAAACMI/XtABxgDMSRo/s72-c/photo-768212.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-6084166024887776105</id><published>2008-05-21T12:51:00.001-07:00</published><updated>2008-05-21T12:51:41.797-07:00</updated><title type='text'>Microsoft Scans Rendered AJAX Pages</title><content type='html'>&lt;p&gt;Not sure if this is from their search engine but a few days ago I noticed some traffic to our AJAX based common services framework functions.&amp;#160; These functions are case sensitive on the URL so they were triggering error messages in our event log.&amp;#160; The scanner was taking the URL and turning it all to lower case.&amp;#160; The only reason this was noticed was because our robots.txt file was not being delivered due to out recent server move and that is where they picked up scanning our AJAX/JavaScript&lt;/p&gt;  &lt;p&gt;What is cool to note about this is that all our Common Services Framework (CSF) stuff is run within the page via JavaScript and after the page OnLoad() event fires!&amp;#160; &lt;/p&gt;  &lt;p&gt;This is only a guess at best but who knows. The IP Address that the traffic as inbound from was 131.107.151.93 and you can use the &lt;a href="http://ws.arin.net/whois/" target="_blank"&gt;ARIN WHOIS Database Search&lt;/a&gt; to see that Microsoft owns that block so it is still an assumption at best.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/pirklk/SDR9SvNaG2I/AAAAAAAACL4/3BWVk9tU138/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="242" alt="image" src="http://lh4.ggpht.com/pirklk/SDR9TfNaG3I/AAAAAAAACMA/xAxMQUa6jQA/image_thumb.png?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It's quite cool to think though that the entire page render occurs and they can post page load capture the URL's for web indexing.&lt;/p&gt;  &lt;p&gt;Very cool!&lt;/p&gt;  &lt;p&gt;Kevin Pirkl&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-6084166024887776105?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/6084166024887776105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=6084166024887776105' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6084166024887776105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6084166024887776105'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/05/microsoft-scans-rendered-ajax-pages.html' title='Microsoft Scans Rendered AJAX Pages'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://lh4.ggpht.com/pirklk/SDR9TfNaG3I/AAAAAAAACMA/xAxMQUa6jQA/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-8903375156989637110</id><published>2008-05-03T17:13:00.001-07:00</published><updated>2008-05-03T17:13:21.589-07:00</updated><title type='text'>Lexi's Playground!</title><content type='html'>&lt;div&gt;Our Doggy Rules!&lt;/div&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://widgets.clearspring.com/o/46928cc51133af17/481cff9fcb902ebe/46928cc5788deb29/1ebc9d54/widget.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-8903375156989637110?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/8903375156989637110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=8903375156989637110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8903375156989637110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8903375156989637110'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/05/lexi-playground.html' title='Lexi&amp;#39;s Playground!'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-3504350435451727936</id><published>2008-04-17T14:08:00.000-07:00</published><updated>2008-05-12T12:07:31.048-07:00</updated><title type='text'>List of sites/pages modified by our team in a rapid fashion.</title><content type='html'>Here is a list of the pages that our team has modified over the last month and rolled out last Tuesday..&lt;br /&gt;&lt;img id="yn9d" style="FLOAT: right; MARGIN: 1em 0pt 0pt 1em; WIDTH: 327px; HEIGHT: 409px" src="http://docs.google.com/File?id=dc7x9fp2_75c66ntvf2_b" /&gt;&lt;br /&gt;I know I have missed some but here is the quick list..&lt;br /&gt;&lt;br /&gt;&lt;div id="o8xj" style="MARGIN-LEFT: 40px"&gt;&lt;span id="g4fi"  style="font-size:78%;"&gt;&lt;b&gt;Intel(R) Software Network &lt;/b&gt;&lt;/span&gt;&lt;span id="k713"  style="font-size:78%;"&gt;&lt;b&gt;(ISN)&lt;/b&gt;&lt;/span&gt;&lt;span id="jinw"  style="font-size:78%;"&gt;&lt;span id="s7eb"&gt;&lt;b&gt; WebSites List &lt;/b&gt;&lt;/span&gt;&lt;br id="g:ui"&gt;&lt;br id="xf7f"&gt;Old CD Software Products&lt;br id="v-qd"&gt;http://www3.intel.com/cd/software/products/asmo-na/eng/index.htm&lt;br id="r3y6"&gt;&lt;br id="ab00"&gt;Advanced Vector Extensions&lt;br id="qr7a"&gt;http://softwareprojects.intel.com/avx&lt;br id="vo_."&gt;&lt;br id="dyco"&gt;ISN Support&lt;br id="lkn3"&gt;http://softwarecommunity.intel.com/support/&lt;br id="b0_5"&gt;&lt;br id="wg7o"&gt;ISN Communities Landing Pages&lt;br id="gjmg"&gt;http://softwarecommunity.intel.com/communities/manageability&lt;br id="j9ga"&gt;http://softwarecommunity.intel.com/communities/mobility&lt;br id="c1qy"&gt;http://softwarecommunity.intel.com/communities/multicore&lt;br id="og2w"&gt;&lt;br id="sj78"&gt;ISN Communities Home Page A/B Testing &lt;br id="h2rt"&gt;http://softwarecommunity.intel.com/communities/a&lt;br id="a-vu"&gt;http://softwarecommunity.intel.com/communities/&lt;br id="pu-b"&gt;&lt;br id="p:nr"&gt;Open Source&lt;br id="njus"&gt;http://oss.intel.com/en-us/&lt;br id="q8wt"&gt;&lt;br id="d2sl"&gt;Threading Challenge&lt;br id="oaeq"&gt;http://softwarecontests.intel.com/threadingchallenge&lt;br id="hhzp"&gt;&lt;br id="rm1."&gt;Contest Platform&lt;br id="v-j1"&gt;http://softwarecontests.intel.com/contests/&lt;br id="bdgo"&gt;&lt;br id="xloi"&gt;GameDemo&lt;br id="ppgt"&gt;http://softwarecontests.intel.com/gamedemo&lt;br id="j1ps"&gt;&lt;br id="hids"&gt;MulitCore&lt;br id="gore"&gt;http://softwarecommunity.intel.com/communities/multicore&lt;br id="c.od"&gt;&lt;br id="bbi3"&gt;Blogs&lt;br id="fz50"&gt;http://softwareblogs.intel.com&lt;br id="kyyc"&gt;&lt;br id="aap0"&gt;College&lt;br id="njcv"&gt;http://softwarecollege.intel.com&lt;br id="b.m."&gt;&lt;br id="cp:n"&gt;College Redfort&lt;br id="sl9s"&gt;http://isccontent.intel.com/articles/eng/3694.htm&lt;br id="sksn"&gt;&lt;br id="zc9u"&gt;ISN Redfort&lt;br id="hbbp"&gt;http://softwarecommunity.intel.com/articles/eng/3738.htm, http://softwarecommunity.intel.com/articles/eng/1590.htm&lt;br id="b0w6"&gt;&lt;br id="gk-8"&gt;ISN Forums&lt;br id="xyo1"&gt;http://softwarecommunity.intel.com/isn/Community/en-US/forums/default.aspx&lt;br id="j416"&gt;&lt;br id="befp"&gt;SDK Download&lt;br id="r5nx"&gt;http://softwarecommunity.intel.com/isn/ISNSDKDownload/SDKDownload.aspx&lt;br id="tk5c"&gt;&lt;br id="r9:g"&gt;Videos&lt;br id="o3k4"&gt;http://softwarecommunity.intel.com/videos&lt;br id="pvvs"&gt;&lt;br id="ovwo"&gt;Cluster Ready&lt;br id="v:00"&gt;http://softwarecommunity.intel.com/isn/clusterready/clusterready_cluster.aspx&lt;br id="j73y"&gt;http://softwarecommunity.intel.com/isn/clusterready/clusterready_isv.aspx &lt;br id="q7y4"&gt;http://softwarecommunity.intel.com/isn/clusterready/clusterready_oem.aspx &lt;br id="nogq"&gt;&lt;br id="a5f1"&gt;Polls&lt;br id="zf4c"&gt;http://softwarecommunity.intel.com/isn/polls/default.aspx?pid=4&lt;br id="pgzu"&gt;&lt;br id="nns9"&gt;Tags&lt;br id="il5m"&gt;http://softwarecommunity.intel.com/ISNTagWeb/TagList.aspx?tid=33&lt;br id="jdga"&gt;http://softwarecommunity.intel.com/ISNTagWeb/ISNTagCloud.aspx&lt;br id="q4wg"&gt;http://softwarecommunity.intel.com/ISNTagWeb/ISNMyTags.aspx&lt;br id="xwt3"&gt;http://softwarecommunity.intel.com/ISNTagWeb/TagSearchList.aspx?stn=INTEL&lt;br id="zhpr"&gt;&lt;/span&gt;&lt;span id="rk4x"  style="font-size:78%;"&gt;&lt;br id="xaa4"&gt;Wiki&lt;br id="x7t0"&gt;http://softwarecommunity.intel.com/wiki/&lt;/span&gt;&lt;br id="mzoy"&gt;&lt;/div&gt;&lt;br /&gt;There are more, selah&lt;br /&gt;&lt;br /&gt;Here are the main changes.. Hardcore &lt;a id="l.xf" title="jQuery" href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt; driven headers&lt;br /&gt;&lt;img id="ek5g" style="WIDTH: 738px; HEIGHT: 89px" src="http://docs.google.com/File?id=dc7x9fp2_71hrc6h2gg_b" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a id="z5g9" title="Superfish v1.4.1" href="http://users.tpg.com.au/j_birch/plugins/superfish" target="_blank"&gt;&lt;img id="tv8o" style="FLOAT: left; MARGIN: 1em 1em 0pt 0pt; WIDTH: 192px; HEIGHT: 216px" src="http://docs.google.com/File?id=dc7x9fp2_76c3r4jzg4_b" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="z5g9" title="Superfish v1.4.1" href="http://users.tpg.com.au/j_birch/plugins/superfish" target="_blank"&gt;Superfish v1.4.1&lt;/a&gt; (An enhanced Suckerfish-style menu plugin for jQuery.) powers the menus on these sites..&lt;br /&gt;Login and Personalization are driven by jQuery AJAX calls via a shared PHP script that works the same under Windows and Linux.&lt;br /&gt;&lt;br /&gt;When your not logged in your see this.&lt;br /&gt;&lt;img id="tpra" style="WIDTH: 113px; HEIGHT: 93px" src="http://docs.google.com/File?id=dc7x9fp2_72f5n9wxcm_b" /&gt; When you are logged in you see this &lt;img id="rw6v" style="WIDTH: 167px; HEIGHT: 65px" src="http://docs.google.com/File?id=dc7x9fp2_73cnsd94d4_b" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One cool thing about this is that the site is Windows based and Linux based and via a hardware &lt;a id="esq2" title="Layer 7" href="http://en.wikipedia.org/wiki/OSI_model#Layer_7:_Application_layer" target="_blank"&gt;Layer 7&lt;/a&gt; load balancer from &lt;a id="rp3z" title="KEMP Technologies" href="http://www.kemptechnologies.com/" target="_blank"&gt;KEMP Technologies&lt;/a&gt;&lt;br /&gt;&lt;div id="gsw3" style="PADDING-RIGHT: 0pt; PADDING-LEFT: 0pt; PADDING-BOTTOM: 1em; PADDING-TOP: 1em; TEXT-ALIGN: left"&gt;&lt;img id="omxi" style="WIDTH: 216px; HEIGHT: 143px" src="http://docs.google.com/File?id=dc7x9fp2_74g7sqj8gb_b" /&gt;&lt;br id="lfn2"&gt;&lt;br id="fcg6"&gt;This allows us to deliver the same PHP &amp;amp; ASP.Net services to both Windows and Linux allowing use to &lt;a id="r0ir" title="same domain origins" href="http://en.wikipedia.org/wiki/Same_origin_policy" target="_blank"&gt;same domain origins&lt;/a&gt; service sharing. The Linux server delivers content for multiple domain names but share a common code base folders as virtual directories so a single change is automatically delivered everywhere.. The one drawback is that if you mess something up it will impact the entire site.&lt;br id="p00w"&gt;&lt;br id="pnic"&gt;Common navigation and service options are shared into all sites&lt;br id="exvb"&gt;&lt;img id="ug7g" style="WIDTH: 357px; HEIGHT: 112px" src="http://docs.google.com/File?id=dc7x9fp2_77ttgk89fv_b" /&gt;&lt;br id="ao_s"&gt;These icon bars invoke our common service framework which are a mixture of JavaScript, JSON Data Services and AJAX calls to the back end services running under .Net like this Email A Friend feature which is just one of many services offered up.&lt;br id="e:.p"&gt;&lt;img id="jd-j" style="WIDTH: 292px; HEIGHT: 267px" src="http://docs.google.com/File?id=dc7x9fp2_78ktcz43cd_b" /&gt;&lt;br id="vu24"&gt;&lt;/div&gt;There's a ton more I could say and perhaps already have (See: &lt;a id="frnk" title="Anatomy of a web page" target="_blank"&gt;Anatomy of a web page&lt;/a&gt; for more details and links to tools that make up these pages) but not enough time to say it all.&lt;br /&gt;&lt;br /&gt;Most of the time I think I write and document this stuff so I have some kind of a history more for myself that for other persons.&lt;br /&gt;&lt;br /&gt;Hope you find something of use in this.&lt;br /&gt;&lt;br /&gt;Kevin Pirkl&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-3504350435451727936?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/3504350435451727936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=3504350435451727936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3504350435451727936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3504350435451727936'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/04/here-is-list-of-pages-that-our-team-has.html' title='List of sites/pages modified by our team in a rapid fashion.'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-6199891519594820566</id><published>2008-04-16T12:15:00.000-07:00</published><updated>2008-04-24T15:06:46.435-07:00</updated><title type='text'></title><content type='html'>&lt;P id=u6w3&gt; &lt;/P&gt; &lt;P id=cqkv&gt;Proper case is just capitalizing the first character of each proper name in a string.&lt;/P&gt; &lt;P id=l9n2&gt; &lt;/P&gt; &lt;P id=an4u&gt;Change "KEVIN PIRKL" to "Kevin Pirkl"&lt;/P&gt; &lt;P id=smcz&gt; &lt;/P&gt; &lt;P id=dt9k&gt;It was really bugging me seeing code from lots of people that did Proper Case of name.  I would thing that you could use a Regular expression in C# to do it and after some poking around here's the code worked out.&lt;/P&gt; &lt;P id=rwu4&gt; &lt;/P&gt; &lt;P id=eonr&gt;It is not so bad when you get right down to it..&lt;/P&gt; &lt;P id=hyrj&gt; &lt;/P&gt; &lt;P class=MsoNormal id=msil style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=rw8. style=" COLOR: blue; FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;public&lt;/font&gt;&lt;/SPAN&gt; &lt;SPAN id=u6e2 style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;SPAN id=rna4 style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN id=z1a5 style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;font size="2"&gt; GetUserName() &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=p8ri style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=k7kf style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;{ &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=qdd0 style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN id=oeu6 style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;SPAN id=s98q style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;font size="2"&gt; usrname = &amp;quot;&amp;quot;; &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=yla9 style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN id=r:if style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;Intel.Utilities.UserData ud = &lt;/font&gt;&lt;SPAN id=sgk2 style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;font size="2"&gt; Intel.Utilities.UserData(&lt;/font&gt;&lt;SPAN id=pz_8 style="COLOR: blue"&gt;true&lt;/SPAN&gt;&lt;font size="2"&gt;); &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=zo7o style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN id=e3jk style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;SPAN id=v_bw style="COLOR: blue"&gt;if&lt;/SPAN&gt;&lt;font size="2"&gt; ( ud.LoginId != &amp;quot;&amp;quot;) &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=dlr7 style="MARGIN: 0in 0in 0pt"&gt;            &lt;SPAN id=azc: style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;usrname = ud.FirstName + &amp;quot; &amp;quot; + ud.LastName; &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=tqs8 style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN id=uxvn style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt; &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=dce1 style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN id=vvb4 style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;MatchEvaluator myev = &lt;/font&gt;&lt;SPAN id=o_-q style="COLOR: blue"&gt;new&lt;/SPAN&gt;&lt;font size="2"&gt; MatchEvaluator(upperit); &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=ehbo style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN id=s0lq style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;usrname = Regex.Replace(usrname.ToLower(),&amp;quot;(^.?|\s.?)&amp;quot;,myev); &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=bu6_ style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN id=l-7m style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;SPAN id=x:gm style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;font size="2"&gt; usrname; &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=jg78 style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=rekr style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;} &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=q-bt style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=kiyj style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt; &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=so6t style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=rc95 style=" COLOR: blue; FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;private&lt;/font&gt;&lt;/SPAN&gt; &lt;SPAN id=i9-2 style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;SPAN id=fawl style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN id=id4k style="COLOR: blue"&gt;string&lt;/SPAN&gt;&lt;font size="2"&gt; upperit(Match param) &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=slv2 style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=f2e1 style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;{ &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=t9zr style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN id=i.x2 style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;SPAN id=gulr style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;font size="2"&gt; param.Value.ToUpper(); &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=xmys style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=hmg9 style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P id=m_0v&gt; &lt;/P&gt; &lt;P id=tu6_&gt;Here is an example of some code in JavaScript that does the same&lt;/P&gt; &lt;P id=zcr1&gt; &lt;/P&gt; &lt;P id=dzw5&gt;&lt;A id=thxl title="Proper Case JavaScript Function" href="http://www.codeproject.com/KB/scripting/propercase.aspx" target=_blank&gt;Proper Case JavaScript Function&lt;/A&gt; on Code Project &lt;/P&gt; &lt;P id=d.g2&gt; &lt;/P&gt; &lt;P class=MsoNormal id=sxhb style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=wrp7 style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;// proper case function (JScript 5.5+)&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=wqq: style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=geob style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;function toProperCase(s)&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=p:92 style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=bf:y style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;{&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=d53l style="MARGIN: 0in 0in 0pt"&gt;  &lt;SPAN id=yf9o style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;return s.toLowerCase().replace(/^(.)|s(.)/g, &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=bkdq style="MARGIN: 0in 0in 0pt"&gt;          &lt;SPAN id=cmes style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;function($1) { return $1.toUpperCase(); });&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal id=rcgz style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN id=u.-8 style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;}&lt;/SPAN&gt;&lt;/P&gt; &lt;P id=mkqs&gt; &lt;/P&gt; &lt;P id=c9tp&gt;Hope this helps  &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-6199891519594820566?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/6199891519594820566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=6199891519594820566' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6199891519594820566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6199891519594820566'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/04/proper-case-is-just-capitalizing-first.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-4476550807957184422</id><published>2008-04-14T11:13:00.000-07:00</published><updated>2008-04-24T15:06:46.516-07:00</updated><title type='text'></title><content type='html'> &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;FONT SIZE=4&gt;&lt;B&gt;Anatomy of a web page &amp;ndash; ISN Take Five Videos&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://softwarecommunity.intel.com/videos/"&gt;http://softwarecommunity.intel.com/videos/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://softwarecommunity.intel.com/isn/downloads/anatomyofawebpage2.gif"&gt;http://softwarecommunity.intel.com/isn/downloads/anatomyofawebpage2.gif&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;B&gt;Hardware:&lt;/B&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;1 - IIS - Intel Dual Xeon 3.6GHz (Irwindale) core machine 4Gb RAM w/Windows Server 2003 (32bit)  &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;2 - SQL Server 2000 - Same configuration&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;B&gt;Software:&lt;/B&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;1 ASP.Net (C#)  &lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_47cgrhswft_b" NAME="graphics1" ALIGN=BOTTOM WIDTH=58 HEIGHT=21 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;2 TSQL (Stored Procedures)&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;3 RSS.NET (&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://rss-net.sourceforge.net/"&gt;http://rss-net.sourceforge.net/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;) &lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_48dt82bp8s_b" NAME="graphics2" ALIGN=BOTTOM WIDTH=90 HEIGHT=30 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;4 jQuery (&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://jquery.com/"&gt;http://jquery.com/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;) &lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_49ddw6qbg5_b" NAME="graphics3" ALIGN=BOTTOM WIDTH=83 HEIGHT=16 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt; 	dimensions plug in &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://plugins.jquery.com/project/dimensions"&gt;http://plugins.jquery.com/project/dimensions&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;	tool tip plug in &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/"&gt;http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;	jqModal &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://dev.iceburg.net/jquery/jqModal/"&gt;http://dev.iceburg.net/jquery/jqModal/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="text-indent: 0.5in; margin-bottom: 0in"&gt;Greybox Redux (&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://jquery.com/demo/grey/"&gt;http://jquery.com/demo/grey/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;)&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;5 Querystring (&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://adamv.com/dev/javascript/querystring"&gt;http://adamv.com/dev/javascript/querystring&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; Adam Vandenberg)&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;6 formatDate (&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://www.svendtofte.com/code/date_format/"&gt;http://www.svendtofte.com/code/date_format/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; Svend Tofte)&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;7 Unobtrusive Flash Objects (&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://www.bobbyvandersluis.com/ufo/"&gt;http://www.bobbyvandersluis.com/ufo/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;  &lt;SPAN LANG="en"&gt;Bobby van der Sluis)&lt;/SPAN&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;8 My Uploader Java Object (&lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://www.javaatwork.com/java-upload-applet/details.html"&gt;&lt;SPAN LANG="en"&gt;http://www.javaatwork.com/java-upload-applet/details.html&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;) &lt;/SPAN&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;9 Ajax.NET Professional (&lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://www.ajaxpro.info/"&gt;&lt;SPAN LANG="en"&gt;http://www.ajaxpro.info/&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;)&lt;/SPAN&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;10 West-Wind Web Tools (&lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://www.west-wind.com/"&gt;&lt;SPAN LANG="en"&gt;http://www.west-wind.com/&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;) &lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_50ghrhdshh_b" NAME="graphics4" ALIGN=BOTTOM WIDTH=103 HEIGHT=19 BORDER=0&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;11 Blip.Tv Wiki API Tools (&lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://wiki.blip.tv/index.php/Blip.tv_API_2.0"&gt;&lt;SPAN LANG="en"&gt;http://wiki.blip.tv/index.php/Blip.tv_API_2.0&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;)  &lt;/SPAN&gt; &lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_51c58gvcdg_b" NAME="graphics5" ALIGN=BOTTOM WIDTH=52 HEIGHT=17 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;12 Google AJAX Feed API&amp;rsquo;s for reading RSS feeds &lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://code.google.com/apis/ajaxfeeds/"&gt;&lt;SPAN LANG="en"&gt;http://code.google.com/apis/ajaxfeeds/&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;  &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;And more..&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;Where to start&amp;hellip;  I suppose you can visit the web page (&lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://softwarecommunity.intel.com/videos/"&gt;&lt;SPAN LANG="en"&gt;http://softwarecommunity.intel.com/videos/&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;) to see the end result but better to start on the back end to understand the integration.  &lt;/SPAN&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_52ftqrr4cj_b" NAME="graphics6" ALIGN=BOTTOM WIDTH=600 HEIGHT=798 BORDER=0&gt;&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;We chose to write this software in ASP.Net C# and I wanted the entire web page to be able to run site agnostic so there is nothing really in the way of typical ASP.Net code-behind and controls.  Since all the data in the web page is delivered with JSONP style implementation (&lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/"&gt;&lt;SPAN LANG="en"&gt;http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;.)  In my case the data set is small so it is delivered with the page itself as opposed to secondary calls. If the data set gets larger before the whole app gets re-written then I will go to Category based services calls for each subset of data. &lt;/SPAN&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;For the ISN Video Repository (&lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://softwarecommunity.intel.com/videos/"&gt;&lt;SPAN LANG="en"&gt;http://softwarecommunity.intel.com/videos/&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;) we chose to go with blip.tv &lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://www.blip.tv/"&gt;&lt;SPAN LANG="en"&gt;http://www.blip.tv&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt; for our video hosting over YouTube and you can see all our videos at &lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://intel-sw.blip.tv/"&gt;&lt;SPAN LANG="en"&gt;http://intel-sw.blip.tv/&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt; and the community submitted videos at &lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;SPAN LANG="en"&gt;http://isn_user.blip.tv&lt;/SPAN&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;.  Our stakeholders wanted to build a site that contained all of our videos in one single place as to join all the intel communities together.  Blip provides a REST based API (&lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://wiki.blip.tv/index.php/Blip.tv_API_2.0"&gt;&lt;SPAN LANG="en"&gt;http://wiki.blip.tv/index.php/Blip.tv_API_2.0&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;) and RSS feeds that make this all possible.  &lt;/SPAN&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;FONT SIZE=4&gt;&lt;B&gt;Steps involved in writing this web application:&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;B&gt;&lt;SPAN LANG="en"&gt;Back End -  &lt;/SPAN&gt;&lt;/B&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;A&amp;gt; Database to keep a copy of the RSS feed data containing all the details for our videos.&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;First we need a database to synch our information and to be able to add more information.  Microsoft SQL Server 2000 fueled by a BlipTv RSS feed &lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://intel-sw.blip.tv/?skin=rss&amp;amp;file_type=flv&amp;amp;page=1"&gt;&lt;SPAN LANG="en"&gt;http://intel-sw.blip.tv/?skin=rss&amp;amp;file_type=flv&amp;amp;page=1&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt; and page=2 etc. (see a pattern forming here.)  &lt;/SPAN&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;Using RSS.Net from SourceForge &lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://rss-net.sourceforge.net/"&gt;http://rss-net.sourceforge.net/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; provided us a nice easy way to get our RSS Feed data from BlipTv and only a few modifications to the code were required to make it internally for testing (proxy support required.)&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;B&amp;gt; Using a ASP.Net spawned thread timer to retrieve the data.&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;We wanted to make this happen on an automatic basis and therein lies some choices.  1&amp;gt; Create a batch timer script set to run on a interval.  2&amp;gt; Or spawn an ASP.Net timer thread within the web administration tool (where we are going to have the process monitoring anyway.)  Batch process&amp;rsquo;s still require monitoring tools and debugging smarts so we chose the second option as the code is kept within the admin tool and this the monitors is in the same place.  &lt;/SPAN&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_53gqw5qkdh_b" NAME="graphics7" ALIGN=BOTTOM WIDTH=600 HEIGHT=240 BORDER=0&gt;&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_54cr3k5xc9_b" NAME="graphics8" ALIGN=BOTTOM WIDTH=456 HEIGHT=84 BORDER=0&gt;&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_55c2n2bwgx_b" NAME="graphics9" ALIGN=BOTTOM WIDTH=600 HEIGHT=18 BORDER=0&gt;&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;I have a video up on the community site that shows off the &amp;ldquo;How To: ASP.Net Batch Processing via Thread Timer&amp;rdquo; &lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://softwarecommunity.intel.com/videos/home.aspx?fn=100040&amp;amp;Category=Community"&gt;&lt;SPAN LANG="en"&gt;http://softwarecommunity.intel.com/videos/home.aspx?fn=100040&amp;amp;Category=Community&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;Considering how many times Blip has updated the RSS feeds, renaming variables, breaking this process I am glad I went with a spawned process thread under ASP.Net  as it was much easier to manage and see errors from within the admin tool (if there are any that need to be addressed.)&lt;/SPAN&gt;&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;So we spawn a timer thread to process all the pages in the RSS feed and then synch data to SQL.  We never delete anything (anymore) as there have been times that Blip&amp;rsquo;s RSS feed has broke and deleted all our videos.  When the RSS feed came back the code recreated all the links with new ID&amp;rsquo;s which made a good mess off things.  We update for changes like description, tags, title, thumbnails, etc..)  &lt;/SPAN&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;Note: Blip recently changed the RSS to include a new smaller thumbnail and it appears that they made the older thumbnail into a much bigger image size (not 100% sure about the sizing change though.)  &lt;/SPAN&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;Note: They made some more fixes to video thumbnail sized and clarity fixing some very low resolution problems that were there for almost a month.  Still small thumbnails but much better looking.&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;The admin back-end allows us to add some additional meta data to each video like an extra RSS Feed link to an ISN Communities or Author/Celebrity Feed related to the Video.  &lt;/SPAN&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;B&gt;&lt;SPAN LANG="en"&gt;Front End -  Above&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;From top to bottom (skipping some elements as the are composite of others):&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;CSS header graphic region with a simple jQuery click event to open the ISN Home Page &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://softwarecommunity.intel.com/isn/home/default.aspx"&gt;http://softwarecommunity.intel.com/isn/home/default.aspx&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;jQuery &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://jquery.com/"&gt;http://jquery.com/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; JavaScript library makes up a ton of the pages code as our group is in love with the simplicity end elegance that it imparts to web page client side code development.  jQuery is lightweight and cross browser compliant and easy to get started with.  The community support for jQuery add ins &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://plugins.jquery.com/"&gt;http://plugins.jquery.com/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;  and UI &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://ui.jquery.com/"&gt;http://ui.jquery.com/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; are awesome!&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;JSON DATA in Page &amp;ndash; BlipTv provides a JavaScript API that allows you to add a dynamic script tags to the web page which allows you to get back data and in a single JavaScript method called blip_ws_results(JSON_Data_Structure) and here is an example call that retrieves that data &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://blip.tv/file/148720?skin=json&amp;amp;file_type=mp3,m4a,mov,mpg,mp4,m4v,avi"&gt;http://blip.tv/file/148720?skin=json&amp;amp;file_type=mp3,m4a,mov,mpg,mp4,m4v,avi&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;. This JSON Data structure contains everything you would want to know about the video for client side display (height, width, duration, media source, thumbnails, categories, timestamps etc.)  Dynamic script tags (JSONP &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/"&gt;http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; are easy to do in many JS libraries  and manually &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://ajaxpatterns.org/On-Demand_Javascript"&gt;http://ajaxpatterns.org/On-Demand_Javascript&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;. &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;The TV set like theme of the player window is accomplished in a typical fashion of CSS repeating graphics and rounded images in boxes in the corners.  I typically hate Photoshop mockups as they put a huge pain in the azz burden on the developers and this was no exception.  Page mockups with rounded borders are just frell &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://www.urbandictionary.com/define.php?term=frell"&gt;http://www.urbandictionary.com/define.php?term=frell&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;. &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_56gm7g6jfr_b" NAME="graphics10" ALIGN=BOTTOM WIDTH=105 HEIGHT=104 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;SPAN LANG="en"&gt;The video player  is managed via &lt;/SPAN&gt;Unobtrusive Flash Objects or UFO for short and works quite well and provides nice progressive FLV format rendering.  BlipTv does the translation from MOV,WMV etc uploaded formats so that save use the trouble of file hosting and pseudo streaming of files.&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Larger View button uses GreyBox Redux &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://jquery.com/demo/grey/"&gt;http://jquery.com/demo/grey/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; to provide a popup window in a window.   &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;We have a concept called &amp;ldquo;video series&amp;rdquo; as well where they can setup a series of videos.  Series added it&amp;rsquo;s own complications for sorting and page display and I had to re-conceptualize it more than once to get all the end user page features working correctly but all in all I think it looks good.&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_57fpw263g7_b" NAME="graphics11" ALIGN=BOTTOM WIDTH=163 HEIGHT=49 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Direct download links, embedding code are straightforward generations  &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_58g85wfmdp_b" NAME="graphics12" ALIGN=BOTTOM WIDTH=242 HEIGHT=108 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Common Services &amp;ndash; All bundled into JavaScript files and an .ASHX backend calling mechanism&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Common options to most ISN pages are things like  Email a friend, Support feedback, Page Comments, Rating (thumbs up or down)&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Found typically around the Right hand channel page and feed options&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_59fcd8tsff_b" NAME="graphics13" ALIGN=BOTTOM WIDTH=195 HEIGHT=74 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Email a friend popup&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_60hndz92t5_b" NAME="graphics14" ALIGN=BOTTOM WIDTH=135 HEIGHT=124 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;ISN Support popup&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_61fm696vfb_b" NAME="graphics15" ALIGN=BOTTOM WIDTH=134 HEIGHT=70 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Commenting  &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_62ct2dr6gw_b" NAME="graphics16" ALIGN=BOTTOM WIDTH=312 HEIGHT=210 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;AJAX provides us post ability for the submitted comments and a character counter of encoded characters to be posted.  Akismet and Arne Brachhold provided the .Net API&amp;rsquo;s for anti-spam prevention &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://www.arnebrachhold.de/2006/04/18/akismet-anti-spam-library-for-the-dotnet-framework/"&gt;http://www.arnebrachhold.de/2006/04/18/akismet-anti-spam-library-for-the-dotnet-framework/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_63hkfxztcq_b" NAME="graphics17" ALIGN=BOTTOM WIDTH=241 HEIGHT=216 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Voting on favorite videos &amp;ndash; Notice CAPTCHA popup to help prevent spam voting.&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_64hgb9xhcr_b" NAME="graphics18" ALIGN=BOTTOM WIDTH=132 HEIGHT=170 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;The VIDEO CATEGORIES toolbar and QueryString JavaScript &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://adamv.com/dev/javascript/querystring"&gt;http://adamv.com/dev/javascript/querystring&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; provide dynamic linking to categories with some simple URL parsing.  By adding on ? Category=Community onto the end of the main page display it will auto-navigate the interface to bring these items to the main page display and shifts the toolbar.  I had some issues with the timing of events when displaing categories that were off screen so I close this in a short delay timer in JS code&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_65frr727fd_b" NAME="graphics19" ALIGN=BOTTOM WIDTH=224 HEIGHT=43 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;if (catg == &amp;quot;Virtualization&amp;quot; || catg == &amp;quot;CommunityUploads&amp;quot;)  &lt;/P&gt; &lt;P CLASS="western" STYLE="text-indent: 0.5in; margin-bottom: 0in"&gt;setTimeout( function(){ $(&amp;quot;#vcatRight&amp;quot;).click(); }, 500);&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Mouse over video images and Videos Series hypertext links pops up the entire video description via the jQuery tool tip plug in &lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/"&gt;http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt; and makes for a nice effect.&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_66k6svd5fz_b" NAME="graphics20" ALIGN=BOTTOM WIDTH=217 HEIGHT=140 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Sharing on the Right hand navigation seems to never get used so I am not going to talk about it here except to say that we gave the ability to upload community videos with a nice progress indicator upload Java Applet - &lt;SPAN LANG="en"&gt;My Uploader Java Object (&lt;/SPAN&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;U&gt;&lt;A HREF="http://www.javaatwork.com/java-upload-applet/details.html"&gt;&lt;SPAN LANG="en"&gt;http://www.javaatwork.com/java-upload-applet/details.html&lt;/SPAN&gt;&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;SPAN LANG="en"&gt;) but again there has only been about one or two community submissions.&lt;/SPAN&gt;&lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P LANG="en" CLASS="western" STYLE="margin-bottom: 0in"&gt;Last feature I would talk about if the search&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_67dwz3bwhr_b" NAME="graphics21" ALIGN=BOTTOM WIDTH=224 HEIGHT=73 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Which works quite cool in that it goes through the entire data set and filters the display to only show the search for keywords.  There was not enough time to write the search to be AND/OR capable so it just parses for single keyword and updates the display.&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;PROS:   &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Good experience and brings into play quite a few API&amp;rsquo;s and conceptual technologies  &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;CONS:  What I would do different If we do this app again.&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;I would toss all PhotoShop look and feel as it is entirely unnecessary marketing bloat and does not pertain to developers/technologists who have a different mindset.&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&amp;quot;Entirely AJAX&amp;quot; stinks for Google search crawlers and makes an big loss.  You need to have URL&amp;rsquo;s to crawl or an alternate method for Google to follow to pull all the links.&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Page is very large - Small fast page size would be much better end user experience as opposed to the bloated one that it is right now.&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;Provide easier cross linking of ISN Communities and Forums for a better social experience.  Blogs are linked in but not always obvious and our Forums are not linked on these pages&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;IMG SRC="http://docs.google.com/File?id=dc7x9fp2_68dfv583gx_b" NAME="graphics22" ALIGN=BOTTOM WIDTH=377 HEIGHT=118 BORDER=0&gt;&lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;BR&gt; &lt;/P&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-4476550807957184422?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/4476550807957184422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=4476550807957184422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/4476550807957184422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/4476550807957184422'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/04/anatomy-of-web-page-isn-take-five.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-2003213471463325754</id><published>2008-04-08T14:24:00.000-07:00</published><updated>2008-04-24T15:06:46.558-07:00</updated><title type='text'></title><content type='html'>&lt;br id="x238"&gt;I took these notes from the six videos found on the &lt;a title="Google App Engine" target="_blank" href="http://code.google.com/appengine/" id="qu8u"&gt;Google App Engine&lt;/a&gt; (GAE) page.  I hope this quick coverage helps explain what GAE is all about though I am waiting on account approval to begin using the live site tools.&lt;br id="a68l"&gt;&lt;br id="h8as"&gt;I will be playing around with local dev work in the meantime.&lt;br id="x2p2"&gt;&lt;br id="whf7"&gt;In short GAE is about building your own web pages to run on Google's provided infrastructure.  To my understanding this infrastructure includes things like access to Google's account management for logged in user detection, sending emails, Google BigTable database access for creating your own db storage based on GAE's base &lt;a title="Types and Property Classes" target="_blank" href="http://code.google.com/appengine/docs/datastore/typesandpropertyclasses.html" id="yi:."&gt;Types and Property Classes&lt;/a&gt;.&lt;br id="v6:s"&gt;&lt;br id="dsga"&gt;GAE provides access to Google Scalable Infrastructure and enables web application development by leveraging core Google architecture elements.  Here are some of those key pieces&lt;br id="q.2f"&gt;&lt;br id="myaf"&gt;Google Accounts for authentication&lt;br id="n9eg"&gt;&lt;a title="BigTable" target="_blank" href="http://en.wikipedia.org/wiki/BigTable" id="ps4_"&gt;BigTable&lt;/a&gt; for database work&lt;br id="dpaz"&gt;&lt;a title="Google File System" target="_blank" href="http://en.wikipedia.org/wiki/Google_File_System" id="vvfj"&gt;Google File System&lt;/a&gt; (GFS)&lt;br id="woa9"&gt;&lt;br id="xqw1"&gt;These same building blocks are interfaced into the GAE.&lt;br id="gvwb"&gt;&lt;br id="um6n"&gt;The stack as they called it in the video are the key components in GAE ----&lt;br id="s8xe"&gt;&lt;br id="ksjw"&gt;1&amp;gt; Google's Scalable Serving Infrastructure&lt;br id="s9ei"&gt;2&amp;gt; Python Runtime (first language supporting GAE App engine)&lt;br id="i-dc"&gt;3&amp;gt; Software Development Kit (code and test locally)&lt;br id="c9r4"&gt;4&amp;gt; Web based Admin Console (ties everything together)&lt;br id="fnzx"&gt;5&amp;gt; Datastore (scalable persistence layer based on BigTable)&lt;br id="a5ta"&gt;&lt;br id="owtw"&gt;It appears that the SDK installer will support Linux, Mac and Windows and will stick the Python runtime environment on your dev machine and a web server and datastore that will work locally just like it would for an application running on a Google App server.&lt;br id="lm03"&gt;&lt;br id="bztc"&gt;The demo shows building a first app in which they fired up a terminal running the local hosting environment to run the app. First they created a &lt;a title="YAML" target="_blank" href="http://en.wikipedia.org/wiki/YAML" id="e.2m"&gt;YAML&lt;/a&gt; application configuration file (app.yaml) and then some Python code using semi-broke-down version of the &lt;a title="Python 2.5 runtime environment" target="_blank" href="http://code.google.com/appengine/docs/python/purepython.html" id="r7f7"&gt;Python 2.5 runtime environment&lt;/a&gt; &lt;br id="iqr:"&gt;&lt;br id="hqn2"&gt;Deploy your app using appconfig to Googles Servers was as simple as running the following like of code in the terminal window (the hi-res video was not very good to see what they actually typed though)&lt;br id="y.2f"&gt;&lt;br id="xpzv"&gt;appcfg.py update [project directory] &lt;br id="zv4y"&gt;    but I found a more explicit reference for &lt;a title="Uploading an App" target="_blank" href="http://code.google.com/appengine/docs/appcfgpy.html" id="a_b4"&gt;Uploading an App&lt;/a&gt; &lt;br id="ygxp"&gt;&lt;br id="kxkp"&gt;Deep Dive notes...&lt;br id="zdn5"&gt;&lt;br id="x1m7"&gt;1&amp;gt; Scalable Serving Infrastructure&lt;br id="wqop"&gt; Fault Tolerant (scale and moves load around in response to end user demand)&lt;br id="qw1u"&gt;&lt;br id="qnr6"&gt;2&amp;gt; &lt;a title="Python Runtime" target="_blank" href="http://code.google.com/appengine/docs/python/" id="o6so"&gt;Python Runtime&lt;/a&gt; (first language supporting app engine)&lt;br id="zt99"&gt; Modular set of API's used by the Language (any other language can use as well)&lt;br id="bwr3"&gt;&lt;br id="sg-y"&gt;3&amp;gt; Software Development Kit (code and test locally)&lt;br id="afr:"&gt; Release for Linux, Mac and Windows (Python Interperter)&lt;br id="bo1q"&gt; Code, Compile, Test Locally before you deploy&lt;br id="ez59"&gt;&lt;br id="y-_m"&gt;4&amp;gt; Web based Admin Console (ties everything together)&lt;br id="ci99"&gt; In the videos they called it "A simpler alternative to the &lt;a title="LAMP" target="_blank" href="http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29" id="wxac"&gt;LAMP&lt;/a&gt; stack." although I personally don't find learning a new language like Python to be simple (being an old fart set in my ways.)&lt;br id="zlbk"&gt; This tool provides&lt;br id="e:yy"&gt;    Look at the status of an application&lt;br id="u.7y"&gt;    Set who can control the application&lt;br id="fuy1"&gt;    Set who can upload new versions&lt;br id="hsrr"&gt;    Which version of the app gets most of the traffic&lt;br id="ls4g"&gt;    Provides additional tools like &lt;br id="zhks"&gt;        Request Logs&lt;br id="zlrk"&gt;        Application Logs&lt;br id="q5yt"&gt;        Data Explorer (SQL Admin Like Tool)&lt;br id="cn41"&gt;            Check, Modify data, schema etc&lt;br id="s38y"&gt;    Ability to hook a Domain into your app&lt;br id="xste"&gt;    Near Realtime stats on you application/site usage&lt;br id="ptj6"&gt; &lt;br id="ml00"&gt;5&amp;gt; Datastore (scalable persistance layer based on BigTable)&lt;br id="v6qy"&gt;    Scheme-less object store that supports millions of entities&lt;br id="r1bf"&gt;    Uses BigTable for store (can and will move data around as load changes)&lt;br id="l:fd"&gt;    Model Class for db types is what is used to expose data.  This suckers are used to hold base &lt;a title="datastore" target="_blank" href="http://code.google.com/appengine/docs/datastore/typesandpropertyclasses.html" id="z1bv"&gt;datastore&lt;/a&gt; types and other GData Types.  For instance there are string and bool types but there are more complex types like &lt;a title="Rating" target="_blank" href="http://code.google.com/apis/gdata/common-elements.html#gdRating" id="v9du"&gt;Rating&lt;/a&gt; which are based on the the types foun in the GData API reference for that type&lt;br id="qcqj"&gt;        &lt;a title="Datastore API" target="_blank" href="http://code.google.com/appengine/docs/datastore/" id="r21z"&gt;Datastore API&lt;/a&gt; &lt;br id="ohwk"&gt;        &lt;a title="GQL" target="_blank" href="http://code.google.com/appengine/docs/datastore/gqlreference.html" id="gjhn"&gt;GQL&lt;/a&gt; Language is the SQL like syntax that is used for retrieving and storing data. - &lt;br id="mk:t"&gt;    Queries are allowed on a single property or multiple ones.&lt;br id="e1k7"&gt;    There is a &lt;a title="Bulk Uploader" target="_blank" href="http://code.google.com/appengine/articles/bulkload.html" id="n5t3"&gt;Bulk Uploader&lt;/a&gt; tool&lt;br id="q695"&gt;    Transactions&lt;br id="glpn"&gt;    Doesnt support JOINS!  (Since DB is distributed and scalable it overrides the need for JOINS)&lt;br id="s_8b"&gt;    &lt;a title="Blob type support example" target="_blank" href="http://code.google.com/appengine/articles/images.html" id="nu1e"&gt;Blob type support example&lt;/a&gt;   (dont surpass your &lt;a title="Limits/Quotas" target="_blank" href="http://code.google.com/appengine/articles/quotas.html" id="o5ec"&gt;Limits/Quotas&lt;/a&gt; in bandwidth or storage)&lt;br id="aul7"&gt;    &lt;br id="xw9s"&gt;Send Email APIs'&lt;br id="o3xv"&gt;Make HTTP Requests - OutGoing (&lt;a title="URLFetch API" target="_blank" href="http://code.google.com/appengine/docs/urlfetch/" id="y1fp"&gt;URLFetch API&lt;/a&gt;,Call Pages,Services)&lt;br id="kghi"&gt;Authenticate with Google Accounts in the &lt;a title="Users API" target="_blank" href="http://code.google.com/appengine/docs/users/overview.html" id="mb9d"&gt;Users API&lt;/a&gt; &lt;br id="cxdx"&gt;Frameworks (Django - part of the SDK but you can add your own other frameworks)&lt;br id="jngt"&gt;&lt;br id="opi1"&gt;Things removed from the standard library (from the main Python Language I think to support the Google architecture)&lt;br id="ye.z"&gt;    1&amp;gt; Cant write to the file system&lt;br id="hzmh"&gt;    2&amp;gt; Cant open sockets and must use URLFetch API,MailSend API&lt;br id="p8jr"&gt;    3&amp;gt; Threads disabled are not allowed because the app is distributed (and I can think of some code in this arena that could bring a server to it's knees.)&lt;br id="o:dl"&gt;&lt;br id="wi7."&gt;Python is not the only language for GAE.  The GAE infrastructure is language neutral and any language runtime that can be hardened can be ported to this architecture.&lt;br id="jsap"&gt; &lt;br id="b-xc"&gt;All in all I'm a bit excited about getting approved for the program but I did not apply till this morning and likely all 10k accounts are already taken unless they are rolling out registered users in a slower fashion.&lt;br id="sjbo"&gt;&lt;br id="nfnx"&gt;I have some simple ideas that would be nice to put out there.  Some involve my own work with HTML content parts and other commons services framework elements that I would like to see written are reusable services.&lt;br id="mj10"&gt;&lt;br id="c.kr"&gt;Well I hope this level of detail help for a quick overview..  I know just writing it all down cleared up a lot for me.&lt;br id="s6:2"&gt;&lt;br id="g2mi"&gt;Kevin Pirkl&lt;br id="vrz6"&gt;&lt;br id="ljdy"&gt;&lt;br id="h0s2"&gt;&lt;br id="uzmh"&gt;&lt;br id="jsps"&gt;&lt;br id="wj3y"&gt;&lt;br id="up6q"&gt;&lt;br id="dolk"&gt;&lt;br id="bzbg"&gt;&lt;br id="y7cj"&gt;&lt;br id="ukr."&gt;&lt;br id="td3-"&gt;&lt;br id="yiyz"&gt;&lt;br id="o.bi"&gt;&lt;br id="vu1l"&gt;&lt;br id="nf0y"&gt;&lt;br id="yxav"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-2003213471463325754?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/2003213471463325754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=2003213471463325754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2003213471463325754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2003213471463325754'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/04/i-took-these-notes-from-six-videos.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-3966266530456426096</id><published>2008-04-03T11:04:00.000-07:00</published><updated>2008-04-24T15:06:46.605-07:00</updated><title type='text'></title><content type='html'>I'm working on the new Intel INS Header looks and feel which is going to be this look which can be seen today on &lt;a title="Intel Advanced Vector Extensions" target="_blank" href="http://softwareprojects.intel.com/avx/" id="cst8"&gt;Intel Advanced Vector Extensions&lt;/a&gt; versus the old look that will be there for another week or so found on the &lt;a title="Intel Software Network" target="_blank" href="http://softwarecommunity.intel.com/" id="cnxh"&gt;Intel Software Network&lt;/a&gt; home pages..  They byatch and complain about such little crap sometimes...&lt;br id="l8xz"&gt;&lt;br id="da5o"&gt;Here is the old look&lt;br id="pzg0"&gt;&lt;img id="kyso" style="width: 340px; height: 628px;" src="http://docs.google.com/File?id=dc7x9fp2_43ggxn43dz"&gt;&lt;br id="ne72"&gt;&lt;br id="cd0p"&gt;Here is the new look from the I&lt;a title="SN Take Five Videos" target="_blank" href="http://softwarecommunity.intel.com/videos/home.aspx" id="q8rn"&gt;SN Take Five Videos&lt;/a&gt; page that I am working on right now (changes not in production for another week.)&lt;br id="v3rm"&gt;&lt;img id="e64b" style="width: 291px; height: 106px;" src="http://docs.google.com/File?id=dc7x9fp2_41hs69jwgz"&gt;&lt;br id="xl_u"&gt;&lt;br id="rzl4"&gt;But my team lead wants me to do this which IMHO is ruddy looking and not clean (see the overhang.)  Hell I dont really see a frigging difference with a little bit of nonessential header graphic clipping..&lt;br id="zqlu"&gt;&lt;img id="rh56" style="width: 325px; height: 717px;" src="http://docs.google.com/File?id=dc7x9fp2_42gnfd39fw"&gt;&lt;br id="jpd7"&gt;&lt;br id="hzg5"&gt;I am going to keep saying the most under used developer term "No"...  Yes if you try you can say it too...  Developers unite in telling your project owners no at least once a day...&lt;br id="y-51"&gt;&lt;br id="uh02"&gt;Muhahahahahaa&lt;br id="rp5a"&gt;&lt;br id="jyms"&gt;Kevin Pirkl&lt;br id="d0cb"&gt;            &lt;br id="eirw"&gt;&lt;br id="dkfs"&gt;&lt;br id="u27o"&gt;&lt;br id="dq:l"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-3966266530456426096?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/3966266530456426096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=3966266530456426096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3966266530456426096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3966266530456426096'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/04/im-working-on-new-intel-ins-header.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-9094400870077871122</id><published>2008-03-11T15:58:00.000-07:00</published><updated>2008-03-11T16:12:21.925-07:00</updated><title type='text'>Spinning SOA onto Google Languge Translator</title><content type='html'>&lt;a style="font-weight: bold; color: rgb(0, 0, 0);" href="http://snurl.com/21jdf"&gt;&lt;span goog_docs_charindex="2"  style="font-size:100%;"&gt;&lt;b goog_docs_charindex="3"&gt;Spinning SOA  onto Google Languge Translator&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Turning &lt;/a&gt;&lt;a id="hasf" title="Google Language Translator" target="_blank" goog_docs_charindex="59" href="http://translate.google.com/translate_t"&gt; Google Language Translator&lt;/a&gt; (GLT) into a consumable service was a hobby  project of mine from 2006.  I noticed that it had stopped working so I decided  to fix it and at the same time put together some documentation on the cruddy  code.  Knowing what I do today I would more than likely want to re-write the  code base but for the moment will leave it as is for this documentation.&lt;br /&gt;&lt;br /&gt;Here is a screen capture of the end results for the running samples.&lt;br /&gt;&lt;br /&gt;&lt;span goog_docs_charindex="509" style="color: rgb(102, 102, 102);"&gt;&lt;b goog_docs_charindex="510"&gt; Running Samples&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;img style="width: 467px; height: 161px;" src="http://docs.google.com/File?id=dc7x9fp2_28djk2cbfb" goog_docs_charindex="530" /&gt;   &lt;div id="yohx" style="padding: 1em 0pt; text-align: left; margin-top: 0px; margin-bottom: 0px;" goog_docs_charindex="533"&gt;  &lt;img style="width: 411px; height: 102px;" src="http://docs.google.com/File?id=dc7x9fp2_29dwszkf4b" goog_docs_charindex="534" /&gt;  &lt;/div&gt; &lt;div id="zpdl" style="padding: 1em 0pt; text-align: left; margin-top: 0px; margin-bottom: 0px;" goog_docs_charindex="537"&gt;  &lt;img style="width: 295px; height: 229px;" src="http://docs.google.com/File?id=dc7x9fp2_30f2dkkvcg" goog_docs_charindex="538" /&gt;&lt;img style="width: 291px; height: 228px;" src="http://docs.google.com/File?id=dc7x9fp2_31gd5nh2dv" goog_docs_charindex="539" /&gt;  &lt;/div&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;For the rest of this article see my Google Docs at "&lt;a href="http://snurl.com/21jdf"&gt;Spinning SOA onto Google Languge Translator&lt;/a&gt;"&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-9094400870077871122?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://snurl.com/21jdf' title='Spinning SOA onto Google Languge Translator'/><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/9094400870077871122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=9094400870077871122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/9094400870077871122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/9094400870077871122'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/03/spinning-soa-onto-google-languge.html' title='Spinning SOA onto Google Languge Translator'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-6563156350179294264</id><published>2008-03-07T11:34:00.000-08:00</published><updated>2008-04-24T15:06:46.692-07:00</updated><title type='text'></title><content type='html'>&lt;br&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Note: Since I work for Intel I wont "even in my personal life" divulge any personally identifiable information (PII) of an employee or consumer so the details below while going on are altered for examples sake only so you can see what I woke up to this morning.  Plus IP address lookups is not an exacting science by any means where the web and Internet are concerned.&lt;/span&gt;&lt;br&gt;&lt;br&gt;It seems that this morning I noticed quite a few errors in our web sites event logs (fed to me via RSS) so I peeked at a few and noticed some alerts that a person is attempting to use one of our services in a way it is not intended.  Pretty funny that people are now even working on trying to hack AJAX based applications add-ons.&lt;br&gt;&lt;a id="le.s" href="File?id=dc7x9fp2_21cwppb9f6" target="_blank"&gt;&lt;img style="margin: 1em 1em 0pt 0pt; width: 225px; height: 90px; float: left;" src="http://docs.google.com/File?id=dc7x9fp2_21cwppb9f6"&gt;&lt;/a&gt;&lt;br&gt;When I woke up this morning I opened up Firefox and all my usual tabs which include Google Reader where I have lots of subscriptions set up.  One I like to monitor is a pointer to the event log on our Web Server.  For this I have taken a copy of the &lt;a title="Event Log RSS Feed Generator" target="_blank" href="http://www.codeproject.com/KB/aspnet/EventLogRss.aspx" id="b2b0"&gt;Event Log RSS Feed Generator&lt;/a&gt; found on &lt;a title="CodeProject.com" target="_blank" href="http://www.codeproject.com" id="effp"&gt;CodeProject.com&lt;/a&gt; and added it on our server for easy consumption of Application errors which all of our application write to the log.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;With all of Intel Software Network Windows Web based offerings I like to log all error's in one place so I can fix these later and in the case of what is going on today I see that some user is attempting to try and use our "Email a Friend" feature to try and send spam out to users.  They have made more than 40+ crafted attempts so far which is getting quite annoying to have to flit through and we have reports on the administrator side as well so there is no chance we would not catch this person if the emails started being sent so no issue there..&lt;br&gt;&lt;br&gt;Our "Email a Friend" feature is part of our "Common Services Framework" which are shared over our entire &lt;a title="Intel Software Community" target="_blank" href="http://softwarecommunity.intel.com/isn/home/default.aspx" id="p1hx"&gt;Intel Software Community&lt;/a&gt; website and this piece is a bit of JavaScript code using &lt;a title="jQuery" target="_blank" href="http://jquery.com/" id="b3.0"&gt;jQuery&lt;/a&gt; tools/plug-ins from that very open community which I so love. This feature can be found here as well for examples sake on the &lt;a title="Intel® Software Network" target="_blank" href="http://softwarecommunity.intel.com/isn/home/default.aspx" id="af4v"&gt;Intel® Software Network&lt;/a&gt; home page.&lt;br&gt;&lt;img style="width: 596px; height: 344px;" src="http://docs.google.com/File?id=dc7x9fp2_23gfds7dhc"&gt;I wont open up and say what restriction they are hitting up against as I don't want to get into IP address banning as well but suffice it to say they are not doing well and getting past the simple security I put in place.  Below is a partial bit of the errors I am putting into the event log.  Nothing special here and as this person has made so many attempts to try and tier off our own internal email tool I don't feel so bad sharing it.  &lt;br&gt;&lt;br&gt;The following details are fictionalized as the IP address below was just made up for examples sake and to show off the code.  In no way does it represent any real persons known details and is for illustration purposes only.  Here is a snippet of the error details&lt;br&gt;&lt;br&gt;&lt;div style="margin-left: 40px;"&gt;&lt;font size="1"&gt;&lt;span style="font-family: Courier New;"&gt;You can use http://api.hostip.info/?ip=140.168.69.129&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font size="1"&gt;&lt;span style="font-family: Courier New;"&gt;Source: Home&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;"&gt;&lt;font size="1"&gt;&lt;span style="font-family: Courier New;"&gt;Type: System.Exception&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;"&gt;&lt;font size="1"&gt;&lt;span style="font-family: Courier New;"&gt;Message: Hacker Detection ----- Poster Details in this JSON object ----&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;"&gt;&lt;font size="1"&gt;&lt;span style="font-family: Courier New;"&gt; [if ( typeof(getIPDetailsCallback) == 'undefined') var ipAddressDetails={"__type":"Home.IPLookupResults, Home, Version=1.0.2901.17376, Culture=neutral, PublicKeyToken=null","ipAddress":"140.168.69.129","name":"Sydney","countryName":"AUSTRALIA","countryAbbrev":"AU","coordinates":"151,-34"}; else getIPDetailsCallback({"__type":"Home.IPLookupResults, Home, Version=1.0.2901.17376, Culture=neutral, PublicKeyToken=null","ipAddress":"140.168.69.129","name":"Sydney","countryName":"AUSTRALIA","countryAbbrev":"AU","coordinates":"151,-34"});] attempted to send email through our website.. You can use http://api.hostip.info/?ip=140.168.69.129 to check that IP addrress if need be..&lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;"&gt;&lt;font size="1"&gt;&lt;span style="font-family: Courier New;"&gt;Stack Trace: &lt;/span&gt;&lt;/font&gt;&lt;br style="font-family: Courier New;"&gt;&lt;font size="1"&gt;&lt;span style="font-family: Courier New;"&gt;   at Home.CommonServices.ProcessEAF(String eafmessage, String eafsubject, String eafurl, String eafemail, String eafrecipentemail)'&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;Notice that I pull the user IP address of the user and give that in the error message with easy linking to user details.  Yes, I suppose from this we could track down this uers local constabulary as ask them to make a visit or something like that but no real point in doing that as it's an endless chain of politics.  Make it a point to visit &lt;a title="hostip.info" target="_blank" href="http://www.hostip.info/index.html" id="hrf:"&gt;hostip.info&lt;/a&gt; home page try your own IP address and see if it close on the map they present.  Hostip's map feature is quite neat but I notice that &lt;a title="GeoBytes" target="_blank" href="http://www.geobytes.com/IpLocator.htm?GetLocation" id="ktof"&gt;GeoBytes&lt;/a&gt; give perhaps better details.&lt;br&gt;&lt;br&gt;&lt;img style="width: 317px; height: 382px;" src="http://docs.google.com/File?id=dc7x9fp2_22fpnpsvf7"&gt;&lt;br&gt;&lt;br&gt;GeoBytes gives the following details but I dont see a pluggable API to use.  Here is the GeoBytes lookup on this sample IP address above which gives an even more detailed and perhaps exacting lookup details.&lt;br&gt;&lt;div id="p2mm" style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 486px; height: 356px;" src="http://docs.google.com/File?id=dc7x9fp2_24pz4p4qcp"&gt;&lt;/div&gt;&lt;br&gt;Note that they accuracy of these details are always in question.  I proffer the correct sequence for  Getting a Users IP address below but it can be far from accurate for many reasons.  Our own internal proxy has users thinking that I am in Santa Clara when in fact I am in Portland.&lt;br&gt;&lt;br&gt;Here is some code that does the work of putting these details together.&lt;br&gt;&lt;br&gt;If your into C# here is the code that pulls the details for the users IP and from that the Geo data for this user.&lt;br&gt;&lt;br&gt;&lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;font size="2"&gt;public&lt;/font&gt;&lt;/span&gt; &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; GetIPDetails(&lt;/font&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; P1)&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; rtnVal = "// Nothing";&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; ipAddress;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;font size="2"&gt; ( P1 == &lt;/font&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;font size="2"&gt; || P1 == "") &lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ipAddress = GetUsersIP();&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;else&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ipAddress = P1;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;IPLookupResults ilrs = &lt;/font&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;font size="2"&gt; IPLookupResults();&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ilrs.ipAddress = ipAddress;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;try&lt;/span&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;font size="2"&gt; ( !(ipAddress == &lt;/font&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;font size="2"&gt; || ipAddress.Length == 0 || ipAddress == "unknown"))&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;rtnVal = GetUrl("http://api.hostip.info/?ip=" + ipAddress);&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;XmlNamespaceManager xmnsmgml = &lt;/font&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;font size="2"&gt; XmlNamespaceManager(&lt;/font&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;font size="2"&gt; XmlDocument().NameTable);&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;xmnsmgml.AddNamespace("gml","http://www.opengis.net/gml");&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;xmnsmgml.AddNamespace("lc","http://www.hostip.info/api");&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;XmlDocument xd = &lt;/font&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;font size="2"&gt; XmlDocument();&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;xd.LoadXml(rtnVal);&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ilrs.ipAddress = ipAddress;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ilrs.name = xd.SelectSingleNode("/lc:HostipLookupResultSet/gml:featureMember/lc:Hostip/gml:name",xmnsmgml).InnerText;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ilrs.countryName = xd.SelectSingleNode("/lc:HostipLookupResultSet/gml:featureMember/lc:Hostip/lc:countryName",xmnsmgml).InnerText;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ilrs.countryAbbrev = xd.SelectSingleNode("/lc:HostipLookupResultSet/gml:featureMember/lc:Hostip/lc:countryAbbrev",xmnsmgml).InnerText; &lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;font size="2"&gt; ( !(ilrs.name == "(Unknown city)" || ilrs.name == "(Private Address)"))&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;                &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ilrs.coordinates = xd.SelectSingleNode("/lc:HostipLookupResultSet/gml:featureMember/lc:Hostip/lc:ipLocation/gml:PointProperty/gml:Point/gml:coordinates",xmnsmgml).InnerText;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;} &lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;catch&lt;/span&gt;&lt;font size="2"&gt; (Exception ex)&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ilrs.name = ex.Message;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;rtnVal = AjaxPro.JavaScriptSerializer.Serialize(ilrs);&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;rtnVal = "if ( typeof(getIPDetailsCallback) == 'undefined') var ipAddressDetails=" + rtnVal + "; else getIPDetailsCallback(" + rtnVal + ");";&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;font size="2"&gt; rtnVal;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin: 0in 0in 0.0001pt; background: white none repeat scroll 0%"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin: 0in 0in 0.0001pt; background: white none repeat scroll 0%"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;font size="2"&gt;public&lt;/font&gt;&lt;/span&gt; &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; GetUsersIP()&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;System.Web.HttpContext current = System.Web.HttpContext.Current;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; ipAddress = &lt;/font&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;font size="2"&gt; ( current.Request.ServerVariables["HTTP_CLIENT_IP"] != &lt;/font&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ipAddress = current.Request.ServerVariables["HTTP_CLIENT_IP"];&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;font size="2"&gt; ( ipAddress == &lt;/font&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;font size="2"&gt; || ipAddress.Length == 0 || ipAddress == "unknown")&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;font size="2"&gt; ( current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != &lt;/font&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ipAddress = current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;font size="2"&gt; ( ipAddress == &lt;/font&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;font size="2"&gt; || ipAddress.Length == 0 || ipAddress == "unknown")&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;font size="2"&gt; ( current.Request.ServerVariables["REMOTE_ADDR"] != &lt;/font&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ipAddress = current.Request.ServerVariables["REMOTE_ADDR"];&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;font size="2"&gt; ( ipAddress == &lt;/font&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;font size="2"&gt; || ipAddress.Length == 0)&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;ipAddress = "unknown";&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;font size="2"&gt; ipAddress;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin: 0in 0in 0.0001pt; background: white none repeat scroll 0%"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;font size="2"&gt;public&lt;/font&gt;&lt;/span&gt; &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&lt;font size="2"&gt; IPLookupResults&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; ipAddress = "";&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; name = "";&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; countryName = "";&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; countryAbbrev = "";&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;font size="2"&gt; coordinates = "";&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin: 0in 0in 0.0001pt; background: white none repeat scroll 0%"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;br&gt;&lt;br&gt;&lt;a title="Net World Map Project" target="_blank" href="http://www.networldmap.com/" id="v.e5"&gt;Net World Map Project&lt;/a&gt; is also a good resource page.&lt;br&gt;&lt;br&gt;Hope you can make use of this in your own endeavors.&lt;br&gt;&lt;br&gt;Kevin Pirkl&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-6563156350179294264?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/6563156350179294264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=6563156350179294264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6563156350179294264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6563156350179294264'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/03/note-since-i-work-for-intel-i-wont-even.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-3104770566579053878</id><published>2008-03-05T10:48:00.000-08:00</published><updated>2008-04-24T15:06:46.722-07:00</updated><title type='text'></title><content type='html'>&lt;DIV&gt; &lt;/DIV&gt; &lt;DIV&gt;&lt;SPAN class=761343018-05032008&gt;The old TCP/IP connection limit of two at a time is being bumped to six connections to a server.&lt;/SPAN&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;SPAN class=761343018-05032008&gt;Threading model is changing a bit for the downloads to happen in the background..&lt;/SPAN&gt;&lt;/DIV&gt; &lt;DIV&gt; &lt;/DIV&gt; &lt;DIV&gt;&lt;SPAN class=761343018-05032008&gt;Client side DOM storage is being added (probably to compete with Google Gears)&lt;/SPAN&gt;&lt;/DIV&gt; &lt;DIV&gt; &lt;/DIV&gt; &lt;DIV&gt;&lt;SPAN class=761343018-05032008&gt;XDR or Cross-domain Requests for easier sharing of data across different domains securely w/JSON or Perhaps XML data.&lt;/SPAN&gt;&lt;/DIV&gt; &lt;DIV&gt; &lt;/DIV&gt; &lt;DIV&gt;&lt;SPAN class=761343018-05032008&gt;Check out the doc for a full report: &lt;/SPAN&gt;&lt;SPAN class=761343018-05032008&gt;&lt;A href="http://ajaxian.com/archives/ie-8-better-ajax-css-dom-and-new-features"&gt;&lt;FONT color=#800080&gt;http://ajaxian.com/archives/ie-8-better-ajax-css-dom-and-new-features&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/DIV&gt; &lt;DIV&gt; &lt;/DIV&gt; &lt;DIV&gt;&lt;SPAN class=761343018-05032008&gt;Enjoy...&lt;/SPAN&gt;&lt;/DIV&gt; &lt;DIV&gt; &lt;/DIV&gt; &lt;DIV&gt;&lt;SPAN class=761343018-05032008&gt;Kevin Pirkl&lt;/SPAN&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-3104770566579053878?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/3104770566579053878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=3104770566579053878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3104770566579053878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3104770566579053878'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/03/old-tcpip-connection-limit-of-two-at.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-7565226533476290459</id><published>2008-03-04T16:06:00.000-08:00</published><updated>2008-04-24T15:06:46.745-07:00</updated><title type='text'></title><content type='html'>&lt;P&gt; &lt;/P&gt; &lt;P&gt;XSS Exploit and HTML Style Sanitization - Developers, this should scare you (A LOT!!!) &lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;Well if you are a developer creating externally facing web sites that allows HTML or has an RTF style editor that allows HTML submissions then you will need to be aware of the following.  The HTML &amp;lt;STYLE&amp;gt; element is not safe.  &lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;The following example shows just how that is so...&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;From the following details found at &lt;A href="http://www.feedparser.org/docs/html-sanitization.html"&gt;&lt;FONT color=#800080&gt;http://www.feedparser.org/docs/html-sanitization.html&lt;/FONT&gt;&lt;/A&gt; I crafted this HTML into this post&lt;/P&gt; &lt;P&gt;&amp;lt;span style="any: expression(alert('XSS Hack'))"&amp;gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;Using an ASCII to Decimal encoder found here &lt;A href="http://code.cside.com/3rdpage/us/unicode/ascii.html"&gt;http://code.cside.com/3rdpage/us/unicode/ascii.html&lt;/A&gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;To give this&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;&amp;lt;span style="&amp;amp;#97;&amp;amp;#110;&amp;amp;#121;&amp;amp;#58;&amp;amp;#32;&amp;amp;#101;&amp;amp;#120;&amp;amp;#112;&amp;amp;#114;&amp;amp;#101;&amp;amp;#115;&amp;amp;#115;&amp;amp;#105;&amp;amp;#111;&amp;amp;#110;&amp;amp;#40;&amp;amp;#97;&amp;amp;#108;&amp;amp;#101;&amp;amp;#114;&amp;amp;#116;&amp;amp;#40;&amp;amp;#39;&amp;amp;#88;&amp;amp;#83;&amp;amp;#83;&amp;amp;#32;&amp;amp;#72;&amp;amp;#97;&amp;amp;#99;&amp;amp;#107;&amp;amp;#39;&amp;amp;#41;&amp;amp;#41;"&amp;gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;It looks like Google Docs is good at filtering out style embedding and this restriction is a good thing. If you see an alert dialog then the system that your using does not correctly filter out the style= tag attribute but you can save it to disk and open it in Internet Explorer and it will run.  &lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;With this approach a hacker could easily create a dynamic script tag loading a javascript payload or just packaging up all you cookies on the compromised we site and sending those details onto a third party web site.&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;I created a safe tags list based on some originating work around Telligent's Community Server.&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;If you have a copy of Community Server then this list will be handy if not I guess you could look over the &lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;&lt;U&gt;Here is the white list and it should be easy enought to understand.&lt;/U&gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt; &lt;BR&gt;&amp;lt;HTMLScrubber&amp;gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt; &amp;lt;!--&lt;BR&gt; Any element or attribute not included in this list will either be removed or encoded (ie, they will NOT be rendered as markup).&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt; Elements in the globalAttributes section with enable = true will be allowed for all valid Html elements. Invalid attributes&lt;BR&gt; always removed!&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt; Elements listed in the html section will be treated as valid. If you would like to enable additional attributes,&lt;BR&gt; you can list them with a value of true  &lt;BR&gt; --&amp;gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt; &amp;lt;!-- &lt;A href="http://www.feedparser.org/docs/html-sanitization.html"&gt;&lt;FONT color=#800080&gt;http://www.feedparser.org/docs/html-sanitization.html&lt;/FONT&gt;&lt;/A&gt; &lt;BR&gt;  &amp;lt;style enable="true" /&amp;gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;  Ban list but questionable &lt;BR&gt;   &amp;lt;area  /&amp;gt;&lt;BR&gt;   &amp;lt;map /&amp;gt;&lt;BR&gt;    &amp;lt;img usemap="true" /&amp;gt;&lt;BR&gt;  &lt;BR&gt;  Some that deals with form submissions and there are more but for the most part just some attention to dissalow these..&lt;BR&gt;  &amp;lt;label  &amp;lt;fieldset  &amp;lt;button,  &amp;lt;form,  &amp;lt;input &amp;lt;option &amp;lt;select &amp;lt;textarea &amp;lt;optgroup &lt;BR&gt; --&amp;gt;&lt;BR&gt; &amp;lt;HTMLMarkUp&amp;gt;&lt;BR&gt;  &amp;lt;globalAttributes&amp;gt;&lt;BR&gt;   &amp;lt;class enable="true" /&amp;gt;&lt;BR&gt;   &amp;lt;align enable="true" /&amp;gt;&lt;BR&gt;   &amp;lt;id enable="true" /&amp;gt;&lt;BR&gt;  &amp;lt;/globalAttributes&amp;gt;&lt;BR&gt;  &amp;lt;html&amp;gt;&lt;BR&gt;   &amp;lt;a href="true" title="true" name="true" target= "true" rel="true" /&amp;gt;&lt;BR&gt;   &amp;lt;abbr /&amp;gt;&lt;BR&gt;   &amp;lt;acronym /&amp;gt; &lt;BR&gt;   &amp;lt;address /&amp;gt;&lt;BR&gt;   &amp;lt;b /&amp;gt;&lt;BR&gt;   &amp;lt;bdo /&amp;gt; &lt;BR&gt;   &amp;lt;big /&amp;gt; &lt;BR&gt;   &amp;lt;blockquote dir="true" /&amp;gt;&lt;BR&gt;   &amp;lt;br /&amp;gt;&lt;BR&gt;   &amp;lt;caption /&amp;gt; &lt;BR&gt;   &amp;lt;center /&amp;gt; &lt;BR&gt;   &amp;lt;cite /&amp;gt; &lt;BR&gt;   &amp;lt;code /&amp;gt;&lt;BR&gt;   &amp;lt;col /&amp;gt; &lt;BR&gt;   &amp;lt;colgroup /&amp;gt; &lt;BR&gt;   &amp;lt;dd /&amp;gt; &lt;BR&gt;   &amp;lt;del /&amp;gt; &lt;BR&gt;   &amp;lt;dfn /&amp;gt; &lt;BR&gt;   &amp;lt;dir /&amp;gt; &lt;BR&gt;   &amp;lt;div /&amp;gt;&lt;BR&gt;   &amp;lt;dl /&amp;gt; &lt;BR&gt;   &amp;lt;dt /&amp;gt; &lt;BR&gt;   &amp;lt;em /&amp;gt;&lt;BR&gt;   &amp;lt;font size="true" color="true" face="true" /&amp;gt;&lt;BR&gt;   &amp;lt;h1 /&amp;gt;&lt;BR&gt;   &amp;lt;h2 /&amp;gt;&lt;BR&gt;   &amp;lt;h3 /&amp;gt;&lt;BR&gt;   &amp;lt;h4 /&amp;gt;&lt;BR&gt;   &amp;lt;h5 /&amp;gt;&lt;BR&gt;   &amp;lt;h6 /&amp;gt;&lt;BR&gt;   &amp;lt;h7 /&amp;gt;&lt;BR&gt;   &amp;lt;hr /&amp;gt;&lt;BR&gt;   &amp;lt;i /&amp;gt;&lt;BR&gt;   &amp;lt;img src="true" alt="true" title="true" border="true" width="true" height="true" hspace="true" /&amp;gt;&lt;BR&gt;   &amp;lt;ins /&amp;gt; &lt;BR&gt;   &amp;lt;kbd /&amp;gt; &lt;BR&gt;   &amp;lt;lecut /&amp;gt;&lt;BR&gt;   &amp;lt;legend /&amp;gt; &lt;BR&gt;   &amp;lt;li /&amp;gt;&lt;BR&gt;   &amp;lt;menu /&amp;gt; &lt;BR&gt;   &amp;lt;ol /&amp;gt;&lt;BR&gt;   &amp;lt;p dir="true" /&amp;gt;&lt;BR&gt;   &amp;lt;pre /&amp;gt;&lt;BR&gt;   &amp;lt;q /&amp;gt; &lt;BR&gt;   &amp;lt;s /&amp;gt; &lt;BR&gt;   &amp;lt;samp /&amp;gt; &lt;BR&gt;   &amp;lt;small /&amp;gt;&lt;BR&gt;   &amp;lt;span /&amp;gt;&lt;BR&gt;   &amp;lt;strike /&amp;gt;&lt;BR&gt;   &amp;lt;strong /&amp;gt;&lt;BR&gt;   &amp;lt;sub /&amp;gt;&lt;BR&gt;   &amp;lt;sup /&amp;gt;&lt;BR&gt;   &amp;lt;table cellpadding="true" cellspacing="true" bgcolor="true" /&amp;gt;&lt;BR&gt;   &amp;lt;tbody /&amp;gt;&lt;BR&gt;   &amp;lt;td rowspan="true" colspan="true" /&amp;gt;&lt;BR&gt;   &amp;lt;tfoot /&amp;gt; &lt;BR&gt;   &amp;lt;th /&amp;gt;&lt;BR&gt;   &amp;lt;thead /&amp;gt;&lt;BR&gt;   &amp;lt;tt /&amp;gt; &lt;BR&gt;   &amp;lt;tr /&amp;gt;&lt;BR&gt;   &amp;lt;u /&amp;gt;&lt;BR&gt;   &amp;lt;ul /&amp;gt;&lt;BR&gt;   &amp;lt;var /&amp;gt;&lt;BR&gt;   &amp;lt;xmp /&amp;gt;&lt;BR&gt;  &amp;lt;/html&amp;gt;&lt;BR&gt; &amp;lt;/HTMLMarkUp&amp;gt;&lt;/P&gt; &lt;P&gt;&amp;lt;/HTMLScrubber&amp;gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;Hope that this helps you...&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;Kevin Pirkl&lt;/P&gt;&lt;/SPAN&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-7565226533476290459?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/7565226533476290459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=7565226533476290459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/7565226533476290459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/7565226533476290459'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/03/xss-exploit-and-html-style-sanitization.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-8097810631568925680</id><published>2008-03-04T09:49:00.000-08:00</published><updated>2008-04-24T15:06:46.761-07:00</updated><title type='text'></title><content type='html'>&lt;P&gt; &lt;/P&gt; &lt;P&gt;Checkbox Checkboxes jQuery HOWTO Learning&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;Checkboxes support in &lt;A id=ktv0 title=jQuery href="http://jquery.com/" target=_blank&gt;jQuery&lt;/A&gt; are one consistent FAQ item that I see asked about (and have asked about myself quite a few times)&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;Here is a quick DL on the subject..  Taken from the style found in "&lt;A id=pp1t title="Learning jQuery" href="http://www.amazon.com/Learning-jQuery-Interaction-Development-JavaScript/dp/1847192505/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1204651960&amp;amp;sr=8-1" target=_blank&gt;Learning jQuery&lt;/A&gt;" getting an DOM object reference is as easy as the following line of JS code.&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style=" COLOR: blue; FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/SPAN&gt;&lt;SPAN style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt; chkIsIntelPerson = $("#chkIsIntelPerson").&lt;/font&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt;&lt;font size="2"&gt;(0);&lt;/font&gt;&lt;p&gt; &lt;/p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P&gt; &lt;P&gt;  &lt;/P&gt;&lt;/P&gt; &lt;P&gt;This provides a handle to the &lt;A id=isgb title="HTML DOM Checkbox Object" href="http://chkIsIntelPerson.checked" target=_blank&gt;HTML DOM Checkbox Object&lt;/A&gt; (&lt;A id=rscb title=W3Schools href="http://www.w3schools.com/" target=_blank&gt;W3Schools&lt;/A&gt; )with which you can access all of it's properties.&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;You can also bind a jQuery click event that will not mess with the toggle of the object&lt;/P&gt; &lt;P&gt; &lt;P&gt; &lt;/P&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;$("#chkIsIntelPerson").click( &lt;/font&gt;&lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt;&lt;font size="2"&gt;(){&lt;/font&gt;&lt;p&gt; &lt;/p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN style=" COLOR: blue; FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/SPAN&gt;&lt;SPAN style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt; (chkIsIntelPerson.checked)&lt;/font&gt;&lt;p&gt; &lt;/p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;            &lt;SPAN style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;$txtSecurityRoles.val("INTRNLGNRLUSR");&lt;/font&gt;&lt;p&gt; &lt;/p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;      &lt;SPAN style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;SPAN style="COLOR: blue"&gt;else&lt;p&gt; &lt;/p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;            &lt;SPAN style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;$txtSecurityRoles.val("");&lt;/font&gt;&lt;p&gt; &lt;/p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style=" FONT-FAMILY: &amp;#39;Courier New&amp;#39;"&gt;&lt;font size="2"&gt;});&lt;/font&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;The $txtSecurityRoles is a style of sytax from Learning jQuery that I like and represents a jQuery object where as the chkIsIntelPerson is just a normal HTML DOM object.  &lt;/P&gt; &lt;P&gt; &lt;/P&gt;&lt;/P&gt; &lt;P&gt;Please visit the &lt;A id=dypg title=W3Schools href="http://www.w3schools.com/default.asp" target=_blank&gt;W3Schools&lt;/A&gt; site and see all about the &lt;A id=qr2s title=Ceckbox href="http://www.w3schools.com/htmldom/dom_obj_checkbox.asp" target=_blank&gt;Ceckbox&lt;/A&gt; object there&lt;/P&gt; &lt;P&gt; &lt;IMG src="http://docs.google.com/File?id=dc7x9fp2_16r3x5xj3t"&gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;I hope this helps. &lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;Kevin Pirkl &lt;/P&gt; &lt;P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt; &lt;/P&gt;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-8097810631568925680?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/8097810631568925680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=8097810631568925680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8097810631568925680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8097810631568925680'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/03/checkbox-checkboxes-jquery-howto.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-6269222644949636645</id><published>2008-02-29T16:04:00.000-08:00</published><updated>2008-04-24T15:06:46.775-07:00</updated><title type='text'></title><content type='html'>&lt;P&gt;We wrote our own commenting system and wanted to extract all of our comments for all our page back out of &lt;A id=g-ja title=JSKit href="http://js-kit.com/" target=_blank&gt;JSKit&lt;/A&gt;.  &lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;Some code and notes here written in C# and here it is (notes are a few months old so I am just getting around to putting them up, sorry.)  Note: Dont pound on the JSKit servers as&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;If you have comments in JKit one item that you might have noticed is that you can't get your data back so I put together this little bit of .Net code that will help.  The dataformat across the web is JSON and this regular expression will parse it out for you. &lt;/P&gt; &lt;P&gt;wwHttp() is a bit of code that you can find &lt;A href="http://www.west-wind.com/presentations/dotnetWebRequest/dotnetWebRequest.htm"&gt;here&lt;/A&gt;..&lt;FONT size=+0&gt;&lt;FONT color=#a52a2a&gt;One addition... Change the Encoding from 1252 to 65001 to support UTF-8 extended languages like Russian and one other thing...  Create a app.config file with the following data (needed for running this code on a Win2k3 box)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P&gt;&lt;FONT size=+0&gt;&lt;FONT color=#a52a2a&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;&lt;BR&gt;&amp;lt;configuration&amp;gt;&lt;BR&gt; &amp;lt;system.net&amp;gt;&lt;BR&gt;            &amp;lt;settings&amp;gt;&lt;BR&gt;                  &amp;lt;httpWebRequest useUnsafeHeaderParsing="true"/&amp;gt;&lt;BR&gt;            &amp;lt;/settings&amp;gt;&lt;BR&gt; &amp;lt;/system.net&amp;gt;&lt;BR&gt;&amp;lt;/configuration&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;P&gt;&lt;FONT color=#a52a2a&gt;There is some date calculation as well.. This should help&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;DateTime d1; &lt;/P&gt; &lt;P class=MsoNormal&gt;double test = 0; &lt;/P&gt; &lt;P class=MsoNormal&gt;string exacttime = &amp;quot;&amp;quot;; &lt;/P&gt; &lt;P class=MsoNormal&gt; &lt;/P&gt; &lt;P class=MsoNormal&gt;d1 = new DateTime(1970, 1, 1); &lt;/P&gt; &lt;P class=MsoNormal&gt;test = 1171898391; &lt;/P&gt; &lt;P class=MsoNormal&gt;test = test * 1000; &lt;/P&gt; &lt;P class=MsoNormal&gt;d1 = d1.AddMilliseconds(test); &lt;/P&gt; &lt;P class=MsoNormal&gt;exacttime = d1.ToShortDateString() + " " + d1.ToLongTimeString();&lt;/P&gt;&lt;CODE&gt;&lt;PRE&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; getDataFor = System.Web.HttpUtility.UrlEncode("http://orisndev01.amr.corp.intel.com/ISN/Home/Test.htm");&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; URL = "http://js-kit.com/comments-data.js?ref=" + getDataFor;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; regex = @"{sID:.*?status:s'(.*?)'.*?Name:s'(.*?)'.*?Text:s'(.*?)'.*?}";&lt;/P&gt;&lt;P&gt;System.Text.RegularExpressions.RegexOptions options = ((System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace | System.Text.RegularExpressions.RegexOptions.Singleline) &lt;/P&gt;&lt;P&gt;| System.Text.RegularExpressions.RegexOptions.IgnoreCase);&lt;/P&gt;&lt;P&gt;System.Text.RegularExpressions.Regex reg = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; System.Text.RegularExpressions.Regex(regex, options);&lt;/P&gt;&lt;P&gt;wwHttp loHttp = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; wwHttp();&lt;/P&gt;&lt;P&gt;//loHttp.ProxyAddress = "http://xxxxxxxx.xx.xxxxx.com:911";&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; testtxt = loHttp.GetUrl(URL);&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;&lt;FONT color=#a52a2a size=2&gt;&lt;P&gt;testtxt = testtxt.Replace("\'","&amp;amp;apos;"); Fixes single quote problem in regexp&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;P&gt;//string testtxt = " var data = [{ ID: 'jsid-1174938750-0', yours: true, status: 'A', TS: 1174938750, Name: 'Kevin', Text: 'I like this? URL Changed and the comment was lost though...'} ,";&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;foreach&lt;/FONT&gt;&lt;FONT size=2&gt;( System.Text.RegularExpressions.Match m &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;in&lt;/FONT&gt;&lt;FONT size=2&gt; reg.Matches(testtxt))&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;   string&lt;/FONT&gt;&lt;FONT size=2&gt; cStaus = m.Groups[1].Value; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;// cStaus = "A" is the only good one...&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;   string&lt;/FONT&gt;&lt;FONT size=2&gt; cName = m.Groups[2].Value;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;   string&lt;/FONT&gt;&lt;FONT size=2&gt; cComment = m.Groups[3].Value;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;   string&lt;/FONT&gt;&lt;FONT size=2&gt; stopme2 = "";&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt; &lt;P&gt;Kevin&lt;CODE&gt;&lt;/P&gt;&lt;P&gt; &lt;/P&gt;&lt;/CODE&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/CODE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-6269222644949636645?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/6269222644949636645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=6269222644949636645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6269222644949636645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6269222644949636645'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/02/we-wrote-our-own-commenting-system-and.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-360938618553003210</id><published>2008-02-28T14:24:00.000-08:00</published><updated>2008-04-24T15:06:46.802-07:00</updated><title type='text'></title><content type='html'>            RLE versus ALE - A tale of two woes.... HTML embedding of images and support possibilities review&lt;br&gt;&lt;br&gt;&lt;div class="BlogPostContent"&gt; &lt;p&gt;Players:&lt;/p&gt; &lt;blockquote dir="ltr"&gt; &lt;p&gt;&lt;a href="http://www.zimbra.com/blog/archives/2006/04/zimbra_ale-ajax_linking_and_embedding.html"&gt;ALE&lt;/a&gt;:  AJAX Linking and Embedding - Zimbra&lt;br&gt;&lt;a href="http://en.wikipedia.org/wiki/Run-length_encoding"&gt;RLE&lt;/a&gt;: Run-Length  Encoding &lt;/p&gt;&lt;/blockquote&gt; &lt;p dir="ltr"&gt;I took some time out to look at both of these concept technologies  and have to discount each.&lt;/p&gt; &lt;p dir="ltr"&gt;&lt;br&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;Why?  Engaging in a series of searches for a decent cross browser  platform technology that allows image compaction and bundling for web browsers  leads to a lot of dead ends.  I have looked at IE MHT format, FireFox CDF's and  cross support is not there.  In 1998 &lt;a href="http://en.wikipedia.org/wiki/IETF"&gt;IETF&lt;/a&gt; &lt;a href="http://tools.ietf.org/html/rfc2397"&gt;RFC 2397&lt;/a&gt; defined the data: URI  scheme that has not been adopted by Internet Explorer so that is out as well.  &lt;/p&gt; &lt;p dir="ltr"&gt;&lt;br&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;ALE is highly proprietary and platform based even with the Open  Source Edition so in essence and IMHO I do not like it.&lt;/p&gt; &lt;p dir="ltr"&gt;&lt;br&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;RLE &lt;a href="http://www.bennherrera.com/EmbeddedImage/"&gt;Demo&lt;/a&gt; by  Ben Herrera use pix by pix decoded RLE which is cross browser compatible but  highly inefficient the larger the image becomes.&lt;/p&gt; &lt;p dir="ltr"&gt;&lt;br&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;RLE is about the closest one could come to sending down a single  package of images that comprise all the images for an entire website and it  would not be that hard to extend Ben's work into a JSON JavaScript object but  again the performance is lacking so it would not be worth the effort.&lt;/p&gt; &lt;p dir="ltr"&gt;&lt;br&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;End Game:  Tie - Both lost and there are no performance gains to be  found by reducing the number of downloadable page elements.  Your best bet is to  use GZip/Deflate on your web server side for browsers that will support it and  AJAX to deliver the images after the page has downloaded but even this approach  means that you must define your image height and width attributes to prevent  page element bounce.&lt;/p&gt; &lt;p dir="ltr"&gt;&lt;br&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;Kevin Pirkl&lt;/p&gt;&lt;/div&gt;&lt;br&gt;            &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-360938618553003210?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/360938618553003210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=360938618553003210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/360938618553003210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/360938618553003210'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/02/rle-versus-ale-tale-of-two-woes.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-2131626220345507324</id><published>2008-02-27T11:53:00.000-08:00</published><updated>2008-04-24T15:06:46.824-07:00</updated><title type='text'></title><content type='html'>I ran across this style of page localization once before and liked it.&lt;br&gt;&lt;br&gt;This is the basis for a nice localization pattern for web pages using JavaScript.  &lt;br&gt;&lt;br&gt;The JS code dropped into the script file looks like so..&lt;br&gt;&lt;br&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt; FB_Localized = {&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbackhdr:'Feedback For This Page',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacksaveerror:'Sorry the system is busy, try again later.',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacksent:'Feedback Sent',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbackemail:'Your email address:',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbackmessage:'Message:',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacksubmit:'Submit',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbackclose:'Close',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacklengthTooLong:'(Feedback too long please shorten)',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;            &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacktotallen:1900&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;      &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;};&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt; FB_T = &lt;/font&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt;&lt;font size="2"&gt;(t){&lt;/font&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;font size="2"&gt; FB_Localized[t]||t;}&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;p&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;To pull out any value in your JavaScript code you just put in a placeholder and then use perhaps a simple &lt;a title="jQuery" target="_blank" href="http://docs.jquery.com/Main_Page" id="pe9x"&gt;jQuery&lt;/a&gt; call to place it onload.&lt;br&gt;&lt;br&gt;&amp;lt;script&amp;gt;&lt;br&gt;$(function(){&lt;br&gt;    $("#feedbackheader").html(FB_T('feedbackhdr'));&lt;br&gt;});&lt;br&gt;&amp;lt;/script&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;span id=feedbackheader&amp;gt;&amp;lt;/span&amp;gt;&lt;br&gt;&lt;br&gt;So to override the language defaults you just reference another script file with language overrides for the above array like so before the final page is loaded..&lt;br&gt;&lt;br&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;; color: blue;"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt; FB_Localized = {&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbackhdr:'Отзыв на эту страницу',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacksaveerror:'Извините, система загружена. Попробуйте позднее.',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacksent:'Отзыв отправлен',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbackemail:'Ваш адрес электронной почты:',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbackmessage:'Сообщение:',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacksubmit:'Отправить',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbackclose:'Закрыть',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacklengthTooLong:'(Отзыв слишком длинный. Пожалуйста, сократите его)',&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;  &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;feedbacktotallen:1900&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt; &lt;span style=" font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;font size="2"&gt;};&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;br&gt;etc for any other language that you want to support..&lt;br&gt;&lt;br&gt;The nice thing here is that you can drive the JS Script file from easily from a database to .Net Resource files with ease..  Some time back I did a quick video detailing how easy this would be to do in .Net using Resource Files and/ro I think a database driver.  The video was titled &lt;a title="Zero Code ASP.Net Localization via jQuery &amp;amp; JSON" target="_blank" href="http://softwarecommunity.intel.com/videos/home.aspx?fn=100038" id="v:h_"&gt;Zero Code ASP.Net Localization via jQuery &amp;amp; JSON&lt;/a&gt; but I am sure it is a bit out of date.&lt;br&gt;&lt;br&gt;Kevin Pirkl&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;            &lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-2131626220345507324?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/2131626220345507324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=2131626220345507324' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2131626220345507324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2131626220345507324'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/02/i-ran-across-this-style-of-page.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-2464860536072564895</id><published>2008-02-26T09:51:00.000-08:00</published><updated>2008-04-24T15:06:46.838-07:00</updated><title type='text'></title><content type='html'>This is a quick sample built upon the "&lt;a title="JavaScript interface to PicasaWeb Albums" target="_blank" href="http://sourceforge.net/projects/pwa/" id="h26q"&gt;JavaScript interface to PicasaWeb Albums&lt;/a&gt;" and converted over to &lt;a title="jQuery" target="_blank" href="http://jquery.com/" id="yfwa"&gt;jQuery&lt;/a&gt; &lt;br&gt;&lt;br&gt;&lt;div&gt;&lt;font face="Courier New" size="1"&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML  4.01 Transitional//EN" &lt;br&gt;                    "&lt;/font&gt;&lt;a title="http://www.w3.org/TR/html4/loose.dtd" href="http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;font title="http://www.w3.org/TR/html4/loose.dtd" face="Courier New" size="1"&gt;http://www.w3.org/TR/html4/loose.dtd&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="1"&gt;"&amp;gt;&lt;br&gt;&amp;lt;html&amp;gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;  &amp;lt;script src="&lt;/font&gt;&lt;a title="http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script" href="http://code.jquery.com/jquery-latest.js%22%3E%3C/script"&gt;&lt;font title="http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script" face="Courier New" size="1"&gt;http://code.jquery.com/jquery-latest.js"&amp;gt;&amp;lt;/script&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="1"&gt;&amp;gt;&lt;br&gt;  &amp;lt;script&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New" size="1"&gt;$(document).ready(function(){&lt;br&gt; $.getJSON("&lt;/font&gt;&lt;a title="http://picasaweb.google.com/data/feed/base/user/pirklk/albumid/5156711861661192353" href="http://picasaweb.google.com/data/feed/base/user/pirklk/albumid/5156711861661192353"&gt;&lt;font title="http://picasaweb.google.com/data/feed/base/user/pirklk/albumid/5156711861661192353" face="Courier New" size="1"&gt;http://picasaweb.google.com/data/feed/base/user/pirklk/albumid/5156711861661192353&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="1"&gt;",  {category:"photo",alt:"json"},&lt;br&gt; function(data){&lt;br&gt;  $.each(data.feed.entry,  function(i,item){&lt;br&gt;   $("&amp;lt;img/&amp;gt;").attr("src",  item.media$group.media$content[0].url).appendTo("#images");&lt;br&gt;  if ( i == 3 )  return false;&lt;br&gt;  });&lt;br&gt; });&lt;br&gt;});&lt;br&gt;  &amp;lt;/script&amp;gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;&lt;font face="Courier New" size="1"&gt;  &amp;lt;style&amp;gt;img{ height: 100px; float:  left; }&amp;lt;/style&amp;gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;  &amp;lt;div  id="images"&amp;gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/font&gt;&lt;/div&gt;&lt;br&gt;I did not see an easy explanation of the funky data format for PicasaWeb JSON data but the general idea is simple enough.&lt;br&gt;&lt;br&gt;Kevin Pirkl&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-2464860536072564895?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/2464860536072564895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=2464860536072564895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2464860536072564895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2464860536072564895'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2008/02/this-is-quick-sample-built-upon.html' title=''/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-3180621817482906824</id><published>2007-12-21T11:34:00.000-08:00</published><updated>2007-12-21T11:35:08.643-08:00</updated><title type='text'>Standard pocket carry choice</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://bp1.blogger.com/_szAd7h9ckRM/R2wVbONbw5I/AAAAAAAAADY/krYOjKjjn4A/s1600-h/photo-708645.jpg"&gt;&lt;img src="http://bp1.blogger.com/_szAd7h9ckRM/R2wVbONbw5I/AAAAAAAAADY/krYOjKjjn4A/s320/photo-708645.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5146512031592727442" /&gt;&lt;/a&gt;&lt;/p&gt;I would like one of these for carry and would run .38 JHP through it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-3180621817482906824?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/3180621817482906824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=3180621817482906824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3180621817482906824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3180621817482906824'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/12/standard-pocket-carry-choice.html' title='Standard pocket carry choice'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://bp1.blogger.com/_szAd7h9ckRM/R2wVbONbw5I/AAAAAAAAADY/krYOjKjjn4A/s72-c/photo-708645.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-8575494166055228165</id><published>2007-11-07T16:57:00.000-08:00</published><updated>2007-11-07T16:59:17.501-08:00</updated><title type='text'>Leaving the office</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://bp0.blogger.com/_szAd7h9ckRM/RzJfZmb6auI/AAAAAAAAAC4/B6_xgKNJkOc/s1600-h/photo-757502.jpg"&gt;&lt;img src="http://bp0.blogger.com/_szAd7h9ckRM/RzJfZmb6auI/AAAAAAAAAC4/B6_xgKNJkOc/s320/photo-757502.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5130267818947406562" /&gt;&lt;/a&gt;&lt;/p&gt;Pun intended&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-8575494166055228165?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/8575494166055228165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=8575494166055228165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8575494166055228165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8575494166055228165'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/11/leaving-office.html' title='Leaving the office'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://bp0.blogger.com/_szAd7h9ckRM/RzJfZmb6auI/AAAAAAAAAC4/B6_xgKNJkOc/s72-c/photo-757502.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-534408220551097545</id><published>2007-11-01T19:15:00.000-07:00</published><updated>2007-11-01T19:16:28.212-07:00</updated><title type='text'>Dinner at the Hyatt Regency</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://bp1.blogger.com/_szAd7h9ckRM/RyqIfISx9aI/AAAAAAAAACw/cEEZ4w-7g8Q/s1600-h/photo-788214.jpg"&gt;&lt;img src="http://bp1.blogger.com/_szAd7h9ckRM/RyqIfISx9aI/AAAAAAAAACw/cEEZ4w-7g8Q/s320/photo-788214.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5128061194098308514" /&gt;&lt;/a&gt;&lt;/p&gt;Intel SES Conference final meal.&lt;br&gt;Boy cafeteria food sucks! :)-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-534408220551097545?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/534408220551097545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=534408220551097545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/534408220551097545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/534408220551097545'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/11/dinner-at-hyatt-regency.html' title='Dinner at the Hyatt Regency'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://bp1.blogger.com/_szAd7h9ckRM/RyqIfISx9aI/AAAAAAAAACw/cEEZ4w-7g8Q/s72-c/photo-788214.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-3709952414407967052</id><published>2007-10-25T18:04:00.000-07:00</published><updated>2007-10-25T18:25:33.453-07:00</updated><title type='text'>Suds at my Bro's place</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://bp1.blogger.com/_szAd7h9ckRM/RyFCDYSx9ZI/AAAAAAAAACo/DOzJLQ2--z0/s1600-h/photo-733455.jpg"&gt;&lt;img src="http://bp1.blogger.com/_szAd7h9ckRM/RyFCDYSx9ZI/AAAAAAAAACo/DOzJLQ2--z0/s320/photo-733455.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5125450476752598418" /&gt;&lt;/a&gt;&lt;/p&gt;My pooch loves the dobermans&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-3709952414407967052?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/3709952414407967052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=3709952414407967052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3709952414407967052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/3709952414407967052'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/10/suds-at-my-bros-place.html' title='Suds at my Bro&apos;s place'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://bp1.blogger.com/_szAd7h9ckRM/RyFCDYSx9ZI/AAAAAAAAACo/DOzJLQ2--z0/s72-c/photo-733455.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-2224201625970945116</id><published>2007-10-21T13:07:00.001-07:00</published><updated>2007-10-21T13:07:58.314-07:00</updated><title type='text'>Beer at McMenains</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://bp0.blogger.com/_szAd7h9ckRM/Rxuxntnp5BI/AAAAAAAAACg/2U2EVJKBul4/s1600-h/photo-778316.jpg"&gt;&lt;img src="http://bp0.blogger.com/_szAd7h9ckRM/Rxuxntnp5BI/AAAAAAAAACg/2U2EVJKBul4/s320/photo-778316.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5123884296883004434" /&gt;&lt;/a&gt;&lt;/p&gt;Red something or other. I&amp;#39;m just getting drink drank drunk with my  &lt;br&gt;wife driving here!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-2224201625970945116?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/2224201625970945116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=2224201625970945116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2224201625970945116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/2224201625970945116'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/10/beer-at-mcmenains.html' title='Beer at McMenains'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://bp0.blogger.com/_szAd7h9ckRM/Rxuxntnp5BI/AAAAAAAAACg/2U2EVJKBul4/s72-c/photo-778316.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-6633830027250451808</id><published>2007-09-30T14:18:00.001-07:00</published><updated>2007-09-30T14:18:55.556-07:00</updated><title type='text'>My wife</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://bp3.blogger.com/_szAd7h9ckRM/RwASwNnp5AI/AAAAAAAAABw/t8gin9uDcVY/s1600-h/photo-735557.jpg"&gt;&lt;img src="http://bp3.blogger.com/_szAd7h9ckRM/RwASwNnp5AI/AAAAAAAAABw/t8gin9uDcVY/s320/photo-735557.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5116109796191888386" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-6633830027250451808?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/6633830027250451808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=6633830027250451808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6633830027250451808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/6633830027250451808'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/09/my-wife.html' title='My wife'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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://bp3.blogger.com/_szAd7h9ckRM/RwASwNnp5AI/AAAAAAAAABw/t8gin9uDcVY/s72-c/photo-735557.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8729798332371031173.post-8945956635065197286</id><published>2007-06-23T09:41:00.000-07:00</published><updated>2007-06-23T09:47:28.292-07:00</updated><title type='text'>Voki For Web</title><content type='html'>I think that this tool is very sweet!  Check this out..  I created this example in just a couple of minutes..&lt;br /&gt;&lt;br /&gt;&lt;OBJECT id="voki" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" WIDTH=200 HEIGHT=267&gt;&lt;PARAM NAME="movie" VALUE="http://vhss-a.oddcast.com/voki/voki_player.swf?doc=http%3A%2F%2Fvhss-d.oddcast.com%2Fphp%2Fvoki%2Fgetvoki%2Fchsm%3D2cac9cf2823d5b0ac7a9a62abf252169%26sc%3D13607"&gt;&lt;PARAM NAME=quality VALUE=high&gt;&lt;PARAM NAME=scale VALUE=noborder&gt;&lt;PARAM NAME=bgcolor VALUE="transparent"&gt;&lt;PARAM NAME="wmode" VALUE="transparent"&gt;&lt;EMBED src="http://vhss-a.oddcast.com/voki/voki_player.swf?doc=http%3A%2F%2Fvhss-d.oddcast.com%2Fphp%2Fvoki%2Fgetvoki%2Fchsm%3D2cac9cf2823d5b0ac7a9a62abf252169%26sc%3D13607" swLiveConnect=true NAME="voki" quality=high scale=noborder wmode="transparent" WIDTH=200 HEIGHT=267 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"&gt;&lt;/EMBED&gt;&lt;/OBJECT&gt;&lt;BR&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;You can find out more about Voki by clicking &lt;a href="http://www.voki.com/"&gt; here&lt;/a&gt;&lt;BR&gt;&lt;BR&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-8945956635065197286?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/8945956635065197286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=8945956635065197286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8945956635065197286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8945956635065197286'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/06/voki-for-web.html' title='Voki For Web'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-1179707772010268880</id><published>2007-04-17T21:49:00.000-07:00</published><updated>2007-04-17T22:52:33.924-07:00</updated><title type='text'>Google Translator Mashup - Another Gen</title><content type='html'>&lt;div style="font-size:11px; font-style:Verdana;"&gt;&lt;span class=translator&gt;Well after a little break from working on my Google Language Translator drop-in tool for web pages I have came back and simplified things a bit.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=translator&gt;IE7 created a new bug and I moved some of the code around and embedded the style sheet to make this tool more portable. This latest version can be dropped into any web page with only two JavaScript files references and one span tag for the toolbar placement and some class attributes added to the regions that you want translated.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=translator&gt;The current shared version has a limit of about 2000 characters since it's "Google Translate Request" uses a Query String that gets sent across the wire but you can work around this by breaking up and using multiple span/div tags with the translator attribute.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=translator&gt;If you are doing you own hosting with local web page you can work aound this limitation by writing your own Proxy Web Page like the ASP.Net&lt;/span&gt; &lt;a target="_blank" href="http://pirkl.homeip.net:8080/test.htm"&gt;example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=translator&gt;Found on the top of this Blog is a Drop-Down language selection toolbar. Select one and then click on the refresh icon at the right to make the element with the HTML class attribute of&lt;/span&gt;&amp;nbsp;&amp;quot;translator&amp;quot;&amp;nbsp;&lt;span class=translator&gt;self translate.&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-size:10px; font-style:Verdana;"&gt;&lt;span class=translator&gt;These are the HTML JavaScript's files required&lt;/span&gt;&lt;br /&gt;&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.pack.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=&amp;quot;http://softwarecommunity.intel.com/isn/home/translator.js&amp;quot;type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=translator&gt;For the Toolbar just drop the following code into the page&lt;/span&gt;&lt;br /&gt;&amp;lt;span class=&amp;quot;globalLocalizerToolBar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=translator&gt;For each element that you want to auto-translate use a span or div tag with the &amp;quot;translator&amp;quot; attribute to surround the text.&lt;/span&gt;&lt;br /&gt;&amp;lt;span class=&amp;quot;translator&amp;quot;&amp;gt;&lt;span class=translator&gt;this text would translate&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;ZombieBob&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-1179707772010268880?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/1179707772010268880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=1179707772010268880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/1179707772010268880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/1179707772010268880'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/04/google-translator-mashup-another-gen.html' title='Google Translator Mashup - Another Gen'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-8647572218511292223</id><published>2007-04-15T21:06:00.000-07:00</published><updated>2007-04-17T21:19:32.065-07:00</updated><title type='text'>Universal Safe Gun Handling Rules</title><content type='html'>&lt;div class="translator"  style="font-size:85%;"&gt;I not an expert at doing ad-hoc video creation and this was a one take effort to explain the four universal rules of safe gun handling.. It came out OK for something that was done one the fly, un-rehearsed and not practiced.&lt;/div&gt;&lt;div class="translator"  style="font-size:85%;"&gt;Hope you like it!&lt;/div&gt;&lt;br /&gt;Bob&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/y2Zgvz4MYUA"&gt;&lt;embed src="http://www.youtube.com/v/y2Zgvz4MYUA" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-8647572218511292223?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/watch?v=y2Zgvz4MYUA' title='Universal Safe Gun Handling Rules'/><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/8647572218511292223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=8647572218511292223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8647572218511292223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8647572218511292223'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/04/universal-safe-gun-handling-rules.html' title='Universal Safe Gun Handling Rules'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-7861051848876590701</id><published>2007-04-15T10:52:00.000-07:00</published><updated>2007-04-15T22:08:46.187-07:00</updated><title type='text'>Defensive DrawStroke</title><content type='html'>&lt;div class="translator" style="font-size: 85%; font-family: verdana;"&gt;I made my first YouTube video today...  Aside for Geeking out regarding ASP.Net AJAX coding I like to teach safe gun handling skills.&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/VQQz_-fCXYQ"&gt;&lt;embed src="http://www.youtube.com/v/VQQz_-fCXYQ" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style="font-size: 85%; font-family: verdana;"&gt;Bob&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-7861051848876590701?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/watch?v=VQQz_-fCXYQ' title='Defensive DrawStroke'/><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/7861051848876590701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=7861051848876590701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/7861051848876590701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/7861051848876590701'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/04/defensive-drawstroke.html' title='Defensive DrawStroke'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-8193228511392942187</id><published>2007-04-10T20:02:00.000-07:00</published><updated>2007-04-17T22:54:22.642-07:00</updated><title type='text'>Video drop in control for Intel Software Network Videos</title><content type='html'>&lt;span style="font-family:Verdana;"&gt;&lt;span class="translator"&gt;This is a little tool that I recently wrote for work...&lt;/span&gt;  &lt;span class="translator"&gt;It was a nice exercise in mash-up integration with the&lt;/span&gt; &lt;a href="http://softwarecommunity.intel.com/videos/home.aspx"&gt;ISN Video Repository&lt;/a&gt; &lt;span class="translator"&gt;Web Site..&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="translator"&gt;I kind of think it turned out pretty cool&lt;br /&gt;&lt;br /&gt;With just two include files and one additional line of JavaScript and a DIV tag for item placement I am able to render this nice video tool bar.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt;&amp;lt;script src="http://code.jquery.com/jquery-latest.pack.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt;&amp;lt;script src="&lt;/span&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt;http://www.intel.com/plt/cd/software/shared/eng/dhtml/isn.js&lt;/span&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt;" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt; &lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt;&amp;lt;script src="http://softwarecommunity.intel.com/videos/videobar.js" type=text/javascript&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt; &amp;lt;script type=text/javascript&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt;&lt;br /&gt;var serviceURL="http://softwarecommunity.intel.com";&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt;$(document).ready(function(){getVideos("Manageability");});&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style=";font-family:Verdana;font-size:78%;"  &gt; &amp;lt;div id=vidmover&amp;gt;Will load it here...&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;&lt;br /&gt;&lt;span class="translator"&gt;The above code calls getVideos() with a category of "Manageability" but in below I will show it with a blank category "".&lt;br /&gt;&lt;br /&gt;This blog style does not Gell well but with some tweaking it easily would.&lt;/span&gt;&lt;script src="http://softwarecommunity.intel.com/videos/videobar.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var serviceURL="http://softwarecommunity.intel.com";$(document).ready(function(){getVideos("");});&lt;/script&gt;&lt;br /&gt;&lt;div id="vidmover"&gt;Will load it here...&lt;/div&gt;&lt;br /&gt;Kevin Pirkl&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-8193228511392942187?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/8193228511392942187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=8193228511392942187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8193228511392942187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/8193228511392942187'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/04/this-is-little-tool-that-i-recently.html' title='Video drop in control for Intel Software Network Videos'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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-8729798332371031173.post-9116758774477002455</id><published>2007-01-27T09:27:00.000-08:00</published><updated>2007-01-27T12:12:09.949-08:00</updated><title type='text'>Hello World</title><content type='html'>Hello World - Every new things should start out saying these words.&lt;br /&gt;&lt;br /&gt;The best line of code ever written and nothing will ever beat it.&lt;br /&gt;&lt;br /&gt;10  Print "Hello World"&lt;br /&gt;&lt;br /&gt;It elegant, simple, free from bugs, doesn't require any up-keep. Compared to it everything else is just pure and utter chaos!&lt;br /&gt;&lt;br /&gt;I like &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; JavaScript Library as well as it integrates with this Blog and some code work that I did about providing embedded translation services.  For example the API's that I created will convert the following text into the selected language (on this blog around the "About" settings.)&lt;br /&gt;&lt;div class="translator"&gt;I love blogging&lt;/div&gt;&lt;br /&gt;Thats it!  Check out the &lt;a href="http://pirkl.homeip.net:8080/test.htm"&gt;online sample&lt;/a&gt; that I put up on my own website.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8729798332371031173-9116758774477002455?l=zombiebob.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zombiebob.blogspot.com/feeds/9116758774477002455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8729798332371031173&amp;postID=9116758774477002455' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/9116758774477002455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8729798332371031173/posts/default/9116758774477002455'/><link rel='alternate' type='text/html' href='http://zombiebob.blogspot.com/2007/01/hello-world-every-new-things-should.html' title='Hello World'/><author><name>ZombieBob</name><uri>http://www.blogger.com/profile/06628874420866952930</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>
