Actually I meant like correcting the punctuation error with
the newfound power of regular expressions. The fact that I
used a sed-like (or perl-like) expression
was just incidental and was only because that's the syntax
I knew off the top of my head.
I don't see how you can get around the other delays though, OS, memory, buffer, and CPU delays should all be neglible, but the TCP delays are going to blow your packet delaying away unless you have a really fast connection, honestly I don't see this working over the internet.
--- elided.example.com ping statistics ---
100 packets transmitted, 100 packets received, 0% packet loss
round-trip min/avg/max/stddev = 59.322/62.689/79.781/3.203 ms
These are ping times between me and a host that's about 1750 miles
(2800 km) away. Note the minimum and maximum ping times here.
Round-trip times for these 100 packets varied between about 59 ms
and 80 ms. (I don't have data for single-direction packet travel
times, but round-trip times will do for analysis. They aren't
conceptually different -- it's all just network hops.) Anyway,
if I add a 25 ms delay to those packets, then the delayed packets
will be in the range roughly from 84 to 105 ms. The two ranges
(59-80ms and 84-105ms) don't overlap, so if other packets behave
like the 100 packets I measured, I should be able to get data
through just fine. Of course, there are no guarantees on how
long packets will be delayed, so there will be overlap between
the ranges, but if it is infrequent, I can correct for it.
You're right, though, that if the network pipe is saturated,
the delay is going to get all unpredictable. But TCP/IP doesn't
work well at all with network pipes that are completely saturated,
so people don't build networks like that, usually.
I RTFA'd and I don't see how this would work with regular, semi-random typing -ie. I may 'sit on a character' while I space out or think about what to type next -or try to find the next key....
There may be several schemes that would work, but here's the simplest
one I can think of off the top of my head. Basically, you figure
out what the maximum delay that can go unnoticed is, and you buffer
keystrokes for that length of time. For example, if you determine
that nobody ever notices when a keystroke is delayed 100 ms, you
buffer keystrokes for that long.
Now, if during that period of time you get multiple keystrokes,
then you spit the keystrokes out of your queue with a predefined
timing. If you want to send a 0, you might send the first
keystroke out, then wait 50 ms, then send the second. If you
want to send out a 1, then you might wait 75 ms between the
keystrokes. So basically, you get opportunistic about it.
Only if you have two keystrokes in a short period of time do you
try to encode data in the timing.
But of course there will be times when the user is typing slowly,
and you don't get 2 or more keystrokes in a short interval, but
you still have to send them out.
The solution to
that problem is easy: if you aren't trying to send a 0 or 1,
just make sure you never send out any keystroke sooner than
100 ms after you sent the last one. Now you have a system
where (at the remote end), if you see two packets arrive
about 50 ms apart, that's a 0, and if you have two arrive
about 75 ms apart, that's a 1, and if you have two arrive
about 100 ms or more apart, that's no data (a no-op).
And of course you want all kinds of redundancy built in
because the network and the TCP/IP stack and the operating
system will add lots of noise and corruption to your covert
data stream, so you'll have to piece it back together. But
that's an easy enough problem provided you don't mind reducing
the bandwidth even further than what it is already is.
Oh, speaking of bandwidth, you can probably encode more than
one bit per keystroke pretty easily. Coincidentally enough,
today I was observing network latency between two sites about
1000 miles apart, and I noticed that even though the
latency was usually around 70 ms, the standard deviation seemed
to be much lower, down around 2 or 3 ms. So in this case,
depending on how much you want to delay things (you can't delay
things so much that an average typist can outpace you!), you could
use one of a set of several different delays between keystrokes.
You might encode 3 bits by doing intervals spaced 5 ms apart.
So, 50 ms for 000,
55 ms for 001, 60 ms for 010, 65 ms for 011,..., 85 ms for 111,
and 110 ms for no-op. (Things get complicated, but I'm assuming
you'd want a bigger gap between no-op and the others since no-op
will occur very frequently.)
The technical specifications of the flash memory in my USB drive says that it is guaranteed to work for, at most, 100000 (i.e., one followed by 5 zeros) writes.
I thought I'd seen specs an order of magnitude larger than that in
many cases, but the problem still may not be as bad as you think in
many cases even if it is as bad as 100000 writes. The reason? Flash
devices have systems built in to their controllers specifically to
deal with these problems. The mechanisms may vary, but the ones I
know about are wear leveling and excess capacity (beyond the
capacity that the device reports to the operating system)
that can be pressed
into service when a block fails.
Briefly, wear leveling means that
if you write to the same logical address over and over, the controller
will map that write to different physical addresses each time. That
means that you can't wear out the device by rewriting the same file
over and over again; instead, you only add a little bit of wear to
each physical block on the flash device. The concept is a little bit
like rotating the tires on your car except that it's a more dramatic
win since write patterns can be much more uneven than wear on tires
on a car.
The other mechanism for mitigating the effects of limited flash life
is putting excess capacity aside (so that it's not reported to the OS)
to be used when a physical block does fail. Since it's a matter of
probability just which write will cause a given block to fail (meaning
that some will fail after less than 100,000 writes and some will
probably last much longer), even with wear leveling it's unlikely
that all blocks will fail at once. It should be easy to tell when
the pool of spare blocks is nearing exhaustion and give you advanced
warning that your flash device is wearing out. So in that sense, it
is actually safer than hard drives, which tend to fail without
warning.
Finally, this whole thing reminds me of the reaction some people
(mostly audiophiles)
had to compact discs, and digital audio in general, when it first
began to replace analog systems. There was some resistance to the
technology because it was sure to sound artificial: after all,
you were taking the music apart into discrete steps and putting
it back together again. Obviously, a system which broke a
waveform down into a discrete step can't ever really reproduce
exactly the same waveform as the original. And that's true, but
what they missed was the fact that analog systems can't ever
reproduce exactly the same waveform as the original either.
Both systems have limitations, in this case distortion of the
signal, and the true question should be not whether the proposed
new system has limitations, but whether the limitations of the
new system are worse or better. (The answer to that may depend
on the intended use.)
I think the same thing applies to flash devices. Yes, you may
have a hard drive that has been humming along for 5 years without
a problem, and that's fairly common, but hard drives do fail.
When I was a system admin, I saw my fair share of them. (I've
seen a few since then too.) The key in the case of flash is
probably to get in place a nice warning system that can take
advantage of the ability to notice that spare blocks are being
depleted and warn the user when failure of the device is nearing.
I haven't researched it carefully, but perhaps SMART
would be useful for this in some applications, such as where
flash is replacing hard disks.
Seems to me the best use of this technology is to do something
that nobody has ever been able to do with a computer before: make
a realistic pinball game, one where you can actually nudge the
machine to control the ball (and risk getting a tilt).
Now Intel's comeback means we're seeing the start of a new growth of CPU power, this time into multi-core land, a nice solid metric on which to compete. You can fudge the Ghz but you can't really fudge the number of cores.
Sure you can. And as a matter of fact, the trail to do it has
already been blazed.
Namely, Sun's Niagara processor (i.e. UltraSPARC T1) has 8 cores
on a die and 4-way hyperthreading (to use Intel's terminology)
per core. The goal is maximum throughput, and I'm a fan of
the processor. But make no mistake: the 8-core chip isn't
8 times as fast as other SPARC single-core chips. Instead,
the cores are stripped down. The idea is to make a core that's
fast, but not state of the art and super sophisticated, on the
theory that the smaller you make each core, the more cores
you can fit on a die and that more cores == better for certain
workloads.
So each core on a Niagara chip is fairly unsophisticated. I
don't know the exact technical details, but we can start with
one thing that most cores have that a Niagara core doesn't have:
an FPU. Instead, there is an FPU that is shared among all 8
cores. This makes perfect sense considering the goal was to
build a chip that can do stuff like web servers and databases
with the best throughput possible, and both of those rarely
if ever use floating point.
But, I'm sure there are other ways
they have economized in the cores as well: modern superscalar
processors have all kinds of clever tricks like dispatching
operations to more than one ALU at once, branch prediction,
deep pipelines, speculative execution, SIMD operations (MMX,
SSE, AltiVec), and when making a multi-core system, you could
easily leave out some of the more expensive (in terms of die
real estate) items and make a simpler core. Maybe you put
2 ALUs instead of 3, or maybe you just reduce the amount of
L1 cache a little bit.
Whether any of this would actually happen in competition between
AMD and Intel is another question. Somebody will do benchmarks,
and the truth will out if they skimp on features per core. But
if the competition reaches a point where there is pressure to get
8 or even 16 cores on a chip, I guess it could happen that they
might start cutting corners on individual cores to reach the
overriding goal of more cores. On the other hand, designing a
whole new core is quite an undertaking, so the pressure to do
this would have to exist for a while before they'd bother, probably.
So I would incur obligations because someone else has entered into this contract? This is a horrible abuse of the word contract. I few problems with the constitutional democracy you describe. But I do have big problems with it being labeled a 'contract'.
I looked up "contract" in the Wikipedia (that you linked to) and also
in a traditional dictionary. Both seemed to agree the essential
characteristics of a contract is that it's an agreement and it's
enforceable by law.
Since constitutional government fits this definition easily, I
will have to assume the problem you have is with the idea that
a group of people could enter into a contract rather than
a contract being between individuals. That's a bit of a
philosophical question, so I suppose I can't ever answer it
fully, but I will say this: there are times when decisions
must be made as a group if there is to be any hope of having
a good outcome.
For example, suppose you and 3 of your friends have decided to
take a trip across the desert. You hire a driver and all
hop in his car. You've driven for 4
hours through desert and have another 6 to drive until you
reach civilization again. You're hoping for some kind of fun
outcome if you manage to cross the desert, but a sign has just
informed you of the distance to the next gas station and it's
far enough that the driver believes you have a good
chance of running out of gas before you get there. So, you
have a choice: you can either drive on and take the risk, or
you can turn around. If you drive onwards, you might end up
stranded in the middle of the desert, but you also might end
up reaching your destination just fine. If you turn back, you
should be able to reach another gas station on your way home
(early) without significant risk, but you will definitely not
have time to make it to your intended destination and your
trip will be ruined. The driver wishes to be paid an extra
$100 to press onwards because of the extra risk, but he will
return home early for $50 less than the prices you agreed upon
when you hired him originally (because of the shorter trip).
In this example, the 4 of you must decide the issue together.
The car can either go forward or turn back; it cannot do both.
It could probably do some other third thing, like sit on the
side of the road and wait forever until you all starve while
trying to make up your minds, but that wouldn't benefit anyone.
When you do make up your mind, you will have to, as a group,
make an agreement with the driver about what you are going to do.
So, to me, the idea of a group entering into a contract makes
sense. It's something that happens every day in the real world.
Still, the point here is not whether every individual has given
their consent. Instead, the point is the terms under which
the rulers have been given their power. In some forms of
government, the rulers' power is not limited; it is absolute.
The point of saying government by contract is not whether
any one individual has the right to veto the whole thing.
Instead, the point is that the government's powers are
limited to what is spelled out in the contract. The government
is there, in theory, to do only what the contract says; nothing
more, and nothing less. Their powers are not arbitrary. They
are explicit and only exist because they have been granted
through contract, not because the rulers have some kind of
right due to their social class, their family line, or anything
else.
When do Americans sign this contract? What happens to people who decide not to sign this contract? What room do individual Americans have to negotiate the precise terms of this contract? What happens to Americans who renege on this contract?
It is collective bargaining (just like what labor unions engage in).
The decision isn't an individual one. The contract is between the
people, collectively, and the government.
Nevertheless, the individuals do get a vote in what
the decision is.
In some cases, the vote is explicit. When the original 13 colonies
united, they voted on whether to ratify the Articles of Confederation
and then the US Constitution. Changes were made as a result of the
vote; indeed, the Bill of Rights had to be added to the Constitution
in order for it to be approved.
The observant person will probably notice that there are now 50
states. The other 37 states each voted on whether to join the
Union. That is when individuals got the most direct input
into whether they wanted to agree to the contract. I certainly
don't remember all the details, but I believe in many cases the
vote on whether to join the Union was a popular vote (not a vote
of a representative body).
The power to vote on changes to the Constitution remains, in
some sense, still to this day. If a constitutional amendment
is proposed, it must be approved not (just) by the US Congress
(both houses) but also by the states. As I understand it, the
states are free to determine internally how they conclude
whether or not to approve the amendment. A state could, I
believe, put it to a popular vote if they chose to do so.
That decision is up to the individual state, which of course
depends on how the state's constitution has been written.
Generally speaking, I believe state constitutions follow a
similar pattern: the constitution can be amended if the
people or the legislature feels it needs to be changed,
whatever the system may be.
So basically, individuals have a say in how the government
is working for them, and if there is a movement to have
the way the government works changed, individuals get a
vote in that. They don't each individually get to decide
on their own set of rules, but they do each get a vote on
what the set of rules (that applies to everybody) will be.
So of course there is some tyranny of the majority, but
no system is perfect...
And anybody who talks about "stress factors" like being pilloried in front of millions of people or facing spending the rest of his life in prison, is just spreading misinformation.
Wow, it's not often that one gets the opportunity to work a
vocabulary word like "pilloried" into a sentence. I've been
waiting for a natural opportunity to use that word for years
and haven't gotten one. I guess all I can really say is,
Kenneth Lay may have found a way to avoid going to prison,
but it was definitely a Pyrrhic victory.
Drag, the need to bring fuel with you, weight of engines, etc. -- all
very good points. I was thinking, however, of something more like a
big underground (or above ground, whatever) tube with electromagnets
bringing the craft up to escape velocity near the surface. Then it
just coasts the rest of the way.
I can't think of any clever way around air friction, though. And
doing the math, if I want to reach 11200 m/s without accelerating
faster than 5*g at any time, then I need at least a distance of
1280 km to do my accelerating over. I'm now talking about either
building a phenomenally tall tower or digging hundreds of km into
the earth to build my tube that has the electromagnets slinging
the thing into orbit. So the cost would be fairly high. I'm
not even sure we have the technology to dig that far down and
build a stable structure. (That's a significant percentage of
the diameter of the Earth, actually...)
As a non-american, I'm just curious. What independence are you celebrating?
What is it that you gained independence from? Are you still independent of it today?
I'm just going to give this a straightforward answer. I think
there may be some anti-US subtext going on in your comment, but
it's so short I'm not going to read that into it, or tease it
out, as the case may be.
So, the answer is, the thing we are celebrating our independence
from, most specifically, is British rule. As someone else has
already pointed out, July 4, 1776 is the date of the public
announcement of the signing of the Declaration of Independence.
(It was signed a few days before July 4th.)
A little less specifically, we are celebrating our independence
from colonial rule. This is something about a zillion other
countries do, on account of so many countries being former
colonies. You can count India, Australia, 90+% of the
countries in Africa,
90+% of the countries in South America, and several other
countries as members of the club of former colonies.
More philsophically, the US is
celebrating its independence from monarchy, and not
just monarchy specifically, but all forms of arbitrary,
non-representative government in general. The government
of the US is explicitly a contract between the people and
the state. The state's power is justified because the
people have given it the power, rather than (say) divine
right or tradition. There are term limits on most offices,
regular elections, and just about any regular person can
stand for office: there is no need to be royalty or to be
a member of a ruling class. Indeed, the US Constitution
explicity forbids the granting of any "title of nobility".
Whether all this idealistic stuff really represents the
way things work in reality is another question. A decent
argument can be made that the US declared independence
because it didn't want to pay taxes to Britain back home
and it
thought it could get away with it. That a constitutional
government was set up afterwards might not have been the
main point, although it was a good thing. In fact, it
wasn't until after the Revolution was sucessful and we
were independent that it was even determined what independence
would mean and what we had fought for. The US Constitution
wasn't even ratified until after the Articles of Confederation
failed. In a sense, we are United States 2.0, because United
States 1.0 was a failure after about a decade. And even after
the Constitution was put in place, it took a few decades before
we really had decided how the country was going to operate.
One could argue that our national identity wasn't really
defined until Jefferson's presidency, which started a full 25
years after the Declaration of Independence.
So basically, we are celebrating independence from Britain,
independence from colonialism, and independence from arbitrary,
non-respresentative rule. We are still independent of all
three of these things, mostly. In fact, most of the rest of
the world is free of them now, too. There are still some
monarchies in the world, but most of them (such as Britain)
are in name only. Liberalism and democracy are virtually
the norm in governments these days.
Rutan makes many points to ponder - which highlight questions I myself have wondered. For instance, why can't I fly to space yet? Why is it so hard?
You know, I was going to say it's because it takes an absolute
shitload of energy. You've got to overcome the Earth's gravity.
The energy required is the integral of the force over the distance,
and there is a lot of force (gravity) and a WHOLE lot of distance.
So it seems like if you do the math, it's just really, really
terribly difficult to imagine it ever becoming affordable.
Doing some quick calculations, the escape velocity of the Earth
seems to be 11.2 km/s. Let's assume you have a very light
craft which only takes one person into space and has a mass of
only 100 kg including the passenger, requires no energy for
life support, has no air friction, etc., etc.
Then, 11.2 km/s and 100 kg should determine the energy required
to escape the Earth's gravitation pretty accurately.
To reach that speed, you'd require 0.5 * 11200^2 (m/s)^2 * 100 kg
of energy, which is about 6.27 billion joules. Seems like a huge
amount. Got to cost a LOT.
But let's assume you can somehow convert electrical energy from
the grid into the energy required to hit that speed. Maybe you
build yourself a big old linear accelerator with electromagnets
or something. Kind of a vertical bullet train thing. And let's
assume you pay $0.10 per kilowatt-hour, which is about what I pay.
It turns out 6.27 billion joules is about 1750 kilowatt-hours.
At $0.10 per, that's only $175.00. One hundred and seventy-five
dollars. That's coincidentally what I paid for electricity this
last month!
And, if I remember correctly from my college physical class, the
amount of energy to reach orbit is exactly half the energy required
to escape the gravitational pull. That means you actually only
need $87.50, or about $90 in energy (if you can get it as electricity)
to reach orbit! (Of course, you need some energy to get back out
of orbit, but there are ways of handling that...)
So... holy cow... can it really be that cheap? $90 worth of
energy as an absolute minimum to go to space!? That's less money
than I'd spend for gas on some road trips! Can anyone spot a
flaw in my calculations, or is it really that small an amount
of energy that's absolutely required?
... even if I had the chance to work in Microsoft.
So would I. I would still use google even if given a chance
to work at Microsoft. Of course, that probably has something
to do with the fact that, if they offered me a job, I wouldn't
take it.
You can call me dogmatic, but I have a very practical reason
for not wanting to work at Microsoft: I've spent the last
week or so reading up on SMB and NetBIOS. Egads this
stuff is messed up. I had almost come to believe that the
stuff about Microsoft software being crap was just bias from
open source advocates, but the more I learn about it, the
more I realize how truly aweful and stupid it is. And how
does this relate to my practical reason for not wanting to
work at Microsoft? The reason is, if I worked at Microsoft,
there's a reasonable
chance I'd end up having to maintain some
of this crap. No thank you. They made the bed,
and I think I'll leave them to lie in it.
The purpose is not to stop terrorists. It's abundantly clear that the measures that have been taken are ineffective at doing so. The purpose of airline security is assure middle America that Something Is Being Done.
I'll go you one further: the government to some extent
probably
feels like it is doing the right thing by taking decisive
action (as opposed to carefully evaluating what is the best
approach), but perhaps the main reason the government
wants people to feel like something is being done is
that the government is trying to help out the air travel
industry (airlines, airports, etc.), which suffered
extremely difficult times financially after 9/11.
Or to put it another way, it's a public relations campaign conducted
for free by the US government on behalf of the airlines.
Never, EVER, use 192.168.1.x for an internal network. Roll some dice, pick numbers out of a hat, or anything to pick something different for that 3rd octet. You have nobody to blame for that configuration problem except yourself.
Sure, that's mostly effective. If people pick the third octet
at random, that will avoid a lot of collisions. Not all of
them (think of the birthday paradox, and there are only 256 possible
third octets, compared to 365 possible days in a year), but it
will reduce the odds a lot.
However, in my opinion, this is one of those areas where you
can think of ways around problems, but the fundamental truth
of the situation is that the design of IPv4 isn't really
working well for the current needs, and all these little
tricks (like thinking to choose the third octet randomly)
are just coping mechanisms. If IPv6 were in wide use, you
would just have unique numbers and there would be no need
to play games with choosing random octets to avoid
collisions.
Now, having said that, in my particular case at the site where
I am the admin, I didn't choose 192.168.1.0/24, but some
previous admin did back when the company was really small,
and now I'd have to renumber the entire network to get us
off of that. Did I mention that some of the hosts on the
network are in an office over 1000 miles away? Yes, it's
possible to fix this, but most likely we will just
live with it instead, because the benefits of fixing it
don't outweigh the cost.
Of course, if it were me, I never would've picked any block
out of 192.168.0.0/16. I would've picked something out of
10.0.0.0/8, and if I had been smart, I would've picked the
middle two octets at random.
I just wondered, why are pounds written as "lbs"? I found the answer here
I already looked into that. My dad and my uncle, when they were
fairly young kids (maybe 6 or 8?) got a job selling some kind of
fruit or something door to door, and they did their darndest
trying to sign people up to buy this or that many "lubs" of fruit.
Much to many of the neighbors' amusement.
I myself heard that story when I was a kid, so I got curious
about it and, I think, asked my teacher at school why it was
written "lbs." anyway, and ended up finding out the Libra
answer.
4.64371564×10^27 atomic mass units, for the physicists
Or a little over 0.15 zentner for Germans who don't like these
newfangled metric units.
(Or for people who are bored enough to go digging through the
output of strings/usr/bin/units and use that as a
launching point for some creative google-based time wasting.)
I honestly don't understand the hard-on a lot of people seem to have for IPv6. I LIKE NAT. I thinks it's neat. I like the idea that my systems can have un-real IP addresses. IP addresses that can actually change!
IP addresses that can conflict with the range of addresses that
some Internet cafe chose when you
try to VPN into your network from outside! Conflicts that cause
routing nightmares! Hey, my home network and Starbucks are
both using 192.168.1.0/24 so it's impossible to tell
the difference between my192.168.1.99 and the
192.168.1.99 that another Starbuck's customer is
using! Yay!;-)
Seriously though, the public side of the NAT has to have a
routable address. With IPv6, you could have a routable
address for the hosts on your private network, but you don't
have to have that address visible in any packets that leave
your private network. You can still do NAT, and your routable
addresses won't be visible to the outside world, just like
your 192.168.1.0/24 addresses aren't visible to
the outside world right now.
Remember that this is Sweden, not USA we talking about, in here the police doesn't have any more leeway when it comes to laws than normal citicens.
So in Sweden, if the speed limit is 100 km/h and if
a policeman behind you sees you going 110 km/h, he
can't exceed the speed limit in order
to catch up with you and give you a ticket?
Have you dug a bit to find out why he's so pro-VB6? Maybe he's biased against.net because it's an interpreted language (like Java)?
Aiiighghghghhhhh!!!! Why, why, why do people keep
saying this?!
Java is a compiled language. The Java source
you write gets turned into native machine code.
It's just that the compilation happens at runtime,
unlike with many other languages where it happens
earlier. Same process, different time.
It's not like this is a new concept. For one
thing, the documentation describing it has been
up on the Java web site for years. For another
thing, people on Slashdot have been saying it
for years. And for another thing, LISP environments
that do incremental compilation to machine code
at runtime have been around for at least, what, 15
years? Some quick googling indicates that
language
environments that compile stuff to native machine
code at runtime have been around since 1968.
And heck, it's not as if it's even all that high
tech or complicated in certain ways. You don't
need something as esoteric as the internals of a
JVM to see machine code being generated at runtime.
If you want to see it happen on something simple,
go to your nearest Unix or Linux machine and type
"tcpdump -d not port 53". Notice that it
spits out machine code? Now try some different
filter expressions like "not host 127.0.0.1"
or "host 127.0.0.1 and tcp and port 25"
and watch how the assembly code changes. Yes,
that's right -- even tcpdump compiles code
at runtime, at least it does so with the
packet-matching code, which is where the speed is
really needed.
So hopefully it's not too hard to comprehend now
that modern JVMs do the same thing, and as far as
I know, so does the.NET virtual machine.
That's two data points, and "bulging" implies a highly irregular shape, or at least an even shape that couldn't be accurately modeled by two data points.
Wouldn't it be equally as logical to say that it's just expanding/contracting? How can they know with only two points?
I would like to point out that with two data points,
there is sufficient information to conclude
that
the heliopause has an irregular shape. However,
having only two data points means we don't have
sufficient information to determine which dimension
the irregularity is in: space or time.
Let them use any tool that allows them to compile the
code properly. Choose one or two tool sets (perhaps
one IDE tool set and one non-IDE one) to recommend,
and provide instructions for those two. Make it
clear that although they can use anything they want,
you can't guarantee that you can help them with
questions unless they are using one of the
recommended ones. Explain the advantages and
disadvantages of both so students can make an
informed decision.
Being flexible has the advantage that students will
learn to make choices that affect their ability to
get things done. They can judge based on their
experiences and their classmates' experiences whether
they've made the best choice or not. If they've
never used anything but an IDE and they want
to learn about the command line, they can. If they
don't want to or aren't at the level where they're
ready, they don't have to. But those who are ready
and who are interested can learn more of the guts of
the compilation process. Also, even if most students
don't choose the command line, the fact that some
students do choose it (hopefully) might create
awareness that it's an option. The act of thinking
about the choices educates them no matter which
they pick.
Basically, unless I understand the purpose of the
course wrong, learning about the compilation process
isn't one of the core goals. Some people won't be
ready for that and it will only frustrate them for
little gain if any (it might be a net loss if the
frustration prevents them from learning everything
else), so making it optional relieves that problem
but allows those who want to learn something extra
to learn it.
(For what it's worth, I originally learned on an
IDE: it was Turbo Pascal 3.0. Worked well. I
learned to use vi and cc (no,
not gcc, yet) soon enough.)
There was a company that used to sell greyscale X displays (Wyse? I'm not sure) long before 1992.
Wyse did sell X terminals, but I believe NCD did it first.
And they were 1-bit (black and white, not greyscale), at
least the early ones were.
But, what do you think people hooked them up to
lots of the time?
Suns. What do you think served the bootp and tftp
protocols so
that the NCD could boot? Pretty often, it was Sun
machines.
Actually I meant like correcting the punctuation error with the newfound power of regular expressions. The fact that I used a sed-like (or perl-like) expression was just incidental and was only because that's the syntax I knew off the top of my head.
--- elided.example.com ping statistics ---
100 packets transmitted, 100 packets received, 0% packet loss
round-trip min/avg/max/stddev = 59.322/62.689/79.781/3.203 ms
These are ping times between me and a host that's about 1750 miles (2800 km) away. Note the minimum and maximum ping times here. Round-trip times for these 100 packets varied between about 59 ms and 80 ms. (I don't have data for single-direction packet travel times, but round-trip times will do for analysis. They aren't conceptually different -- it's all just network hops.) Anyway, if I add a 25 ms delay to those packets, then the delayed packets will be in the range roughly from 84 to 105 ms. The two ranges (59-80ms and 84-105ms) don't overlap, so if other packets behave like the 100 packets I measured, I should be able to get data through just fine. Of course, there are no guarantees on how long packets will be delayed, so there will be overlap between the ranges, but if it is infrequent, I can correct for it.
You're right, though, that if the network pipe is saturated, the delay is going to get all unpredictable. But TCP/IP doesn't work well at all with network pipes that are completely saturated, so people don't build networks like that, usually.
There may be several schemes that would work, but here's the simplest one I can think of off the top of my head. Basically, you figure out what the maximum delay that can go unnoticed is, and you buffer keystrokes for that length of time. For example, if you determine that nobody ever notices when a keystroke is delayed 100 ms, you buffer keystrokes for that long.
Now, if during that period of time you get multiple keystrokes, then you spit the keystrokes out of your queue with a predefined timing. If you want to send a 0, you might send the first keystroke out, then wait 50 ms, then send the second. If you want to send out a 1, then you might wait 75 ms between the keystrokes. So basically, you get opportunistic about it. Only if you have two keystrokes in a short period of time do you try to encode data in the timing.
But of course there will be times when the user is typing slowly, and you don't get 2 or more keystrokes in a short interval, but you still have to send them out. The solution to that problem is easy: if you aren't trying to send a 0 or 1, just make sure you never send out any keystroke sooner than 100 ms after you sent the last one. Now you have a system where (at the remote end), if you see two packets arrive about 50 ms apart, that's a 0, and if you have two arrive about 75 ms apart, that's a 1, and if you have two arrive about 100 ms or more apart, that's no data (a no-op).
And of course you want all kinds of redundancy built in because the network and the TCP/IP stack and the operating system will add lots of noise and corruption to your covert data stream, so you'll have to piece it back together. But that's an easy enough problem provided you don't mind reducing the bandwidth even further than what it is already is.
Oh, speaking of bandwidth, you can probably encode more than one bit per keystroke pretty easily. Coincidentally enough, today I was observing network latency between two sites about 1000 miles apart, and I noticed that even though the latency was usually around 70 ms, the standard deviation seemed to be much lower, down around 2 or 3 ms. So in this case, depending on how much you want to delay things (you can't delay things so much that an average typist can outpace you!), you could use one of a set of several different delays between keystrokes. You might encode 3 bits by doing intervals spaced 5 ms apart. So, 50 ms for 000, 55 ms for 001, 60 ms for 010, 65 ms for 011, ..., 85 ms for 111,
and 110 ms for no-op. (Things get complicated, but I'm assuming
you'd want a bigger gap between no-op and the others since no-op
will occur very frequently.)
And now to celebrate this new-found ability to manipulate strings easily:
s/trench,/trench/;
Ah, I knew that would make me feel better.
I thought I'd seen specs an order of magnitude larger than that in many cases, but the problem still may not be as bad as you think in many cases even if it is as bad as 100000 writes. The reason? Flash devices have systems built in to their controllers specifically to deal with these problems. The mechanisms may vary, but the ones I know about are wear leveling and excess capacity (beyond the capacity that the device reports to the operating system) that can be pressed into service when a block fails.
Briefly, wear leveling means that if you write to the same logical address over and over, the controller will map that write to different physical addresses each time. That means that you can't wear out the device by rewriting the same file over and over again; instead, you only add a little bit of wear to each physical block on the flash device. The concept is a little bit like rotating the tires on your car except that it's a more dramatic win since write patterns can be much more uneven than wear on tires on a car.
The other mechanism for mitigating the effects of limited flash life is putting excess capacity aside (so that it's not reported to the OS) to be used when a physical block does fail. Since it's a matter of probability just which write will cause a given block to fail (meaning that some will fail after less than 100,000 writes and some will probably last much longer), even with wear leveling it's unlikely that all blocks will fail at once. It should be easy to tell when the pool of spare blocks is nearing exhaustion and give you advanced warning that your flash device is wearing out. So in that sense, it is actually safer than hard drives, which tend to fail without warning.
Finally, this whole thing reminds me of the reaction some people (mostly audiophiles) had to compact discs, and digital audio in general, when it first began to replace analog systems. There was some resistance to the technology because it was sure to sound artificial: after all, you were taking the music apart into discrete steps and putting it back together again. Obviously, a system which broke a waveform down into a discrete step can't ever really reproduce exactly the same waveform as the original. And that's true, but what they missed was the fact that analog systems can't ever reproduce exactly the same waveform as the original either. Both systems have limitations, in this case distortion of the signal, and the true question should be not whether the proposed new system has limitations, but whether the limitations of the new system are worse or better. (The answer to that may depend on the intended use.)
I think the same thing applies to flash devices. Yes, you may have a hard drive that has been humming along for 5 years without a problem, and that's fairly common, but hard drives do fail. When I was a system admin, I saw my fair share of them. (I've seen a few since then too.) The key in the case of flash is probably to get in place a nice warning system that can take advantage of the ability to notice that spare blocks are being depleted and warn the user when failure of the device is nearing. I haven't researched it carefully, but perhaps SMART would be useful for this in some applications, such as where flash is replacing hard disks.
Seems to me the best use of this technology is to do something that nobody has ever been able to do with a computer before: make a realistic pinball game, one where you can actually nudge the machine to control the ball (and risk getting a tilt).
Sure you can. And as a matter of fact, the trail to do it has already been blazed.
Namely, Sun's Niagara processor (i.e. UltraSPARC T1) has 8 cores on a die and 4-way hyperthreading (to use Intel's terminology) per core. The goal is maximum throughput, and I'm a fan of the processor. But make no mistake: the 8-core chip isn't 8 times as fast as other SPARC single-core chips. Instead, the cores are stripped down. The idea is to make a core that's fast, but not state of the art and super sophisticated, on the theory that the smaller you make each core, the more cores you can fit on a die and that more cores == better for certain workloads.
So each core on a Niagara chip is fairly unsophisticated. I don't know the exact technical details, but we can start with one thing that most cores have that a Niagara core doesn't have: an FPU. Instead, there is an FPU that is shared among all 8 cores. This makes perfect sense considering the goal was to build a chip that can do stuff like web servers and databases with the best throughput possible, and both of those rarely if ever use floating point.
But, I'm sure there are other ways they have economized in the cores as well: modern superscalar processors have all kinds of clever tricks like dispatching operations to more than one ALU at once, branch prediction, deep pipelines, speculative execution, SIMD operations (MMX, SSE, AltiVec), and when making a multi-core system, you could easily leave out some of the more expensive (in terms of die real estate) items and make a simpler core. Maybe you put 2 ALUs instead of 3, or maybe you just reduce the amount of L1 cache a little bit.
Whether any of this would actually happen in competition between AMD and Intel is another question. Somebody will do benchmarks, and the truth will out if they skimp on features per core. But if the competition reaches a point where there is pressure to get 8 or even 16 cores on a chip, I guess it could happen that they might start cutting corners on individual cores to reach the overriding goal of more cores. On the other hand, designing a whole new core is quite an undertaking, so the pressure to do this would have to exist for a while before they'd bother, probably.
I looked up "contract" in the Wikipedia (that you linked to) and also in a traditional dictionary. Both seemed to agree the essential characteristics of a contract is that it's an agreement and it's enforceable by law.
Since constitutional government fits this definition easily, I will have to assume the problem you have is with the idea that a group of people could enter into a contract rather than a contract being between individuals. That's a bit of a philosophical question, so I suppose I can't ever answer it fully, but I will say this: there are times when decisions must be made as a group if there is to be any hope of having a good outcome.
For example, suppose you and 3 of your friends have decided to take a trip across the desert. You hire a driver and all hop in his car. You've driven for 4 hours through desert and have another 6 to drive until you reach civilization again. You're hoping for some kind of fun outcome if you manage to cross the desert, but a sign has just informed you of the distance to the next gas station and it's far enough that the driver believes you have a good chance of running out of gas before you get there. So, you have a choice: you can either drive on and take the risk, or you can turn around. If you drive onwards, you might end up stranded in the middle of the desert, but you also might end up reaching your destination just fine. If you turn back, you should be able to reach another gas station on your way home (early) without significant risk, but you will definitely not have time to make it to your intended destination and your trip will be ruined. The driver wishes to be paid an extra $100 to press onwards because of the extra risk, but he will return home early for $50 less than the prices you agreed upon when you hired him originally (because of the shorter trip).
In this example, the 4 of you must decide the issue together. The car can either go forward or turn back; it cannot do both. It could probably do some other third thing, like sit on the side of the road and wait forever until you all starve while trying to make up your minds, but that wouldn't benefit anyone. When you do make up your mind, you will have to, as a group, make an agreement with the driver about what you are going to do. So, to me, the idea of a group entering into a contract makes sense. It's something that happens every day in the real world.
Still, the point here is not whether every individual has given their consent. Instead, the point is the terms under which the rulers have been given their power. In some forms of government, the rulers' power is not limited; it is absolute. The point of saying government by contract is not whether any one individual has the right to veto the whole thing. Instead, the point is that the government's powers are limited to what is spelled out in the contract. The government is there, in theory, to do only what the contract says; nothing more, and nothing less. Their powers are not arbitrary. They are explicit and only exist because they have been granted through contract, not because the rulers have some kind of right due to their social class, their family line, or anything else.
It is collective bargaining (just like what labor unions engage in). The decision isn't an individual one. The contract is between the people, collectively, and the government. Nevertheless, the individuals do get a vote in what the decision is.
In some cases, the vote is explicit. When the original 13 colonies united, they voted on whether to ratify the Articles of Confederation and then the US Constitution. Changes were made as a result of the vote; indeed, the Bill of Rights had to be added to the Constitution in order for it to be approved.
The observant person will probably notice that there are now 50 states. The other 37 states each voted on whether to join the Union. That is when individuals got the most direct input into whether they wanted to agree to the contract. I certainly don't remember all the details, but I believe in many cases the vote on whether to join the Union was a popular vote (not a vote of a representative body).
The power to vote on changes to the Constitution remains, in some sense, still to this day. If a constitutional amendment is proposed, it must be approved not (just) by the US Congress (both houses) but also by the states. As I understand it, the states are free to determine internally how they conclude whether or not to approve the amendment. A state could, I believe, put it to a popular vote if they chose to do so. That decision is up to the individual state, which of course depends on how the state's constitution has been written. Generally speaking, I believe state constitutions follow a similar pattern: the constitution can be amended if the people or the legislature feels it needs to be changed, whatever the system may be.
So basically, individuals have a say in how the government is working for them, and if there is a movement to have the way the government works changed, individuals get a vote in that. They don't each individually get to decide on their own set of rules, but they do each get a vote on what the set of rules (that applies to everybody) will be. So of course there is some tyranny of the majority, but no system is perfect...
Wow, it's not often that one gets the opportunity to work a vocabulary word like "pilloried" into a sentence. I've been waiting for a natural opportunity to use that word for years and haven't gotten one. I guess all I can really say is, Kenneth Lay may have found a way to avoid going to prison, but it was definitely a Pyrrhic victory.
Drag, the need to bring fuel with you, weight of engines, etc. -- all very good points. I was thinking, however, of something more like a big underground (or above ground, whatever) tube with electromagnets bringing the craft up to escape velocity near the surface. Then it just coasts the rest of the way.
I can't think of any clever way around air friction, though. And doing the math, if I want to reach 11200 m/s without accelerating faster than 5*g at any time, then I need at least a distance of 1280 km to do my accelerating over. I'm now talking about either building a phenomenally tall tower or digging hundreds of km into the earth to build my tube that has the electromagnets slinging the thing into orbit. So the cost would be fairly high. I'm not even sure we have the technology to dig that far down and build a stable structure. (That's a significant percentage of the diameter of the Earth, actually...)
I'm just going to give this a straightforward answer. I think there may be some anti-US subtext going on in your comment, but it's so short I'm not going to read that into it, or tease it out, as the case may be.
So, the answer is, the thing we are celebrating our independence from, most specifically, is British rule. As someone else has already pointed out, July 4, 1776 is the date of the public announcement of the signing of the Declaration of Independence. (It was signed a few days before July 4th.)
A little less specifically, we are celebrating our independence from colonial rule. This is something about a zillion other countries do, on account of so many countries being former colonies. You can count India, Australia, 90+% of the countries in Africa, 90+% of the countries in South America, and several other countries as members of the club of former colonies.
More philsophically, the US is celebrating its independence from monarchy, and not just monarchy specifically, but all forms of arbitrary, non-representative government in general. The government of the US is explicitly a contract between the people and the state. The state's power is justified because the people have given it the power, rather than (say) divine right or tradition. There are term limits on most offices, regular elections, and just about any regular person can stand for office: there is no need to be royalty or to be a member of a ruling class. Indeed, the US Constitution explicity forbids the granting of any "title of nobility".
Whether all this idealistic stuff really represents the way things work in reality is another question. A decent argument can be made that the US declared independence because it didn't want to pay taxes to Britain back home and it thought it could get away with it. That a constitutional government was set up afterwards might not have been the main point, although it was a good thing. In fact, it wasn't until after the Revolution was sucessful and we were independent that it was even determined what independence would mean and what we had fought for. The US Constitution wasn't even ratified until after the Articles of Confederation failed. In a sense, we are United States 2.0, because United States 1.0 was a failure after about a decade. And even after the Constitution was put in place, it took a few decades before we really had decided how the country was going to operate. One could argue that our national identity wasn't really defined until Jefferson's presidency, which started a full 25 years after the Declaration of Independence.
So basically, we are celebrating independence from Britain, independence from colonialism, and independence from arbitrary, non-respresentative rule. We are still independent of all three of these things, mostly. In fact, most of the rest of the world is free of them now, too. There are still some monarchies in the world, but most of them (such as Britain) are in name only. Liberalism and democracy are virtually the norm in governments these days.
You know, I was going to say it's because it takes an absolute shitload of energy. You've got to overcome the Earth's gravity. The energy required is the integral of the force over the distance, and there is a lot of force (gravity) and a WHOLE lot of distance. So it seems like if you do the math, it's just really, really terribly difficult to imagine it ever becoming affordable.
Doing some quick calculations, the escape velocity of the Earth seems to be 11.2 km/s. Let's assume you have a very light craft which only takes one person into space and has a mass of only 100 kg including the passenger, requires no energy for life support, has no air friction, etc., etc. Then, 11.2 km/s and 100 kg should determine the energy required to escape the Earth's gravitation pretty accurately.
To reach that speed, you'd require 0.5 * 11200^2 (m/s)^2 * 100 kg of energy, which is about 6.27 billion joules. Seems like a huge amount. Got to cost a LOT.
But let's assume you can somehow convert electrical energy from the grid into the energy required to hit that speed. Maybe you build yourself a big old linear accelerator with electromagnets or something. Kind of a vertical bullet train thing. And let's assume you pay $0.10 per kilowatt-hour, which is about what I pay. It turns out 6.27 billion joules is about 1750 kilowatt-hours. At $0.10 per, that's only $175.00. One hundred and seventy-five dollars. That's coincidentally what I paid for electricity this last month!
And, if I remember correctly from my college physical class, the amount of energy to reach orbit is exactly half the energy required to escape the gravitational pull. That means you actually only need $87.50, or about $90 in energy (if you can get it as electricity) to reach orbit! (Of course, you need some energy to get back out of orbit, but there are ways of handling that...)
So... holy cow... can it really be that cheap? $90 worth of energy as an absolute minimum to go to space!? That's less money than I'd spend for gas on some road trips! Can anyone spot a flaw in my calculations, or is it really that small an amount of energy that's absolutely required?
So would I. I would still use google even if given a chance to work at Microsoft. Of course, that probably has something to do with the fact that, if they offered me a job, I wouldn't take it.
You can call me dogmatic, but I have a very practical reason for not wanting to work at Microsoft: I've spent the last week or so reading up on SMB and NetBIOS. Egads this stuff is messed up. I had almost come to believe that the stuff about Microsoft software being crap was just bias from open source advocates, but the more I learn about it, the more I realize how truly aweful and stupid it is. And how does this relate to my practical reason for not wanting to work at Microsoft? The reason is, if I worked at Microsoft, there's a reasonable chance I'd end up having to maintain some of this crap. No thank you. They made the bed, and I think I'll leave them to lie in it.
I'll go you one further: the government to some extent probably feels like it is doing the right thing by taking decisive action (as opposed to carefully evaluating what is the best approach), but perhaps the main reason the government wants people to feel like something is being done is that the government is trying to help out the air travel industry (airlines, airports, etc.), which suffered extremely difficult times financially after 9/11.
Or to put it another way, it's a public relations campaign conducted for free by the US government on behalf of the airlines.
Wouldn't that be pastry Irish ancestry then?
Part of me wants to offer my own /rimshot after that, but
then my joke was bad enough on its own that I'm sure I
have the will to go through with it.
Sure, that's mostly effective. If people pick the third octet at random, that will avoid a lot of collisions. Not all of them (think of the birthday paradox, and there are only 256 possible third octets, compared to 365 possible days in a year), but it will reduce the odds a lot.
However, in my opinion, this is one of those areas where you can think of ways around problems, but the fundamental truth of the situation is that the design of IPv4 isn't really working well for the current needs, and all these little tricks (like thinking to choose the third octet randomly) are just coping mechanisms. If IPv6 were in wide use, you would just have unique numbers and there would be no need to play games with choosing random octets to avoid collisions.
Now, having said that, in my particular case at the site where I am the admin, I didn't choose 192.168.1.0/24, but some previous admin did back when the company was really small, and now I'd have to renumber the entire network to get us off of that. Did I mention that some of the hosts on the network are in an office over 1000 miles away? Yes, it's possible to fix this, but most likely we will just live with it instead, because the benefits of fixing it don't outweigh the cost.
Of course, if it were me, I never would've picked any block out of 192.168.0.0/16. I would've picked something out of 10.0.0.0/8, and if I had been smart, I would've picked the middle two octets at random.
I already looked into that. My dad and my uncle, when they were fairly young kids (maybe 6 or 8?) got a job selling some kind of fruit or something door to door, and they did their darndest trying to sign people up to buy this or that many "lubs" of fruit. Much to many of the neighbors' amusement.
I myself heard that story when I was a kid, so I got curious about it and, I think, asked my teacher at school why it was written "lbs." anyway, and ended up finding out the Libra answer.
Or a little over 0.15 zentner for Germans who don't like these newfangled metric units.
(Or for people who are bored enough to go digging through the output of strings /usr/bin/units and use that as a
launching point for some creative google-based time wasting.)
IP addresses that can conflict with the range of addresses that some Internet cafe chose when you try to VPN into your network from outside! Conflicts that cause routing nightmares! Hey, my home network and Starbucks are both using 192.168.1.0/24 so it's impossible to tell the difference between my 192.168.1.99 and the 192.168.1.99 that another Starbuck's customer is using! Yay! ;-)
Seriously though, the public side of the NAT has to have a routable address. With IPv6, you could have a routable address for the hosts on your private network, but you don't have to have that address visible in any packets that leave your private network. You can still do NAT, and your routable addresses won't be visible to the outside world, just like your 192.168.1.0/24 addresses aren't visible to the outside world right now.
So in Sweden, if the speed limit is 100 km/h and if a policeman behind you sees you going 110 km/h, he can't exceed the speed limit in order to catch up with you and give you a ticket?
Aiiighghghghhhhh!!!! Why, why, why do people keep saying this?!
Java is a compiled language. The Java source you write gets turned into native machine code. It's just that the compilation happens at runtime, unlike with many other languages where it happens earlier. Same process, different time.
It's not like this is a new concept. For one thing, the documentation describing it has been up on the Java web site for years. For another thing, people on Slashdot have been saying it for years. And for another thing, LISP environments that do incremental compilation to machine code at runtime have been around for at least, what, 15 years? Some quick googling indicates that language environments that compile stuff to native machine code at runtime have been around since 1968.
And heck, it's not as if it's even all that high tech or complicated in certain ways. You don't need something as esoteric as the internals of a JVM to see machine code being generated at runtime. If you want to see it happen on something simple, go to your nearest Unix or Linux machine and type "tcpdump -d not port 53". Notice that it spits out machine code? Now try some different filter expressions like "not host 127.0.0.1" or "host 127.0.0.1 and tcp and port 25" and watch how the assembly code changes. Yes, that's right -- even tcpdump compiles code at runtime, at least it does so with the packet-matching code, which is where the speed is really needed.
So hopefully it's not too hard to comprehend now that modern JVMs do the same thing, and as far as I know, so does the .NET virtual machine.
I would like to point out that with two data points, there is sufficient information to conclude that the heliopause has an irregular shape. However, having only two data points means we don't have sufficient information to determine which dimension the irregularity is in: space or time.
Let them use any tool that allows them to compile the code properly. Choose one or two tool sets (perhaps one IDE tool set and one non-IDE one) to recommend, and provide instructions for those two. Make it clear that although they can use anything they want, you can't guarantee that you can help them with questions unless they are using one of the recommended ones. Explain the advantages and disadvantages of both so students can make an informed decision.
Being flexible has the advantage that students will learn to make choices that affect their ability to get things done. They can judge based on their experiences and their classmates' experiences whether they've made the best choice or not. If they've never used anything but an IDE and they want to learn about the command line, they can. If they don't want to or aren't at the level where they're ready, they don't have to. But those who are ready and who are interested can learn more of the guts of the compilation process. Also, even if most students don't choose the command line, the fact that some students do choose it (hopefully) might create awareness that it's an option. The act of thinking about the choices educates them no matter which they pick.
Basically, unless I understand the purpose of the course wrong, learning about the compilation process isn't one of the core goals. Some people won't be ready for that and it will only frustrate them for little gain if any (it might be a net loss if the frustration prevents them from learning everything else), so making it optional relieves that problem but allows those who want to learn something extra to learn it.
(For what it's worth, I originally learned on an IDE: it was Turbo Pascal 3.0. Worked well. I learned to use vi and cc (no, not gcc, yet) soon enough.)
Wyse did sell X terminals, but I believe NCD did it first. And they were 1-bit (black and white, not greyscale), at least the early ones were.
But, what do you think people hooked them up to lots of the time? Suns. What do you think served the bootp and tftp protocols so that the NCD could boot? Pretty often, it was Sun machines.