The most powerful idea IMHO is the use of function scopes as the main data structure instead of dictionaries. Another idea is avoiding or skipping completely some language features that behave in unusual ways and using simpler more fundamental constructs instead. I think the new-operator is the classic example of these.
Ask Slashdot: Network Backup Solution Out of the Box?
If you solve the dual NAT problem separately then Duplicity is one good complete solution. It adds backup schedules, strong client-side encryption and is still able to do incremental backups. Setting it up requires one line of cron on the client side and some kind of remote account for storing the backup archives (SSH, SFTP, FTP). Choosing the correct command line options and handling the passwords requires some care though.
Duplicity uses the same base tech as rsync (librsync) and it's written in Python. It tries hard not to reinvent the wheel using tar for archive files and gpg for encrypting them. This means that extracting files from backups can even be done with standard tools if things get bad. It's available out of the box at least on Ubuntu and Debian. Also installing on CentOS went pretty smoothly with RPM available from project site.
Some Windows Apps Make GRUB 2 Unbootable
If Windows and Windows programs insist on controlling the boot sector (and stuff that comes after it), you can still boot Linux.
At least starting with Vista, Windows has completely extensible boot loader of its own (the configuration data is called BCD).
The idea is that the Grub (or whatever) is installed on the same Linux *partition* where all the system files are installed (not on the MBR).
(At least Ubuntu installer has the option to install Grub on a partition instead of MBR out of the box.)
Windows boot loader is then used to load Grub from the beginning of that partition. No matter what
windows updates, programs etc. do this does not break.
Too bad that the default Linux installers don't support this option, since it
has been very hassle free for me at least. The initial setup could just as well be automatic.
Instructions for doing this manually here:
Followup On Java As "Damaging" To Students
At the beginning of my CS education in Helsinki, the hardest lesson was that I actually need to do some hard work to improve my skills and thinking.
Luckily the Math Department was happy to trash my overconfidence :) The CS department took quite a bit longer to reach the same level of complexity and depth that forced me to actually work hard instead of just relying on my intuition.
From what I gather, the global trend is to lower the bar and remove anything that might overwhelm people. In my view, being given challenges that seem too much at first is just the thing that is educational.
I probably learned much more from the first courses that I just barely passed than from the courses that I just breezed through, although sadly it took years for the lesson to really sink in.