NeoOffice 2.2.3 Release Tasks

From NeoWiki

Jump to: navigation, search

This page is an attempt to document all of the tasks required to release NeoOffice 2.2.3. This page is by no means comprehensive, but hopefully as we work through the release process, we will leave behind enough details to make future releases simpler and less error prone.

Here is what the colors mean:

Not yet assigned
Assigned but not yet due


Contents

[edit] Builds

In this release, there is no change in either the OpenOffice.org or ooo-build tag that we are using so this build is far simpler than the NeoOffice 2.2.2 build. Since we are updating the bundled icons, no upgrade patch will be released.

TaskDue DateAssignedStatus

Verify that ooo-build does not have a newer tag than the OOO_BUILD_2_2_1 tag.

03/01/2008plubyDone

Verify that odf-converter does not have a newer tag than the Release-1.1 tag.

03/05/2008plubyDone

Commit and test updated icon files in etc/package.

  • cd etc/package
  • Execute the following shell script:
    #!/bin/csh
    #
    # execute within etc/package directory
    
    setenv PKGDIR `pwd`
    
    pushd ~
    curl -C - -O http://homepage.mac.com/punto_mac/projects/neo/downloads/Akua_2008Q1_Release.dmg
    popd
    
    setenv VOL `hdiutil mount ~/Akua_2008Q1_Release.dmg | perl -ne 'if ( /(\/Volumes.*)$/ ) { print $1; }'`
    if ( "$VOL" != "" ) then
            mkdir "Akua 2008Q1 Release"
            pushd "$VOL"
            cp -rf * "$PKGDIR/Akua 2008Q1 Release"
            popd
            pushd "Akua 2008Q1 Release"
            find . -type f -name \.\* -print0 | xargs -0 -n 1 rm -f
            popd
    
            if ( -e AkuaIcons.zip ) then
                    rm AkuaIcons.zip
            endif
            zip -r AkuaIcons.zip "Akua 2008Q1 Release"
            hdiutil unmount "$VOL"
            rm -rf "Akua 2008Q1 Release"
    endif
    
    pushd ~
    curl -C - -O http://www.pimley.net/projects/downloads/NeoOfficeAquaElements.dmg
    popd
    
    setenv VOL `hdiutil mount ~/NeoOfficeAquaElements.dmg | perl -ne 'if ( /(\/Volumes.*)$/ ) { print $1; }'`
    if ( "$VOL" != "" ) then
            mkdir "NeoOffice Aqua Elements 2.1.1.070804"
            pushd "$VOL"
            cp -rf * "$PKGDIR/NeoOffice Aqua Elements 2.1.1.070804"
            popd
            pushd "NeoOffice Aqua Elements 2.1.1.070804"
            find . -type f -name \.\* -print0 | xargs -0 -n 1 rm -f
            popd
    
            if ( -e NeoOfficeAquaElements.zip ) then
                    rm NeoOfficeAquaElements.zip
            endif
            zip -r NeoOfficeAquaElements.zip "NeoOffice Aqua Elements 2.1.1.070804"
            hdiutil unmount "$VOL"
            rm -rf "NeoOffice Aqua Elements 2.1.1.070804"
    
    pushd ~
    curl -C - -O http://www.pimley.net/projects/downloads/RetroOfficeElements.dmg
    popd
    
    setenv VOL `hdiutil mount ~/RetroOfficeElements.dmg | perl -ne 'if ( /(\/Volumes.*)$/ ) { print $1; }'`
    if ( "$VOL" != "" ) then
            mkdir "RetroOffice Elements 2.1.1.070804"
            pushd "$VOL"
            cp -rf * "$PKGDIR/RetroOffice Elements 2.1.1.070804"
            popd
            pushd "RetroOffice Elements 2.1.1.070804"
            find . -type f -name \.\* -print0 | xargs -0 -n 1 rm -f
            popd
    
            if ( -e RetroOfficeElements.zip ) then
                    rm RetroOfficeElements.zip
            endif
            zip -r RetroOfficeElements.zip "RetroOffice Elements 2.1.1.070804"
            hdiutil unmount "$VOL"
            rm -rf "RetroOffice Elements 2.1.1.070804"
    endif
    
  • Rebuild NeoOffice and RetroOffice installers with new icon zip files and verify proper build.
  • Reinstall both builds and check that updated icons are available.
03/06/2008plubyDone

Verify that the build is using the latest version of the DicOOo.sxw and FontOOo.sxw files by selecting the following two NeoOffice menus and completely stepping through the wizards to ensure that no "there is a newer version" dialogs are displayed:

  • File :: Wizards :: Install new dictionaries
  • File :: Wizards :: Install fonts from the web
03/05/2008plubyDone

Rebuild all custom NeoOffice and RetroOffice code using the existing NeoOffice 2.2.2 Patch 11 test patch builds. Perform a confirming checkout of the HEAD branch and set build to build with a new version and NeoOffice and RetroOffice trademarked product names.

This includes the following steps:

  • Do a cvs update -Ad to ensure that you have the latest code in your workspace, verify that none of the files are marked as updated, patched, modified, or have conflicts, and verify that the latest code actually builds through the installer.
  • Copy custom.neo.mk file to custom.mk so that the clean checkout will build with the trademarked product names.
  • In makefile, change the following macros to the respective values:

    PRODUCT_VERSION=2.2.3
    PRODUCT_DIR_VERSION=2.2.3
    X11_PRODUCT_VERSION=2.2.3
    X11_PRODUCT_DIR_VERSION=2.2.3
    PRODUCT_PATCH_VERSION=Patch 0
    PRODUCT_DIR_PATCH_VERSION=Patch-0
    X11_PRODUCT_PATCH_VERSION=Patch 0
    X11_PRODUCT_DIR_PATCH_VERSION=Patch-0
    NEO_TAG:=-rNeoOffice-2_2_3
    X11_NEO_TAG:=-rRetroOffice-2_2_3
    
  • Delete all build.neo_* files so that all custom NeoOffice and RetroOffice code will be rebuilt.
  • Commit makefile changes and invoke make all build.patch_package build.patch_package_X11 to rebuild all applicable code and installers.
03/05/2008plubyDone

Verify that none of the NeoOffice Intel build's executables or libraries link to any X11 libraries.

Note: to do this task, install your latest NeoOffice build and, in a terminal, execute the following commands:

sh
cd /Applications/NeoOffice.app/Contents/MacOS
for i in `find . -type f`; do echo $i ; otool -L $i 2>&1 | grep X11; done

If none of the binaries link to any X11 libraries, the above commands will only print a list of files. However, if you see any lines that look similar to the following, the file listed just before this type of line is linked to an X11 library and this must be correct before the NeoOffice binaries can be released.

/usr/X11R6/lib/libX11.6.dylib (compatibility version 6.2.0, current version 6.2.0)
03/06/2008plubyDone

Verify that none of the NeoOffice PowerPC build's executables or libraries link to any X11 libraries.

Note: Use the same steps as used for the matching Intel task.

03/06/2008plubyDone

Modify and test bin/installutils.patch script to treat only NeoOffice 2.2.3 installations as a match since, in this release, there will be no patch upgrade.

03/09/2008plubyDone

Tag the code in the HEAD branch with the NeoOffice-2_2_3 and RetroOffice-2_2_3 tags using the following:

  • Do a cvs update -Ad to ensure that you have the latest code in your workspace, verify that none of the files are marked as updated, patched, modified, or have conflicts, and verify that the latest code actually builds through the installer.
  • In the makefile, set the NEO_TAG macro to NEO_TAG:=-rNeoOffice-2_2_3 and X11_NEO_TAG macro to X11_NEO_TAG:=-rRetroOffice-2_2_3 and commit the makefile.
  • Tag all files in your workspace by invoking cvs tag NeoOffice-2_2_3 ; cvs tag RetroOffice-2_2_3.
  • Verify that the installer still builds by deleting the build.source_zip* files and invoking make NOLANGPACKS=true.
  • If there are any build errors, fix and commit them, retag the changed files by invoking cvs tag -F NeoOffice-2_2_3 ; cvs tag -F RetroOffice-2_2_3, and repeating the previous two steps.
03/09/2008plubyDone

Create releasable NeoOffice 2.2.3 and RetroOffice 2.2.3 builds for Intel.

Note: the following steps are overkill, but they ensure that all recent changes to the NeoOffice custom code has been built:

  • Do a cvs update -d -rNeoOffice-2_2_3 and verify that none of the files are marked as updated, patched, modified, or have conflicts. If any such errors appear, the previous task (tagging of the workspace) has not been done properly and it needs to done properly before you can proceed with this task.
  • Do a cvs update -Ad so that you can do bug fixing and release patches after you create your releasable build
  • Delete all build.neo_* and build.odf-converter* files. This will force the installer to rebuild the odf-converter code and all of the NeoOffice custom code without causing any of the OpenOffice.org or ooo-build code to be rebuilt.
  • Invoke make all build.patch_package build.patch_package_X11 to create the releasable installer, language packs, and patch installers.
03/09/2008plubyDone

Create releasable NeoOffice 2.2.3 and RetroOffice 2.2.3 builds for PowerPC.

Note: Use the same steps as used for the matching Intel task.

03/09/2008plubyDone

Create backup copy of releasable Intel binaries and upload them to staging server.

The following steps are the steps that I used to create my backup copy:

  • Create an empty NeoOffice-2.2.3 directory outside of the workspace
  • Copy all 58 install/*.dmg files from your releasable build into the empty NeoOffice-2.2.3 directory and chmod 444 *.dmg in that directory

sftp all 58 files up to staging server and chmod 444 *.dmg all of the files on the staging server.

sftp the patch installer file up to staging server and chmod 444 *.dmg all of the files on the staging server.

Repeat the above steps using RetroOffice-2.2.3 instead of NeoOffice-2.2.3 and install_X11/*.dmg instead of install/*.dmg.

Put the NeoOffice-2.2.3 and RetroOffice-2.2.3 folders in a new empty directory and create a CD master NeoRetroOffice-2.2.3.cdr file of the new directory using the following command:

hdiutil create -srcfolder /path/to/new/directory \
-format UDTO -ov -o /path/to/output/NeoRetroOffice-2.2.3.cdr
03/09/2008plubyDone

Create backup copy of releasable PowerPC binaries and upload them to staging server.

Note: Use the same steps as used for the matching Intel task.

03/09/2008plubyDone

Verify that the releasable installers and one or more language packs install and run on Intel for the following Mac OS X versions:

  • 10.4.10
  • 10.5.2
03/12/2008plubyDone

Verify that the releasable installers and one or more language packs install and run on PowerPC for the following Mac OS X versions:

  • 10.3.9
  • 10.4.10
  • 10.5.2
03/12/2008plubyDone

[edit] Mirrors

NeoOffice's rsync server is hosted on rsync.neooffice.org and our volunteer mirrors obtain the NeoOffice binaries by nightly runs of the following command on their mirrors:

rsync -r --delete rsync://rsync.neooffice.org/neojavadownloads/ \
/path/to/NeoOffice/mirror/directory

At this time, we do not mirror RetroOffice binaries.

TaskDue DateAssignedStatus
Upload the 116 NeoOffice installer NeoOffice-2.2.3-*.dmg files to the jane.neooffice.org server's /neojava/downloads directory. 03/12/2008plubyDone
Upload the 116 RetroOffice installer RetroOffice-2.2.3-*.dmg files to the www.planamesa.org server's /retro/downloads directory. 03/12/2008plubyDone

Make room for the new NeoOffice binaries by removing the NeoOffice 2.2.2 binaries from the www.planamesa.org mirror site.

Note: the following steps were used to complete this task:

  • Login to the www.neooffice.org server, cd to the its webroot directory, and invoke the following command: cvs update -r NeoRetroOffice-2_2_2_branch ; chmod -Rf ug+rw .htaccess *.
  • Comment out the www.planamesa.org server from the /neojava/mirrors.php file in the www.neooffice.org website's /neojava/mirrors.php file and invoke the following command to commit your changes: cvs commit ; chmod -Rf ug+rw .htaccess *.
  • Delete all NeoOffice-2.2.2-*.dmg files from the www.planamesa.org server.
03/08/2008plubyDone
Copy the 116 NeoOffice installer NeoOffice-2.2.3-*.dmg files from the rsync.neooffice.org server's /neojava/downloads directory into the www.planamesa.org server's /neojava/downloads directory. 03/12/2008plubyDone
Copy the 116 NeoOffice installer NeoOffice-2.2.3-*.dmg files from the rsync.neooffice.org server's /neojava/downloads directory to the www.planamesa.net server's /neojava/downloads directory. 03/12/2008plubyDone
Copy the 116 RetroOffice installer RetroOffice-2.2.3-*.dmg files from the www.planamesa.com server's /retro/downloads directory to the www.planamesa.net server's /retro/downloads directory. 03/12/2008plubyDone

[edit] Website

TaskDue DateAssignedStatus

Create a branch for the www.neooffice.org website to avoid modifying production web pages while we modify the web pages in the test website. Steps:

  • Construct a local checkout of the website: cvs co www_htdocs
  • cd into the checkout directory and tag the checkout by invoking the following command: cvs tag NeoRetroOffice-2_2_2_branch
  • Login to the www.neooffice.org server, cd to the its webroot directory, and set the tag by invoking the following command: cvs update -d -rNeoRetroOffice-2_2_2_branch ; chmod -Rf ug+rw .htaccess *
03/01/2008plubyDone

Update all NeoOffice and RetroOffice version names, file URLs, and patch version in all of the files in the www-test.neooffice.org server's neojava and retro directories.

Note: I used the following steps to do this:

  • Update the version name, patch version, and file URLs by executing the following commands in the / directory of the web pages:
  • sh
    for i in `find neojava retro -name "*.php" -o -name "header.html" | grep -v 'index\.php'`; do
    sed 's#2\.2\.2#2.2.3#g' $i | \
    sed 's#NeoOffice-2_2_1#NeoOffice-2_2_3#g' | \
    sed 's#RetroOffice-2_2_1#RetroOffice-2_2_3#g' | \
    sed 's#Patch 6#Patch 0#g' | \
    sed 's#Patch-6#Patch-0#g' | \
    sed 's#Patch 11#Patch 0#g' | \
    sed 's#Patch-11#Patch-0#g' > $i.tmp
    mv $i.tmp $i
    done
    for i in `find neojava retro -name "patch.php"`; do
    sed 's#2\.2\.1#2.2.3#g' $i > $i.tmp
    mv $i.tmp $i
    done
    
  • Manually edit the /neojava/globals.php page and set the following variables to the following values and delete all but the zero'th element:
  • $currentproductfamily[0] = '';
    
  • Manually edit the /retro/globals.php page and set the following variables to the following values and delete all but the zero'th element:
  • $currentproductfamily[0] = '';
    
  • Manually edit the news banner text in all of the header.html pages, comment out the "The patch can be downloaded..." line, and replace the "NeoOffice 2.2.2 Patch 11 now imports images from scanners and cameras" and "RetroOffice 2.2.2 Patch 6 improves WordPerfect file handling" lines with a NeoOffice and RetroOffice 2.2.3 announcement.
  • After you verify the that changes look correct, invoke the following command to commit your changes: cvs commit ; chmod -Rf ug+rw .htaccess *
03/01/2008plubyDone
cvs remove the 2 obsolete NeoOffice-2.2.2-*.torrent files from the www-test.neooffice.org website's /neojava/downloads directory and invoke the following command to commit your changes: cvs commit ; chmod -Rf ug+rw .htaccess *. 03/01/2008plubyDone

Update the 116 NeoOffice 2.2.3 file sizes in all of the *download.php files in the /neojava directory of the www-test.neooffice.org server's web pages.

Note: I used the following steps to do this:

  • Login to the www-test.neooffice.org server, cd to the its webroot directory, and invoke the following command: cvs update -Ad ; chmod -Rf ug+rw .htaccess *
  • Get a file containing the new release's file names and the matching file sizes from the NeoOffice 2.2.2 release by executing the following command:
  • ls -l /directory/NeoOffice-2.2.2/binaries/NeoOffice-2.2.2-*.dmg | \
    awk '{print $9 " " $5}' | \
    sed 's#^.*NeoOffice-2.2.2#NeoOffice-2.2.3#' | \
    sort > /path/to/a/new/file
    
  • Get a file containing the new release's file names and the matching file sizes by executing the following commands:
  • ls -l /directory/NeoOffice-2.2.3/binaries/NeoOffice-2.2.3-*.dmg | \
    awk '{print $9 " " $5}' | \
    sort > /path/to/a/new/file
    
  • Create a chained list of sed commands by executing the following command:
  • join /file/from/first/step /file/from/second/step | \
    sed 's#^.*dmg ##' | \
    sed 's# #\##' | \
    sed 's#^#sed "s\##' | \
    sed 's#$#\#g" | \\#' > /path/to/a/new/file
    
  • Manually edit the file created in the last step and insert the following lines before the first sed command:
  • for i in `find . -name "*download.php"`; do
    cat $i | \
    
  • Manually edit the same file and insert the following lines after the last sed command:
  • cat > $i.tmp
    mv $i.tmp $i
    done
    
  • cd to the /neojava directory and execute the following command to update all of the file sizes:
  • sh /path/to/file/edited/in/last/step
    
  • After you verify the that changes look correct, invoke the following command to commit your changes: cvs commit ; chmod -Rf ug+rw .htaccess *
03/08/2008plubyDone

Update the 116 RetroOffice 2.2.3 file sizes in all of the *download.php files in the /retro directory of the www-test.neooffice.org server's web pages.

Note: I used the following steps to do this:

  • Login to the www-test.neooffice.org server, cd to the its webroot directory, and invoke the following command: cvs update -Ad ; chmod -Rf ug+rw .htaccess *
  • Get a file containing the new release's file names and the matching file sizes from the RetroOffice 2.2.2 release by executing the following command:
  • ls -l /directory/RetroOffice-2.2.3/binaries/RetroOffice-2.2.2-*.dmg | \
    awk '{print $9 " " $5}' | \
    sed 's#^.*RetroOffice-2.2.2#RetroOffice-2.2.3#' | \
    sort > /path/to/a/new/file
    
  • Get a file containing the new release's file names and the matching file sizes by executing the following commands:
  • ls -l /directory/RetroOffice-2.2.3/binaries/RetroOffice-2.2.3-*.dmg | \
    awk '{print $9 " " $5}' | \
    sort > /path/to/a/new/file
    
  • Create a chained list of sed commands by executing the following command:
  • join /file/from/first/step /file/from/second/step | \
    sed 's#^.*dmg ##' | \
    sed 's# #\##' | \
    sed 's#^#sed "s\##' | \
    sed 's#$#\#g" | \\#' > /path/to/a/new/file
    
  • Manually edit the file created in the last step and insert the following lines before the first sed command:
  • for i in `find . -name "*download.php"`; do
    cat $i | \
    
  • Manually edit the same file and insert the following lines after the last sed command:
  • cat > $i.tmp
    mv $i.tmp $i
    done
    
  • cd to the /retro directory and execute the following command to update all of the file sizes:
  • sh /path/to/file/edited/in/last/step
    
  • After you verify the that changes look correct, invoke the following command to commit your changes: cvs commit ; chmod -Rf ug+rw .htaccess *
03/08/2008plubyDone

Enable the BitTorrent links using the following steps:

  • Obtain the 2 NeoOffice-2.2.3-*.torrent files from the mirrors.freesmug.org mirror maintainer and cvs add these 2 files in the www-test.neooffice.org website's /neojava/downloads directory.
  • After you verify the that changes look correct, invoke the following command to commit your changes: cvs commit ; chmod -Rf ug+rw .htaccess *
03/13/2008plubyDone

Obtain each localized version of the NeoOffice 2.2.3 press release in HTML format, save them in the www-test.neooffice.org website's /neojava/press_releases directory using the following naming format so that the webserver's language detection will serve the closest matching file, cvs add the files, and invoke the following command to commit your changes: cvs commit ; chmod -Rf ug+rw .htaccess *:

  • English - Save as two files: NeoOffice_2.2.3.html.en and NeoOffice_2.2.3.html.html
  • Other languages - Save using the format NeoOffice_2.2.3.html.<two-digit-language-code> replacing <two-digit-language-code> with the standard language code (e.g. de for German, fr for French, etc.
03/13/2008plubyDone
When a mirror that has been commented out in the www-test.neooffice.org website's /neojava/mirrors.php file has mirrored the NeoOffice 2.2.3 binaries, uncomment and the mirror and invoke the following command to commit your changes: cvs commit ; chmod -Rf ug+rw .htaccess *. pluby

[edit] Release

Generally, we try to time the release when it is early morning of the release date in New Zealand which is the most populous country closest to the international date line. However, due to some last minute bug fixing, the release won't occur until afternoon in New Zealand. For this release, 10 October 2007 translates to anytime after 10:00 pm on 9 October 2007 in California.

TaskDue DateAssignedStatus
Add "2.2.3" as a version in Bugzilla. 03/17/2008plubyDone
Make the NeoOffice and RetroOffice 2.2.3 binaries downloadable from the www.neooffice.org website's download pages by updating the www.neooffice.org website's pages to match what is in the www-test.neooffice.org website's pages. Login into the www.neooffice.org server, cd to the its webroot directory, and invoke the following command: cvs update -Ad ; chmod -Rf ug+rw .htaccess *. 03/17/2008plubyDone
On the neowiki.neooffice.org main page, replace all occurrences of 2.2.2 that are related to NeoOffice or RetroOffice with 2.2.3. Do not change any that are related to OpenOffice.org since there is no OpenOffice.org 2.2.3 release. 03/17/2008plubyDone
On the [1] page, remove any test patch text and links. 03/17/2008plubyDone
Replace the NeoOffice 2.2.2 MD5 checksums page with the NeoOffice 2.2.3 MD5 checksums and replace the RetroOffice 2.2.2 MD5 checksums page with the RetroOffice 2.2.3 MD5 checksums. 03/17/2008plubyDone

Close all bugs with a status of "Resolved" by setting the following field values:

  • Set "Status" field to "Closed"
  • Set "Resolution" field to "Fixed"
  • Set "Target Version" field to "2.2.3"
  • Set "Closed in Version" field to "2.2.3"
03/17/2008plubyDone

Close any bugs with a status of "Assigned" and resolution of "Fixed" (bugs fixed in the release build after the final Early Access patch) by setting the following field values:

  • Set "Status" field to "Closed"
  • Set "Resolution" field to "Fixed"
  • Set "Target Version" field to "2.2.3"
  • Set "Closed in Version" field to "2.2.3"
03/17/2008plubyDone
Post the press release as an article on trinity.neooffice.org. Note: be sure to change the language field from "English" to "All" in when submitting the article so that all Trinity users will see the article. 03/17/2008plubyDone
Post a release announcement to the NeoJUpdate mailing list. 03/17/2008plubyDone
Post a release announcement to the Trinity forum topic so that the news is included in the RSS feed. 03/17/2008plubyDone
Delete the 116 NeoOffice 2.2.2 NeoOffice-2.2.2-*.dmg files from the rsync.neooffice.org, jane.neooffice.org, and www.planamesa.net servers' /neojava/downloads directory. 03/17/2008plubyDone
Delete the 116 RetroOffice 2.2.2 RetroOffice-2.2.2-*.dmg files from the www.planamesa.com and www.planamesa.net servers' /retro/downloads directory. 03/17/2008plubyDone
Delete the 2 obsolete NeoOffice 2.2.2 NeoOffice-2.2.2-Patch-*.dmg patch installer files from the rsync.neooffice.org and jane.neooffice.org servers' /neojava/downloads directory. 03/17/2008plubyDone
Delete the 2 obsolete RetroOffice 2.2.2 RetroOffice-2.2.2-Patch-*.dmg patch installer files from the jane.neooffice.org server's /retro/downloads directory. 03/17/2008plubyDone
After the files have been deleted from the rsync server, wait 48 hours and verify that these files have been deleted from the mirrors listed in the www.neooffice.org website's /neojava/mirrors.php file. Contact any mirror maintainers that still have these files to confirm that they are rsynching to the rsync server regularly. pluby

Synchronize the donation's database to PayPal's database to ensure that none of the donors' transactions are missing and to pick up any e-mail address changes made by donors during the Early Access period using the following steps:

  • Login to PayPal, click on the History tab, click on Download My History link, select Custom Date Range, enter the day before the start of the Early Access period as the "From" date and the current date as the "To" date, and "Comma Delimited - All Activity" as the "File Types to Download".
  • It will take some time for PayPal to prepare the file. Once the file is ready, download it and use sftp to copy it to the www.neooffice.org server. Note: be sure to delete your local copy.
  • Once the history file is on the www.neooffice.org server, login to the server, cd to the /donationsadmin directory, and execute the following command to import the history file:
    sh
    ./import_paypal_transaction_history.php /path/to/history/file 2>/path/to/error/file
    
  • Inspect the entries in the error file created in the previous command and verify that none of the rejected lines from the file are donor transactions.
pluby
Personal tools