I used to think the same way: static typing catches bugs. However, in the past few years, most of the projects I've worked on (largish server side Java systems, primarily) have used some form of dynamic typing anyway. This is usually accomplished by using java.lang.Objects in interfaces or passing around name/value pairs as HashMaps. In some cases, it has been a programmer taking shortcuts, in others, it's been a deliberate design decision.
What's notable though, is how few bugs it has caused. And the bugs that did occur usually were trivial to find and fix.
I've also been investigating some dynamic language frameworks (Ruby on Rails, Django), and although the scope of the projects has been small, I haven't seen a huge cost due to the use of dynamic typing. Although more type-related bugs occur, as above, they are easy to catch and fix.
From an academic perspective, the guarantees of type correctness sound nice, but in my experience, they don't provide much practical benefit. Systems like pike with dynamic typing with optional constraints has the best balance, IMHO.
Python's strengths, AFAICT, are its pure object-oriented design
Python is not a pure OO language. Yes, OO is built into the language in a clean and intuitive way (unlike IMHO perl), but it is possible to ignore it. Python also brings together the best features of functional programming languages (e.g. list comprehension), lisp-like languages (e.g. lambda expressions) and smalltalk (e.g. closures).
I would rephrase that "Python's strengths, AFAICT, are it's multi-paradigm design"
Re:I love Python, but...
on
Guido Goes Google
·
· Score: 2, Interesting
I agree the class libraries are a bit hodge-podge, but the documentation tools seem to be on par with Java/.NET. A bit less structured, but then python is a less structured language, too. Plus with pydoc, I can browse the docs with a browser (a la javadoc, but dynamically generated) or from the commandline.
In my opinion, the more fancy stuff people have used javadoc tags for (object relational mapping, test cases and contraints, etc.) should be done with annotations anyway, and annotations are supported by the most recent versions of both python and java.
emacs: Wickedly powerful text editor/operating environment.
Emacs shell-mode is a hugely powerful part of emacs. All you shell command output ends up in regular emacs buffer that you can nagivate and cut/paste using the regular emacs commands. This is especially useful for interactive sessions (e.g. mysql, python) since cutting and pasting commands and their results is so easy. It also saves mousing between editor and shell windows.
One tool I've been using a lot of lately is valgrind. Valgrind is a debugging tool that runs an unmodified binary in a special environment to detect memory related problems.
It's great at detecting memory leaks and odd memory management related crashes. In particular, it's invaluable for threading related memory errors. It can be a bit overwhelming though, especially if you use a lot of libraries that are sloppy with their memory.
One limitation: it's pretty platform specific. Originally, it was pretty tightly coupled to the x86 architecture, though I think there's a PPC port in the works.
Where do you spend it? For most IT organizations it will be:
- payroll: Obviously, shrinking the staff will help here, but also consider reducing overtime. Reducing the workload, hiring an intern for user support, streamlining operations all can help.
- software licencing: Migrate away from expensive software, consolidate servers.
- hardware purchases: Extend the lifetime of hardware, push back on upgrades, negotiate better prices with suppliers.
Prime numbers are used in public key encryption. This type of encryption relies on having a function that is easy to generate, but very difficult to reverse. Factorization of large numbers is exactly the function that is used in practice: the prime factors of a large number can easily be multiplied together to get an even larger number, but getting those prime factors back from the giant number is hard. In fact, as the giant number size increases linearly, the time to calculate the factors increases exponentially (using the best known algorithms).
Look again. It is faster in the Linpack 500x500 test. That shows there is potential, at least, but obviously there's work to be done.
Besides, there isn't much reason why a JIT should be slower than a natively compiled binary, besides startup time. The code still gets compiled, just at runtime. In fact, since profiling feedback is close at hand, it has an advantage (though newer versions of gcc/gcj can use profiling data to optimize as well).
Thats right. Tatu Ylönen wrote the original ssh program, which dates back to at least 1995. OpenSSL was started after Ylönen turned ssh into a commerical product and started to make the licence more restrictive. In fact, OpenSSH is based on the code for Ylönen's ssh 1.2.12.
I'm suprised at the amount of bile over here over the placement of the cntl key.
Think about it this way: how often do you combine control with other keys? Most users do this at least a little; users of emacs (and programs that have similar key bindings like bash or anything that uses readline) use them a lot. If you are a touch typist, it's a lot easier to reach ctrl with your pinky if it's beside A rather than below shift. A lot of users get used to the latter but the ctrl-beside-A is really superior -- just look at the motion necessary to reach from the home row -- and its hard to go back once you've switched.
How often do you combine caps lock with other keys? Almost never, I'd guess. In fact, how often do you use caps lock at all (unless you write spam)? I personally map the caps lock key to ctrl on every keyboard I use, giving me two control keys and zero cap lock keys. I never miss it.
Why the bile? Well, trying to use emacs on a keyboard with caps lock beside A gives me shoot pains in my wrists in minutes. I can type all day on a ctrl-beside-A keyboard without any problems at all.
Typing is not as important as it once was. There was a time when documents were retyped every time they were redrafted. Even into the eighties, in business environments documents got retyped all the time. Faxes were a major means of transmitting documents, and the paper and print quality meant that they often ended up getting retyped, too.
Also, typing was once much more of a specialized business skill. If you didn't take a typing course in high school, your first exposure to a typewriter would be on the job or at college.
In today's business environment with e-mail and word-processors, documents are edited, not retyped. The actually time savings of being a super-fast typist are much less, because less typing has to be done. And even when typing, your full-bore typing is interrupted by mousing and keyboard commands. In addition, most people nowadays pick up a minimal typing ability through the use of home computers. Certain jobs where documents are composed from scratch still benefit from high typing speed, but basic self-learned touch typing in the 30-50 wpm is easy to achieve, and focusing training on computer skills for editing makes much more sense.
bash completion getting better
on
Bash 3.0 Released
·
· Score: 2, Informative
The completion ability of bash has been steadily improving. There is a nice script here that sets up a lot of good completion rules for bash.
Re:POSIX Compliance issues.
on
Bash 3.0 Released
·
· Score: 2, Informative
If you use bash specific features, you should be starting your shell scripts with #!/bin/bash (or #!/usr/bin/bash, depending on the installation path) instead of #!/bin/sh. With bash 3, the former allows the non-POSIX stuff that bash has always allowed, but the latter disallows at least some of it.
Cash reserves are an asset the company holds, just like buildings, office chairs and paperclips. And every share in the company, in theory, represents a sliver of that cash. The company might want to keep the cash around for strategic reasons (i.e. warchest) or it might figure it can get a better rate of return than expanding their business would. Regardless, it is still invested in the company.
Huh? Most public companies take their profits and reinvest them in the company. This may or may not help the company grow and reward investors by making the company more valuable. Some companies pay out dividends (i.e. pay out profits to investors), usually because the company is not easily able to expand so growth is not an option. This is commonly seen in large companies in mature fields; think heavy industry, mining, railways, etc..
Redhat most definately does not give their profits to their investors; they are focused, like most tech companies, on growth, so they reinvest it in the company.
MS took backwards compatibility for developers very seriously. You could take a program written for the Windows 3.0 and recompile it for Windows XP and it would just work (most of the time). With Win32, it was binary compatible, too. Similarly, a VB 1.0 program would work in VB 6. MS took this very seriously, and it is a big reason why there has never been a shortage of programs (or developers) for MS platforms.
With the.NET platform and VB.NET (and even more so with Longhorn and Avalon), MS is trying to migrate developers to a completely new platform with no backwards compatibility. This is, of course, to address very real shortcomings with the old Windows platform compared with Java and web-applications. But it's a huge break with the past, the first such risky move since the original move from DOS to Windows.
In the actual discussion, their reply to any question about concrete features -- including standards support, CSS2, CSS2.1, CSS3, tabbed browsing, and PNG alpha transparency -- was, "We can't at this time commit to implementing xxx but we will look at it carefully."
They seemed evasive and unwilling to say anything except marketing-speak. What's the point of chatting to the community if you aren't allowed to talk about the product?
While it is slightly different in concept, check out ccache. It only uses a single computer but it can significantly speed up your compiles. It works by caching the results of each compilation; it will only help if you compile the same code over and over.
Just let it finish. Check the MD5SUMs when you are done, but they shouldn't be wrong, even if you've "kill -9"ed it. If, on the off chance they are, just run bittorrent again, and it will automatically find the corrupt chunks and redownload them.
Bittorrent is very good at ensuring the downloaded files are correct.
I used to think the same way: static typing catches bugs. However, in the past few years, most of the projects I've worked on (largish server side Java systems, primarily) have used some form of dynamic typing anyway. This is usually accomplished by using java.lang.Objects in interfaces or passing around name/value pairs as HashMaps. In some cases, it has been a programmer taking shortcuts, in others, it's been a deliberate design decision.
What's notable though, is how few bugs it has caused. And the bugs that did occur usually were trivial to find and fix.
I've also been investigating some dynamic language frameworks (Ruby on Rails, Django), and although the scope of the projects has been small, I haven't seen a huge cost due to the use of dynamic typing. Although more type-related bugs occur, as above, they are easy to catch and fix.
From an academic perspective, the guarantees of type correctness sound nice, but in my experience, they don't provide much practical benefit. Systems like pike with dynamic typing with optional constraints has the best balance, IMHO.
Python's strengths, AFAICT, are its pure object-oriented design
Python is not a pure OO language. Yes, OO is built into the language in a clean and intuitive way (unlike IMHO perl), but it is possible to ignore it. Python also brings together the best features of functional programming languages (e.g. list comprehension), lisp-like languages (e.g. lambda expressions) and smalltalk (e.g. closures).
I would rephrase that "Python's strengths, AFAICT, are it's multi-paradigm design"
I agree the class libraries are a bit hodge-podge, but the documentation tools seem to be on par with Java/.NET. A bit less structured, but then python is a less structured language, too. Plus with pydoc, I can browse the docs with a browser (a la javadoc, but dynamically generated) or from the commandline.
In my opinion, the more fancy stuff people have used javadoc tags for (object relational mapping, test cases and contraints, etc.) should be done with annotations anyway, and annotations are supported by the most recent versions of both python and java.
Emacs shell-mode is a hugely powerful part of emacs. All you shell command output ends up in regular emacs buffer that you can nagivate and cut/paste using the regular emacs commands. This is especially useful for interactive sessions (e.g. mysql, python) since cutting and pasting commands and their results is so easy. It also saves mousing between editor and shell windows.
One tool I've been using a lot of lately is valgrind. Valgrind is a debugging tool that runs an unmodified binary in a special environment to detect memory related problems.
It's great at detecting memory leaks and odd memory management related crashes. In particular, it's invaluable for threading related memory errors. It can be a bit overwhelming though, especially if you use a lot of libraries that are sloppy with their memory.
One limitation: it's pretty platform specific. Originally, it was pretty tightly coupled to the x86 architecture, though I think there's a PPC port in the works.
Here's one that has worked well for me in the past: Owl Intranet Engine
Where do you spend it? For most IT organizations it will be:
- payroll: Obviously, shrinking the staff will help here, but also consider reducing overtime. Reducing the workload, hiring an intern for user support, streamlining operations all can help.
- software licencing: Migrate away from expensive software, consolidate servers.
- hardware purchases: Extend the lifetime of hardware, push back on upgrades, negotiate better prices with suppliers.
Prime numbers are used in public key encryption. This type of encryption relies on having a function that is easy to generate, but very difficult to reverse. Factorization of large numbers is exactly the function that is used in practice: the prime factors of a large number can easily be multiplied together to get an even larger number, but getting those prime factors back from the giant number is hard. In fact, as the giant number size increases linearly, the time to calculate the factors increases exponentially (using the best known algorithms).
Another interesting wiki-like application is Tomboy, which is essentially a personal wiki that runs locally.
But the JIT profile data is representative of the current run. The profiling run used with the traditional compiler may or may not be representative.
Both approaches have advantages and drawbacks.
Look again. It is faster in the Linpack 500x500 test. That shows there is potential, at least, but obviously there's work to be done.
Besides, there isn't much reason why a JIT should be slower than a natively compiled binary, besides startup time. The code still gets compiled, just at runtime. In fact, since profiling feedback is close at hand, it has an advantage (though newer versions of gcc/gcj can use profiling data to optimize as well).
Thats right. Tatu Ylönen wrote the original ssh program, which dates back to at least 1995. OpenSSL was started after Ylönen turned ssh into a commerical product and started to make the licence more restrictive. In fact, OpenSSH is based on the code for Ylönen's ssh 1.2.12.
Online gambling is currently legal in most developed countries. The US is the notable exception.
I'm suprised at the amount of bile over here over the placement of the cntl key.
Think about it this way: how often do you combine control with other keys? Most users do this at least a little; users of emacs (and programs that have similar key bindings like bash or anything that uses readline) use them a lot. If you are a touch typist, it's a lot easier to reach ctrl with your pinky if it's beside A rather than below shift. A lot of users get used to the latter but the ctrl-beside-A is really superior -- just look at the motion necessary to reach from the home row -- and its hard to go back once you've switched.
How often do you combine caps lock with other keys? Almost never, I'd guess. In fact, how often do you use caps lock at all (unless you write spam)? I personally map the caps lock key to ctrl on every keyboard I use, giving me two control keys and zero cap lock keys. I never miss it.
Why the bile? Well, trying to use emacs on a keyboard with caps lock beside A gives me shoot pains in my wrists in minutes. I can type all day on a ctrl-beside-A keyboard without any problems at all.
Typing is not as important as it once was. There was a time when documents were retyped every time they were redrafted. Even into the eighties, in business environments documents got retyped all the time. Faxes were a major means of transmitting documents, and the paper and print quality meant that they often ended up getting retyped, too.
Also, typing was once much more of a specialized business skill. If you didn't take a typing course in high school, your first exposure to a typewriter would be on the job or at college.
In today's business environment with e-mail and word-processors, documents are edited, not retyped. The actually time savings of being a super-fast typist are much less, because less typing has to be done. And even when typing, your full-bore typing is interrupted by mousing and keyboard commands. In addition, most people nowadays pick up a minimal typing ability through the use of home computers. Certain jobs where documents are composed from scratch still benefit from high typing speed, but basic self-learned touch typing in the 30-50 wpm is easy to achieve, and focusing training on computer skills for editing makes much more sense.
The completion ability of bash has been steadily improving. There is a nice script here that sets up a lot of good completion rules for bash.
If you use bash specific features, you should be starting your shell scripts with #!/bin/bash (or #!/usr/bin/bash, depending on the installation path) instead of #!/bin/sh. With bash 3, the former allows the non-POSIX stuff that bash has always allowed, but the latter disallows at least some of it.
Cash reserves are an asset the company holds, just like buildings, office chairs and paperclips. And every share in the company, in theory, represents a sliver of that cash. The company might want to keep the cash around for strategic reasons (i.e. warchest) or it might figure it can get a better rate of return than expanding their business would. Regardless, it is still invested in the company.
Huh? Most public companies take their profits and reinvest them in the company. This may or may not help the company grow and reward investors by making the company more valuable. Some companies pay out dividends (i.e. pay out profits to investors), usually because the company is not easily able to expand so growth is not an option. This is commonly seen in large companies in mature fields; think heavy industry, mining, railways, etc..
Redhat most definately does not give their profits to their investors; they are focused, like most tech companies, on growth, so they reinvest it in the company.
MS took backwards compatibility for developers very seriously. You could take a program written for the Windows 3.0 and recompile it for Windows XP and it would just work (most of the time). With Win32, it was binary compatible, too. Similarly, a VB 1.0 program would work in VB 6. MS took this very seriously, and it is a big reason why there has never been a shortage of programs (or developers) for MS platforms.
.NET platform and VB .NET (and even more so with Longhorn and Avalon), MS is trying to migrate developers to a completely new platform with no backwards compatibility. This is, of course, to address very real shortcomings with the old Windows platform compared with Java and web-applications. But it's a huge break with the past, the first such risky move since the original move from DOS to Windows.
With the
Joel Spolsky covers this in more depth on his weblog: How Microsoft Lost the API War.
In the actual discussion, their reply to any question about concrete features -- including standards support, CSS2, CSS2.1, CSS3, tabbed browsing, and PNG alpha transparency -- was, "We can't at this time commit to implementing xxx but we will look at it carefully."
They seemed evasive and unwilling to say anything except marketing-speak. What's the point of chatting to the community if you aren't allowed to talk about the product?
While it is slightly different in concept, check out ccache. It only uses a single computer but it can significantly speed up your compiles. It works by caching the results of each compilation; it will only help if you compile the same code over and over.
MD5 hashes are 128-bits, not 32-bits. That means the probability is closer to 2^-128.
Just let it finish. Check the MD5SUMs when you are done, but they shouldn't be wrong, even if you've "kill -9"ed it. If, on the off chance they are, just run bittorrent again, and it will automatically find the corrupt chunks and redownload them.
Bittorrent is very good at ensuring the downloaded files are correct.
I know this article is about eclispse, but I'd like to point out this feature exists in emacs, too.
Turn on hs-minor-mode (M-x hs-minor-mode) and code blocks can be folded and unfolded with shift-middle-click (or C-c @ C-c).