<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Tech</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/" />
    <link rel="self" type="application/atom+xml" href="http://www.kosmaczewski.net/blogs/tech/atom.xml" />
   <id>tag:www.kosmaczewski.net,2006:/blogs/tech/4</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4" title="Tech" />
    <updated>2006-10-05T14:38:22Z</updated>
    <subtitle>&quot;Software is like entropy. It is difficult to grasp, weighs nothing, and obeys the second law of thermodynamics; i.e., it always increases.&quot; (Norman R. Augustine)</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.2</generator>
 
<entry>
    <title>New RSS</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/10/new_rss.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=473" title="New RSS" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.473</id>
    
    <published>2006-10-05T14:37:36Z</published>
    <updated>2006-10-05T14:38:22Z</updated>
    
    <summary>Update your readers! These are the new URLs: RSS 0.92 RSS 2.0 Atom...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Opinion" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>Update your readers! These are the new URLs:</p>

<ul>
<li><a href="http://kosmaczewski.net/feed/rss">RSS 0.92</a></li>
<li><a href="http://kosmaczewski.net/feed/rss2">RSS 2.0</a></li>
<li><a href="http://kosmaczewski.net/feed/atom">Atom</a></li>
</ul>
]]>
        
    </content>
</entry>
<entry>
    <title>First phase - done.</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/08/finished.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=468" title="First phase - done." />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.468</id>
    
    <published>2006-08-16T13:36:53Z</published>
    <updated>2006-08-16T13:39:40Z</updated>
    
    <summary>Hi everyone, This is the last entry of this blog; I will come back soon with a new site, with a new look and feel and new contents. Thanks to all of you for your support, comments and suggestions! This...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Opinion" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>Hi everyone,</p>

<p>This is the last entry of this blog; I will come back soon with a new site, with a new look and feel and new contents. Thanks to all of you for your support, comments and suggestions! This blog will remain at this URL for reference purposes (particularly regarding the popular Ubuntu entries!).</p>]]>
        
    </content>
</entry>
<entry>
    <title>How to Install Ubuntu 6.06 &quot;Dapper&quot; in an Apple G3 iBook</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/06/ubuntu_dapper_ibook_g3.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=460" title="How to Install Ubuntu 6.06 &quot;Dapper&quot; in an Apple G3 iBook" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.460</id>
    
    <published>2006-06-03T15:16:08Z</published>
    <updated>2006-06-03T15:21:45Z</updated>
    
    <summary>After upgrading my good ol&apos; PC to Dapper, I proceeded to download and burn a copy of it for PowerPC systems, and I have managed to install it in my old faithful G3 iBook in dual boot, with Mac OS...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="How to?" />
            <category term="Ubuntu" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>After <a href="http://www.kosmaczewski.net/blogs/tech/archives/2006/06/linksys_wpc54gs_dapper.php">upgrading my good ol' PC</a> to Dapper, I proceeded to download and burn a copy of it for PowerPC systems, and I have managed to install it in my old faithful G3 iBook in dual boot, with Mac OS X 10.2 "Jaguar" on the other partition. Here's how I did it.</p>]]>
        <![CDATA[<ol>
<li><strong>Backup all the information in your computer; what we are about to do erases your hard disk completely!!! You have been warned!</strong></li>
<li>Insert the Jaguar CD in the drive and reboot; <strong>to boot from the CD, remember to press the "C" key on your keyboard when you hear the chime of the iBook booting</strong></li>
<li>In the Mac OS X installer, go to the "Install" menu and select "Disk Utility"</li>
<li>In the Disk Utility, partition the hard drive in two parts with the same size; there is a special drop-down menu in the "Partition" tab that provides this automatically</li>
<li>Select the first partition, the one at the top, and choose "Free space" from the "Format" drop down menu at the right.</li>
<li>Select the second partition, at the bottom, and choose "Mac OS Extended" from the "Format" drop down menu.</li>
<li>Quit Disk Utility, and Install Mac OS X as usual</li>
<li>When Jaguar is installed, insert the Ubuntu disk and reboot; <strong>to boot from the CD, remember to press the "C" key on your keyboard when you hear the chime of the iBook booting</strong> (I prefer to repeat it  :)</li>
<li>Launch the installation of Ubuntu Dapper, and when you are asked about the partition where to install it, select the second option: "Use the largest block of continuous free space on disk"</li>
<li>Install Ubuntu as usual after that</li>
</ol>

<p>The good news is that Ubuntu Dapper recognized everything in the iBook G3; even the Airport wireless card! I was afraid that it wouldn't... but it worked perfectly well. I joined my home network without any problem at all.</p>

<p>And even better: I can put my computer to sleep, and wake it afterwards without any problem at all! I was asked by Ubuntu to "enable" the sleep functionality (in Breezy it did not work at all, but here it works perfectly well!).</p>

<p>Only funny thing: to simulate a right-click, I have to press the "F12" key  :)))</p>

<p>Ubuntu Dapper is awesome   :)</p>]]>
    </content>
</entry>
<entry>
    <title>How to install the Linksys WPC54GS Wireless-G Network Adapter in Ubuntu 6.06 &quot;Dapper&quot;</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/06/linksys_wpc54gs_dapper.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=459" title="How to install the Linksys WPC54GS Wireless-G Network Adapter in Ubuntu 6.06 &quot;Dapper&quot;" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.459</id>
    
    <published>2006-06-01T23:18:52Z</published>
    <updated>2006-06-01T23:30:23Z</updated>
    
    <summary>&quot;Dapper&quot;, the new version of Ubuntu has been released yesterday! So I downloaded the ISO file, burn the CD down and proceeded to install it over my old Breezy Kubuntu installation. Of course, I wanted to use my good&apos; old...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="How to?" />
            <category term="Ubuntu" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>"Dapper", the new version of Ubuntu has been released yesterday! So I downloaded the ISO file, burn the CD down and proceeded to install it over my old Breezy Kubuntu installation.</p>

<p>Of course, I wanted to use my good' old Linksys WPC54GS Wireless-G Network Adapter with Broadcom chipset, and I was lucky enough to find this page:</p>

<p><a href="https://wiki.ubuntu.com/WifiDocs/Driver/bcm43xx?action=show&redirect=WifiDocs%2FDriver%2FBroadcom43xx#head-e70dd6b5c57894d32e3eddc4f3e21d7d6d02230f" target="_blank">https://wiki.ubuntu.com/WifiDocs/Driver/bcm43xx?action=show&redirect=WifiDocs%2FDriver%2FBroadcom43xx#head-e70dd6b5c57894d32e3eddc4f3e21d7d6d02230f</a></p>

<p>It describes the whole Broadcom problem in Ubuntu, and gives the instructions needed to make the card work in Dapper:</p>

<ol>
<li>Follow the instructions in <a href="http://www.kosmaczewski.net/blogs/tech/archives/2006/02/how_to_install_1.php">http://www.kosmaczewski.net/blogs/tech/archives/2006/02/how_to_install_1.php</a> from steps 1 to 7 (step 8 cannot be done, yet)</li>
<li>Type "echo 'blacklist bcm43xx' | sudo tee -a /etc/modprobe.d/blacklist"</li>
<li>Type "sudo rmmod bcm43xx",<br>
"sudo rmmod ndiswrapper" and<br>
"sudo modprobe ndiswrapper"</li>
<li>Do the step 8 of <a href="http://www.kosmaczewski.net/blogs/tech/archives/2006/02/how_to_install_1.php">http://www.kosmaczewski.net/blogs/tech/archives/2006/02/how_to_install_1.php</a></li>
</ol>

<p>And that's it! You've got the wireless card ready for use.</p>

<p>:)    I'm happy to have found that page! It seems that the Broadcom drivers that come with Dapper do not work with all concerned wireless cards, so the thing is to "blacklist" them, and then to load ndiswrapper that works perfectly well.</p>]]>
        
    </content>
</entry>
<entry>
    <title>Intelligent Software Agents - A .NET Example</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/05/intelligent_software_agents.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=455" title="Intelligent Software Agents - A .NET Example" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.455</id>
    
    <published>2006-05-25T16:00:22Z</published>
    <updated>2006-05-25T16:10:22Z</updated>
    
    <summary>Software Example In the February 2006 issue of MSDN Magazine (http://msdn.microsoft.com/msdnmag/), Matt Neely describes a .NET implementation of mobile agents: &quot;The term agent originates in artificial intelligence and describes a logical entity that has some level of autonomy within its...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term=".NET" />
            <category term="Frameworks &amp; Development" />
            <category term="Papers" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<h2>Software Example</h2>

<p>In the February 2006 issue of MSDN Magazine (http://msdn.microsoft.com/msdnmag/), Matt Neely describes a .NET implementation of mobile agents:</p>

<blockquote><em>
"The term agent originates in artificial intelligence and describes a logical entity that has some level of autonomy within its environment or host. A mobile agent has the added capability to move between hosts. In a computing context, a mobile agent is a combined unit of data and code that can move between different execution environments."
</em></blockquote>
(Neely, 2006)

<p>The idea described in the article is that of a small family of .NET classes that literally "jump" from a computer to another, performing tasks in the host computer, through a mechanism called Remoting:</p>

<blockquote><em>
"An example of a traveling agent app could perform operations control. An agent is sent out with a list of machines on the local network it should traverse to inventory hardware and software (...)
built-in services that facilitate the componentization and mobility of code, namely object remoting and serialization.(...)
Mobile agents have their uses and their pros and cons. The autonomous and mobile nature of mobile agents can lead to reduced network traffic, decentralization, increased robustness and fault-tolerance, and easy deployment."
</em></blockquote>
(Neely, 2006)

<p><img alt="traveling_agent.gif" src="http://www.kosmaczewski.net/blogs/tech/archives/docs/traveling_agent.gif" width="247" height="62" /><br />
(Source: Neely, 2006)</p>]]>
        <![CDATA[<p>Such an agent could be used for administrative purposes (for example, a system administrator could use it to perform complex tasks directly in the target host computer), for inventory purposes (using WMI, such an agent could "collect" information about the computer), and even, and most dangerously, to inject viruses or trojans (such a mechanism could open security backdoors to external attacks in a computer!).</p>

<p>The author goes on describing three archetypical use cases for such agents:</p>

<ul>
<li>A simple travelling agent ("Travelling Pattern");</li>
<li>A task agent ("Task Pattern", handling distributed workload in a network, similar to the approach used by the <a href="http://setiathome.berkeley.edu/" target="_blank">SETI@home</a> project);</li>
<li>A buyer/seller scenario ("Interactive Pattern") with a buyer that looks for the best price in several sellers running in different computers (this example shows the biggest complexity).</li>
</ul>

<p>For more information about .NET Remoting, please refer to this article: <a href="http://msdn.microsoft.com/library/en-us/dndotnet/html/hawkremoting.asp" target="_blank">http://msdn.microsoft.com/library/en-us/dndotnet/html/hawkremoting.asp</a>. For the moment, suffice to say that Remoting allows to instantiate and execute objects and methods in computers connected by any communication medium, in a protocol-independent way (that is, using HTTP, TCP, etc). For instance, the interaction with remote SOAP web services can be seen as a particular type of Remoting.</p>

<h2>Comparison</h2>

<p>In the case of the hardware agent described by Brookshear, he describes the following characteristics as those defining an intelligent agent:</p>

<ul>
<li>Rational reaction to stimuli</li>
<li>Intelligent behavior</li>
<li>Learning capabilities</li>
</ul>

<p>Let's see how the software example of the MSDN Magazine article compares to a hardware agent in these three specific fields.</p>

<h3>Rational Reaction to Stimuli</h3>

<blockquote><em>
"An agent is a "device" that responds to stimuli from its environment. Most agents have sensors by which they receive data from their environments. Example of sensors such include microphones, cameras, and air sampling devices."
</em></blockquote>

<p>(Brookshear, 2005)</p>

<p>In the case of the software agent described in the article, the "sensors" are the complete API exposed by the .NET Framework. The agent can use any of the methods exposed in it to get information about the host where the agent is being executed. For example, in the case of the task agent (second example), the agent gets the list of logical drives in the current host computer:</p>

<blockquote><em>
"My child agent will merely list the system's logical drives (with a call to Directory.GetLogicalDrives) and again output the results to the host's console".
</em></blockquote>
(Neely, 2006)

<h3>Intelligent Behavior</h3>

<blockquote><em>
"The goal of artificial intelligence is to build agents that behave intelligently. This means that the actions of the agent's actuators must be rational responses to the data received through its sensors." </em></blockquote>
(Brookshear, 2005)

<p>In the article, the author describes the "Interaction Pattern" of a buyer/seller scenario:</p>

<blockquote><em>
"MyBuyingAgent (...) is a bit more complex as it needs to maintain more state. The buying agent is given the name of an item to buy, a value for the maximum amount it can spend for that item, and an array of host URLs that the agent needs to visit in order to find the item at the lowest price.
As the buying agent travels, it will need to enumerate each seller on each host, determine if that seller has the item desired, and then find the item's price. Since the agent wants to find the best price, it will have to track which seller it is going to buy from. I call this the winning seller. The agent will have to store the location of the winning seller, the ID of the winning seller, and the price the winning seller is offering for the desired item."
</em></blockquote>
(Neely, 2006)

<p>Here we have clearly a description of an intelligent behavior of the buyer agent, following the description given by Brookshear.</p>

<h3>Learning Capabilities</h3>

<blockquote><em>
"In some cases an agent's responses may improve over time as the agent learns. This could take the form of developing procedural knowledge (learning "how") or storing declarative knowledge (learning "what")." </em></blockquote>
(Brookshear, 2005)

<p>This last characteristic is not explicitly mentioned in the article, and with a good reason; it is by far the most complex of all, and would require a more complex design. The author of the MSDN Magazine article has purposedly kept the article simple, to introduce the major concepts and the general idea.</p>

<h2>Conclusion</h2>

<p>The article in MSDN Magazine does not delve into the learning mechanisms, that would make this "agent" a complete one in the AI sense. It rather focuses more into communication and security issues, giving at the same time the pros and cons of such an implementation. </p>

<p>My conclusion is that, given the proper learning instructions, the software agent would be fully compliant with the requirements set by the AI discipline.</p>

<h2>References</h2>

<p>J. Glenn Brookshear, "Computer Science, An Overview, Eighth Edition", ISBN 0-321-26971-3, Addison Wesley, 2005</p>

<p>Matt Neely, "Write Mobile Agents In .NET To Roam And Interact On Your Network", MSDN Magazine, February 2006 (Available here: <a href="http://msdn.microsoft.com/msdnmag/issues/06/02/MobileAgents/default.aspx" target="_blank">http://msdn.microsoft.com/msdnmag/issues/06/02/MobileAgents/default.aspx</a> - Accessed March 18th, 2006)</p>]]>
    </content>
</entry>
<entry>
    <title>My personal dna report</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/05/my_personal_dna.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=448" title="My personal dna report" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.448</id>
    
    <published>2006-05-14T21:55:32Z</published>
    <updated>2006-10-10T14:25:28Z</updated>
    
    <summary>The other day I found this website, and created my personal dna report with it. Kind of interesting, actually, the results are not far from the truth :)...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Opinion" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>The other day I found <a href="http://www.personaldna.com/" target="_blank">this website</a>, and created <a href="http://www.personaldna.com/report.php?k=WrnyDNhmwTSHHPX-GM-ADDCA-3c48" target="_blank"> my personal dna report</a> with it. Kind of interesting, actually, the results are not far from the truth  :)</p>]]>
        <![CDATA[<p>Here's some graphical representations of it:</p>

<p><script src="http://personaldna.com/h/?k=WrnyDNhmwTSHHPX-GM-ADDCA-3c48&t=Advocating+Inventor"> <br />
</script></p>

<p><script src="http://personaldna.com/t/?k=WrnyDNhmwTSHHPX-GM-ADDCA-3c48&t=Advocating+Inventor"> <br />
</script></p>]]>
    </content>
</entry>
<entry>
    <title>A Case for Compilers - A Fake Paper</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/05/a_case_for_compilers_fake.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=447" title="A Case for Compilers - A Fake Paper" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.447</id>
    
    <published>2006-05-13T17:01:23Z</published>
    <updated>2006-05-13T17:17:50Z</updated>
    
    <summary>This morning I said to myself; I should write something for my blog... but had no subject to write about; so I found a faster way: I went to http://pdos.csail.mit.edu/scigen/ and asked the SCIgen Automatic CS Paper Generator to create...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Humor" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>This morning I said to myself; I should write something for my blog... but had no subject to write about; so I found a faster way: I went to <a href="http://pdos.csail.mit.edu/scigen/" target="_blank">http://pdos.csail.mit.edu/scigen/</a> and asked the SCIgen Automatic CS Paper Generator to create a document suitable to post here, to keep you entertained for a while. The results are amazing!</p>

<p>Enjoy!   :)</p>

<h1 align="center">A Case for Compilers </h1>

<h3 align="center">Adrian Kosmaczewski </h3>

<p>Download a <a href="http://www.kosmaczewski.net/blogs/tech/archives/docs/fakepaper/compilers-fakepaper.ps">Postscript</a> or <a href="http://www.kosmaczewski.net/blogs/tech/archives/docs/fakepaper/compilers-fakepaper.pdf">PDF</a> version of this paper.<br>
Download all the files for this paper as a <a href="http://www.kosmaczewski.net/blogs/tech/archives/docs/fakepaper/compilers-fakepaper.tgz">gzipped tar archive</a>.</p>

<div class="p"><!----></div>

<h3 align="center"> </h3>

<div class="p"><!----></div>

<h2>Abstract</h2>

<div class="p"><!----></div>
 The cryptoanalysis approach to web browsers  is defined not only by the
 development of DNS, but also by the important need for the lookaside
 buffer [<a href="#cite:0" name="CITEcite:0">1</a>]. In this paper, we confirm  the improvement of
 digital-to-analog converters, which embodies the confirmed principles
 of robotics. Here, we use permutable information to validate that
 write-back caches  and kernels  can cooperate to realize this intent.]]>
        <![CDATA[<div class="p"><!----></div>
<h2>Table of Contents</h2>
<a href="#tth_sEc1">1) Introduction</a><br>
<a href="#tth_sEc2">2) Related Work</a><br>
<a href="#tth_sEc3">3) Framework</a><br>
<a href="#tth_sEc4">4) Highly-Available Modalities</a><br>
<a href="#tth_sEc5">5) Results</a><br>
<ul>
<li><a href="#tth_sEc5.1">5.1) Hardware and Software Configuration</a><br>
<li><a href="#tth_sEc5.2">5.2) Experimental Results</a><br>
</ul>
<a href="#tth_sEc6">6) Conclusion</a><br>
 <h2><a name="tth_sEc1">
1</a>&nbsp;&nbsp;Introduction</h2>

<div class="p"><!----></div>
<br>
 Many analysts would agree that, had it not been for robots, the
 visualization of hierarchical databases might never have occurred.  We
 view cryptoanalysis as following a cycle of four phases: study,
 management, creation, and management. Next, Without a doubt,  the usual
 methods for the private unification of RPCs and vacuum tubes do not
 apply in this area. Clearly, perfect information and the visualization
 of lambda calculus do not necessarily obviate the need for the
 investigation of hierarchical databases.

<div class="p"><!----></div>
<br>
 A key solution to answer this problem is the visualization of model
 checking. While it at first glance seems unexpected, it has ample
 historical precedence. Contrarily, this method is rarely considered
 appropriate. Contrarily, the study of hash tables might not be the
 panacea that information theorists expected [<a href="#cite:1" name="CITEcite:1">2</a>].  We
 emphasize that our application manages interactive epistemologies.  For
 example, many methods measure secure algorithms. Obviously, we prove
 not only that agents  and XML  are rarely incompatible, but that the
 same is true for Smalltalk.

<div class="p"><!----></div>
<br>
 We explore a novel system for the deployment of IPv6, which we call
 GRIPPE.  we view operating systems as following a cycle of four phases:
 creation, management, storage, and synthesis. Contrarily, this approach
 is generally adamantly opposed. Next, indeed, telephony  and the
 Internet  have a long history of connecting in this manner
 [<a href="#cite:2" name="CITEcite:2">3</a>]. Combined with the producer-consumer problem, such a
 hypothesis enables new game-theoretic information.

<div class="p"><!----></div>
<br>
 Our contributions are as follows.   We concentrate our efforts on
 disconfirming that Markov models  can be made atomic, homogeneous, and
 probabilistic. We skip these results until future work. Similarly, we
 examine how fiber-optic cables  can be applied to the emulation of
 massive multiplayer online role-playing games.

<div class="p"><!----></div>
<br>
 The rest of this paper is organized as follows. Primarily,  we motivate
 the need for erasure coding.  We demonstrate the visualization of
 online algorithms. In the end,  we conclude.

<div class="p"><!----></div>
<br>
 <h2><a name="tth_sEc2">
2</a>&nbsp;&nbsp;Related Work</h2>

<div class="p"><!----></div>
<br>
 Several distributed and optimal heuristics have been proposed in the
 literature.  Despite the fact that Nehru also presented this approach,
 we synthesized it independently and simultaneously. Our approach to
 DHCP  differs from that of Thomas et al.  as well.

<div class="p"><!----></div>
<br>
 While we know of no other studies on large-scale modalities, several
 efforts have been made to analyze cache coherence. Here, we overcame
 all of the obstacles inherent in the existing work.  Unlike many
 related solutions [<a href="#cite:3" name="CITEcite:3">4</a>], we do not attempt to deploy or learn
 the memory bus.  Recent work by Martin et al. [<a href="#cite:4" name="CITEcite:4">5</a>] suggests a
 methodology for requesting the study of hash tables, but does not offer
 an implementation. This work follows a long line of previous
 algorithms, all of which have failed [<a href="#cite:0" name="CITEcite:0">1</a>]. Ultimately,  the
 algorithm of Karthik Lakshminarayanan  et al.  is a robust choice for
 online algorithms.

<div class="p"><!----></div>
<br>
 GRIPPE builds on prior work in cooperative information and cryptography
 [<a href="#cite:5" name="CITEcite:5">6</a>,<a href="#cite:6" name="CITEcite:6">7</a>,<a href="#cite:7" name="CITEcite:7">8</a>]. Next, Y. Jones et al. [<a href="#cite:8" name="CITEcite:8">9</a>]
 developed a similar framework, contrarily we validated that GRIPPE runs
 in <font face="symbol">Q</font
>(2<sup>n</sup>) time. Further, a wearable tool for exploring kernels
 proposed by White fails to address several key issues that our
 application does fix [<a href="#cite:9" name="CITEcite:9">10</a>,<a href="#cite:10" name="CITEcite:10">11</a>]. Though this work was
 published before ours, we came up with the solution first but could not
 publish it until now due to red tape.  Obviously, despite substantial
 work in this area, our approach is clearly the application of choice
 among security experts.

<div class="p"><!----></div>
<br>
 <h2><a name="tth_sEc3">
3</a>&nbsp;&nbsp;Framework</h2>

<div class="p"><!----></div>
<br>
  Suppose that there exists the Turing machine  such that we can easily
  improve the evaluation of IPv6. Though hackers worldwide largely
  believe the exact opposite, GRIPPE depends on this property for
  correct behavior. Furthermore, we believe that the well-known
  pervasive algorithm for the refinement of digital-to-analog converters
  is optimal.  GRIPPE does not require such a robust synthesis to run
  correctly, but it doesn't hurt [<a href="#cite:2" name="CITEcite:2">3</a>].  Figure&nbsp;<a href="#dia:label0">1</a>
  details an architectural layout depicting the relationship between
  GRIPPE and the location-identity split. We withhold these results due
  to space constraints.  Figure&nbsp;<a href="#dia:label0">1</a> details the schematic
  used by GRIPPE.

<div class="p"><!----></div>
<br>

<div class="p"><!----></div>
<br>
<a name="tth_fIg1">
</a> 
<table align="center" border="0"><tr><td>
<img alt="dia0.png" src="http://www.kosmaczewski.net/blogs/tech/archives/docs/fakepaper/dia0.png" width="215" height="184" />
</td></tr></table><!--hboxt-->

<center>Figure 1: <font size="-1">
The relationship between our methodology and information retrieval
systems. This is an important point to understand.
</font></center>
<a name="dia:label0">
</a>

<div class="p"><!----></div>
<br>
  Reality aside, we would like to refine a framework for how GRIPPE
  might behave in theory. This may or may not actually hold in reality.
  We show the relationship between our framework and electronic
  modalities in Figure&nbsp;<a href="#dia:label0">1</a>. Furthermore, the model for our
  heuristic consists of four independent components: the study of hash
  tables, the deployment of A* search, collaborative communication, and
  fiber-optic cables.  Figure&nbsp;<a href="#dia:label0">1</a> diagrams an architecture
  plotting the relationship between our system and metamorphic
  symmetries.

<div class="p"><!----></div>
<br>
 <h2><a name="tth_sEc4">
4</a>&nbsp;&nbsp;Highly-Available Modalities</h2>

<div class="p"><!----></div>
<br>
GRIPPE is elegant; so, too, must be our implementation. Furthermore, the
collection of shell scripts contains about 126 semi-colons of ML.
GRIPPE is composed of a codebase of 25 Scheme files, a hacked operating
system, and a centralized logging facility. Next, information theorists
have complete control over the centralized logging facility, which of
course is necessary so that spreadsheets  can be made atomic, cacheable,
and permutable.  We have not yet implemented the hacked operating
system, as this is the least essential component of GRIPPE. one cannot
imagine other solutions to the implementation that would have made
architecting it much simpler.

<div class="p"><!----></div>
<br>
 <h2><a name="tth_sEc5">
5</a>&nbsp;&nbsp;Results</h2>

<div class="p"><!----></div>
<br>
 Systems are only useful if they are efficient enough to achieve their
 goals. We did not take any shortcuts here. Our overall performance
 analysis seeks to prove three hypotheses: (1) that erasure coding no
 longer affects median interrupt rate; (2) that symmetric encryption
 have actually shown muted mean response time over time; and finally (3)
 that the Commodore 64 of yesteryear actually exhibits better average
 sampling rate than today's hardware. Our logic follows a new model:
 performance might cause us to lose sleep only as long as usability
 constraints take a back seat to performance. We hope that this section
 illuminates D. B. Li's analysis of the memory bus that would allow for
 further study into Byzantine fault tolerance in 1967.

<div class="p"><!----></div>
<br>
     <h3><a name="tth_sEc5.1">
5.1</a>&nbsp;&nbsp;Hardware and Software Configuration</h3>

<div class="p"><!----></div>
<br>

<div class="p"><!----></div>
<br>
<a name="tth_fIg2">
</a> 
<table align="center" border="0"><tr><td>
<img alt="figure0.png" src="http://www.kosmaczewski.net/blogs/tech/archives/docs/fakepaper/figure0.png" width="359" height="262" />
</td></tr></table><!--hboxt-->

<center>Figure 2: <font size="-1">
The expected block size of GRIPPE, compared with the other heuristics.
</font></center>
<a name="fig:label0">
</a>

<div class="p"><!----></div>
<br>
 A well-tuned network setup holds the key to an useful evaluation
 method. We executed a simulation on our system to measure ubiquitous
 modalities's impact on the work of Canadian mad scientist V. Kumar.
 This step flies in the face of conventional wisdom, but is essential to
 our results. To begin with, we removed 200 FPUs from our mobile
 telephones to measure the collectively peer-to-peer behavior of random
 symmetries.  This configuration step was time-consuming but worth it in
 the end. Further, we removed 7Gb/s of Ethernet access from our
 decommissioned Motorola bag telephones to measure opportunistically
 "smart" configurations's effect on the work of American gifted hacker
 Stephen Hawking.  We added 7MB of NV-RAM to our millenium cluster.
 This configuration step was time-consuming but worth it in the end.
 Next, we quadrupled the effective floppy disk speed of the KGB's
 network to discover the effective hard disk space of MIT's sensor-net
 testbed. Finally, we tripled the effective NV-RAM throughput of our
 desktop machines to better understand our stable testbed.

<div class="p"><!----></div>
<br>

<div class="p"><!----></div>
<br>
<a name="tth_fIg3">
</a> 
<table align="center" border="0"><tr><td>
<img alt="figure1.png" src="http://www.kosmaczewski.net/blogs/tech/archives/docs/fakepaper/figure1.png" width="355" height="261" />
</td></tr></table><!--hboxt-->

<center>Figure 3: <font size="-1">
The effective throughput of GRIPPE, as a function of interrupt rate
[<a href="#cite:4" name="CITEcite:4">5</a>,<a href="#cite:11" name="CITEcite:11">12</a>].
</font></center>
<a name="fig:label1">
</a>

<div class="p"><!----></div>
<br>
 GRIPPE does not run on a commodity operating system but instead
 requires a collectively exokernelized version of Microsoft Windows NT.
 we implemented our Moore's Law server in embedded C, augmented with
 randomly random extensions [<a href="#cite:12" name="CITEcite:12">13</a>]. Our experiments soon proved
 that microkernelizing our tulip cards was more effective than
 distributing them, as previous work suggested. Further, this concludes
 our discussion of software modifications.

<div class="p"><!----></div>
<br>
     <h3><a name="tth_sEc5.2">
5.2</a>&nbsp;&nbsp;Experimental Results</h3>

<div class="p"><!----></div>
<br>

<div class="p"><!----></div>
<br>
<a name="tth_fIg4">
</a> 
<table align="center" border="0"><tr><td>
<img alt="figure2.png" src="http://www.kosmaczewski.net/blogs/tech/archives/docs/fakepaper/figure2.png" width="359" height="262" />
</td></tr></table><!--hboxt-->

<center>Figure 4: <font size="-1">
These results were obtained by E. Sasaki [<a href="#cite:13" name="CITEcite:13">14</a>]; we reproduce
them here for clarity.
</font></center>
<a name="fig:label2">
</a>

<div class="p"><!----></div>
<br>
Our hardware and software modficiations show that simulating GRIPPE is
one thing, but deploying it in a controlled environment is a completely
different story. That being said, we ran four novel experiments: (1) we
measured tape drive space as a function of hard disk speed on a PDP 11;
(2) we deployed 13 IBM PC Juniors across the planetary-scale network,
and tested our link-level acknowledgements accordingly; (3) we dogfooded
our framework on our own desktop machines, paying particular attention
to effective ROM speed; and (4) we ran 35 trials with a simulated DHCP
workload, and compared results to our software emulation. All of these
experiments completed without noticable performance bottlenecks or
access-link congestion.

<div class="p"><!----></div>
<br>
Now for the climactic analysis of the second half of our experiments.
Error bars have been elided, since most of our data points fell outside
of 43 standard deviations from observed means. Further, the data in
Figure&nbsp;<a href="#fig:label1">3</a>, in particular, proves that four years of hard
work were wasted on this project. Continuing with this rationale, the
many discontinuities in the graphs point to duplicated interrupt rate
introduced with our hardware upgrades.

<div class="p"><!----></div>
<br>
We have seen one type of behavior in Figures&nbsp;<a href="#fig:label2">4</a>
and&nbsp;<a href="#fig:label0">2</a>; our other experiments (shown in
Figure&nbsp;<a href="#fig:label0">2</a>) paint a different picture. The key to
Figure&nbsp;<a href="#fig:label2">4</a> is closing the feedback loop;
Figure&nbsp;<a href="#fig:label0">2</a> shows how our algorithm's tape drive space does
not converge otherwise. Similarly, operator error alone cannot account
for these results.  The key to Figure&nbsp;<a href="#fig:label0">2</a> is closing the
feedback loop; Figure&nbsp;<a href="#fig:label0">2</a> shows how our heuristic's RAM
throughput does not converge otherwise.

<div class="p"><!----></div>
<br>
Lastly, we discuss experiments (3) and (4) enumerated above. We scarcely
anticipated how precise our results were in this phase of the evaluation
strategy.  The data in Figure&nbsp;<a href="#fig:label2">4</a>, in particular, proves
that four years of hard work were wasted on this project. Such a claim
at first glance seems unexpected but has ample historical precedence.
Gaussian electromagnetic disturbances in our 10-node testbed caused
unstable experimental results.

<div class="p"><!----></div>
<br>
 <h2><a name="tth_sEc6">
6</a>&nbsp;&nbsp;Conclusion</h2>

<div class="p"><!----></div>
<br>
In conclusion, in this paper we validated that the famous homogeneous
algorithm for the deployment of kernels by Davis and Robinson
[<a href="#cite:14" name="CITEcite:14">15</a>] is in Co-NP. Continuing with this rationale, we also
motivated a secure tool for improving Boolean logic. Continuing with
this rationale, we also motivated a heuristic for encrypted
configurations. We also introduced an analysis of operating systems.

<div class="p"><!----></div>
<br>

<h2>References</h2>

<dl compact="compact">
 <dt><a href="#CITEcite:0" name="cite:0">[1]</a></dt><dd>
C.&nbsp;Leiserson, "An analysis of the memory bus using ASHES," in <em>POT
  WMSCI</em>, July 1998.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:1" name="cite:1">[2]</a></dt><dd>
L.&nbsp;Subramanian, J.&nbsp;Wilkinson, E.&nbsp;Harris, A.&nbsp;Kosmaczewski, J.&nbsp;Garcia,
  C.&nbsp;Leiserson, and C.&nbsp;A.&nbsp;R. Hoare, "An improvement of compilers using
  Prinker," in <em>POT the Conference on Atomic, Mobile Information</em>,
  Sept. 1993.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:2" name="cite:2">[3]</a></dt><dd>
E.&nbsp;Dijkstra, H.&nbsp;B. Moore, C.&nbsp;Darwin, and W.&nbsp;Kahan, "Exploration of the
  lookaside buffer that paved the way for the development of extreme
  programming," <em>OSR</em>, vol.&nbsp;27, pp. 59-68, Sept. 1993.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:3" name="cite:3">[4]</a></dt><dd>
S.&nbsp;Watanabe and C.&nbsp;Johnson, "Decoupling superblocks from link-level
  acknowledgements in suffix trees," <em>NTT Technical Review</em>,
  vol.&nbsp;4, pp. 78-87, Apr. 2000.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:4" name="cite:4">[5]</a></dt><dd>
D.&nbsp;Bharath, "Improving the UNIVAC computer and vacuum tubes," in
  <em>POT the Workshop on Metamorphic Theory</em>, Oct. 1997.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:5" name="cite:5">[6]</a></dt><dd>
C.&nbsp;Leiserson and J.&nbsp;Hennessy, "Deploying Markov models and IPv4 using
  Jugulum," in <em>POT the Workshop on Semantic Models</em>, Jan. 1990.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:6" name="cite:6">[7]</a></dt><dd>
J.&nbsp;Zheng, B.&nbsp;Lampson, and D.&nbsp;Patterson, "On the visualization of
  symmetric encryption," in <em>POT HPCA</em>, Apr. 2002.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:7" name="cite:7">[8]</a></dt><dd>
K.&nbsp;Nygaard, "Decoupling gigabit switches from erasure coding in symmetric
  encryption," in <em>POT the Conference on Authenticated Theory</em>, July
  1995.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:8" name="cite:8">[9]</a></dt><dd>
H.&nbsp;Levy, R.&nbsp;Qian, and S.&nbsp;Bose, "Developing kernels and robots," in
  <em>POT the Workshop on Collaborative, Client-Server Modalities</em>, Aug.
  2001.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:9" name="cite:9">[10]</a></dt><dd>
R.&nbsp;Milner, U.&nbsp;Gupta, F.&nbsp;L. White, and L.&nbsp;Subramanian, "Roband: A
  methodology for the deployment of cache coherence," in <em>POT the
  Workshop on Authenticated, Psychoacoustic Epistemologies</em>, July 1994.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:10" name="cite:10">[11]</a></dt><dd>
O.&nbsp;P. Ito, "Contrasting sensor networks and neural networks using
  ENDICT," in <em>POT HPCA</em>, Mar. 1986.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:11" name="cite:11">[12]</a></dt><dd>
A.&nbsp;Newell and K.&nbsp;Thompson, "Deconstructing evolutionary programming with
  Doole," in <em>POT OOPSLA</em>, May 1993.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:12" name="cite:12">[13]</a></dt><dd>
A.&nbsp;Kosmaczewski, "A case for suffix trees," in <em>POT MOBICOM</em>, July
  2005.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:13" name="cite:13">[14]</a></dt><dd>
B.&nbsp;Lampson and D.&nbsp;Ritchie, "PILON: A methodology for the study of
  spreadsheets," in <em>POT SIGGRAPH</em>, Mar. 2004.

<div class="p"><!----></div>
<br>
</dd>
 <dt><a href="#CITEcite:14" name="cite:14">[15]</a></dt><dd>
R.&nbsp;W. Zhao and M.&nbsp;Minsky, "Self-learning, low-energy information for
  context-free grammar," in <em>POT the Conference on Stable, Lossless
  Models</em>, July 2003.</dd>
</dl>]]>
    </content>
</entry>
<entry>
    <title>About OOP and other programming paradigms</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/05/about_oop_and_paradigms.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=446" title="About OOP and other programming paradigms" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.446</id>
    
    <published>2006-05-10T11:55:41Z</published>
    <updated>2006-05-13T12:04:24Z</updated>
    
    <summary>Does OOP reflect a &quot;natural&quot; way of thinking? Is it a better choice than the procedural programming paradigm? In computer science, to say that one approach is &quot;better&quot; than another is to miss a great detail: I do not think...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Frameworks &amp; Development" />
            <category term="Opinion" />
            <category term="Papers" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>Does OOP reflect a "natural" way of thinking? Is it a better choice than the procedural programming paradigm?</p>

<p>In computer science, to say that one approach is "better" than another is to miss a great detail: I do not think that there are "better" or "natural" paradigms per se, but just apppropriate answers to certain problems in a given context.</p>

<p>In his 1962 book "The Structure of Nature Revolutions", Thomas Kuhn introduces the idea of the "paradigm shift"; following this idea, human knowledge does not evolve gradually, but rather in discontinuous jumps, called "paradigm shifts" or "scientific revolutions":</p>

<blockquote><em>
"A scientific revolution occurs, according to Kuhn, when scientists encounter anomalies which cannot be explained by the universally accepted paradigm within which scientific progress has thereto been made. The paradigm, in Kuhn's view, is not simply the current theory, but the entire worldview in which it exists, and all of the implications which come with it. There are anomalies for all paradigms, Kuhn maintained, that are brushed away as acceptable levels of error, or simply ignored and not dealt with (a principal argument Kuhn uses to reject Karl Popper's model of falsifiability as the key force involved in scientific change)."
</blockquote></em>

<p>(Wikipedia, 2006)</p>

<p>In the case of the activity of software engineering, the paradigm shift from procedural to object-orientation is quite evident, both historically and technically speaking.</p>]]>
        <![CDATA[<p>The first programming language to introduce the concept of object-oriented programming was Simula, at the beginning of the 60s; Simula (<a href="http://www.engin.umd.umich.edu/CIS/course.des/cis400/simula/simula.html" target="_blank">http://www.engin.umd.umich.edu/CIS/course.des/cis400/simula/simula.html</a>, <a href="http://staff.um.edu.mt/jskl1/talk.html" target="_blank">http://staff.um.edu.mt/jskl1/talk.html</a>), as the name implies, was developed by scientist of the Norwegian Computing Center in Oslo, to simulate real-life events; thus, Simula was designed with a special objective and problem context in mind.</p>

<p>10 years after Simula, the Smalltalk (<a href="http://www.smalltalk.org/" target="_blank">http://www.smalltalk.org/</a>) programming language was created by Alan Kay in the Xerox Palo Alto Research Center (Xerox PARC, <a href="http://www.parc.com/" target="_blank">http://www.parc.com/</a>) in Silicon Valley, to support the first computer featuring a full GUI (Graphical User Interface), the "Alto". The Smalltalk language and the Alto computer were both groundbreaking at the time (around 1973) and they paved the way to the modern personal computer as we know it today. Moreover, the object-oriented paradigm appeared as the most appropriate one to design a "windowed" system, with buttons and menus, operated by a mouse. This fact, coupled with the popularity of the C++ programming language since the 80s, set the tone for the mainstream trend in the creation of software until the appearance of Java in 1995.</p>

<p>Having said this, it is worth noting that the first programming toolkit for the Macintosh was designed to be used with the Pascal programming language (one of the most well-known procedural programming languages):</p>

<blockquote><em>
"Parts of the original Macintosh operating system were written in Pascal and Motorola 68000 assembly language (though later versions incorporated substantial amounts of C++ as well), and the most frequent high-level language used for development in the early Mac community was Pascal. " 
</blockquote></em>

<p>(Wikipedia, 2006)</p>

<p>It is, then, difficult to talk about a "better" approach, when comparing OOP to procedural programming; actually, each problem must be evaluated in detail to find the paradigm that gives the best answer, not only in terms of performance and compatibility, but also in terms of maintainability.</p>

<p>Finally, it must be said that procedural and object-orientation are not the only programming paradigms:</p>

<p><em><br />
<ul><br />
<li>Structured programming - compared to Unstructured programming</li><br />
<li>Imperative programming, compared to Declarative programming</li><br />
<li>Message passing programming, compared to Imperative programming</li><br />
<li>Procedural programming, compared to Functional programming</li><br />
<li>Value-level programming, compared to Function-level programming</li><br />
<li>Flow-driven programming, compared to Event-driven programming</li><br />
<li>Scalar programming, compared to Array programming</li><br />
<li>Class-based programming, compared to Prototype-based programming (within the context of Object-oriented programming)</li><br />
<li>Constraint programming, compared to Logic programming</li><br />
<li>Component-oriented programming (as in OLE)</li><br />
<li>Aspect-oriented programming (as in AspectJ)</li><br />
<li>Rule-based programming (as in Mathematica)</li><br />
<li>Table-Oriented Programming (as in Microsoft FoxPro)</li><br />
<li>Pipeline Programming (as in the UNIX command line)</li><br />
<li>Post-object programming</li><br />
<li>Subject-oriented programming</li><br />
<li>Reflective programming</li><br />
<li>Dataflow programming (as in Spreadsheets)</li><br />
<li>Policy-based programming</li><br />
<li>Annotative programming - <a href="http://www.flare.org" target="_blank">http://www.flare.org</a> </li><br />
</ul><br />
</em></p>

<p>(Wikipedia, 2006)</p>

<h2>References</h2>

<p>Smalltalk History [Internet], <a href="http://www.smalltalk.org/smalltalk/history.html" target="_blank">http://www.smalltalk.org/smalltalk/history.html</a> (Accessed February 26th, 2006)</p>

<p>Wikipedia, "Pascal programming language" [Internet], <a href="http://en.wikipedia.org/wiki/Pascal_programming_language" target="_blank">http://en.wikipedia.org/wiki/Pascal_programming_language</a> (Accessed February 26th, 2006)</p>

<p>Wikipedia, "Programming paradigm" [Internet], <a href="http://en.wikipedia.org/wiki/Programming_paradigm" target="_blank">http://en.wikipedia.org/wiki/Programming_paradigm</a> (Accessed February 26th, 2006)</p>

<p>Wikipedia, "Thomas Kuhn" [Internet], <a href="http://en.wikipedia.org/wiki/Thomas_Kuhn" target="_blank">http://en.wikipedia.org/wiki/Thomas_Kuhn</a> (Accessed February 26th, 2006)</p>]]>
    </content>
</entry>
<entry>
    <title>Quick Comparison of C# and Ruby</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/05/quick_comparison.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=443" title="Quick Comparison of C# and Ruby" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.443</id>
    
    <published>2006-05-05T11:25:13Z</published>
    <updated>2006-05-06T16:16:01Z</updated>
    
    <summary>Introduction I have been working as a software developer since 1996, and as such I&apos;ve used a variety of different languages, both compiled and interpreted. But the who languages that I know and use most today, are two somewhat different...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term=".NET" />
            <category term="Frameworks &amp; Development" />
            <category term="Opinion" />
            <category term="Papers" />
            <category term="Ruby on Rails" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<h2>Introduction</h2>

<p>I have been working as a software developer since 1996, and as such I've used a variety of different languages, both compiled and interpreted. But the who languages that I know and use most today, are two somewhat different ones, <strong>C#</strong> and <strong>Ruby</strong>. I will begin my presentation with a short explanation of both, providing their major similarities and differences, and then providing some code samples of both.</p>

<p>Both languages are ranked #7 and #21 respectively in the TIOBE Programming Community Index, as of February 2006 (<a href="http://www.tiobe.com/tpci.htm" target="_blank">http://www.tiobe.com/tpci.htm</a>).</p>]]>
        <![CDATA[<h2>The C# Programming Language</h2>

<p>C# was created by Microsoft as part of its .NET programming environment, and while not oficially acknowledged, it is deeply inspired in Java:</p>

<blockquote><em>
"C# (pronounced "C sharp") is a simple, modern, object-oriented, and type-safe programming language. It will immediately be familiar to C and C++ programmers. C# combines the high productivity of Rapid Application Development (RAD) languages and the raw power of C++." 
</em></blockquote>

<p>(Microsoft, 2000)</p>

<p>It was designed by Anders Hejlsberg, who also created the well-known programming environments of Turbo Pascal and Delphi, while he worked for Borland before joining Microsoft. Even if being a propietary language, its core elements have been standardized by the ECMA and the ISO standard bodies, respectively as the ECMA-334 and ISO/IEC 23270 standards.</p>

<p>Applications written in the C# language run inside the CLR, which is the name of the virtual machine environment; there are several implementations of the CLR, one being .NET itself, the other being the open-source Mono runtime (<a href="http://www.mono-project.com/" target="_blank">http://www.mono-project.com/</a>)</p>

<p>C# is a compiled, strongly-typed, object-oriented language. In C#, everything is an object, unlike Java where, for example integer variables and other basic types are not objects per se. Memory management is done automatically by a "garbage collector" facility built into the CLR, much like Java does. Actually, C# provides single inheritance with interface support, that is, exactly the same approach that Java provides. All these similarities, coupled with the syntax similarity, shows clearly the common design principles of both programming languages.</p>

<p>I have been using C# in my day-to-day job since 2002, and as such I've found the following features as the most useful:</p>

<ul>
<li>A particularly "picky" compiler: the C# compiler performs a high number of checkings which avoid common run-time problems related to type casting. In fact, C# does not allow all types of type casting to be done automatically, and the warnings provided by the compiler help the developer to create more stable and maintainable applications.</li>
<li>Runtime capabilities: even being a language with a strong compiler and static typing, the .NET runtime is also capable of lots of operations by itself, mostly using reflection capabilities, and C# makes using these capabilities very easy. These are interesting but also dangerous, since they also can have a strong impact on performance.</li>
</ul>

<h2>The Ruby Programming Language</h2>

<p>Ruby was created in 1993 by Yukihiro Matsumoto. It is an interpreted, dynamically typed, object-oriented language available in nearly all hardware and software platforms, for free; indeed, Ruby is an open-source programming language, for which its implementation can be freely used in any context, without restrictions of any kind.</p>

<p>Ruby has been inspired from Smalltalk, Perl and Python, and designed from the very beginning with the developer in mind:</p>

<blockquote><em>
"Matz's primary design consideration is to make programmers happy by reducing the menial work they must do, following the principles of good user interface design. He stresses that systems design needs to emphasize human, rather than computer, needs:<br>
Often people, especially computer engineers, focus on the machines. They think, "By doing this, the machine will run faster. By doing this, the machine will run more effectively. By doing this, the machine will something something something." They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves. " 
</em></blockquote>

(Wikipedia, 2006)

<p>Ruby also supports single inheritance, but instead of providing interfaces, it provides "mixins", which allow a class to use the functionality defined in modules without having to subclass them.</p>

<p>I started using Ruby last year (2005) because of the discovery of the overhyped application framework "Ruby on Rails" (<a href="http://www.rubyonrails.com/" target="_blank">http://www.rubyonrails.com/</a>) that allows the rapid development and deployment of web-based applications using the Ruby language. I had the opportunity to use Ruby on Rails in a couple of applications and had an unparalleled level of productivity with it.</p>

<h2>Similarities and Differences</h2>

<p>Like C#, Ruby is a pure object-oriented language; in both languages, everything is an object. Both languages use exception handling to notify errors, allow object introspection, both have automatic memory management through garbage collection and allow the creation of multithreaded applications. They are also very "hyped" languages, which have a huge level of support in the industry, by different vendors and communities.</p>

<p>The code below does exactly the same task in both languages: <a href="http://www.kosmaczewski.net/blogs/tech/archives/docs/employee.zip">(Download files)</a>
</p>

<p>In Ruby:</p>

<textarea name="code" language="python">
# To execute, type "ruby employee.rb" at the command line
# (tested with Ruby 1.8.2)

class Employee
  def initialize(name, age)
    raise "Cannot be so young!" if age < 0
    raise "Cannot be so old!" unless age < 130
    @name, @age = name, age
  end
  
  def greet
    puts "Hi, my name is #{@name} and I am #{@age} years old"
  end
end

begin
  raise "Where are the parameters?" if ARGV.length < 2
  name, age = ARGV[0], ARGV[1].to_i
  employee = Employee.new(name, age)
  employee.greet
rescue
  puts "There was an error: " + $!
ensure
  puts "The program finished!"
end
</textarea>

<p>In C#:</p>

<textarea name="code" language="csharp">
/*
To compile this program, just type "csc employee.cs" in your command prompt; 
this will generate an "Employee.exe" in the same path
(tested with the .NET Framework 2.0)
*/

class Program
{
  static void Main(string[] args)
  {
    try
    {
      if (args.Length < 2)
      {
        throw new System.Exception("Where are the parameters?");
      }
      string name = args[0];
      int age = int.Parse(args[1]);
      Employee employee = new Employee(name, age);
      employee.Greet();
    }
    catch (System.Exception e)
    {
      System.Console.WriteLine("There was an error: {0}", e.Message);
    }
    finally
    {
      System.Console.WriteLine("The program finished!");
    }
  }
}

class Employee
{
  private string name = string.Empty;
  private int age = 0;

  public Employee(string name, int age)
  {
    if (age < 0)
    {
      throw new System.Exception("Cannot be so young!");
    }
    if (age > 130)
    {
      throw new System.Exception("Cannot be so old!");
    }
    this.name = name;
    this.age = age;
  }

  public void Greet()
  {
    System.Console.WriteLine("Hi, my name is {0} and I am {1} years old", 
      this.name, this.age);
  }
}
</textarea>

<p>The most important difference among C# and Ruby is typing. Indeed, C# is a statically-typed language while Ruby is a dynamically-typed one. The dynamicity of Ruby has the advantage of making programs shorter and more readable, but has also the drawback of being a trapdoor, causing hard-to-find run-time errors, specially when used by inexperienced developers. In the above example, the C# program will raise an exception if you specify a string instead of a number for the age... while the Ruby interpreter will not complain!</p>

<p>On the other side, the Ruby code is roughly half the length of its C# counterpart; in general, you need less lines of Ruby code to do any task, and this is confirmed in the blog "Following the rewrite" (http://rewrite.rickbradley.com/), where there is a follow-up of a rewrite of a Java application in Ruby on Rails:</p>

<blockquote><em>
"Preliminary tests by our Technical Lead put the code reduction for a normal module in our Java stack converted to Rails at roughly 20:1" 
</em></blockquote>

<p>(Rick Bradley, 2005)</p>

<p>And whoever says less lines of code, says also less lines to read, understand and maintain in the future.</p>

<h2>Conclusion</h2>

<p>Each language has its advantages and disadvantages; in the case of C# and Ruby, I find both languages to be perfectly complementary, while having some very important characteristics in common. I think that both languages will be more used in the future, and that the interoperability between them will be greater as well.</p>

<h2>References</h2>

<p>Microsoft, "The C# Language" [Internet], <a href="http://msdn.microsoft.com/vcsharp/programming/language/" target="_blank">http://msdn.microsoft.com/vcsharp/programming/language/</a> (Accessed February 26th, 2006)</p>

<p>Rick Bradley, "Evaluation: moving from Java to Ruby on Rails for the CenterNet rewrite" [Internet], <a href="http://rewrite.rickbradley.com/pages/moving_to_rails/" target="_blank">http://rewrite.rickbradley.com/pages/moving_to_rails/</a> (Accessed February 26th, 2006)</p>

<p>Ruby web site [Internet], <a href="http://www.ruby-lang.org/" target="_blank">http://www.ruby-lang.org/</a> (Accessed February 26th, 2006)</p>

<p>TIOBE Programming Community Index [Internet], <a href="http://www.tiobe.com/tpci.htm" target="_blank">http://www.tiobe.com/tpci.htm</a> (Accessed February 26th, 2006)</p>

<p>Wikipedia, "C Sharp" [Internet], <a href="http://en.wikipedia.org/wiki/C_Sharp_programming_language" target="_blank">http://en.wikipedia.org/wiki/C_Sharp_programming_language</a> (Accessed February 26th, 2006)</p>

<p>Wikipedia, "Ruby programming language" [Internet], <a href="http://en.wikipedia.org/wiki/Ruby_programming_language" target="_blank">http://en.wikipedia.org/wiki/Ruby_programming_language</a> (Accessed February 26th, 2006)</p>]]>
    </content>
</entry>
<entry>
    <title>Geneva Techdays 2006 - PowerPoint slides</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/05/geneva_techdays_slides.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=439" title="Geneva Techdays 2006 - PowerPoint slides" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.439</id>
    
    <published>2006-05-01T06:23:25Z</published>
    <updated>2006-05-01T06:34:19Z</updated>
    
    <summary>Well the PowerPoint slides that I used during the TechDays 2006 conference have been published in the TechDays page. You can download them from this site as well: A204 - SharePoint Workflow (zipped, 6.5 MB) D308 - LINQ (zipped, 6.7...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Opinion" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>Well the PowerPoint slides that I used during the TechDays 2006 conference have been published in the <a href="http://www.microsoft.com/switzerland/techdays/fr/agenda.mspx" target="_blank">TechDays page</a>. You can download them from this site as well:</p>

<ul>
<li><a href="http://www.kosmaczewski.net/blogs/tech/archives/docs/A204.zip">A204 - SharePoint Workflow</a> (zipped, 6.5 MB)</li>
<li><a href="http://www.kosmaczewski.net/blogs/tech/archives/docs/D308.zip">D308 - LINQ</a> (zipped, 6.7 MB)</li>
</ul>

<p>BTW, they are in French... and yes, the slide with Maradona on it is maybe the most important of them all :))</p>]]>
        
    </content>
</entry>
<entry>
    <title>Kubuntu 5.10 and the  Linksys WPC54GS Wireless-G Network Adapter</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/05/kubuntu_510_wireless.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=438" title="Kubuntu 5.10 and the  Linksys WPC54GS Wireless-G Network Adapter" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.438</id>
    
    <published>2006-04-30T23:01:50Z</published>
    <updated>2006-05-01T06:21:10Z</updated>
    
    <summary>OK, so this time I&apos;ve tried to make the same I&apos;ve described before, but for Kubuntu 5.10. I have changed to Kubuntu since I like KDE more than gnome, and also, Kubuntu seems to run faster than Ubuntu. And so...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="How to?" />
            <category term="Open Source" />
            <category term="Ubuntu" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>OK, so this time I've tried to make the same <a href="http://www.kosmaczewski.net/blogs/tech/archives/2006/02/how_to_install_1.php">I've described before</a>, but for <a href="http://www.kubuntu.org" target="_blank">Kubuntu 5.10</a>. I have changed to Kubuntu since I like KDE more than gnome, and also, Kubuntu seems to run faster than Ubuntu. And so I said to myself, OK, these are the same guys who make Ubuntu and Kubuntu, the wireless stuff should work fairly easily. After all it's the same kernel...</p>

<p>Wrong.</p>]]>
        <![CDATA[<p>The steps to follow are these:</p>

<ol>
<li>Follow <a href="http://www.kosmaczewski.net/blogs/tech/archives/2006/02/how_to_install_1.php" target="_blank">these steps</a> from 1 to 7 (step 8 applies only to Ubuntu, not Kubuntu)</li>
<li>Edit the file /etc/network/interfaces (typically "sudo vim /etc/network/interfaces") and add the following:

<pre>
iface wlan0 inet static 
pre-up ifconfig wlan0 up 
pre-up ifconfig wlan0 down 
pre-up ifconfig wlan0 up 
pre-up ifconfig wlan0 down 
pre-up iwconfig wlan0 essid YOUR_ESSID_HERE 
pre-up iwconfig wlan0 mode Managed 
pre-up iwconfig wlan0 key YOUR_NETWORK_KEY_HERE
pre-up ifconfig wlan0 up 
wireless-essid YOUR_ESSID_HERE
address YOUR_CHOSEN_IP_HERE (192.168.1.50, for example)
netmask 255.255.255.255
gateway THE_IP_OF_YOUR_WIRELESS_ROUTER_HERE (192.168.1.2, for example)
</pre>
(Thanks to <a href="http://rt2x00.serialmonkey.com/phpBB2/viewtopic.php?p=7335&sid=ee2e3c8aa62b8698d7531390c1d249d7" target="_blank">this page</a> for the tip!)
</li>
<li>Type "sudo modprobe ndiswrapper" (if you haven't done it before)</li>
<li>Type "sudo /etc/init.d/networking restart"</li>
<li>Type "sudo ifconfig wlan0 up"</li>
<li>Type "sudo ifup wlan0"</li>
</ol>

<p>Voila! You should be online by now. I have yet to find a way to execute the last 4 commands automatically when my computer boots up...</p>]]>
    </content>
</entry>
<entry>
    <title>&quot;You&apos;ve got Mail!&quot;</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/04/youve_got_mail.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=435" title="&quot;You've got Mail!&quot;" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.435</id>
    
    <published>2006-04-28T00:41:31Z</published>
    <updated>2006-04-28T00:42:20Z</updated>
    
    <summary>Cuando AOL (America On Line) alla a fines de los 80, le puso a su sistema de correo electronico una voz de chabon que decia &quot;You&apos;ve got Mail!&quot; cada vez que llegaba un nuevo mensaje, poco se imaginaba Ginebra de...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Humor" />
            <category term="Opinion" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>Cuando AOL (America On Line) alla a fines de los 80, le puso a su sistema de correo electronico una voz de chabon que decia "You've got Mail!" cada vez que llegaba un nuevo mensaje, poco se imaginaba Ginebra de que diez años mas tarde hasta los gorriones tendrian direccion de e-mail.</p>]]>
        <![CDATA[<p>Y lo mas comico es que ese desarrollo de la informatica de los 90 fue en gran parte el resultado indirecto de un invento de las afueras de Ginebra, en un laboratorio de fisica nuclear llamado CERN, alla por el 89; donde un cientifico britanico invento una manera de encadenar documentos en red, y asi nacio la Web.</p>

<p>El CERN esta en Meyrin, que es una comuna fronteriza con Francia, a unos 20 Km al oeste de la ciudad de Ginebra. Pero en plena ciudad, algo la predestinaba a tal rol.</p>

<p>Es asi como en Ginebra existe la "Avenue du Mail". Mira que tener una avenida dedicada al e-mail parece pelotudo, pero en realidad no es asi; el asunto es que mas el tiempo pasa, menos se acuerda la gente del porque se llama asi esa avenida. O sea: que es un "Mail" en frances? Hoy dia, la respuesta es inmediata. Y hace 50 años?</p>

<p>Y como es una avenida importante, hay un edificio de la benemerita Universidad de Ginebra que se llama "Uni Mail".</p>

<p>Y aun mejor: a unas pocas cuadras de ahi, hay una calle con un panel recordatorio indicando la extinta ocupacion de aquel cuyo nombre honra la calle en cuestion. El cartel, de cuya calle no recuerdo el nombre, reza: "Mengano (1500 y algo, 1600 y algo), peintre sur émail".</p>

<p>El chabon era "pintor sobre esmalte". Pero convengamos que es llamativo.</p>]]>
    </content>
</entry>
<entry>
    <title>Microsoft losing its focus?</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/04/microsoft_losing_focus.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=434" title="Microsoft losing its focus?" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.434</id>
    
    <published>2006-04-23T16:15:02Z</published>
    <updated>2006-04-23T16:19:40Z</updated>
    
    <summary>You knew Microsoft Reporting Services, Microsoft Excel Services, Microsoft Services for UNIX, Microsoft Windows SharePoint Services, and of course, the Service Packs. Well, let me introduce you Microsoft Catering Services (aka Service Pack for human beings, or the Microsoft Stomach...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Humor" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>You knew Microsoft Reporting Services, Microsoft Excel Services, Microsoft Services for UNIX, Microsoft Windows SharePoint Services, and of course, the Service Packs.</p>

<p>Well, let me introduce you Microsoft Catering Services (aka Service Pack for human beings, or the Microsoft Stomach Update Services):</p>

<p><a href="http://www.kosmaczewski.net/blogs/tech/archives/docs/DSC00121.php" onclick="window.open('http://www.kosmaczewski.net/blogs/tech/archives/docs/DSC00121.php','popup','width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img alt="DSC00121.jpg" src="http://www.kosmaczewski.net/blogs/tech/archives/docs/DSC00121.jpg" width="640" height="480" /></a></p>]]>
        
    </content>
</entry>
<entry>
    <title>About Operating Systems and Networks</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/04/about_operating.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=427" title="About Operating Systems and Networks" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.427</id>
    
    <published>2006-04-17T20:39:40Z</published>
    <updated>2006-05-06T11:45:06Z</updated>
    
    <summary>Introduction &quot;The true operating system is the net itself&quot; This phrase, common marketing argument in the late nineties, made me remind that in the eighties, Sun Microsystems&apos; founder, Scott McNealy, used the slogan &quot;The Network is the Computer&quot; to describe...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Open Source" />
            <category term="Opinion" />
            <category term="Papers" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<h2>Introduction</h2>

<blockquote><em>
"The true operating system is the net itself"
</em></blockquote>

<p>This phrase, common marketing argument in the late nineties, made me remind that in the eighties, Sun Microsystems' founder, Scott McNealy, used the slogan "The Network is the Computer" to describe his vision:</p>

<p><img alt="13004.jpg" src="http://www.kosmaczewski.net/blogs/tech/archives/docs/13004.jpg" width="640" height="480" /></p>

<p>Source: <a href="http://www.csg.is.titech.ac.jp/~mich/photos/visitsun/13/full/13004.jpg" target="_blank">http://www.csg.is.titech.ac.jp/~mich/photos/visitsun/13/full/13004.jpg</a></p>

<p>But, can we safely mix both concepts?</p>]]>
        <![CDATA[<p>Actually open your browser, type "The Network is the Computer" (with quotes) in Google, hit the "I'm Feeling Lucky" button and you will be redirected to Sun's website:</p>

<blockquote><em>
"In 1982, we were just a group of young guys who believed The Network is the Computer. Today, I'm proud to say this principle still guides Sun's business and is driving many of today's prominent innovations, trends and business models. It's great to be back on stage with this group of big minds and talk about the history and evolution of Silicon Valley, the future of the network, and what this all means as we enter a new age of participation on the global network." 
</em></blockquote>

<p>(Scott McNealy, 2006)</p>

<p>Now, somehow I cannot help myself of thinking that such a statement, actually is some kind of word game, where one mixes up different common but fairly unrelated concepts, and at the end you get a very good marketing phrase. And with all marketing phrases, they play mercilessly with ambiguous concepts:</p>

<blockquote><em>
"Most current usage of the term "operating system" today, by both popular and professional sources, refers to all the software that is required in order for the user to manage the system and to run third-party application software for that system. That is, the common understanding includes not only the low-level "kernel" that interacts directly with the hardware, but also libraries required by applications as well as basic programs to manipulate files and configure the system.

<p>The exact delineation between the operating system and application software is not precise, however, and is occasionally subject to controversy." <br />
</em></blockquote></p>

<p>(Wikipedia, 2006)</p>

<p>From that point on, trouble (and marketing) begins; remember that Microsoft strategy of binding the internet browser to the operating system, making it impossible to be replaced, and taking it from application to system level. It not only changed the shape of the computer desktop, it also started lawsuits, concept breaks and countless reboots.</p>

<p>The key point for Sun's statement is that very limit between system and application software:</p>

<blockquote><em>
"Let us begin by dividing a machine's software into two broad categories: application software and system software" </em></blockquote>
(Brookshear, 2004)

<p>When this limit is fuzzy, one can take the whole concept of the network layer to the lower level of the system software, and thus Sun's catch-phrase gets its meaning.</p>

<p>For me, one thing is a computer running an operating system (any brand or technology), and another very different is a set of computers connected through some kind of network. The first is an entity by itself, self-contained, that can run without a network connection; the latter exists from the moment that there are at least two nodes connected. There is an implicit dependency from the network to the computer. From that point of view, the "true" operating system was, is and will be the one running in the node.</p>

<p>There is, however, some trends and shared characteristics that show that a new "abstraction level" is appearing, as network-capable operating systems become common; computers connected in networks achieve much more than isolated ones. What are, then, the factors that contribute most to this development?</p>

<p>In my point of view, the most important of all these trends are:</p>

<ul>
<li>Open Source</li>
<li>Standards and Interoperability</li>
</ul>

<p>Each one of these trends make the line between operating system and networks each time fuzzier, thus creating the illusion that both can be merged in the same concept. Let's give a brief look at each one of them.</p>

<h2>Open Source</h2>

<p>I think that the Open Source movement shapes this thin line, providing strong competitors to commercial packages, stimulating creativity through software source code availability, and spanning new business models all over the landscape:</p>

<blockquote><em>
"The key point about having source was that you could see how other people did things. This radically lowered the barriers to learning, and because learning by example means you don't have to spend your energy reinventing the wheel, imitation soon sparked innovation.

<p>We saw a similar explosion of creativity in the early days of the web. Tim Berners-Lee's original web implementation was not just open source, it was public domain. (...)</p>

<p>But even more significantly, the "View Source" menu item migrated from Tim's original browser, to Mosaic, and then on to Netscape Navigator and MSIE. Though no one thinks of HTML as an open source technology (because of the fixation on licensing), it's been absolutely key to the explosive spread of the web. Barriers to entry for "amateurs" were low, because anyone could look "over the shoulder" of anyone else producing a web page. Dynamic content created with interpreted languages continued the trend towards transparency." <br />
</em></blockquote><br />
(Tim O'Reilly, 2000)</p>

<p>I think that what Tim says is brilliant, and I can only recommend reading the whole article. The capability of discovering how things work raises the quality bar of the systems, guarantees its availability in poor countries (since they just need a network connection to get them for free), thus "lowering the barriers of entry" and helping others contribute new ideas in the whole network, which then grows in value following Metcalfe's law:</p>

<blockquote><em>
"Metcalfe's law states that the value of a network equals approximately the square of the number of users of the system (n ^ 2). Since a user cannot connect to itself, the actual calculation is the number of diagonals and sides in an n-gon" 
</em></blockquote>
(Wikipedia, 2006)

<p>In terms of the thin line between network and operating systems, this means that newer ideas using network connections appear, later seamlessly incorporated in operating systems.</p>

<h2>Standards and Interoperability</h2>

<p>The trouble of connecting different computers, using different hardware and running different operating systems can be achieved by:</p>

<ul>
<li>Having a single company working to ensure that its products run in all target platforms using a particular propietary protocol (a rather expensive option nowadays, but the only option until the eighties)</li>
<li>Relying in open standards, established by joint associations and used all over the industry.</li>
</ul>

<p>The latter option, much more rational from an economic point of view, has led to the creation of a set of organizations that set standards used throughout the industry:</p>

<ul>
<li>IEEE Computer Society Portable Application Standards Committee (PASC) that establishes the POSIX standard for operating systems (<a href="http://www.pasc.org/plato/" target="_blank">http://www.pasc.org/plato/</a>)</li>
<li>Internet Engineering Task Force (IETF), <a href="http://www.ietf.org/" target="_blank">http://www.ietf.org/</a></li>
<li>World Wide Web Consortium (W3C), <a href="http://www.w3.org/" target="_blank">http://www.w3.org/</a></li>
</ul>

<p>All of these organisms have members coming from industrial and academic backgrounds, and provide a common foundation, best practices and formal standards that allow the industry to go to new levels.</p>

<p>In the field of networking, this helps by providing standards such as SOAP (Simple Object Access Protocol, <a href="http://www.w3.org/TR/soap/" target="_blank">http://www.w3.org/TR/soap/</a>) which allows computers in networks to securely share "information services", interchanging information in XML format (<a href="http://www.w3.org/XML/" target="_blank">http://www.w3.org/XML/</a>) using the HTTP protocol (<a href="http://www.w3.org/Protocols/" target="_blank">http://www.w3.org/Protocols/</a>).</p>

<p>This level of interoperability effectively turns networks to the level of operating systems, where the concept of low-level API gets a higher level meaning of "service".</p>

<h2>Conclusion</h2>

<p>I do not think that we can mix the concepts of operating system and network so easily; they should be always relied to their original meanings. There is, however, a synergy that comes from their combination and that makes the whole platform stronger than it was before.</p>

<h2>References</h2>

<p>J. Glenn Brookshear, "Computer Science, An Overview, Eighth Edition", ISBN 0-321-26971-3, Addison Wesley, 2005</p>

<p>Sun Microsystems, Scott McNealy, "Sun Microsystems' Founders Take Center Stage at the Computer History Museum" [Internet], January 11th, 2006, <a href="http://www.sun.com/smi/Press/sunflash/2006-01/sunflash.20060111.1.html" target="_blank">http://www.sun.com/smi/Press/sunflash/2006-01/sunflash.20060111.1.html</a> (Accessed February 11th, 2006)</p>

<p>Teruo Koyanagi, "Photo Album Online" [Internet], <a href="http://www.csg.is.titech.ac.jp/~mich/photos/" target="_blank">http://www.csg.is.titech.ac.jp/~mich/photos/</a> (Accessed February 11th, 2006)</p>

<p>Tim O'Reilly, "The Network Really Is the Computer" [Internet], June 8th, 2000, <a href="http://www.oreillynet.com/pub/a/network/2000/06/09/java_keynote.html" target="_blank">http://www.oreillynet.com/pub/a/network/2000/06/09/java_keynote.html</a> (Accessed February 11th, 2006)</p>

<p>Wikipedia, "Metcalfe's law" [Internet], <a href="http://en.wikipedia.org/wiki/Metcalfe's_law" target="_blank">http://en.wikipedia.org/wiki/Metcalfe's_law</a> (Accessed February 11th, 2006)</p>

<p>Wikipedia, "Operating system" [Internet], <a href="http://en.wikipedia.org/wiki/Operating_system" target="_blank">http://en.wikipedia.org/wiki/Operating_system</a> (Accessed February 11th, 2006)<br />
</p>]]>
    </content>
</entry>
<entry>
    <title>Hardware Polymorphism</title>
    <link rel="alternate" type="text/html" href="http://www.kosmaczewski.net/blogs/tech/archives/2006/04/hardware_polymorphism.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.kosmaczewski.net/mt/mt-atom.cgi/weblog/blog_id=4/entry_id=423" title="Hardware Polymorphism" />
    <id>tag:www.kosmaczewski.net,2006:/blogs/tech//4.423</id>
    
    <published>2006-04-08T11:43:29Z</published>
    <updated>2006-05-06T11:45:14Z</updated>
    
    <summary>Since data and instructions are stored in RAM in pretty much the same way, a priori the CPU cannot distinguish each other, but by the cycle in which the binary chunk is fetched from memory. In the case of instructions,...</summary>
    <author>
        <name>Adrian</name>
        <uri>http://www.kosmaczewski.net</uri>
    </author>
            <category term="Architecture" />
            <category term="Opinion" />
            <category term="Papers" />
    
    <content type="html" xml:lang="en" xml:base="http://www.kosmaczewski.net/blogs/tech/">
        <![CDATA[<p>Since data and instructions are stored in RAM in pretty much the same way, <em>a priori</em> the CPU cannot distinguish each other, but by the cycle in which the binary chunk is fetched from memory. In the case of instructions, it then needs to decode the operation codes into instructions, with the added problem that if the operation is performed on data that is not implied by the operation code, the results are wrong or even catastrophic.</p>

<p>The question is: would it be useful if in hardware, each cell of data would carry its own type designation? I will discuss here the pros and cons of this approach, in respect to hardware and software architectures.</p>]]>
        <![CDATA[<h2>Introduction</h2>

<p>The example of the + sign is particularly interesting; here's an excerpt of a tutorial for the Ruby programming language, where the need for data types appears in a straightforward way:</p>

<blockquote><em>
"Before we get any further, we should make sure we understand the difference between numbers and digits. 12 is a number, but '12' is a string of two digits.

<p>Let's play around with this for a while:          </p>

<p>puts  12  +  12<br />
puts '12' + '12'<br />
puts '12  +  12'</p>

<p>(results)</p>

<p>24<br />
1212<br />
12  +  12</p>

<p>How about this:          </p>

<p>puts  2  *  5<br />
puts '2' *  5<br />
puts '2  *  5'</p>

<p>(results)</p>

<p>10<br />
22222<br />
2  *  5" <br />
</em></blockquote><br />
(Chris Pine, 2006)</p>

<p>As we can see in the above example, higher-level programming languages allow us to distinguish (if not explicitly like Java, contextually like Ruby) among different types of information, whereas, at hardware level, this distinction does not exist; the processor executes or processes instructions or data depending on the processor cycle.</p>

<h2>Metadata</h2>

<p>In other words, if meaningful information (data) is stored in the memory of the computer and can be processed by a computer program, then we can say that every bit (no pun intended) of information has, at least at a certain abstraction level, and from a certain point of view, a particular type, or, more generally, some metadata attached to it:</p>

<blockquote><em>
"Metadata (Greek: meta- + Latin: data "information"), literally "data about data", is information that describes another set of data. A common example is a library catalog card, which contains data about the contents and location of a book: It is data about the data in the book referred to by the card. Other common contents of metadata include the source or author of the described dataset, how it should be accessed, and its limitations."
</em></blockquote>

<p>(Wikipedia, 2006)</p>

<p>In our case, the type of a particular piece of data is part of its metadata:</p>

<blockquote><em>
"Assigning datatypes ("typing") has the basic purpose of giving some semantic meaning to otherwise meaningless collections of bits."
</em></blockquote>
(Wikipedia, 2006)

<h2>(Imaginary) Type-checking processor architecture</h2>

<p>Now, let's suppose that a certain processor architecture allows us to distinguish in-memory pieces of data from in-memory program instructions. How could this be implemented?</p>

<p>First of all, let's see the different primitive types of information that a processor could distinguish:</p>

<ul>
<li>Integer numbers (of different but defined lengths such as 8, 16, 32 or 64 bits)</li>
<li>Floating-point numbers (again, of different but defined lengths)</li>
<li>Single characters (single- or multibyte-characters, such as Unicode ones)</li>
<li>Strings (of variable lengths)</li>
<li>Pure binary streams (images, audio, video)</li>
<li>Uniform arrays or vectors (of variable length, where the items are all of the same type)</li>
<li>Variable arrays or vectors (of variable length, where the individual items can be of any type, similar to C structures)</li>
</ul>

<p>Let's imagine, to begin, that this is the definitive list of supported types at hardware level, by a certain microprocessor architecture. I have kept this list particularly close to that of any common high-level language, for reasons that will become obvious in a while.</p>

<p>How could the type metadata be stored at hardware level? The easiest way to imagine this is having a supplemental byte at the beginning of each in-memory variable or structure, indicating the type. This would give us the possibility of referencing 256 different types of data, which is more than enough in this particular example. </p>

<p>In the case of variable length data types as shown above (String, Arrays) another byte (or bytes) should indicate the length of the whole data structure. The need for this will be explained below.</p>

<h2>Type-checking</h2>

<p>Now, during the execution type, the processor would fetch data from memory but this time, it would have a first byte of information about the information (metadata) indicating the type of what follows, and eventually some length information as well. Instead of having to rely in context (which is the case by now), the processor could proactively check that the data will be processed by the appropriate instructions. This is a common technique used in programming languages called "Type Checking":</p>

<blockquote><em>
"The process of verifying and enforcing the constraints of types - type checking - may occur either at compile-time (a static check) or run-time (a dynamic check). Static type-checking becomes a primary task of the semantic analysis carried out by a compiler. If a language enforces type rules strongly (that is, generally allowing only those automatic type conversions which do not lose information), one can refer to the process as strongly typed, if not, as weakly typed."
</em></blockquote>

<p>(Wikipedia, 2006)</p>

<p>In the case of a processor-based type check, it would be a pure strong, dynamic one.</p>

<p>Of course, this introduces the first drawback of this approach; while current processor architectures bypass this check and blindly trust the "context coherence" between data and instruction, the processor would have to execute an internal check to verify them prior to executing the instruction. A smarter approach would be to have the processor to "trust" some executing code, if it comes from a statically-typed compiler, for example; this way, the processor would not execute the type check, and would have a similar behavior as that from current systems; however, it would execute a supplemental check for code coming from dynamically-typed languages (such as scripting languages).</p>

<h2>Security</h2>

<p>A direct benefit of type-checking processor architectures such as the one described above has to do with security. One of the most common security problems in software today is inherent to the Von Neumann architecture, in which data and instructions are both loaded in memory and share adjacent locations. This security problem is known as "Buffer Overrun" or "Stack Overrun":</p>

<blockquote><em>
"A stack-based buffer overrun occurs when a buffer declared on the stack is overwritten by copying data larger than the buffer. Variables declared on the stack are located next to the return address for the function's caller. The usual culprit is unchecked user input passed to a function such as strcpy, and the result is that the return address for the function gets overwritten by an address chosen by the attacker. In a normal attack, the attacker can get a program with a buffer overrun to do something he considers useful, such as binding a command shell to the port of their choice".
</em></blockquote>

<p>(Howard & LeBlanc, 2003, page 129)</p>

<p>(Howard & LeBlanc follow this statement with a C program that shows the security failure, and explain how it might be exploited to inject code in the computer program and change its behavior)</p>

<p>In the case of the stack buffer overrun, the problem is not only that current processors do not check the type of the data to process, but they do not even check the length of it. Length-checks should be then the first check that a processor should do before processing in-memory data of variable length (as stated above, Strings, Arrays and structures like C structs fall in this category).</p>

<p>This leads to infere that a type-checker processor would be particularly useful in security intensive environments (such as nuclear plants, life support systems, etc) where the tradeoff of performance for an additional security type check could be highly desirable.</p>

<h2>Virtual Machines</h2>

<p>Virtual machines such as Java or .NET's Common Language Runtime (CLR) both perform length and type checks; in those cases, the virtual machine specification ensure that the code being executed does not perform illegal memory accesses or reference objects of the wrong type at the wrong moment.</p>

<p>For example, .NET's CLR includes a runtime security engine that constantly checks code metadata, to know whether the method calls are trusted or not:</p>

<blockquote><em>
"Permission demands propagate up the stack. When a method call demands a particular type of permission, the security engine must affirm that every component in the stack (prior to the point of the permission demand) has appropriate permissions. If any component does not, the permission demand fails and an exception is thrown to signify this failure. Each frame of the stack can modify the effective set of permissions by calling Assert, Deny or PermitOnly before making calls, and there are also calls to Revert changes made earlier. Taken together, this mechanism results in aggregate behavior that is constrained by the least privileged component that is participating in a given stack region"
</em></blockquote>

<p>(Stutz, Neward & Shilling, 2003, page 185)</p>

<p>This, among other reasons (such as automatic memory management) make virtual machines a "hot topic" in computing nowadays, since they allow to develop much more secure systems, with greater productivity, with fewer resources.</p>

<p>Of course, it must be said, not all security problems have disappeared with virtual machines, but that's another topic.</p>

<h2>Other benefits</h2>

<p>I think that another performance benefit could come from the fact of having native string manipulation at hardware level. String manipulation is by far the most common operation performed in high level programming languages (where Perl and Basic are the most common examples), but yet until now text strings as such exist only at that high level (and even until recently, when the Standard Type Library appeared, C++ did not even have a native string type - http://www.bgsu.edu/departments/compsci/docs/string.html).</p>

<p>Common string operations that could be implemented at hardware level include string copying, string concatenation and splitting; this way, getting the length or a defined substring of a given string would need a single processor instruction, instead of the current procedures, that imply memory allocation and copying, both extremely expensive in time and resources:</p>

<blockquote><em>
"In all cases, these functions consist of copying all or a subset of a string to another string. The specific steps are: 

<ol>
<li>Determine the number of characters to copy </li>
<li>Allocate space for the characters </li>
<li>Copy the characters to the new string </li>
</ol>

<p>Because of the memory allocation and copying operations involved, extracting sub-strings is also an expensive operation."<br />
</em></blockquote></p>

<p>(VBIP.com, 2006)</p>

<h2>Conclusion</h2>

<p>The inclusion of high-level instructions in processors is not something new. It allows to boost the speed of hardware architectures, providing common operations to be performed at maximum speed at the lowest system level. One good example of existing implementations is the Velocity Engine existing in PowerPC G4 and G5 microprocessors:</p>

<blockquote><em>
"The Velocity Engine, embodied in the G4 and G5 processors, expands the current PowerPC architecture through addition of a 128-bit vector execution unit that operates concurrently with existing integer and floating-point units. This provides for highly parallel operations, allowing for simultaneous execution of up to 16 operations in a single clock cycle. This new approach expands the processor's capabilities to concurrently address high-bandwidth data processing (such as streaming video) and the algorithmic intensive computations which today are handled off-chip by other devices, such as graphics, audio, and modem functions.The AltiVec instruction set allows operation on multiple bits within the 128-bit wide registers. This combination of new instructions, operation in parallel on multiple bits, and wider registers, provide speed enhancements of up to 30x on operations that are common in media processing"
</em></blockquote>

<p>(Apple Computer, 2006)</p>

<p>Some example code in C that uses the AltiVec instruction set is shown in <a href="http://developer.apple.com/hardware/ve/tutorial.html" target="_blank">http://developer.apple.com/hardware/ve/tutorial.html</a></p>

<p>Of course, these implementations greatly impact compiler and operating systems design, but they do not (I think) impact higher-level languages such as Java, C#, or scripting languages such as Perl or Ruby, who tend to be rather platform-independent (both software and hardware).</p>

<h2>References</h2>

<p>Apple Computer, "Velocity Engine" [Internet], <a href="http://developer.apple.com/hardware/ve/" target="_blank">http://developer.apple.com/hardware/ve/</a> (Accessed February 3rd, 2006)</p>

<p>Chris Pine, "Learn to Program" [Internet], <a href="http://pine.fm/LearnToProgram/?Chapter=02" target="_blank">http://pine.fm/LearnToProgram/?Chapter=02</a> (Accessed February 3rd, 2006)</p>

<p>David Stutz, Ted Neward & Geoff Shilling, "Shared Source CLI Essentials", ISBN 0-596-00351-X, O'Reilly, 2003</p>

<p>Michael Howard & David LeBlanc, "Writing Secure Code, 2nd Edition", ISBN 0-7356-1722-8, Microsoft Press, 2003</p>

<p>VBIP.com, "String Operations" [Internet], <a href="http://www.vbip.com/books/1861007302/chapter_7302_04.asp" target="_blank">http://www.vbip.com/books/1861007302/chapter_7302_04.asp</a> (Accessed February 3rd, 2006)</p>

<p>Wikipedia, "Datatype" [Internet], <a href="http://en.wikipedia.org/wiki/Datatype" target="_blank">http://en.wikipedia.org/wiki/Datatype</a>  (Accessed February 3rd, 2006)</p>

<p>Wikipedia, "Metadata" [Internet], <a href="http://en.wikipedia.org/wiki/Metadata" target="_blank">http://en.wikipedia.org/wiki/Metadata</a>  (Accessed February 3rd, 2006)<br />
</p>]]>
    </content>
</entry>

</feed> 

