UUID column as pimrary key?

Started by Dennis Gearonover 15 years ago75 messagesgeneral
Jump to latest
#1Dennis Gearon
gearond@sbcglobal.net

I haven't been able to find anywhere, easily, in the documentation using google
where a list of allowed data types for primary keys is.

So, UUIDs can be primary keys?
Any issues wtih them on sorting or paging of index tables, etc.?

Also, the documentation says that UUIDs are 128 bit value, but never explicitly
says that's how it's stored. Nor does it use one of the nice, blue headered
tables for UUID (or ENUM) showing storage and other attributes as it does for
numeric, character,boolean, date/time, binary, monetary, geometric, or network
types.

Dennis Gearon

Signature Warning
----------------
It is always a good idea to learn from your own mistakes. It is usually a better
idea to learn from others’ mistakes, so you do not have to make them yourself.
from 'http://blogs.techrepublic.com.com/security/?p=4501&tag=nl.e036'

EARTH has a Right To Life,
otherwise we all die.

#2David Wall
d.wall@computer.org
In reply to: Dennis Gearon (#1)
Re: UUID column as pimrary key?

We're using UUID for primary keys in PG 8.4 without any issues. I have
no real insights into the details or performance issues, but always
figured it was stored as a binary 128-bit value, but with added benefits
of being able to enter and view them using a standard string format. We
don't sort them as they have no real meaning for us.

Show quoted text

On 1/4/2011 11:07 AM, Dennis Gearon wrote:

I haven't been able to find anywhere, easily, in the documentation using google
where a list of allowed data types for primary keys is.

So, UUIDs can be primary keys?
Any issues wtih them on sorting or paging of index tables, etc.?

Also, the documentation says that UUIDs are 128 bit value, but never explicitly
says that's how it's stored. Nor does it use one of the nice, blue headered
tables for UUID (or ENUM) showing storage and other attributes as it does for
numeric, character,boolean, date/time, binary, monetary, geometric, or network
types.

#3Joshua D. Drake
jd@commandprompt.com
In reply to: Dennis Gearon (#1)
Re: UUID column as pimrary key?

On Tue, 2011-01-04 at 11:07 -0800, Dennis Gearon wrote:

I haven't been able to find anywhere, easily, in the documentation using google
where a list of allowed data types for primary keys is.

Anything that can be UNIQUE NOT NULL

So, UUIDs can be primary keys?

Yes.

JD

--
PostgreSQL.org Major Contributor
Command Prompt, Inc: http://www.commandprompt.com/ - 509.416.6579
Consulting, Training, Support, Custom Development, Engineering
http://twitter.com/cmdpromptinc | http://identi.ca/commandprompt

#4Chris Browne
cbbrowne@acm.org
In reply to: Dennis Gearon (#1)
Re: UUID column as pimrary key?

d.wall@computer.org (David Wall) writes:

We're using UUID for primary keys in PG 8.4 without any issues. I
have no real insights into the details or performance issues, but
always figured it was stored as a binary 128-bit value, but with added
benefits of being able to enter and view them using a standard string
format. We don't sort them as they have no real meaning for us.

In principle, this might be a reason to want to do the long-outstanding
work on hash indexes; with UUIDs, it mayn't be useful to sort the
values, but you *do* want to be able to validate that they're unique.
--
output = ("cbbrowne" "@" "gmail.com")
http://www3.sympatico.ca/cbbrowne/
"Computers are like air conditioners: They stop working properly if
you open windows."

#5Radosław Smogura
rsmogura@softperience.eu
In reply to: Dennis Gearon (#1)
Re: UUID column as pimrary key?

On Tue, 4 Jan 2011 11:07:00 -0800 (PST), Dennis Gearon
<gearond@sbcglobal.net> wrote:

I haven't been able to find anywhere, easily, in the documentation
using google
where a list of allowed data types for primary keys is.

So, UUIDs can be primary keys?
Any issues wtih them on sorting or paging of index tables, etc.?

Disadvantage
* aren't ordered in way as records are added to DB.
* 128bit length (PSQL stores them as 128bit value)
* slower to generate you need to use random number generator
* ... if you do select * on table with two uuids you will need to
scroll GUI to see data :)
* ... really unhandy if you want to make manual updates :)

Advantage:
* simple to generate, and 128bit random is almost globally unique,
* you have your id, before executing query, (in contrast to all this
autoincrement) so you may put it in dependant rows
* almost every platform has UUID generator

Advantage / disadvantage
* depending on UUID generator, UUID can store some "privacy"
information e.g. MAC address of your card, such UUID.

Personally I prefer pooled incremental id's. Fast, unique, you have Id
before query - but you need to write "code" by self.

Show quoted text

Also, the documentation says that UUIDs are 128 bit value, but never
explicitly
says that's how it's stored. Nor does it use one of the nice, blue
headered
tables for UUID (or ENUM) showing storage and other attributes as it
does for
numeric, character,boolean, date/time, binary, monetary, geometric,
or network
types.

Dennis Gearon

Signature Warning
----------------
It is always a good idea to learn from your own mistakes. It is
usually a better
idea to learn from others’ mistakes, so you do not have to make them
yourself.
from 'http://blogs.techrepublic.com.com/security/?p=4501&amp;tag=nl.e036&#39;

EARTH has a Right To Life,
otherwise we all die.

#6Craig Ringer
craig@2ndquadrant.com
In reply to: Radosław Smogura (#5)
Re: UUID column as pimrary key?

On 01/05/2011 07:31 PM, Radosław Smogura wrote:

* you have your id, before executing query, (in contrast to all this
autoincrement) so you may put it in dependant rows

Do you mean that with a UUID, you don't need to talk to the database at
all, you can generate an ID with no interaction with / involvement with
the database at all? Because other than that, there's not much
difference in how you normally work with them.

With a sequence, you might:

CREATE SEQUENCE x_id_seq;
CREATE TABLE x (
id integer PRIMIARY KEY DEFAULT nextval('x_id_seq'),
y integer
);
INSERT INTO x(y) VALUES (1);

With a uuid, you'd:

CREATE TABLE x (
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
y integer
);
INSERT INTO x(y) VALUES (1);

In either case, you can explicitly call the generator function for
seq/uuid - nextval(seqname) or uuid_generate_v4() respectively - or you
can omit the PK column in your inserts and let the database generate it.

Personally I prefer pooled incremental id's. Fast, unique, you have Id
before query - but you need to write "code" by self.

Many libraries / ORMs / etc that interact with Pg will happily take care
of this for you. In fact, I had to fight to convince Hibernate that I
*didn't* want it to increment all my counters in steps of 50.

--
Craig Ringer

#7Radosław Smogura
rsmogura@softperience.eu
In reply to: Craig Ringer (#6)
Re: UUID column as pimrary key?

On Wed, 05 Jan 2011 21:50:11 +1100, Craig Ringer
<craig@postnewspapers.com.au> wrote:

On 01/05/2011 07:31 PM, Radosław Smogura wrote:

* you have your id, before executing query, (in contrast to all this
autoincrement) so you may put it in dependant rows

Do you mean that with a UUID, you don't need to talk to the database
at all, you can generate an ID with no interaction with / involvement
with the database at all? Because other than that, there's not much
difference in how you normally work with them.

With a sequence, you might:

CREATE SEQUENCE x_id_seq;
CREATE TABLE x (
id integer PRIMIARY KEY DEFAULT nextval('x_id_seq'),
y integer
);
INSERT INTO x(y) VALUES (1);

I mean situation, when You create e.g. in one transaction, book and
chapters, in some way You need retrieve book's id, by returning clause
of insert, or by obtaining id form sequence.
It's simpler to write:
book_id = new uuid();
insert into book values(book_id,....);
insert into chapters values(new uuid(), book_id, ...);
isn't it?

#8Szymon Guz
mabewlun@gmail.com
In reply to: Radosław Smogura (#7)
Re: UUID column as pimrary key?

On 5 January 2011 15:28, Radosław Smogura <rsmogura@softperience.eu> wrote:

On Wed, 05 Jan 2011 21:50:11 +1100, Craig Ringer <
craig@postnewspapers.com.au> wrote:

On 01/05/2011 07:31 PM, Radosław Smogura wrote:

* you have your id, before executing query, (in contrast to all this

autoincrement) so you may put it in dependant rows

Do you mean that with a UUID, you don't need to talk to the database
at all, you can generate an ID with no interaction with / involvement
with the database at all? Because other than that, there's not much
difference in how you normally work with them.

With a sequence, you might:

CREATE SEQUENCE x_id_seq;
CREATE TABLE x (
id integer PRIMIARY KEY DEFAULT nextval('x_id_seq'),
y integer
);
INSERT INTO x(y) VALUES (1);

I mean situation, when You create e.g. in one transaction, book and

chapters, in some way You need retrieve book's id, by returning clause of
insert, or by obtaining id form sequence.
It's simpler to write:
book_id = new uuid();
insert into book values(book_id,....);
insert into chapters values(new uuid(), book_id, ...);
isn't it?

For me it is simpler just to write this:

bookid = insert into books(...) values(...) returning book_id;
insert into chapters(book_id, ...) values( bookid, ...);

but it's a matter of taste, I think.

regards
Szymon

#9Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Radosław Smogura (#5)
Re: UUID column as pimrary key?

On Jan 5, 2011, at 1:31 AM, Radosław Smogura wrote:

* simple to generate, and 128bit random is almost globally unique,

Almost? Should be totally unique, as long as your random source is decent quality.

--
Scott Ribe
scott_ribe@elevated-dev.com
http://www.elevated-dev.com/
(303) 722-0567 voice

#10Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Radosław Smogura (#7)
Re: UUID column as pimrary key?

On Jan 5, 2011, at 7:28 AM, Radosław Smogura wrote:

It's simpler to write:

...

isn't it?

Depends on the situation, the libraries you're using, and so on.

Now, if you're generating records in a distributed system, where your node might be disconnected when it's creating a record, it is *much* simpler in that case ;-)

--
Scott Ribe
scott_ribe@elevated-dev.com
http://www.elevated-dev.com/
(303) 722-0567 voice

#11Grzegorz Jaśkiewicz
gryzman@gmail.com
In reply to: Scott Ribe (#9)
Re: UUID column as pimrary key?

On Wed, Jan 5, 2011 at 2:37 PM, Scott Ribe <scott_ribe@elevated-dev.com> wrote:

On Jan 5, 2011, at 1:31 AM, Radosław Smogura wrote:

* simple to generate, and 128bit random is almost globally unique,

Almost? Should be totally unique, as long as your random source is decent quality.

But I would never rely on that alone. You always have a strategy in
place, in case there's a duplicate.

--
GJ

#12Mike Christensen
mike@kitchenpc.com
In reply to: Grzegorz Jaśkiewicz (#11)
Re: UUID column as pimrary key?

2011/1/5 Grzegorz Jaśkiewicz <gryzman@gmail.com>:

On Wed, Jan 5, 2011 at 2:37 PM, Scott Ribe <scott_ribe@elevated-dev.com> wrote:

On Jan 5, 2011, at 1:31 AM, Radosław Smogura wrote:

* simple to generate, and 128bit random is almost globally unique,

Almost? Should be totally unique, as long as your random source is decent quality.

But I would never rely on that alone. You always have a strategy in
place, in case there's a duplicate.

As long as all your UUIDs are generated with the same algorithm, they
are guaranteed to be unique.

#13Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Grzegorz Jaśkiewicz (#11)
Re: UUID column as pimrary key?

On Jan 5, 2011, at 7:55 AM, Grzegorz Jaśkiewicz wrote:

But I would never rely on that alone. You always have a strategy in
place, in case there's a duplicate.

That's really unnecessary, basically a total waste of effort.

--
Scott Ribe
scott_ribe@elevated-dev.com
http://www.elevated-dev.com/
(303) 722-0567 voice

#14Bill Moran
wmoran@potentialtech.com
In reply to: Scott Ribe (#9)
Re: UUID column as pimrary key?

In response to Scott Ribe <scott_ribe@elevated-dev.com>:

On Jan 5, 2011, at 1:31 AM, Radosław Smogura wrote:

* simple to generate, and 128bit random is almost globally unique,

Almost? Should be totally unique, as long as your random source is decent quality.

This is going off-topic, but I did some research on this because we
were considering using UUIDs for various keys ...

Fact is, UUIDs are not _guaranteed_ to be unique. If you use the generating
system that includes a MAC address, then in theory, they are guaranteed
to be unique, but in practice, MAC addresses aren't guaranteed to be
unique either, so that's not 100% either.

Beyond that, the namespace size for a UUID is so incomprehensibly huge
that the chance of two randomly generated UUIDs having the same value
is incomprehensibly unlikely ... it is, however, not a 100% guarantee.

Anyway, in our case, we determined that the chance of UUID collision
for the dataset in question was extremely unlikely, however, the
consequences of such a collision were pretty bad. We also determined
that we were able to control a "unit ID" for each independent system
that would generate IDs, which could (a) be part of a unique seed for
UUIDs, or (b) be a prefix to a autonumber ID that would be a lot easier
to read and work with manually. In the end, we chose b for the human
factor.

Face it, reading, remembering, and typing UUIDs kinda sucks.

--
Bill Moran
http://www.potentialtech.com
http://people.collaborativefusion.com/~wmoran/

#15Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Mike Christensen (#12)
Re: UUID column as pimrary key?

On Jan 5, 2011, at 8:03 AM, Mike Christensen wrote:

As long as all your UUIDs are generated with the same algorithm, they
are guaranteed to be unique.

There is no requirement that they be generated with the same algorithm in order to be unique. A MAC/time-based UUID cannot duplicate a random one, and vice versa. (Also applies to the 3rd flavor of UUID whose details I do not remember.)

--
Scott Ribe
scott_ribe@elevated-dev.com
http://www.elevated-dev.com/
(303) 722-0567 voice

#16Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Bill Moran (#14)
Re: UUID column as pimrary key?

On Jan 5, 2011, at 8:05 AM, Bill Moran wrote:

Beyond that, the namespace size for a UUID is so incomprehensibly huge
that the chance of two randomly generated UUIDs having the same value
is incomprehensibly unlikely

Yes, as in: it is *far* more likely that all of your team members and all of your client contacts will be simultaneously struck by lightning and killed in their sleep, and it is *far* more likely that all life on earth will be wiped out by an asteroid impact, and it is *far* more likely that the solar system orbits are not actually stable and earth will fly off into space... If you're worried about UUID collisions, then either your priorities are completely wrong, or you live in a bomb shelter--that's not sarcasm by the way, it's simply true, the chance of a collision is so vanishingly small that it is dwarfed by all sorts of risks that we all ignore because the chances are so low, including the chance that all drives in all your RAIDs across all your replicas will simultaneously fail on the same day that fires start in all the locations where your tapes are stored and all the sprinkler systems fail... (By "far" more likely, I mean many many many orders of magnitude...)

In the end, we chose b for the human
factor.

A very good decision, in the case where you're actually able to control each independent system.

Face it, reading, remembering, and typing UUIDs kinda sucks.

Lots of copy & paste, or custom GUI tools for devs & DBAs, or abuse like '...%', all of them painful in their own way.

--
Scott Ribe
scott_ribe@elevated-dev.com
http://www.elevated-dev.com/
(303) 722-0567 voice

#17Bill Moran
wmoran@potentialtech.com
In reply to: Scott Ribe (#16)
Re: UUID column as pimrary key?

In response to Scott Ribe <scott_ribe@elevated-dev.com>:

On Jan 5, 2011, at 8:05 AM, Bill Moran wrote:

Beyond that, the namespace size for a UUID is so incomprehensibly huge
that the chance of two randomly generated UUIDs having the same value
is incomprehensibly unlikely

Yes, as in: it is *far* more likely that all of your team members and all of your client contacts will be simultaneously struck by lightning and killed in their sleep, and it is *far* more likely that all life on earth will be wiped out by an asteroid impact, and it is *far* more likely that the solar system orbits are not actually stable and earth will fly off into space... If you're worried about UUID collisions, then either your priorities are completely wrong, or you live in a bomb shelter--that's not sarcasm by the way, it's simply true, the chance of a collision is so vanishingly small that it is dwarfed by all sorts of risks that we all ignore because the chances are so low, including the chance that all drives in all your RAIDs across all your replicas will simultaneously fail on the same day that fires start in all the locations where your tapes are stored and all the sprinkler systems fail... (By "far" more likely, I mean many many many orders of magnitude...)

That statement demonstrates a lack of investigation and/or consideration
of the circumstances.

I can't find my math or I'd reproduce it here, but consider this:

If you have 50 devices, each generating 100 UUIDs per hour, and you'll
keep records for 1 year, then your argument above is probably accurate.

However, if there are 5000 devices generating 100 UUIDs per hour, and you'll
be keeping those records for 10+ years, the chances of collisions near
the end of that 10 year span get high enough to actually make developers
nervous.

--
Bill Moran
http://www.potentialtech.com
http://people.collaborativefusion.com/~wmoran/

#18Tom Lane
tgl@sss.pgh.pa.us
In reply to: Scott Ribe (#16)
Re: UUID column as pimrary key?

Scott Ribe <scott_ribe@elevated-dev.com> writes:

On Jan 5, 2011, at 8:05 AM, Bill Moran wrote:

Beyond that, the namespace size for a UUID is so incomprehensibly huge
that the chance of two randomly generated UUIDs having the same value
is incomprehensibly unlikely

Yes, as in: it is *far* more likely that all of your team members and all of your client contacts will be simultaneously struck by lightning and killed in their sleep, and it is *far* more likely that all life on earth will be wiped out by an asteroid impact,

I see those sorts of arguments all the time, and I consider them pure BS.
Yes, the namespace is theoretically large. However, the questions you
really have to answer are (a) how much of the namespace is actually
being used by the UUID generation methods in use in a particular
application; (b) how sure can you be that there is not correlation
between UUIDs generated in different places/sessions.

In practical use I think the odds of a collision are *far* higher than
you are suggesting, unless the UUID generation is being done with a lot
more care than is likely if the user takes these sorts of claims at face
value. The odds may still be low enough to be a very good risk, but
you need to think about it not just bet your database on it without
thinking.

Being paranoid is a good thing. It's what DBAs are paid for.

regards, tom lane

#19Rob Sargent
robjsargent@gmail.com
In reply to: Bill Moran (#17)
Re: UUID column as pimrary key?

On 01/05/2011 08:55 AM, Bill Moran wrote:

In response to Scott Ribe <scott_ribe@elevated-dev.com>:

On Jan 5, 2011, at 8:05 AM, Bill Moran wrote:

Beyond that, the namespace size for a UUID is so incomprehensibly huge
that the chance of two randomly generated UUIDs having the same value
is incomprehensibly unlikely

Yes, as in: it is *far* more likely that all of your team members and all of your client contacts will be simultaneously struck by lightning and killed in their sleep, and it is *far* more likely that all life on earth will be wiped out by an asteroid impact, and it is *far* more likely that the solar system orbits are not actually stable and earth will fly off into space... If you're worried about UUID collisions, then either your priorities are completely wrong, or you live in a bomb shelter--that's not sarcasm by the way, it's simply true, the chance of a collision is so vanishingly small that it is dwarfed by all sorts of risks that we all ignore because the chances are so low, including the chance that all drives in all your RAIDs across all your replicas will simultaneously fail on the same day that fires start in all the locations where your tapes are stored and all the sprinkler systems fail... (By "far" more likely, I mean many many many orders of magnitude...)

That statement demonstrates a lack of investigation and/or consideration
of the circumstances.

I can't find my math or I'd reproduce it here, but consider this:

If you have 50 devices, each generating 100 UUIDs per hour, and you'll
keep records for 1 year, then your argument above is probably accurate.

However, if there are 5000 devices generating 100 UUIDs per hour, and you'll
be keeping those records for 10+ years, the chances of collisions near
the end of that 10 year span get high enough to actually make developers
nervous.

But we're talking about a primary key. Postgres guarantees the
uniqueness. 1 transaction in 10^^100 rolls back due to a second
instance of an (otherwise/almost) uuid. Big deal.

#20Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Bill Moran (#17)
Re: UUID column as pimrary key?

On Jan 5, 2011, at 8:55 AM, Bill Moran wrote:

That statement demonstrates a lack of investigation and/or consideration
of the circumstances.

No, it doesn't.

However, if there are 5000 devices generating 100 UUIDs per hour, and you'll
be keeping those records for 10+ years, the chances of collisions near
the end of that 10 year span get high enough to actually make developers
nervous.

No, they don't. At the end of your hypothetical 10-year period, you will have used about 43,000,000,000 UUIDs, or about 1/100,000,000,000,000,000,000,000,000th of the UUID space (assuming random UUIDs). Leaving you with a chance of a single collision of about 1/18,000,000,000,000,000.

Assuming of course good entropy. If the generation of random numbers is bad, then UUIDs are not so useful ;-)

--
Scott Ribe
scott_ribe@elevated-dev.com
http://www.elevated-dev.com/
(303) 722-0567 voice

#21Leif B. Kristensen
leif@solumslekt.org
In reply to: Bill Moran (#14)
#22Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Tom Lane (#18)
#23Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Leif B. Kristensen (#21)
#24Grzegorz Jaśkiewicz
gryzman@gmail.com
In reply to: Mike Christensen (#12)
#25Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Scott Ribe (#22)
#26Radosław Smogura
rsmogura@softperience.eu
In reply to: Adrian Klaver (#25)
#27Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Radosław Smogura (#26)
#28Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Radosław Smogura (#26)
#29Radosław Smogura
mail@smogura.eu
In reply to: Scott Ribe (#23)
#30Bill Moran
wmoran@potentialtech.com
In reply to: Rob Sargent (#19)
#31Bill Moran
wmoran@potentialtech.com
In reply to: Scott Ribe (#20)
#32Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Radosław Smogura (#29)
#33Dennis Gearon
gearond@sbcglobal.net
In reply to: Craig Ringer (#6)
#34Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Bill Moran (#31)
#35Rob Sargent
robjsargent@gmail.com
In reply to: Bill Moran (#30)
In reply to: Scott Ribe (#34)
#37Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Raymond O'Donnell (#36)
#38Bill Moran
wmoran@potentialtech.com
In reply to: Rob Sargent (#35)
#39Rob Sargent
robjsargent@gmail.com
In reply to: Bill Moran (#38)
#40Andrew Sullivan
ajs@crankycanuck.ca
In reply to: Scott Ribe (#34)
#41Alban Hertroys
dalroi@solfertje.student.utwente.nl
In reply to: Rob Sargent (#35)
#42Rob Sargent
robjsargent@gmail.com
In reply to: Alban Hertroys (#41)
#43Michael Satterwhite
michael@weblore.com
In reply to: Andrew Sullivan (#40)
#44Chris Browne
cbbrowne@acm.org
In reply to: Dennis Gearon (#1)
#45Chris Browne
cbbrowne@acm.org
In reply to: Dennis Gearon (#1)
#46dennis jenkins
dennis.jenkins.75@gmail.com
In reply to: Bill Moran (#31)
#47Radosław Smogura
rsmogura@softperience.eu
In reply to: Michael Satterwhite (#43)
#48Szymon Guz
mabewlun@gmail.com
In reply to: dennis jenkins (#46)
#49Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Andrew Sullivan (#40)
#50Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Michael Satterwhite (#43)
#51Andrew Sullivan
ajs@crankycanuck.ca
In reply to: Chris Browne (#44)
#52Andrew Sullivan
ajs@crankycanuck.ca
In reply to: Scott Ribe (#49)
#53Andrew Sullivan
ajs@crankycanuck.ca
In reply to: Scott Ribe (#50)
#54Alban Hertroys
dalroi@solfertje.student.utwente.nl
In reply to: Chris Browne (#45)
#55Stuart Bishop
stuart@stuartbishop.net
In reply to: Alban Hertroys (#54)
#56Jasen Betts
jasen@xnet.co.nz
In reply to: Dennis Gearon (#1)
#57Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Jasen Betts (#56)
#58Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Stuart Bishop (#55)
#59Bill Moran
wmoran@potentialtech.com
In reply to: Scott Ribe (#58)
#60Michael Satterwhite
michael@weblore.com
In reply to: Scott Ribe (#50)
#61Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Bill Moran (#59)
#62Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Bill Moran (#59)
#63Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Michael Satterwhite (#60)
#64Anthony
osm@inbox.org
In reply to: Bill Moran (#38)
#65Chris Browne
cbbrowne@acm.org
In reply to: Dennis Gearon (#1)
#66Chris Browne
cbbrowne@acm.org
In reply to: Dennis Gearon (#1)
#67Scott Ribe
scott_ribe@elevated-dev.com
In reply to: Chris Browne (#65)
#68Bill Moran
wmoran@potentialtech.com
In reply to: Bill Moran (#59)
#69Alban Hertroys
dalroi@solfertje.student.utwente.nl
In reply to: Chris Browne (#66)
#70Chris Browne
cbbrowne@acm.org
In reply to: Dennis Gearon (#1)
#71A.M.
agentm@themactionfaction.com
In reply to: Stuart Bishop (#55)
#72Bill Moran
wmoran@potentialtech.com
In reply to: Chris Browne (#70)
#73Dennis Gearon
gearond@sbcglobal.net
In reply to: Bill Moran (#72)
#74Alban Hertroys
dalroi@solfertje.student.utwente.nl
In reply to: Chris Browne (#70)
#75Jasen Betts
jasen@xnet.co.nz
In reply to: Dennis Gearon (#1)