Kerry's nuanced position was that the war in Iraq was necessary, but that he would have been more reluctant and done it better. Yeah, right, that's really compelling...
I left the business for a lot more than 1-2 years so that I could raise my daughter.
once my daughter was in preschool, i got pretty serious about writing pro-audio software for linux, and giving it away. [...]
And yeah, ok, so I made a million or two from being the #2 hire at amazon.com, but that has little do to with the story:)
On the contrary, it has everything to do with the story. If I had a couple of million I'd retire, create free software and other work, and give it away, and maybe I'd then get big offers from people like Google and Microsoft too. But since I don't have the millions, I have to work a regular job, and that doesn't leave much time and brain power left to write major applications and give them away.
Similarly, it was the millions that gave you the luxury of quitting work to raise your daughter. Very few people have that amount of luck or privilege. For them, balancing work and child rearing is a major issue, and giving stuff away to get people interested in hiring them for lots of cash is a chicken-and-egg problem.
Computer Science is a highly specialized and limited subset of mathematics, mostly involving things like set theory, boolean algebra, lambda calculus and the occasional bit of vector and matrix math and basic geometry.
It's quite possible to be good at the bits of math that are actually relevant to computer science, and be completely hopeless at the rest of it.
For instance, I always had trouble with integrals. I was struggling to deal with physics, because I couldn't comprehend path integrals, and couldn't follow the mathematics for things like quantum theory and fluid dynamics. I could cope with special relativity, but general relativity was about to kick my ass. So I switched to Computer Science. Never saw another big hairy integral.
I'd say the only bit of CS math I couldn't cope with was in the denotational semantics course. Which was just fine, as nobody actually uses that crap in the real world anyway. FFTs are tricky too, but as long as you know what they are and what you use them for, you're highly unlikely to need to derive the algorithm yourself.
They support their audio player with their music store. That's it. Plenty of other companies do similar things, and it hardly constitutes "locking out".
There's nothing stopping Real from producing Rhapsody for Mac, with synchronization to iRiver and Creative MP3 players. There's nothing stopping Sony from making a Mac version of their software so you can put ATRAC3 files on your Sony player. There's nothing stopping anyone from having an MP3 player that syncs from the iTunes library; the information is made available as XML, even.
Whether it was the TSA inspector or a baggage handler isn't the point. The TSA requires that all checked luggage be able to be opened, and they are responsible for overseeing baggage handling security. The fact that they are failing to do their job means that security for passengers is now worse than it was before, because objects can now be introduced into your luggage. This could be a major problem if you were traveling to Malaysia and someone wanted to try and use you to smuggle drugs. It would be bad enough to wind up in a US jail for a decade for a crime you didn't commit. And as I say, this is likely how the bomb was put on the 747 that exploded over Lockerbie.
Personally, I think the 6502 would make a great CPU for embedded systems. It's really easy to program (small instruction set), memory-mapped IO makes that nice and easy too, and its performance was good compared to chips of its generation (e.g. Z80).
I'd like a good source of cheap single-chip 6502 programmable microcontrollers, in fact...
As a side note, I also got my luggage raided by the TSA without them leaving any notification. In my case, the baggage handler stole my iPod charger and digital camera battery charger.
I wrote to the TSA explaining that I have a major issue with their apparent lack of security. After all, the Lockerbie bombing was most likely carried out by someone introducing a bomb into luggage while it was being processed by the airport. As I said to the TSA, if it's possible for someone to open my luggage and steal stuff while the airline is transporting it, it's just as possible for someone to open my luggage and plant drugs (say) to try and use me as a mule to get stuff through customs.
Predictably, I got a form letter back from the TSA saying they were sorry their procedures did not always reach the standard expected.
Yup, it's Kerry all over again. Panders to the right wing who wouldn't vote for him anyway by being pro-war-in-Iraq, alienating everyone who might have voted for him.
OK, so if you can read a class name from a config file and call that class, why is all that other stuff in the article necessary? I guess I'm still not getting the point of it all.
I see people have already given you the "because people accept it" economic answer. However, there is some logic to server CALs. It goes as follows:
The value you get from software is proportional to the number of your people using it.
In the case of software that runs on the client machine, if you have N users you are generally expected to pay for N licenses, so that the amount you pay is proportional to the value you get.
If I have a server-based web content management system, and have 10 people using it, I'm getting twice as much value from it as if I only had 5 people using it--just like if it was a client-based web editing system. Basically, whether the software resides on the server or the client is a mere technical detail that doesn't really affect the value obtained, and so shouldn't affect the pricing too much.
So CALs are a way to make server software pricing more like client software pricing--i.e. proportional to value obtained.
The bit you should be asking about isn't the CAL; it's the initial server software price. The logical reason for an initial per-server fee is to cover the expected distribution and support costs when you purchase the software and try to set up the server. Unfortunately, that lump sum basically makes it disproportionately expensive to set up a server for a small number of users. That's why there has been a trend towards offering cut-down SMB versions of server software with a lower up-front cost.
Per-CPU and per-MHz licensing is an attempt to shift the expense towards those who can apparently best afford it. Or to look at it from the other side, it's another way to try and make things relatively cheaper for entry-level/low end customers. Like income tax, in other words.
One thing you didn't bring up is the difference between workstation CALs and (concurrent) user CALs. Personally, I think workstation CALs are a bit of a rip-off, and licensing should always be based on users, whether the software is server-based or client-based. If I use 5 computers in various locations, I'm not getting 5x the value of a server-based CMS--there's only one of me, and the fact that I use 5 machines instead of carrying 1 laptop everywhere should (again) be a mere detail that doesn't affect the value obtained, and so shouldn't affect the price.
What I don't get is why people who are embarrassed about having a planet that sounds like "your anus" feel it's much better to have it sound like "urineous", 'of or resembling urine'.
I guess it's all about varying the pronounciation to get the right balance of urine and anus.
The idea of Inversion of Control is that the thing that needs a service should NEVER configure that service.
In that case, the article cited was incredibly badly written. What's more, I fail to see how the example given in Java achieves the supposed goal. How does that Spring XML file get written, if not by whoever is using the service code?
It would be trivial to make the choice of CSV::Reader depend on an external config file if you want:
chosenclass = File.open("config.txt").gets.chop finder = chosenclass.parse("movies.csv")
The example *is* reusable. Those lines you pick out aren't part of the class library, they're an example of how you can call it with whatever class you like (even one chosen from a config file), without needing any kind of complicated scaffolding like in Java. I just put them in to demonstrate that the code actually works.
The point is with a dynamic language you avoid all the gyrations required to get around the rigid type system.
Take the example given. He defines an API for communications between the application and something that looks up movies for a given director, which he calls the finder.
In Java, he needs to instantiate a particular concrete class to provide the finder service. Because of Java's insistence on compile-time type safety, this presents a problem. He wants to be able to plug in a ColonDelimitedMovieFinder class as his finder initially, but still allow someone else to plug in a SQLMovieFinder or whatever without modifying the MovieLister class. So, he has to build a special bit of code to inject a chosen implementation--his PicoContainer with its registerComponentImplementation thing.
In Ruby, you can instantiate any object you like as the finder, because all that matters is that it understands the API messages when it gets them at run time. All you need to do is have a setter method in the original MovieLister object that accepts an object to use as the finder; and you can define that in 1 line of code. Then the MovieLister just uses the object it was passed as the finder. The user of the MovieLister library can then plug in any implementation he likes; he can even change implementation while the application is running. No injectors, no containers, no fancy component libraries needed.
In fact, here is a complete implementation in Ruby, with an example of calling it. (Indentation stripped courtesy of Slashdot, so run it through vim or something.) Note how I simply use a CSV parser object as my Finder, because MovieLister just needs the finder to have the standard Enumerable interface for returning each movie and director in the list.
require 'csv'
class MovieLister attr_writer:finder
def movies_directed_by(director) if not @finder raise "Finder not set before calling movies_directed_by" else result = @finder.collect {|dirname,movname| movname if dirname == director } result.delete(nil) return result end end end
finder = CSV::Reader.parse(File.open('movies.csv')) lister = MovieLister.new lister.finder = finder puts lister.movies_directed_by('Stanley Kubrick')
Again, no special libraries or frameworks were required. Only CSV, and that's in the standard library.
UNIX (TM) as in System V may be increasingly irrelevant, but Unix lives on as OS X, BSD, Linux, and so on. You may not personally run Unix on your desktop, but many do, and it also runs most of the Internet, as well as many corporations. There's a big world outside your AOL client.
Actually, DVD on a high resolution screen can look pretty damn stunning. The limiting factor is the quality of the source material and the bit rate used on the disc. Apple's DVD player is very simple-minded; you should try a player with (say) a Faroudja DCDi chipset that interpolates up to 720p or 1080p. Suddenly you can see film grain, fingerprints on glasses, that kind of thing.
I've got an even better idea. Ditch C# and C++, use Objective-C, and put our efforts into GNUStep. That way we can make it easy to port Mac OS X applications to Linux, and vice versa. Objective-C is much easier to learn than C++, and gives dynamic programming capabilities without all the pain of Java or C++.
Yeah. I just finished playing BG&E, in fact... must go list it on eBay.
The main issue is that it never quite managed to feel like a complete world, and some of the recycling of 3D models was a bit too obvious; you really can't get away with putting the exact same supposedly natural cave formation in two places.
If only they had been given time to finish it. Then again, Ubisoft probably looked at the sales they did get, and saw that as vindication for pulling the plug.
I did like how the story just blew up into epic scale for the grand climactic battle, though, and the way the final fight still managed to throw in some complete surprises in terms of fight mechanics.
Kerry's nuanced position was that the war in Iraq was necessary, but that he would have been more reluctant and done it better. Yeah, right, that's really compelling...
On the contrary, it has everything to do with the story. If I had a couple of million I'd retire, create free software and other work, and give it away, and maybe I'd then get big offers from people like Google and Microsoft too. But since I don't have the millions, I have to work a regular job, and that doesn't leave much time and brain power left to write major applications and give them away.
Similarly, it was the millions that gave you the luxury of quitting work to raise your daughter. Very few people have that amount of luck or privilege. For them, balancing work and child rearing is a major issue, and giving stuff away to get people interested in hiring them for lots of cash is a chicken-and-egg problem.
Computer Science is a highly specialized and limited subset of mathematics, mostly involving things like set theory, boolean algebra, lambda calculus and the occasional bit of vector and matrix math and basic geometry.
It's quite possible to be good at the bits of math that are actually relevant to computer science, and be completely hopeless at the rest of it.
For instance, I always had trouble with integrals. I was struggling to deal with physics, because I couldn't comprehend path integrals, and couldn't follow the mathematics for things like quantum theory and fluid dynamics. I could cope with special relativity, but general relativity was about to kick my ass. So I switched to Computer Science. Never saw another big hairy integral.
I'd say the only bit of CS math I couldn't cope with was in the denotational semantics course. Which was just fine, as nobody actually uses that crap in the real world anyway. FFTs are tricky too, but as long as you know what they are and what you use them for, you're highly unlikely to need to derive the algorithm yourself.
Apple don't lock out any DAPs.
They support their audio player with their music store. That's it. Plenty of other companies do similar things, and it hardly constitutes "locking out".
There's nothing stopping Real from producing Rhapsody for Mac, with synchronization to iRiver and Creative MP3 players. There's nothing stopping Sony from making a Mac version of their software so you can put ATRAC3 files on your Sony player. There's nothing stopping anyone from having an MP3 player that syncs from the iTunes library; the information is made available as XML, even.
Whether it was the TSA inspector or a baggage handler isn't the point. The TSA requires that all checked luggage be able to be opened, and they are responsible for overseeing baggage handling security. The fact that they are failing to do their job means that security for passengers is now worse than it was before, because objects can now be introduced into your luggage. This could be a major problem if you were traveling to Malaysia and someone wanted to try and use you to smuggle drugs. It would be bad enough to wind up in a US jail for a decade for a crime you didn't commit. And as I say, this is likely how the bomb was put on the 747 that exploded over Lockerbie.
Like other programming languages, assembler is a matter of taste. Personally I hated Z80, but loved 6502. (Also hated 8086 and loved 68000.)
Personally, I think the 6502 would make a great CPU for embedded systems. It's really easy to program (small instruction set), memory-mapped IO makes that nice and easy too, and its performance was good compared to chips of its generation (e.g. Z80).
I'd like a good source of cheap single-chip 6502 programmable microcontrollers, in fact...
As a side note, I also got my luggage raided by the TSA without them leaving any notification. In my case, the baggage handler stole my iPod charger and digital camera battery charger.
I wrote to the TSA explaining that I have a major issue with their apparent lack of security. After all, the Lockerbie bombing was most likely carried out by someone introducing a bomb into luggage while it was being processed by the airport. As I said to the TSA, if it's possible for someone to open my luggage and steal stuff while the airline is transporting it, it's just as possible for someone to open my luggage and plant drugs (say) to try and use me as a mule to get stuff through customs.
Predictably, I got a form letter back from the TSA saying they were sorry their procedures did not always reach the standard expected.
Yup, it's Kerry all over again. Panders to the right wing who wouldn't vote for him anyway by being pro-war-in-Iraq, alienating everyone who might have voted for him.
See also Gore/Lieberman.
OK, so if you can read a class name from a config file and call that class, why is all that other stuff in the article necessary? I guess I'm still not getting the point of it all.
I see people have already given you the "because people accept it" economic answer. However, there is some logic to server CALs. It goes as follows:
The value you get from software is proportional to the number of your people using it.
In the case of software that runs on the client machine, if you have N users you are generally expected to pay for N licenses, so that the amount you pay is proportional to the value you get.
If I have a server-based web content management system, and have 10 people using it, I'm getting twice as much value from it as if I only had 5 people using it--just like if it was a client-based web editing system. Basically, whether the software resides on the server or the client is a mere technical detail that doesn't really affect the value obtained, and so shouldn't affect the pricing too much.
So CALs are a way to make server software pricing more like client software pricing--i.e. proportional to value obtained.
The bit you should be asking about isn't the CAL; it's the initial server software price. The logical reason for an initial per-server fee is to cover the expected distribution and support costs when you purchase the software and try to set up the server. Unfortunately, that lump sum basically makes it disproportionately expensive to set up a server for a small number of users. That's why there has been a trend towards offering cut-down SMB versions of server software with a lower up-front cost.
Per-CPU and per-MHz licensing is an attempt to shift the expense towards those who can apparently best afford it. Or to look at it from the other side, it's another way to try and make things relatively cheaper for entry-level/low end customers. Like income tax, in other words.
One thing you didn't bring up is the difference between workstation CALs and (concurrent) user CALs. Personally, I think workstation CALs are a bit of a rip-off, and licensing should always be based on users, whether the software is server-based or client-based. If I use 5 computers in various locations, I'm not getting 5x the value of a server-based CMS--there's only one of me, and the fact that I use 5 machines instead of carrying 1 laptop everywhere should (again) be a mere detail that doesn't affect the value obtained, and so shouldn't affect the price.
Disclaimer: Opinions mine, not IBMs.
What I don't get is why people who are embarrassed about having a planet that sounds like "your anus" feel it's much better to have it sound like "urineous", 'of or resembling urine'.
I guess it's all about varying the pronounciation to get the right balance of urine and anus.
In that case, the article cited was incredibly badly written. What's more, I fail to see how the example given in Java achieves the supposed goal. How does that Spring XML file get written, if not by whoever is using the service code?
It would be trivial to make the choice of CSV::Reader depend on an external config file if you want:
chosenclass = File.open("config.txt").gets.chop
finder = chosenclass.parse("movies.csv")
The example *is* reusable. Those lines you pick out aren't part of the class library, they're an example of how you can call it with whatever class you like (even one chosen from a config file), without needing any kind of complicated scaffolding like in Java. I just put them in to demonstrate that the code actually works.
The point is with a dynamic language you avoid all the gyrations required to get around the rigid type system.
Take the example given. He defines an API for communications between the application and something that looks up movies for a given director, which he calls the finder.
In Java, he needs to instantiate a particular concrete class to provide the finder service. Because of Java's insistence on compile-time type safety, this presents a problem. He wants to be able to plug in a ColonDelimitedMovieFinder class as his finder initially, but still allow someone else to plug in a SQLMovieFinder or whatever without modifying the MovieLister class. So, he has to build a special bit of code to inject a chosen implementation--his PicoContainer with its registerComponentImplementation thing.
In Ruby, you can instantiate any object you like as the finder, because all that matters is that it understands the API messages when it gets them at run time. All you need to do is have a setter method in the original MovieLister object that accepts an object to use as the finder; and you can define that in 1 line of code. Then the MovieLister just uses the object it was passed as the finder. The user of the MovieLister library can then plug in any implementation he likes; he can even change implementation while the application is running. No injectors, no containers, no fancy component libraries needed.
In fact, here is a complete implementation in Ruby, with an example of calling it. (Indentation stripped courtesy of Slashdot, so run it through vim or something.) Note how I simply use a CSV parser object as my Finder, because MovieLister just needs the finder to have the standard Enumerable interface for returning each movie and director in the list.
Again, no special libraries or frameworks were required. Only CSV, and that's in the standard library.
And if you're one of the many people with "click to play" enabled for Flash, you get all the text hidden behind rectangles with play buttons on.
Oh yeah, real usable.
To summarize Fowler's summary:
It's a complicated way of getting around some problems caused by Java; problems which don't occur in dynamic languages such as Ruby.
UNIX (TM) as in System V may be increasingly irrelevant, but Unix lives on as OS X, BSD, Linux, and so on. You may not personally run Unix on your desktop, but many do, and it also runs most of the Internet, as well as many corporations. There's a big world outside your AOL client.
Alex Proyas lost all shame long ago. He made "I, Robot" with Will Smith, remember?
Actually, DVD on a high resolution screen can look pretty damn stunning. The limiting factor is the quality of the source material and the bit rate used on the disc. Apple's DVD player is very simple-minded; you should try a player with (say) a Faroudja DCDi chipset that interpolates up to 720p or 1080p. Suddenly you can see film grain, fingerprints on glasses, that kind of thing.
I've got an even better idea. Ditch C# and C++, use Objective-C, and put our efforts into GNUStep. That way we can make it easy to port Mac OS X applications to Linux, and vice versa. Objective-C is much easier to learn than C++, and gives dynamic programming capabilities without all the pain of Java or C++.
Yeah. I just finished playing BG&E, in fact... must go list it on eBay.
The main issue is that it never quite managed to feel like a complete world, and some of the recycling of 3D models was a bit too obvious; you really can't get away with putting the exact same supposedly natural cave formation in two places.
If only they had been given time to finish it. Then again, Ubisoft probably looked at the sales they did get, and saw that as vindication for pulling the plug.
I did like how the story just blew up into epic scale for the grand climactic battle, though, and the way the final fight still managed to throw in some complete surprises in terms of fight mechanics.
jEdit or vim. Both have good support for even obscure programming languages like REBOL.
(I used to use Emacs, but switched to vim.)
I'm not talking about FSF or the GNU project, I'm talking about RMS.
Stuff is larger in South America. Look at the Giant Otter of the Amazon, for example. It's not surprising their millimeters are larger too.