
Alpha_23 - 27-Jun-2007

  Changed to store object blocks in order in storage instead of wrapping 
  them around the storage size.  There are several advantages to this, the
  main one being, the objects are not as dependant upon the storage size.
  Now a compressed file can be expanded into a different size of disk, as
  long as it is large enough to hold the objects.  Another advantage is
  that the blocks in compressed files are always sequential and won't
  change the order of blocks depending upon the size of storage.

  There was only one change to the header:

       bytes      0022 header                                 0023 header
        0-3:  NWOS                                    NWOS
        4-7:  0022                                    0023
        8-11: time stamp of last prep upper           time stamp of last prep upper
       12-15: time stamp of last prep lower           time stamp of last prep lower

       16-19: reserved blocks                         reserved blocks
       20-23: blocks used                             blocks used
       24-27: time stamp of last change upper         time stamp of last change upper
       28-31: time stamp of last change lower         time stamp of last change lower

       32-25: block offset to first chunk             block offset to first chunk
       36-39:                                         private chunks used
       40-43: 
       44-47: 

  In addition there is now a chunk index table stored, starting in the block
  following the header.  It is the first object reference for the chunk.

  Another change is that the blocks used for the bit_maps is not included in
  the "blocks used" count.


Alpha_22.3 - 25-Jun-2007

  Fix bug in prep_disc that let it continue even if there was an error in
  the size of allocation parameters.

  Moved the agreeing to no warranty after the parameters were checked in
  prep_disk.  This way he/she doesn't have to agree, just to find out that
  the paramters were wrong.


Alpha_22.2 - 24-Jun-2007

  Split all disk I/O routines out of objectify.c and created a new file
  disk_io.c.


Alpha_22.1 - 23-Jun-2007

  Moved some one off programs and programs no longer needed into the 'attic'
  directory.

  Fixed objectify.c so it would compile correctly in PUBLIC_MODE.

  Added code to objectify.c to close public objects file when terminating.

  Added code to diff_compressed.c to correctly handle the 0021 to 0022 
  transition.

  Added 'uninstall' command to Makefile.


Alpha_22 - 22-Jun-2007

  Changed so that public objects are just read from a file instead of being
  stored in the same storage as the private objects.  This required the header
  to be changed yet again to 0022:

       bytes      0021 header                                 0022 header
        0-3:  NWOS                                    NWOS
        4-7:  0021                                    0022
        8-11: time stamp of last prep upper           time stamp of last prep upper
       12-15: time stamp of last prep lower           time stamp of last prep lower

       16-19: reserved public blocks                  reserved private blocks
       20-23: public blocks used                      private blocks used
       24-27: time stamp of last public change upper  time stamp of last private change upper
       28-31: time stamp of last public change lower  time stamp of last private change lower

       32-25: reserved private blocks                 block offset to first chunk
       36-39: private blocks used
       40-43: time stamp of last private change upper
       44-47: time stamp of last private change lower

       48-51:
       52-55: next chunk with available ref
       56-59:
       60-63:


  Changed disc_list, log_disc, and identify_disc programs to take a directory as 
  input, instead of a list of files.


Alpha_21.2 - 9-Jun-2007

  Changed storage_location so that it can be a location or a person.

  Change file matching stuff to allow mismatch on time/date.

  Added "Manufacturer" class.

  Added "Account", "Account Number", and "Checking" classes and code to create
  checking  accounts.

  Added "Acronym" class.

  Added code to create index file for compressed file and use it if
  available (speed up indexing compressed file).

  Move test for bad open right after open.

  Changed add_person function to verify public names first.

  Added "Universal Resource Locator" (URL) class.


Alpha_21.1 - 15-Apr-2007

  Fixed bug in prep_disk that wrote public data into the private block area, thereby
  trashing the bit maps.

  Fixed bug in check_block_maps that printed the wrong percentage of disk used.

  Modified generate_random_id to try longer instead of giving up after only 13 tries.


Alpha_21 - 14-Apr-2007

  Storage can be in a disk partition, entire disk drive, or a normal file.

  Updated INSTALL file with more up to date information.  Also some info on using the
  various features.


25-Mar-2007

  0021 Changed the header, yet again, to split the time stamps for public and private
       last changed.

       bytes      0016-0020 header                    0021 header
        0-3:  NWOS                             NWOS
        4-7:  0020                             0021
        8-11: time stamp of last change 1
       12-15: time stamp of last change 2

       16-19: reserved public blocks           reserved public blocks
       20-23: reserved private blocks          public blocks used
       24-27:                                  time stamp of last public change upper
       28-31:                                  time stamp of last public change lower

       32-25: public blocks used               reserved private blocks
       36-39: private blocks used              private blocks used
       40-43:                                  time stamp of last private change upper
       44-47:                                  time stamp of last private change lower

       48-51:
       52-55: next chunk with available ref    next chunk with available ref
       56-59:
       60-63:


8-Mar-2007

  0020 Changed back to having 0x0xxxxxxx id's reserved for public blocks.  This was
       necessary because 0019 archives used id numbers in that range so if the archive
       didn't reserve exactly 64G for public blocks it will be broken.


26-Feb-2007

  0019 Changed the way the bit maps are dealt with in hashing the ID to the disk block
       number.  In previous versions it left holes in the ID and certain IDs (the ones
       that overlapped the bit maps) could not be used.  In 0019 I changed it so that
       the bit maps are simply skipped over and all ID numbers can be used.

       Also went back to just reserving 0x00000000 to 0x0fffffff for public space even
       if not all that space is allocated on the disk.

24-Feb-2007

  0018 Changed reference ids back to the original concept where reference ids are a full 32 
       bits on a particular disk drive and they are mapped down to the range of the disk.
       This works out much better when the size of the disk or partition changes.

  Note: since my old archive (version 0017) has only the reference IDs which are in the disk
        range, I have currently set the "generate_random_id" function to only create IDs in 
        the range above the disk drive.  After enough new IDs are created to make them 
        balanced I will change "generate_random_id" function to again create some IDs that 
        are in the disk range.


13-Jan-2007

  0017 Changed format of file object, moved modification_time to path_and_file_association
       object.

15-Dec-2006

  0016 Changed back to two area (Public and Private Encrypted) disk layout.

    The reasoning is:

      1) Having 3 areas is added complexity.
      2) More complicated to manage (dividing it up 3 ways, what is the right size?).
      3) Besides having to have no password for the unencypted area the only advantage
         is speed (no need to decrypt).
      4) One advantage to having all private blocks encrypted is that is additional
         fodder that someone trying to crack it has to wade through.

    However I did not change the header completely back, just removed the extra entries:

       bytes      0015 header                         0016 header
        0-3:  NWOS                             NWOS
        4-7:  0015                             0016
        8-11: time stamp of last change 1      time stamp of last change 1
       12-15: time stamp of last change 2      time stamp of last change 2

       16-19: reserved public blocks           reserved public blocks
       20-23: reserved private blocks          reserved private blocks
       24-27: reserved encrypted blocks
       28-31: 

       32-25: public blocks used               public blocks used
       36-39: private blocks used              private blocks used
       40-43: encrypted blocks used
       44-47:

       48-51:
       52-55: next chunk with available ref    next chunk with available ref
       56-59:
       60-63:

  The disk is now divided into only two sections instead of three like it was before:
 
           0015                0016

     +-------------+      +-----------+
     |  Reserved   |      | Reserved  |
     |   public    |      |  public   |
     |   blocks    |      |  blocks   |
     +-------------+      +-----------+
     |   Private   |      |  Private  |
     | Unencrypted |      | Encrypted |
     |   blocks    |      |  blocks   |
     +-------------+      +-----------+
     |   Private   |
     |  Encrypted  |
     |   blocks    |
     +-------------+


3-Dec-2006

  0015 rearranged disk layout and header:

       bytes      0014 header                         0015 header
        0-3:  NWOS                             NWOS
        4-7:  0014                             0015
        8-11: reserved public blocks           time stamp of last change 1
       12-15: disk size                        time stamp of last change 2

       16-19: public blocks used               reserved public blocks
       20-23:                                  reserved private blocks
       24-27: time stamp of last change 1      reserved encrypted blocks
       28-31: time stamp of last change 2

       32-25:                                  public blocks used (next available reference)
       36-39:                                  private blocks used
       40-43:                                  encrypted blocks used
       44-47:

       48-51:
       52-55:                                  next chunk with available reference
       56-59:
       60-63:

  The disk is now divided into three sections instead of two
 
           0014                0015

      +-----------+      +-------------+
      | Reserved  |      |  Reserved   |
      |  public   |      |   public    |
      |  blocks   |      |   blocks    |
      +-----------+      +-------------+
      |  Private  |      |   Private   |
      | Encrypted |      | Unencrypted |
      |  blocks   |      |   blocks    |
      +-----------+      +-------------+
                         |   Private   |
                         |  Encrypted  |
                         |   blocks    |
                         +-------------+


Labeled: objectify_061202_bad_multifile_path - 2-Dec-2006

  This version I modified the code so that the file_path object could point
  either directly to a file or it could point to a reference list that in turn
  pointed to a file.  I then determined that this wasn't going to work because
  there was nothing a disc_list could point to that specifically identified
  both the file and it's path.  Need to change to use the plan outlined on page
  100 (5-Nov-2006) of my notes, where there is an object the associates a
  specific file and a specific path which the disc_list can then point to.

Note somewhere 0012 reserved space for public objects?
               0013 added the bit maps
               0014 added the next public id in header bytes 16-19

Alpha_05_3 - 27-Sep-2006

  Changed so that data is stored in one large "sparse" file,
  instead of all the little /obj/xxxxxxxx files.

  Added utility functions to export the old /obj/xxxxxxxx files
  into a series of comma separated variable (csv) files, and to
  import those csv files into the new single sparse file.

  Also added utility programs to compress the large sparse file
  into a non-sparse file for backup, etc. and to expand a
  compressed file back into the sparse file.


Alpha_14 -

  Added document on the evolution of the object identifier (reference), in
  "/doc/object_ids.txt".


Alpha_13 - 26-Feb-2006

  This version is INCOMPLETE and won't build or run.  I have created it simply
  as a marker: big_bang_07.  I have decided to completely change the layout of
  the objects again.  The problem being that grafting them on top of another
  programming language causes schizophrenia, for instance, trying to deal with
  inheritance in both the objects and the language is difficult.  For example
  in the previous verson, the word and letter class definitions never existed. 

  Moved the class definition references out of the nwos_predefined_references.e
  file/class and into a new file/class nwos_classes.e.

  Added an "is_a" feature to the class definition, to allow finding out what a
  classes parent class is (I.E. noun -> word).


Alpha_12 - 20-Feb-2006

  I have decided to take this version as the "official" one and say the
  objects created by this version (big_bang_06) are the first official
  objects.  However, there is no need that I can see to create a general
  release because this version should never really be run again.  Once
  these objects exist they should be used by everyone and not regenerated
  again.

  Removed the usage of "aspell" to generate the spelling objects.

  Changed "NWOS_HEADER" to "NWOS_OBJECT" to hopefully make it easier to
  understand.

  Changed all classes to load on demand.  So an object can be created with
  "make_unresolved" and then when any of it's attributes are referenced it
  will automatically load itself from the disk.


Alpha_11 - 17-Feb-2006

  This version is also UNRELEASED.  It works but is still not really
  working as well as I would like.  The CVS tag for it is "big_bang_05".

  Fixed the reading of objects back in.  However, "print_spellings" still
  ends up reading every single object back in.  It is painfully slow.

  In this version I downloaded the GNU aspell English dictionary with the
  idea of using it to insert all of the English spellings into the
  database.  I thought it would be better to have as many as possible
  different spellings in the system up front and then the specific words
  could be created later without having to affect all of the spelling
  indexes.  Unfortunately, in looking through the aspell dictionary I see
  words that I am not sure about.  I have looked them up in my Merriam-
  Webster's Collegiate Dictionary and they don't appear there.  Not that
  it is the final authority, but since there is some doubt in my mind, I
  have decided to not just insert all of those spellings at this time.
  My new plan is to just add spelling that I know I need at this point in
  the project.


Alpha_10 - 11-Feb-2006

  This is another UNRELEASED version.  It doesn't work.  I am
  only releasing it as a marker (tag in CVS is big_bang_04).

  The file header in objects created with this version is 0010.

  Combined HISTORY file into RELEASE_NOTES, too hard dealing with
  two files and why use two when one will do?

  In this version the big_bang appears to work, however reading
  objects back in is broken.  This version includes a test program
  "print_spellings" that should have read the objects in and
  printed all of the spellings in the database.  However this
  version was designed to read all objects into memory.  Somehow,
  however, it gets tangled up in all the recursion of reading
  all objects and ends up reading creating two objects in memory
  for the same object.  This screws up the cache and it stack
  dumps.

  I have decided to discontinue this plan because it wasn't the
  optimum solution anyway.  When the database gets large there
  won't be enough room in memory for it anyway.  The plan never
  was to keep reading every single object into memory.


Alpha_09 - 04-Feb-2006

  This release was never actually created (Not tagged in CVS).  I
  did create a few objects with the header version 0009 and then
  decided to change the header format yet again.  So I decided to 
  increment the header version to 0010.

  The only CVS tag related to the files that created 0009 objects
  is "big_bang_03".


Alpha_08 - 02-Feb-2006

  This release was never actually created (Not tagged in CVS).  I
  did create a few objects with the header version 0008 and then
  decided to change the format again.  So I decided to increment
  the header version to 0009.

  The only CVS tag related to the files that created 0008 objects
  is "big_bang_02".


Alpha_07 - 30-Jan-2006

  Unreleased version - DO NOT USE

  This version is just a marker.  I created a base set of objects
  from the Fine (Eiffel) program create_base_letters.  But then once
  again decided to change the format before proceeding.

  This is the first version that uses Fine (Eiffel) for programming
  instead of C.


Alpha_06 - 23-Jan-2006

  Unreleased version - DO NOT USE

  This version is just a marker.  I created a few of the base objects
  but then decided that the header format needs to be changed before
  proceeding.

  This is the first version where the public objects are created once
  and they exist from that point on.  This version was the first
  attempt to create the base objects.


Alpha_05 - 09-Jan-2006

  Merged create_person (cperson), create_phone (cphone) and 
  find_phone (phone) apps into one app called "computer" that can
  do all of those things and more.

  Fixed several bugs in the name code, that mismatched names.

  Added cities and states now have capital cities.

  Changed "big_bang" to update objects from Alpha_04 (0004) objects
  to Alpha_05 (0005) objects.


Alpha_04 - 30-Dec-2005

  Added security by encrypting all of the data objects (but in this
  version reference lists are NOT encrypted).  The object's data is
  scrambled into 512 bytes of random data and the simplest form of 
  the Blowfish encryption is then run on the 512 bytes and it is
  written to disk.

  For now only one security option is available, all of the data is
  encrypted with the same key (pass phrase).  The pass phrase is a
  minimum of 34 characters.  If the pass phrase is lost or forgotten
  ALL DATA IS LOST as well.

  Changed the objects that have variable length data (Spelling, Name,
  and Year objects) to be a variable size.  This was to allow the
  random data to be better utilized.  I.E. if a spelling object for
  example was a fixed size (like before) and allowed a space for 100
  characters (like before) then 100 zeros would be in the random data
  and give some clue as to the data.  With the variable sized objects
  there are no zeros to be written into the random data and so there
  are fewer clues as to the contents of the data.

  Added disclaimers when the "big_bang" program is first run.


Alpha_03 - 29-Dec-2005 (Additional note added after Alpha_03 release)

  Also changed in Alpha_03 was the format of the version numbers.  In 
  Alpha_01 and Alpha_02 the version number in the file header was three 
  digits and was followed by a character indicating the endianess of the 
  object as it was stored on the disk ('l' = little endian, 'b' = big 
  endian, and 'n' no endianess).  In Alpha_03 the version was changed
  to be four digits and the endianess character was eliminated.  The
  endianess was eliminated because I decided to always just store and
  transfer objects as big endian and reversal needed (on little endian
  machines can be done when the object is read in from disk).

  So then the version numbers in the stored objects were:

    Alpha_01: 001x (where x is the endianess character)
    Alpha_02: 002x (where x is the endianess character)
    Alpha_03: 0003


Alpha_03 - 27-Dec-2005

  Changed the ObjRef again so that it is only 4 bytes instead of 8 bytes.
  The logic behind this is that even with a 250 gigabyte hard drive you
  can really only have a maximum of 488 million files since the size of
  each object is 512 bytes.  That is less than 12% of the available ids
  using 4 bytes, so there really isn't any danger of running out of ids
  right away.  A terrabyte drive would still use less than half of the
  available ids.  And when we start having 2 and up terabytes on a drive
  we should be fairly easily go to 5 byte ids.  That should be good up
  to a petabyte (is that what is after terabytes?).  There is no need to
  go from 4 bytes all the way to 8 bytes because there is no reason to
  have to be binary multiples since we are dealing with them one byte
  at a time.

  The object reference size should be adjusted to fit properly on the 
  storage medium, when 5 terabyte drives become available it will need 
  to be 5 bytes.  On smaller devices such a 256 Mb flash drives (assuming 
  minimum files size is still 512) could even do with 2 or 3 byte object 
  reference.  Let's see two bytes: 512 * 65536 = 33,554,432 would be good 
  for up to 32 Mb and three bytes: 512 * 16777216 = 8,589,934,592 would
  be good up to 8 Gb.

  Since we only have 4 bytes to deal with there is also no need to use
  the weird base32 file names.  The funny base32 filenames were kinda
  cool looking and made it easy to find objects, but that also made it
  easier for anyone trying to crack the system to get information.  So
  for security reasons I have changed it to use completely random ids.


Alpha_02 - 24-Dec-2005

  Fixed bugs in the create_phone and find_phone apps that couldn't deal with
  names where there was only one choice.

  Fixed bugs in the create_phone where the string buffers for area code and
  phone number were too short (not room for the new line character).

  Removed the "host" id from all object references (ObjRef).  Host redirection
  will be done with "redirection" objects in the future.


Alpha_01 - 22-Dec-2005

  I do NOT recommend using this version to store information that you don't want 
  anyone else to read.  There is no security in this version, all of the data 
  can be easily be read by anyone with access to the files.

  This is the first version that actually does something.  You can input 
  information about a person including their phone number and read it back.


