The main reason I don't vote democratic is that they are cowardly and do not present any kind of real oppositiion to the republicans.
Wasn't the vote for the DMCA unanimous? Lots of democrats voting for corporate interests. Look at the large number of democrats who voted for Bush' resolution on war in Iraq.
I feel that the democratic party has outlived its usefulness and needs to be replaced by a party that will live true to its ideals.
I see some chance that the democratic party will survive and I might vote for them again - if they lose enough membership to the greens that they decide they must change, develop some spine and put up a real opposition to the republicans.
We couldn't have viruses without self-modifying code. What would all the teenagers do?
Used with care, self-modifying code is a powerful and useful tool. And yes there are caching issues - most processors have separate data and code caches, so writing into code using data instructions will put the code into the wrong cache, so you have to flush it.
We couldn't have program loaders without self-modifying code!
A number of the products I wrote for the Mac back at Working Software were self-modifying code, and they did very well.
You just have to know what you're doing, that's all.
Another use for them is dynamically relinking a running program as you edit its source code. Instead of relinking and relaunching the whole program, you can just reload the last subroutine that you edited. This is done by a number of development environments, and can greatly speed up the edit-compile-debug cycle.
I don't think you're going to be able to find a compiler that can reorder your struct or class members depending on how they are accessed. It may be possible to have one do that based on profiling, but I think that is beyond current compiler technology.
Also every compiler I have ever come across stores struct and class members in the order they are declared in the source file. I don't think that's guaranteed by either C or C++, but that's how it always is.
Also, the compiler is not going to make fundamental changes to your data structures and algorithms for you. If you write some code to manipulate a linked list, there's now way the compiler will change that to an array for you because it thinks it might be more efficient.
The one case I have seen tools able to affect cache access in a positive way is the use of code profilers that record the most common code paths in your program and then edit the executable binary so that all the less common code paths are towards the end of the file. Thus if you take an uncommon branch, you might jump back and forth a megabyte within a single subroutine.
Apple's MrPlus did that. It was based on an IBM RS-6000 tool whose name I don't recall.
This has the advantage not just of improving cache performance but of reducing paging - a greater percentage of the code pages that are resident in memory are used for something useful, rather than containing code that is mostly jumped over. Uncommonly used code will all be at the end of the file and may never be paged in.
One problem with a tool like this is that the results are only valid for a certain use of the program. If you have a program that can be used in many different ways, it may be difficult to find a test case that helps you.
Much software is not written to take advantage of the architecture of modern microprocessors. If you rewrite some of your software to take advantage of them, then it is not hard to double your speed.
The problem is that many, if not most programs are not very intelligent in how they access the CPU cache.
It is not uncommon for a CPU to be running at ten times the speed of the memory bus. To keep from starving the CPU, we have caches that run nearer or at the speed of the processor.
There's two problems. One is that the cache is limited in size. The other, less well understood, is that the cache comes in small blocks called "cache lines", that are typically 32 bytes.
So if you have a cache miss at all, or you fill up the cache and have to write a cache line back to memory, your memory bus is going to be occupied for the time it takes to write 32 bytes. The external data bus of the PowerPC is 64 bits (8 bytes) so there will be four memory cycles, during which the processor is essentially stopped.
What can you do to maximize performance? Make better use of the cache. If you use some memory, use it again right away. Use other memory that's right next to it. Avoid placing data values near each other that won't be used near each other in time.
Simply rearranging the order of some items in a struct or class member list may make cache usage more effective.
Also be aware of how your data structures affect the cache. Be aware of data you don't see, like heap block headers and trailers.
Arrays are often more efficient than linked lists, especially if you are going to traverse them all at once, because each item in a linked list will likely be loaded in a different cache line, where an array may get several items together in a cache line.
Finally, if you really have a structure that's full of small items that is accessed in a highly random way, consider turning off caching for the memory the data structure occupies. You won't get the benefit of the cache after you've accessed an item, but on the other hand you won't have to wait to fill a 32-byte cache line each time you read a single item.
Imagine a lookup table of bytes that's several hundred k in size, accessed very randomly - you would benefit to not use the cache.
My friend Andy Green spent nearly ten years developing the ZooLib
cross-platform application framework before placing it into Open Source under the MIT License.
I've worked with it quite a bit and I must say it is wonderful.
Presently it supports Windows, Mac OS, Linux, and BeOS. A little work would be required for Solaris and Irix - it has a small amount of assembly to do atomic arithmetic, that's used by the reference counted smart pointers, but that should not be hard to do.
Speak Freely lets you configure the port, I'm pretty sure. It has lots of other advantages over competing products such as choice of protocol and encoding scheme, and you can also use hard encryption.
It used to be public domain. I think it's GPL now.
A while back Captain Crunch made a little bit of history by placing his first VOIP call with Speak Freely - from India, where VOIP has long been illegal and I'm pretty sure the ports are supposed to be blocked.
The way people can find what port to use for you is that you can have your name and IP address listed on a webserver. When people look you up they'll see your port. You'll have to instruct people you talk to to set the port, not just the IP address.
There used to be a firewire (IEEE1394) chip called PCILynx made by Texas Instruments. It had a "promiscuous mode" so any PCILynx card could be used as a firewire protocol sniffer. Apple distributes a free-as-in-beer sniffer app called FireBug with the firewire SDK for Mac OS 9.
But then a bunch of folks got together to define a common standard for firewire chips that came to be called OHCI. There are several OHCI firewire chips, and they can all use the same driver on any given OS because they are register-compatible.
Microsoft Windows only supports OHCI. It doesn't support PCILynx.
Funny thing is, the "content industry" - movie, tv, RIAA, etc., participated in setting the standard for OHCI. Firewire is a big deal in professional video production; Apple got an Emmy for developing FireWire.
It seems the content industry was concerned that allowing for promiscuous mode in OHCI would help defeat copy protection of content that's delivered on the firewire bus.
So there's no promiscuous mode provided for in the OHCI standard.
PCILynx cards are I think no longer manufactured because Microsoft won't support them and OHCI cards are so ubiquitous. The Mac OS still supports them but Apple builds all their new Macs with OHCI.
It's getting hard to find PCILynx cards. I've been fortunate to get ahold of a couple CardBus PCILynx cards inexpensively. The one source of PCI PCILynx cards I've found charges $290 for them. So instead of getting a PCI card for my Mac 8500 I got a PCMCIA to PCI adapter that claims to support the Mac and I've been all day trying to get it to work.
That's what setting standards for this sort of thing will get you. The DMCA hardwired into the protocol. That's not what you want.
Personally, my plan is to start writing a GPL protocol sniffer soon. I'm going to make it cross-platform, using a library to abstract the system-call interface. Mac OS 9 and Linux support should be easy; OS X support will hopefully be straightforward. To support Windows I'll have to write a PCILynx driver for it.
There's no dress code when you're self employed
on
Suit Up Or Ship Out?
·
· Score: 1
I have been working out of my home since April 1, 1998, when I began consulting full-time.
By consulting, I mean running my own business as a software consultant - not a temp worker, I deal directly with the client and
don't deal with brokers.
If I have a face-to-face meeting with a client, I will wear a nice shirt, but otherwise I could do my work naked if I cared to.
However, I have found that I can't get it together to work unless I do dress. I can't program in a bathrobe for some reason. But right at the moment (taking a break from my current contract to post here), I am in fact wearing blue jeans and a t-shirt.
I understand that the CPSR was formed out of concern for the reliability of the software that would operate the Strategic Defense Initiative (Star Wars) - the problem being that there was only one way to test the full system in action, and that's to have a nuclear war. They argued that the SDI couldn't provide adequate protection because it wouldn't be reliable.
Here's a page full of links on CPSR & Star Wars.
But they do all kinds of work in trying to inform the public and policy makers about the social issues involved in computing.
I don't see anything on their site about TCPA but I think they would be enthusiastic about taking the issue up.
I think ewhac says something important in the parent post.
It's the way I have striven to live for some time. I admit that I sometimes fall short. One has to live - and to survive to fight another day.
But despite the fact that software engineers are very noisy about the political issues that concern them, on the whole we have been very inneffective at carrying out any action.
I see your point, but I feel there is a good reason to believe that this is for doing DRM with Linux in such a way that the DRM cannot be disabled even if you have the kernel source.
The job ad talks about how the client does all kinds of different things in the entertainment business, and goes on to say "Japanese language skills a BIG plus! ".
I actually considered doing that, but as a computer consultant who abides by the Independent Computer Consultants AssociationCode of Ethics, I have a moral and professional obligation to be honest to my clients and do the best work for them I possibly can.
Thus the only course of action I can take is to not accept the contract if it is offerred.
However, I will be happy to discuss with them that I cannot consider taking the job because I feel that what they would want me to do is morally reprehensible.
I try to abide by what I feel is right. But I have worked for companies whose principles I objected to, because that's what I had to do to survive. I did the best job I could while I had the jobs, but did my best to move on to other work as soon as possible.
JOB DESCRIPTION Do you want to change the way people see, hear and play? Our client is looking for a Boot-Level Programmer for their San Jose offices. Music, motion picture, television, computer entertainment, and online businesses make our client one of the most comprehensive entertainment companies in the world.
As the Boot-Level Programmer, you will modify the boot code of an embedded Linux platform to incorporate communications to a new hardware chip (TCPA/TPM) and check the system integrity. You will have to take the source code for an existing boot ROM and integrate calls to a TPM chip to check the system integrity as consistent with TCPA. You must understand TCPA and embedded devices.
I figured TCPA was just some buzzword I could pick up out of a book if I got the job. I do that all the time. But no:
Trusted Computing Platform Aalliance
The blurb about "changing the way people see, hear and play" just didn't register.
I hope they do call me though. I'll give them a piece of my mind, followed by the URL of my
DeCSS mirror.
Now I ask you this: if they're verifying the "system integrity" of a linux box with the TCPA, are they complying with the GPL?
Um, my understanding is that they're already putting critical systems on the Internet. It's a done deal. However, it is not as widespread as it would probably become if the older businesses are allowed to fail.
The problem is that if the telephone system becomes based on the Internet, there will be catastrophic security breaches in our telephone system.
This is because every node on the internet can have packets directed at it by any other node. That's the whole point of end-to-end. But that means any joker with a PC can log in to his ISP and start up h4x0r scr1pt5 to start cracking phone switches.
With the current phone system, control signaling is out of band - end users can only control the phones at each end of the connection, and cannot control the functioning of the switches in between. You can command the switches by dialing a number, but you can only route your call this way, not control the basic functioning of the switch.
To a large extent security can be maintained by keeping the telco equipment in securely locked buildings.
But the protocols used for the phone system apparently aren't designed with security in mind, so that when they are adapted to the Internet, they become gaping security holes.
Potentially someone could do some clever work and bring down a whole nation's phone system, if it were on the Internet.
The convergence of the telephone system and the Internet has already been going on for a while. It is quite common for long-distance calls to be routed over the Internet, so you get phone-to-phone VOIP without the user being aware of it.
It is also common for telcos to be ISPs, and they just use the same fiber for voice and data. It's more economical to use the same data formats and protocols for voice as well as data, so they transmit all the voice calls with the Internet Protocol.
ZooLib is a multithreaded C++ cross-platform application framework. It supports classic Mac OS (even 68k), and Carbon in CFM and has just gotten Mach-o executable format support.
You will want to get the code from
CVS because there hasn't been a release in a long time. (Real Soon Now.)
If you code for ZooLib it is almost trivial to port your applications to Windows or the BeOS. ZooLib for Linux works for server applications but the GUI support is not complete (but would not be hard to do).
It also includes TCP networking and two choices of database support with a C++ API (but not SQL).
I have never actually seen or done this, but I was quite impressed to read about simulating metal crystallization in The Feynman Lectures on Physics.
He gives a formula for high-quality soap bubble solution, where the bubbles will last a long time without popping from evaporation.
Then you can generate thousands of small bubbles that are of extremely uniform size by placing a glass tube with a modest air flow under the surface of a steadily spinning pan of water.
Instead of simple foam, the bubbles make a close-packed formation like the way your grocer stacks oranges. The bubbles form crystals.
But there are different nucleation centers, and their will be crystal boundaries where crystals with different alignments but against each other.
Gradually the bubbles at the boundaries will align with one side or the other, and some crystals will grow while others shrink.
There are some nice photos in the Feynman lectures, check it out.
I can't seem to find my copy or I'd give you a page number. I think they're still packed in a box from when I moved.
This is a very simple one that really impressed me when I saw it as a freshman at CalTech.
It helps to have a tall ceiling, or some high-up place you can tie a rope. At the other end of the rope you hang a heavy weight. At caltech they used a steel ball that must have weighed 100 pounds. Possibly you could use a bowling ball enclosed in a net bag.
What you do is pull the heavy weight some distance to one side. You will need to have the length of the rope and the distance of swing so that it just touches the tip of your nose when you pull it to the side.
Then let go, while facing the direction of swing. The heavy weight will swing across, then back and up - and come to a stop just as it touches the tip of your nose.
You have to stand there calmly and let it. Your amazed audience will think you're just about to get your face smashed in, but that doesn't happen. I think it was Prof. Ed Stone who did this.
As the weight swings, the potential energy from being raised in a gravitational potential will be converted into kinetic energy that reaches a maximum at the bottom of the swing. But when it comes back all that kinetic energy will get converted back to potential energy, and the kinetic energy will drop to zero just as it reaches the starting point.
If there is any friction from the air or flexing the rope it won't come all the way back to your nose.
You could also contact a local astronomy club and get them to show your kids a homemade telescope.
I make them. Visit my page for some links, likely there is a club in your area.
You should use cross-platform frameworks as much as you can.
There are a great variety of cross-platform libraries and frameworks that you would find useful. For example, for a humble JPEG coded,
the Independent JPEG Group's JPEG library works really well and runs on everything from DOS to a Cray. It is portable beyond belief. For a lossless graphics format there is libtiff. (I don't know what's available for cross-platform video format software, but I'm sure there is some.)
If you're going to write in in C++, my favorite framework for GUI, file API's, TCP networking, multithreading and database is
ZooLib. (But note that presently the best code to use is
what's in CVS because it hasn't had a release in a long time (Real Soon Now, really!).
I've started writing
a book about ZooLib that is released under the GNU Free Documentation License.
Another important framework is the
Simple DirectMedia Layer. You will want this for your rendered scenes and for sound (ZooLib does 2-D graphics, it's not a 3-D API).
If you write in C++, do as much as you can with the Standard Template Library. There are some excellent books that teach how to use it.
For a long time, the STL has got a bad rap, in part because the template definitions in the header files are hard to read, and in part because of poor compiler implementations of the C++ ISO standard, or poor implementations of the library itself. But by now there are excellent implementations for every OS that is in common use. For example, on Windows, don't bother with Visual C++ - use Metrowerks CodeWarrior or Comeau C/C++.
Even if you choose to work with a broken compiler, the STLPort
library provides a compliant standard library that will work almost anywhere.
I was rather intimidated by the STL when I first encountered it but once I got a good book and learned how to use it, I thought it was the best thing since sliced bread.
Boost has many portable C++ libraries that are of excellent quality.
Finally, I am (slowly) building a website devoted to educating developers in cross-platform and portable programming called
ByteSwap.net.
Read my first article there
Writing Cross-Platform Software - Getting Started. More articles will appear when I get more free time!
I use Seagull Networks for all my sites. I recommend them highly.
I've been with them for something like five years. I always get prompt personal customer service for the rare issue that ever comes up.
They support SSH login. I upload my web pages with SCP. You can use SSH tunnelling to get your pop mail, or log into a shell via ssh and use elm or pine.
There is a full suite of development tools online, and you can run CGI's that you write yourself.
Wasn't the vote for the DMCA unanimous? Lots of democrats voting for corporate interests. Look at the large number of democrats who voted for Bush' resolution on war in Iraq.
I feel that the democratic party has outlived its usefulness and needs to be replaced by a party that will live true to its ideals.
I see some chance that the democratic party will survive and I might vote for them again - if they lose enough membership to the greens that they decide they must change, develop some spine and put up a real opposition to the republicans.
Used with care, self-modifying code is a powerful and useful tool. And yes there are caching issues - most processors have separate data and code caches, so writing into code using data instructions will put the code into the wrong cache, so you have to flush it.
We couldn't have program loaders without self-modifying code!
A number of the products I wrote for the Mac back at Working Software were self-modifying code, and they did very well.
You just have to know what you're doing, that's all.
Another use for them is dynamically relinking a running program as you edit its source code. Instead of relinking and relaunching the whole program, you can just reload the last subroutine that you edited. This is done by a number of development environments, and can greatly speed up the edit-compile-debug cycle.
Also every compiler I have ever come across stores struct and class members in the order they are declared in the source file. I don't think that's guaranteed by either C or C++, but that's how it always is.
Also, the compiler is not going to make fundamental changes to your data structures and algorithms for you. If you write some code to manipulate a linked list, there's now way the compiler will change that to an array for you because it thinks it might be more efficient.
The one case I have seen tools able to affect cache access in a positive way is the use of code profilers that record the most common code paths in your program and then edit the executable binary so that all the less common code paths are towards the end of the file. Thus if you take an uncommon branch, you might jump back and forth a megabyte within a single subroutine.
Apple's MrPlus did that. It was based on an IBM RS-6000 tool whose name I don't recall.
This has the advantage not just of improving cache performance but of reducing paging - a greater percentage of the code pages that are resident in memory are used for something useful, rather than containing code that is mostly jumped over. Uncommonly used code will all be at the end of the file and may never be paged in.
One problem with a tool like this is that the results are only valid for a certain use of the program. If you have a program that can be used in many different ways, it may be difficult to find a test case that helps you.
Much software is not written to take advantage of the architecture of modern microprocessors. If you rewrite some of your software to take advantage of them, then it is not hard to double your speed.
The problem is that many, if not most programs are not very intelligent in how they access the CPU cache.
It is not uncommon for a CPU to be running at ten times the speed of the memory bus. To keep from starving the CPU, we have caches that run nearer or at the speed of the processor.
There's two problems. One is that the cache is limited in size. The other, less well understood, is that the cache comes in small blocks called "cache lines", that are typically 32 bytes.
So if you have a cache miss at all, or you fill up the cache and have to write a cache line back to memory, your memory bus is going to be occupied for the time it takes to write 32 bytes. The external data bus of the PowerPC is 64 bits (8 bytes) so there will be four memory cycles, during which the processor is essentially stopped.
What can you do to maximize performance? Make better use of the cache. If you use some memory, use it again right away. Use other memory that's right next to it. Avoid placing data values near each other that won't be used near each other in time.
Simply rearranging the order of some items in a struct or class member list may make cache usage more effective.
Also be aware of how your data structures affect the cache. Be aware of data you don't see, like heap block headers and trailers.
Arrays are often more efficient than linked lists, especially if you are going to traverse them all at once, because each item in a linked list will likely be loaded in a different cache line, where an array may get several items together in a cache line.
Finally, if you really have a structure that's full of small items that is accessed in a highly random way, consider turning off caching for the memory the data structure occupies. You won't get the benefit of the cache after you've accessed an item, but on the other hand you won't have to wait to fill a 32-byte cache line each time you read a single item.
Imagine a lookup table of bytes that's several hundred k in size, accessed very randomly - you would benefit to not use the cache.
I've worked with it quite a bit and I must say it is wonderful.
Presently it supports Windows, Mac OS, Linux, and BeOS. A little work would be required for Solaris and Irix - it has a small amount of assembly to do atomic arithmetic, that's used by the reference counted smart pointers, but that should not be hard to do.
I have started writing a tutorial called The ZooLib Cookbook.
It used to be public domain. I think it's GPL now.
A while back Captain Crunch made a little bit of history by placing his first VOIP call with Speak Freely - from India, where VOIP has long been illegal and I'm pretty sure the ports are supposed to be blocked.
The way people can find what port to use for you is that you can have your name and IP address listed on a webserver. When people look you up they'll see your port. You'll have to instruct people you talk to to set the port, not just the IP address.
But then a bunch of folks got together to define a common standard for firewire chips that came to be called OHCI. There are several OHCI firewire chips, and they can all use the same driver on any given OS because they are register-compatible.
Microsoft Windows only supports OHCI. It doesn't support PCILynx.
Funny thing is, the "content industry" - movie, tv, RIAA, etc., participated in setting the standard for OHCI. Firewire is a big deal in professional video production; Apple got an Emmy for developing FireWire.
It seems the content industry was concerned that allowing for promiscuous mode in OHCI would help defeat copy protection of content that's delivered on the firewire bus.
So there's no promiscuous mode provided for in the OHCI standard.
PCILynx cards are I think no longer manufactured because Microsoft won't support them and OHCI cards are so ubiquitous. The Mac OS still supports them but Apple builds all their new Macs with OHCI.
It's getting hard to find PCILynx cards. I've been fortunate to get ahold of a couple CardBus PCILynx cards inexpensively. The one source of PCI PCILynx cards I've found charges $290 for them. So instead of getting a PCI card for my Mac 8500 I got a PCMCIA to PCI adapter that claims to support the Mac and I've been all day trying to get it to work.
That's what setting standards for this sort of thing will get you. The DMCA hardwired into the protocol. That's not what you want.
Search for "copy protection" at the 1394 Trade Association's website.
Personally, my plan is to start writing a GPL protocol sniffer soon. I'm going to make it cross-platform, using a library to abstract the system-call interface. Mac OS 9 and Linux support should be easy; OS X support will hopefully be straightforward. To support Windows I'll have to write a PCILynx driver for it.
By consulting, I mean running my own business as a software consultant - not a temp worker, I deal directly with the client and don't deal with brokers.
If I have a face-to-face meeting with a client, I will wear a nice shirt, but otherwise I could do my work naked if I cared to.
However, I have found that I can't get it together to work unless I do dress. I can't program in a bathrobe for some reason. But right at the moment (taking a break from my current contract to post here), I am in fact wearing blue jeans and a t-shirt.
What I meant is that I think "A Plea to Responsible Computing Professionals" should be moderated up.
Sorry for the confusion.
I understand that the CPSR was formed out of concern for the reliability of the software that would operate the Strategic Defense Initiative (Star Wars) - the problem being that there was only one way to test the full system in action, and that's to have a nuclear war. They argued that the SDI couldn't provide adequate protection because it wouldn't be reliable. Here's a page full of links on CPSR & Star Wars.
But they do all kinds of work in trying to inform the public and policy makers about the social issues involved in computing.
I don't see anything on their site about TCPA but I think they would be enthusiastic about taking the issue up.
It's the way I have striven to live for some time. I admit that I sometimes fall short. One has to live - and to survive to fight another day.
But despite the fact that software engineers are very noisy about the political issues that concern them, on the whole we have been very inneffective at carrying out any action.
That needs to change.
The job ad talks about how the client does all kinds of different things in the entertainment business, and goes on to say "Japanese language skills a BIG plus! ".
My guess is that the client company is Sony.
Thus the only course of action I can take is to not accept the contract if it is offerred.
However, I will be happy to discuss with them that I cannot consider taking the job because I feel that what they would want me to do is morally reprehensible.
I try to abide by what I feel is right. But I have worked for companies whose principles I objected to, because that's what I had to do to survive. I did the best job I could while I had the jobs, but did my best to move on to other work as soon as possible.
But there are some things I just won't do.
-
Boot-Level Programmer-San Jose
I figured TCPA was just some buzzword I could pick up out of a book if I got the job. I do that all the time. But no: The blurb about "changing the way people see, hear and play" just didn't register.I hope they do call me though. I'll give them a piece of my mind, followed by the URL of my DeCSS mirror.
Now I ask you this: if they're verifying the "system integrity" of a linux box with the TCPA, are they complying with the GPL?
-
Phone hacking, the next generation
The problem is that if the telephone system becomes based on the Internet, there will be catastrophic security breaches in our telephone system.This is because every node on the internet can have packets directed at it by any other node. That's the whole point of end-to-end. But that means any joker with a PC can log in to his ISP and start up h4x0r scr1pt5 to start cracking phone switches.
With the current phone system, control signaling is out of band - end users can only control the phones at each end of the connection, and cannot control the functioning of the switches in between. You can command the switches by dialing a number, but you can only route your call this way, not control the basic functioning of the switch.
To a large extent security can be maintained by keeping the telco equipment in securely locked buildings.
But the protocols used for the phone system apparently aren't designed with security in mind, so that when they are adapted to the Internet, they become gaping security holes.
Potentially someone could do some clever work and bring down a whole nation's phone system, if it were on the Internet.
The convergence of the telephone system and the Internet has already been going on for a while. It is quite common for long-distance calls to be routed over the Internet, so you get phone-to-phone VOIP without the user being aware of it.
It is also common for telcos to be ISPs, and they just use the same fiber for voice and data. It's more economical to use the same data formats and protocols for voice as well as data, so they transmit all the voice calls with the Internet Protocol.
You will want to get the code from CVS because there hasn't been a release in a long time. (Real Soon Now.)
If you code for ZooLib it is almost trivial to port your applications to Windows or the BeOS. ZooLib for Linux works for server applications but the GUI support is not complete (but would not be hard to do).
It also includes TCP networking and two choices of database support with a C++ API (but not SQL).
You can learn a little about ZooLib from my first draft of The ZooLib Cookbook I also wrote an article called Writing Cross-Platform Software - Getting Started.
He gives a formula for high-quality soap bubble solution, where the bubbles will last a long time without popping from evaporation.
Then you can generate thousands of small bubbles that are of extremely uniform size by placing a glass tube with a modest air flow under the surface of a steadily spinning pan of water.
Instead of simple foam, the bubbles make a close-packed formation like the way your grocer stacks oranges. The bubbles form crystals.
But there are different nucleation centers, and their will be crystal boundaries where crystals with different alignments but against each other.
Gradually the bubbles at the boundaries will align with one side or the other, and some crystals will grow while others shrink.
There are some nice photos in the Feynman lectures, check it out.
I can't seem to find my copy or I'd give you a page number. I think they're still packed in a box from when I moved.
It helps to have a tall ceiling, or some high-up place you can tie a rope. At the other end of the rope you hang a heavy weight. At caltech they used a steel ball that must have weighed 100 pounds. Possibly you could use a bowling ball enclosed in a net bag.
What you do is pull the heavy weight some distance to one side. You will need to have the length of the rope and the distance of swing so that it just touches the tip of your nose when you pull it to the side.
Then let go, while facing the direction of swing. The heavy weight will swing across, then back and up - and come to a stop just as it touches the tip of your nose.
You have to stand there calmly and let it. Your amazed audience will think you're just about to get your face smashed in, but that doesn't happen. I think it was Prof. Ed Stone who did this.
As the weight swings, the potential energy from being raised in a gravitational potential will be converted into kinetic energy that reaches a maximum at the bottom of the swing. But when it comes back all that kinetic energy will get converted back to potential energy, and the kinetic energy will drop to zero just as it reaches the starting point.
If there is any friction from the air or flexing the rope it won't come all the way back to your nose.
You could also contact a local astronomy club and get them to show your kids a homemade telescope. I make them. Visit my page for some links, likely there is a club in your area.
There are a great variety of cross-platform libraries and frameworks that you would find useful. For example, for a humble JPEG coded, the Independent JPEG Group's JPEG library works really well and runs on everything from DOS to a Cray. It is portable beyond belief. For a lossless graphics format there is libtiff. (I don't know what's available for cross-platform video format software, but I'm sure there is some.)
If you're going to write in in C++, my favorite framework for GUI, file API's, TCP networking, multithreading and database is ZooLib. (But note that presently the best code to use is what's in CVS because it hasn't had a release in a long time (Real Soon Now, really!).
I've started writing a book about ZooLib that is released under the GNU Free Documentation License.
But if you don't like ZooLib, it's important to use some cross-platform framework. There are many to choose from.
Another important framework is the Simple DirectMedia Layer. You will want this for your rendered scenes and for sound (ZooLib does 2-D graphics, it's not a 3-D API).
If you write in C++, do as much as you can with the Standard Template Library. There are some excellent books that teach how to use it.
For a long time, the STL has got a bad rap, in part because the template definitions in the header files are hard to read, and in part because of poor compiler implementations of the C++ ISO standard, or poor implementations of the library itself. But by now there are excellent implementations for every OS that is in common use. For example, on Windows, don't bother with Visual C++ - use Metrowerks CodeWarrior or Comeau C/C++.
Even if you choose to work with a broken compiler, the STLPort library provides a compliant standard library that will work almost anywhere.
I was rather intimidated by the STL when I first encountered it but once I got a good book and learned how to use it, I thought it was the best thing since sliced bread.
Boost has many portable C++ libraries that are of excellent quality.
Finally, I am (slowly) building a website devoted to educating developers in cross-platform and portable programming called ByteSwap.net. Read my first article there Writing Cross-Platform Software - Getting Started. More articles will appear when I get more free time!
I've been with them for something like five years. I always get prompt personal customer service for the rare issue that ever comes up.
They support SSH login. I upload my web pages with SCP. You can use SSH tunnelling to get your pop mail, or log into a shell via ssh and use elm or pine.
There is a full suite of development tools online, and you can run CGI's that you write yourself.