The NeXT computer wasn't just the first web server, it was the first web browser too! WorldWideWeb was a NeXT application, and Tim Berners-Lee credited the ease of development on NeXT machines for making it possible. It also had the first graphical UI builder[1], and possibly the first web applications framework (there's some debate over whether WebObjects was the first, but it was within a month or so of being the first if it wasn't).
[1] And still about the only one to get it right. Interface Builder on NeXT (and later OS X and GNUstep) let you create objects and connect them together, not just draw interfaces. In a document-driven application, for example, you'd put all of your views and controllers and a stub model in a single IB file and then just instantiate it in a single line of code to create a new document.
The difference between Jobs and most other CEOs is that he didn't really care what the market wanted. He got his companies to produce stuff that he wanted. If other people agreed, then that was great. Sometimes they did (most Apple products, pretty much everything from Pixar), and sometimes they didn't (NeXT machines). You can trace a lot of what we take for granted in modern computing environments - and especially modern development environments - back to NeXT. The company was set up with the goal of producing the closest approximation of the perfect computer that it was possible to build with available technology. Which meant, really, building a computer that Steve Jobs wanted to use. They sold a total of around 50,000 units over the company's entire lifespan, because there was a very small market for that kind of machine at the price they could afford to sell it. Apple paid far more for NeXT than NeXT made total profits from hardware sales over its entire lifetime, but they got the operating system and sold more computers with its derivatives in a month than NeXT did in a year.
It's a similar spec to my Nokia 770 (a bit better, but close), which I got in 2005. The RRP was $359.99. Moore's Law says the price of transistors ought to halve every 18 months, so if the other components follow a similar curve I'd expect to be able to get it for a tenth of the original price five years later. It's now a bit over six years later, but presumably some of the parts were already about as cheap as they can be without a major breakthrough in mass production techniques. Actually, the most impressive thing is how bad the battery life is. It comes with a third more battery capacity than the 770 yet the battery doesn't last as long...
If it has bluetooth, I'd be pretty tempted. The 770 with a folding bluetooth keyboard is great as a little device for running vim that fits in a pocket. It's underpowered for most things, but as a machine to take to write articles with while sitting in a cafe, it's great. At $35, it's basically disposable. If it breaks, I'll only be upset if the data isn't backed up...
The problem with this idea is that it makes it very difficult for new parties. Does the rule of every candidate getting equal funding apply to anyone who puts his name forward? If so, then it's a good way of getting free advertising ('Vote for Joe, who has spent years serving the community as the proprietor of Joe's automobiles on the corner 3rd and main street...'). If you make the barrier to entry too high, then you discourage legitimate parties.
There's a fine line between finding a candidate who already has opinions that you agree with and getting a candidate to agree with opinions that you hold in exchange for campaign funding. This is why legislation is so difficult in this area. Most people would agree that the first is fine but the second is not, but it's often difficult to distinguish between the two. If a candidate has no opinion about a topic, and I donate to their campaign, are they going to support me when the time comes?
Personally, the big change that I'd like to see is requiring all political contributions to be anonymous and to go via an intermediary that makes it impossible to prove that you made the contribution. If you support a candidate, you'd be able to give money to their campaign, but you wouldn't then be able to say 'I supported you, now you owe me a favour' because someone else would be able to make exactly the same claim and neither would have the ability to back it up with evidence. You'd still be able to throw money at candidates with opinions that you supported, but it would be much harder to buy the opinions that you want.
Well, the change I'd really like to see is people voting based on an informed review of their candidate's position, rather than on what they saw in adverts, but that's not very likely...
He may be a shill, but he's not wrong. Microsoft isn't the only company whose products get this treatment on eBay. Search for Adobe products, for example. A huge amount of pirated big name software is sold on eBay. If you're going to pirate it, just grab the torrent, don't make some criminal richer in the process...
I've written four books now, and I used LaTeX for all of them. For semantic markup, clean output, and getting out of my way and letting me think about the content, I've not found anything better. Inserting a code listing, for example, into OpenOffice is painful. In LaTeX it's a single command to import a set of lines from the file, syntax highlight it, and insert it as a floating section with a cross reference and an entry in the table of contents.
It's okay, you never actually need to refer to it by name, just use the abbreviation. LO.o, pronounced loo, is less of a mouthful. As in 'I'm going to open your document in the loo'.
It depends on the screen. I've only used the ribbon on a friend's laptop, and it wasted far too much of the screen real estate. On a desktop or a large external screen, it provides bigger targets than the menu bar (and is a little bit more discoverable), so it is probably a net win. On a laptop, to get any work done you end up hiding the ribbon, so you then need more mouse movement to unhide, select, and then hide it again than you would to go to the menu.
More to the point, creating a fair benchmark is really hard. Microbenchmarks are really misleading. For example, C++ does really well on some because templates turn into inlined functions. This doesn't scale though, because lots of inlined functions also mean that your code is bigger and so you start getting instruction cache misses, which cripple performance. You can write a small library using templates and again using virtual functions, and the version using templates will be much faster in microbenchmarks, but the one using dynamic dispatch and real function calls may be a lot faster in a big program (but slower in a small program).
When you're writing a small benchmark, do you write the idiomatic code, or the fastest possible implementation? Optimising at one level can often make it impossible to optimise at others. In early versions of Java, using final on class and methods made things faster because it allowed the VM to skip a lot of the dynamic lookup (you're never going to be calling a subclass method). Adding final, however, meant that you couldn't add a subclass that was optimised for your specific use. For example, String is final in Java, so you can't create a string that lazily fetches characters from a remote location. The same happens in C++. The implementation of std::string is inflexible, so most C++ toolkits create their own string class, but these are all incompatible, so you end up copying strings when you pass across a library boundary. This optimisation at the low level makes it hard to do high-level optimisations. STL is riddled with this kind of thing.
Azureus on OS X had the distinction of being the first app I've seen with a CPU leak. If you started it up, it would gradually climb (over about a period of 2 hours) to using 100% of the CPU. Even if you didn't start any torrents or touch the UI. If that's what Java developers think 'not slow and bloated' means, then I'm glad I don't have a JVM installed anymore...
I'm no fan of Python, but that's a strange definition. You can embed the entire Python interpreter (which is shockingly bad code - anything that generates valgrind errors before you even get to main() should not be allowed anywhere near a CPU) in an executable, along with the code. You can compile it to Java or.NET bytecode, making it as stand-alone as any application that requires a VM. You could probably compile it to native code - Unladen Swallow did this with a JIT, but there's no reason why you can't use the same code paths to statically compile. I've written a Smalltalk implementation that has a static compiler, and Python is no more dynamic.
Most of the time you don't create a stand-alone C/C++ application either. It's very rare to statically link to the C standard library or the STL implementation (on some platforms, statically linking to libc isn't even supported to make it easier to change kernel interfaces), and unless you're writing an embedded application you're adding late-bound dependencies on the kernel.
Re:haskell for the masses? sure, but only...
on
OCaml For the Masses
·
· Score: 1
F#, like Scala, doesn't really give you any benefit from being a bit functional. It gives you higher-order functions, but object oriented languages have had these right from the start (both Simula and Smalltalk had them). The strength of functional programming comes from freedom from side effects (allowing the compiler to do some nice optimisations - especially related to parallelism - and making it easier to reason about the code), but F# lacks this, and just gives you an imperative language where you have to jump through hoops to do things that are easy in an imperative language without giving you the benefit of true functional programming.
If I were creating a functional language to fit into an OO world, I'd use monads for interacting with the OO world, so you could run a computation in the functional world, collect a sequence of message send operations and then apply them to the OO world (or reject them, depending on the outcome).
You raise another important point that I forgot to mention. The levels that Id ships are huge. A level designer making a new deathmatch level is likely to want something a lot smaller. This reduces the computational cost a lot. You don't want massively complex levels for deathmatch, because you want the players to be able to find each other...
The texture size issue is also not really a problem. Huge textures are great for tech demos, but I bet most gamers won't really care if a the textures are lower quality in a new level. My favourite QTank level just used a glowing red grid as the wall texture for the entire level - something that even my poor artistic skill would have been able to draw.
Nonsense. A recipe has sequential ordering and the steps have side effects. When you're cooking a cake, you have a sequence of steps in a specific order. There are lots of side effects in any recipe - if there weren't then what would you eat at the end?
I don't think "do this to the first item in the list, then do it to the second, then...", I think "do this to every item in the list".
Uh, both of those are imperative operations. In a functional programming language the equivalent natural language statement would be 'a list can be created by the application of this transform to this list', which is a much less human-friendly way of thinking.
Note to Scala and Python programmers: just because your language has map operations does not make it a functional programming language. Smalltalk had map and fold operations on collections that used closures in 1976 and no one would pretend that it was a functional language...
Take a look at any functional programming language implementation for the last 30 years. The same is true. Something Scala and Ruby have in common: they both claim decades old ideas are new and exciting.
Re:haskell for the masses? sure, but only...
on
OCaml For the Masses
·
· Score: 1
The problem with F# is that it isn't really a functional language, it's an imperative language with a load of irritating constraints.
Re:haskell for the masses? sure, but only...
on
OCaml For the Masses
·
· Score: 1
Haskell has monads for I/O, which are very elegant. They also give you things like software transactional memory (which is great for concurrent code) in a way that's both easy to implement and easy to reason about.
Understanding code, no, but understanding imperative programming? Absolutely. Children are given sequences of instructions to follow from a very early age. If you can understand a recipe, you can understand imperative programming. Functional programming requires a much more detailed understanding of mathematics.
The first internet-age era step was (at least in physics publishing) 20 years ago: the LANL Preprint Archive, later known as xxx.lanl.gov, now www.arxiv.org
This was one of two famous sites largely implemented by a single person. The other one is the Internet Movie Database. The person responsible for both is now a sheep farmer and has no Internet connection...
The NeXT computer wasn't just the first web server, it was the first web browser too! WorldWideWeb was a NeXT application, and Tim Berners-Lee credited the ease of development on NeXT machines for making it possible. It also had the first graphical UI builder[1], and possibly the first web applications framework (there's some debate over whether WebObjects was the first, but it was within a month or so of being the first if it wasn't).
[1] And still about the only one to get it right. Interface Builder on NeXT (and later OS X and GNUstep) let you create objects and connect them together, not just draw interfaces. In a document-driven application, for example, you'd put all of your views and controllers and a stub model in a single IB file and then just instantiate it in a single line of code to create a new document.
The difference between Jobs and most other CEOs is that he didn't really care what the market wanted. He got his companies to produce stuff that he wanted. If other people agreed, then that was great. Sometimes they did (most Apple products, pretty much everything from Pixar), and sometimes they didn't (NeXT machines). You can trace a lot of what we take for granted in modern computing environments - and especially modern development environments - back to NeXT. The company was set up with the goal of producing the closest approximation of the perfect computer that it was possible to build with available technology. Which meant, really, building a computer that Steve Jobs wanted to use. They sold a total of around 50,000 units over the company's entire lifespan, because there was a very small market for that kind of machine at the price they could afford to sell it. Apple paid far more for NeXT than NeXT made total profits from hardware sales over its entire lifetime, but they got the operating system and sold more computers with its derivatives in a month than NeXT did in a year.
It's a similar spec to my Nokia 770 (a bit better, but close), which I got in 2005. The RRP was $359.99. Moore's Law says the price of transistors ought to halve every 18 months, so if the other components follow a similar curve I'd expect to be able to get it for a tenth of the original price five years later. It's now a bit over six years later, but presumably some of the parts were already about as cheap as they can be without a major breakthrough in mass production techniques. Actually, the most impressive thing is how bad the battery life is. It comes with a third more battery capacity than the 770 yet the battery doesn't last as long...
If it has bluetooth, I'd be pretty tempted. The 770 with a folding bluetooth keyboard is great as a little device for running vim that fits in a pocket. It's underpowered for most things, but as a machine to take to write articles with while sitting in a cafe, it's great. At $35, it's basically disposable. If it breaks, I'll only be upset if the data isn't backed up...
Well, I assumed it was a reference to Nethack, and I'm slightly sad that it was WoW...
The problem with this idea is that it makes it very difficult for new parties. Does the rule of every candidate getting equal funding apply to anyone who puts his name forward? If so, then it's a good way of getting free advertising ('Vote for Joe, who has spent years serving the community as the proprietor of Joe's automobiles on the corner 3rd and main street...'). If you make the barrier to entry too high, then you discourage legitimate parties.
The top 10 doesn't mean much. Try the top 1%.
There's a fine line between finding a candidate who already has opinions that you agree with and getting a candidate to agree with opinions that you hold in exchange for campaign funding. This is why legislation is so difficult in this area. Most people would agree that the first is fine but the second is not, but it's often difficult to distinguish between the two. If a candidate has no opinion about a topic, and I donate to their campaign, are they going to support me when the time comes?
Personally, the big change that I'd like to see is requiring all political contributions to be anonymous and to go via an intermediary that makes it impossible to prove that you made the contribution. If you support a candidate, you'd be able to give money to their campaign, but you wouldn't then be able to say 'I supported you, now you owe me a favour' because someone else would be able to make exactly the same claim and neither would have the ability to back it up with evidence. You'd still be able to throw money at candidates with opinions that you supported, but it would be much harder to buy the opinions that you want.
Well, the change I'd really like to see is people voting based on an informed review of their candidate's position, rather than on what they saw in adverts, but that's not very likely...
He may be a shill, but he's not wrong. Microsoft isn't the only company whose products get this treatment on eBay. Search for Adobe products, for example. A huge amount of pirated big name software is sold on eBay. If you're going to pirate it, just grab the torrent, don't make some criminal richer in the process...
I've written four books now, and I used LaTeX for all of them. For semantic markup, clean output, and getting out of my way and letting me think about the content, I've not found anything better. Inserting a code listing, for example, into OpenOffice is painful. In LaTeX it's a single command to import a set of lines from the file, syntax highlight it, and insert it as a floating section with a cross reference and an entry in the table of contents.
It's okay, you never actually need to refer to it by name, just use the abbreviation. LO.o, pronounced loo, is less of a mouthful. As in 'I'm going to open your document in the loo'.
It depends on the screen. I've only used the ribbon on a friend's laptop, and it wasted far too much of the screen real estate. On a desktop or a large external screen, it provides bigger targets than the menu bar (and is a little bit more discoverable), so it is probably a net win. On a laptop, to get any work done you end up hiding the ribbon, so you then need more mouse movement to unhide, select, and then hide it again than you would to go to the menu.
More to the point, creating a fair benchmark is really hard. Microbenchmarks are really misleading. For example, C++ does really well on some because templates turn into inlined functions. This doesn't scale though, because lots of inlined functions also mean that your code is bigger and so you start getting instruction cache misses, which cripple performance. You can write a small library using templates and again using virtual functions, and the version using templates will be much faster in microbenchmarks, but the one using dynamic dispatch and real function calls may be a lot faster in a big program (but slower in a small program).
When you're writing a small benchmark, do you write the idiomatic code, or the fastest possible implementation? Optimising at one level can often make it impossible to optimise at others. In early versions of Java, using final on class and methods made things faster because it allowed the VM to skip a lot of the dynamic lookup (you're never going to be calling a subclass method). Adding final, however, meant that you couldn't add a subclass that was optimised for your specific use. For example, String is final in Java, so you can't create a string that lazily fetches characters from a remote location. The same happens in C++. The implementation of std::string is inflexible, so most C++ toolkits create their own string class, but these are all incompatible, so you end up copying strings when you pass across a library boundary. This optimisation at the low level makes it hard to do high-level optimisations. STL is riddled with this kind of thing.
Azureus on OS X had the distinction of being the first app I've seen with a CPU leak. If you started it up, it would gradually climb (over about a period of 2 hours) to using 100% of the CPU. Even if you didn't start any torrents or touch the UI. If that's what Java developers think 'not slow and bloated' means, then I'm glad I don't have a JVM installed anymore...
I'm no fan of Python, but that's a strange definition. You can embed the entire Python interpreter (which is shockingly bad code - anything that generates valgrind errors before you even get to main() should not be allowed anywhere near a CPU) in an executable, along with the code. You can compile it to Java or .NET bytecode, making it as stand-alone as any application that requires a VM. You could probably compile it to native code - Unladen Swallow did this with a JIT, but there's no reason why you can't use the same code paths to statically compile. I've written a Smalltalk implementation that has a static compiler, and Python is no more dynamic.
Most of the time you don't create a stand-alone C/C++ application either. It's very rare to statically link to the C standard library or the STL implementation (on some platforms, statically linking to libc isn't even supported to make it easier to change kernel interfaces), and unless you're writing an embedded application you're adding late-bound dependencies on the kernel.
F#, like Scala, doesn't really give you any benefit from being a bit functional. It gives you higher-order functions, but object oriented languages have had these right from the start (both Simula and Smalltalk had them). The strength of functional programming comes from freedom from side effects (allowing the compiler to do some nice optimisations - especially related to parallelism - and making it easier to reason about the code), but F# lacks this, and just gives you an imperative language where you have to jump through hoops to do things that are easy in an imperative language without giving you the benefit of true functional programming.
If I were creating a functional language to fit into an OO world, I'd use monads for interacting with the OO world, so you could run a computation in the functional world, collect a sequence of message send operations and then apply them to the OO world (or reject them, depending on the outcome).
You raise another important point that I forgot to mention. The levels that Id ships are huge. A level designer making a new deathmatch level is likely to want something a lot smaller. This reduces the computational cost a lot. You don't want massively complex levels for deathmatch, because you want the players to be able to find each other...
The texture size issue is also not really a problem. Huge textures are great for tech demos, but I bet most gamers won't really care if a the textures are lower quality in a new level. My favourite QTank level just used a glowing red grid as the wall texture for the entire level - something that even my poor artistic skill would have been able to draw.
Nonsense. A recipe has sequential ordering and the steps have side effects. When you're cooking a cake, you have a sequence of steps in a specific order. There are lots of side effects in any recipe - if there weren't then what would you eat at the end?
I don't think "do this to the first item in the list, then do it to the second, then...", I think "do this to every item in the list".
Uh, both of those are imperative operations. In a functional programming language the equivalent natural language statement would be 'a list can be created by the application of this transform to this list', which is a much less human-friendly way of thinking.
Note to Scala and Python programmers: just because your language has map operations does not make it a functional programming language. Smalltalk had map and fold operations on collections that used closures in 1976 and no one would pretend that it was a functional language...
Take a look at any functional programming language implementation for the last 30 years. The same is true. Something Scala and Ruby have in common: they both claim decades old ideas are new and exciting.
The problem with F# is that it isn't really a functional language, it's an imperative language with a load of irritating constraints.
Haskell has monads for I/O, which are very elegant. They also give you things like software transactional memory (which is great for concurrent code) in a way that's both easy to implement and easy to reason about.
Look up Rob Hartill. Also, look up the definition of FUD before you use it again.
LLVM supports the GHC calling conventions now, so it's also relatively easy to call into Haskell from other languages.
Understanding code, no, but understanding imperative programming? Absolutely. Children are given sequences of instructions to follow from a very early age. If you can understand a recipe, you can understand imperative programming. Functional programming requires a much more detailed understanding of mathematics.
The first internet-age era step was (at least in physics publishing) 20 years ago: the LANL Preprint Archive, later known as xxx.lanl.gov, now www.arxiv.org
This was one of two famous sites largely implemented by a single person. The other one is the Internet Movie Database. The person responsible for both is now a sheep farmer and has no Internet connection...