<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kerry D. Wong &#187; Linux</title>
	<atom:link href="http://www.kerrywong.com/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kerrywong.com</link>
	<description></description>
	<lastBuildDate>Fri, 03 Sep 2010 00:51:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Apache2 Logrotate</title>
		<link>http://www.kerrywong.com/2010/08/11/apache2-logrotate/</link>
		<comments>http://www.kerrywong.com/2010/08/11/apache2-logrotate/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 00:14:04 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Logrotate]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/?p=2422</guid>
		<description><![CDATA[Whenever I setup a new web server, I always like the idea of keeping the Apache logs roated on a daily basis. While the procedures for changing the log rotate frequency is pretty straight forward, I have seen a lot of people having problems with it so I decided to document it. To change the [...]]]></description>
			<content:encoded><![CDATA[<p>Whenever I setup a new web server, I always like the idea of keeping the <a href="http://www.apache.org">Apache</a> logs roated on a daily basis. While the procedures for changing the log rotate frequency is pretty straight forward, I have seen a lot of people having problems with it so I decided to document it.<span id="more-2422"></span></p>
<p>To change the Apache log rotate frequency, you would want to change the apache2 configuration file located under /etc/logrotate.d. Configurations located in this directory overrides the default settings in /etc/logrotate.conf (the configurations in /etc/logrotate.d are included in logrotate.conf)</p>
<p>Here&#8217;s what my settings look like (note that I had commented out compress option so that all the logs can be easily browsed):</p>
<blockquote><p>
/var/log/apache2/*.log {<br />
        daily<br />
        missingok<br />
        rotate 365<br />
        #compress<br />
        #delaycompress<br />
        notifempty<br />
        create 640 root adm<br />
        sharedscripts<br />
        postrotate<br />
                if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then<br />
                        /etc/init.d/apache2 reload > /dev/null<br />
                fi<br />
        endscript<br />
}
</p></blockquote>
<h3>Common problem</h3>
<p>A common problem after changing the log rotate frequency is that the Apache logs do not appear to be rotating daily even though the configuration file had been changed correctly.</p>
<p>This seems to be a known issue with logrotate. If you read the manual for logrotate you&#8217;d see the following explanation:</p>
<blockquote><p>
       -f, &#8211;force<br />
              Tells logrotate to force the rotation, even if it doesn&#8217;t  think<br />
              this  is  necessary.   Sometimes this is useful after adding new<br />
              entries to a logrotate config file, or if  old  log  files  have<br />
              been removed by hand, as the new files will be created, and<br />
              logging will continue correctly.
</p></blockquote>
<p>Since the default cron daily job does not force the log rotation, you may want to add -f parameter to /etc/cron.daily/logrotate:</p>
<blockquote><p>
#!/bin/sh</p>
<p>test -x /usr/sbin/logrotate || exit 0<br />
/usr/sbin/logrotate -f /etc/logrotate.conf
</p></blockquote>
<p>With this change, the logs will be forced to rotate daily according to the setup.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2010/08/11/apache2-logrotate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ Recursive Directory Search Under Linux</title>
		<link>http://www.kerrywong.com/2009/06/12/c-recursive-directory-search-under-linux/</link>
		<comments>http://www.kerrywong.com/2009/06/12/c-recursive-directory-search-under-linux/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 21:55:29 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/?p=1154</guid>
		<description><![CDATA[I was trying to search for some code examples on how to do a recursive directory search under Linux using C++ the other day. But to my surprise, I could not find any place that offers a complete example. So I decided to post my code here after I created my own and hopefully you [...]]]></description>
			<content:encoded><![CDATA[<p>I was trying to search for some code examples on how to do a recursive directory search under Linux using C++ the other day. But to my surprise, I could not find any place that offers a complete example. So I decided to post my code here after I created my own and hopefully you will find it helpful.<span id="more-1154"></span></p>
<p>For those who are impatient, the function to perform recursive directory search is here:</p>
<pre class="brush: cpp;">
#include &lt;sys/types.h&gt;
#include &lt;sys/stat.h&gt;
#include &lt;dirent.h&gt;
#include &lt;errno.h&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;boost/regex.hpp&gt;

void GetFileListing(vector&lt;string&gt; &amp;files, string dir, string filter, bool ignoreCase) {
    DIR *d;
    if ((d = opendir(dir.c_str())) == NULL) return;
    if (dir.at(dir.length() - 1) != '/') dir += &quot;/&quot;;

    struct dirent *dent;
    struct stat st;
    boost::regex exp;

    if (ignoreCase)
        exp.set_expression(filter, boost::regex_constants::icase);
    else
        exp.set_expression(filter);

    while ((dent = readdir(d)) != NULL) {
        string path = dir;

        if (string(dent-&gt;d_name) != &quot;.&quot; &amp;&amp; string(dent-&gt;d_name) != &quot;..&quot;) {
            path += string(dent-&gt;d_name);
            const char *p = path.c_str();
            lstat(p, &amp;st);

            if (S_ISDIR(st.st_mode)) {
                GetFiles(files, (path + string(&quot;/&quot;)).c_str(), filter, ignoreCase);
            } else {
                if (filter == &quot;.*&quot;) {
                    files.push_back(path);
                } else {
                    if (boost::regex_match(string(dent-&gt;d_name), exp)) files.push_back(path);
                }
            }
        }
    }

    closedir(d);
}
</pre>
<p>I used <a href="http://www.boost.org">boost library</a> to perform regular expression matches for file names. If you just want to obtain a listing of all the files, you can do without using the boost library.</p>
<p>The following code snippet demonstrates how to use the function. The results are stored in a vector container passed in. Note that the &#8220;filter&#8221; parameter needs standard regular expressions (so if you are looking for any files, the expression should be  .* instead of just *) to work properly.</p>
<p>The code should be pretty self-explanatory. If <em>ignoreCase</em> is set to true, then the match will be case-insensitive.</p>
<pre class="brush: cpp;">
vector&lt;string&gt; files;

FileUtils::GetFiles(files,&quot;/tmp&quot;, &quot;.*&quot;, true);
for (int i = 0 ; i &lt; files.size(); i++) {
    cout &lt;&lt; files[i] &lt;&lt; endl;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2009/06/12/c-recursive-directory-search-under-linux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Timing Methods in C++ Under Linux</title>
		<link>http://www.kerrywong.com/2009/05/28/timing-methods-in-c-under-linux/</link>
		<comments>http://www.kerrywong.com/2009/05/28/timing-methods-in-c-under-linux/#comments</comments>
		<pubDate>Fri, 29 May 2009 01:23:38 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[RDTSC]]></category>
		<category><![CDATA[Timing]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/?p=1092</guid>
		<description><![CDATA[Measuring the execution time for code sections can be done in multiple ways in C++. Except for the time resolution issue, different timing methods worked relatively the same in single processor environment. As multi-core processors become more prevalent however, we need to be careful at choosing the correct timing mechanism as not all such routines [...]]]></description>
			<content:encoded><![CDATA[<p>Measuring the execution time for code sections can be done in multiple ways in C++. Except for the time resolution issue, different timing methods worked relatively the same in single processor environment. As multi-core processors become more prevalent however, we need to be careful at choosing the correct timing mechanism as not all such routines measure the wall time elapsed.<span id="more-1092"></span></p>
<p>Here I will examine a few commonly used method in measuring time intervals under Linux. All of the following timing routines are timed against the same OpenMP parallel for loop (on a quad-core CPU, the parallel for will spawn four concurrent threads).</p>
<h3>time()</h3>
<p>The <strong>time()</strong> function returns time with the accuracy to a second. So this function is generally useful for measuring long-running processes. </p>
<h3>clock()</h3>
<p>In single-core systems, <strong>clock()</strong> is often used for time measurements. The resolution of this timer is determined by <strong>CLOCKS_PER_SEC</strong> and is usually a microsecond. Since it determines the number of CPU clock cycles elapsed, it is not particularly useful in measuring time on a multi-core processor system when there are concurrent executing threads as the result of <strong>clock()</strong> function is the accumulation of CPU clocks across all active CPUs. On a quad-core system, if all cores are at full utilization then the result time is roughly four times the wall time.</p>
<h3>gettimeofday()</h3>
<p>Similar to the <strong>clock()</strong> function, <strong>gettimeofday()</strong> has a resolution up to one microsecond. As the function name suggests, <strong>gettimeofday()</strong> measures the wall time and thus is suitable for time measurement in multi-core, multi-cpu systems.</p>
<h3>rdtsc</h3>
<p>The <a href="http://en.wikipedia.org/wiki/Time_Stamp_Counter">time stamp counter</a> is available on most modern CPUs (since Pentium). There are many implementations based on <strong>rdtsc</strong> (e.g. on Windows systems, the Win32 API call <strong>QueryPerformanceCounter</strong>). Implementation based on <strong>rdtsc</strong> is generally very accurate (with resolution up to one nanosecond) but depending on implementation, its accuracy might be susceptible to CPU clock throttling (common in mobile CPUs). In my implementation below, the rdtsc results are divided by the CPU frequency. </p>
<blockquote><p>
grep &#8220;cpu MHz&#8221; /proc/cpuinfo  | cut -d&#8217;:&#8217; -f2
</p></blockquote>
<p>This implementation assumes that CPU frequency remains constant during operations, which could lead to poor accuracy should the CPU frequency change during the measurement. For desktop CPU though, this is less of a concern however.</p>
<h3>clock_gettime</h3>
<p>Like <strong>rdtsc</strong>, this function has a nanosecond accuracy and is available on all POSIX compliant systems.</p>
<p>Intel <a href="http://www.threadingbuildingblocks.org/">Threading Building Block</a> also provides a timer function <strong>tick_count::now()</strong> and the time can easily measured using the code snippet below:</p>
<pre class="brush: cpp;">
    t_start = tick_count::now();
    //statements
    t_end = tick_count::now();
    cout &lt;&lt; (t_end - t_start).seconds() * 1000 &lt;&lt; &quot; ms&quot; &lt;&lt; endl;
</pre>
<p>The following lists the code for time measuring using the methods mentioned above.</p>
<pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/time.h&gt;
#include &lt;time.h&gt;
#include &lt;ctime&gt;

using namespace std;

void Foo() {
#pragma omp parallel
    {
        for (long i = 0; i &lt; 50000; i++)
            for (long j = 0; j &lt; 50000; j++);
    }

}

unsigned long long rdtsc() {
    unsigned a, d;

    __asm__ volatile(&quot;rdtsc&quot; : &quot;=a&quot; (a), &quot;=d&quot; (d));

    return ((unsigned long long) a) | (((unsigned long long) d) &lt;&lt; 32);
}

void Time() {
    time_t t1, t2;

    time(&amp;t1);
    Foo();
    time(&amp;t2);

    cout &lt;&lt; &quot;time() : &quot; &lt;&lt; t2 - t1 &lt;&lt; &quot; s&quot; &lt;&lt; endl;
}

void Clock() {
    clock_t c1 = clock();
    Foo();
    clock_t c2 = clock();
    cout &lt;&lt; &quot;clock() : &quot; &lt;&lt; (float) (c2 - c1) / (float) CLOCKS_PER_SEC &lt;&lt; &quot; s&quot; &lt;&lt; endl;
}

void GetTimeOfDay() {
    timeval t1, t2, t;
    gettimeofday(&amp;t1, NULL);
    Foo();
    gettimeofday(&amp;t2, NULL);
    timersub(&amp;t2, &amp;t1, &amp;t);

    cout &lt;&lt; &quot;gettimeofday() : &quot; &lt;&lt; t.tv_sec + t.tv_usec / 1000000.0 &lt;&lt; &quot; s&quot; &lt;&lt; endl;
}

void RDTSC() {
    unsigned long long t1, t2;

    t1 = rdtsc();
    Foo();
    t2 = rdtsc();

    cout &lt;&lt; &quot;rdtsc() : &quot; &lt;&lt; 1.0 * (t2 - t1) / 3199987.0 / 1000.0 &lt;&lt; &quot; s&quot; &lt;&lt; endl;
}

void ClockGettime() {
    timespec res, t1, t2;
    clock_getres(CLOCK_REALTIME, &amp;res);

    clock_gettime(CLOCK_REALTIME, &amp;t1);
    Foo();
    clock_gettime(CLOCK_REALTIME, &amp;t2);

    cout &lt;&lt; &quot;clock_gettime() : &quot;
         &lt;&lt; (t2.tv_sec - t1.tv_sec)  + (float) (t2.tv_nsec - t1.tv_nsec) / 1000000000.0
         &lt;&lt; &quot; s&quot; &lt;&lt; endl;
}

int main() {
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout.precision(5);

    Time();
    Clock();
    GetTimeOfDay();

    RDTSC();
    ClockGettime();

    return (EXIT_SUCCESS);
}
</pre>
<p>And here is the output from my quad-core computer in debug mode.</p>
<blockquote><p>
time() :  6 s<br />
clock() : 21.85000 s<br />
gettimeofday() : 5.67368 s<br />
rdtsc() : 5.65957 s<br />
clock_gettime() : 5.65894 s
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2009/05/28/timing-methods-in-c-under-linux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>On Default Linux IO Priority</title>
		<link>http://www.kerrywong.com/2009/04/14/on-default-linux-io-priority/</link>
		<comments>http://www.kerrywong.com/2009/04/14/on-default-linux-io-priority/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 01:24:02 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/?p=956</guid>
		<description><![CDATA[If there is any thing I think Linux distributions can definitely improve upon is to reduce the default IO task priorities while running a Windows manager (e.g. GNOME or KDE). What I have found out over time is that the default IO priorities tend to cause the UI very sluggish when doing heavy IO operations [...]]]></description>
			<content:encoded><![CDATA[<p>If there is any thing I think Linux distributions can definitely improve upon is to reduce the default IO task priorities while running a Windows manager (e.g. GNOME or KDE).<span id="more-956"></span></p>
<p>What I have found out over time is that the default IO priorities tend to cause the UI very sluggish when doing heavy IO operations (e.g. copying files between disks, etc.). While this problem is not inherent to Linux (Linux is only the kernel), The default sluggish behavior under heavy IO conditions makes popular Linux distributions (e.g. Ubuntu) less user friendly than it should.</p>
<p>While using <strong>ionice</strong> <a href="http://digg.com/d1AWma">can solve this issue</a>, it isn&#8217;t very continent as it needs to be manually set every time the user performs heavy IO tasks. </p>
<p>It is true that the performance of the main-stream hard drives/and controllers (e.g. SATA) is partially responsible for the sluggishness of the UI response and higher end disk sub-systems like serial attached SCSI alleviate this problem to a certain degree, for Linux to really go main stream nevertheless, this problem should not be overlooked as SATA is the common disk sub-system almost all main-stream users have.</p>
<p>Since copying large files is such a common task nowadays, why couldn&#8217;t we just lower the default IO priority settings instead of relying on user to use <strong>ionice</strong>? In general, most end users care more about the UI responsiveness than the background disk throughput. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2009/04/14/on-default-linux-io-priority/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Image Class Based On IPP</title>
		<link>http://www.kerrywong.com/2009/04/10/an-image-class-based-on-ipp/</link>
		<comments>http://www.kerrywong.com/2009/04/10/an-image-class-based-on-ipp/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 00:34:55 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[FFT]]></category>
		<category><![CDATA[IPP]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/?p=935</guid>
		<description><![CDATA[A couple of weeks ago, I wrote about how to interface Integrated Performance Primitives (IPP) with Magick++. While IPP offers excellent performance advantages, it does not come with the easiest programming model. Fortunately, it is easy enough to create a C++ wrapper on top of IPP and provide an easier to use programming interface. In [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago, I wrote about <a href="/2009/03/17/interfacing-ipp-with-magick/">how to interface Integrated Performance Primitives (IPP) with Magick++</a>. While IPP offers excellent performance advantages, it does not come with the easiest programming model. Fortunately, it is easy enough to create a C++ wrapper on top of IPP and provide an easier to use programming interface.<span id="more-935"></span></p>
<p>In this article, I will show a simple example of creating a wrapper class using <a href="http://www.intel.com/cd/software/products/asmo-na/eng/302910.htm">IPP</a> and <a href="http://www.imagemagick.org/Magick%2B%2B/">Magick++</a>. The example I am going to show can be used to calculate the 2-dimensional FFT spectrum of a gray-scale image. This framework can be easily extended to include other algorithms that can be applied to an image using IPP.</p>
<p>Before I show the implementation details, let me first show how easy it is to use the class. The code snippet below shows how to read in an image file, apply 2D FFT with and without a Hamming window and save the results into image files.</p>
<pre class="brush: cpp;">
    IPPGrayImage *img, *img1;

    img = new IPPGrayImage();
    img-&gt;LoadFromFile(IMAGE_FILE);

    img1 = img-&gt;Clone();
    img1 = img1-&gt;FFT(true);
    img1-&gt;SaveToFile(IMAGE_HOME + &quot;/test_fftmag.jpg&quot;);
    img1 = img-&gt;Clone();
    img1 = img-&gt;ApplyHammingWindow();
    img1-&gt;SaveToFile(IMAGE_HOME + &quot;/test_hamming.jpg&quot;);
    img1 = img1-&gt;FFT(true);
    img1-&gt;SaveToFile(IMAGE_HOME + &quot;/test_fftmag_hamming.jpg&quot;);
</pre>
<p>And for the following IMAGE_FILE,<br />
<div id="attachment_941" class="wp-caption aligncenter" style="width: 266px"><a href="http://www.kerrywong.com/blog/wp-content/uploads/2009/04/testimg.jpeg"><img src="http://www.kerrywong.com/blog/wp-content/uploads/2009/04/testimg.jpeg" alt="Test image used for 2D FFT" title="Test Image" width="256" height="256" class="size-full wp-image-941" /></a><p class="wp-caption-text">Test image used for 2D FFT</p></div></p>
<p>Here are the results for FFT spectrum with and without hamming window:<br />
<div id="attachment_943" class="wp-caption aligncenter" style="width: 266px"><a href="http://www.kerrywong.com/blog/wp-content/uploads/2009/04/test_hamming.jpg"><img src="http://www.kerrywong.com/blog/wp-content/uploads/2009/04/test_hamming.jpg" alt="Hamming window applied" title="Hamming window applied" width="256" height="256" class="size-full wp-image-943" /></a><p class="wp-caption-text">Hamming window applied</p></div><br />
<div id="attachment_944" class="wp-caption aligncenter" style="width: 266px"><a href="http://www.kerrywong.com/blog/wp-content/uploads/2009/04/test_fftmag.jpg"><img src="http://www.kerrywong.com/blog/wp-content/uploads/2009/04/test_fftmag.jpg" alt="FFT spectrum (without Hamming window)" title="FFT spectrum (without Hamming window)" width="256" height="256" class="size-full wp-image-944" /></a><p class="wp-caption-text">FFT spectrum (without Hamming window)</p></div><br />
<div id="attachment_945" class="wp-caption aligncenter" style="width: 266px"><a href="http://www.kerrywong.com/blog/wp-content/uploads/2009/04/test_fftmag_hamming.jpg"><img src="http://www.kerrywong.com/blog/wp-content/uploads/2009/04/test_fftmag_hamming.jpg" alt="FFT spectrum with Hamming window" title="FFT spectrum with Hamming window" width="256" height="256" class="size-full wp-image-945" /></a><p class="wp-caption-text">FFT spectrum with Hamming window</p></div></p>
<p>The header file for the class is as follows:</p>
<pre class="brush: cpp;">
#ifndef IPPGRAYIMAGE_H
#define IPPGRAYIMAGE_H

#include &lt;Magick++/Image.h&gt;
#include &lt;Magick++.h&gt;
#include &lt;ipp.h&gt;

using namespace std;
using namespace Magick;

namespace KDW
{
    class IPPGrayImage
    {
    public:
        unsigned int PIXEL_SIZE;

        IPPGrayImage();
        IPPGrayImage(const unsigned int width, const unsigned int height);
        IPPGrayImage(Ipp32f *imgBuffer, const unsigned int width, const unsigned int height);
        IPPGrayImage(const IPPGrayImage&amp; other);
        virtual ~IPPGrayImage();
        IPPGrayImage&amp; operator=(const IPPGrayImage&amp; other);

        void LoadFromFile(string fileName);
        void SaveToFile();
        void SaveToFile(string fileName);

        inline float GetPixel(unsigned int col, unsigned int row) {return _imgBuffer[row * _width + col];}
        inline void SetPixel(unsigned int col, unsigned int row, float clr) {_imgBuffer[row * _width + col] = clr;}

        unsigned int GetWidth() { return _width;}
        unsigned int GetHeight() { return _height;}

        Ipp32f* GetImageBuffer() { return _imgBuffer;}
        Image* GetImage() { return _img;}

        IPPGrayImage* Clone();
        IPPGrayImage* ApplyHammingWindow();
        IPPGrayImage* FFT(bool fftShift = false);
    protected:
    private:
        unsigned int _width;
        unsigned int _height;

        Image* _img;
        Pixels* _view;
        PixelPacket* _pixels;
        Ipp32f* _imgBuffer;
        string _fileName;

        void Init();
    };
}
#endif // IPPGRAYIMAGE_H
</pre>
<p>And here&#8217;s the implementation for the class:</p>
<pre class="brush: cpp;">
#include &lt;assert.h&gt;
#include &lt;math.h&gt;

#include &quot;IPPGrayImage.h&quot;

namespace KDW
{
    /** @brief Constructor()
     *  Initialize image buffer.
     */
    IPPGrayImage::IPPGrayImage()
    {
        Init();
    }

    /** @brief Constructor(width, height)
     *  Initialize an image size of width x height.
     */
    IPPGrayImage::IPPGrayImage(const unsigned int width, const unsigned int height)
    {
        Init();

        _width = width;
        _height = height;

        int stepByte = 0;
        _imgBuffer = ippiMalloc_32f_C1(_width, _height, &amp;stepByte);
    }

    /** @brief Constructor(imgBuffer, width, height)
     *  Initilize from an Ipp32f buffer (width x height)
     */
    IPPGrayImage::IPPGrayImage(Ipp32f *imgBuffer, const unsigned int width, const unsigned int height)
    {
        Init();

        _width = width;
        _height = height;
        _imgBuffer = imgBuffer;
    }

    /** @brief Copy Constructor
     */
    IPPGrayImage::IPPGrayImage(const IPPGrayImage&amp; other)
    {
        _width = other._width;
        _height = other._height;

        int stepByte = 0;

        _imgBuffer = ippiMalloc_32f_C1(_width, _height, &amp;stepByte);

        for (unsigned int row = 0; row &lt; _height ; row++)
        {
            for (unsigned int column = 0; column &lt; _width ; column++)
            {
                _imgBuffer[column + row * _width] =other._imgBuffer[column + row * _width];
            }
        }

        if (other._pixels == NULL) _pixels = NULL;
    }

    /** @brief Overload =
     */
    IPPGrayImage&amp; IPPGrayImage::operator=(const IPPGrayImage&amp; rhs)
    {
        if (this == &amp;rhs) return *this; // handle self assignment

        return *this;
    }

    /**
     * @brief Destructor
     */
    IPPGrayImage::~IPPGrayImage()
    {
        ippFree(_imgBuffer);
        delete _img;
        delete _view;
    }

    /**
     * @brief Common initialization code
     */
    void IPPGrayImage::Init()
    {
        PIXEL_SIZE = sizeof(Ipp32f);
        _pixels = NULL;
        _imgBuffer = NULL;
        _img = NULL;
    }

    /** @brief Load an image from file
      */
    void IPPGrayImage::LoadFromFile(string fileName)
    {
        _img = new Image(fileName);
        Geometry g = _img-&gt;size();

        _width = g.width();
        _height= g.height();

        _view = new Pixels(*_img);
        _pixels = _view-&gt;get(0,0, _width, _height);

        int stepByte = 0;
        _imgBuffer = ippiMalloc_32f_C1(_width, _height, &amp;stepByte);

        for (unsigned int row = 0; row &lt; _height ; row++)
        {
            for (unsigned int column = 0; column &lt; _width ; column++)
            {
                PixelPacket *p = &amp;_pixels[column + row * _width];
                Color c = Color(p-&gt;red, p-&gt;green, p-&gt;blue);
                _imgBuffer[column + row * _width] = c.intensity();
            }
        }
    }

    /** @brief Save the current image buffer to file
      */
    void IPPGrayImage::SaveToFile()
    {
        SaveToFile(&quot;&quot;);
    }

    /** @brief SaveToFile(fileName)
     *  Saves the current image buffer to a file (by file name).
     */
    void IPPGrayImage::SaveToFile(string fileName)
    {
        if (_img != NULL &amp;&amp; _pixels != NULL)
        {
            for (unsigned int y = 0; y&lt; _height ; y++)
            {
                for (unsigned int x = 0; x &lt; _width; x++)
                {
                    float clr = (float) _imgBuffer[x + y * _width];
                    _pixels[x+ y * _width] = Color(clr, clr, clr);
                }
            }
            _view-&gt;sync();
            _img-&gt;syncPixels();

            if (fileName == &quot;&quot;)
            {
                _img-&gt;write(_fileName);
            }
            else
            {
                _img-&gt;write(fileName);
            }
        }
        else
        {
            Image img(Geometry(_width, _height),&quot;white&quot;);

            for (unsigned int y = 0; y&lt; _height ; y++)
            {
                for (unsigned int x = 0; x &lt; _width; x++)
                {
                    Color c;
                    float clr = (float) _imgBuffer[x + y * _width];
                    img.pixelColor(x,y, Color(clr, clr, clr));
                }
            }

            img.write(fileName);
        }
    }

    /** @brief Clone
    *   Duplicate the current image to another IPPGrayImage object.
    *   @return an IPPGrayImage pointer to the cloned image
    */
    IPPGrayImage* IPPGrayImage::Clone()
    {
        IPPGrayImage *newImg;

        newImg = new IPPGrayImage(_width, _height);

        int stepByte = 0;
        newImg-&gt;_imgBuffer = ippiMalloc_32f_C1(_width,_height, &amp;stepByte);

        for (unsigned int y = 0 ; y &lt; _height ; y++)
        {
            for (unsigned int x = 0 ; x &lt; _width ; x++)
            {
                newImg-&gt;_imgBuffer[x + y * _width] = _imgBuffer[x + y * _width];
            }
        }

        return newImg;
    }

    /** @brief Apply Hamming window to the image
     *  @return an IPPGrayImage pointer to the processed image
     */
    IPPGrayImage* IPPGrayImage::ApplyHammingWindow()
    {
        IPPGrayImage *newImg;
        newImg = new IPPGrayImage(_width , _height);
        IppiSize srcImgSize = {_width, _height};

        IppStatus sts;
        int stepByte;
        Ipp32f *imgCache = ippiMalloc_32f_C1(_width , _height , &amp;stepByte);

        sts = ippiWinHamming_32f_C1R(_imgBuffer, _width * PIXEL_SIZE, imgCache, _width * PIXEL_SIZE, srcImgSize);
        assert(sts ==ippStsNoErr);

        for (unsigned int y = 0; y&lt; _height; y++)
        {
            for (unsigned int x = 0; x &lt; _width; x++)
            {
                newImg-&gt;_imgBuffer[x+ y * _width] = imgCache[x + y * _width];
            }
        }

        return newImg;
    }

    /** @brief Perform FFT on the image and returns the magnitude component
     *  @param fftShift: if it is true, the the result is with
     *         zero-frequency component shifted to center of spectrum
     *  @return the magnitude FFT component
     */
    IPPGrayImage* IPPGrayImage::FFT(bool fftShift)
    {
        IPPGrayImage *newImg;
        IppiFFTSpec_R_32f *spec;
        IppStatus sts;

        unsigned int n = (int) (logf((float) _width) / logf(2.0f));
        unsigned int m = (int) (logf((float) _height) / logf(2.0f));

        unsigned int N = pow(2, n);
        unsigned int M = pow(2, m);

        if (N &lt; _width)
        {
            n = n + 1;
            N = pow(2, n);
        }

        if (M &lt; _height)
        {
            m = m + 1;
            M = pow(2, m);
        }

        int stepByte;
        Ipp32f *src = ippiMalloc_32f_C1(M , N , &amp;stepByte);
        Ipp32f *dst = ippiMalloc_32f_C1(M , N , &amp;stepByte);
        Ipp32f *mag = ippiMalloc_32f_C1(M , N , &amp;stepByte);

        IppiSize srcImgSize = {_width, _height};
        IppiSize dstImgSize = {N, M};

        sts = ippiCopyConstBorder_32f_C1R(
                  _imgBuffer, _width * PIXEL_SIZE, srcImgSize,
                  src,  N * PIXEL_SIZE, dstImgSize,
                  0,0,0);
        assert(sts ==ippStsNoErr);

        sts = ippiFFTInitAlloc_R_32f(&amp;spec, n , m, IPP_FFT_DIV_BY_SQRTN, ippAlgHintAccurate);
        assert(sts ==ippStsNoErr);

        sts = ippiFFTFwd_RToPack_32f_C1R(src, N*PIXEL_SIZE, dst, N*PIXEL_SIZE, spec, 0);
        assert(sts ==ippStsNoErr);

        sts = ippiMagnitudePack_32f_C1R(dst, N*PIXEL_SIZE, mag, N*PIXEL_SIZE, dstImgSize);
        assert (sts ==ippStsNoErr);

        newImg = new IPPGrayImage(N , M);

        if (fftShift)
        {
#pragma omp sections
            {
#pragma omp section
                {
                    for (unsigned int y = 0 ; y &lt; M/2; y++)
                    {
                        for (unsigned int x = 0 ; x &lt; N/2; x++)
                        {
                            newImg-&gt;_imgBuffer[x+ y *N] = mag[x + N/2 + (y + M/2) * N];
                        }
                    }
                }
#pragma omp section
                {
                    for (unsigned int y = 0 ; y &lt; M/2; y++)
                    {
                        for (unsigned int x = N/2 ; x &lt; N; x++)
                        {
                            newImg-&gt;_imgBuffer[x+ y *N] = mag[x - N/2 + (y + M/2) * N];
                        }
                    }
                }
#pragma omp section
                {
                    for (unsigned int y = M/2 ; y &lt; M; y++)
                    {
                        for (unsigned int x = 0 ; x &lt; N/2; x++)
                        {
                            newImg-&gt;_imgBuffer[x+ y *N] = mag[x + N/2 + (y - M/2) * N];
                        }
                    }
                }
#pragma omp section
                {
                    for (unsigned int y = M/2 ; y &lt; M; y++)
                    {
                        for (unsigned int x = N/2 ; x &lt; N; x++)
                        {
                            newImg-&gt;_imgBuffer[x+ y *N] = mag[x - N/2 + (y - M/2) * N];
                        }
                    }
                }
            }
        }
        else
        {
            for (unsigned int y = 0; y&lt; M; y++)
            {
                for (unsigned int x = 0; x &lt;N; x++)
                {
                    newImg-&gt;_imgBuffer[x+ y * N] = mag[x + y * N];
                }
            }

        }

        return newImg;
    }
}
</pre>
<p>The above example showed only the FFT function, but virtually all IPP image routines can be accommodated using the wrapper image class above. Intel IPP utilizes many different data types (e.g. Ipp8u, Ipp16s, Ipp32f etc.), but to provide most of the flexibility and compatibility I chose to use only the 32 bit floating data type. For specific implementations, other data types can be used as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2009/04/10/an-image-class-based-on-ipp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Obstacles to Linux Going Mainstream</title>
		<link>http://www.kerrywong.com/2009/03/29/the-obstacles-to-linux-going-mainstream/</link>
		<comments>http://www.kerrywong.com/2009/03/29/the-obstacles-to-linux-going-mainstream/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 01:30:37 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/?p=889</guid>
		<description><![CDATA[It was almost one year ago when I switched my main home computer to Linux. Since then, I have been using my Ubuntu 8.04 installation daily and have not found the need to boot up Windows at all. While personally I see Linux and other UNIX variants as strong candidates to have the possibility to [...]]]></description>
			<content:encoded><![CDATA[<p>It was <a href="/2008/06/14/linux-only-two-months-later/">almost one year ago</a> when I switched my main home computer to Linux. Since then, I have been using my Ubuntu 8.04 installation daily and have not found the need to boot up Windows at all.<span id="more-889"></span></p>
<p>While personally I see Linux and other UNIX variants as strong candidates to have the possibility to eventually replace Windows in both the consumer domain and the enterprise domain, it seems that this sea change is not going to happen any time soon as <a href="http://www.linux-foundation.org/weblogs/jzemlin/2008/10/29/linux-to-ship-on-more-desktops-than-windows/">predicted by some</a>.</p>
<p>Today although Linux is widely used in the server market, in the consumer domain it remains a niche market, accounting for <a href="http://news.cnet.com/8301-13505_3-9910263-16.html">just around 2% of market shares</a>. Even thought the current economic down turn had sped up Linux&#8217;s adoption, it is still too small to make any significant impact on the overall consumer OS landscape.</p>
<p>Don&#8217;t get me wrong, I think that Linux is an excellent operating systems and in fact I think that it is a perfect Windows replacement for all the technical folks and certainly geeks. But the following issues remain some of the big obstacles for the normal consumers.</p>
<h4>Codec</h4>
<p>This is not the problem of Linux per se. Due to the open source nature and the various legal reasons, most free Linux distributions (e.g. <a href="http://www.ubuntu.com/">Ubuntu</a>, <a href="http://www.opensuse.org">openSUSE</a>)  do not come with popular codecs (e.g. the codecs for playing back MP3&#8242;s and WMV files) installed. While for geeks it might be quite trivial to dig around in the vast Linux application repositories and find the exact codecs needed in a matter of minutes, the average Joes might have a hard time figuring out why his favorite DVD won&#8217;t play on his Linux system.</p>
<h4>Consumer Applications</h4>
<p>This gap has been closing rapidly over the years. Now we have <a href="http://www.mozilla.com/en-US/firefox/firefox.html">FireFox</a>, <a href="http://www.mozillamessaging.com/en-US/thunderbird/">Thunderbird</a>, <a href="http://openoffice.org">OpenOffice</a> and many other productivity applications come as standard in almost all popular distros. And even some professional software suites have their alternatives in the Linux World. For example, <a href="http://www.gimp.org/">GIMP</a> is a capable replacement for Adobe Photoshop. However, many of the most popular consumer software products remains missing on the Linux platform. Computer game is one of them. While I do not play computer games, many people would like to use their PCs to play some popular games occasionally. And to some, because of these Windows only and no Linux equivalent applications, there is no alternative but to use Windows.</p>
<h4>Drag and Drop</h4>
<p>For those who are used to Windows, drag and drop seems to be a given. All most all applications in Windows support drag and drop, but on Linux such support is inconsistent at best.</p>
<h4>Copy and Paste</h4>
<p>This is another area frustrates a lot of Windows users. In Windows, copy and paste pretty much works among all the applications. In Linux however, it does not always work and sometimes</p>
<h4>The Command Line</h4>
<p>Most Linux distributions use BASH. For seasoned users, using the command line is just as convenient if not more so than using a GUI equivalent application. In fact I personally prefer the &#8220;terminal&#8221; as it gave me the most flexibility and none of the overhead. But we can not expect every user has the same level of comfort with the command line environment. </p>
<p>I just mentioned a few areas where I think are among some of the main obstacles to the broad adoption of Linux. And most of these are interoperability issues which are not going to be resolved anytime soon. To the advanced users, most of these issues are pretty minor and there are many ways to work around. But to the average users who have accustomed to the consistencies within the system,  even minor incontinence can mean a show stopper. </p>
<p>With all that said, I have found Linux to be a very attractive platform. While Linux might not be able to replace the proprietary Windows anytime soon for the reasons I discussed above, it has seeded deeply inside many people who believe in the free software movement and I am hopeful that one day we will see the OS world dominated by open source software, be it Linux or something else.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2009/03/29/the-obstacles-to-linux-going-mainstream/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>On The Origin of Linux</title>
		<link>http://www.kerrywong.com/2009/02/16/on-the-origin-of-linux/</link>
		<comments>http://www.kerrywong.com/2009/02/16/on-the-origin-of-linux/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 00:39:57 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Linus]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Origin]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/?p=542</guid>
		<description><![CDATA[I stumbled upon this Linus video about the origin of Linux on YouTube the other day. I think this is such an excellent video that you should definitely take a look, whether you are a Linux fan or not and whatever your impression of Linus is (I think a lot of people only know him [...]]]></description>
			<content:encoded><![CDATA[<p>I stumbled upon this Linus video about <a href="http://www.youtube.com/watch?v=WVTWCPoUt8w">the origin of Linux</a> on YouTube the other day. I think this is such an excellent video that you should definitely take a look, whether you are a Linux fan or not and whatever your impression of Linus is (I think a lot of people only know him by <a href="http://www.businessreviewonline.com/os/archives/2008/06/the_10_best_lin.html">a few quotes</a> and not necessarily understand his philosophies.).<span id="more-542"></span></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/WVTWCPoUt8w&#038;hl=en&#038;fs=1&#038;color1=0x006699&#038;color2=0x54abd6"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/WVTWCPoUt8w&#038;hl=en&#038;fs=1&#038;color1=0x006699&#038;color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2009/02/16/on-the-origin-of-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MIDI Setup with OSS and ALSA</title>
		<link>http://www.kerrywong.com/2008/12/14/midi-setup-with-oss-and-alsa/</link>
		<comments>http://www.kerrywong.com/2008/12/14/midi-setup-with-oss-and-alsa/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 01:11:45 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[ALSA]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MIDI]]></category>
		<category><![CDATA[OSS]]></category>
		<category><![CDATA[setup]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/?p=455</guid>
		<description><![CDATA[Setting up the hardware environment to support MIDI devices is relatively easy. in fact, most newer MIDI devices do not rely on the old sound card game port and adding a MIDI device is just like adding an external hard drive. The reason I had to resort to a dual sound card setup is because [...]]]></description>
			<content:encoded><![CDATA[<p>Setting up the hardware environment to support MIDI devices is relatively easy. in fact, most newer MIDI devices do not rely on the old sound card game port and adding a MIDI device is just like adding an external hard drive. The reason I had to resort to a <a href="/2008/12/09/a-dual-sound-card-setup/">dual sound card setup</a> is because my MIDI keyboard (MK-4903) is more than ten years old and it only has a game port interface.<span id="more-455"></span>As I mentioned earlier, the resources I could find on the Internet on Linux MIDI device support are few and far between. A couple of good ones I found are this one (<a href="http://www.linux-magazine.com/issues/2008/88/making_music">Making Music</a>) on <a href="http://www.linux-magazine.com">Linux Magazine</a> and this one (<a href="http://www.lesbell.com.au/Home.nsf/b8ec57204f60dfcb4a2568c60014ed0f/c4b39482154feb03ca256f8100150ad9?OpenDocument">Getting Started with MIDI on Linux</a>). Here I will show how to configure under Ubuntu 8.04.</p>
<p>Since my MIDI keyboard uses the game port interface on my Sound Blaster Live! sound card, there is no need to load any firmware. After the sound card is recognized by the system, you will find a<strong><em> /dev/midi </em></strong>device (for some reason, my midi device would change between <strong>/dev/midi </strong>and<strong> /dev/midi1</strong> once a while, but this only happens when I access the midi device using <em><strong>jack</strong></em>). Without any additional software, you should be able to do a<strong><em> cat /dev/midi</em></strong> and see some &quot;random&quot; characters printed on the console whenever you press a key on the MIDI keyboard. Even without touching the MIDI keyboard, you should still see characters get printed in the console at a rate of 3 to 5 characters per second. Alternatively, you could use <em><strong>amidi &#8211;dump</strong></em> and when a key is pressed some hex values should be displayed.</p>
<p>After confirmed that the MIDI device is working properly, we can move on to setting up the software environment. Most of the aforementioned articles are concentrated on connecting to MIDI devices using <a href="http://en.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture">ALSA</a>. What I have found out though is that using <a href="http://en.wikipedia.org/wiki/Open_Sound_System">OSS</a> is much easier.</p>
<p>Various sources have suggested that connecting MIDI devices using ALSA have very low-latency (e.g. the time between when a key is pressed and the note is played) and thus is the preferred method. But for modern computers, this kind of latencies have rarely been a problem. There might be some difference in terms of latency between using ALSA and using OSS but they are not observable in my case.</p>
<p>To use OSS, all you need to do is to choose the correct option in <em><strong>qsynth</strong></em>:</p>
<p align="center"><img src="/blog/wp-content/uploads/2008/12/qsynth_setting1.png" alt="qsynth setting 1" /></p>
<p align="center"><em><strong>qsynth</strong></em> settings 1</p>
<p align="center"><img src="http://www.kerrywong.com/blog/wp-content/uploads/2008/12/qsynth_setting2.png" alt="qsynth settings 2" /></p>
<p align="center"><em><strong>qsynth</strong></em> settings 2</p>
<p align="left">If you have multiple sound cards configured like in my case, you can select from which sound card you want the sound to be outputted (e.g. <strong>/dev/audio</strong> or<strong> /dev/audio1</strong> etc.). The sound does not have to be produced on the same card where the MIDI device is connected. In fact, using a single sound card as the output device might be the most attractive solution since otherwise you will need to have one pair of speakers connects to each of the soundcard output. In my case, the Sound Blaster Live! card is only used for it&#8217;s game port to connect with my MIDI keyboard.</p>
<p align="left">After you have successfully restarted <em><strong>qsynth</strong></em>, you should be able to hear sound when you press on the MIDI keyboard and you should see the indicator on <em><strong>qsynth</strong></em> flashing, indicating that MIDI signal was received.</p>
<p align="center"><img src="/blog/wp-content/uploads/2008/12/qsynth.png" alt="" /></p>
<p align="center"><em><strong>qsynth</strong></em></p>
<p>If you see activities from qsynth but there is no sound coming out then chances are that you have chosen the wrong sound card as the output device. Note that you will have to first load a Sound Font into <em><strong>qsynth</strong></em>, otherwise you will not hear any sound either. A few popular Sound Fonts can be downloaded from <a href="http://www.personalcopy.com/linuxfiles.htm">here</a>.</p>
<p>MIDI Setup with ALSA requires a bit more work. First you need to start the jack daemon (<em><strong>jack -d alsa</strong></em>), or you could use the GUI Jack Control. Then you can start <strong>rosegarden</strong>. If you have timidity installed you you should be able to use timidity&#8217;s port (usually 128:0) as midi device port. If you are not sure, you could use <em><strong>pmidi -l</strong></em> to find out (this shows what my configuration looks like):</p>
<p>&nbsp;Port&nbsp;&nbsp;&nbsp;&nbsp; Client name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Port name<br />
&nbsp;14:0&nbsp;&nbsp;&nbsp;&nbsp; Midi Through&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Midi Through Port-0<br />
&nbsp;20:0&nbsp;&nbsp;&nbsp;&nbsp; SBLive! Value [CT4780]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMU10K1 MPU-401 (UART)<br />
<strong style="background-color: rgb(255, 255, 0);">&nbsp;21:0&nbsp;&nbsp;&nbsp;&nbsp; Emu10k1 WaveTable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Emu10k1 Port 0</strong><br />
&nbsp;21:1&nbsp;&nbsp;&nbsp;&nbsp; Emu10k1 WaveTable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Emu10k1 Port 1<br />
&nbsp;21:2&nbsp;&nbsp;&nbsp;&nbsp; Emu10k1 WaveTable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Emu10k1 Port 2<br />
&nbsp;21:3&nbsp;&nbsp;&nbsp;&nbsp; Emu10k1 WaveTable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Emu10k1 Port 3<br />
<strong style="background-color: rgb(255, 255, 0);">128:0&nbsp;&nbsp;&nbsp;&nbsp; TiMidity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TiMidity port 0</strong><br />
128:1&nbsp;&nbsp;&nbsp;&nbsp; TiMidity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TiMidity port 1<br />
128:2&nbsp;&nbsp;&nbsp;&nbsp; TiMidity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TiMidity port 2<br />
128:3&nbsp;&nbsp;&nbsp;&nbsp; TiMidity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TiMidity port 3</p>
<p>You can use either the Emu10k1 ports (21:x) or TiMidity ports (128:x) as output.</p>
<p>Since Sound Blaster Live! utlizates hardware based SoundFont, you must load appropriate SoundFont onto the board before you can hear any playback. Due to the on-board memory limitations, not all SoundFonts can be loaded onto Sound Blaster Live! <a href="http://alsa.opensrc.org/8MBGMSFX.SF2">Here is an 8MB version of the Creative Sound Font</a> that you can use with Sound Blaster Live!. To load the sound font use the following command:</p>
<p><em><strong>sfxload 8MBGMSFX.SF2</strong></em> (assuming that the Sound Font is located in the current directory)</p>
<p>For more detailed MIDI setup using ALSA you can refer to the two articles I mentioned. What I have found is that the MIDI environment using jack is not always stable. For instance, I could instantiate the ALSA sound driver using jackd but not directly with jack GUI. And once a while jack would lock up. Another problem is that the MIDI device name seemed to change back and forth between <em><strong>/dev/midi</strong></em> and<em><strong> /dev/midi1 </strong></em>whenever I was using jack. This might be because the fact that I am using two sound cards though. Anyway, since the performance of using OSS turned out to be quite good I did not investigate the ALSA issue much further&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2008/12/14/midi-setup-with-oss-and-alsa/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Olympics, Linux</title>
		<link>http://www.kerrywong.com/2008/08/24/330/</link>
		<comments>http://www.kerrywong.com/2008/08/24/330/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 02:12:49 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/2008/08/24/330/</guid>
		<description><![CDATA[I have to admit, not being able to watch Olympics on Linux is truly disappointing (I,II).&#160; I had thought that someone would come up with a solution so that Linux users could also watch the game without having to do so on windows machines. Well, the game has come and gone and apparently Linux users [...]]]></description>
			<content:encoded><![CDATA[<p>I have to admit, not being able to watch Olympics on Linux is truly disappointing (<a href="http://latimesblogs.latimes.com/webscout/2008/08/nbcs-olympic-we.html">I</a>,<a href="http://blogs.zdnet.com/perlow/?p=9214">II</a>).<span id="more-330"></span>&nbsp; I had thought that someone would come up with a solution so that Linux users could also watch the game without having to do so on windows machines. Well, the game has come and gone and apparently Linux users are mostly left out in the dark.</p>
<p>It seems to me that this is more of a nasty business technique&nbsp; than technical limitations. The following message is what I got when trying to view games on <a href="http://www.nbcolympics.com/">nbcolympics </a>site (Firefox under Linux):</p>
<div align="center"><img alt="" src="/blog/wp-content/uploads/2008/08/nbco_linux.jpg" />&nbsp;</div>
<p>I do not think there is any technical reasons to limit access to just Windows and Mac OS X since we all know that Flash runs on virtually all known operating systems. </p>
<p>Trying to watch the game on a Windows computer is not without issues either. When I used IE I got constantly reminded that installing Silver Light would give me better experience. If this is annoying, then trying watch the game with Firefox on Windows. This is the message I got:</p>
<div align="center">
<input type="image" src="/blog/wp-content/uploads/2008/08/nbco_windows_firefox.jpg" /></div>
<p>
As you can see, I was not even offered the Flash player option! </p>
<p>To me, trying to use one&#8217;s market dominance to bully people into using its product is simply unacceptable. While at the end of the day someone over Redmond can claim victory, we shall all realize that this is done via unfair competition and not by product superiority.&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2008/08/24/330/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux Only, Two Months Later</title>
		<link>http://www.kerrywong.com/2008/06/14/linux-only-two-months-later/</link>
		<comments>http://www.kerrywong.com/2008/06/14/linux-only-two-months-later/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 01:51:00 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/2008/06/14/linux-only-two-months-later/</guid>
		<description><![CDATA[Since I built my new PC roughly two months ago, I have been running Linux (Ubuntu 8.04 64 bit) as my primary operating system, and I have not looked back. While in the past I have always had machines running Linux (or FreeBSD) at home, my primary PC had always been a Windows PC. But [...]]]></description>
			<content:encoded><![CDATA[<p>Since I built my new PC roughly <a href="/2008/04/12/some-pictures-of-my-new-rig/">two months</a> ago, I have been running Linux (Ubuntu 8.04 64 bit) as my primary operating system, and I have not looked back.<span id="more-309"></span></p>
<p>While in the past I have always had machines running Linux (or FreeBSD) at home, my primary PC had always been a Windows PC. But when I made the switch to a true 64-bit environment, Linux made perfect sense. My old PC was running Windows XP 32 bit, in order to take advantage of the 8 GB memory installed in my new machine, I had to move to a 64 bit OS. So my choices were either to buy a copy of Windows XP 64 bit (Vista? <a href="/2007/02/14/will-i-switch-to-vista/">No thanks</a>.) or use the freely available 64 bit Linux. And the choice was quite easy to make.</p>
<p>So, I decided to go with the most popular distro &#8211; <a href="http://www.ubuntu.com">Ubuntu</a>. In fact I could have easily chosen <a href="http://www.opensuse.org">openSUSE</a>, or even <a href="http://www.freebsd.org/">FreeBSD</a> (which is based on BSD UNIX) since my previous experience with them were quite positive as well. At first I did have some question whether or not I would be able to do the majority of my work on Linux, without having to constantly turning to a Windows PC. As it turned out, those worries were totally unnecessary. For the past two months, I had been using Linux almost exclusively at home except for a few moments when I needed to test something in Visual Studio .Net.</p>
<p>For web browsing, I use <a href="http://www.mozilla.com/">Firefox</a> 64 bit, since there&#8217;s no 64bit Flash available for 64 bit Linux yet, I installed the 32 bit version as well. The default email client GNOME supplies is Evolution, which is quite powerful. Unfortunately, it could only import my outlook mail hierarchical Inbox folder structures into a single folder. So for my mail client, I chose Mozilla&#8217;s Thunderbird instead. For word editing, <a href="http://www.openoffice.org/">OpenOffice</a> 3.0 is an excellent choice. In fact, I personally found it quite comparable to Microsoft Office 2007, and most Office documents can be opened/edited without any issues.</p>
<p>Since I like many of the tools provided in <a href="http://www.kde.org">KDE</a>, I installed the KDE environment as well (the alternative would be to install <a href="http://www.kubuntu.org">Kbuntu</a> first and install GNOME based tools later, but it really doesn&#8217;t matter, this is the beauty of the versatilities of Linux). The default simple text editing tool (gedit in GNOME/kedit in KDE) is quite powerful compare to Windows&#8217; notepad. The syntax highlighting capability is built in. For viewing PDF documents, I use kpdf, the KDE version of the PDF/PS file viewer. If you are used to the sluggish performance of Adobe&#8217;s Acrobat Reader, you&#8217;ll be surprised to find how snappy kpdf is.</p>
<p>I use K3b (KDE&#8217;s CD/DVD creator) to burn CD and DVD discs. K3b&#8217;s features rival most of the commercial CD/DVD authoring programs in the Windows world. In terms of media playback, Ubuntu handles almost all media formats out-of-box, even proprietary formats like wmv can be easily accommodated with a single mouse click. And for photo editing, I use GIMP, which is rather easy to use and almost as powerful as Photoshop.</p>
<p>For software development, I use <a href="http://www.codeblocks.org/">Code::Blocks</a> and KDevelop for C++ applications, <a href="http://www.monodevelop.org">MonoDevelop</a> for C# programs. Occasionally I needed to research some work related programming issues. Since some of these issues are Windows specific, I would fire up an instance of Windows XP (or Windows Vista) within <a href="http://www.vmware.com/products/server/">VMWare Server</a> and use Visual Studio from there.</p>
<p>There hasn&#8217;t been a single instance where I couldn&#8217;t do something conveniently in Linux for the past two months. In fact, for the majority of the stuff I do I felt that Linux was actually easier. There are a few rough edges, of course. For example, copy and paste sometimes do not play well between GNOME and KDE applications and the Flash play back performance under Linux is far inferior then under Windows. But it does not matter to me that much (I block flash content on my Windows PC anyway).&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2008/06/14/linux-only-two-months-later/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello Hardy Heron</title>
		<link>http://www.kerrywong.com/2008/04/26/hello-hardy-heron/</link>
		<comments>http://www.kerrywong.com/2008/04/26/hello-hardy-heron/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 01:38:01 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/2008/04/26/hello-hardy-heron/</guid>
		<description><![CDATA[After building my new quad-core computer (1, 2, 3), it was time for me to choose an operating system.In the past, I have been using both Windows and Linux on my home computers. But my primary PC has always been running Windows. The main reason was that I needed to use Visual Studio and running [...]]]></description>
			<content:encoded><![CDATA[<p>After building my new quad-core computer (<a href="/2008/04/11/my-q9450-arrived/">1</a>, <a href="/2008/04/12/some-pictures-of-my-new-rig/">2</a>, <a href="/2008/04/14/q9450-initial-oc-result/">3</a>), it was time for me to choose an operating system.<span id="more-286"></span>In the past, I have been using both Windows and Linux on my home computers. But my primary PC has always been running Windows. The main reason was that I needed to use Visual Studio and running it under a virtual machine was not ideal since the resource requirement was high. This time however, I have decided to move my main OS to Linux.</p>
<p>During the past couple of weeks, I have been playing with <a href="http://www.ubuntu.com">Ubuntu</a> 8.04 (Hardy Heron) beta version and I was pretty happy with the results so as soon as Ubuntu 8.04 was released last Thursday, I downloaded the image and installed on my PC.</p>
<p>I am happy to report that Ubuntu 8.04 recognized all the hardware (see the list <a href="/2008/04/11/my-q9450-arrived/">here</a>) with no issues. And the 2.6.24 kernel fully supports Q9450 and X38 chipset. The included proprietary new nVidia driver supports my 8600 GT graphic card with no problem and I could run Beryl desktop smoothly.</p>
<p>There are a few rough edges however. In beta versions, when I booted Ubuntu, the startup logo was correctly stretched to fit the entire screen (wide screen), but the production code somehow swapped to a 4:3 mode which is kind of annoying. The major issue though is with nautilus. Everything works fine in default mode (icon view), but as soon as I change the settings to list view, dragging and dropping would cause the whole system to lock up. I noticed this behavior in beta builds and had thought that it would be resolved in the production version. So for now, I will use the default setting.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2008/04/26/hello-hardy-heron/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NTFS Partition Recovery With Linux</title>
		<link>http://www.kerrywong.com/2008/03/16/ntfs-partition-recovery-with-linux/</link>
		<comments>http://www.kerrywong.com/2008/03/16/ntfs-partition-recovery-with-linux/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 02:20:10 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NTFS]]></category>
		<category><![CDATA[Recovery]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/2008/03/16/ntfs-partition-recovery-with-linux/</guid>
		<description><![CDATA[Over the years, I have formed the habit of keeping an up-to-date backup copy of all my critical data on a regular basis. But due to some project deadlines, I have given myself a good excuse not to follow that routine recently. After all, I haven&#8217;t lost any data due to hard drive failures for [...]]]></description>
			<content:encoded><![CDATA[<p>Over the years, I have formed the habit of keeping an up-to-date backup copy of all my critical data on a regular basis.<span id="more-272"></span> But due to some project deadlines, I have given myself a good excuse not to follow that routine recently. After all, I haven&#8217;t lost any data due to hard drive failures for more than ten years now and what are the chances that my trust-worthy Western Digital WD2500JD hard drive would fail me? So, I have not made any backups for the past two months.</p>
<p>And of course, it happened. Last Thursday evening after installing some routine system updates, I rebooted my computer. But instead of the familiar log-in screen, I was greeted by a seemingly endless reboot. At first, I thought that maybe the latest security updates had messed up something so I hit F8 and tried to boot into safe mode. But again, the computer kept rebooting half-way through the startup process. Since I had Windows XP installed on another hard drive, I booted up XP trying to figure out the problem. And it seemed that the Windows 2003 Server drive had failed. The system seemed to unable to identify the hard drive and I could here the dreadful clicking sound from the Windows 2003 drive.</p>
<p>I powered off my computer immediately. The first thought came across my mind was to create a disk image of the failed drive so that I could always get back to the state right after it failed.</p>
<p>To do this, I booted into SUSE Linux (yet another OS on a third hard drive), and used <a href="http://www.novell.com/products/linuxpackages/suselinux/ddrescue.html">dd_rescue</a> to create an disk image onto a 320GB external hard drive. Luckily, the drive image was created without any fuss. I then tried to mount the failed disk normally to /windows/D, but it was unsuccessful. After getting a bunch of error messages, the partitioned seemed to be mounted. But the system was only seeing 14G of empty space. I then tried to mount the partition as read-only. After some delay and clicking sound, I was able to do an &quot;ls&quot; and see all the root level contents.</p>
<p>Encouraged, I decided to try to copy everything off the damaged partition to another hard drive in the order of importance. It turned out that the copying speed was extremely slow (averaging around 1MB per minute), every file seek seemed to be accompanied by multiple clicks. Given the speed, it would take three months to totally copy everything off the drive! Luckily, there were only 4GB or so new or modified files since my last backup 2 months ago and till this morning I was able to copy all of those data out.</p>
<p>So, in the end, I did not loose any data. I was lucky enough this time as it seemed that the physical damage occurred at the outer tracks of the drive, where the operating system was. The inner tacks where all my important data was located was largely intact.</p>
<p>The lesson of my experience is that remember to back up your systems regularly, and do not take chances. Modern disks have much higher areal density and you could easily loose gigabytes of data should a drive failure occurs. And do not panic if your hard drive fails. Shut down your system immediately to avoid further damage to the drive. At the early stage of a drive failure, your chance of getting everything back is pretty good. One biggest mistake is to try the failed drive again and again. Doing so may corrupt more data and make a successful recovery more difficult. And of course, do not try to repartition or reformat the drive as doing so would almost certainly make data recovery much more difficult if not totally impossible. And last but not least, if vital data is at stake, you might want to send the drive to a professional data recovery facility as such places have more tools and experience in handling this kind of situation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2008/03/16/ntfs-partition-recovery-with-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GRUB Error 17, LILO Rules</title>
		<link>http://www.kerrywong.com/2007/12/09/grub-error-17-lilo-rules/</link>
		<comments>http://www.kerrywong.com/2007/12/09/grub-error-17-lilo-rules/#comments</comments>
		<pubDate>Mon, 10 Dec 2007 03:07:18 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/2007/12/09/grub-error-17-lilo-rules/</guid>
		<description><![CDATA[Ubuntu and OpenSUSE have been my top choices of Linux distros over the years. I have been using Ubuntu for quite a while and one thing I really like about it is its apt-get package management system. But the GNOME GUI in Ubuntu seems to be quite crude. Also, despite its ever increasing popularity, its [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ubuntu.com/">Ubuntu</a> and <a href="http://www.opensuse.org/">OpenSUSE</a> have been my top choices of Linux distros over the years.<span id="more-254"></span> I have been using Ubuntu for quite a while and one thing I really like about it is its apt-get package management system. But the GNOME GUI in Ubuntu seems to be quite crude. Also, despite its ever increasing popularity, its hardware support is still not as good as I had hoped, at least in my case.</p>
<p>After I purchased a 24 inch LCD, I noticed that Ubuntu would not support it&#8217;s native 1920&#215;1200 resolution even though it correctly identified my four-years-old ATI Radeon 9200 SE graphics card. I tried many different workarounds (e.g. manually tuning xorg.conf, using ATI native display drivers, etc.) but without any luck. It seems that the maximum resolution I could get under Ubuntu 7.10 is 1280&#215;1024.</p>
<p>So, to keep the long story short, I decided to give the latest OpenSUSE distro (10.3) a try. OpenSUSE uses GRUB as it&#8217;s default partition manager. When it was time to reboot after the installation, I was surprised to be greeted by a boot loader error message. Basically, GRUB exited with error number 17. At first I thought that somehow I was not paying enough attention to the partition parameters and somehow chose a boot partition that was too large&#8230; instead of monkeying around, I decided to install a second time. But again, I got the same GRUB 17 error message.</p>
<p>This seems to be a rather strange problem as I have been installing Linux for years and have never seen the boot loader failed before. Puzzled, I searched the internet for answers. There are many posts regarding this particular GRUB error, and they seem to suggest that somehow the boot loader failed to recognize the disk&#8217;s geometry. I tried a couple of suggestions (one of which seemed really promising, it suggested that this was caused by BIOS reporting the wrong information. It suggested that I disable the DMA settings of the harddrive in BIOS and this would force the boot loader to figure out the disk geometry instead of relying on BIOS), but non seemed to have worked.</p>
<p>Even more puzzled, I decided to go through the installation process again. This time, I chose to use LILO boot loader instead of the default GRUB&#8230; and it worked! And best of all, OpenSUSE 10.3 recognized my graphic card (ATI Rage 9200 SE) without any problem and set the resolution correctly to 1920&#215;1200.</p>
<p>It is pretty clear that GRUB has some minor &quot;annoyance&quot; to fix. My PC is equipped with two SATA drives and 1 PATA harddrive. One of the SATA drive is used for Windows XP and I used the PATA drive for Linux installation. So it is possible that this setup is more complex than most of the Linux installations and GRUB had some difficulty figuring out the disk geometries. Nevertheless, LILO still rules.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2007/12/09/grub-error-17-lilo-rules/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MATLAB 7 under WINE</title>
		<link>http://www.kerrywong.com/2007/12/01/matlab-7-under-wine/</link>
		<comments>http://www.kerrywong.com/2007/12/01/matlab-7-under-wine/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 03:31:10 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MATLAB]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[WINE]]></category>

		<guid isPermaLink="false">http://www.kerrywong.com/2007/12/01/matlab-7-under-wine/</guid>
		<description><![CDATA[When I tried WINE many years ago, there were not that many large applications that could actually run smoothly without some sort of hacks.But when I gave it another try the other day, I was totally impressed by its abilities to run Windows applications natively under Linux. In fact, most Windows applications, as long as [...]]]></description>
			<content:encoded><![CDATA[<p>When I tried <a href="http://www.winehq.org/">WINE</a> many years ago, there were not that many large applications that could actually run smoothly without some sort of hacks.<span id="more-247"></span>But when I gave it another try the other day, I was totally impressed by its abilities to run Windows applications natively under Linux. In fact, most Windows applications, as long as they use standard Windows API&#8217;s, could almost run directly under WINE without any modifications or tweaks (support for Microsft&#8217;s latest products however is quite limited as newer API&#8217;s might not have been implemented under WINE yet).</p>
<p>To use <a href="http://www.mathworks.com/ ">MATLAB</a> 7 under WINE, all one has to do is to copy the harddrive serial number over into ~/.wine/drive_c/.windoes-serial. Here I assume that MATLAB has already been installed under Windows C drive.</p>
<p>The serial number is the disk serial number detected during MATLAB&#8217;s installation and can be found under [MATLAB root folder]/bin/win32/license.dat. The value after HOSTID=DISK_SERIAL_NUM= is the serial number.</p>
<p>After setting the disk serial number, MATLAB should be able to be invoked from the shell:</p>
<p>&nbsp;</p>
<blockquote>
<p>wine /windows/C/MATLAB701/bin/win32/MATLAB.exe</p>
</blockquote>
<p>Here is a screen shot of MATLAB 7 running under Suse 10.3 (Gome):</p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="/blog/wp-content/uploads/2007/12/matlab_demo.png" /></p>
<p>And if the serial number is set incorrectly, the following message will be received instead:</p>
<p align="center"><img alt="" src="/blog/wp-content/uploads/2007/12/license_error.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2007/12/01/matlab-7-under-wine/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>On Windows and Linux Process Scheduling</title>
		<link>http://www.kerrywong.com/2007/03/05/on-windows-and-linux-process-scheduling/</link>
		<comments>http://www.kerrywong.com/2007/03/05/on-windows-and-linux-process-scheduling/#comments</comments>
		<pubDate>Mon, 05 Mar 2007 23:59:41 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Scheduling]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://dimension/2007/03/05/on-windows-and-linux-process-scheduling/</guid>
		<description><![CDATA[Today, both Windows and Linux systems are robust and secure enough for daily uses. The dreaded “STOP” message from the blue screen or the “kernel panic” messages from a Linux terminal have become a rare occurrence (after the initial setup). While system crash due to kernel code bugs is rare, ill-behaved user space code can [...]]]></description>
			<content:encoded><![CDATA[<p>Today, both Windows and Linux systems are robust and secure enough for daily uses.<span id="more-148"></span> The dreaded “STOP” message from the blue screen or the “kernel panic” messages from a Linux terminal have become a rare occurrence (after the initial setup).</p>
<p>While system crash due to kernel code bugs is rare, ill-behaved user space code can exhaust system resources and cause the system to hang. And to the end user, there is little difference between a blue screen and an unresponsive user interface, and pretty much the only thing he can do is to do a hard reset.</p>
<p>I have seen Linux/Unix systems running for years without requiring reboot. Rogue processes can be killed without affecting the rest of the system. Windows however, has long suffered from the need of requiring frequent reboot. System updates aside, many rogue processes can cause the system appears to hang and there is no efficient way to kill these rogue processes.</p>
<p>To be more concrete, I will use a small Windows command shell program to illustrate my point.</p>
<p>Suppose you have a batch file c:\temp\test.bat and the code is:<br />
@echo off<br />
start /B c:\temp\test.bat<br />
start /B c:\temp\test.bat<br />
{repeat many times here}<br />
start /B c:\temp\test.bat</p>
<p>What this code does is to recursively call itself and fork off as many instances as possible. When you run this code under windows, you will find out that the whole system seems to stop responding. Because the number of instances of cmd.exe grows exponentially, it will exhaust the available handles in a matter of seconds. So when you try to launch the task manager to kill it, you will find yourself waiting forever for the task manager to show up. Since the cmd.exe process is being created at an exponential rate, windows scheduler is having a hard time keeping up the pace and leaving other vital processes to starve. At this point, even though the operating system is still alive, there is not much the user can do except to wait and hope that the scheduler will eventually give task manager a chance to run so that the rogue process can be killed or resort to reboot.</p>
<p>This situation is handled much better in modern Linux/Unix system (note, historically, Unix handled this poorly and lead to the infamous while(1) fork();). Similar to the windows script we used above, the following script can be used for the same purpose under Linux/Unix:</p>
<p>/tmp/test.sh<br />
sh ./test.sh<br />
sh ./test.sh<br />
{repeat many times here}<br />
sh ./test.sh</p>
<p>When test.sh is invoked, it will start invoking sh at an exponential rate. But the user can suspend (Ctrl + Z) the process or use a kill -9 to kill the parent process.</p>
<p>So in this simple test, we can clearly see that process scheduling in Linux/Unix systems is more robust than in Windows. It also illustrates that rogue processes can cause just as much headaches as blue screens do.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2007/03/05/on-windows-and-linux-process-scheduling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What Are My Favorite Sites Running On?</title>
		<link>http://www.kerrywong.com/2007/02/04/what-are-my-favorite-sites-running-on/</link>
		<comments>http://www.kerrywong.com/2007/02/04/what-are-my-favorite-sites-running-on/#comments</comments>
		<pubDate>Sun, 04 Feb 2007 23:49:22 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://dimension/2007/02/04/what-are-my-favorite-sites-running-on/</guid>
		<description><![CDATA[I have read from many sources that the majority of the websites are running on Linux and UNIX like operating systems. So out of curiosity, I checked out what are the sites that I visit most often running on. I used http://uptime.netcraft.com/up/graph to get what each site is running, and the result is shown below: [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">I have read from many sources that the majority of the websites are running on Linux and UNIX like operating systems.</span><span id="more-138"></span><span style="font-size: 10pt; font-family: Verdana;"> So out of curiosity, I checked out what are the sites that I visit most often running on. I used <a href="http://uptime.netcraft.com/up/graph">http://uptime.netcraft.com/up/graph</a> to get what each site is running, and the result is shown below:</span></p>
<table width="361" cellspacing="0" cellpadding="0" border="0" class="MsoNormalTable" style="width: 270.75pt; margin-left: 4.65pt; border-collapse: collapse;">
<tbody>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border: 1pt solid windowtext; padding: 0in 5.4pt; background: rgb(255, 255, 153) none repeat scroll 0% 50%; width: 116.05pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; height: 12.75pt;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">Site<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: solid solid solid none; border-color: -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(255, 255, 153) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">OS<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
<td width="72" valign="bottom" nowrap="nowrap" colspan="2" style="border-style: solid solid solid none; border-color: -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(255, 255, 153) none repeat scroll 0% 50%; width: 0.75in; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">Share<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">zdnet.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="32" nowrap="nowrap" rowspan="31" style="border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color windowtext; border-width: medium medium 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 24.3pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">62%<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
<td width="40" nowrap="nowrap" rowspan="43" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(0, 204, 255) none repeat scroll 0% 50%; width: 29.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">Linux   and UNIX like OS: 86%<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">cnet.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">news.bbc.co.uk<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">slashdot.org<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">osnews.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Google.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">w3.org<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux <u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">cnn.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux <u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">pcworld.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">bestbuy.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">consumerreports.org<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">codeguru.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">wikipedia.org<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Flickr.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">space.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">weather.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">vmware.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">sourceforge.net<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">dice.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">npr.org<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">pricegrabber.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">nextag.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">intel.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">gnu.org<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">betanews.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">mailinator.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">youtube.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">symantec.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">nasa.gov<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">amazon.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">captcha.net<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Linux<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 27.4pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: lime none repeat scroll 0% 50%; width: 116.05pt; height: 27.4pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">ibm.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: lime none repeat scroll 0% 50%; width: 100.7pt; height: 27.4pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">AIX<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="32" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: lime none repeat scroll 0% 50%; width: 24.3pt; height: 27.4pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">2%<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(0, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">yahoo.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(0, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">FreeBSD<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="32" nowrap="nowrap" rowspan="3" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(0, 204, 255) none repeat scroll 0% 50%; width: 24.3pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">6%<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(0, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">tomshardware.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(0, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">FreeBSD<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(0, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">netcraft.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(0, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">FreeBSD<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">zipzoomfly.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Solaris<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="32" nowrap="nowrap" rowspan="7" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 24.3pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">14%<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">walmart.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Solaris<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">circuitcity<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Solaris<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">sears.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Solaris<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">shutterfly.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Solaris<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">verisign.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Solaris<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">ams.org<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(153, 204, 255) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Solaris<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 23.35pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(255, 204, 153) none repeat scroll 0% 50%; width: 116.05pt; height: 23.35pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">computerworld.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(255, 204, 153) none repeat scroll 0% 50%; width: 100.7pt; height: 23.35pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Unix<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="32" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(255, 204, 153) none repeat scroll 0% 50%; width: 24.3pt; height: 23.35pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">2%<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">trendmicro.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Win 2000, IIS 5<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="32" nowrap="nowrap" rowspan="5" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 24.3pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">10%<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
<td width="40" nowrap="nowrap" rowspan="7" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(204, 255, 204) none repeat scroll 0% 50%; width: 29.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">Windows   14%<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">ebay.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Win 2000, IIS 5<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">extremetech.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Win 2000, IIS 5<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">pcmag.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Win 2000, IIS 5<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">newegg.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: silver none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Win 2000, IIS 5<u1:p></u1:p></span><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(102, 102, 153) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">microsoft.com<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(102, 102, 153) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Win 2003, IIS 6<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="32" nowrap="nowrap" rowspan="2" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(102, 102, 153) none repeat scroll 0% 50%; width: 24.3pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p align="center" class="MsoNormal" style="text-align: center;"><strong><span style="font-size: 10pt; font-family: Verdana;">4%<u1:p></u1:p></span></strong><o:p></o:p></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td width="155" valign="bottom" nowrap="nowrap" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; background: rgb(102, 102, 153) none repeat scroll 0% 50%; width: 116.05pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">pinvoke.net<u1:p></u1:p></span><o:p></o:p></p>
</td>
<td width="134" valign="bottom" nowrap="nowrap" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; background: rgb(102, 102, 153) none repeat scroll 0% 50%; width: 100.7pt; height: 12.75pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
<p class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Win 2003, IIS </span><o:p></o:p></p>
</td>
</tr>
</tbody>
</table>
<p><u1:p></u1:p></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">And indeed, a whopping 86% of these sites are running Linux or UNIX like operating systems. What is more interesting is that among the 14% that runs on Microsoft Windows, only 2 of them (4%) is running Windows 2003. And of course, one of them is Microsoft.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">Of course, these are just the sites I visit most often, I am sure that the statistics vary from person to person, but the picture is quite clear&hellip;</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2007/02/04/what-are-my-favorite-sites-running-on/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Samba File Server Using a Parallel External Hard Drive</title>
		<link>http://www.kerrywong.com/2007/01/23/samba-file-server-using-a-parallel-external-hard-drive/</link>
		<comments>http://www.kerrywong.com/2007/01/23/samba-file-server-using-a-parallel-external-hard-drive/#comments</comments>
		<pubDate>Tue, 23 Jan 2007 10:48:21 +0000</pubDate>
		<dc:creator>kwong</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Parallel]]></category>
		<category><![CDATA[Samba]]></category>

		<guid isPermaLink="false">http://dimension/2007/01/23/samba-file-server-using-a-parallel-external-hard-drive/</guid>
		<description><![CDATA[I have a DataStor parallel port external hard drive enclosure bought in 1997 and a laptop computer (Pentium MMX 133, 128M RAM) from around 2001. By today&#8217;s technology standard, those are indeed old dinosaurs. My DataStor external enclosure worked great under Windows 95, it supported hot plug and play. I used it under Windows 98 [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">I have a DataStor parallel port external hard drive enclosure bought in 1997 and a laptop computer (Pentium MMX 133, 128M RAM) from around 2001.</span><span id="more-137"></span><span style="font-size: 10pt; font-family: Verdana;"> By today&rsquo;s technology standard, those are indeed old dinosaurs. <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;"><o:p></o:p>My DataStor external enclosure worked great under Windows 95, it supported hot plug and play. I used it under Windows 98 as well. But the driver support became pretty bad under Windows 2000 and made reliable backups virtually impossible. Furthermore, there has been no official support for the drivers since Windows 2000. So the external case has been sitting there gathering dust for at least 6 years now. So I decided to try to find out whether I could utilize these old equipments under Linux. <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;"><o:p></o:p>The Linux distro I used is RedHat 9.0. There&rsquo;s no particular reason why I chose RedHat 9.0 distro as oppose to SuSE or Mandrake, I just happened to have the CDs lying around. I am pretty sure that almost any Linux distro will be able to do the job. <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;"><o:p></o:p>The installation of RedHat 9.0 went pretty effortlessly. Within an hour, I was able to run it. Amazingly the installation recognized virtually every piece of hardware I had on that laptop. Even KDE loaded up correctly, albeit slow. But I was not concerned about the GUI performance anyway, since I was going to use it as a file server and the configurations could be done in text mode.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;"><o:p></o:p>Then I set up Samba and was ready to attach my parallel port enclosure. I have a 13G IDE Seagate hard drive from 1999, which is a perfect candidate for the file server.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;"><o:p></o:p>To get the system recognize my parallel port hard drive turned out to be a little bit more work. Sadly, since the days of parallel enclosures were long passed, the information I could find on the internet was very sketchy. Nevertheless, I found an excellent manual on how to setup parallel port device for running on Linux on <a href="http://cyberelk.net/tim/parport/paride.html">http://cyberelk.net/tim/parport/paride.html</a>. <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;"><o:p></o:p>Here are the steps on how to get DataStor parallel port external hard drive to work.<o:p></o:p></span></p>
<p style="margin-left: 0.5in;" class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">1. Make sure that the parallel port is set to use EPP mode in BIOS (standard mode works also, but is significantly slower). If the BIOS has a setting for whether the computer should support Plug and Play, choose No (Non Plug Play). Since my computer is pretty old, for the OS to recognize the drive geometry properly, I also needed to select Disk Type to be other (e.g. UNIX) instead of DOS (e.g. Windows).<o:p> </o:p></span></p>
<p style="margin-left: 0.5in;" class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">2. Modify <strong>/etc/fstab</strong>, add the following line so that the external drive can be mounted later:<o:p></o:p></span></p>
<blockquote>
<p style="margin-left: 0.5in;" class="MsoNormal"><strong><span style="font-size: 10pt; font-family: Verdana;">/dev/pda1<span>    </span>/mnt/hdd<span>      </span>ext2<span>    </span>defaults<span>         </span>0 0<o:p></o:p></span></strong></p>
</blockquote>
<p style="margin-left: 0.5in;" class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">3. Log in as root, go to<strong> /sbin</strong> and type the following command in the given order to setup the parport driver:<o:p></o:p></span></p>
<blockquote>
<pre style="margin-left: 0.5in;"><strong><span style="font-family: Verdana;">modprobe paride<o:p></o:p>insmod dstr<o:p></o:p>insmod pd<o:p></o:p></span></strong><span style="font-size: 10pt; font-family: Verdana;"><o:p> </o:p></span></pre>
</blockquote>
<p style="margin-left: 0.5in;" class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">And the driver for the external drive is now loaded. To verify take a look using <strong>dmesg</strong> and lines similar to the following should be in the log:<o:p></o:p></span></p>
<blockquote>
<p style="margin-left: 0.5in;" class="MsoNormal"><strong><span style="font-size: 10pt; font-family: Verdana;">paride: version 1.06 installed (parport)<o:p></o:p> paride: dstr registered as protocol 0<o:p></o:p> pd: pd version 1.05, major 45, cluster 64, nice 0<o:p></o:p> pda: Sharing parport0 at 0&#215;378<o:p></o:p> pda: dstr 1.01, DataStor EP2000 at 0&#215;378, mode 4 (EPP-32), delay 1<o:p></o:p> pda: ST313032A, master, 25434228 blocks [12419M], (16383/16/63), fixed media<o:p></o:p> pda: pda1<o:p></o:p></span></strong></p>
</blockquote>
<p style="margin-left: 0.5in;" class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">4. Use <strong>mke2fs /dev/pda1</strong> to create a new ex2 file system on the external drive.<o:p> </o:p></span></p>
<p style="margin-left: 0.5in;" class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">5. Suppose you have Samba installed already, you can add a section in your <strong>/etc/samba/smb.conf</strong> file to enable the share so that Windows machines can see.<o:p></o:p></span></p>
<p style="margin-left: 0.5in;" class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">6. Finally, run <strong>/etc/rc.d/init.d/smb restart</strong> so the new Samba setting can take effect.<o:p></o:p></span></p>
<p><span style="font-size: 10pt; font-family: Verdana;"><o:p></o:p>The speed of the external hard drive is pretty slow (even in EPP mode) compares to the standard we use today. Copying files of mixed sizes resulted in just above 500K per second. But hey, we are talking about a computer that is ten years old here. And for backup usage, the slow speed actually works very well. Because the lower transfer rate at the external hard drive side, there&rsquo;s no noticeable performance degradation on the computer from which the backup operation is initiated. Who cares how long the backup runs since it would be running in the background anyway&hellip;</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kerrywong.com/2007/01/23/samba-file-server-using-a-parallel-external-hard-drive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
