Get numbers wholesale here and pass them out yourself. We only ask that you take responsibility for those numbers and let us know how you will do so. We'd especially like to have a web page that readers here can go to if they find one of your numbers anytime in the future. |
Plan on explaining what you do. Before you start, come here to get some numbers that you can use while you do. [x] give me a password that will let me save my answers [x] give my browser a cookie that will let save my answers [Allocate Numbers] |
Get numbers wholesale here and pass them out yourself. We only ask that you take responsibility for those numbers and let us know how you will do so. We'd especially like to have a web page that readers here can go to if they find one of your numbers anytime in the future. Write before you use this form: mailto:ward@c2.com. |
Plan on explaining what you do. Before you start, come here to get some numbers that you can use while you do. |
Use this form to allocate a million numbers for your own registry. |
Choose either or both of these options then press Allocate. |
<input type=text width= 40 name=site> is our registry website. (required) <br> <input type=text width= 40 name=mail> is my email address. (required).<br> <input type=submit value=Allocate> one million numbers for our own use. |
<input type=checkbox name=password> Give me a password that will let me save my answers.<br> <input type=checkbox name=password> Remember this allocation as a cookie in this browser.<br> <input type=submit value=Allocate> |
You will receive a password for the allocation by email. Reply to this email to complete the transaction. You will received a conformation email with your allocatioin of one million numbers. It will look something like this. Congratualtions. You have been allocated the following "build for life" numbers: BFL 23000000 to 23999999 See http://bfl.c2.com for tips allocating these numbers. |
You can automate the allocation of numbers. Here is a perl script that invokes the above form handler and writes the allocated numbers to standard output. |
Good luck with your registry. |
* http:files/alocate10.pl |
Plan on explaining what you do. Before you start, come here to get some numbers that you can use while you do. [x] give me a password that will let me save my answers [x] give my browser a cookie that will let save my answers [Allocate Numbers] |
Get all the numbers for your project now and allocate them yourself. Running low on numbers, get some more. |
Plan on explaining what you do. Before you start, come here to get some numbers that you can use while you do. |
Get all the numbers for your project now and allocate them yourself. Save your own answers with your project files. Running low on numbers? Get some more. |
Choose either or both of these options then press Allocate. |
Use this form to allocate numbers for your whole project. |
<input type=checkbox name=password> Give me a password that will let me save my answers.<br> <input type=checkbox name=password> Remember this allocation as a cookie in this browser.<br> <input type=submit value=Allocate> |
<input type=text width= 40 name=mail> is our project name. (optional) <br> <input type=text width= 40 name=mail> is my email address. (optional).<br> <input type=submit value=Allocate> one thousand numbers for our project. |
You can automate the allocation of numbers. Here is a perl script that invokes the above form handler and writes the allocated numbers to standard output. * http:files/alocate10.pl |
Get all the numbers for your project now and allocate them yourself. Running low on numbers, get some more. |
Stuff made of atoms will rot. The forces that hold stuff together are not strong enough to preserve its organization against entropy and exploitation. Organization goes away. Stuff made of bits will rot too. Software that works one day will stop the next. This is called bit rot, as if entropy were wearing away at the bits themselves. In fact the bits probably didn't change. Rather some decision made elsewere reversed some behavior that the bits required. Uninformed decision making creates bit rot. |
Stuff made of atoms will rot. The forces that hold stuff together are not strong enough to preserve its organization against entropy and exploitation. Organization goes away. Stuff made of bits will rot too. Software that works one day will stop the next. This is called bit rot, as if entropy were wearing away at the bits themselves. In fact the bits probably didn't change. Rather some decision made elsewere reversed some behavior that the bits required. Uninformed decision making creates bit rot. |
The Built for Life workshop was organized by BrianMarick and held at OOPSLA 2002 in Seattle, Washington, USA. |
The Built for Life workshop was organized by BrianMarick and held at OOPSLA 2002 in Seattle, Washington, USA. |
We allocate numbers. The're called BuiltForLife numbers in honor of the workshop where they were invented. The are also known as BFL numbers recognizing the exact form they take as hyperlinks in program source code and related documents and resources. A BFL number matches the RegularExpression: BFL[1-9][0-9]* This says, a BFL number consists of the three capital letters, B, F, L, followed by an arbitrarily large integer without leading zeros. It also implys that the number will not be followed by a digit, but may be preceeded by any character. Typically BFL numbers are enclosed by the comment marks prescribed by the language in use. |
We allocate numbers. The're called BuiltForLife numbers in honor of the workshop where they were invented. The are also known as BFL numbers recognizing the exact form they take as hyperlinks in program source code and related documents and resources. |
You've found some code that has a BflNumber something like BFL12887. You can find code and documents related to this code by searching your own directories. In unix you would use a command like: |
A BFL number matches the RegularExpression: |
grep -r BFL12887 src |
BFL[1-9][0-9]* |
You can also check this site for an answer related to the code you find. The answer is to the question "Why?". |
This says, a BFL number consists of the three capital letters, B, F, L, followed by an arbitrarily large integer without leading zeros. It also implys that the number will not be followed by a digit, but may be preceeded by any character. Typically BFL numbers are enclosed by the comment marks prescribed by the language in use. |
<blockquote> <form method=post action="lookup.cgi"> <input type=text width=20><br> <input type=submit value=" Lookup"> </form> </blockquote> |
You've found some code that has a BflNumber something like BFL12887. You can find code and documents related to this code by searching your own directories. In unix you would use a command like: |
Your programming partner asks you "Why did you do that there?" You answer. He's satisfied. But what about future readers? |
grep -r BFL12887 src |
Type your answer here and we will keep it. We'll assign a number that you can use to refer to this answer anywhere you'd like. |
You can also check this site for an answer related to the code you find. The answer is to the question "Why?". <blockquote> <form method=post action="lookup.cgi"> <input type=text width=20><br> <input type=submit value=" Lookup"> |
<form method=post action="record.cgi?RecordAnAnswer"> <textarea name=Text rows=16 cols=60 wrap=virtual> </textarea> <p><input type="submit" value=" Save "> |
</blockquote> |
Pressing Save places your answer in the PublicDomain and allocates one permenant BuiltForLifeNumber. See LegalDetails. |
You've found some code that has a BuiltForLifeNumber something like BFL12887. You can find code and documents related to this code by searching your own directories. In unix you would use a command like: |
Your programming partner asks you "Why did you do that there?" You answer. He's satisfied. But what about future readers? |
grep -r BFL12887 src You can also check this site for an answer related to the code you find. The answer is to the question "Why?" |
Type your answer here and we will keep it. We'll assign a number that you can use to refer to this answer anywhere you'd like. |
Enter answer number. |
<form method=post action="lookup.cgi"> <input type=text width=12 value=BFL><br> <input type=submit value=" Lookup"> |
<form method=post action="record.cgi?RecordAnAnswer"> <textarea name=Text rows=16 cols=60 wrap=virtual> </textarea><br> <input type="submit" value=" Save "> |
Pressing Save places your answer in the PublicDomain and allocates one permenant BuiltForLifeNumber. See LegalDetails. |
Your programming partner asks you "Why did you do that there?" You answer. He's satisfied. But what about future readers? |
You can save answers here up to ten at a time. |
Type your answer here and we will keep it. We'll assign a number that you can use to refer to this answer anywhere you'd like. |
<form action=record10.cgi> <blockquote> <input width=20 name=first value=BFL> first number in range, if we've already assigned numbers.<br> <input width=20 name=password value=brx243vhy687> password we assigned with those numbers. </blockquote> |
<form method=post action="record.cgi?RecordAnAnswer"> <textarea name=Text rows=16 cols=60 wrap=virtual> </textarea> <p><input type="submit" value=" Save "> |
Fill out the above if you already have permenant numbers. If you used TemporaryNumbers we will assign permenant numbers when you save. Be sure to update those numbers in your source as soon as you are done here. <blockquote> <p>Answer 1<br><textarea name=0 rows=16 cols=60 wrap=virtual></textarea></p> <p>Answer 1<br><textarea name=0 rows=16 cols=60 wrap=virtual></textarea></p> <p>Answer 1<br><textarea name=0 rows=16 cols=60 wrap=virtual></textarea></p> <p>Answer 1<br><textarea name=0 rows=16 cols=60 wrap=virtual></textarea></p> <p>Answer 1<br><textarea name=0 rows=16 cols=60 wrap=virtual></textarea></p> </blockquite> |
Pressing Save places your answer in the PublicDomain and allocates one permenant BuiltForLifeNumber. See LegalDetails. |
Your programming partner asks you "Why did you do that there?" You answer. He's satisfied. But what about future readers? |
You can save answers here up to ten at a time. |
Type your answer here and we will keep it. We'll assign a number that you can use to refer to this answer anywhere you'd like. |
You can enter answers for permenant numbers that you've already allocated or have new numbers assigned right now. |
<form action=record10.cgi> |
Enter password for allocated numbers.<br> |
<form method=post action="record.cgi?RecordAnAnswer"> <textarea name=Text rows=16 cols=60 wrap=virtual> </textarea><br> <input type="submit" value=" Save "> </form> |
<input width=12 name=password value=BFL1288> is first number. <br> <input width=12 name=password value=brx243vhy687> is password.<br> <input type=submit value=Refresh> with my answers. (optional) |
Pressing Save places your answer in the PublicDomain and allocates one permenant BuiltForLifeNumber. See LegalDetails. |
If you used TemporaryNumbers we will assign permenant numbers when you save. Fill out the above if you already have permenant numbers. Be sure to update those numbers in your source as soon as you are done here. <blockquote> Enter answers for corresponding numbers. <table cellpadding=10><tr><td bgcolor=ffff7f> <p>BFL10<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <p>BFL11<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <p>BFL12<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <p>BFL13<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <p>BFL14<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <input type=submit value="Save All"> </td></tr></table> </blockquite> </form> |
You can save answers here up to ten at a time. |
BuiltForLifeNumbers 10 through 99 are temporary numbers used while programming when it is inconvenient to assign permentent numbers. Normally one doesn't check-in code with temporary numbers. Instead, when convenient, one can AllocateTenNumbers and use a number SubstitutionUtility like bfl.pl to replace the temporary numbers with the new permenent numbers. |
You can enter answers for permenant numbers that you've already allocated or have new numbers assigned right now. |
For example, say a team writes five answers while programming. Since they were very busy they don't bother to get perment numbers and choose to use the numbers 10, 11, 12, 13 and 14 instead. Then, when finished, they use bfl.pl, to change these to perment numbers, 23170, 23171, 23172, 23173 and 23174 which they allocate with AllocateTenNumbers. |
<form action=record10.cgi> <blockquote> Enter password for allocated numbers.<br> <table cellpadding=10><tr><td bgcolor=ffff7f> <input width=12 name=password value=BFL1288> is first number. <br> <input width=12 name=password value=brx243vhy687> is password.<br> <input type=submit value=Refresh> with my answers. (optional) </td></tr></table> </blockquote> |
bfl.pl -s 10 23170 . 17 substitutions |
If you used TemporaryNumbers we will assign permenant numbers when you save. |
The bfl.pl script can communicate with this site to allocate numbers for you. Use the -a option to allocate numbers. |
Fill out the above if you already have permenant numbers. Be sure to update those numbers in your source as soon as you are done here. <blockquote> Enter answers for corresponding numbers. <table cellpadding=10><tr><td bgcolor=ffff7f> <p>BFL10<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <p>BFL11<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <p>BFL12<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <p>BFL13<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <p>BFL14<br><textarea name=0 rows=8 cols=60 wrap=virtual></textarea></p> <input type=submit value="Save All"> </td></tr></table> </blockquite> </form> |
bfl.pl -as 10 . password: 437axr432pzq first of 10 numbers: 23170 17 substitutions |
When we fill up the tenth directory (90, 900, 9000, etc) we have to make more room by creating a next higher level directory and putting all of our current numbers under the first directory (000, 0000, 00000, etc) within it. |
Setup defines the file configuration that we will be recording within. Here we start with a second level directory structure, partially full. |
We will run several setups in this test. Our first few are with no established directories. | Setup ||| |
| Setup | |
| 00 | 0,1,2,3,4,5,6,7,8,9 | setup data 0-9 | | 01 | 0,1,2,3,4,5,6,7 | setup data 10-17 | |
Now we will fill this with 12 files. A reorganization takes place after 10. |
First we will fill the teens directory and see that we go on to twenty. |
| text for 0-9 | 0 | | text for 0-9 | 1 | | text for 0-9 | 2 | | text for 0-9 | 3 | | text for 0-9 | 4 | | text for 0-9 | 5 | | text for 0-9 | 6 | | text for 0-9 | 7 | | text for 0-9 | 8 | | text for 0-9 | 9 | | text for 10 | 10 | | text for 11 | 11 | |
| eighteen | 18 | | nineteen | 19 | | twenty | 20 | | twenty-one | 21 | |
We should have two directories, one for 0-9 and another for 10-11. |
We will do a simple directory list to be sure we have what we want. |
| 00 | |
| 10 | |
Now we will try the same thing but with an allocate10 triggering the reorganization, which will happen whether 0-9 have been fully allocated or not. | Setup ||| | directory | files | contents | | Record || | text | number() | | text for 0-9 | 0 | | text for 0-9 | 1 | | text for 0-9 | 2 | | text for 0-9 | 3 | | Allocate10 ||| | password | cookie | number() | | no | no | 10 | | no | no | 20 | | Record || | text | number() | | text for 0-9 | 4 | | text for 0-9 | 5 | | text for 0-9 | 6 | | text for 0-9 | 7 | | Directory || | path() | isDir() | | 00 | yes | | 00/0 | no | | 00/1 | no | | 00/2 | no | | 00/3 | no | | 00/4 | no | | 00/5 | no | | 00/6 | no | | 00/7 | no | | 10 | no | | 20 | no | |
| 10/2 | | 10/3 | | 10/4 | | 10/5 | | 10/6 | | 10/7 | | 10/8 | | 10/9 | | 20/0 | | 20/1 | |
Setup defines the file configuration that we will be recording within. Here we start with a second level directory structure, partially full. |
Setup defines the file configuration that we will be recording within. Here we start with nothing to keep our first tests simple. |
| directory | files | contents | | 00 | 0,1,2,3,4,5,6,7,8,9 | setup data 0-9 | | 01 | 0,1,2,3,4,5,6,7 | setup data 10-17 | |
First we will fill the teens directory and see that we go on to twenty. |
You can record text without having a preallocated number. Here we record our first three answers, the single words zero, one and two. They will be assigned the corresponding bfl numbers. |
| eighteen | 18 | | nineteen | 19 | | twenty | 20 | | twenty-one | 21 | We will do a simple directory list to be sure we have what we want. | Directory | | path() | | 00/0 | | 00/1 | | 00/2 | | 00/3 | | 00/4 | | 00/5 | | 00/6 | | 00/7 | | 00/8 | | 00/9 | | 10/0 | | 10/1 | | 10/2 | | 10/3 | | 10/4 | | 10/5 | | 10/6 | | 10/7 | | 10/8 | | 10/9 | | 20/0 | | 20/1 | |
| zero | 0 | | one | 1 | | two | 2 | We can look this text up by number in any order. | Lookup || | number | text() | | 1 | one | | 2 | two | | 1 | one | | 0 | zero | | 00 | error | | 3 | error | |
Setup defines the file configuration that we will be recording within. Here we start with nothing to keep our first tests simple. |
Setup defines the file configuration that we will be recording within. Here we start with a second level directory structure, partially full. |
| Setup | |
| Setup ||| | directory | files | contents | | 00 | 0,1,2,3,4,5,6,7,8,9 | setup data 0-9 | | 01 | 0,1,2,3,4,5,6,7 | setup data 10-17 | |
You can record text without having a preallocated number. Here we record our first three answers, the single words zero, one and two. They will be assigned the corresponding bfl numbers. |
First we will allocate 10 numbers. This will skip over the rest of the teens so that the ten start on a modulo 10 boundary. | Allocate10 || | password | cookie | number() | | no | no | 20 | | no | no | 30 | Now we fill the teens directory and see that we go on to forty. |
| zero | 0 | | one | 1 | | two | 2 | We can look this text up by number in any order. | Lookup || | number | text() | | 1 | one | | 2 | two | | 1 | one | | 0 | zero | | 00 | error | | 3 | error | |
| eighteen | 18 | | nineteen | 19 | | twenty | 40 | | twenty-one | 41 | We will check the directory list to be sure we have what we want. Here we list the full path of each file and directory we expect to find. | Directory | | path() | isDir() | | 00 | yes | | 00/0 | no | | 00/1 | no | | 00/2 | no | | 00/3 | no | | 00/4 | no | | 00/5 | no | | 00/6 | no | | 00/7 | no | | 00/8 | no | | 00/9 | no | | 10 | yes | | 10/0 | no | | 10/1 | no | | 10/2 | no | | 10/3 | no | | 10/4 | no | | 10/5 | no | | 10/6 | no | | 10/7 | no | | 10/8 | no | | 10/9 | no | | 20 | no | | 30 | no | | 40 | yes | | 40/0 | no | | 40/1 | no | |
Decisions accumulate in software. Some decisions are wiser than others. BitRot is nothing more than the accumulation of poor decisions, decisions that usually look good at first but interact poorly with decisions made elsewhere. If only we had known. |
* mailto:ward@c2.com * http://c2.com/~ward/ |
Caution: This site is a mockup for evaluation purposes only. We are writing fit-style acceptance tests for the database and cgi scripts that will perform the operations described in these pages. See AcceptanceTests. |
This site, spawned from the BuiltForLife workshop, is one small contribution to the reveral of bit rot. It contributes by by asking and answering one question: Why? Try it yourself: * RecordAnAnswer * LookupAnAnswer Although we are happy to hold answers here, we recognize that our primary responsibility is to allocate the space of answer numbers. We do this in small, medium and large batches. * AllocateTenNumbers then RecordTenAnswers * AllocateThousands of numbers for your own use. * AllocateMillions of numbers for your public or private service. Search this site. Enter one word and press enter. [Search] Here are a few more sources of information and ways to navigate this site. We thank you for your interest. * http:changes.cgi -- recent updates here. * WhosWho -- among friends and helpers. * SisterSites -- we link to automatically. Legal Notice: This site, the text and the site design are Copyright (c) 2002, Cunningham & Cunningham, Inc. Answers recorded here are released to the public domain by their authors as a condition of storage, but materials linked by are not. See LegalDetails. |
I set up this site and designed the logo. The 6 in the logo is this color: R: 118, G:23, B:4 or #761704 in hex. |
Decisions accumulate in software. Some decisions are wiser than others. BitRot is nothing more than the accumulation of poor decisions, decisions that usually look good at first but interact poorly with decisions made elsewhere. If only we had known. |
Your host and SystemAdiministrator. |
This site, spawned from the BuiltForLife workshop, is one small contribution to the reveral of bit rot. It contributes by by asking and answering one question: Why? |
* WardCunningham |
* RecordAnAnswer * LookupAnAnswer |
Attendees at the BuiltForLife workshop. |
Although we are happy to hold answers here, we recognize that our primary responsibility is to allocate the space of answer numbers. We do this in small, medium and large batches. * AllocateTenNumbers then RecordTenAnswers * AllocateThousands of numbers for your own use. * AllocateMillions of numbers for your public or private service. Learn more about this site, it's author, and the workshop that spawned this concept. * http:changes.cgi -- Recent changes to this site. * BuiltForLife workshop. * WhosWho, SisterSites Legal Notice: This site, the text and the site design are Copyright (c) 2002, Cunningham & Cunningham, Inc. Answers here are released to the public domain by their authors as a condition of storage, but materials linked by are not. See LegalDetails. |
* BrianMarick * DaveThomas * Andy * Cooper |
Decisions accumulate in software. Some decisions are wiser than others. BitRot is nothing more than the accumulation of poor decisions, decisions that usually look good at first but interact poorly with decisions made elsewhere. If only we had known. |
Your host and System Adiministrator. |
Caution: This site is a mockup for evaluation purposes only. We are writing fit-style acceptance tests for the database and cgi scripts that will perform the operations described in these pages. See AcceptanceTests. |
* WardCunningham |
This site, spawned from the BuiltForLife workshop, is one small contribution to the reveral of bit rot. It contributes by by asking and answering one question: Why? Try it yourself: |
Attendees at the BuiltForLife workshop. |
* RecordAnAnswer * LookupAnAnswer Although we are happy to hold answers here, we recognize that our primary responsibility is to allocate the space of answer numbers. We do this in small, medium and large batches. * AllocateTenNumbers then RecordTenAnswers * AllocateThousands of numbers for your own use. * AllocateMillions of numbers for your public or private service. Search this site. Enter one word and press enter. [Search] Here are a few more sources of information and ways to navigate this site. We thank you for your interest. * http:changes.cgi -- recent updates here. * WhosWho -- among friends and helpers. * SisterSites -- we link to automatically. Legal Notice: This site, the text and the site design are Copyright (c) 2002, Cunningham & Cunningham, Inc. Answers recorded here are released to the public domain by their authors as a condition of storage, but materials linked by are not. See LegalDetails. |
* BrianMarick * DaveThomas * AndyHunt * AlanCooper |