<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4868875111006095493</id><updated>2011-12-18T19:15:35.084+02:00</updated><category term='Cars'/><category term='Development'/><category term='The Rest'/><category term='Games'/><category term='Law And Order'/><category term='Car Safety'/><category term='Nonsense'/><category term='Technology'/><category term='Introduction To Programming'/><category term='Statistics'/><category term='Argumentative'/><category term='Root CA'/><category term='History'/><category term='UI'/><category term='Design'/><category term='Security'/><category term='Science'/><title type='text'>Subjectively</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-1945481529727250605</id><published>2010-10-06T02:19:00.001+02:00</published><updated>2010-10-06T02:22:17.182+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Root CA'/><title type='text'>Who do we trust</title><content type='html'>In the old days of the internet (10-15 years &amp;nbsp;ago) there used to be about 10-20 trusted root ca's installed on my operating system.&amp;nbsp;On my windows-xp machine at work i have hundreds.&lt;br /&gt;&lt;br /&gt;For those of you who don't know what i'm talking about, here's a basic intro:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Root Certificate Authorities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When you connect to certain websites you will see a "Secure lock" icon appear in your browser in an address that starts with https.&lt;br /&gt;What this is supposed to mean is that the connection is "secure".&lt;br /&gt;This security is provided by a number of protocols, most importantly each website has a certificate that says "the company X owns this address".&lt;br /&gt;Now the problem is that you can't just take someone at their word - you need some trusted third party that verifies that this person is who they are.&lt;br /&gt;&lt;br /&gt;This is a&amp;nbsp;similar&amp;nbsp;idea to personal id- your government serves as a trusted authority that provides a certificate (id) that verifies someone is who they say they are.&lt;br /&gt;In the world of the internet, this authority is called a Certificate Authority (CA).&lt;br /&gt;&lt;br /&gt;The difference between the government and the internet in this case is that we implicitly assume that the government is a trusted issuer of id's.&lt;br /&gt;In the world of the internet, there is no accepted, trusted authority that we can count on to produce these id's. Several&amp;nbsp;commercial&amp;nbsp;organizations then took this role and has been accepted as "trust worthy".&lt;br /&gt;This makes them what is known as Trusted Root Certificate Authority.&lt;br /&gt;What this means is that certain organizations were accepted as trusted and are allowed to&amp;nbsp;ascertain&amp;nbsp;&amp;nbsp;the identity of others.&lt;br /&gt;The root ca is responsible for the validity of the certificates it provides and holds the power to revoke them if they are misused or stolen.&lt;br /&gt;&lt;br /&gt;The problem is that once a certificate authority is accepted as root, it holds&amp;nbsp;tremendous&amp;nbsp;power for abuse.&lt;br /&gt;So when you find yourself with hundreds of them installed on your machine - then something is very wrong.&lt;br /&gt;What could a rouge root certificate authority do with it's power?&lt;br /&gt;&lt;br /&gt;First of all, a rouge root ca is in a sense unstoppable - once a certificate is accepted as trusted on your machines local certificate store there is no "higher authority" that can revoke the&amp;nbsp;certificate.&lt;br /&gt;&lt;br /&gt;If someone gains control of a root certificate authority they can use it to fake the identity of anyone.&lt;br /&gt;This opens up all "secure" traffic to an undetectable man-in-the-middle attack.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Main In The Middle&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;in &amp;nbsp;a man-in-the-middle attack works something like this:&lt;br /&gt;say that you and i talk to each other on the phone.&lt;br /&gt;we both assume that you are listening to me when i say something, and that when you speak i am hearing you talk.&lt;br /&gt;now let's assume we've never met and neither of us knows what the other one sounds like.&lt;br /&gt;I call you and i assume you answer, but in fact some other person is on the other end and he is on a&amp;nbsp;separate&amp;nbsp;call with you.&lt;br /&gt;They repeat most of what i am saying to you, and most of what you are saying to me.&lt;br /&gt;But since they are in the middle of the line, they can change what is being said.&lt;br /&gt;Neither one of us is even aware that something is wrong...&lt;br /&gt;&lt;br /&gt;This is the essence of a man in the middle attack. On the internet, the&amp;nbsp;equivalent&amp;nbsp;to you and me knowing what we sound like is the certificates given to us by the root certificate authority.&lt;br /&gt;&lt;br /&gt;What could someone do if they were able to&amp;nbsp;impersonate&amp;nbsp;a root ca?&lt;br /&gt;They could monitor any secure channel you have - you email. your Facebook account, basically anything you log into.&amp;nbsp;They could also act on your behalf and you would not even suspect something is wrong, no software would alert you, no anti virus.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;DONT PANIC&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My intention is not to alarm anyone about someone reading your emails because of compromised root ca, but to point to the fact that&amp;nbsp;the more root ca's are installed by default on our operating system, the grater the chance that one of them is compromised.&lt;br /&gt;And that my computer has root ca's installed by certificate authorities around the world, many of which i do not consider the least bit trustworthy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-1945481529727250605?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/1945481529727250605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=1945481529727250605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/1945481529727250605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/1945481529727250605'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2010/10/who-do-we-trust.html' title='Who do we trust'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-2036731095847260102</id><published>2010-05-22T05:13:00.065+03:00</published><updated>2010-10-06T02:23:59.599+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Introduction To Programming'/><title type='text'>Introduction To Programming - What is Code?</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;In the most technical sense computer code (or source code) is a series of instructions that can be translated through a process that varies from trivial to complicated* into machine "language".&lt;br /&gt;&lt;br /&gt;While technically correct, the previous definition is pretty boring. It is also very far from what actual code is like. It certainly doesn't help us understand what it's for and why it works the way it works - which I think are the more interesting questions.&lt;br /&gt;&lt;br /&gt;Before I try to talk more about what real world code is like and some more interesting technical aspects, I would like to say that there are many different programming languages and there are many things that can be considered computer code, from the structural language called HTML that describes the page you are reading to the assembly language that is used to write processor instructions.&lt;br /&gt;&lt;br /&gt;It's hard to cover the huge variety of what can be considered "code" in a single, broad definition so instead of doing that I will try to explain how code is used in some of the common programming languages and the why's, how's and what's of this code.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Why do we need it?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Computer code is a tool we use to describe ideas, concepts and processes in a kind of functional way that can be converted into machine language.&lt;br /&gt;&lt;br /&gt;We need this tool because there is a dividing line between what can be easily and efficiently done in hardware - the physical components of a computer, primarily in the processor - and what can be efficiently done in software. Code begins pretty much where the hardware leaves off.&lt;br /&gt;&lt;br /&gt;Processors are good at things like adding one number to another number, moving bits from one place to another, multiplying, subtracting and going through these instructions in sequence. They are also good at performing logical decisions like "if this number is a zero move to the next instruction, if it's not zero jump 5 instructions"&lt;br /&gt;&lt;br /&gt;Machine language is these basic instructions, there is a language called Assembly which exists directly "above" machine code. It allows giving instructions in a way that translates almost immediately into these instructions. It is rarely used for complicated things and is considered one of the toughest and most respected specializations in computer programming. Its proximity to the actual hardware gives the programmer the most control of any language over what goes on in the processor. It can allow for some of the most efficient code that can be written.&lt;br /&gt;&lt;br /&gt;This control comes at a cost - expressing complex ideas is very hard, writing even the simplest programs requires a lot of thought and training and even with training reading Assembly is a tedious job. A good knowledge of Assembly is one of the essential tools for hackers.&lt;br /&gt;&lt;br /&gt;Assembly is rarely used in software development. languages like Java, c and c++ are far more popular as they allow describing more complicated structures and expressing complicated ideas in simpler ways then assembly.&lt;br /&gt;&lt;br /&gt;A 2 lines of code in java, like this one counting to 100 and printing each number:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;for (int i=0; i&amp;lt;100; i++)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;system.out.println("i = "+i);&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Will translate into hundreds of instructions in assembly.&lt;br /&gt;&lt;br /&gt;When programmers speak of computer code, they rarely talk about Assembly.&lt;br /&gt;The thing is, using other more "high level" languages like Java or c++ requires some kind of translation into this computer code as this is the only thing that can run on the physical hardware. This is why a process called "compilation" was introduces, which translates higher level languages into machine code. This abstraction allows us to create far more complicated software in exchange for giving up control of the specific instructions given to the hardware.&lt;br /&gt;&lt;br /&gt;Higher and more specialized languages exist that are even further away from the processor.&lt;br /&gt;The common thing to all programming languages is that they exchange some level of control over what really happens on the machine for clarity and ease of use.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The building blocks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We discussed the why, so now let's talk about what code is made out of.&lt;br /&gt;&lt;br /&gt;The goal of any higher level programming language is to provide the syntax or "semantics" to express complicated ideas in a coherent, manageable and extendable way.&lt;br /&gt;&lt;br /&gt;There are some concepts that are shared between most languages, these are:&lt;br /&gt;variables, conditionals, loops, procedures (or methods/functions) and mathematical operations. Another important common concept is the Comment. Slightly less common are classes.&lt;br /&gt;&lt;br /&gt;To better understand what code is let's look at the building blocks.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Variables &lt;/b&gt;- variables are a way of giving a name to some of the computer's memory in a way we can easily use in the code.&lt;br /&gt;For example, we can define:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;int myVariable = 100;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;now we can refer to "myVariable" in other places in the code, we could change its value, add to it, subtract from it or compare it to other values.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conditionals &lt;/b&gt;- conditionals are a way of asking for one thing or another to happen, depending on some logical condition.&lt;br /&gt;For example this rule:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;if (myVariable&amp;lt;100)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;system.out.println("My variable is less than 100");&lt;/i&gt;&lt;br /&gt;&lt;i&gt;else&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;system.out.println("My variable is equal to or larger than 100");&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;States that the line "My variable is less than 100" should be printed if the value within "myVariable" is less than 100, and the line "My variable is equal to or larger than 100" otherwise.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Loops &lt;/b&gt;- loops are a tool we use when we want to perform repeated operations. One of the useful properties of computers is that they can do certain things many times and very fast. Loops are a way to facilitate this property. A loop generally consists of one or more instructions we want to perform and some condition that will make the loop stop.&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;for (int i=0; i&amp;lt;100; i++)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;system.out.println("i = "+i);&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;This code says something like this:&lt;br /&gt;"For as long as the variable "i" - which starts out at zero - is smaller then 100, increase "i" and perform the next instruction"&lt;br /&gt;put another way - do the next line 100 times.&lt;br /&gt;This next line says write to the screen the text "i = " followed by the value of i.&lt;br /&gt;the output would look like :&lt;br /&gt;i = 1&lt;br /&gt;i = 2&lt;br /&gt;...(and so on)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Procedures/Functions/Method&lt;/b&gt;s - Procedures are one of the mechanisms that allow us to create new tools and break apart complicated logic into smaller, reusable and more manageable parts.&lt;br /&gt;&lt;br /&gt;It is an essential mechanism when we want to collaborate with other programmers and logically separate different parts of our program.&lt;br /&gt;&lt;br /&gt;One example of a function is the "&lt;i&gt;system.out.println("some text");&lt;/i&gt;" that i was using in other examples.&lt;br /&gt;In Java, this call hides all the complicated logic required to tell the computer to print out the text into a very simple, easy to use line of code.&lt;br /&gt;&lt;br /&gt;Because someone else did the work of writing this method for us we don't need to worry about how exactly it was done or how to do it - we only need to know what it's supposed to do, and how to use it - which is far simpler then writing it in the first place.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Comment&lt;/b&gt; - a comment is just as it sounds, commenting about the code that was written.&lt;br /&gt;Code files are no different than other text files - that is, they are simply text. The compiler takes our text and converts it into machine code. By marking certain lines as comments we can tell the compiler to ignore these lines. This allows us to communicate with the reader and provide more insight into the code.&lt;br /&gt;&lt;br /&gt;Comments are a vital component of programming languages and are one of the few tools that are dedicated to communicating our intentions to other programmers.&lt;br /&gt;&lt;br /&gt;A comment in code looks very much like other text, but it contains a marker that tells the compiler to ignore&lt;br /&gt;//This is a comment, it can contain any text we want and many special characters and we can use it&lt;br /&gt;//To help other programmers understand the code we are writing&lt;br /&gt;//For example&lt;br /&gt;//The following code computes 2 * 2 and sets the result in myVariable&lt;br /&gt;//Assign the value 2 to myVariable&lt;br /&gt;int myVariable = 2;&lt;br /&gt;//Multiply myVariable by itself, and set it to myVariable&lt;br /&gt;myVariable = myVariable*myVariable;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Classes &lt;/b&gt;- These are more complicated elements and harder to explain without more technical background. In general terms classes are a way of creating useful metaphors and using them in code. They are the foundation of what is called "Object Oriented Programming" which is the ruling paradigm in software development for many years.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What is code?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Computer code and its components serve a dual function:&lt;br /&gt;The first is to help us to describe our ideas in terms that allow us and other programmers to read understand the ideas behind the code - the purpose of what we want to achieve with the code.&lt;br /&gt;The second is that the code must translate into machine code that can perform the function for which it was written.&lt;br /&gt;&lt;br /&gt;This is duality is important to understand - all working code essentially complies with the second requirement, it will run and perform its function. The first and more important requirement - to provide a coherent picture of what the writer of the code intended is an often overlooked** and vitally important role of code. This requirement to be clear and coherent is central to the job of a programmer. It is the hardest to achieve is rarely taught.&lt;br /&gt;&lt;br /&gt;The compiler imposes certain rules, for example it requires that lines be terminated with a semicolon. It requires that a parenthesis that opened must also be closed.&amp;nbsp;It also requires the user of specific "keywords" to be used to express specific ideas. A&amp;nbsp;conditional must always take a certain form (as demonstrated above). Many compilers are "case sensitive", this means that MyVariable is a different variable then myVariable simply because one uses a different capitalization on the "m".&lt;br /&gt;&lt;br /&gt;Despite all of these constraints, the compiler doesn't particularly care about the "shape" of things or about the names of things. that is - it doesn't care what names you use, as long as you follow the rules of syntax.&lt;br /&gt;In this sense a compiler is like a strangely strict teacher that will accept any answer as long as it is spelled and punctuated correctly.&lt;br /&gt;&lt;br /&gt;The ability to name things, comment on them and use more coherent and reusable structures in code exists so that programmers can impart meaning to the code that would not exist otherwise. This meaning exists only in the minds of the programmers who read the code - the computer does not "understand" the intentions of the programmer. It does not even "see" the original code as written by the programmer.&lt;br /&gt;&lt;br /&gt;The vast majority of the lines of code written and much of the effort in writing them is dedicated conveying an idea. Of course, it's important that they actually perform the function for which they were written, but it's at least just as important and often far more important that they do so in a way that describes ideas simply, coherently and on some rare occasions - beautifully.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* - The complexity of the translation depends primarily on the language, compiler and hardware involved.&lt;br /&gt;&lt;br /&gt;** - When I was in high school my teacher would often complain that my code was completely incoherent. I would argue that it works. Only after trying in my second year of high school to re-read some code I wrote in the previous year that I really understood why writing well formatted, well commented and coherent code is so vitally important. Writing incoherent code means that to use it or change it you must first spend a long amount of time understanding it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-2036731095847260102?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/2036731095847260102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=2036731095847260102' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/2036731095847260102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/2036731095847260102'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2010/05/introduction-to-programming-what-is_22.html' title='Introduction To Programming - What is Code?'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-6617845032870147250</id><published>2010-05-17T03:17:00.000+03:00</published><updated>2010-05-17T03:17:29.189+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Introduction To Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>Introduction to programming - What is programming?</title><content type='html'>I've been wanting to write something like this for a long time.&lt;br /&gt;My goal is to try and explain computer programming and more general things about computers in a way that i hope will be interesting even to those who are not particularly interested in learning programming. &lt;br /&gt;&lt;br /&gt;So, Let's get started.&lt;br /&gt;&lt;br /&gt;What is computer programming?&lt;br /&gt;&lt;br /&gt;Well, generally speaking it's about making computers doing whatever you want them to.&lt;br /&gt;This is not to say that I or any other programmer CAN make them do anything we want, actually we work under pretty limited constraints. It is by using these rules, constraints and limitations and manipulating them that the richness of software you see around you can be achieved. &lt;br /&gt;&lt;br /&gt;In a way, practically any interaction with a computer system is about understanding, testing and manipulating it's capabilities and its bounds. Every interaction with a computer system carries within it the essence of programming.&lt;br /&gt;&lt;br /&gt;The basic job of a programmer is to use their understanding of the internal workings of computers and provide a more natural and intuitive interface so that other people can take their programs and make some use of them.&lt;br /&gt;&lt;br /&gt;It's easier to use an example, so let's talk about MS Paint. I am sure pretty much everyone saw or used MS Paint or something that resembles it at some point. &lt;br /&gt;Let's try and take a look at the basics of MS Paint through the eyes of a developer.&lt;br /&gt;We'll be working under an operating system (i.e. windows).&lt;br /&gt;&lt;br /&gt;To a programmer an operating system is an environment that provides many many services. &lt;br /&gt;In the same way that when someone wants to draw simple drawings they can open paint, choose a color and click their mouse, programmers receive tools and services from the operating system.&lt;br /&gt;We don't have to worry about controlling the movement of the mouse cursor, controlling the various complicated mechanisms required to draw something on the screen, managing the memory, hard disk or any one of the many components needed to make computers work.&lt;br /&gt;&lt;br /&gt;So what do we have to do? &lt;br /&gt;Well, the operating system, along with our programming environment already cover many of the things we want to do. they will provide us with a window to work in, buttons to click and they will let us know when the user clicks the mouse inside our window, they will also tell us where he clicked it, and which button he clicked. &lt;br /&gt;We also get something that can be thought of as a canvas that we can draw things on. To draw something we change the color of a pixel (a pixel is the smallest possible dot we can draw on the screen) to whatever color we want. &lt;br /&gt;&lt;br /&gt;A simple recipe for a program that lets you draw with the mouse might look something like this:&lt;br /&gt;1. draw a window 200x200 pixels (there is literally something called a Window or a Form and you can set its size)&lt;br /&gt;2. when the mouse is clicked, change the pixel in the same position as the mouse to the color Black. (you can "ask" the window to let you know whenever someone clicks on it, and where it happened - then you can tell the window to change the color of the pixel at that point)&lt;br /&gt;&lt;br /&gt;Doesn't look all that complicated right? that's mostly because it's really not all that complicated. it's not so far from opening paint and clicking the mouse.&lt;br /&gt;Of course, I am oversimplifying certain aspects of what needs to be done - and there are languages and operating systems where doing what I just described is far more complicated. &lt;br /&gt;&lt;br /&gt;But it's like saying that it's easier to dig a hole with a shovel then it is with your bare hands - True, but not very interesting :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In its essence, computer programming is about creating tools for other people. I doubt if any of the people who wrote MS Paint ever really used it, personally i rarely use (other than during development) any of the software I write. What we did in our little programming thought exercise was to take an idea - drawing pictures with your mouse, and used our imagination (albeit limited) and the tools at our disposal, and created something for someone else to draw with.&lt;br /&gt; &lt;br /&gt;Now that we know how to manipulate the pixels by changing their color, we don't need something like a mouse if we want to draw things on the screen, but by finding a simple interface other people can easily use we created a simple tool.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So what is computer programming? For me it is about taking our idea's, knowledge and understanding of what computers are and how they work and using it to create tools for (mostly) others to use. &lt;br /&gt;Most professional software developers writing code today do exactly this - they spend their days thinking and writing tools and solving problems so that others can become more productive.&lt;br /&gt;&lt;br /&gt;I'd be happy to get your thoughts/questions/comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-6617845032870147250?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/6617845032870147250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=6617845032870147250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/6617845032870147250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/6617845032870147250'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2010/05/introduction-to-programming-what-is.html' title='Introduction to programming - What is programming?'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-6043556300235822287</id><published>2010-04-23T03:31:00.005+03:00</published><updated>2010-04-23T14:02:25.873+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='History'/><title type='text'>No Gaming For Old Men</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;I&lt;/span&gt;&lt;/span&gt; know this might sound like the complaints of a grumpy old* gamer (because they are :) ) but i feel like i haven't played a&amp;nbsp;truly&amp;nbsp;new game in ages.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I grew up in the 80's and 90's when "electronic" games were constantly reinvented and evolved, there was always something new coming out. some better, some worse but never boring.&lt;/div&gt;&lt;div&gt;Today gaming is a multi-gazillion dollar industry and despite this, very little happened in the past decade of gaming. Especially when we compare them to the 90's and the 80's. I think probably more major genres died then evolved in recent years.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't know why, perhaps the developers are too far from the hardware, It's very easy to keep making first person shooters when you have all these great engines out there. But when ID did wolfenstine and then reinvented the genre with doom, they worked with the bits and bytes - they even&lt;a href="http://en.wikipedia.org/wiki/Fast_inverse_square_root"&gt; invented special number&lt;/a&gt; for Quake 3. There is no doubt we tend to be limited by the tools we have. Sometimes having no tools means more freedom of thought and more wild experimentation.&amp;nbsp;Perhaps its the very high cost of entering the game - there are some very powerful players in the market and perhaps its easier to make a well defined game in a well defined genre then to try something new..&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think most of all what bothers me is that i feel that there has been little or no evolution in any of my favorite genres, and in most cases there haven't even been any serious attempts to change anything.&amp;nbsp;&lt;/div&gt;&lt;div&gt;As i have some more details complaining to do, i thought i would direct my complaints at the individual genres.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Real Time Strategy&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Many would disagree but frankly i feel that there haven't been anything new in RTS's since the genre was&amp;nbsp;truly&amp;nbsp;defined by westwood with dune 2 and to a lesser extent Blizzard with Warcraft.&lt;/div&gt;&lt;div&gt;What's even more depressing is that since Starcraft - which was nothing innovative, but simply a masterpiece of balance &amp;nbsp;- there have been no (interesting/worthwhile) developments in the genre. And from what i am reading Starcraft 2 doesn't seem to be bringing anything new to the table either. I think the only game to try and bring something new to the table was the&amp;nbsp;bizarre Perimeter by CodeMasters. Sure, it was innovative for the genre - but it really didn't work.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Role Playing Games&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I love role playing games, i loved them since i first played Eye of The Beholder. Not only that, but i love most sub-genres of RPG's. My problem with this genre is that i feel it is loosing it's way recently. Western rpgs have been dying since around Gothic 2 (which together with Gothic 1 are at the top of my list). Bethesda created a beautiful game in Oblivion but was too lazy to bother with any Gameplay. Why do they leave those endless piles of crap in the game world i will never understand. I also don't see why they can't be bothered to balance their game before releasing it - If someone at Bethesda happens to read this, try to understand Auto Leveling means you never advance, which is the cornerstone of role playing gameplay. And no - your pathetic attempt at "capped" auto leveling in Fallout 3 was not "good". (but at least there was *some* point to leveling). A bigger problem is possibly that others began to follow - Boarderlands seems to use a similiar misguided system, and while it was fun to play it wasn't fun to power-play.&lt;/div&gt;&lt;div&gt;And last but certainly not least are Pirhana bytes, makers of the excellent but unjustifiably relatively-unknown Gothic and Gothic 2 (and inexcusably also Gothic 3 and Risen). Gothic (1&amp;amp;2 - i am not counting the dissapointing 3) was a wonderful series. It focused on a very simple and very clear damage system. This, along with interesting battles that truely required varied tactics for each creature, a class system that created truly&amp;nbsp;separate&amp;nbsp;gameplay (to the extent of changing some plot elements) and a perfectly balanced world where you really wanted to slay every possible enemy and gain every bit of experience you can. The system was so rewarding that you always tried to get every tiny bit of advantage while still keeping the gameplay challanging.&lt;/div&gt;&lt;div&gt;So gothic 3 was a disappointment - even if we disregard the crappy and crashing game engine, the gameplay which made the gothic series was gone. it seems to have been "simplified" for the unknown masses, and it lost the balance and&amp;nbsp;challenge&amp;nbsp;that made the previous games so great. Pirhana bytes moved on to create Risen, which is a pale unbalanced shadow of gothic with very little plot and far too easy Gameplay.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Finally, there's the KOTOR series which was excellent and a fine example in the genre and i would love to play another title in that series.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Simulation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My favorite genre in simulation is racing and i must say i have no complaints in this area - a good simulation game aspires to, well, simulate reality. Titles like Fortze Morotsport and Dirt and the first serious Need for Speed - Shift are excellent titles, the genre is constantly becoming more and more realistic with an incresingly accurate level of simulation. Sure, i can hope for some faster loading on the xbox 360 &amp;nbsp;(in some titles loading time is proportional to racing time) but other then that - love it, keep up the good work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;First Person Shooters&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Well, i could say that first persons shooters haven't really changed since the days of&amp;nbsp;Wallenstein&amp;nbsp;and doom, and in some respects that's true, but in most respects they are climbing my genre-preference&amp;nbsp;ladder.&lt;/div&gt;&lt;div&gt;Games like Farcry (excellent gameplay and excellent AI), Call of Duty - &amp;nbsp;Modern Warfare (1&amp;amp;2) &amp;nbsp; - Bringing a truely cinematic experience to FPS gameplay. In a sense FPS's and simulation have a lot to do with technology, the level of detail and quality of graphics are the first and for many the most critical factors in FPS's. Call of duty demonstrated that a great plot is just as important. All in all the genre is doing what it has always done - keep pushing the limits of the hardware to show more realistic ways of simulating shooting people with a wide variety of weapons..&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Quests (aka**&amp;nbsp;Adventure&amp;nbsp;games)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Quests are dying, and its a real shame. Actually, the genre is all but dead. Telltale games are the only ones that seem to be keeping the genre alive these days, and the&amp;nbsp;success&amp;nbsp;of their latest monkey island show that there are enough of us around to&amp;nbsp;appreciate the genre (i also recommend Strong Bad's Cool Game For Attractive People, if you read this far - this game is&amp;nbsp;definitely&amp;nbsp;for you). As one of the most&amp;nbsp;successful&amp;nbsp;genres of the 90's its surprising that almost no one is still around. Lucas Arts moved on to other pastures and Sierra basically died...very sad. &amp;nbsp;Oh, and i just remembered there's also the excellent Machinarium by Amanita Design.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Turn based Strategy/Managements&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Nothing much to say there, its hard to talk about change or advancement in this genre. Graphics are slowly improving over time, and the&amp;nbsp;notable&amp;nbsp;titles (Say Civilization) are changing and tweaking the gameplay, but somehow nothing exciting&amp;nbsp;happen&amp;nbsp;there in years. Some new and interesting title would be good. I would also settle for ...actually, i would be really excited about bringing back say Master of Orion or&amp;nbsp;Ascendancy.. You know, thinking about it i can't think of any worthwhile recent Turn based 4X game besides the Civilization series, and even that one has taken a turn for the worst with their latest "Civ Revolutions" (although civ 5 should be coming out soon, so at least they didn't abandon the fans).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Casual*** Gaming&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have a love-hate relationship with casual gaming. On the one hand this is one area of gaming where there is still a lot of innovation. there are many new kinds of addictive puzzle games,castle defense, tower defense and&amp;nbsp;notably&amp;nbsp;World Of Goo with other less-defined categories of casual gaming. On the other hand you have all those social games on Facebook and other platforms. It's not that i mind what people play, it's that i feel they are lowering the bar that game creators have worked so hard to raise all these years. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;MMORPGs&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;finally the last genre on my list - MMORPG - my nemesis.&amp;nbsp;&lt;/div&gt;&lt;div&gt;As i mentioned before - I Love RPG's and because of this i have never played an MMORPG and never will.&amp;nbsp;&lt;/div&gt;&lt;div&gt;So why have i never played an MMORPG? The simple answer is addiction.&lt;/div&gt;&lt;div&gt;When i started playing gothic 2 for the first time, i played it for about a week straight.&amp;nbsp;&lt;/div&gt;&lt;div&gt;By "a week straight" i mean that i barely ate and i slept when i could no longer concentrate on the game. I did almost nothing else. The reason i allowed myself to live with such &amp;nbsp;a level of addiction untreated is that its short-lived. Once every few years there's a title good enough to&amp;nbsp;warrant&amp;nbsp;this level of addiction, but the experience is bound to end after a very short time. Even the most search-every-corner-twice-and-then-go-back-to-make-sure gameplay of the most complex RPG will still end after 40-100 hours. MMORPG's never end - it's the whole point of them. I can't allow something to completely take over my life, so i can't even try them.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Why are they my nemesis? because a lot of excellent titles in &amp;nbsp;my favorite genre are going MMO which is leaving less and less non-MMO titles for me to play...&lt;/div&gt;&lt;div&gt;Also i am pretty sure MMO's are the first phase in the evil plan of the machines to enslaves us by making us live in a virtual world. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* - well - old in gamer terms&lt;/div&gt;&lt;div&gt;** - they are mostly known as Advanture games, but in israel we call them "Quests" (or questim in Hebrish)&amp;nbsp;&lt;/div&gt;&lt;div&gt;*** - how can anyone call spending 10 hours a day on farmville "casual"?&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-6043556300235822287?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/6043556300235822287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=6043556300235822287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/6043556300235822287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/6043556300235822287'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2010/04/no-gaming-for-old-men.html' title='No Gaming For Old Men'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-277162920409020400</id><published>2010-03-23T16:44:00.012+02:00</published><updated>2010-03-24T03:42:05.416+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Rest'/><title type='text'>Strange New Spam</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;I just got a new comment on one of my articles (&lt;a href="http://subjectively.blogspot.com/2010/02/estimating-cost-of-game-piracy.html"&gt;Estimating The Cost of Game Piracy&lt;/a&gt;) saying:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"&lt;i&gt;Well your article helped me altogether much in my college assignment. Hats off to you dispatch, will look audacious in the direction of more related articles promptly as its anecdote of my favourite subject-matter to read&lt;/i&gt;."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Every other day i get a message from some bot selling one of the spammers greatest hits.&lt;/div&gt;&lt;div&gt;Naturally when i saw another "New Message from Anonymous" i immediately suspected spam.&lt;/div&gt;&lt;div&gt;Reading the comment i wasn't sure - it starts out reasonably coherent - but "Hats off to your dispatch" really caught my eye, as well as "its anecdote of my favorite..".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The text reads very much generated - i don't know if it's some kind of place holder message for spammers or some CS student somewhere is running an experiment with generation of comments. (its an excellent way to do a low-cost turing test. most blog comments are moderated one way or another - if you managed to post a message and it wasn't deleted, you could say that the writer is reasonably estimated as a human)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So i ran a goolge search for the strange expression &lt;a href="http://www.google.co.il/search?hl=en&amp;amp;q=%22Hats+off+to+you+dispatch%22&amp;amp;meta=&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq=&amp;amp;gs_rfai="&gt;"Hats off to your dispatch" &lt;/a&gt;- currently it returns 3 results - all of them look generated, and all from the past week or so.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of them is identical to the comment above, the other are:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"&lt;i&gt;Approvingly your article helped me truly much in my college assignment. Hats off to you dispatch, choice look audacious in the direction of more related articles in a jiffy as its anecdote of my choice subject-matter to read.&lt;/i&gt;"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"&lt;i&gt;Correctly your article helped me terribly much in my college assignment. Hats off to you dispatch, wish look ahead in behalf of more cognate articles without delay as its united of my choice topic to read.&lt;/i&gt;"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;looking at the comments there are two major connecting elements:&lt;/div&gt;&lt;div&gt;"Your article helped me" and "College Assignment"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Running this through &lt;a href="http://www.google.co.il/search?hl=en&amp;amp;q=%22your+article+helped+me%22+%22college+assignment%22&amp;amp;meta=&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq=&amp;amp;gs_rfai="&gt;google&lt;/a&gt; returns about 80 hits at the moment, from my surface scan the comments are from the past week and each and every one of them seem to have been generated in the same way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wonder who was the source of this - and if it is indeed some experiment, and the experimenter happens to stumble over this post - let me know :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Update:&lt;/div&gt;&lt;div&gt;I scanned a few more of those comments (now google lists about 230 hits)&lt;/div&gt;&lt;div&gt;Seems to be related to "Debt Relief" some of the comments are named Debt Relief and where they can they link - So looks like it's just another spam flying around.&lt;/div&gt;&lt;div&gt;I guess they didn't make sure the blogs allow links before posting..&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-277162920409020400?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/277162920409020400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=277162920409020400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/277162920409020400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/277162920409020400'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2010/03/strange-new-spam.html' title='Strange New Spam'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-1262193869382821654</id><published>2010-02-28T00:28:00.040+02:00</published><updated>2010-03-01T02:45:44.396+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Statistics'/><title type='text'>Estimating The Cost of Game Piracy</title><content type='html'>&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Motivation&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few years ago we had an idea on how to create a fairly hard to crack DRM.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Coming from a security background (among other things) we knew what most people in the field know - All defenses can be breached. It is simply a matter of resources.&lt;/div&gt;&lt;div&gt;In the case of game copy protection we knew that there are considerable resources invested by hackers and crackers to break copy protection. A good[1] copy protection can buy whoever is using it a few months at most.  We figured that if we can make a sufficiently flexible and complex copy protection we can buy about 6 months for a given game before the protection is broken. &lt;/div&gt;&lt;div&gt;To see if this was a worthwhile cause we wanted to know what is the real value of a good copy protection. We also wanted to know if the 6 months we believed we can get would be good enough[2].&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I believe that the value of a good copy protection should be the number of additional copies of a given game that would be sold if the game cannot be copied  minus the number of copies that would have been sold if those resources would have gone to improving the game (or investing in marketing - in other words - the alternative cost). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is very hard to say how many copies of a game could be sold if some additional funds are put into any aspect of making a game. It is also very hard to tell how much is lost due to the additional inconvenience introduced by some of the more intrusive protections[3]. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other hand it might be possible to find out how many games could be sold if there was an unhackable copy protection. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Looking For Numbers&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In my quest for numbers i ran a search to see if there were any research that could reasonably estimate how many copies of a given game could have been sold had it been protected. &lt;/div&gt;&lt;div&gt;Unfortunately none were available. What i found was plenty of articles citing the BSA and IIPA for pirated software numbers and estimates for the loss of income due to those pirated copies. &lt;/div&gt;&lt;div&gt;This might be considered good evidence but after taking a more in depth look at the numbers and methodology i decide i don't really trust the results (i might go more into that in a seperate article - but i am certainly not the first to question those surveys) .&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also found this &lt;a href="http://www.tweakguides.com/Piracy_1.html"&gt;very comprehensive article&lt;/a&gt; about game piracy in general. I recommend it to anyone who wants to get a good understanding of the different aspects of game piracy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;So the question remained - How do you measure the actual loss due to piracy?&lt;/div&gt;&lt;div&gt;If you want to compare things, finding something that is reasonably similar is a good start. &lt;/div&gt;&lt;div&gt;Like The Economist's &lt;a href="http://www.economist.com/markets/bigmac/"&gt;Big Mac Index&lt;/a&gt;  - you want a product that is arguably of the same quality, make, reputation etc' as possible if you want to make a good comparison. &lt;/div&gt;&lt;div&gt;I think that i found such a product for piracy loss research - Cross platform titles.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;A Different Approach&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are two[4] 7th generation consoles on the market - Microsoft's Xbox 360 and Sony's Playstation 3.&lt;/div&gt;&lt;div&gt;These consoles are arguably[5] the same in terms of interface, level of graphics and the type quality and number of titles released for these consoles. &lt;/div&gt;&lt;div&gt;The Xbox 360 has been hacked many years ago (i think sometime in 2006). &lt;/div&gt;&lt;div&gt;The Ps3 on the other hand had not yet been hacked. Sony has made considerable efforts in securing the PS3 and so far - 4 years and counting - The PS3 had not been hacked.&lt;/div&gt;&lt;div&gt;My argument is that since the Xbox 360 had been hacked and the PS3 had not been hacked, the difference in sales of various titles should reflect the loss of revenue due to piracy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/_LAiWo6MNq9s/S4rz-ctPWeI/AAAAAAAAAAk/S1V2nCryIqY/s400/Console+Sales.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5443431353814047202" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 233px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;In recent years more and more titles are being released to both consoles. These games constitute a comparable (identical?) product. Most cross platform titles look the same on both consoles, distributed enjoy the same publishing houses, have the same level of publicity and the same kind of gameplay, story and whatever other aspect you may choose to consider. They are also - for the most part (and for all games considered in this research) - released at the same time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A good comparison should consider alternative or competing products. This aspect is much harder to account for. I cannot accurately or reasonably claim that it doesn't make any difference or that i can accurately measure or correct for it. I hope i can reasonably persuade you that it is of reduced importance because of two things:&lt;/div&gt;&lt;div&gt;1. If you look at the current (at the time of writing) top sellers lists of both the Xbox 360 and the PS3 you'll find that 5 of the top 10 sellers on the PS3 lists are cross platform titles (3 of them are the top sellers) and  6 of the top 10 sellers for the Xbox 360 are also cross platform. &lt;/div&gt;&lt;div&gt;2. To further reduce the impact of console specific titles on the overall numbers i tried to include as many games as i could find in the research. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Still, I acknowledge that competing exclusive titles have an impact on the overall results. But i think the numbers themselves demonstrate that this impact is not likely to be too significant.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Correcting For Console Sales Difference&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The final significant difference between the consoles is the numbers of consoles sold. &lt;/div&gt;&lt;div&gt;Currently Wikipedia  (no. for dec 2009) cites 33.5 million PS3 consoles sold vs.  39 million Xbox 360 consoles sold. For the sake of transparency i am showing the adjusted and unadjusted numbers.&lt;/div&gt;&lt;div&gt;It should be noted that without correcting for the number of consoles sold, the total number of copies sold from all titles i looked at are significantly higher on the xbox 360.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Commutative unadjusted game sales for 56 leading titles by console (unadjusted):&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://3.bp.blogspot.com/_LAiWo6MNq9s/S4nFoEr3E8I/AAAAAAAAAAU/-wCuEigOWr0/s400/commulative+unadjusted+sales.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5443098916897100738" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 257px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Without correcting by the number of consoles sold there is a predictably higher number of copies sold on the Xbox 360.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Commutative game sales from 56 leading titles by console, adjusted by the number of consoles sold:&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LAiWo6MNq9s/S4nHGpTs41I/AAAAAAAAAAc/vKSZGTV-D7Q/s1600-h/commulative+adjusted+sales.png"&gt;&lt;img src="http://2.bp.blogspot.com/_LAiWo6MNq9s/S4nHGpTs41I/AAAAAAAAAAc/vKSZGTV-D7Q/s400/commulative+adjusted+sales.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5443100541635584850" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 242px; " /&gt;&lt;/a&gt;As you can see - once we adjust to the number of consoles soled the commutative number of copies sold is almost identical. The green line at the bottom shows the difference between the consoles. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Estimating The Cost Of Piracy&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The following graph shows the ratio of adjusted PS3 sales and Xbox360 sales.&lt;/div&gt;&lt;div&gt;I believe that part of this ratio can, at least in part, be explained by piracy.&lt;/div&gt;&lt;div&gt;   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/_LAiWo6MNq9s/S4r82pTacrI/AAAAAAAAAAs/9N31dug--pQ/s400/estimated+loss+due+to+piracy.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5443441115361079986" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 231px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;According to these results the estimated loss due to piracy is around 5-10%. &lt;/div&gt;&lt;div&gt;However it should be noted that this is the case if (and its a huge IF) all of the difference between the sales of these titles between consoles is solely due to piracy. &lt;/div&gt;&lt;div&gt;There are many other factors that may effect game sales. &lt;/div&gt;&lt;div&gt;If we make the assumption that game piracy incurs a significant loss and is by far the most significant possible factor effecting sales of these titles between consoles than  this number may be accurate. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Personally i do not believe this to be the case. I believe that there are so many possible different contributing factors to the differences in sales between consoles that they must contribute (positively or negatively) to the sales of games between consoles.&lt;/div&gt;&lt;div&gt;In other words - i do not believe that there is enough of a  difference in the number of copies sold to reasonably claim that piracy incurs a measurable loss on game sales.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[1] - Good at being a copy protection. The most successful copy protections tend to be pretty evil in what they actually do.&lt;/div&gt;&lt;div&gt;[2] - We were wrong btw. it seems that games sell mostly during the 2 months before Christmas. This is probably why many releases are targeted around that time.&lt;/div&gt;&lt;div&gt;[3] - Sony BMG's care is perhaps the most famously intrusive and destructive of those. &lt;/div&gt;&lt;div&gt;[4] - Well, Nintendo would have you believe that there are 3 but you can't really compare the level of graphics or the gameplay in Wii to the other consoles. Xbox360 and PS3 are consoles for gamers. Wii is the casual gamer console. You also can't reasonably claim that the titles released to the Xbox 360 and Ps3 are the same as the ones released on the Wii.&lt;/div&gt;&lt;div&gt;[5] - This is the subject of many arguments. For the sake of full disclosure i own an Xbox 360. I (no longer) claim it has better graphics than the PS3. Only that it both consoles are practically the same.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;This is the list of title's whose sales numbers i used:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;Army of Two&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Assassin's Creed&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Bad Company&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Borderlands&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Bound in Blood&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Brutal Legend&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Burnout Paradise&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Carbon&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Dark Sector&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Dead Space&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Devil May Cry 4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;DiRT 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Fallout 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Far Cry 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;FIFA Soccer 09&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;FIFA Soccer 10&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Fight Night Round 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Fight Night Round 4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Grand Theft Auto IV&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;GRID&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Guerrilla&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Guitar Hero III&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Hell's Highway&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Los Angeles&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Madden NFL 09&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Madden NFL 10&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Mirror's Edge&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Modern Warfare 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Modern Warfare&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Mortal Kombat vs DC Universe&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;NBA 2K9&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Need for Speed Carbon&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;out.txt&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;PES 2009&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Prince of Persia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Project Origin&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ProStreet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Prototype&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Pure&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Saints Row 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Sid Meier's Civilization Revolution&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Sonic Unleashed&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;SoulCalibur IV&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Street Fighter IV&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Tales of Vesperia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The Force Unleashed&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The Simpsons Game&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Tiger Woods PGA Tour 09&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Top Spin 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Undercover&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Wet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;World at War&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;World in Flames&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;World Tour&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;WWE SmackDown vs Raw 2009&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;WWE SmackDown vs. Raw 2010&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-1262193869382821654?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/1262193869382821654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=1262193869382821654' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/1262193869382821654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/1262193869382821654'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2010/02/estimating-cost-of-game-piracy.html' title='Estimating The Cost of Game Piracy'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_LAiWo6MNq9s/S4rz-ctPWeI/AAAAAAAAAAk/S1V2nCryIqY/s72-c/Console+Sales.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-5533754994621887189</id><published>2010-02-17T01:44:00.012+02:00</published><updated>2010-02-18T01:43:36.204+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>Aspect Based INotifyPropertyChanged Implementation</title><content type='html'>There are quite a few articles floating around about how to implement an aspect oriented version of INotifyPropertyChanged Interface.&lt;div&gt;My version is based on an article by&lt;a href="http://www.codeproject.com/Articles/38865/INotifyPropertyChanged-auto-wiring-or-how-to-get-r.aspx"&gt; Tamir Khason Posted on CodeProject&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The original version had some problems - placing the Attribute on both a Parent and Child class caused an exception to be thrown and because the interface was implemented at compile time by PostSharp* it could not be used without an unsafe cast.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My version requires that the class implement the interface directly,  adds an interface that reports which property that also provides the pre-change value (useful when you want to save undo for example) and checks with any implementing class to see if anyone is registered (and skips all other checks if no one is listening...). We then check to see if there's any modification and only fire notification on change - this might not be the required behavior in all cases so the check can be easily removed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, performance is probably better, usage is pretty straight forward - implement INotifyPropertyChanged and IFirePropertyChanged and mark your class with the NotifyPropertyChanged attribute. &lt;/div&gt;&lt;div&gt;If this is implemented on a base class all children will also fire modification notification on all properties. I am adding a sample base class implementation as well.&lt;/div&gt;&lt;div&gt;Any class that extends this base class gets a free change notification for all properties.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example Base Class:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false; toolbar :false;"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using AutoPropertyChangedWiring;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;&lt;br /&gt;namespace AutoPropertyChanged&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// base class for any class that wishes to get INofityPropertyChanged for "free"&lt;br /&gt;/// any class that extends this base class will get a PropertyChanged events, auto-implemented for all properties&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;[NotifyPropertyChanged]&lt;br /&gt;public abstract class PropertyChangeNotifier : INotifyPropertyChanged, IFirePropertyChanged&lt;br /&gt;{&lt;br /&gt;public event PropertyChangedEventHandler PropertyChanged;&lt;br /&gt;&lt;br /&gt;public void FirePropertyChanged(string propertyName, object oldValue)&lt;br /&gt;{&lt;br /&gt;if (PropertyChanged != null)&lt;br /&gt;PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public bool HasPropertyListeners&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;if (PropertyChanged == null)&lt;br /&gt;return false;&lt;br /&gt;else&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Aspect Implementation and base class:&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false; toolbar :false;"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using System.Text;&lt;br /&gt;using PostSharp.Extensibility;&lt;br /&gt;using PostSharp.Laos;&lt;br /&gt;&lt;br /&gt;namespace AutoPropertyChangedWiring {&lt;br /&gt;&lt;br /&gt;public interface IFirePropertyChanged&lt;br /&gt;{&lt;br /&gt;void FirePropertyChanged(String propertyName,Object oldValue);&lt;br /&gt;Boolean HasPropertyListeners{get;}&lt;br /&gt;}&lt;br /&gt;[Serializable,  AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class, AllowMultiple = false, Inherited = true),&lt;br /&gt;MulticastAttributeUsage(MulticastTargets.Class, AllowMultiple = false, Inheritance = MulticastInheritance.Strict, AllowExternalAssemblies = true)]&lt;br /&gt;public sealed class NotifyPropertyChangedAttribute : CompoundAspect {&lt;br /&gt;public int AspectPriority { get; set; }&lt;br /&gt;&lt;br /&gt;public override void ProvideAspects(object element, LaosReflectionAspectCollection collection) {&lt;br /&gt;Type targetType = (Type)element;&lt;br /&gt;foreach (var info in targetType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly).Where(pi =&amp;gt; pi.GetSetMethod() != null)) {&lt;br /&gt;collection.AddAspect(info.GetSetMethod(), new NotifyPropertyChangedAspect(info.Name) { AspectPriority = AspectPriority });&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[Serializable]&lt;br /&gt;internal sealed class NotifyPropertyChangedAspect : OnMethodBoundaryAspect {&lt;br /&gt;private readonly string _propertyName;&lt;br /&gt;private object oldValue;&lt;br /&gt;private Boolean fireEvent;&lt;br /&gt;public NotifyPropertyChangedAspect(string propertyName) {&lt;br /&gt;if (string.IsNullOrEmpty(propertyName)) throw new ArgumentNullException("propertyName");&lt;br /&gt;_propertyName = propertyName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public override void OnEntry(MethodExecutionEventArgs eventArgs) {&lt;br /&gt;var instance = eventArgs.Instance as IFirePropertyChanged;&lt;br /&gt;fireEvent = true;&lt;br /&gt;//check if anyone is listening.&lt;br /&gt;if (!instance.HasPropertyListeners)&lt;br /&gt;{&lt;br /&gt;//no one is listening, no point in moving on.&lt;br /&gt;fireEvent = false;&lt;br /&gt;return; //no need for the other checks&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var targetType = eventArgs.Instance.GetType();&lt;br /&gt;var setSetMethod = targetType.GetProperty(_propertyName);&lt;br /&gt;if (setSetMethod == null) throw new AccessViolationException();&lt;br /&gt;oldValue = setSetMethod.GetValue(eventArgs.Instance,null);&lt;br /&gt;var newValue = eventArgs.GetReadOnlyArgumentArray()[0];&lt;br /&gt;&lt;br /&gt;if (IsEqual(oldValue,newValue)) //nothing changed, nothing to do..&lt;br /&gt;eventArgs.FlowBehavior = FlowBehavior.Return;&lt;br /&gt;}&lt;br /&gt;protected static Boolean IsEqual(Object left, Object right)&lt;br /&gt;{&lt;br /&gt;//both are null == both are equal.&lt;br /&gt;if (left == null &amp;amp;&amp;amp; right == null)&lt;br /&gt;return true;&lt;br /&gt;&lt;br /&gt;//at least one is not null, if its left - lets use it for the "Equals" method.&lt;br /&gt;if (left != null)&lt;br /&gt;return left.Equals(right);&lt;br /&gt;else //left is null, but both are not null - which means right is not null and they are not equal.&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;public override void OnSuccess(MethodExecutionEventArgs eventArgs) {&lt;br /&gt;if (!fireEvent)&lt;br /&gt;return; //no need to fire the event.&lt;br /&gt;var instance = eventArgs.Instance as IFirePropertyChanged;&lt;br /&gt;instance.FirePropertyChanged(_propertyName,oldValue);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;* -  This probably goes without saying - Using aspects requires &lt;a href="http://www.postsharp.org/download"&gt;Postsharp &lt;/a&gt;to be installed (v1.5) &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-5533754994621887189?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/5533754994621887189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=5533754994621887189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5533754994621887189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5533754994621887189'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2010/02/aspect-based-inotifypropertychanged.html' title='Aspect Based INotifyPropertyChanged Implementation'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-4975733235539991279</id><published>2010-02-15T01:52:00.006+02:00</published><updated>2010-02-15T04:17:04.297+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cars'/><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Car Safety'/><title type='text'>Simple Technologies For Better Car Safety</title><content type='html'>&lt;div&gt;I've been thinking about car accidents recently, or rather, about ways to prevent them.&lt;/div&gt;&lt;div&gt;I believe that at some point in the coming decades cars or whatever form of personalized transport we use will be fully computerized. Ultimately i do not think that regular public transportation will ever replace personalized transportation, but i do think we might have some form of automated point to point mass transportation system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are many different technologies currently being developed in the area of driving assistance, and some systems have even been implemented. Usually the way this works is that advancements are first implemented in luxury cars, and some of these technologies eventually become more widespread.&lt;/div&gt;&lt;div&gt;Some of these advancements involve various driving assistance systems, systems that "see" the road and can provide warnings and braking assistance in case the driver gets too close.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These technologies have a long way to go before they can be truly effective in preventing car accidents in common road cars. But i think that it is possible to implement some simpler technologies that may help us get closer to this future, and help us reduce car accidents in all cars.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Enhanced Brake Warning:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The first idea is to implement a slightly more sophisticated brake light system.&lt;/div&gt;&lt;div&gt;Current braking lights are pretty much boolean - on or off.&lt;/div&gt;&lt;div&gt;I think it shouldn't bee too complicated to have levels - say 3 levels (maybe even three lights) indicating "slow" brake "medium" brake and "hard" brake. &lt;/div&gt;&lt;div&gt;Modern cars have computers that control and monitor many of the car and engine functions, it shouldn't be too hard to implement a system that controls the brake light by the actual deceleration of the car instead of their current boolean implementation.&lt;/div&gt;&lt;div&gt;Why will this help? The way things work at the moment, when you see a brake light you don't know how quickly and how hard you need to brake. Your brain has to watch the car ahead and  calculate the deceleration before you can decide how hard to brake. I think this period of time can be reduced and help prevent or reduce the damage in many accidents.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Inter-Car Signaling:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The Second idea is a little more complicated, but still in the not-too-hard category.&lt;/div&gt;&lt;div&gt;There are various radar and vision based technologies used to measure the distance and velocity of nearby vehicles. These are pretty expensive at the moment and don't work well enough to depend on. &lt;/div&gt;&lt;div&gt;It should be relatively cheap to implement the following:&lt;/div&gt;&lt;div&gt;If a standardized radio transmitter , broadcasting a low power signal with a known, well defined (and fixed) frequency and power. It should be relatively simple (and cheap) to roughly determine the distance between a receiver and a near by source. The idea is to optimize such a system to detect the distance between the receiver - your car - and the transmitter of the car ahead of you, behind you, and in your general area. to be affective and reduce interference the signal should be relatively weak and pretty directional.&lt;/div&gt;&lt;div&gt;By placing the transmitters in the corners of the car and designating a specific signature for each transmitter, it is possible to get a pretty good idea of the relative position of adjacent cars.&lt;/div&gt;&lt;div&gt;If we also broadcast the speed of the car using these transmitters we can very accurately know if a car ahead of us is braking, if there might be a car coming fast in our direction when crossing an intersection. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It should be pretty cheap to manufacture if standardized, and more importantly if mandated by governments. this kind of device can be easily installed on existing cars.&lt;/div&gt;&lt;div&gt;The system can be used for anything from advanced warnings for dangerous situations to actively engaging the brakes in dangerous situations - this last option would probably be only applicable to computer controlled cars.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I believe that the future of transportation is in more advanced version of computer controlled transportation. I think that computer controlled transportation can be far more efficient in traffic direction and possibly make car accidents a thing of the past.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-4975733235539991279?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/4975733235539991279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=4975733235539991279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/4975733235539991279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/4975733235539991279'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2010/02/simple-technologies-for-better-car.html' title='Simple Technologies For Better Car Safety'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-8186154407044328173</id><published>2009-12-04T00:38:00.005+02:00</published><updated>2009-12-04T02:01:37.197+02:00</updated><title type='text'>WeakReference for lazy loading and releasing</title><content type='html'>One thing that always bothered me when working with nhibernate and lazy objects is the following problem:&lt;br /&gt;hibernate will automatically generate a wrapper proxy for your objects and fill them only when a data is requested. so far so good, but what about when i want to get rid of them?&lt;br /&gt;&lt;br /&gt;Lets start at the beginning.&lt;br /&gt;Many applications require processing large datasets, these datasets are often way too large to fit in memory.&lt;br /&gt;Another thing that is common is that many applications do not require all of the records all the time.&lt;br /&gt;Because of this ORMs like hibernate support lazy loading, you pay with an extra fetch for the benefits of a faster initial query and less memory usage.&lt;br /&gt;When a proxyed object is accessed, their data is loaded into memory and remains there until some explicit action is taken.&lt;br /&gt;in any case, a proxied object will remain in memory as long as their session is active, and they are attached to it.&lt;br /&gt;&lt;br /&gt;Now, lets look at the case of an application like the one i am currently implementing, i have a very large dataset that i wish to present to my users.&lt;br /&gt;They can only see and use a small portion of the dataset at a time, but they need to be able to access all of it.&lt;br /&gt;Our interface of choice is a single data table, and our record counts are hundreds of thousands for the average case and millions for the larger sets.&lt;br /&gt;&lt;br /&gt;Loading 100k records into memory, while possible takes about 24 seconds on my machine, and consumes about 100mb of ram.&lt;br /&gt;Obviously 24 seconds is too long for a user to wait until they get their data (There are several sets of 100k, which we switch between) and 150 mb is waay to much as it doesnt scale for our worst case, on an average user's machine.&lt;br /&gt;&lt;br /&gt;Its not hard to imagine that many other applications have similar requirements - handle large volumes of data without requiring insane amount of memory and ages to load.&lt;br /&gt;&lt;br /&gt;The classical solution to this problem is pagination - we divide our dataset into segments and execute a query to load the required page.&lt;br /&gt;This solution works pretty well in many cases, but in my particular case unless the pages are very small, page loading will be visible (And annoying) to the user.&lt;br /&gt;&lt;br /&gt;So the problem is this - how do i load data only when it's required and also allow it to be released when its not currently being used.&lt;br /&gt;I would also like the solution to be as simple as possible, and require as little management as possible.&lt;br /&gt;&lt;br /&gt;So, after thinking about it for a while i came up with this:&lt;br /&gt;Create an object that will hold some way of retrieving the full record (non lazy).&lt;br /&gt;Hold a WeakReference in that object pointing to the actual object.&lt;br /&gt;Expose a property that will check the reference, return the instance or reload it if its not there.&lt;br /&gt;&lt;br /&gt;The solution looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false; toolbar :false;"&gt;&lt;br /&gt;class WeakWrapper&amp;lt;WrappedData&amp;gt;&lt;br /&gt;{&lt;br /&gt;long id;&lt;br /&gt;WeakReference reference;&lt;br /&gt;&lt;br /&gt;public WrappedData Data&lt;br /&gt;{&lt;br /&gt;    get&lt;br /&gt;    {&lt;br /&gt;        WrappedData result;&lt;br /&gt;        //check if something is set in our reference&lt;br /&gt;        if (reference != null)&lt;br /&gt;        { //we have - lets see if it is valid&lt;br /&gt;            result = reference.Target as WrappedData;&lt;br /&gt;            if (result!=null) &lt;br /&gt;               return result; //return the data.&lt;br /&gt;        }&lt;br /&gt;        //no reference, load our data from the db.&lt;br /&gt;        result = LoadData();&lt;br /&gt;        //set the reference&lt;br /&gt;        reference = new WeakReference(result);&lt;br /&gt;        //return the result&lt;br /&gt;        return result;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// This method loads the data from an nhibernate session &lt;br /&gt;/// using the record id.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;private WrappedData LoadData()&lt;br /&gt;{&lt;br /&gt;    ISession session = ActiveRecordMediator&lt;br /&gt;   .GetSessionFactoryHolder()&lt;br /&gt;   .CreateSession(typeof(EntityType));&lt;br /&gt;    //load all the entities&lt;br /&gt;    &lt;br /&gt;    IList entities =&lt;br /&gt;        session.CreateCriteria(typeof(EntityType))&lt;br /&gt;  .Add(Expression.Eq("Id", id))&lt;br /&gt;  .List();&lt;br /&gt;    //release the session&lt;br /&gt;    ActiveRecordMediator&lt;br /&gt; .GetSessionFactoryHolder()&lt;br /&gt; .ReleaseSession(session);&lt;br /&gt;    &lt;br /&gt; return (WrappedData)entities[0];&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This solution works relatively well, but when the DataGrid that displays this data is scrolled down it takes a noticable amount of time for elements to load.&lt;br /&gt;The main reason for this is that elements are loaded individually.&lt;br /&gt;&lt;br /&gt;To avoid loading them individually, we group the calls and then load all the elements in a single statement.&lt;br /&gt;To acheive this i used a nice trick i found on &lt;a href="http://blogs.microsoft.co.il/blogs/tomershamam/archive/2009/10/01/ui-virtualization-vs-data-virtualization-part-2.aspx?CommentPosted=true#commentmessage"&gt; Tomer Shamam's &lt;/a&gt; blog.&lt;br /&gt;Tomer did implemented a similar mechanism using a custom collection and a caching mechanism. &lt;br /&gt;He used the Dispatcher Thread's prioritized InvokeLater method to deffer the invocation of the fetch until several calls have been made, and only then load the data.&lt;br /&gt;This method works much better then a single fetch method.&lt;br /&gt;My version, using The WeakReference mechanism is implemented via a modified version of the WeakWrapper, and a Bulk Loader that fetches the record via the deferred loading operation.&lt;br /&gt;&lt;br /&gt;My particular implementation uses nhibernate, and an "int" id.&lt;br /&gt;these can be easily changed for any kind of fetch (in the loader's load method) and any kind of "id".&lt;br /&gt;&lt;br /&gt;The modified wrapper looks like this:&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false; toolbar :false;"&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;///  A class that holds a weak reference to an entity.&lt;br /&gt;///  it requires an entity that implements from IEntity &lt;br /&gt;///  (which contains a single property int Id)&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;typeparam name="EntityType"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br /&gt;public class WeakEntityWrapper&amp;lt;EntityType&amp;gt; : INotifyPropertyChanged&lt;br /&gt;   where EntityType : IEntity&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;private static BulkEntityLoader&amp;lt;EntityType&amp;gt; loader&lt;br /&gt;                          = new BulkEntityLoader&amp;lt;EntityType&amp;gt;();&lt;br /&gt;public event PropertyChangedEventHandler PropertyChanged;&lt;br /&gt;private WeakReference _objectReference = null;&lt;br /&gt;private int _objectID;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// create a new wrapper with the provided id.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="objectID"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;public WeakEntityWrapper(int objectID)&lt;br /&gt;{&lt;br /&gt;    this._objectID = objectID;&lt;br /&gt;}&lt;br /&gt;public WeakEntityWrapper(EntityType entity)&lt;br /&gt;{&lt;br /&gt;    //get the id&lt;br /&gt;    this._objectID = entity.Id;&lt;br /&gt;    //save the reference&lt;br /&gt;    this._objectReference = new WeakReference(entity);&lt;br /&gt;}&lt;br /&gt;public EntityType Entity&lt;br /&gt;{&lt;br /&gt;    get&lt;br /&gt;    {&lt;br /&gt;        //check if we have an initialized reference&lt;br /&gt;        if (_objectReference!=null)&lt;br /&gt;        {&lt;br /&gt;            EntityType result = &lt;br /&gt;      _objectReference.Target as EntityType;&lt;br /&gt;            //check if we have a valid target&lt;br /&gt;            if (result!=null) &lt;br /&gt;                return result; //return the target.&lt;br /&gt;        }&lt;br /&gt;        loader.LoadEntity(this);&lt;br /&gt;        return null; //nothing for now, but soon! muahahahah&lt;br /&gt;        &lt;br /&gt;    &lt;br /&gt;    }&lt;br /&gt;    set&lt;br /&gt;    {  //the loader got back to us - &lt;br /&gt;    //set the entity and tell whoever is listening&lt;br /&gt;        _objectReference = new WeakReference(value);&lt;br /&gt;        //notify anyone who is listening&lt;br /&gt;        if (PropertyChanged!=null)&lt;br /&gt;            PropertyChanged&lt;br /&gt;     .Invoke(this,new PropertyChangedEventArgs("Entity"));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// the persistant id of the object.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public int ObjectId&lt;br /&gt;{&lt;br /&gt;    get { return _objectID; }&lt;br /&gt;    set { _objectID = value; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the main difference is that the Load method has been externalized&lt;br /&gt;and that we now have a "set" method (that will be called by the loader.&lt;br /&gt;This method will notify the viewer that it needs to update itself again, and this time it will get a non-null reference.&lt;br /&gt;&lt;br /&gt;The BulkEntityLoader uses ActiveRecord and NHibernate and looks like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false; toolbar :false;"&gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// uses deffered actions to group loading operations.&lt;br /&gt;/// this class is NOT thread safe. &lt;br /&gt;/// it expectes to be called by a single (UI) thread.&lt;br /&gt;/// &lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;typeparam name="EntityType"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br /&gt;class BulkEntityLoader&amp;lt;EntityType&amp;gt;&lt;br /&gt; where EntityType : IEntity&lt;br /&gt;{&lt;br /&gt;protected static readonly ILog Logger = &lt;br /&gt;                 LogManager.GetLogger(typeof(BulkEntityLoader&amp;lt;EntityType&amp;gt;).Name);&lt;br /&gt;//here we save all the deferred wrappers for later&lt;br /&gt;private Dictionary&amp;lt;long,WeakEntityWrapper&amp;lt;EntityType&amp;gt;&amp;gt;  deferredWrappers &lt;br /&gt;                         = new Dictionary&amp;lt;long, WeakEntityWrapper&amp;lt;EntityType&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;//flag to mark the that the deffered action should only happen once&lt;br /&gt;private volatile bool _isDeferred = false;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// NOT THREAD SAFE. FOR UI THREAD ONLY&lt;br /&gt;/// &lt;br /&gt;/// mark an entity for future loading.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="wrapper"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;public void LoadEntity(WeakEntityWrapper&amp;lt;EntityType&amp;gt; wrapper)&lt;br /&gt;{&lt;br /&gt;    //check if a deffered action was already set in place&lt;br /&gt;    if (!_isDeferred)&lt;br /&gt;    { &lt;br /&gt;        //mark our flag&lt;br /&gt;        _isDeferred = true;&lt;br /&gt;        //no deffered action, create a new one.&lt;br /&gt;        Dispatcher.CurrentDispatcher.BeginInvoke(&lt;br /&gt;           DispatcherPriority.Render,&lt;br /&gt;           (Action)LoadEntities);&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    //check if the wrapper is in our collection, if not - add it.&lt;br /&gt;    if (!deferredWrappers.ContainsKey(wrapper.ObjectId))&lt;br /&gt;        deferredWrappers.Add(wrapper.ObjectId, wrapper);&lt;br /&gt;}&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Load all the entities from the wrapper dictionary.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public void LoadEntities()&lt;br /&gt;{&lt;br /&gt;    Logger.Debug("Starting deffered action.\n"&lt;br /&gt;             +" deferring "+deferredWrappers.Count+" elements");&lt;br /&gt;    using (new SessionScope(FlushAction.Never))&lt;br /&gt;    {&lt;br /&gt;        //open a session&lt;br /&gt;        ISession session = ActiveRecordMediator&lt;br /&gt;       .GetSessionFactoryHolder()&lt;br /&gt;       .CreateSession(typeof (EntityType));&lt;br /&gt;        //load all the entities&lt;br /&gt;        IList entities =&lt;br /&gt;            session.CreateCriteria(typeof (EntityType))&lt;br /&gt;                          .Add(Expression.In("Id", deferredWrappers.Keys))&lt;br /&gt;     .List();&lt;br /&gt;        //release the session&lt;br /&gt;        ActiveRecordMediator&lt;br /&gt;                .GetSessionFactoryHolder()&lt;br /&gt;  .ReleaseSession(session);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        foreach (EntityType entity in entities)&lt;br /&gt;        {&lt;br /&gt;            //set the values&lt;br /&gt;            deferredWrappers[entity.Id].Entity = entity;&lt;br /&gt;            //remove all entities that were set&lt;br /&gt;            deferredWrappers.Remove(entity.Id);&lt;br /&gt;        }&lt;br /&gt;        //mark the end of the deffered action.&lt;br /&gt;        _isDeferred = false;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So basically we collect all the calls we get until the Dispatcher decides to invoke us.&lt;br /&gt;Once the dispatcher has time to invoke us, we process all the calls in a single query and set the property for everyone that requested an update.&lt;br /&gt;Once set, the property will fire a PropertyChange event, that will inform the UI that it needs to reload these properties.&lt;br /&gt;&lt;br /&gt;So now all that remains is loading a list of ids from the database, and setting the collection in a DataGrid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-8186154407044328173?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/8186154407044328173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=8186154407044328173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/8186154407044328173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/8186154407044328173'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2009/12/weakreference-for-lazy-loading-and.html' title='WeakReference for lazy loading and releasing'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-3210726019132710090</id><published>2009-11-27T01:01:00.013+02:00</published><updated>2009-11-27T03:31:23.868+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>The Strong Type Inheritance Pattern</title><content type='html'>Generics were originally designed to help avoid very common mistakes while coding with various simple structures. The classic examples for this are Lists and HashMaps.&lt;br /&gt;Employing these objects would result in confusion in the best case, and abuse in the form of multi-type elements in the worst case.&lt;br /&gt;Generics are a an elegant solution for this problem - A Simple List&amp;lt;MyClass&amp;gt makes a world of difference in both readability and usability of the code. It will save you both a cast and the occasional ClassCastException.&lt;br /&gt;&lt;br /&gt;So what else are generics good for?&lt;br /&gt;I think they open up new and interesting design patterns, one of may favorites is the Strong Type Inheritance Pattern (i am unaware of a different name for it).&lt;br /&gt;&lt;br /&gt;The Strong Type Inheritance pattern is a simple pattern that allows you to make use of an inheriting type's "Type" to create typesafe methods that would otherwise require more complex, less efficient and more error prone reflection.   &lt;br /&gt;&lt;br /&gt;The example below shows a simple serializer class that provides serialization to inheriting types in a typesafe way. it also uses the type name as the file name.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false; toolbar :false;"&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// This is a save/load from xml facility.&lt;br /&gt;/// it uses the class type as the file name, &lt;br /&gt;/// and so can only persist a single instance of each type.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;typeparam name="InheritingType"&amp;gt; &lt;br /&gt;/// The type of a class inheriting from this base class&lt;br /&gt;/// &amp;lt;/typeparam&amp;gt;&lt;br /&gt;public abstract class SelfSerializingBase&amp;lt;InheritingType&amp;gt;&lt;br /&gt;where InheritingType : SelfSerializingBase&amp;lt;InheritingType&amp;gt;&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Load the inheriting type from an xml, &lt;br /&gt;/// use the type name as the file name&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;public static InheritingType LoadFromXml()&lt;br /&gt;{&lt;br /&gt;    //create a serializer for the inheriting type&lt;br /&gt;    XmlSerializer serializer = &lt;br /&gt;        new XmlSerializer(typeof(InheritingType));&lt;br /&gt;    //get a stream to load from&lt;br /&gt;    FileStream stream = &lt;br /&gt;        new FileStream(typeof(InheritingType).Name, FileMode.Open);&lt;br /&gt;    //deserialize and return the result&lt;br /&gt;    return (InheritingType)serializer.Deserialize(stream);&lt;br /&gt;}&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Save the current instance to an xml.&lt;br /&gt;/// Use the type name as the file name.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public void Save()&lt;br /&gt;{&lt;br /&gt;    //create a serializer for the inheriting type&lt;br /&gt;    XmlSerializer serializer = &lt;br /&gt;        new XmlSerializer(typeof(InheritingType));&lt;br /&gt;    //create a new file&lt;br /&gt;    FileStream stream = &lt;br /&gt;        new FileStream(typeof(InheritingType).Name, FileMode.CreateNew);&lt;br /&gt;    //serialize ourselves to the file.&lt;br /&gt;    serializer.Serialize(stream, this);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// A freeloading child that gets everything for free &lt;br /&gt;/// and doesn't do anything itself.&lt;br /&gt;/// The code for the child is even shorter than our summery!&lt;br /&gt;/// :)&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public class SerializingChild : SelfSerializingBase&amp;lt;SerializingChild&amp;gt;&lt;br /&gt;{&lt;br /&gt;public int SomeProperty { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class TestClass&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// An example of how we would use the methods from the parent.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public static void TestSerialization()&lt;br /&gt;{&lt;br /&gt;    //create an instance&lt;br /&gt;    SerializingChild child = new SerializingChild();&lt;br /&gt;    //set our property&lt;br /&gt;    child.SomeProperty = 10;&lt;br /&gt;    //serialize the instance&lt;br /&gt;    child.Save();&lt;br /&gt;    //load the instance&lt;br /&gt;    child = SerializingChild.LoadFromXml();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lets examine the base class definitions, which is what this pattern is all about:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false; toolbar :false;"&gt;&lt;br /&gt;&lt;br /&gt;public abstract class SelfSerializingBase&amp;lt;InheritingType&amp;gt;&lt;br /&gt;where InheritingType : SelfSerializingBase&amp;lt;InheritingType&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So what we have is a base class that has a seemingly cyclic definition.&lt;br /&gt;It expects a generic type , and it also expects this generic type to be an extender of itself.&lt;div&gt;The intention here is to say that inheriting types should pass their own type if they wish to use use these facilities.&lt;br /&gt;An important part of this pattern is the limiting "where" clause that requires any  type that wishes to use this base class to use a child which inherits from this base class. This limit is not required by the functionality - this class could easily have been a "serializer" facility that provides a load/save functionality, but in our design we wish to mandate that ONLY inheriting types are allowed to have access to this functionality.&lt;br /&gt;The Generic magic here is that we get a static method of any extending type which is type-safe and implemented just one.&lt;br /&gt;&lt;br /&gt;Ok, so we can use the type of an inheriting class and we force this type to inherit from the base - but what is it really good for?&lt;br /&gt;A good example for using this pattern is in castle's &lt;a href="http://www.castleproject.org/activerecord/documentation/trunk/usersguide/class.html"&gt;ActiveRecord&lt;/a&gt;. ActiveRecord provides various database access facilities to inheriting classes, it is effectively a thin wrapper across NHibernate's functionality ( - in this implementation, ActiveRecord itself is an interesting and useful pattern for persistent objects). &lt;/myobject&gt;&lt;div&gt;&lt;myobject&gt;This is only a partial example however,  because castle's  ActiveRecord source code does not include the "where" clause, which should be a part of the pattern - since the purpose of the clause is to inform  (and force) the  developer using this class that the intention of the framework is that you extend this class.&lt;/myobject&gt;&lt;div&gt;If a developer misunderstands the design of a base class implementing a Strong Type Inheritance they will get a complier error and hopefully read the documentation and change their implementation to comply with the intended design.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One important point we must pay attention to when we use this pattern is that the generic type is expected to be the FINAL type of the entity, if we wish to extend the base class with another class that adds functionality but is still abstract - we must add the same InheritingType to its class signature. once we set an actual type to the generic definition, we sealed all future generations from using the base class's generic facilities. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example - if we happen to extend SerializingChild with say YetAnotherChild, we are exposing a "save" method that can only save the components of a SerializingChild. This is a strange an unexpected behavior for a developer using YetAnotherChild and will likely lead to abuse and inevitably to increased cost of maintenance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-3210726019132710090?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/3210726019132710090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=3210726019132710090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/3210726019132710090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/3210726019132710090'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2009/11/strong-inheritance-pattern.html' title='The Strong Type Inheritance Pattern'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-4898854347572798087</id><published>2009-07-31T01:14:00.043+03:00</published><updated>2009-08-01T03:08:29.342+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Typesafe abstractions with .net generics</title><content type='html'>The common example for generics in .net (and java) is usually for typesafe collections and typesafe operations. Safety in the workplace is very important so it's a good idea to use generic collections whenever possible. However generics, especially in .net (java generics are mostly fake) can be very powerful things to incorporate as part of our design (Made up fact - did you know that catching a ClassCastException is the no.2 cause of head injury among developers? The no.1 cause is NullPointerExeption!).&lt;br /&gt;&lt;br /&gt;So the first example i want to talk about is of using generics to help us define a clear relationship between an abstract base class and it's children.&lt;br /&gt;&lt;br /&gt;Generally speaking, we use an abstract base class when we have some common responsibilities for all the children, but the base class itself lacks some functionality and cannot be instantiated.&lt;br /&gt;&lt;br /&gt;We can use a generic type definition for the abstract base to further refine this relationship and provide the inheriting classes with a type specific method signature they need to implement.&lt;br /&gt;Without generics we'd be stuck with the lowest common denominator (just like on the tonight show).&lt;br /&gt;&lt;br /&gt;So here is an example of some abstract base class that does some work, and delegates the type specific work to the children:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false; toolbar :false;"&gt;&lt;br /&gt;public abstract class AbstractProductCreator &amp;lt;SourceType,TargetType&amp;gt;&lt;br /&gt;   where SourceType : Material&lt;br /&gt;   where TargetType : Product&lt;br /&gt;{&lt;br /&gt;   public TargetType CreateProduct(SourceType material)&lt;br /&gt;   {   //let's call this "buisness logic" :)&lt;br /&gt;       preprocessMaterial(material);&lt;br /&gt;       //get the product from the inheriting child&lt;br /&gt;       TargetType product = ProcessMaterial(material);&lt;br /&gt;       //do some more "buisness logic"&lt;br /&gt;       finalizeProduct(product);&lt;br /&gt;       //return the completed, type specific product!&lt;br /&gt;       return product;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;   private void PreprocessMaterial(Material material)&lt;br /&gt;   {&lt;br /&gt;       //umm..lets say we melt it...&lt;br /&gt;   }&lt;br /&gt;   private void FinalizeProduct(Product product)&lt;br /&gt;   {&lt;br /&gt;       //put it in a shiny box?&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   //the only method our children will have to implement&lt;br /&gt;   public abstract TargetType ProcessMaterial(SourceType source);&lt;br /&gt;   //without generics this method signature would be:&lt;br /&gt;   //public abstract Product ProcessMaterial(Material material);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So our AbstractProductCreator  does some type specific work with the generic level he knows and hands it to the child for the specifics, and then finalizes it before returning.&lt;br /&gt;&lt;br /&gt;our child only needs to do what it is supposed to, and to define its own rule (what gets converted into what).&lt;br /&gt;Here's an example of a famous inheritance of this base class:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false; toolbar :false; "&gt;&lt;br /&gt;class IPhoneCreator : AbstractProductCreator &amp;lt;RainbowsAndBunnies,IPhone&amp;gt;&lt;br /&gt;{&lt;br /&gt;public IPhone ProcessMaterial(RainbowsAndBunnies rnb)&lt;br /&gt;{&lt;br /&gt;   //this is the actual implementation of the IPhone creation process.&lt;br /&gt;    return new IPhone(rnb.GetBunnies(),rnb.GetBunnies());&lt;br /&gt;   //its, um..copyrighted i think..so..um..dont tell anyone you saw it here..&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Once we define our child, we completely define the scope of our responsibility.&lt;br /&gt;Visual studio's Intellisense will also implement the skeleton of the method for us if we perform the right ceremony. (right click on the abstract class name+ implement methods if i recall correctly).&lt;br /&gt;&lt;br /&gt;The downside of this pattern, and its an unfortunate common pitfall of generics in general - is that once you start defining something in generic terms, it tends to infect your application.&lt;br /&gt;Anyone who uses an instance of our children doesn't have to worry about the generic type definition, but usually some other layer of our application that orchestrates a more fundamental mechanism doesn't really care about the specific type and wants to treat everything in more abstract terms.&lt;br /&gt;&lt;br /&gt;This layer may want to have access to the AbstractProductCreator, but cant because this layer will have to define a variable that looks something like:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false;  toolbar :false;"&gt;&lt;br /&gt;AbstractProductCreator &amp;lt;SomeMaterialtype,SomeOtherMaterialType&amp;gt; creator;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This sort of thing is really very far from what we originally intended.&lt;br /&gt;So what we want is some way of abstracting things for the lower layers of the application into the most general terms they need to know about while maintaining type specific implementations in the higher layers.&lt;br /&gt;&lt;br /&gt;So, how do we solve this problem?&lt;br /&gt;&lt;br /&gt;There's a nice method i came up with after thinking about this problem for a few days.(challenge: without reading on, try to think of a solution. code it (the first few attempts are likely to reach some dead end). if it can compile and run, let me know how long it took you to solve it).&lt;br /&gt;&lt;br /&gt;The solution:&lt;br /&gt;Our abstract base class can already invoke the typesafe methods of it's children. now we only need some way of invoking the abstract base without all the generic additions.&lt;br /&gt;To do that we add a new interface!&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false;  toolbar :false;"&gt;&lt;br /&gt;public interface ProductMaker&lt;br /&gt;{&lt;br /&gt;    public Product MakeProduct(Material material);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Our base class can implement this interface and&lt;br /&gt;&lt;br /&gt;public abstract class AbstractProductCreator &amp;lt;SourceType, TargetType&amp;gt;&lt;br /&gt;    where SourceType : Material&lt;br /&gt;    where TargetType : Product&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    public Product MakeProduct(Material material)&lt;br /&gt;    {&lt;br /&gt;        //make sure someone is not trying to hand us the wrong kind of material.&lt;br /&gt;        if (!material.GetType().Equals(typeof(SourceType)))&lt;br /&gt;            throw new Exception("Type " + material.GetType() + " not supported  by" + this.GetType());&lt;br /&gt;        //the only cast ugliness we introduce.&lt;br /&gt;        return this.CreateProduct((SourceType)material);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    public TargetType CreateProduct(SourceType material)&lt;br /&gt;    {&lt;br /&gt;        //same as before..&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now the lower layers can refer to the abstract base through the interface, and not worry about the Generic type definitions at all!&lt;br /&gt;&lt;br /&gt;i.e.&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false;  toolbar :false;"&gt;&lt;br /&gt;maker.MakeProduct(product);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Without generics we'd be lost. No generics means we can either do the type specific implementation and lose the abstraction, or use the abstraction but then no one can use the type specific and all the inheriting classes have to do the casts themselves.&lt;br /&gt;&lt;br /&gt;I hope you enjoyed this article,any comments/questions/criticism/praise/award nominations are welcome as usual.&lt;br /&gt;&lt;br /&gt;On the next episode i'll give an example of how to extend this concept into a constructing a binding layer that allows both the lower and upper layers to be separate and type specific.&lt;br /&gt;I will also be exposing the manufacturing process of the mac book air.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-4898854347572798087?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/4898854347572798087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=4898854347572798087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/4898854347572798087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/4898854347572798087'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2009/07/typesafe-abstractions-with-net-generics.html' title='Typesafe abstractions with .net generics'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-802981837033034145</id><published>2009-07-28T00:32:00.016+03:00</published><updated>2009-08-01T03:07:23.000+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Thinking outside the checkbox</title><content type='html'>I was talking to dan - a good friend of mine, and he was telling me a horror story about purchasing a shiny new netbook. He was overall very pleased with the hardware: the size, noise level, price and performance all suited him perfectly for his application - a battery backed webserver he can put in a closet and forget about.  The problem was with the operating system, or rather the flood of popups, warnings, wizards and  welcome messages that took a good 15 minuets to clear.&lt;br /&gt;&lt;br /&gt;You see, dan is by no means a novice when it comes to using computers. He spent a few years doing system administration and is one of the best developers i know.  But he spent the last couple of years using a macbook and probably more then that since his last windows installation. He has long forgotten what it feels like to configure a windows machine after it was installed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When you install office 2007 there is some live plugin that can be installed. if it is installed you are faced with a welcome screen. you have a checkbox you can check if you dont want to see this message again. then you have two options - click ok, which supposedly also takes you through some configuration, or click cancel.&lt;br /&gt;&lt;br /&gt;What do you do?&lt;br /&gt;&lt;br /&gt;If i check the checkbox and cancel, will it show up next time? if i click ok, do i have to go to another annoying popup?&lt;br /&gt;In my case it turns out neither option workes to disable this popup because a bug in the installation process failed to create the registry entry for this plugin. Since the checkbox was never saved it kept popping up no matter what combination of checkbox+ok/cancel i used.&lt;br /&gt;&lt;br /&gt;I am a great believer in keeping things simple. it doesn't matter if you are designing a framework,  designing your UI or writing a document. Things should be as simple as possible.&lt;br /&gt;Solving a complicated problem in a complicated way is easy. solving a simple problem in a complicated way is easier. As a common rephrasing* of H.L  Mecken's quote goes -"Complex problems have simple, easy to understand, wrong answers". This is why i try to keep things as simple as possible. The challenge is to keep the simple things simple and  complex things as simple as possible.&lt;br /&gt;&lt;br /&gt;Why am i telling you all this? Because i think that it's the lazy and indecisive designer that leaves all the options open and visible. I think they are lazy because they didn't take the time to think about how they can simplify things down to their core essentials. I think they are indecisive because they make someone else choose instead of researching and thinking about the problem enough to reach a decision themselves.&lt;br /&gt;&lt;br /&gt;If i was designing an application with a "welcome" or "splash" or any other annoying popup screen, and 99% of the users would -  as their very first user experience with my application - click on a checkbox that means "stop annoying me" and cancel, i didn't go that extra mile.Or lets be honest, that extra inch. I think that if every developer who creates such a page received a dollar whenever someone actually read the welcome screen and lost one whenever they check the box and cancel we'd have some very poor developers and very few of these messages.&lt;br /&gt;&lt;br /&gt;I think the key is to design for simplicity.To try not to popup to many windows, make as many decisions as you can for your users. Use everything at your disposal to limit the information presented to the user to the minimum, relevant information to the particular view/function of the frame they are looking at. If a view deals with more then one "topic" or "issue", it should probably be separated. I also think one must always consider the limited nature of a checkbox before using it as the means to answer a question.&lt;br /&gt;Oh, and try to avoid the "we'll make it floating/detaching/docking/toolbox" type solutions - these are usually the lazy indecisive type solutions. most users will never change your default setup. they don't care that they can configure and change almost anything. they just want to use it without spending hours configuring it to be usable.&lt;br /&gt;&lt;br /&gt;Another thing i think desktop application developers should do is take some notes from the online world. These days many websites track very carefully how users get to their site, where do they go, where do they exist at,they follow every user's clickpath through their website, they track ad clicks, and any other statistic they can receive. This information is easy to get and can be very useful.&lt;br /&gt;&lt;br /&gt;In the offline world this sort of thing is a bit more complicated. i did a surface search to see if there are any common frameworks for tracking this sort of thing, or any common methodology for this and i couldn't find one.&lt;br /&gt;Wrapping all your controls in UI usage statistics gathering can be a bit of a hassle, but i would expect the leading providers of UI controls to pick up the glove and implement such mechanisms, along with their analysis tools. Frameworks that help create clean and usable UI will add great value to application developers.&lt;br /&gt;I think developers of desktop applications should use their QA and beta testers to gather this sort of statistics btw - don't ask your users- it annoys them, and it makes them wonder how exactly you will be tracking them.&lt;br /&gt;&lt;br /&gt;I'd like to add that usage tracking is to UI usability as profiling is to performance - it helps you solve problems and improve the situation, but it only solves a problem you already created.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As for dan, well - he did what he had planned from the start - he installed ubuntu. you can visit his netbook &lt;a href="http://lateignition.net/wordpress/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* - the actual quote is "There is always an easy solution to every human problem—neat, plausible, and wrong."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-802981837033034145?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/802981837033034145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=802981837033034145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/802981837033034145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/802981837033034145'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2009/07/thinking-outside-checkbox.html' title='Thinking outside the checkbox'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-6113073445919201132</id><published>2009-03-31T00:07:00.015+03:00</published><updated>2009-03-31T13:34:10.382+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='History'/><title type='text'>Blast From The Past</title><content type='html'>A long long time ago, in the days before the Weird World Web.  In a time of BBS’s and modems. A time when viruses roamed every floppy disk and computers were IBM Compatible.&lt;br /&gt;In that faraway past just before the last decade of the 20th century a game was created by Activision.&lt;br /&gt;&lt;br /&gt;This game was far ahead of it’s time. So far in fact that since its creation it was never again duplicated. Many tried, none succeeded.&lt;br /&gt;&lt;br /&gt;I  am speaking of course about &lt;a href="http://en.wikipedia.org/wiki/Deathtrack"&gt;Death Track&lt;/a&gt; (cue insane laugh).&lt;br /&gt;&lt;br /&gt;You may find yourself thinking: "Death Track?... Death... Track? Really? I mean Death and Track?? "&lt;br /&gt;Yes. Really!&lt;br /&gt;&lt;br /&gt;I know the name is pretty lame (lame is also pretty lame)* but the game is not. You see, Death Track had everything. It had cars with cool and exciting weapons, it had contract killing and it had upgrades.&lt;br /&gt;&lt;br /&gt;Ok, let me explain:&lt;br /&gt;Death Track was the first Racing+Shooting game i ever played. I have played all racing+shooting games i could get ever since. No game was ever like Death Track. It may just be the nostalgia talking but i really think that at least until this point in time, it has never been surpassed in it's genre.&lt;br /&gt;&lt;br /&gt;Many games since added some element of weaponry or destruction, but no racing game i know was solely dedicated to killing off your opponents. To facilitate this the game offered a wide array of weapons:&lt;br /&gt;Machine guns, Lasers, Mines, Missiles, Ram Spikes and more. All the weapon systems in the game were upgradable. This was a very important element in the gameplay. you always wanted more: better weapons, better armor, faster engine. There were plenty of things you wanted to upgrade. Some helped you make money by winning races while others helped you win races by killing off the competition.&lt;br /&gt;&lt;br /&gt;Of course, the competition didn't wait around for your to kill it. They would go after you as well. The game also featured contract eliminations that won you large sums of money if you succeeded. These were substantial enough to focus on killing your target even if you didn't get 1'st prize from winning the race.&lt;br /&gt;&lt;br /&gt;I think that the upgrade elements were an important part of what made it so addictive. The game managed to always keep you wanting more, and you got to feel a real sense of acheivement when you got that next upgrade. And it payed off too. There is nothing more satisfying than blowing up your nemesis with your new tracking missiles.&lt;br /&gt;&lt;br /&gt;I wonder why this was never done since. There are plenty of racing games around, and plenty of racing game engines. Many of which feature arcade to ultra-realistic damage systems. I  would really love to see an arcady Need For Speed based game combining weapons, upgrades and total destruction.&lt;br /&gt;&lt;br /&gt;On that note i would like to say that many of the console racing games have this element of certain upgrades opening up only after you played part of the game. I think this is really the wrong way to keep players interested. Money is a great way to achieve this: Its clear and its a simple way to give you multiple alternatives. If you feel that the only thing stopping you from getting to that next upgrade is X amount of $ its a whole other thing then knowing you need to complete the next stage or circuit. The fact that you have to comparmise and think about what to upgrade adds certain elements longer term strategy.&lt;br /&gt;&lt;br /&gt;In many games you don't even know what's available. Give me the option to buy things and make the purchase worth-while. Let me feel i get an edge, a sort of "cheating" advanted over my oponents that really makes a difference in the game. The best way to keep gamers interested is by dangling the possibility right in front of them, and allowing them to choose how they get it.&lt;br /&gt;If i want to play that same level 10 times on an easier setting to get the money for the upgrade i want - give me that option.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Its now twenty years since Death Track came out, and it seems like i should maybe let go of my dream of playing a game like that again on modern hardware, engine and graphics. But if there ever was an industry that keeps recycling the classics its the gaming industry.&lt;br /&gt;&lt;br /&gt;My only fear is that it comes out exclusively for PS3...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Addendum:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mmmm....I have just been informed that i am an idiot. turns out that in the &lt;a href="http://en.wikipedia.org/wiki/Deathtrack"&gt;very link&lt;/a&gt; i added was the link to the New version of &lt;a href="http://www.death-track.com/overview.html"&gt;Death Track!&lt;/a&gt;&lt;br /&gt;I am downloading the demo now. Thanks Dan, I Can't tell you how exciting it is to finally play Death track with modern graphics.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* - That's a triple lame sentence. This is the first time such a fete has been attempted. Do not try this at home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-6113073445919201132?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/6113073445919201132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=6113073445919201132' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/6113073445919201132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/6113073445919201132'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2009/03/blast-from-past.html' title='Blast From The Past'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-440677326319674193</id><published>2009-03-30T03:02:00.008+03:00</published><updated>2009-03-30T04:22:00.008+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='Statistics'/><title type='text'>Trivial Statistics</title><content type='html'>So we got the new &lt;a href="http://www.xbox.com/en-US/games/s/sceneitbos/"&gt;Scene It? Box Office Smash&lt;/a&gt; for the xbox 360.&lt;br /&gt;We really like trivia games and we especially enjoy the Scene It series (we also have Lights, Camera, Action).&lt;br /&gt;We like the subject, but much more than that we enjoy the presentation. Questions like anagrams, pictogram, skewed images that gradually clear, sound bites that require that you pay attention to the details etc'.  All in all its a well made game with original question presentation. It also has the advantage of being one of the too few 4 player games (on the same xbox).&lt;br /&gt;&lt;br /&gt;However, there is a serious downside to the game and it has to do with the way questions are selected.&lt;br /&gt;In Scene It? Lights,Camera, Action there were 1,800 new questions (For some reason this information on Box Office Smash is hard to track down).  Unfortunately we never got to experience all these questions because relatively quickly we started noticing questions repeating. This got me thinking: there are 1,800 questions and there's no way we played long enough to see 1,800 questions,  why are we seeing repeats?&lt;br /&gt;&lt;br /&gt;The cause as it turns out, is statistics. Specifically a phenomenon similar to the &lt;a href="http://en.wikipedia.org/wiki/Birthday_paradox" target="_blank"&gt;birthday paradox&lt;/a&gt;.&lt;br /&gt;Quick review for those who are not familiar with the birthday paradox and can't be bothered to read the &lt;a href="http://en.wikipedia.org/wiki/Birthday_paradox"&gt;wiki page&lt;/a&gt;:&lt;br /&gt;If you sit in a room with a group of 23 randomly selected people (like a classroom) there's a 50 percent chance 2 people in the room have the same birthday.&lt;br /&gt;for 57 people there's &gt;99% chance for two people to have the same birthday.&lt;br /&gt;To get the general idea why your intuition (that this is sounds wrong) is wrong, think of the 2 kids in your elementary school or high school class that had the same birthday.&lt;br /&gt;Oh, and think of how many people you know that also had 2 kids with the same birthday in their class (hint: you went to school with them :) )*.&lt;br /&gt;&lt;br /&gt;How is this the same for a game that randomly selects questions?&lt;br /&gt;Without going into the math too much lets assume you played the game for a little while and you saw 180 questions (10%).&lt;br /&gt;At this point, the probability that the next question is a question you already answered is ~1/10. This already is high enough to be discouraging. Worse yet, the expected number of repeat questions until you reach 180 questions is ~8.4! (because of the birthday paradox).&lt;br /&gt;Now lets assume you played long enough to answer 600 (~33%)  questions in the game. Out of the 600 question ~80(!!) are expected to be repeats. Needless to say, if you saw a third of the questions (you need to answer more then 600 questions for that) then one in every three questions will be one that you saw already.&lt;br /&gt;At 1/10 its annoying. at 1/3 the game is unplayable. So everybody loses. You enjoy only about a third of the value you thought you were getting from the game, and the game developer works very hard to create 1,200 more questions that you will never see.&lt;br /&gt;&lt;br /&gt;The good news is that there is a pretty simple solution for this problem that works out well for everyone.&lt;br /&gt;You see, the problem stems from the method of randomly selecting the questions. Fortunately there is a different method that both guarantees randomly selected questions  and no repetitions. instead of "rolling the dice" every time we need to select a game we select a permutation of the sequence of questions (in simple terms - we randomly rearrange the sequence of questions) and save this permutation. This guarantees that you will see all 1,800 questions before you see a question you know.&lt;br /&gt;Since 1,800 is a decent number of questions there's a good chance that you will forget the earlier questions in the sequence. But even if you don't - at least you get to enjoy all of the questions in the game.&lt;br /&gt;&lt;br /&gt;BTW: On&lt;a href="http://www.xbox.com/en-US/games/s/sceneitlightscameraaction/" target="_blank"&gt; xbox.com&lt;/a&gt; Feature listing for the game mentions a "minimal repeat" feature for the game which keeps track of questions answered to minimize repeats.&lt;br /&gt;I don't know how that feature is implemented, but i can tell you from experience that it doesn't seem to work very well as we saw plenty of repeats. Besides, there's no reason the number of repeats should be anything other then zero.&lt;br /&gt;&lt;br /&gt;Oh, and as for the issues of online play and playing against different players etc'. There are solutions to all of these problems (generate a permutation for the unseen subgroup on all player's lists, you can also add a timestamp to the question to ensure a 'long' time between repeats). I know it's not ideal and i know that there are details to work out. But i believe that this is a core issue for any trivia game and a great game needs to give the very best possible solution.&lt;br /&gt;&lt;br /&gt;One final point, and i may be way off on this one. I think if i knew that i was running out of questions or if there was some way of indicating to me that i saw most of what's available, it would encourage me to get the question packs. It might be nice if this was done automatically (you only have 200 questions left, why not try the XYZ expansion).&lt;br /&gt;&lt;br /&gt;* - yes, yes, i know *technically* its statistical lie. But what better way to fight faulty statistical intuition than faulty statistical intuition?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-440677326319674193?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/440677326319674193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=440677326319674193' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/440677326319674193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/440677326319674193'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2009/03/trivial-statistics.html' title='Trivial Statistics'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-7011348111164187025</id><published>2009-03-23T02:20:00.005+02:00</published><updated>2009-03-23T02:57:03.576+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nonsense'/><category scheme='http://www.blogger.com/atom/ns#' term='The Rest'/><title type='text'>Amazing!!! The Future of cell phones is here now!!!!</title><content type='html'>Check this out, it’s this amazing invention! The &lt;a href="http://www.slashgear.com/modu-unveil-modular-cellphone-jackets-promise-big-mwc-launch-news-1133813/"&gt;MODU&lt;/a&gt;!&lt;br /&gt;It’s a cell phone, right?&lt;br /&gt;&lt;br /&gt;And, get this – it comes in different shapes!!!!&lt;br /&gt;&lt;br /&gt;Its so cool and innovative!!!!&lt;br /&gt;I mean, think of the possibilities: you can have like , a yellow slider pone, or like an angular little phone, or this tiny thing with no numbers on it, or like a crazy psychedelic phone with like really small buttons!!!&lt;br /&gt;&lt;br /&gt;They will make millions! Billions even! Of possibly dollars!&lt;br /&gt;And you will never believe the specs! Its 2.5 Gen (like the amazing non 3g version of the iphone 1.0)&lt;br /&gt;It has Bluetooth (like the iphone)&lt;br /&gt;It doesn’t have a built in GPS (like the iphone non-3g)&lt;br /&gt;And it has 2 Gig of flash (less (thus lighter) then the cheapest version of the first iphone)!!!&lt;br /&gt;You know, it amazingly also costs like half of what the iphone costs, plus you get 2 jackets! So it’s like 4 times better! Actually you can use the modu without the jacket, so its like 6 times better! So its even mathematically proven to be superior! With numbers!&lt;br /&gt;&lt;br /&gt;And if that’s not enough, they have a touch screen. But unlike the silly iphone, it’s not going to do things when you touch the screen, only when you touch the buttons. I mean, the iphone hardly HAS any buttons, the modu has 7 buttons on the tiny version alone! It’s like, obviously if you want to do something you click the BUTTONS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To show how amazing and cool the modu is, I have made this table of comparison.&lt;br /&gt;Using this table you can clearly see the superiority of the Modu!&lt;br /&gt;&lt;br /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;HE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:1;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:Calibri;  panose-1:2 15 5 2 2 2 4 3 2 4;  mso-font-charset:0;  mso-generic-font-family:swiss;  mso-font-pitch:variable;  mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:Arial;  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:Arial;  mso-bidi-theme-font:minor-bidi;} .MsoPapDefault  {mso-style-type:export-only;  margin-bottom:10.0pt;  line-height:115%;} @page Section1  {size:8.5in 11.0in;  margin:1.0in 1.25in 1.0in 1.25in;  mso-header-margin:.5in;  mso-footer-margin:.5in;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin-top:0in;  mso-para-margin-right:0in;  mso-para-margin-bottom:10.0pt;  mso-para-margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"Times New Roman";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;} table.MsoTableLightShadingAccent1  {mso-style-name:"Light Shading - Accent 1";  mso-tstyle-rowband-size:1;  mso-tstyle-colband-size:1;  mso-style-priority:60;  mso-style-unhide:no;  border-top:solid #4F81BD 1.0pt;  mso-border-top-themecolor:accent1;  border-left:none;  border-bottom:solid #4F81BD 1.0pt;  mso-border-bottom-themecolor:accent1;  border-right:none;  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin:0in;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  color:#365F91;  mso-themecolor:accent1;  mso-themeshade:191;} table.MsoTableLightShadingAccent1FirstRow  {mso-style-name:"Light Shading - Accent 1";  mso-table-condition:first-row;  mso-style-priority:60;  mso-style-unhide:no;  mso-tstyle-border-top:1.0pt solid #4F81BD;  mso-tstyle-border-top-themecolor:accent1;  mso-tstyle-border-left:cell-none;  mso-tstyle-border-bottom:1.0pt solid #4F81BD;  mso-tstyle-border-bottom-themecolor:accent1;  mso-tstyle-border-right:cell-none;  mso-tstyle-border-insideh:cell-none;  mso-tstyle-border-insidev:cell-none;  mso-para-margin-top:0in;  mso-para-margin-bottom:0in;  mso-para-margin-bottom:.0001pt;  line-height:normal;  mso-ansi-font-weight:bold;  mso-bidi-font-weight:bold;} table.MsoTableLightShadingAccent1LastRow  {mso-style-name:"Light Shading - Accent 1";  mso-table-condition:last-row;  mso-style-priority:60;  mso-style-unhide:no;  mso-tstyle-border-top:1.0pt solid #4F81BD;  mso-tstyle-border-top-themecolor:accent1;  mso-tstyle-border-left:cell-none;  mso-tstyle-border-bottom:1.0pt solid #4F81BD;  mso-tstyle-border-bottom-themecolor:accent1;  mso-tstyle-border-right:cell-none;  mso-tstyle-border-insideh:cell-none;  mso-tstyle-border-insidev:cell-none;  mso-para-margin-top:0in;  mso-para-margin-bottom:0in;  mso-para-margin-bottom:.0001pt;  line-height:normal;  mso-ansi-font-weight:bold;  mso-bidi-font-weight:bold;} table.MsoTableLightShadingAccent1FirstCol  {mso-style-name:"Light Shading - Accent 1";  mso-table-condition:first-column;  mso-style-priority:60;  mso-style-unhide:no;  mso-ansi-font-weight:bold;  mso-bidi-font-weight:bold;} table.MsoTableLightShadingAccent1LastCol  {mso-style-name:"Light Shading - Accent 1";  mso-table-condition:last-column;  mso-style-priority:60;  mso-style-unhide:no;  mso-ansi-font-weight:bold;  mso-bidi-font-weight:bold;} table.MsoTableLightShadingAccent1OddColumn  {mso-style-name:"Light Shading - Accent 1";  mso-table-condition:odd-column;  mso-style-priority:60;  mso-style-unhide:no;  mso-tstyle-shading:#D3DFEE;  mso-tstyle-shading-themecolor:accent1;  mso-tstyle-shading-themetint:63;  mso-tstyle-border-left:cell-none;  mso-tstyle-border-right:cell-none;  mso-tstyle-border-insideh:cell-none;  mso-tstyle-border-insidev:cell-none;} table.MsoTableLightShadingAccent1OddRow  {mso-style-name:"Light Shading - Accent 1";  mso-table-condition:odd-row;  mso-style-priority:60;  mso-style-unhide:no;  mso-tstyle-shading:#D3DFEE;  mso-tstyle-shading-themecolor:accent1;  mso-tstyle-shading-themetint:63;  mso-tstyle-border-left:cell-none;  mso-tstyle-border-right:cell-none;  mso-tstyle-border-insideh:cell-none;  mso-tstyle-border-insidev:cell-none;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;table class="MsoTableLightShadingAccent1" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0"&gt;  &lt;tbody&gt;&lt;tr style=""&gt;   &lt;td style="border-style: solid none; border-color: rgb(79, 129, 189) -moz-use-text-color; border-width: 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td style="border-style: solid none; border-color: rgb(79, 129, 189) -moz-use-text-color; border-width: 1pt medium; padding: 0in 5.4pt; width: 1.65in;" valign="top" width="158"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;Amazing Modu&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: solid none; border-color: rgb(79, 129, 189) -moz-use-text-color; border-width: 1pt medium; padding: 0in 5.4pt; width: 99pt;" valign="top" width="132"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;Silly Iphone&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 2.05in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="197"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;Jackets&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 1.65in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="158"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 99pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="132"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;Buttons&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; width: 1.65in;" valign="top" width="158"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;7&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; width: 99pt;" valign="top" width="132"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 2.05in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="197"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;Guinness world records&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 1.65in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="158"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 99pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="132"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;Waste battery on WiFi&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; width: 1.65in;" valign="top" width="158"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; width: 99pt;" valign="top" width="132"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;-1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 12.6pt;"&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 2.05in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; height: 12.6pt;" valign="top" width="197"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;Waste battery on GPS&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 1.65in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; height: 12.6pt;" valign="top" width="158"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: medium none ; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 99pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; height: 12.6pt;" valign="top" width="132"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;-1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(79, 129, 189); border-width: medium medium 1.5pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;Can become a car radio&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(79, 129, 189); border-width: medium medium 1.5pt; padding: 0in 5.4pt; width: 1.65in;" valign="top" width="158"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(79, 129, 189); border-width: medium medium 1.5pt; padding: 0in 5.4pt; width: 99pt;" valign="top" width="132"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style=""&gt;   &lt;td style="border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(79, 129, 189); border-width: medium medium 1.5pt; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 2.05in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="197"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;Total awsomness&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(79, 129, 189); border-width: medium medium 1.5pt; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 1.65in; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="158"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;&gt;1,000,000*&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border-style: none none solid; border-color: -moz-use-text-color -moz-use-text-color rgb(79, 129, 189); border-width: medium medium 1.5pt; padding: 0in 5.4pt; background: rgb(211, 223, 238) none repeat scroll 0% 0%; width: 99pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="132"&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;span style="color: rgb(54, 95, 145);"&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=""&gt; *&lt;span style=""&gt;  &lt;/span&gt;- math is for silly iphone geeks.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Oh, full disclosure - i have one of those silly iphone things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-7011348111164187025?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/7011348111164187025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=7011348111164187025' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/7011348111164187025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/7011348111164187025'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2009/03/amazing-future-of-cell-phones-is-here.html' title='Amazing!!! The Future of cell phones is here now!!!!'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-5678984401397484092</id><published>2009-03-19T02:24:00.010+02:00</published><updated>2009-03-23T02:34:25.588+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nonsense'/><category scheme='http://www.blogger.com/atom/ns#' term='The Rest'/><category scheme='http://www.blogger.com/atom/ns#' term='History'/><title type='text'>War of the Worlds</title><content type='html'>H.G Wells got the title right. Indeed there is a war going on. A War between Worlds. War between the world of man and the aliens that live amongst us.&lt;br /&gt;&lt;br /&gt;This is the story of one man’s struggle in a battle against the odds to defeat the invaders from another world.&lt;br /&gt;&lt;br /&gt;It all started years ago when I was living in an apartment not very far from the botanical gardens in Jerusalem. i suspected nothing when I moved in. There was no sign. No declaration of war. No warning shot. They always came at night, just as I was getting to sleep. They waited, sticking to the walls, biding their time. Suddenly – bang! One of them would create a diversion. I did not realize this at the time, but they wanted to get me out of the protection of the covers. They wanted me to bring back the light so they could mark their target.&lt;br /&gt;&lt;br /&gt;As soon as the light came on they would start flying around it, circling it in widening and narrowing circles. Looking for an opening to strike. When the light was off again they would send their kamikaze fighters to crash into me as I was trying to hide. There was nothing I could do, they were too many.&lt;br /&gt;&lt;br /&gt;I decided to beat them at their own game, they will not outwit me with their mind games. I will prepare a trap for them! I opened a window, and lured them out with the porch light. As soon as they got out I would shut the window and turn off the light.&lt;br /&gt;&lt;br /&gt;This worked for a while, but they finally figured out my little ruse. Instead of all going at once they would send a scout. If he got trapped they would immediately counter attack, smashing into everything!&lt;br /&gt;&lt;br /&gt;Then I tried keeping the window shut all the time. They really didn’t like that. I was sitting in my room one day, minding my own business, when suddenly I was hit in the back of the head. In the middle of the day no less!&lt;br /&gt;&lt;br /&gt;I tought maybe i should try and reason with them: “Try to see it my way” I said, “Do I have to keep talking ‘till I can’t go on?”&lt;br /&gt;&lt;br /&gt;They circled the lamp to show their agreement, so I continued:&lt;br /&gt;&lt;br /&gt;“Think of what I’m saying, We can work it out, and get it straight or say good night”.&lt;br /&gt;&lt;br /&gt;They obviously didn’t like the idea of night, as one of them did a flyby as a warning. I figured they must be angry about something. Perhaps because they were only here for a short time. Maybe they feared night time as every night brought them closer to their inevitable demise. I thought it was worth a shot , so i looked them strait in the eyes and in a calm and direct manner I told them:&lt;br /&gt;&lt;br /&gt;“life is very short, and there’s no time for fussing and fighting my friend”.&lt;br /&gt;&lt;br /&gt;“&lt;span class="Apple-style-span" style="font-style: italic;"&gt;This has to stop&lt;/span&gt;”. I was shocked! They can talk! Moths can talk!&lt;br /&gt;&lt;br /&gt;“what do you mean” I said hesitantly.&lt;br /&gt;&lt;br /&gt;“&lt;span class="Apple-style-span" style="font-style: italic;"&gt;It’s bordering on copyright infringement&lt;/span&gt;”.&lt;br /&gt;&lt;br /&gt;“huh?” I was baffled.&lt;br /&gt;&lt;br /&gt;“&lt;span class="Apple-style-span" style="font-style: italic;"&gt;The Beatles song. Listen, we’re from the RIAA.&lt;/span&gt; “&lt;br /&gt;&lt;br /&gt;“The RIAA??”&lt;br /&gt;&lt;br /&gt;“&lt;span class="Apple-style-span" style="font-style: italic;"&gt;We are here to monitor file-sharing activity.&lt;/span&gt;”&lt;br /&gt;&lt;br /&gt;“Shouldn’t you be monitor internet traffic then?” For some reason this seemed like the proper response.&lt;br /&gt;&lt;br /&gt;“&lt;span class="Apple-style-span" style="font-style: italic;"&gt;We tried that for a while, but they told us we should get out more, do some field work&lt;/span&gt;”&lt;br /&gt;&lt;br /&gt;“Field work?” this was getting stranger by the minuet.&lt;br /&gt;&lt;br /&gt;“&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Packet sniffing&lt;/span&gt;”.&lt;br /&gt;&lt;br /&gt;“Packet sniffing?”&lt;br /&gt;&lt;br /&gt;“&lt;span class="Apple-style-span" style="font-style: italic;"&gt;We have a very keen sense of smell, we are very small, and we can get into many places. Naturally, we are the best candidates for the job&lt;/span&gt;”. They sounded very proud.&lt;br /&gt;&lt;br /&gt;"I see." i really didn't. "Well, why here then?"&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;We heard reports about music coming from this location&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;"Mmmmm... ok, But music is not illegal right?"&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;You are replicating Copyrighted materials&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;"No i am not, i am just listening to music!"&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;So you admit it! The analog replication of digital music is prohibited under copyright law&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;"But..But.....um...I am pretty sure listening to music is protected under fair use"&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;Many do. They are wrong&lt;/span&gt;."&lt;br /&gt;&lt;br /&gt;"So you're saying i am not allowed to listen to music?"&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;Under U.S Copyright law making ten copies or more is considered a &lt;/span&gt;&lt;a style="font-style: italic;" name="m8"&gt;felony&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;"So i can listen to a song ten times?"&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;Technically nine, ten would be a felony.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;"And this doesn't seem ridiculous to you?"&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;We are talking Moths working for the RIAA, what do you think?&lt;/span&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-5678984401397484092?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/5678984401397484092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=5678984401397484092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5678984401397484092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5678984401397484092'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2009/03/war-of-worlds.html' title='War of the Worlds'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-8044438661497256969</id><published>2009-03-17T16:21:00.042+02:00</published><updated>2011-10-21T19:55:31.029+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>On the importance of Garbage Collection</title><content type='html'>&lt;b&gt;Update (21/10/2011)&lt;/b&gt;:&lt;br /&gt;It's been more then 2 years and it seems Infragistics have done nothing about this.&amp;nbsp;They made a very idiotic design decision to sacrifice a&amp;nbsp;fundamental&amp;nbsp;behavior of managed code and then insist on not fixing it.&amp;nbsp;Reader Jarrett posted an update that extends the fix below for win7 and Infragistics v10.3 and possibly 11.1 -&amp;nbsp;I've added it to the code below.&lt;br /&gt;Thanks Jarret!&lt;br /&gt;&lt;br /&gt;---------&lt;br /&gt;&lt;br /&gt;About two years ago we found a nice UI package for WinForms called NetAdvantage by infragistics.&lt;br /&gt;A very nice pack, lots of useful controls and not too expensive. Maybe a bit slow, but this is not a problem in most applications.&lt;br /&gt;&lt;br /&gt;For a while all was good and well, we built our application and our clients were happy.&lt;br /&gt;Then one day - disaster!&lt;br /&gt;Our application started crashing!&lt;br /&gt;This was after a rather long development cycle where we added support for many new features in the hardware (this was a management application for specialized hardware).&lt;br /&gt;Worse yet, we only started noticing it in QA. The reason was that it only happened after sending configuration to the hardware about 10-15 times without restarting the app - something we almost never do in dev.&lt;br /&gt;&lt;br /&gt;Well, when your app crashes after repeated anything its very natural to suspect a memory leak. So i carefully watched memory consumption while calling send configuration. Memory consumption was increasing on task manager, but this is to be expected in managed environments (the simple explanation is that new memory is allocated as long as possible before old memory is reacquired. the actual explanation is not very simple :) ) . Since the machine had 2 gigs of memory and the app only grew from about 150 MB to 200 MB before crashing i figured it was something else.&lt;br /&gt;&lt;br /&gt;What i did notice during my exhilarating time with Task Manager was that User Objects were growing rapidly. Being  originally of the java persuasion i was unfamiliar with these User Objects. Turns out it was to do with windows handles and the silly way win32 api does UI.&lt;br /&gt;It also turns out that windows has a limit of about 10,000 open handles. That seemed like a lot to me and i didn't understand how we could even approach this limit so fast. Sure, we have a lot of complex UI elements, but still - firefox was no.2 in the object count on my machine and only had 600 handles. Our app had~3,000 just after startup. This didn't seem likely.&lt;br /&gt;&lt;br /&gt;The thing was handle leak and memory leak were very similar under managed environment. we used the excellent &lt;a href="http://www.jetbrains.com/profiler/?gclid=CIrUx_GcqpkCFQulQwod5AX-qA"&gt;dot Tracer&lt;/a&gt; to locate the source of our leak. After a few hours staring at rather complicated object graphs it turned out that the leak came from...well...i guess my opening was a dead giveaway...  - Infragistics Controls!&lt;br /&gt;&lt;br /&gt;Anyone who is a developer in a managed environment is well aware of the crimes associated with keeping references to One's object when they have been removed from scope. It's very easy to do it by accident. a Hashmap that wasn't cleared correctly, an errant thread that keeps holding your objects or misunderstood relationships with event handler. All these and more were explored during my search for the leak. All these were not the case with Infragistics.&lt;br /&gt;&lt;br /&gt;No - they did it on purpose.&lt;br /&gt;Huh? you say.  How, or why, would anyone do this on purpose?&lt;br /&gt;The short answer is "i don't know". The longer answer is that they wanted a mechanism that will allow them to change the look and feel if the user changed the windows theme while the program was running. To do that they hooked into some theme change events and maintained links to every control. The short answer still holds tho , because its a really bad excuse. As i pointed out to Infragistics, you can easily use WeakReference to completely solve this problem.&lt;br /&gt;&lt;br /&gt;During this ordeal i was talking to Mr. Vince McDonald, the manager of dev support at Infragistics. it took me a very long time and many lengthy emails and an almost religious debate until i finally got him to admit it was indeed a design flaw. He informed me that "..&lt;span style="font-style: italic;"&gt;we will not be able to apply any changesfor it as part of a hotfix&lt;/span&gt;" as "..&lt;span style="font-style: italic;"&gt;any such changes would have a very high chance to destabilize our current systems&lt;/span&gt;". he also promised that "..&lt;span style="font-style: italic;"&gt;changes we may make can only safely be done as part of a volume release&lt;/span&gt;".&lt;br /&gt;Well, this sounded reasonable to me so i decided to wait with this post. However 3 volumes have been released since my original conversation with him and the problem has not been fixed.&lt;br /&gt;&lt;br /&gt;Despite a complete lack of support from Infragistics, we were finally able to resolve the issue ourselves. We had to use a rather nasty trick to bypass their mechanisms.&lt;br /&gt;Basically we reflected their objects and forcefully cleaned all the references.&lt;br /&gt;The code to resolve the problem is posted below.&lt;br /&gt;Important note - This fix was prepared for v7.3 and may work with 10.3 (Thanks Jarrett) I dont know if it will work for any other version. I Suspect it might, and i would appreciate it if you tried it on a different version and it worked for you.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; gutter: false;" name="code"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Windows.Forms;&lt;br /&gt;using Infragistics.Win;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using Infragistics.Win.AppStyling;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using Snoops.UI;&lt;br /&gt;using System.Collections.Specialized;&lt;br /&gt;using System.Collections;&lt;br /&gt;&lt;br /&gt;namespace CleaningServices&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;///  IMOPORTANT NOTICE:&lt;br /&gt;///  THIS HACK WORKS ONLY WITH Infragistics V7.3&lt;br /&gt;///  AND POSSIBLY 10.3 (Thanks Jarrett)&lt;br /&gt;///  IT WAS CREATED FOR THIS VERSION ONLY.&lt;br /&gt;///  IF IT WORKS WITH ANY OTHER VERSION, ITS BY CHANCE ALONE.&lt;br /&gt;///&lt;br /&gt;///&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;///  ReleaserControl is a special control designed to rid our code of the ugliness introduced by using the Infragistics UI Package.&lt;br /&gt;///  Unfortunately someone in Infragistics made the "Design Descision" (according to their support personal) to turn all their UI objects into unmanaged object.&lt;br /&gt;///  They acheived this by strong binding every control to static events held by static classes deep within the infrastructure.&lt;br /&gt;///  As a result, if a UI class holds an infragistics control within it's Controls list, it will never get garbage collected.&lt;br /&gt;///  Infragistics controls NEVER get garbage collected, unless Dispose is explicitly called on the control.(the Dispose method releases the even bind).&lt;br /&gt;///&lt;br /&gt;///  WTF??? you say, well, yes. since every control holds a strong reference to Parent, and the control itself is held&lt;br /&gt;///  by a static event handler, your controls will not get collected when they get out of scope, if they hold an infragistics control.&lt;br /&gt;///  this will naturally cause a memory leak. this in itself is not the worst of it. since all controls hold a Windows Handle,&lt;br /&gt;///  your app will crash with the lovely "Cannot Create Window Handle" exception somewhere around 10,000 objects.&lt;br /&gt;///&lt;br /&gt;///  So, how did we solve this problem? well, we didnt REALLY solve it. we did a hack.&lt;br /&gt;///  this seems to work for our current usage of the package, and i did not notice any unexpected behavior in the UI controls.&lt;br /&gt;///  the limitation of this fix is that it was created for the Infragistics package v7.3 and might not work for any other version.&lt;br /&gt;///  that's the way hacks go i'm afraid..&lt;br /&gt;///&lt;br /&gt;///  What does our hack hack do? well, it forces unregistration of infragistics controls from all the static places we could find them binding to.&lt;br /&gt;///  calling the InfragisticsCleaner.ClearEventBinding(); causes all events for all controls to be unregistered, allowing them to get GCed as they should.&lt;br /&gt;///  the price we pay is that some windows events will not be handled this way,(like changing themes) , but we are willing to live with that.&lt;br /&gt;///  There might be other implications..we dont know.&lt;br /&gt;///&lt;br /&gt;///  for ease of use we added the ReleaserControl that extends UserControl. all it does is add an event handler&lt;br /&gt;///  which calls the InfragisticsCleaner.ClearEventBinding(); method whenever a control is added.&lt;br /&gt;///  extend this class in your user control to allow your controls to get GCed again.&lt;br /&gt;///&lt;br /&gt;///  a once in a while thread calling the ClearEventBinding method would probably work just as well, but it might not get called&lt;br /&gt;///  exactly when you need it...&lt;br /&gt;///&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;br /&gt;public class ReleaserControl : UserControl&lt;br /&gt;{&lt;br /&gt;public ReleaserControl() : base()&lt;br /&gt;{&lt;br /&gt;this.ControlAdded += new ControlEventHandler(ReleaserControl_ControlAdded);&lt;br /&gt;}&lt;br /&gt;void ReleaserControl_ControlAdded(object sender, ControlEventArgs e)&lt;br /&gt;{&lt;br /&gt;InfragisticsCleaner.ClearEventBinding();&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;public class InfragisticsCleaner&lt;br /&gt;{&lt;br /&gt;private static StaticPropertyHolder[] properyHolders = new StaticPropertyHolder[]&lt;br /&gt;{&lt;br /&gt;new StaticPropertyHolder(typeof(StyleManager), "styleChangedDelegate", "StyleChanged"),&lt;br /&gt;new StaticPropertyHolder(typeof(Office2007ColorTable), "colorSchemeChanged", "ColorSchemeChanged"),&lt;br /&gt;new StaticPropertyHolder(typeof(Office2007ColorSchemeChangedNotifier), "colorSchemeChanged", "ColorSchemeChanged"),&lt;br /&gt;new StaticPropertyHolder(typeof(RoleSelectionUI),"queryComponentRoleDelegate","QueryComponentRole"),&lt;br /&gt;new StaticPropertyHolder(typeof(XPThemes), "themeChangedDelegate", "ThemeChanged") &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;public static void ClearEventBinding()&lt;br /&gt;{&lt;br /&gt;foreach (StaticPropertyHolder holder in properyHolders)&lt;br /&gt;holder.ClearEvents();&lt;br /&gt;AcessibleTextManagerCleaner.CleanDictionaries();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class AcessibleTextManagerCleaner&lt;br /&gt;{&lt;br /&gt;ListDictionary[] dictionaries;&lt;br /&gt;static AcessibleTextManagerCleaner cleaner;&lt;br /&gt;//initialize the static cleaner instance.&lt;br /&gt;static AcessibleTextManagerCleaner()&lt;br /&gt;{&lt;br /&gt;String[] propertNames = new String[]{ "SubclassList", "ControlList", "EditorList" };&lt;br /&gt;cleaner = new AcessibleTextManagerCleaner(GetAccesibleTextManagerType(), propertNames);&lt;br /&gt;}&lt;br /&gt;public static void CleanDictionaries()&lt;br /&gt;{&lt;br /&gt;foreach (ListDictionary dictionary in cleaner.dictionaries)&lt;br /&gt;dictionary.Clear();&lt;br /&gt;}&lt;br /&gt;private AcessibleTextManagerCleaner(Type accessibleTextManagerType, String[] dictionaryPropertyNames)&lt;br /&gt;{&lt;br /&gt;//retrieve the singleton instance.&lt;br /&gt;PropertyInfo instanceField = accessibleTextManagerType.GetProperty("Instance", BindingFlags.NonPublic | BindingFlags.Static);&lt;br /&gt;object instance = instanceField.GetValue(null, new Object[0]);&lt;br /&gt;//get the properties&lt;br /&gt;dictionaries = new ListDictionary[dictionaryPropertyNames.Length];&lt;br /&gt;for (int i = 0; i &amp;lt; dictionaryPropertyNames.Length; i++)&lt;br /&gt;dictionaries[i] = ReflectListDictionary(dictionaryPropertyNames[i], instance, accessibleTextManagerType);&lt;br /&gt;}&lt;br /&gt;//get the dictionaries to clear.&lt;br /&gt;private static ListDictionary ReflectListDictionary(String propertyName, Object instance,Type type)&lt;br /&gt;{&lt;br /&gt;PropertyInfo instanceField = type.GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Instance);&lt;br /&gt;ListDictionary list = (ListDictionary)instanceField.GetValue(instance, new Object[0]);&lt;br /&gt;return list;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static Type GetAccesibleTextManagerType()&lt;br /&gt;{&lt;br /&gt;//we need the infragistics assembly that holds our type (its a private type so we cant access it directly)&lt;br /&gt;Assembly infragisticsAssm = Assembly.GetAssembly(typeof(EditorWithMask));&lt;br /&gt;Type[] types = infragisticsAssm.GetTypes();&lt;br /&gt;Type accessibleTextManagerType = null;&lt;br /&gt;//search through the assembly until we get what we want.&lt;br /&gt;foreach (Type t in types)&lt;br /&gt;{&lt;br /&gt;if (t.Name.IndexOf("AccessibleTextManager") != -1)&lt;br /&gt;{&lt;br /&gt;accessibleTextManagerType = t;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return accessibleTextManagerType;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;class StaticPropertyHolder&lt;br /&gt;{&lt;br /&gt;EventInfo eventInfo;&lt;br /&gt;FieldInfo field;&lt;br /&gt;&lt;br /&gt;public StaticPropertyHolder(Type type, String delegateFieldName, String eventName)&lt;br /&gt;{&lt;br /&gt;this.field = type.GetField(delegateFieldName, BindingFlags.Static | BindingFlags.NonPublic);&lt;br /&gt;eventInfo = type.GetEvent(eventName);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;public void ClearEvents()&lt;br /&gt;{&lt;br /&gt;Delegate eventDelegate = field.GetValue(null) as Delegate;&lt;br /&gt;if (eventDelegate != null)&lt;br /&gt;{&lt;br /&gt;Delegate[] invocationList = eventDelegate.GetInvocationList();&lt;br /&gt;foreach (Delegate del in invocationList)&lt;br /&gt;{&lt;br /&gt;eventInfo.RemoveEventHandler(null, del);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-8044438661497256969?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/8044438661497256969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=8044438661497256969' title='57 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/8044438661497256969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/8044438661497256969'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2009/03/importance-of-recycling-memory.html' title='On the importance of Garbage Collection'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>57</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-5383619827998277422</id><published>2008-11-11T01:51:00.011+02:00</published><updated>2008-11-11T03:02:01.182+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Rest'/><title type='text'>Mocking The Monkeys</title><content type='html'>&lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;So I was listening to this lecture about developmental psychology, and the lecturer was talking about the experiments they were doing with young children. Every once in a while she would go back and compare the performance of the children to that of monkeys. Now, I am not sure who should be insulted, but I am fairly sure someone should. There seems to be a good case for the kids since the research equates their mental capacity to that of a monkey. &lt;span style=""&gt; &lt;/span&gt;The monkeys on the other hand also seem to have a strong case as no one seems to try and challenge babies with climbing a tree or living with Jane Goodall.&lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;You hear stuff like monkeys can do this , monkeys can do that all the time, and I would always say it sounds interesting…sounds interesting, &lt;span style=""&gt; &lt;/span&gt;But is it really? Is it interesting? Its not like there's some actual work we are planning on having monkeys perform, &lt;a href="http://www.newtechusa.com/ppi/talent.asp"&gt;right?&lt;/a&gt; &lt;span style=""&gt; &lt;/span&gt;Its not that we can gain some deep and meaningful understanding of life, the universe and everything by having monkeys perform these weird tasks.&lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;Now, this sort of thing presumably took quite a bit of work to get to, you sometimes have to live with the monkeys or train them to perform or understand certain rules, and you have to do controls…very hard work. And its not just limited to monkeys, there's the whole story with Skinner and his pigeons, rats and mazes, and generally speaking a whole lot of experiments involving animals performing all kinds of strange tasks.&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;So I had to ask myself,"why?" , "why go to all this trouble?" ,why would anyone spend all this time and money to show that a monkey has the mental capacity of a two year old? And then it hit me – why does Jay Leno ask random pedestrian to locate &lt;st1:country-region st="on"&gt;Iraq&lt;/st1:country-region&gt; on the world map(obviously its somewhere in Australia), or what the DC stands for in &lt;st1:city st="on"&gt;Washington&lt;/st1:city&gt; &lt;st1:state st="on"&gt;DC&lt;/st1:state&gt; (don’t believe all that &lt;st1:state st="on"&gt;&lt;st1:place st="on"&gt;district of   Columbia&lt;/st1:place&gt;&lt;/st1:state&gt; stuff. It obviously stands for De Capital). Also, why are there shows like "are you smarter then a 5'th grader" or "beauty and the geek"? simple – to show how people are stupid so that you can sit at home and mock their ignorance.&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;      &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;Sure, mocking people isn’t "nice", its entertaining, but its not nice. Still, must we mock the monkeys?&lt;o:p&gt;&lt;/o:p&gt; i mean, there are so many things humans are ignorant about, surely our time and resources are better spent mocking one another.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;So please, if there's one thing you take from this post, let it be that "Prison Break" stopped making sense once they broke out of prison. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-5383619827998277422?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/5383619827998277422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=5383619827998277422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5383619827998277422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5383619827998277422'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2008/11/mocking-monkeys.html' title='Mocking The Monkeys'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-1926218718621686534</id><published>2008-04-24T02:12:00.017+03:00</published><updated>2008-04-24T02:42:20.864+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><title type='text'>Computer Voodoo</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;o:p&gt;&lt;/o:p&gt;The following is a true story, and unlike most stories that begin with this kind of statement, it actually is true!&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt; I know this for a fact, as I was personally involved with this voodoo magic.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;      &lt;div style="text-align: left;"&gt; For the past few days, my computer has been acting strangely with everything USB. Windows started throwing annoying messages about how my "USB Device is not functioning" claiming that "USB Device Not Recognized" it was all very annoying, even more so because when I connect a mouse or a webcam, it’s very obvious to ME that they are &lt;span style=""&gt; &lt;/span&gt;a mouse or a webcam. For some reason windows disagreed with me...even stranger, it recognized these devices just fine before and I couldn't see any reason it might suddenly forget. I tried reasoning with Windows, explaining to it that it makes no sense for it to claim that whatever was working not 2 minutes ago is suddenly malfunctioning beyond recognition. &lt;span style=""&gt; &lt;/span&gt;This explanation left little impression on windows and it insistently repeated that “USB Device Not recognized”.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt; Of course, it's a well known fact that computers are, for the most part, malfunctioning piles of junk which for some reason we care deeply about and take good care of only to have them reject us at times of grate need. In some sense, they are very much like ungrateful teenagers (who, btw are probably the largest group of computer users. coincidence? I don’t think so!).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt; So anyway, back to my story.&lt;br /&gt;Since for the most part the devices were such that I used rarely, I did what most users would do, ignore the problem and hope for the best. Unfortunately, the problem didn't think that was such a good idea and  got worse until the system decided to reboot (it rarely asks my opinion of such things. i guess it assumes it knows better than I do what I should do with the next 5-10 minutes of my life, namely, stare blankly at the screen while as it boots). Even more unfortunately was that my previously functioning webcam stopped being recognized. So again, I did what most users would do - I connected it to a different USB port...windows wasn't impressed, so I resorted to Google (fortunately my USB based cable modem decided to work for the time being).&lt;br /&gt;&lt;/div&gt;&lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt; After a few minutes of browsing the various forums I found a collection of solutions from removing all the devices in safe mode, to reinstalling windows. Well, I didn't much feel like either, so I kept reading...and one unlikely solution kept popping up. This solution involved what is technically known as "Computer voodoo".&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;"Computer voodoo” is a highly complex technical term that loosely means "doing something really weird in the hopes that it will somehow fix your problem". This voodoo is usually accompanied by an unlikely explanation, targeted at the computationally (and when it comes to computers – rationally) challenged. A regular voodoo solution would look something like: "your windows keeps crashing because of a virus! Bang your mouse on the table tree times and left click then right click". While the voodoo explanation would be something like: "banging your mouse encourages the virus to migrate into the mouse's memory. left clicking + right clicking then erases the mouse's memory , killing the virus!" (I am sure that I could convince at least some of you of this in other context).&lt;br /&gt;&lt;br /&gt;voodoo solutions, as well as voodoo explanations exist for the same reasons superstition exist - people will do and believe anything if said in a convincing, authoritative tone! They will believe even more if it’s written down.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;The thing that separates regular Voodoo from Computer voodoo is the absurdity of the proposed solutions, and the incredibly large amount of otherwise intelligent people that are willing to participate in strange rituals if anything electronic is involved (Reboot voodoo is the most common, replacing the ancient bang-it-twice-on-the-side voodoo used by my ancestors)&lt;br /&gt;&lt;/div&gt;&lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;In the case of my strange problem the voodoo solution involved the following - shut down your computer, disconnect all devices &lt;span style=""&gt; &lt;/span&gt;, disconnect main power, wait for half an hour.&lt;span style=""&gt;  &lt;/span&gt;The voodoo explanation given was something about static charge accumulating on the USB hubs. If we analyze this voodoo, we can see that there are 4 separate voodoos involved:&lt;br /&gt;&lt;!--[endif]--&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Shutdown the computer – this is a variation of the restart voodoo, but separating the voodoo into its ingredients, first the shut down, and later, the start up.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Disconnect main power- another common voodoo. It is believed that electricity holds magical powers and can infiltrate through the sturdiest of switches. Disconnecting a device from the main power helps to convince it that it’s really off, forcing the electrons to leave the possessed device.&lt;/li&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Disconnect all devices – follows from the main power voodoo, the electrons might not truly leave but take residence in the attached electronic devices, and then return once the main power is connected. Only way to be sure is disconnect all of them.&lt;/li&gt;&lt;li&gt;Wait for half an hour – all things must rest; this is the basic assumption behind this voodoo. &lt;span style=""&gt; &lt;/span&gt;Your computer has been hard at work and its acting up because you never let it get a good rest. Leave it alone for a while. When you come back it will be well rested and eager to work.&lt;/li&gt;&lt;/ol&gt;In any case, &lt;span style=""&gt; &lt;/span&gt;I decided I would try this solution, I didn't really expect it to work in spite of the various user comments like "I don't believe it, but it worked" &lt;span style=""&gt; &lt;/span&gt;(seriously , who are you kidding, this is EXACTLY the sort of thing claimed by people who are trying to trick you into buying things on the shopping channel)&lt;br /&gt;&lt;br /&gt;Why did I try it you ask? I am a firm believer in the least effort approach. &lt;span style=""&gt; &lt;/span&gt;Other solutions required that I DO stuff, this one merely involved my NOT DOING things. I consider not doing things to be considerably easier and much less damaging than doing things, so I shut down, disconnected the power cable, and waited.&lt;br /&gt; &lt;p class="MsoNormal"&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;Obviously, you all expect me to say that I turned my computer back on and, that to my surprise everything worked.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Well, that's exactly what happened (had you there didn't I)!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;As you all know, I believe in computer voodoo as much as the next ex-technician/support guy/programmer. As the creator of many voodoo explanations myself, I can usually tell when someone is trying to get me to do something really silly, just for the perverse pleasure of knowing that somewhere out there people are turning off their computers and just sitting around waiting for things to fix themselves...but I have to tell you. It really does work.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Finally, I recommend that next time you have a problem, not just computer related. Shut down and wait for things to sort themselves out. The passive act of waiting facilitates the flowing of cosmic rays and realigns the stars and atoms along the energy lines in the universe, smoothing the flow of good Chi and flushing out the bad Chi. &lt;span style=""&gt; &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p class="MsoNormal"&gt;true story.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-1926218718621686534?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/1926218718621686534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=1926218718621686534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/1926218718621686534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/1926218718621686534'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2008/04/computer-voodoo.html' title='Computer Voodoo'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-7899703261445659492</id><published>2007-09-24T03:11:00.000+02:00</published><updated>2007-09-24T03:10:57.078+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='The Rest'/><title type='text'>Silence of the blogs</title><content type='html'>&lt;p class="MsoNormal"&gt;Some say silence is golden. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;Of course, they didn't even bother following their own golden rule, so we shouldn't pay any attention to them. I, however, was not lost for words, but an overload of work left very little time for some of my favorite things. One of them is writing here, but others are watching TV, and of course, playing computer games (how's that for segue of the year?).&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Most ‘real’ adults I know don’t actually play computer games (no , soliter and minesweeper don’t count). I am talking about “hard core” games. RPG’s like gothic (one of the best RPG’s ever. Well, two actually. Gothic 1 and 2 where amazing.&lt;span style=""&gt;  &lt;/span&gt;Gothic 3 was an awful mistake that I am willing to overlook if they change it back and fix the engine in gothic 4) and Never winter nights. One might also expect me to mention oblivion, but the truth is it’s a terrible game with an amazing graphics engine. The problem with oblivion btw is that it takes the whole fun of RPG’s out of the game by creating a game system that upgrades your enemies according to your current level…and this means you simply can’t progress in the game. Doing a beginner quest later on is just as hard as if you would have done it in the beginning….it doesn’t “keep the game challenging” as some misguided game designer might think, it keeps you from getting anywhere. Imagine a life where things never get harder or easier…they are just the same all the time. Sure, the graphics are great, but the plot leaves something to be desired, and you can never achieve anything.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Hmm…it seems I strayed from my point there….what I was saying is that “true adults” don’t seem to play computer games, and I think it’s a shame. I bought myself an xbox in the beginning of the year. I’v always wanted a game console as a kid but my parents couldn’t afford one. They also considered it to be a waste of money (‘why would you spend that much money on a game anyway’). They were, however, willing to buy a computer because we managed to convince them it was ‘educational’. Turns out it was. &lt;span style=""&gt; &lt;/span&gt;Wanting to play computer games motivated me into learning how to tweak the mighty Autoexec.bat and the holy Config.Sys. Words cannot describe the joy of getting your conventional memory up to a free 620k (and I could even manage 632k in some cases). It was almost as satisfying as playing the game&lt;span style="font-family: Wingdings;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;. So the years passed, and it turns out that playing all these games and learning how to tweak things, finding new ways to cheat at games by freezing and changing memory addresses and hex editing save files really played off.&lt;span style=""&gt;  &lt;/span&gt;These days I can afford to do all the things I wanted to do as a child thanks to these computer thingies.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The problem is that our society is structured in a very annoying way, now that I can afford to do all these cool things I am considered too old for them (which doesn’t usually bother me…) but mostly, it doesn’t leave you time to do all the things you CAN do. Time also takes away some of the energy, although I have an untested theory that you actually gain energy by running around, playing with your friends and doing fun and exciting things. they also took all the fun junk food away. When you’re a kid, your parents limit your junk food consumption because it’s not healthy for you (you don’t care , because you’re a kid and you know what’s fun) , but as you grow older , you start to believe that junk food is actually bad for you. Hell, it’s not even just junk food anymore..as time passes it seems food in general is just out to get you and is looking for new ways to kill you (mad cow, cancer , allergies, free radicals, confined radicals, toxins, chemicals, monosodium glutamate to name a few). The only things that are good and healthy are things you don’t really want to eat. And even if you find something that you like to eat and&lt;span style=""&gt;  &lt;/span&gt;is both good and healthy, then you still have to watch out for the ominous cholesterol creeping through your veins…really, it seems some people can’t enjoy life , and somehow they manage to convince the rest of us that we shouldn’t either. Even if we still do things that are fun , they find all kinds of ways to make us feel guilty about it. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;So I bought myself an Xbox. I don’t have as much time as I did when I was a kid to play games. Usually I prefer spending time with my girlfriend, watching TV, reading or having a drink with my friends. But every now and then I still find the time to play a new computer game (maybe I’ll buy that ultimate gaming pc I always wanted..which will be outdated a month later &lt;span style="font-family: Wingdings;"&gt;&lt;span style=""&gt;J&lt;/span&gt;&lt;/span&gt; ) or a cool game on the xbox (last one was BioShock… Unreal engine 3 is truly Unreal…&lt;span style=""&gt;  &lt;/span&gt;) . And I wish to say to you : buy your xbox, travel to that place, do that thing you wanted to do as a kid. Maybe people will tell you it’s silly or a waste of time and money. Don’t listen to them - &lt;span style=""&gt; &lt;/span&gt;I promise you, it’s worth it.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-7899703261445659492?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/7899703261445659492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=7899703261445659492' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/7899703261445659492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/7899703261445659492'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/09/silence-of-blogs.html' title='Silence of the blogs'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-4029241570607893128</id><published>2007-08-20T02:07:00.000+03:00</published><updated>2007-08-20T02:15:05.866+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Law And Order'/><category scheme='http://www.blogger.com/atom/ns#' term='Argumentative'/><title type='text'>File sharing vs, Copyrights</title><content type='html'>&lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-style: italic;"&gt;Copyright laws have been the subject of much debate in recent years. With the passing of USA's Digital Millennium law (DMCA) &lt;/span&gt;&lt;span style="font-style: italic;"&gt;many individuals have become the target of lawsuits from large and powerful media corporations. These corporations are now testing the boundaries of the mandate given to them by the U.S. legislator. On the other side of the debate (and perhaps the law) are the File sharing networks, allowing the mass distribution of digitized content, often copyrighted.  This discussion is an attempt to make the case for both sides.&lt;/span&gt; &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FileSharing &lt;/span&gt;– The file sharing industry have been a major pain for the RIAA , they have been trying to shut down any network they can. They got Napster, Kazaa, and recently Edonkey as well. Of course, the donkey network is still alive thanks to the Emule team. And the torrent network is very active. Also, the newsgroups are a source of content – its still file sharing, just not bandwidth/disk space/p2p sharing. While the law may unjustly support the prosecution of people who distribute copyrighted content, it has nothing to do with p2p file sharing itself. This technology has many different uses.&lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Copyrights &lt;/span&gt;– you can't seriously argue that the file sharing networks are a harmless tools for sharing original or non-copyrighted content. File sharing network transfer consists almost entirely of copyrighted materials – movies, music, games and other software. A tiny percentage of the data transferred is free information, such as open source software distribution.&lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FileSharing &lt;/span&gt;– well, I’m sure you know the "guns don’t kill people…" argument. The fact that file sharing network CAN be used for transferring copyrighted content is not reason to eliminate those networks. I’m sure you would also love to see rewritable digital media eliminated, along with hard drives, TiVo, flash-memory based devices and practically anything else that can be used to copy copyrighted content. But you can't start banning technology just because it might be used for illegal activities.&lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Copyrights&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;  &lt;/span&gt;- guns are used primarily to kill people. Much in the same way file sharing networks are used primarily to "share" copyrighted content. &lt;span style=""&gt; &lt;/span&gt;The difference is that guns are heavily regulated in most countries. The same goes for drugs – they can be used legally and illegally. Legal use of drugs is heavily regulated – you need a prescription to get any drug that might be addictive, and you are monitored while using it. None of this can be said for the file-sharing networks. They are completely unregulated. In fact, they are almost impossible to regulate – you need to penetrate many layers of anonymity before you can find out who is the person sharing material you have copyrights for. The RIAA does not have the legal authority to regulate file sharing networks, and even if the laws where changed to include regulation such regulation would probably be technologically impossible. The only real option is to seek legal action against providers of file-sharing services and against users of such networks who share material they don’t own the copyrights for.&lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FileSharing &lt;/span&gt;– so your argument is that if we can't regulate something, then we should ban it completely? &lt;span style=""&gt; &lt;/span&gt;This is a very problematic argument – first of all how do we define the limits of file sharing, is it the applications? The protocols? The concept? Second, many things cannot be regulated – the internet itself cannot be regulated. Should we bad website construction tools or website hosting because these things can be used to publish child pornography? &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Copyrights &lt;/span&gt;– well, first of all, I am not saying that anything that cannot be regulated should be banned. Second, I am not saying that anything that might be used for immoral or illegal purpose must be banned or regulated – but I do think that in the particular case of file sharing networks, the primary use of existing technology is the illegal, immoral sharing of copyrighted material.&lt;span style=""&gt;  &lt;/span&gt;Should the situation change – either by finding a way to regulate file-sharing networks, or by a comprehensive change in the type of materials shared on these networks, then I would have no problem with the technology itself. But as long as the primary use of these networks remains what it is today, I consider the providers of such services to be accomplices to these illegal activities.&lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FileSharing &lt;/span&gt;– this brings us to another major point of the argument – I can't argue with the statement that sharing copyrighted material is an illegal activity – there are laws in many countries that define such acts to be illegal. As soon as you manage to create a strong lobby supporting such laws - you make such activities illegal. In the 1920's the United States banned the production, transport and sale of alcohol. By instituting prohibition, the US government made a very popular activity illegal, and in the process made many people felons, giving rise to powerful criminal organization that still exist today. The argument made against the use of alcohol was its immoral nature, &lt;span style=""&gt; &lt;/span&gt;in the same way that copying copyrighted material is said to be immoral today.&lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Copyrights &lt;/span&gt;– the fact that many people wish to consume alcohol or share copyrighted material does not make such activities morally correct. I do not wish to defend prohibition, as I do not consider the consumption of alcohol to be immoral or to be a catalyst of immoral activities. I do wish to point out that alcohol use IS regulated - in many countries there is a limitation on the legal drinking age. As for stealing copyrighted martial – I don’t see how the immorality of such activities can be questioned. &lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;FileSharing &lt;/span&gt;– by using the word "stealing" you effectively called millions of people world wide "thieves". I doubt that many members of the file sharing community would agree with that categorization. And yes – I do believe actual thieves would agree to call themselves "thieves". Theft and stealing is a concept generally reserved for physical property. By replicating copyrighted material the owner of the media in question does not lose anything – unlike actual theft – the theoretical offense is made here not against the owner of the physical media (if such media exists) , but against the owner of the copyrights to the material recorded on the media.&lt;span style=""&gt;  &lt;/span&gt;When talking about theft you should demonstrate that one side has gained something, while the other side lost something. If no one lost anything, then how can you argue that something was stolen? &lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Copyrights &lt;/span&gt;– I do not agree that there was a "theoretical" offense, and that no one lost anything. If a person wants to use or own materials created by other people , it is reasonable to require that this person be given permission by the author to do so, if by paying for the permission, or by some other means acceptable to the author of the work in question. The loss here is not theoretical , its very real – when you download copyrighted material and enjoy the product without paying for the right to do so – a right other people DID pay for – you are denying the author appropriate compensation for the time, effort and creativity he invested.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed; font-style: italic;"&gt;I feel I cannot end this discussion with a clear conclusion, as there are valid points to be made for both sides. I also can’t keep arguing with myself forever :)&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" dir="ltr" style="text-align: left; direction: ltr; unicode-bidi: embed; font-style: italic;"&gt;Join us next time for another argument of me vs. myself. And please feel free to suggest subjects for discussion.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-4029241570607893128?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/4029241570607893128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=4029241570607893128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/4029241570607893128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/4029241570607893128'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/08/file-sharing-vs-copyrights.html' title='File sharing vs, Copyrights'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-7294584422252909329</id><published>2007-08-18T00:43:00.000+03:00</published><updated>2007-08-18T00:50:49.128+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><title type='text'>What the $&amp;@^&amp;*#???</title><content type='html'>&lt;span id="FontSizeA"  style="font-size:85%;"&gt;&lt;p align="left"&gt;This article was written by Adina Lederhendler:&lt;br /&gt;&lt;/p&gt;&lt;p align="left"&gt;Over the years several people have asked me for my opinion on the film "what the bleep do we know". I hadn`t seen it and assumed it was another popular-science film trying to explain quantum mechanics. I saw the film today and really feel like I have to set the record straight. The film is not, as it seems, a scientific documentary, but is actually a promotional film for a spiritual movement based upon the teachings of JZ Knight (who appears herself in the film as one of the interviewees), a woman who founded "Ramtha`s School of Enlightenment", Ramtha being the spirit who Knight claims to channel.&lt;/p&gt;&lt;p align="left"&gt;My objection to the film does not stem from the ideas that are portrayed in it. In fact I agree to some extent with the claims that our emotions and past experience effect our reality and that there are psycological effects on biological phenomena (the placebo effect, for instance, is an example which is widely accepted as valid). Even the more radical ideas that the universe is actually created by our thoughts and that our behavior is dictated solely by our bodies "addiction" to certain emotions didn`t bother me. I think people should be free both to believe whatever they want and be able to present their beliefs to whatever public agrees to hear them.&lt;/p&gt;&lt;p align="left"&gt;What I did find disturbing, however, was the presentation of these ideas as scientific fact. This was done so cleverly that it took me about half an hour to realize that what I was watching wasn`t just another pop-science film. We tend to regard an expert presented as a "scientist" to be both objective and trust-worthy. While many (but not&lt;/p&gt;&lt;p align="left"&gt;all) of the interviewees in the film were in fact scientists, they were far from objective. The most impressively credential-ed scientist in the film is John Hagelin, who tells us about both his Harvard degree and his work at CERN. What he fails to mention, however, is that since 1984 he has been the head of the physics department at the Maharishi University of Management, founded by an Indian guru. His research concentrates on trying to link particle physics to Transcendental Meditation. (He has also run for President three times as the leader of the Natural Law Party).&lt;/p&gt;&lt;p align="left"&gt;The ideas presented in the film rely heavily on "facts" taken from quantum mechanics, specifically that the state of a system is not determined untill it is measured by an "observer". While the mathematical formulation of quantum mechanics can be "translated" into words in that way, like in any translation something of the substance is lost. In any case, attributing literal meaning to this formulation even with regard the sub-atomic world which it describes is controversial within the scientific community, and certainly no one would claim it applies to the world of people and basketballs and such.&lt;/p&gt;&lt;p align="left"&gt;But all this is just a manifestation of a much bigger problem. Our society relies heavily on science and technology. However, informed knowledge of these fields is held only by a small minority. The fact that scientific theories cannot be fully explained without the use of mathematics leaves many people in awe of science and they tend to credit it with disproportionate authority.&lt;/p&gt;&lt;p align="left"&gt;Another factor is a general misconception of what science is all about. The goal of science is to find the best way to describe nature, not to find an ultimate truth as to "what it is". For example, gravity is the best way we have found to describe how things fall to the ground, but even the most advanced theories of gravity will not tell you what it is! Most importantly, scientists don`t care. They might ponder philosophical implications of various theories as they look up at the stars on their way home from the lab, but it is very clear that these are purely the realm of metaphysics and not scientific research.&lt;/p&gt;&lt;p align="left"&gt;Finally (yes finally...) there is a dangerous lack of understanding of the scientific method. The scientific method can perhaps be summed up&lt;/p&gt;&lt;p align="left"&gt;as: "When I see it, I still won`t believe it". In fact, a true scientific theory cannot be proven, and a good scientist spends most of his time trying to disprove his theory. As silly as that sounds, it is the only way to ensure that only the best ideas survive. A scientific theory is only accepted if it can accurately predict the results of many different experiments and the results of an experiment are only accepted if they can be replicated. Even then, scientists continue to come up with ideas to test the theory, to find the cracks.&lt;/p&gt;&lt;p align="left"&gt;Otherwise there is no progress.&lt;/p&gt;&lt;p align="left"&gt;So here`s where you come in. Do not (ever!) accept ideas or facts simply because they were presented by someone claiming to be a scientist or using scientific-sounding terminology. Approach these ideas or facts with caution: Is this person objective? Is he basing spiritual or philosophical claims on science? Are his methods scientific? Google it!!!!&lt;/p&gt;&lt;p align="left"&gt;I know I sound a bit dramatic here, but there are many people out there who abuse the standing of science in our society to promote their own agendas, and people are many times taken in on false pretenses.&lt;/p&gt;&lt;p align="left"&gt;But don`t take my word for it, check it out for yourselves&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-7294584422252909329?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/7294584422252909329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=7294584422252909329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/7294584422252909329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/7294584422252909329'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/08/what.html' title='What the $&amp;@^&amp;*#???'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-550253717811021204</id><published>2007-08-14T01:58:00.002+03:00</published><updated>2009-03-23T02:36:58.728+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nonsense'/><category scheme='http://www.blogger.com/atom/ns#' term='History'/><title type='text'>Planet of the spoons - Part 2</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;i&gt;&lt;a href="http://subjectively.blogspot.com/2007/08/planet-of-spoons.html"&gt;Previously on planet of the spoons&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;The spoons have constructed a machine that allows them to take a &lt;/i&gt;&lt;a href="http://en.wikipedia.org/wiki/Quantum_Leap"&gt;&lt;i&gt;Quantum Leap&lt;/i&gt;&lt;/a&gt;&lt;i&gt; and appear on distant lands, but the machine had one critical fault - those pesky quantums are always so uncertain. The spoons where debating who should be assigned to watch the machine, when the forks tried to take control of the machine. The spoons quickly realized that true unison is achieved by fighting against others. And so, the story of the spoons continues.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;Many historians still debate how the spoons won the war against the &lt;a href="http://www.usatoday.com/news/offbeat/2007-07-10-fork-attack_N.htm"&gt;violent forks&lt;/a&gt;, as it was not in their nature to be instruments of war. Some believe the forks where overpowered by brilliant tactical maneuvers.  General Spoony , leader&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons-part-2.html#_ftn1" name="_ftnref1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; of the spoon army explains : "Wars are not won by numbers or training, wars are won by kicking the enemy in the silverware when their back is turned."&lt;br /&gt;However, other historians say the defeat could be best attributed to the fact that the forks didn't know where the quantum machine was, and where actually on their way to the annual fork convention.&lt;br /&gt;&lt;br /&gt;Wars are known around the world as the leading cause of activists, and the Spoon War was no different. Even though the war was very short and was considered by all&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons-part-2.html#_ftn2" name="_ftnref2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; to have been a clear victory, some still manage to find fault, as some always do.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;The anti-war movement was led by Made-In-China - foreign ambassador to the Spoon Council, who criticized the war for being a half measure that would only lead to further conflict. The activists believed that the only way to avoid future wars was to get rid of all the enemies. Their argument was that wars are fought against enemies, so:  No enemies = No wars. This would have been a popular bumper sticker, but none of the spoons owned cars (or bumpers).&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;A spoon mathematician later proved that the equation was, in fact, false. The anti war movement retaliated by defining said mathematician as "the enemy" and proved the opposite. The incident helped the activists realize that by naming new enemies and getting rid of them they can advance the coming of ultimate peace. unfortunately for the anti-war movement (but fortunately for everyone else) someone pointed out to them that by defining enemies, they were becoming enemies of their enemies themselves, and the anti-war movement was forced to eliminate itself.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;....To (maybe) be continued...&lt;!--[if !supportFootnotes]--&gt;&lt;br /&gt;&lt;/p&gt;  &lt;div style=""&gt;&lt;hr size="1" width="33%" align="left"&gt;  &lt;!--[endif]--&gt;  &lt;div style="" id="ftn1"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons-part-2.html#_ftnref1" name="_ftn1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;  &lt;/span&gt;- no one could remember how he became general, nor could they agree on what it was exactly he did during the war, therefore they assumed it was the job of a general to take credit for victory.&lt;br /&gt;&lt;!--[if !supportLineBreakNewLine]--&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;div style="" id="ftn2"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons-part-2.html#_ftnref2" name="_ftn2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;  &lt;/span&gt;- All spoons. No one else seems to have noticed this war.&lt;/p&gt;  &lt;/div&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-550253717811021204?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/550253717811021204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=550253717811021204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/550253717811021204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/550253717811021204'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/08/planet-of-spoons-part-2.html' title='Planet of the spoons - Part 2'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-2644902546975337044</id><published>2007-08-09T03:53:00.001+03:00</published><updated>2009-03-23T02:37:14.281+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nonsense'/><category scheme='http://www.blogger.com/atom/ns#' term='History'/><title type='text'>Planet of the Spoons</title><content type='html'>&lt;p class="MsoNormal"&gt;A &lt;a href="http://www.bmj.com/cgi/content/full/331/7531/1498"&gt;recent study&lt;/a&gt; proved that spoons are rapidly disappearing from our planet.  some suggestions are made by the researchers as to where the spoons are disappearing to, the most promising suggestion is based the theory from  &lt;a href="http://en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy"&gt;The Guide&lt;/a&gt;  - The Theory of Plane of the Spoons!(imagine hearing ominous notes)&lt;br /&gt;&lt;br /&gt;As you all know, The Guide is the most reliable source of information and is widely regarded by the scientific community as infallible. With such a well established source of information as basis for this theory,  i decided to go forth and extend the original paper. The results of my research will be presented in an n part series (n&gt;=1). While the spoons eventually migrated into a utopian planet where they live a happy spoonful life, much controversy and conflict preceded their arrival at their new home planet. This part tells the story of how it all began.&lt;br /&gt;&lt;br /&gt;Planet of the spoons resides in an undisclosed&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons.html#_ftn1" name="_ftnref1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; location. it enjoys a cool average temperature of about 15 degrees and long walks in the park. It’s one of those rebellious planets that never joined up with a stable star system. it just flies carelessly through space refusing to revolve around a sun or trim it's pointy mountains. It likes to hang around asteroid belts and sometimes pretends to collide into a passing sun to scare the natives. The spoons didn't really want to settle on this planet, but the leaders of the exodus convinced everyone that its really a nice planet and he just got a bad rap.&lt;br /&gt;&lt;br /&gt;When word got out that spoons are planning to migrate from earth into their own planet, other cutlery where skeptical of this move. Everyone knew that the knives were on the verge of achieving teleportation and that the forks have almost completed work on their faster than light drive, but no one imagined that the spoons would be the first to leave the planet. only when the first spoons started their migration did the cutlery world finally realize that the spoons were on to something. a committee was founded and a joint task force was sent to the leaders of the spoons in an effort to persuade them into letting  everyone escape from the clutches of the evil humans&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons.html#_ftn2" name="_ftnref2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;. The spoon leaders refused the request and were given an ultimatum by the knives to disclose the location of their planet and means of transport "or else...".&lt;br /&gt;&lt;br /&gt;"or else what?" asked the spoon leaders. "um....ni?" said the knives. The spoons were not impressed&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons.html#_ftn3" name="_ftnref3" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[3]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;. Nevertheless, fearing the knives might come up with something more imposing to threaten them with, the spoons expedited their efforts to leave this planet. they were about to begin a massive quantum leap removing all spoons at once from the planet, when it was discovered in the nick of time&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons.html#_ftn4" name="_ftnref4" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[4]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style=""&gt; &lt;/span&gt;that this may result in all spoons being here and there at the same time (bloody quantums and their superior positions.) it was then decided to forgo the original plan and instead have someone stand by the machine to watch it and make sure the quantums behave themselves. This meant that someone had to stay behind. Since no one wanted to stay some method was needed for choosing the operators of the machine. at first it was suggested that everyone draw straws and this was generally agreed upon by everyone as the best method with the least amount of complications. However, the straws strongly opposed this method so a different solution had to be found. A vote was suggested, everyone could vote for the person they did not wish to see operate the machine. Naturally, the idea failed when everyone voted for themselves. This effectively destroyed all future hope for a democracy amongst the spoons as this attempt at voting clearly demonstrates that everyone only thinks about themselves and shouldn't be allowed to make decisions for other people.&lt;br /&gt;&lt;br /&gt;After democracy was finally proven to be completely useless, a succession of regime changes followed as the spoons tried them all to decide which method of government might be the best one for their utopic planet, and more practically - to decide who stays to operate the machine. Unfortunately the lack of government prevented the spoons from coordinating their search for a better regime and all regimes were attempted simultaneously. Many spoons were lost during this dark period in spoon history. But fortunately for the spoons it didn't last very long. The forks were secretly trying to capture the machine and the spoons quickly united against them and blocked the attack.  In the aftermath the spoons realized that the best leadership is not leadership from within, but from without! Instead of uniting &lt;b&gt;with &lt;/b&gt;each other, they could unite &lt;b&gt;against &lt;/b&gt;others!&lt;br /&gt;&lt;br /&gt;....To be &lt;a href="http://subjectively.blogspot.com/2007/08/planet-of-spoons-part-2.html"&gt;continued&lt;/a&gt;...&lt;br /&gt;&lt;/p&gt;&lt;div style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;br /&gt;&lt;hr size="1" width="33%" align="left"&gt;  &lt;!--[endif]--&gt;  &lt;div style="" id="ftn1"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons.html#_ftnref1" name="_ftn1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style=""&gt; &lt;/span&gt;- i have been sworn to secrecy and may not reveal the true location. i am only allowed to say that its most definitely NOT somewhere in the vicinity of betelgeuse.&lt;br /&gt;&lt;!--[if !supportLineBreakNewLine]--&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;div style="" id="ftn2"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons.html#_ftnref2" name="_ftn2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style=""&gt; &lt;/span&gt;- almost all humans were considered evil and clutching , except for the Chinese since the chop stick population was widely ignored in those days*.&lt;/p&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoFootnoteText"&gt;* - while usually the past is considered &lt;a href="http://www.goodolddays.net/"&gt;better then the present&lt;/a&gt;, some aspects of it are considered by most to be less then optimal. these days chop sticks are regarded as only slightly less equal then other kitchenware (the word cutlery is now considered a racial slur)&lt;br /&gt;&lt;!--[if !supportLineBreakNewLine]--&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;div style="" id="ftn3"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons.html#_ftnref3" name="_ftn3" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[3]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;  &lt;/span&gt;- some suggest that it was actually the insidious forks behind the attempt to threaten the spoons. it is widely accepted that while ominous looking, the knives rarely work without the forks.&lt;br /&gt;&lt;!--[if !supportLineBreakNewLine]--&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;div style="" id="ftn4"&gt;  &lt;p class="MsoNormal"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/08/planet-of-spoons.html#_ftnref4" name="_ftn4" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[4]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style=""&gt; &lt;/span&gt;- deceptively called nick, but actually played by &lt;a href="http://en.wikipedia.org/wiki/Nick_of_Time_%28film%29"&gt;johny&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-2644902546975337044?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/2644902546975337044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=2644902546975337044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/2644902546975337044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/2644902546975337044'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/08/planet-of-spoons.html' title='Planet of the Spoons'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-173581760069304311</id><published>2007-08-08T01:52:00.000+03:00</published><updated>2007-08-10T14:20:48.392+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Law And Order'/><title type='text'>...And patents for all*</title><content type='html'>I read an &lt;a href="http://www.law.duke.edu/journals/dltr/articles/2002dltr0013.html"&gt;article &lt;/a&gt;which claims that "&lt;span style="font-family:Arial,Helvitica,sans-serif;"&gt;&lt;i&gt;Software patents help heighten the standard by supporting the re-use of the code of established and tested systems" &lt;/i&gt;&lt;/span&gt;the theory behind this idea is very nice - if you give people patents, then they can afford (by selling the patented software) to build higher quality software and thus be able to provide the market with a high quality less error prone product. to me this article represents a deep misunderstanding of the software world. patents are granted for 20 years while software is outdated in 2-5 years at most (and 5 years is REALLY stretching it) things change quickly in the software world and that is the reason people code quickly and are forced to build and rebuild things. sure, some software still contains very old code, some systems are continuously developed over long periods of time. but every now and then you have to rewrite things. knowledge has progressed. the tools, languages , operating systems , design patterns and coding methods change over time. when enough time has passed your code becomes so outdated and inefficient that you're just better off starting from scratch. this doesn't mean you haven't learned anything - you gathered alot of knowledge on the way the software should function and look, and writing the system again is usually faster than writing it the first time. the added benefit of the world around you progressing usually results in new and faster more reliable ways of doing things. patents don't help improve the quality of software, they prevent people from using good ideas that were patented. you can easily write software today using advanced languages and support from the OS , that would have taken you months to write just 10 years ago. and the software you end up with will be more reliable , better looking and support more functionality that it would have 10 years ago. but to do that you must use new methods, languages and tools.&lt;br /&gt;&lt;br /&gt;I was recently entertaining the idea of starting up a software company. its not very hard coming up with interesting ideas that can make alot of money. its also possible to get funding if you have a serious business plan and a good team. the problem is that if anyone is thinking of something similar to the thing you wanted to do, odds are they have patents in the field. this means that even if you are more capable then whoever else is doing approximately the same thing, you still won't be getting any money from investors - and for good reason , you might find out that you cant market your product because you might be sued for patent infringement. this goes against the very ideology behind a patent - if the idea is so innovative , how come so many people came up with it again and again? of course, you could say that with no patents to begin with, someone would just copy your idea. well, if your idea is easy to duplicate and trivial to come up with - i guess its not patent worthy to begin with. i know its pretty hard to give a general definition of what is a trivial idea, its also hard to agree on what idea is trivial and what idea is innovative. the thing is , you know it when you see it. if you know something about a certain field , you can say if something is truly innovative or just something a lot of other people can (and will) come up with (or may have already thought of). the one-click buy is such an example. the idea is so trivial i would have never in a million years thought it's possible to patent. amazon where issued &lt;a href="http://en.wikipedia.org/wiki/1-Click"&gt;their patent &lt;/a&gt;in sept 1999. they sued B&amp;N by October. i don't know when B&amp;amp;N added the feature to their website, but i think no one can seriously claim they started work in September - when they saw the patent approval - and were done and launched the feature by October. it was probably in the works long before that, which only helps to demonstrate how obvious the idea is. really, this sort of thing should probably be grounds for revoking the patent rights. but then again - it should never have been issued in the first place.&lt;br /&gt;&lt;br /&gt;* well, maybe not *all* - all , more like "if you have the money and are the first to ask for them" kind of all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-173581760069304311?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/173581760069304311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=173581760069304311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/173581760069304311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/173581760069304311'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/08/and-patents-for-all.html' title='...And patents for all*'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-8147179816301426940</id><published>2007-08-05T04:09:00.000+03:00</published><updated>2007-08-16T00:18:59.558+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Law And Order'/><title type='text'>One click patent ©®™</title><content type='html'>The Israeli version of the 'American dream' has become in recent years the 'start-up' dream. as far as everyone is concerned you can come up with some silly idea get a patent for it  and get rich. the concept is so wide spread that the expression 'that's a startup(company/idea)' meaning 'a trivial/obvious/stupid idea' has come to replace a previously wide spread expression 'that's a patent' - meaning the same thing .  everyone here has some startup idea.  mostly these ideas are impractical/impossible/useless/done-to-death/done-and-failed/already-exist&lt;span style="line-height: 115%;font-size:8;" &gt;&lt;/span&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/one-click-patent.html#_ftn1" name="_ftnref1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, following in the footsteps of my people i wish to present my new 'startup' idea - the amazing 'one click patent' software:&lt;br /&gt;In this revolutionary new product you can enter your patent application and then get it reviewed and approved in just one click! with patent pending patent issuing technology our application can run through thousands of previously issued patents and cross check the validity of the patent pending patent request. With the new patent pending Insta-Pent™ algorithm  we can scan all current human knowledge and judge the LOI (Level Of Innovation) in your patent vs. the current level of background innovation. once your application has surpassed the LOI required by US patent law&lt;span style="line-height: 115%;font-size:8;" &gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/one-click-patent.html#_ftn2" name="_ftnref2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; , our software automatically confirms your patent. if your patent request is below the  minimal required LOI you are displayed a unique Insta-Ject™ screen showing our friendly (Copyrighted) message : "A thousand monkeys can come up with Shakespeare and all you can come up with is this? please hire more monkeys and try again later". So hurry and get your copy of "One click patent".&lt;br /&gt;In the words of our advertising agency : "Get a patent today, before all the good ideas are taken!"&lt;br /&gt;&lt;br /&gt;All kidding aside, the reason people think of a patent as something easily attainable is because it actually is. of course, i could be wrong, it might take a true genius to come up with &lt;a href="http://en.wikipedia.org/wiki/1-Click"&gt;one-click-purchase&lt;/a&gt;. personally, i think the conversation leading to the patent went something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing      &lt;/span&gt;: "our users are not buying things fast enough!"&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Development &lt;/span&gt;: "why not?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing      &lt;/span&gt;: "well, i've done some extensive research and it seems that people are clicking on the wrong things in our website. they have to click again and again..and they get confused. i conducted this research on myself."&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Development &lt;/span&gt;: "hmm...so , what do you suggest?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing      &lt;/span&gt;: "well.. i dont know. this is a real though one. maybe we can add more flash animations, pop up windows and commercial banners?"&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Development &lt;/span&gt;: "but wouldn't that cause the exact opposite of what you are trying to achieve?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing      &lt;/span&gt;:"let me think about this for a minute....hmm.....yes..i see your point. ok , well then how about ..."&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Development &lt;/span&gt;: "listen, why don't we just reduce the number of clicks a user has to go through when buying something? maybe we can use some sort of account"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing      &lt;/span&gt;:"oh, stop it with your technical terms, this is a real world problem. let me think about this scientifically. well, the minimal number of clicks a user can possibly make is two.."&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Development &lt;/span&gt;:"what? why two?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing      &lt;/span&gt;:"You see - thats what happens when they make me talk to technical people , everything has to be explained to you people - you have to click on things twice to get them to do stuff. it's known in the marketing world as 'twicely clickable' "&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Development &lt;/span&gt;:"you mean double click?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing      &lt;/span&gt;:"if you must use layman's terms.."&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Development &lt;/span&gt;:"..um...you know, you don't actually have to click everything twice.."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing      &lt;/span&gt;:"of course you do."&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Development &lt;/span&gt;:"no , you don't, look (click) "&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Marketing      &lt;/span&gt;:"what? let me try that, you're probably unconsciously clicking twice. ....(click)...hmm...(click again)....interesting. hey listen. this gives me an idea. why! this is &lt;a href="http://worsethanfailure.com/Articles/The_Brillant_Paula_Bean.aspx"&gt;brillant&lt;/a&gt;! what if we had a button on all our products that supports this single click technology? i'll have to research it, but im pretty sure no one has ever thought about this before. we should really patent this one"&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Development &lt;/span&gt;:"patent? clicking on something once to buy it? your not serious?"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing      &lt;/span&gt;:"of course i am. you technical people cant appreciate real-world creativity when you see it."&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%;font-size:8;" &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=""&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;hr style="height: 2px;font-size:78%;" align="left"  width="33%"&gt;  &lt;!--[endif]--&gt;  &lt;div style="" id="ftn1"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;span style="font-size:85%;"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/one-click-patent.html#_ftnref1" name="_ftn1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;  &lt;span style=""&gt;&lt;/span&gt; - pick any combination you like. as unlikely as it may sound, some of the things i heard are impossible and impractical and still have been done to death , and of course , failed because they are impractical , impossible and completely useless.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;div style="" id="ftn2"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;span style="font-size:85%;"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/one-click-patent.html#_ftnref2" name="_ftn2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;  - due to the level of innovation in our product we have advanced far beyond current patent application laws (apparently no one else seem to agree about the need and validity of our LOI concept..a mere technicality).therefore, predicting the coming change and definition of LOI we use the Amazon One-Click-purchase patent as a benchmark for all other applications. if you are at least as innovative as one-click , you are automatically granted the application.&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-8147179816301426940?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/8147179816301426940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=8147179816301426940' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/8147179816301426940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/8147179816301426940'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/07/one-click-patent.html' title='One click patent ©®™'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-5561767988950607871</id><published>2007-07-31T22:40:00.001+03:00</published><updated>2007-08-16T00:06:36.426+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>The (role playing) games we play</title><content type='html'>&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style=""&gt;RPG games have been around for years now, and with the onset of computerized RPGs they have evolved beyond games once played by groups of spotty faced geeks. with the invention of the MMO world , RPGs are more popular today than ever in human history&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftn1" name="_ftnref1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;! There are many elements that make RPGs fun, but i want to focus on one impotent aspect of the role playing world - the classes and levels system. when you play a role playing game you need to increase your experience to gain more power and magic. you have to learn to use your powers wisely if you are to progress. this crucial concept- experience-based power-wielding ability - is missing from the real world. especially in the software world.&lt;br /&gt;&lt;br /&gt;I have been a programmer for a while now, and I've seen horrors coded in many languages. I've seen all kinds of dangerous 'language features' that should not be left unattended for the inexperienced programmer to abuse.&lt;br /&gt;In the same way you will not let a ten year old operate heavy machinery while intoxicated(well, maybe for some harmless fun), you really shouldn't let computer science students use parameter overloading in c++ when they can barely comprehend the concept of functions.&lt;br /&gt;&lt;br /&gt;This is why i think we should learn from the RPG world and implement a class and level system for the coding world. the details of such a system are presented here:&lt;br /&gt;&lt;br /&gt;First you start apprenticing (Levels 1-3) and you are only allowed to use non languages like LOGO or HTML, after a while when you have proven yourself worthy, you might be allowed to progress to more advanced scripting&lt;/span&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftn2" name="_ftnref2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt;(Levels 4-7).you can use java/vb scripting but only in a web based environment, where the browser prevents you from causing too much harm. once you gathered more experience (Level 8-10) you will be allowed to choose a VB programmer class. experts&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftn3" name="_ftnref3" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[3]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt;agree that VB is not really a programming language, so anyone who chooses to use VB is forever forbidden from writing code in any other language.&lt;br /&gt;Anyone who tries to code in Perl will lose all their execution privileges, not that it matters since it seems Perl programmers are more concerned with how many "kewl" things they can do in a single incomprehensible line of code, they wont actually notice that the code doesn't execute.&lt;br /&gt;&lt;br /&gt;if you decide to program in a real language you will be allowed to select one of the real languages (c, c++, java, c#, assembly is reserved to levels 50+) each language will have it's own restrictions for a beginner.&lt;br /&gt;&lt;br /&gt;C :&lt;br /&gt;beginner c programmer can only use if, for, while, switch, single parameter function (you can choose between return param or function param), and 3 global variables (any more and the beginner gets confused). loops cannot be nested until level 13, you get a nesting level for each level above 13. altho, if you need beyond 3-4 nesting levels for anything you will be converted into a VB programmer. function within function calls have a limited stack of 3 calls. this effectively disables the beginner from using recursion, and also helps reduce their confusion with all these functions calling functions. the use of pointers is only allowed from level 15, void pointers from level 20, you get a new level of pointer nesting beyond the first for every level beyond 21, function pointers starting level 35, malloc is disabled until you reach level 30. you get 1 ifdef per level starting with level 12, programmers above level 20 can use as many as they like.&lt;br /&gt;syntactic sugar like using ++ is only allowed from level 14 and on.&lt;br /&gt;copy and paste functionality is disabled in the IDE until level 18 to prevent use of the poor man's code reusability (lazy programmers that cant refactor things into functions).&lt;br /&gt;&lt;br /&gt;C++ :&lt;br /&gt;all limitations for c also apply to c++, with extra limitation for operator overloading (level 50+). the required use of classes lowers the required level for use of pointers to level 10 (entry level for c++) but only class and primitive pointers. the use of function pointers is forbidden in c++ (object orient damn it!) until level 50+ those who practice the black art of function pointers and operator overloading will be periodically reviewed by the great council :the ICCC&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftn4" name="_ftnref4" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[4]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;. any transgressions will cause immediate demotion to either VB programmer or perl coder.&lt;br /&gt;&lt;br /&gt;Java:&lt;br /&gt;well, no malloc and pointers, so that makes life a little easier, also use of classes is enforced by the language, and no param overriding or ifdefs so you can do less harm to begin with.&lt;br /&gt;the limitations for java programmers like function call stack size, loop nesting etc. is the same as in c++ and c. the catching of Exception is forbidden for programmers under level 23, RuntimeExceptions can only be caught by programmers level 26+. NullPointerException cannot be caught by anyone (except by catching more global exceptions) attempt to catch a NullPointerException will result in immediate demotion to VB programmer. the use of Vectors is allowed starting level 20 but allows only for storage of primitive wrappers and strings. When you reach level 25 you can choose other things, but you must take a test on garbage collection before you can advance to level 25. passing the test also allows the use of HashMaps. reflection can only be used from level 30+. the use of threads is allowed from level 40 and on, attempt to use the double lock pattern will result in a hearing before the great council which may result in a 3 week transfer to customer support. inheritance depth will be limited to 2 until level 15, you get an inheritance depth level for every level beyond 15. the use of anonymous classes is allowed starting level 18.&lt;br /&gt;using JNI is allowed starting level 45 and requires knowledge of either c/c++ of at least level 20.&lt;br /&gt;&lt;br /&gt;C# :&lt;br /&gt;mostly the same as java, but with the reintroduction of pointers and limited operator overloading. unmanaged code + operator overloading require a level 50 c# programmer.&lt;br /&gt;c#/java programmers get a bonus level in the other language for every 2 levels they get their native language.&lt;br /&gt;&lt;br /&gt;You too can help improve the future of coding, coders, and software in general by joining the great council and adding new, more draconian restrictions on low level programmers (only level 40+ programmers are allowed to join (but not vote). you get one vote&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftn5" name="_ftnref5" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[5]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; per level starting with level 50). Join today by leaving your email address in any public website or forum and get free Viagra commercials, exciting business opportunities from Nigeria and more!&lt;br /&gt;&lt;br /&gt;&lt;!--[if !supportLineBreakNewLine]--&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;hr style="height: 2px;font-size:78%;" align="left"  width="33%"&gt;  &lt;!--[endif]--&gt;  &lt;div style="" id="ftn1"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;span style="font-size:85%;"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftnref1" name="_ftn1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style=""&gt; &lt;/span&gt;- &lt;span style=""&gt;well, known human history, or rather ... human history that is known to me...which is a somewhat limited scope..but , well, it happened so long ago that no one* &lt;/span&gt;&lt;span style=""&gt;could seriously say they care about it..&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;span style="font-size:85%;"&gt;*- no one except old people. it seems that at a certain age a lot of people start caring about history. i think it might be driven by their quest to prove everything was better in the good old days, and everything sucks now. then again, it could be that they are simply bored...&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;div style="" id="ftn2"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;span style="font-size:85%;"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftnref2" name="_ftn2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;  &lt;/span&gt;- OS scripting not included. if you wanna write OS scripts you can change your class to Sysadmin, of course, you'll have to apprentice as annoying user, then progress to user, windows installer, super user, computer tech, and finally sysadmin. level 1 sysadmin can only maintain windows servers, only starting level 10 are you allowed to even see a linux/unix system. attempting to do so earlier can result in sever shock and sometimes death. the lack of a mouse based gui system has caused many inexperienced sysadmins to lose their minds and start clicking on random monitors. before the LCD days this often ended in electrocution .&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &lt;!--[if !supportLineBreakNewLine]--&gt; &lt;!--[endif]--&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;div style="" id="ftn3"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;span style="font-size:85%;"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftnref3" name="_ftn3" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[3]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;  &lt;/span&gt;- an expert is anyone programming in any of the real languages (assembly, c, c++,  java, c#)&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;div style="" id="ftn4"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;span style="font-size:85%;"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftnref4" name="_ftn4" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[4]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;  &lt;/span&gt;- - International Council of Computer Coders  (take that, I triple E) -  not associated with the &lt;a href="http://www.iccc.net/"&gt;other ICCC&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;div style="" id="ftn5"&gt;  &lt;p class="MsoFootnoteText"&gt;&lt;span style="font-size:85%;"&gt;&lt;a style="" href="http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html#_ftnref5" name="_ftn5" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style=""&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span style="line-height: 115%;"&gt;[5]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;  &lt;/span&gt;- The votes don't count&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-5561767988950607871?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/5561767988950607871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=5561767988950607871' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5561767988950607871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5561767988950607871'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/07/role-playing-gmes-we-play.html' title='The (role playing) games we play'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-3634391558909435247</id><published>2007-07-28T01:57:00.000+03:00</published><updated>2007-07-28T12:08:14.510+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Rest'/><title type='text'>The rythm of  writing</title><content type='html'>I sometimes find something lacking in the written word.&lt;br /&gt;When i write there's a certain rhythm to the writing, i sort of expect the text to be read at a certain pace and intonation. all of this is lost in the written word and i always wonder how would this text 'sound' to someone else? can my particular way of expression cross over through the text?&lt;br /&gt;I assume that people who know me  and are aware of my style of conversation might be able to more accurately reproduce my rhythm from the text. but then again, i am not sure i can do this when i read their writings.&lt;br /&gt;&lt;br /&gt;When i was in high school we where learning a Hebrew poem by Leah Goldberg called '&lt;a href="http://www.sikumuna.co.il/wiki/%D7%9E%D7%A9%D7%99%D7%A8%D7%99_%D7%94%D7%91%D7%9F_%D7%94%D7%90%D7%95%D7%91%D7%93_/_%D7%9C%D7%90%D7%94_%D7%92%D7%95%D7%9C%D7%93%D7%91%D7%A8%D7%92"&gt;mi shirei ha ben haoved&lt;/a&gt;' (From the songs of the lost son. loosely translated) . Our teacher was reading the poem in a kind of empty voice, she was reading the words and sentences but she was ignoring the rhythm and intonation that to me where screaming from the page. it was just so obviously there. and the poet was obviously using it - the poem was build from three separate 'sub poems' and each had it own rhythm. eventually, when my teacher reached the last of the sub poems , which was the most obviously structured and had the most meaningful rhythm to it i couldn't take it any more. i stopped her reading and i asked why wasn't she reading the poem the way it was meant to be read? why was she leaving out the rhythm and intonation? she didn't understand what i was talking about and asked me to read it. there was a deep silence when i finished.&lt;br /&gt;&lt;br /&gt;In a Hebrew bible you can find markings that details the precise way of expression for a word and a sentence. the precise tone , rise fall, rhythm and pace are described by numerous markings decorating the regular alphabet characters. certainly these symbols are not required in order to read the text and understand it and while i can read the bible , i do not know the meaning of all the different symbols that decorate it. the reason these markings are there is that the people who wrote the bible aspire to preserve not only the words but also the accurate 'sound' of reading the bible. there where no means of recording at the time, and since people wanted to preserve everything very accurately , they constructed a very elaborate and accurate method of conveying both the words and their pronunciation , rhythm, everything they could think of. add to that constant repetition and very strict methods of transferring the accurate knowledge of reading both the words and their decorations , and you get something very close to a recoding from two thousand years ago.&lt;br /&gt;&lt;br /&gt;it would have been nice to have this sort of decoration, that way i could know exactly how my words would 'sound' to a reader. but maybe leaving the 'sound' to the reader provides some of what is called the 'power of the written word'. perhaps when you read the text to yourself, with your own internal voice , the words become more personal, more persuasive. maybe a bit more  like your own thoughts than like someone else's writings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-3634391558909435247?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/3634391558909435247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=3634391558909435247' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/3634391558909435247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/3634391558909435247'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/07/rythm-of-writing.html' title='The rythm of  writing'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-7319479446070324563</id><published>2007-07-26T01:19:00.001+03:00</published><updated>2009-08-19T14:04:34.976+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>For the love of Embedded databases</title><content type='html'>mmm...there are a lot of dev blogs out there that focus on information for developers. they have guides, reviews and code samples.&lt;br /&gt;i might do that (review, guide, code samples etc' ) from time to time, but really there's so much out there that i find it somewhat redundant to have yet another post on some tech or another.&lt;br /&gt;the reason i am still posting this one is to share the results of some research, and to share what might happen when you fall in love with some crazy idea of embedded databases.&lt;br /&gt;&lt;br /&gt;so , anyhow, today's topic is my experience with setting up O/R mapping and it's relational DB using .net.&lt;br /&gt;&lt;br /&gt;first a short intro:&lt;br /&gt;O/R Mapping stands for 'Object - Relational mapping' and it's a concept that makes databases a more useful , easier to work with thing. (it gets very close to making them worth while ;) ).&lt;br /&gt;basically, it defines a way to easily map objects into database tables and structures.  its a rather complicated problem when you start thinking about how to represent parent/child relations, or one to many ..or collection...joins...and other weird things db people like to do.&lt;br /&gt;if you want more details, please check out &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;the source of all knowledge&lt;/a&gt; for more details.&lt;br /&gt;&lt;br /&gt;in the java world, there's only one O/R mapper worth its while - Hibernate. its a very powerful , well written , well maintained , open source O/R mapper.&lt;br /&gt;the grate thing about .net is that its so much like java that all the cool projects out there started porting to .net (Spring, Log4Net, NUnit to name a few). its so much like java that you only have to learn how they renamed the classes and packages. the rest is pretty much the same.&lt;br /&gt;&lt;br /&gt;anyhow, in the .net world there seem to be a few others. but i know the way the hibernate people do the job and i trust them more then some other projects. especially since they are amongst the few that are open source for .net . also, they already solved alot of the problems when they where writing the java version, so i guess they can do it better then other inexperienced dev's.&lt;br /&gt;One other project i particularly liked the idea of was &lt;a href="http://www.db4o.com/"&gt;db4O&lt;/a&gt;. it used to be an open source, and is still free for non commercial use. its not actually an o/r mapper , but an embeddable object based database.&lt;br /&gt;unfortunately , i am a commercial user , so we preferred the open and free option.&lt;br /&gt;&lt;br /&gt;at first i thought i wanted an embedded database. it sounded so cool - no installation for the user, no DB administration for the user, none of the annoying hassle of a full blown DB.&lt;br /&gt;sure, it wouldn't have the same performance , and it might have trouble working with too many concurrent users , but our project doesn't need either. but, as bono once said - l&lt;a href="http://en.wikipedia.org/wiki/Love_Is_Blindness"&gt;ove is blindness&lt;/a&gt;*.&lt;br /&gt;&lt;br /&gt;since i already decided on hibernate , there was only the question of which  db to use.  this means we need a db with a dialect hibernate understands (one might think that SQL is enough of a standard , but as you soon find out, its very far from being standard. ). this gave me a very short &lt;a href="http://www.hibernate.org/361.html"&gt;list &lt;/a&gt;to work with. some databased i already knew and knew i didn't want :&lt;br /&gt;Oracle - expensive and annoying&lt;br /&gt;MS SQL - expensive and annoying, tho probably not as much as oracle&lt;br /&gt;Access - not really a database&lt;br /&gt;DB2 - expensive , annoying and made by IBM(to relieve and doubt - being made by ibm is a bad thing. one might think that its a big prestigious company , and it is. but their products suck. badly.)&lt;br /&gt;so that left the databases i never heard about , and MySql. i'v always heard people say that its a grate open source database , and that everyone is using it. i'v never met someone who told me they where actually using it (they all use Oracle...those poor bastards)&lt;br /&gt;now, MySql was such an obvious choice that i had to go with something else. and besides i was inlove with the concept of a the three no's of embedded databases  : no-installation , no-configuration , no-administration.&lt;br /&gt;so i checked out:&lt;br /&gt;SqlLite - looked awful , no smooth integration with C# as far as i cared to look.&lt;br /&gt;PostgreSQL - seemed nice but wasn't really embeddable.&lt;br /&gt;Firebird - seemed nice and was also embeddable.&lt;br /&gt;so i decided to give firebird a go. everything was fine for a while..it was a bit annoying to install it's driver and it took some effort to properly configure nhibernate due to some mistakes in their guide (which is very much unlike them , particularly since the corrections where present as user comments on the bottom of the configuration page) , but anyway, i got it to work. i was very happy with my shiny new embeddable database, and then DISASTER! i started getting : &lt;b&gt;Internal gds software consistency check (cannot find tip page (165)).&lt;br /&gt;&lt;/b&gt;hmmm... i thought to myself...this cant be a major thing, i just finished setting up the db, just committed my first tiny bit of data...i probably configured something wrong. quick google search turned up &lt;a href="http://www.ibphoenix.com/main.nfs?a=ibphoenix&amp;s=1184882853:98652&amp;amp;page=ibp_err_problem"&gt;this page &lt;/a&gt;... and...oh my...not only is this not a configuration error, its a critical DB error....database is completely destroyed....&lt;br /&gt;Wait a minuet...when i started reading up on firebird ..all this backup, repair and fix tools where mentioned...1 .... + ..... 1 = wtf???&lt;br /&gt;well, i guess i am fortunate it failed so soon. it would have been far more disastrous if these crashes only happened after we delivered it to our customers.&lt;br /&gt;&lt;br /&gt;for the random google searching user i will state this plainly :&lt;br /&gt;Don't use Firebird. don't use it with .net . don't use it with NHibernate. Just don't use it at all.&lt;br /&gt;&lt;br /&gt;i ran some more searches, looking for some obscure database i might have missed but no go.&lt;br /&gt;i also took a short look at the embeddable version of MS SQL express edition, but it only supports a max 4 gig database (it has other annoying limitations as well)..so it was useless for our app.&lt;br /&gt;&lt;br /&gt;eventually i came back to MySQl... as it turns out , if you want a free, open source real DB...its the only serious option out there.&lt;br /&gt;&lt;br /&gt;EDIT: read update at the end of this post , turns out MySql is not actually free.&lt;br /&gt;&lt;br /&gt;it took half an hour to install and configure it to work with hibernate. and aside for an annoying problem i had starting it up (i wanted to use UTF8 as the charset because our users might need internationalization ..to set it up in MySQL you need to enter a freetext string, so i put in UTF8...turns out you have to put in lower case utf8....the the exception you get is just perfect "key not found in dictionary" worse yet - there's a gui and a ""test connection" which tells you everything is ok even tho you configured a nonexistent charset. how i figured it out i still don't know..i guess you come to expect silly things like that when you do this sort of work long enough) but after that everything seems to be working.. no complete database crashes for no reason , fast responses, and some nice db management tools.&lt;br /&gt;&lt;br /&gt;As for my initial infatuation with the concept of embedded db, well, &lt;a href="http://answers.yahoo.com/question/index?qid=20070713144203AAnTKbt"&gt;they&lt;/a&gt;** say "you never forget someone you loved"..so i still think some day embedded db's might be something we take for granted in every application. in the mean time we can all tell everyone that everyone is using mysql.&lt;br /&gt;&lt;br /&gt;Join us next time for "Transparent Controls or: how i learned to stop&lt;span style="font-size:100%;"&gt; trying &lt;/span&gt;and hate windows forms"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE (8/10/2007): &lt;a href="http://www.blogger.com/profile/05542920325440015442" rel="nofollow" onclick=""&gt;German Viscuso&lt;/a&gt; mentioned that MySql isn't actually free.  its distributed by a dual license - the dirty trick fake open sources use (free means free. not 'free under the following conditions') - a GPL infective**** or a Commercial license. so we turned to the only available alternative : PostrgreSQL. supported by NHibernate, works flawlessly and most impotently , doesn't infect my company with an evil licenses (PostgreSQL is distributed under BSD license - almost completely free. basically all they want is the credit for the db they wrote...) .&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;a href="http://www.hibernate.org/361.html#A6" _base_href="http://www.hibernate.org/"&gt;&lt;/a&gt;&lt;br /&gt;* - i told you it was the source of all knowledge :)&lt;br /&gt;** - 5 points for anyone*** who guesses which happened first - i thought up the line, or i saw the quote in that link.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;*** - only one vote per ip , the points don't matter.&lt;br /&gt;**** - GPL is like a virus - if you want to use something licensed under GPL, you have to use GPL yourself.  ad infinitum. they even have a philosophy as to why they have to make you be just as 'free' as they claim they are. so , in the eyes of the GPL people - software should be 'free' as long as they get to define the meaning of freedom. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-7319479446070324563?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/7319479446070324563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=7319479446070324563' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/7319479446070324563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/7319479446070324563'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/07/for-love-of-embedded-databases-yeh-i.html' title='For the love of Embedded databases'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-959024958139480639</id><published>2007-07-25T01:55:00.002+03:00</published><updated>2009-08-19T14:06:08.609+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>Don't panic</title><content type='html'>at first i thought i might title this "the evolution of ui" but im not a UI expert, im mostly a UI user , and sometimes a UI designer.&lt;br /&gt;What i would like to say tho, is that i like the direction new UI is heading. back in the DOS days, you where happy if someone was kind enough to give you a text based screen with some text boxes you can tab through. then this new "windows" fad came up. and alot of people where quite skeptical of this concept. it's sad to say that even in these modern times , when even the most dedicated linux* , who compiles his own kernel and in the mean time (it could take days , seriously ) argues which editor is better, VI or EMACs (if they had just asked me i could have ended the discussion and tell them the simple truth - they both suck :) ) have probably seen, if not used , a mouse controlled GUI based operating system , there are still people out there who refuse to join the civilized world of modern UI.&lt;br /&gt;&lt;br /&gt;See, when people got their hands on GUI's and some GUI dev tools, they started going crazy. its like the first days of the internet, some companies built html authoring tools and suddenly everyone had a "homepage" , and they where ugly. i would have supplied links to some , but i oppose that sort of thing and i refuse to increase it's google score. for interesting result, try searching for "virtual reality glove" (yeh, i know...whatever happened to the whole VR thing?) and click on the first link..check out the wonderful 'scrolling' back button at the bottom of the page, and follow twice for a particularly vivid reminder of how most of the web used to look.&lt;br /&gt;anyhow, people did some terrible things on the old GUI's, they started putting textboxes and images and other ugly things all over the place, and it only got worse as time passed. UI's became more cluttered , more buttons more menus with more options. have you ever tried enabling all the possible toolbars in word 2003? not to mention try and reach every possible setting available on the menus, submenus, and subsubmenus (maybe there are subsubsubmenus also, i never had the  patience to find out). its not the worst of it. word is a "user" application, application for programmers or other professionals are much much worse , try your average CAD software for a taste of how horribly complicated UI can be. but this new trend of minimalist UI is wonderful.&lt;br /&gt;people finally realized that cluttering their users with useless options in hundreds of unreachable submenus is not such a good idea.  that maybe there are more useful features and , god forbid, LESS useful features, or even features that are completely USELESS.&lt;br /&gt;it's kind of like a revolution, the people have been abused for years with annoying cluttered overcomplicated UI and they finally rose up and said : no more!  we will not have your irrationally placed options! we will not use your incomprehensibly selected icon toolbars! and we will never again surrender to your annoyingly popping windows asking us silly "Yes-No-Cancel-Abort" questions!&lt;br /&gt;well, it would have been nice if it actually came from the users, but i suppose in a way it did. programmers, designers and on the rare occasion even software dev execs are all horrible UI users...i'd like to think they actually got fed up with all this cluttered nonsense.&lt;br /&gt;its like adams wrote about in hitchiker's guide : if you just have the words "dont panic" in big friendly letters on the cover, you will sell a lot more books :)&lt;br /&gt;i dont know if adams ever considered this analogy but having a nice , clean , simple UI with big friendly buttons and large friendly fonts is a lot like having "Don't Panic" printed in big friendly letters on the cover.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;* - while usually refers to an operating system,  i find that its more of a way of life, almost a religion, for most people who use it (the OS) , so in the same way one may be a Buddhist one may also be a linux (plural linuxs or maybe linuxi ? any linguists out there care to comment on this one?)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-959024958139480639?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/959024958139480639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=959024958139480639' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/959024958139480639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/959024958139480639'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/07/dont-panic.html' title='Don&apos;t panic'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4868875111006095493.post-5750706237940465191</id><published>2007-07-25T01:35:00.000+03:00</published><updated>2007-07-26T01:19:02.143+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Rest'/><title type='text'>Welcome to my new blog</title><content type='html'>Hi everyone (well, future everyone...).&lt;br /&gt;Welcome to my new blog.&lt;br /&gt;this is jumping ahead abit, but i was really impressed with this blogging platform..&lt;br /&gt;im not very well versed in the blogging biz, but i do have another blog in hebrew, and this blogging platform is just so nice...but more about that later.&lt;br /&gt;&lt;br /&gt;i suppose the first post should have to do with a sort of mission statement, so here goes:&lt;br /&gt;this is intended to be a blog about science, technology, programming, software in general and probably some other random things i think about.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;back to the blogging platform, now the random reader (U(0,1)) might think that perhaps this is some kind of commercial for Google , or for blogger.com or whatever, but really its not.&lt;br /&gt;i just like the "feel" of everything, i love that it took me 5 mins to set up the blog, that it has nice features like autosave for posts while writing, many nice looking and tastefully done templates (so what if i went with the first one ..i like the "word press like" feeling) but mostly i like the nice friendly clean uncluttered interface.&lt;br /&gt;&lt;br /&gt;but enough about that.&lt;br /&gt;&lt;br /&gt;anyhow, i hope you enjoy your stay, and please feel free to feed on my RSS , it has 20% of the daily recommended dosage of news and updates!&lt;br /&gt;&lt;br /&gt;Yossi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4868875111006095493-5750706237940465191?l=subjectively.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://subjectively.blogspot.com/feeds/5750706237940465191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4868875111006095493&amp;postID=5750706237940465191' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5750706237940465191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4868875111006095493/posts/default/5750706237940465191'/><link rel='alternate' type='text/html' href='http://subjectively.blogspot.com/2007/07/welcome-to-my-new-blog.html' title='Welcome to my new blog'/><author><name>Yossi Naar</name><uri>http://www.blogger.com/profile/15365527647677784779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
