Yes, you've managed to find workarounds to all of these issues. There are of course ways to work around them. People do use C++ to get real work done; I have used it successfully many times in the past.
The point is that you have to *know* about all of these issues in order to use just this one feature effectively, without introducing subtle bugs, performance issues, or design problems.
Your solutions will mostly work of course but they are not terribly compelling. We might as well keep going:
Calling arbitrary functions in constructors might work, but you can't return multiple values to use as different constructor arguments, so there are more hacks to be done there.
Taking a bool& is pointless; you still need a dead-state for the destructor, so you may as well make a separate method to test for the dead-state after the constructor is run. (Good style also generally dictates you should never use non-const reference parameters; use pointers for out parameters to highlight that they will be written to.)
Making its destructor protected prevents the class from being destroyed at all unless it is subclassed; the example GGP gave would longer work. I'm not sure what you meant be this. I do agree that documentation should suffice, but tools like -Weffc++ will still warn about it (and rightfully so.)
I am not sure what you mean by resource classes. All I'm saying is that if MyClass contains a pointer and you forget to create a copy constructor, the compiler will do so implicitly, and your class will break horribly somewhere down the line.
Again, these are not insurmountable issues. They are just many things you need to be aware of in order to use constructors effectively. No other language has such land mines in such a simple feature as object constructors.
You can't do non-trivial initialization in the constructor because initializer syntax is not turing complete. Most C++ style guides (such as Google's) suggest using a separate init() function, so it isn't really less lines of code.
A constructor can't fail without throwing an exception. Assuming you don't allow exceptions, your class now needs an internal dead state. This is the case even if you use a separate init(), because the destructor needs to know whether init() was successful (unless of course you use a separate destroy(), making this pointless.)
A destructor can't fail at all. There is no way to indicate failure; you can't throw an exception because the destructor might be called during stack unwinding from another exception. What if the destructor fails to flush a buffer? The C version can simply return a boolean to indicate this.
There is no way to indicate that MyClass should not be inherited, so to allow deletion through a base class pointer (a requirement to satisfy the Liskov substitution principle), your destructor should be virtual. This adds overhead to the class itself, and adds a lot of overhead at the call site if the runtime type cannot be statically inferred.
You now need implement (or at least declare private) copy constructors and operator=. Developers expect C++ objects to be copyable, and standard containers require it.
Don't you see what is going on here? Even the most trivial feature of C++, constructors, are horribly ridden with complications. C++ is a language of never-ending surprises, gotchas, land mines. It's a trap.
Unless you're coding in Java, I definitely don't agree with the Java-style getRisk(), because the 'get' is redundant. Accessor methods usually take no arguments and return a value, so the fact that they 'get' something is obvious. Google's C++ style advocates risk(), as does Apple with Objective-C (the default accessors for properties even work this way).
I would call it calcRisk() if it is not const, i.e. it modifies the Investment object somehow (and calc is common short form for calculate). If however it's a const method that just returns the risk, then putting calculate in front is unnecessary. In fact I'd argue that advertising the fact that it is calculated on the fly is a violation of encapsulation. What if you find out that calculating the risk is slow, so you'd like to pre-calculate it, and just return the stored value? calculateRisk() is now mis-named (and you get your grubby hands all over everyone's code and logs if you rename it.)
Of course, there were a lot of computer makes around in the 80s, but the other difference is that these phones today do support a common standard, mainly thanks to Java, and also due to functionality being offered on websites). It's not perfect, but it's way better than the bad old days of computing where you needed a different version for every make and model on the market. Now a single application runs on pretty much any phone.
What universe do you live in? You've obviously never been a mobile developer if you think this even remotely resembles reality. Having been a mobile developer for over 2 years, I can tell you that Java has done absolutely nothing to solve device fragmentation. The language doesn't matter; it's the libraries, of course.
Every carrier has a hundred devices, and every single device has a different bug in its implementation of MIDP. With the strict size requirements for J2ME, for all but the simplest applications you can't even attempt combined builds. You are forced to make a different build for each device. Just wait until you try something *really* broken, like say, playing audio...
And smartphones of course use different APIs. MIDP, Android and BlackBerry have entirely different windowing toolkits. How do you expect an app to be magically portable between them? Even BlackBerries, where RIM has tight control over the devices and API, exhibits lots of fragmentation between devices and OS versions. Java is quite hostile to incompatible libraries, giving classloader errors for the slightest inconsistencies. When you buy a BlackBerry app from a third party site, especially for games, you almost always need to specify the exact model of your phone.
What is needed to reduce fragmentation is a rigorous certification process to strictly enforce the requirements of the platform. Sun had their chance; they could have required extensive testing to put that J2ME/MIDP logo on a phone. Unfortunately Sun failed, and Android seems to be deliberately going down the same path. I don't see the landscape getting better any time soon.
>> D did another thing right: it did not remove destructors, like Java did. Instead, when there are zero references to an object, the GC calls the destructor *immediately*, but deallocates the memory previously occupied by that object whenever it wishes (or it reuses that memory). This way RAII is possible in D, which is very useful for things like scoped thread locks.
First of all, Java does have destructors. It's called finalize().
Second of all, calling destructors on a modern GC are extremely costly. Sure, your example implementation of destructors seems simple, but it is only possible in a reference counted garbage collector, which is so primitive as to be nearly useless.
Modern Java GCs are generational copying collectors. They have a young heap, where objects are allocated, and an old heap, where objects are moved when they survive an allocation. Object retention is done by tree search from a root node.
This means you can do fun things like allocate a linked list, then drop the reference node. When a collection happens, anything living is rescued from the young heap, and then it's simply wiped clean. No computation is performed regardless of how large it is or how many links it has, because there's no such thing as deallocation on the young heap. When you drop that first link, it's like the VM doesn't even know it's there anymore; the whole list just gets overwritten on the next pass over the heap.
If, however, you write a destructor for your links (or in Java, finalize()), the destructor then needs to independantly keep track of all of your destructable objects. It needs to remember that they're there so it can call their destructor when they do not survive an allocation. Furthurmore, if you impose your hard requirement of calling the destructor immediately, then the implementation of such a collector is impossible for your language. Even a primitive mark sweep collector, or anything not reference counted is impossible.
You should familiarize yourself with modern garbage collectors. I don't know much about D, but if D really is tied down to a reference-counting collector due to its destructor requirements, that makes it extremely unnatractive as a language. Here is more information on various collector implementations:
Strange. Most of the things you said about 4e are flat out incorrect, which you'd realize if you read the books. But the things you said that are actually correct about 4e, I think really are improvements. Points of note:
- No confirm criticals, criticals are just max damage on a 20. Goodbye dramatic tension as you bunch over the faded die, figuring out if you got a 7 or 17 on that confirm roll. Goodbye variability. Goodbye fight-ending strike. Critical hits were stupid in 3e. Getting within crit range quadrupled the number of dice you had to roll, and the vast majority of the time you ended up just doing maximum normal damage anyway (since that's what double dice averages to on a bell-curve with a very high standard deviation).
- Attackers roll saves instead of defenders. Stupid. It takes the fate out of your hands and into mine, not to mention I have to look up the bonus a cliff gets to its reflex attack. wtf? On physical attack rolls, fate has *always* been in the hands of the attacker; you roll against the opponent's AC. Why should spells be different? Why should traps or any other obstacles be different? More importantly, rolling against a fixed number is much more powerful and flexible; for instance it allows crits on spells. Crit fireball!
-Diagonal movement works the same as lateral movement". I assume this means they moved to hexes? no? Then I guess you can move faster by moving diagonally in about ANY circumstance. Once again, way to break the world. Yes, you move faster on a diagonal, but so what? It's not like you get to choose whether or not you approach a monster diagonally; he's either on a diagonal away from you, or he's not.
-Every class has two suggested "builds". What did I say before about telling us how to play? Honestly, at least leave WHO we play up to us. Similarly, each class has a "role". Not that they are customizable or anything. Nope, it's just like "Do you want a DD or a tank?" all over again. You're kidding, right? Tell me what decisions you make in the development of, say, a monk in 3e. It's listed right in the PHB exactly at what levels your abilities improve. Every monk is the damn same. There is far more customizability now than in 3e.
What really bugs me about your post is that you didn't seem to complain about any of the real problems with 4th edition. Like getting to full hit points in 6 hours sleep. I think that's a real problem; it very much breaks attrition damage in a dungeon crawl. It's probably something our party will house-rule when we play 4e; like for instance, you only heal to full if you sleep in a town. Or the drastically culled list of wondrous items. That's a very big problem, and we will probably keep our 2e and 3e DMGs around just to use their wondrous items in 4e. Still, I am very excited about 4e, and will probably pick it up the next time we get party-wiped.
It's even worse than that. I got penalized for only answering ten questions. They suggested I answer twenty more to remove the penalty. IN 60 SECONDS!!!
The test gives you about two seconds per question. That's not even enough time for general knowledge (read: culturally dependant) questions which don't belong on an IQ test, let alone complex pattern matching. I'm sorry, but that's no kind of IQ test.
Here's a fairly simple answer: They do cause gravity. They do pull.
The reason is because in general relativity, it is not mass that attracts by gravity (i.e. that warps space-time), but rather energy. The confusion arises because, informally speaking, a small amount of mass has *A LOT* of energy. The gravitation caused by other forms of energy are pretty negligible when there's mass around, which is why it seems to us like it's only caused by mass.
Electromagnetic waves such as light do have energy however, so they gravitate; they attract other objects to themselves by slightly warping space-time. If you've got a lot of light around (like say, the light being emitted by a galaxy), then that can have a non-negligible effect on the gravitational pull of that galaxy.
Other forms of energy also gravitate. For instance, a fast-moving object has a lot of kinetic energy, so it will gravitate slightly more than if it is stationary (this can also be interpreted as the moving object having more mass, as the above poster explained). In the case of plain old space dust it's pretty negligible, but it's very much not in the case of a spinning black hole, which will greatly affect its size and pull. This makes it extremely complicated to achieve any kind of accuracy in black hole calculations.
Even though you're right, you should be modded troll. There's no reason to be so rude to someone who is obviously interested in the subject. Saying things like this:
To those don't understand physics: please stay off physics-related discussions is the best way to keep people out of physics, and to keep the general public terrified of nuclear power, wireless communication, power lines, etc. Be encouraging if you want people to stay interested.
A license like the LGPL would be nice; if the software isn't usable without companies having to open up their entire game (i.e., give everything away for free) Even with a GPL engine, they don't have to give everything away; just the source code. They can still retain copyright on all the game's artwork and media. For example the engine to Quake 3 Arena is open source under the GPL, but that doesn't mean you can just go burn a copy of the game; it's still piracy, because you have to pay to use the content.
That said, I agree that the engine should be LGPL to encourage closed-source developers to use it and contribute to it. Anyway the discussion is moot because Crystal Space 3D is already LGPL.
If by 'play with it' you mean play with the interface, then you can install OpenMoko on all sorts of phones and PDAs to try it out. Just yesterday I installed it on my Palm T|X. If you don't have a compatible touch-screen PDA, you can always virtualize it on your desktop using something like QEMU:
If you RTFS (read the fine summary), you would find that Office IS activated. But because Visio is not activated, Microsoft is refusing to provide add-ons for Office, and instead presenting him with a page to buy Office, which he has already purchased and activated!
And with $250,000 how many coders/maintainers can they hire until 2012 to work in other things, like the kernel, xorg, usability, repositories, etc... to do you know things that really matter? Until 2012? Approximately one.
It will be entirely through AIGLX, which does work with the ATI open-source drivers (not fglrx) on many ATI cards. There is no way Gutsy would ship with Xgl (let alone by default).
So as far as I know, it will ship with open-source Intel and ATI and binary NVIDIA drivers by default, with Compiz activated on all cards that support it.
As far as 'classic gamers' go, I think you're in the minority.
I still, to this day, play Super Mario Bros. regularly on my original NES (even though both my remotes are falling apart). I've beaten it in under six minutes; I've beaten it without dying; I've beaten it without warp zones. Right now I'm practicing beating it without dying AND without warp zones. Like GP, the enjoyment is in the accomplishments.
This isn't to say today's games aren't fun. I enjoy games like Diablo II for the fantasy aspects. Fireballs are cool; I grin when I throw them. And I get the same type of enjoyment out of games like Bioshock as I do out of reading a good book. That's all they do; they're for your imagination, storytelling on a more interactive level. Like GP, I get no sense of accomplishment from beating them. This is why I think you're in the minority; how many "classic gamers" do you think played through Super Mario Bros. for the storyline or the content?
Few games have managed to merge these two gameplay styles. I think the Legend of Zelda series are a great example of skill-based gameplay in a storytelling environment. But often, these games aren't well received; people who want difficulty are bored, and people who want storytelling are frustrated.
Most games these days, however, will have both aspects side-by-side, with the skill-based aspect generated by a competitive multiplayer environment. Like Starcraft. Great single player, but very easy, and very little sense of accomplishment. Fantastic multiplayer, and tremendously rewarding to the ego (and wallet) in tournament play.
For a good LaTeX tutorial, I highly recommend A Beginner's Guide to LaTeX. It's a tremendous guide which is very useful both for learning LaTeX and as a reference. It's what I used to learn LaTeX, and I continued to use the guide as a reference throughout university in everything I wrote from essays to lab reports to research papers. Once you've got LaTeX and an IDE installed, hop into Chapter 2 and start reading.
Although there is a "Compare Windows to Linux" tab on the new Compare site, nearly all the material there is targeted specifically at Red Hat -- one of the Linux distributors that is continuing to refuse to sign a patent-protection agreement with Microsoft. Ah, so only the non-blessed distributions are inferior to Windows Server? As if Get The Facts wasn't bad enough; they've started to play real dirty. I don't see a page on redhat.com bashing Windows.
I'm very glad Red Hat is standing up to Microsoft and their shit. I hope people can see through this campaign the same as they did with Get The Facts.
I see a lot of people here replying that these users don't exist. I'd like to point out that I used to be one of them. I set up a webserver on my Windows 98 box with a dyndns account using IIS when I was younger. I had no idea what Apache was at the time.
That said, I don't run a webserver anymore, and I highly doubt these people number in the millions. In fact I'm sure their numbers are entirely negligible.
Exactly. The point was not to punish Novell and MS, but to stop it from happening again. It would be very chilling for the spread of the GPLv3 if the FSF set a precedent of retroactively damaging companies who fully abide by the letter of the GPL, but do things the FSF considers to be immoral.
You say that like it's a bad thing. Nine million people would disagree.
Personally I love what they're doing with WoW. I don't play it myself, but it gives Blizzard a license to print money, which means they have an effectively limitless supply of cash to pour into other ventures.
Yes, you've managed to find workarounds to all of these issues. There are of course ways to work around them. People do use C++ to get real work done; I have used it successfully many times in the past.
The point is that you have to *know* about all of these issues in order to use just this one feature effectively, without introducing subtle bugs, performance issues, or design problems.
Your solutions will mostly work of course but they are not terribly compelling. We might as well keep going:
Again, these are not insurmountable issues. They are just many things you need to be aware of in order to use constructors effectively. No other language has such land mines in such a simple feature as object constructors.
Don't you see what is going on here? Even the most trivial feature of C++, constructors, are horribly ridden with complications. C++ is a language of never-ending surprises, gotchas, land mines. It's a trap.
Unless you're coding in Java, I definitely don't agree with the Java-style getRisk(), because the 'get' is redundant. Accessor methods usually take no arguments and return a value, so the fact that they 'get' something is obvious. Google's C++ style advocates risk(), as does Apple with Objective-C (the default accessors for properties even work this way).
I would call it calcRisk() if it is not const, i.e. it modifies the Investment object somehow (and calc is common short form for calculate). If however it's a const method that just returns the risk, then putting calculate in front is unnecessary. In fact I'd argue that advertising the fact that it is calculated on the fly is a violation of encapsulation. What if you find out that calculating the risk is slow, so you'd like to pre-calculate it, and just return the stored value? calculateRisk() is now mis-named (and you get your grubby hands all over everyone's code and logs if you rename it.)
Of course, there were a lot of computer makes around in the 80s, but the other difference is that these phones today do support a common standard, mainly thanks to Java, and also due to functionality being offered on websites). It's not perfect, but it's way better than the bad old days of computing where you needed a different version for every make and model on the market. Now a single application runs on pretty much any phone.
What universe do you live in? You've obviously never been a mobile developer if you think this even remotely resembles reality. Having been a mobile developer for over 2 years, I can tell you that Java has done absolutely nothing to solve device fragmentation. The language doesn't matter; it's the libraries, of course.
Every carrier has a hundred devices, and every single device has a different bug in its implementation of MIDP. With the strict size requirements for J2ME, for all but the simplest applications you can't even attempt combined builds. You are forced to make a different build for each device. Just wait until you try something *really* broken, like say, playing audio...
And smartphones of course use different APIs. MIDP, Android and BlackBerry have entirely different windowing toolkits. How do you expect an app to be magically portable between them? Even BlackBerries, where RIM has tight control over the devices and API, exhibits lots of fragmentation between devices and OS versions. Java is quite hostile to incompatible libraries, giving classloader errors for the slightest inconsistencies. When you buy a BlackBerry app from a third party site, especially for games, you almost always need to specify the exact model of your phone.
What is needed to reduce fragmentation is a rigorous certification process to strictly enforce the requirements of the platform. Sun had their chance; they could have required extensive testing to put that J2ME/MIDP logo on a phone. Unfortunately Sun failed, and Android seems to be deliberately going down the same path. I don't see the landscape getting better any time soon.
>> D did another thing right: it did not remove destructors, like Java did. Instead, when there are zero references to an object, the GC calls the destructor *immediately*, but deallocates the memory previously occupied by that object whenever it wishes (or it reuses that memory). This way RAII is possible in D, which is very useful for things like scoped thread locks.
First of all, Java does have destructors. It's called finalize().
Second of all, calling destructors on a modern GC are extremely costly. Sure, your example implementation of destructors seems simple, but it is only possible in a reference counted garbage collector, which is so primitive as to be nearly useless.
Modern Java GCs are generational copying collectors. They have a young heap, where objects are allocated, and an old heap, where objects are moved when they survive an allocation. Object retention is done by tree search from a root node.
This means you can do fun things like allocate a linked list, then drop the reference node. When a collection happens, anything living is rescued from the young heap, and then it's simply wiped clean. No computation is performed regardless of how large it is or how many links it has, because there's no such thing as deallocation on the young heap. When you drop that first link, it's like the VM doesn't even know it's there anymore; the whole list just gets overwritten on the next pass over the heap.
If, however, you write a destructor for your links (or in Java, finalize()), the destructor then needs to independantly keep track of all of your destructable objects. It needs to remember that they're there so it can call their destructor when they do not survive an allocation. Furthurmore, if you impose your hard requirement of calling the destructor immediately, then the implementation of such a collector is impossible for your language. Even a primitive mark sweep collector, or anything not reference counted is impossible.
This example is discussed in detail here:
http://www.ibm.com/developerworks/java/library/j-jtp01274.html
You should familiarize yourself with modern garbage collectors. I don't know much about D, but if D really is tied down to a reference-counting collector due to its destructor requirements, that makes it extremely unnatractive as a language. Here is more information on various collector implementations:
http://www.ibm.com/developerworks/java/library/j-jtp10283/
The first sentence in TFA is:
Imagine every time you closed your curtains, you were capturing enough solar energy to power your laptop.
I don't think they realize how little power a laptop uses. Can we get in "number of laptops" the power usage of a refrigerator or water heater?
- No confirm criticals, criticals are just max damage on a 20. Goodbye dramatic tension as you bunch over the faded die, figuring out if you got a 7 or 17 on that confirm roll. Goodbye variability. Goodbye fight-ending strike. Critical hits were stupid in 3e. Getting within crit range quadrupled the number of dice you had to roll, and the vast majority of the time you ended up just doing maximum normal damage anyway (since that's what double dice averages to on a bell-curve with a very high standard deviation).
- Attackers roll saves instead of defenders. Stupid. It takes the fate out of your hands and into mine, not to mention I have to look up the bonus a cliff gets to its reflex attack. wtf? On physical attack rolls, fate has *always* been in the hands of the attacker; you roll against the opponent's AC. Why should spells be different? Why should traps or any other obstacles be different? More importantly, rolling against a fixed number is much more powerful and flexible; for instance it allows crits on spells. Crit fireball!
-Diagonal movement works the same as lateral movement". I assume this means they moved to hexes? no? Then I guess you can move faster by moving diagonally in about ANY circumstance. Once again, way to break the world. Yes, you move faster on a diagonal, but so what? It's not like you get to choose whether or not you approach a monster diagonally; he's either on a diagonal away from you, or he's not.
-Every class has two suggested "builds". What did I say before about telling us how to play? Honestly, at least leave WHO we play up to us. Similarly, each class has a "role". Not that they are customizable or anything. Nope, it's just like "Do you want a DD or a tank?" all over again. You're kidding, right? Tell me what decisions you make in the development of, say, a monk in 3e. It's listed right in the PHB exactly at what levels your abilities improve. Every monk is the damn same. There is far more customizability now than in 3e.
What really bugs me about your post is that you didn't seem to complain about any of the real problems with 4th edition. Like getting to full hit points in 6 hours sleep. I think that's a real problem; it very much breaks attrition damage in a dungeon crawl. It's probably something our party will house-rule when we play 4e; like for instance, you only heal to full if you sleep in a town. Or the drastically culled list of wondrous items. That's a very big problem, and we will probably keep our 2e and 3e DMGs around just to use their wondrous items in 4e. Still, I am very excited about 4e, and will probably pick it up the next time we get party-wiped.
It's even worse than that. I got penalized for only answering ten questions. They suggested I answer twenty more to remove the penalty. IN 60 SECONDS!!!
The test gives you about two seconds per question. That's not even enough time for general knowledge (read: culturally dependant) questions which don't belong on an IQ test, let alone complex pattern matching. I'm sorry, but that's no kind of IQ test.
By a quick calculation from Wikipedia, there are about 1.9 trillion tons of CO2 in the atmosphere.
What exactly is the point of this endeavour?
Here's a fairly simple answer: They do cause gravity. They do pull.
:(
The reason is because in general relativity, it is not mass that attracts by gravity (i.e. that warps space-time), but rather energy. The confusion arises because, informally speaking, a small amount of mass has *A LOT* of energy. The gravitation caused by other forms of energy are pretty negligible when there's mass around, which is why it seems to us like it's only caused by mass.
Electromagnetic waves such as light do have energy however, so they gravitate; they attract other objects to themselves by slightly warping space-time. If you've got a lot of light around (like say, the light being emitted by a galaxy), then that can have a non-negligible effect on the gravitational pull of that galaxy.
Other forms of energy also gravitate. For instance, a fast-moving object has a lot of kinetic energy, so it will gravitate slightly more than if it is stationary (this can also be interpreted as the moving object having more mass, as the above poster explained). In the case of plain old space dust it's pretty negligible, but it's very much not in the case of a spinning black hole, which will greatly affect its size and pull. This makes it extremely complicated to achieve any kind of accuracy in black hole calculations.
*sigh* I miss my physics classes
That said, I agree that the engine should be LGPL to encourage closed-source developers to use it and contribute to it. Anyway the discussion is moot because Crystal Space 3D is already LGPL.
If by 'play with it' you mean play with the interface, then you can install OpenMoko on all sorts of phones and PDAs to try it out. Just yesterday I installed it on my Palm T|X. If you don't have a compatible touch-screen PDA, you can always virtualize it on your desktop using something like QEMU:
http://wiki.openmoko.org/wiki/OpenMoko_under_QEMU
If you RTFS (read the fine summary), you would find that Office IS activated. But because Visio is not activated, Microsoft is refusing to provide add-ons for Office, and instead presenting him with a page to buy Office, which he has already purchased and activated!
It will be entirely through AIGLX, which does work with the ATI open-source drivers (not fglrx) on many ATI cards. There is no way Gutsy would ship with Xgl (let alone by default).
So as far as I know, it will ship with open-source Intel and ATI and binary NVIDIA drivers by default, with Compiz activated on all cards that support it.
As far as 'classic gamers' go, I think you're in the minority.
I still, to this day, play Super Mario Bros. regularly on my original NES (even though both my remotes are falling apart). I've beaten it in under six minutes; I've beaten it without dying; I've beaten it without warp zones. Right now I'm practicing beating it without dying AND without warp zones. Like GP, the enjoyment is in the accomplishments.
This isn't to say today's games aren't fun. I enjoy games like Diablo II for the fantasy aspects. Fireballs are cool; I grin when I throw them. And I get the same type of enjoyment out of games like Bioshock as I do out of reading a good book. That's all they do; they're for your imagination, storytelling on a more interactive level. Like GP, I get no sense of accomplishment from beating them. This is why I think you're in the minority; how many "classic gamers" do you think played through Super Mario Bros. for the storyline or the content?
Few games have managed to merge these two gameplay styles. I think the Legend of Zelda series are a great example of skill-based gameplay in a storytelling environment. But often, these games aren't well received; people who want difficulty are bored, and people who want storytelling are frustrated.
Most games these days, however, will have both aspects side-by-side, with the skill-based aspect generated by a competitive multiplayer environment. Like Starcraft. Great single player, but very easy, and very little sense of accomplishment. Fantastic multiplayer, and tremendously rewarding to the ego (and wallet) in tournament play.
For a good LaTeX tutorial, I highly recommend A Beginner's Guide to LaTeX. It's a tremendous guide which is very useful both for learning LaTeX and as a reference. It's what I used to learn LaTeX, and I continued to use the guide as a reference throughout university in everything I wrote from essays to lab reports to research papers. Once you've got LaTeX and an IDE installed, hop into Chapter 2 and start reading.
Or just "killall -9 konqueror"...
I'm very glad Red Hat is standing up to Microsoft and their shit. I hope people can see through this campaign the same as they did with Get The Facts.
I see a lot of people here replying that these users don't exist. I'd like to point out that I used to be one of them. I set up a webserver on my Windows 98 box with a dyndns account using IIS when I was younger. I had no idea what Apache was at the time.
That said, I don't run a webserver anymore, and I highly doubt these people number in the millions. In fact I'm sure their numbers are entirely negligible.
Exactly. The point was not to punish Novell and MS, but to stop it from happening again. It would be very chilling for the spread of the GPLv3 if the FSF set a precedent of retroactively damaging companies who fully abide by the letter of the GPL, but do things the FSF considers to be immoral.
You say that like it's a bad thing. Nine million people would disagree.
Personally I love what they're doing with WoW. I don't play it myself, but it gives Blizzard a license to print money, which means they have an effectively limitless supply of cash to pour into other ventures.