Biblioteconomia e Archivistica [en]
Biggest Mistakes in Web Design, 1995-2015
The Web Pages That Suck web site has a good summary of some of the most egregious mistakes web designers make, called “Biggest Mistakes in Web Design, 1995-2015.” Yes, they are well aware that 2015 is in the future, but they justify it thus: “Yes it is a little facetious to say these mistakes will be made in the year 2015, but it’s human nature to repeat your mistakes over and over. But it’s human nature to repeat your mistakes over and over.”
Some of my “favorites” with bits of their commentary are:
- Believing people care about you and your web site. Too many organizations believe that a web site is about opening a new marketing channel or getting donations or to promote a brand or to increase company sales by 15%. No. It’s about solving your customers’ problems.
- A man from Mars can’t figure out what your web site is about in less than four seconds. You should be able to look at the home page of any site and figure out what the site is about within four seconds. If you can’t, the site is a failure.
- Using Mystery Meat Navigation. Mystery Meat Navigation occurs when, in order to find specific pages in a site, the user must mouse over unmarked navigational “buttons” — graphics that are usually blank or don’t describe their function. JavaScript code then reveals what the real purpose of the button is and where it leads.
- Thinking your web site is your marketing strategy. Unless you’re an online shop selling t-shirts, cameras — you get the picture — your web site is not your marketing strategy. Your web site is part of your marketing strategy.
- Site lacks heroin content. In his classic book Naked Lunch, which I read when I was 15, William Burroughs described heroin as the ultimate product. Why? Because people would crawl through the sewers and beg to buy it. In the non-drug world, there are very few products that can be classified as having heroin’s appeal. How many web sites have Heroin Content?
Check out the full post for more.
Turning Off Auto-Pilot
In a brief piece on the American Libraries web site, author Laura Bruzas asks the pointed question: “Has your library been operating on auto-pilot with regards to your purchasing decisions by sticking with desktops versus the now often just-as-powerful laptop?”
Although she was specifically talking about public access computers, I think it applies even more forcefully to staff machines. Most library professionals I know prefer laptops, since they can take them home or to conferences. A desktop, although it still tends to be more powerful than a laptop, is too stationary for the needs of many.
But more generally, how many of our technology purchase “decisions” are on auto-pilot? How often do we continue to do something the same way because that’s the way we’ve always done it? I suspect this happens more than we realize.
The next time you set out to replace equipment, take a moment to consider other options, whether it be a laptop instead of a desktop, or using “cloud” services instead of buying a server. After comparing your options, you may still do what you have in the past, but at least you’ll know the reason(s) why.
Batch Loading Collections into DSpace: Using Perl Scripts for Automation and Quality Control, by Maureen P. Walsh [Appendixes A-E]
Appendixes A-D are included below along with Appendix E.
Appendix A. OJS Batch Loading Scripts
-- mkcol.sh --
#!/bin/sh# Create a Collection given a name and a collection handle. # Gets information from DSpace web pages and returns data via GET parameters to the DSpace # Collection Wizard.
NAME="$1"COLLECTION_HANDLE="$2"
URL="https://kb.osu.edu/dspace"NAME_PAT=">$NAME</option>"
# Login to DSpace and create the cookie.txt file.curl -k -L -s $URL/password-login -d "login_email=[name removed]@osu.edu" -d "login_password=XXXXX" -c cookie.txt > /dev/null
# Cut the community_id out of the web page.COMMUNITY_ID=`curl -k -L -s -b cookie.txt \ $URL/handle/1811/$COLLECTION_HANDLE \ | grep -m1 name=\"community_id\" \ | cut -d\" -f6`
# Cut the collection_id out of the web page.COLLECTION_ID=`curl -k -L -s -b cookie.txt \ $URL/tools/collection-wizard \ -d "community_id=$COMMUNITY_ID" \ | grep -m1 name=\"collection_id\" \ | cut -d\" -f6`
# Begin building the collection.curl -k -L -s -b cookie.txt \ $URL/tools/collection-wizard \ -d "public_read=true" \ -d "workflow1=true" \ -d "workflow2=" \ -d "workflow3=" \ -d "collection_id=$COLLECTION_ID" \ -d "default-item=" \ -d "stage=1" \ -d "admins=" > /dev/null
# Finish making the collection.curl -k -L -s -b cookie.txt \ $URL/tools/collection-wizard \ -F "name=$NAME" \ -F "short_description=" \ -F "introductory_text=" \ -F "copyright_text=" \ -F "side_bar_text=" \ -F "provenance_description=" \ -F "license=" \ -F "file=" \ -F "collection_id=$COLLECTION_ID" \ -F "stage=2" \ -F "permission=12" > /dev/null
# Get and return the handle_id.HANDLE_ID=`curl -k -L -s -b cookie.txt \ $URL/handle/1811/$COLLECTION_HANDLE \ | grep -m1 "$NAME_PAT" \ | cut -d\" -f2`echo $HANDLE_ID
-------------------------------------------------------------------------------------------------------------------------------
-- mkallcol.pl --
#!/usr/bin/perl
# Routine to clean up individual fields.sub trim($){ my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string;}
# Read the file of issue names into an array.open(fh,"issues-prod.remainder");@lines=<fh>;close(fh);
$linenum = 0;%lt=();
$COMMUNITY = "686";
# For each issue get the parameters from the array and call the script to create the collection.while ($linenum <= $#lines) { @fields = split(/\t/, $lines[$linenum]); $issue = $fields[1]; chop($issue); system("echo -n $fields[0] "); print " "; system("./mkcol.sh $issue $COMMUNITY"); $linenum++;}
-- Sample of the file of issue names --
V074N2 "Ohio Journal of Science: Volume 74, Issue 2 (March, 1974)"V074N3 "Ohio Journal of Science: Volume 74, Issue 3 (May, 1974)"V074N4 "Ohio Journal of Science: Volume 74, Issue 4 (July, 1974)"V074N5 "Ohio Journal of Science: Volume 74, Issue 5 (September, 1974)"
-------------------------------------------------------------------------------------------------------------------------------
-- metadata.pl --
#!/usr/bin/perl
use Encode; # Routines for UTF encoding.
# Routine to clean up individual fields of metadata.sub trim($){ my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string;}
# Read the metadata into an array.open(fh,"<:encoding(UTF-16)", "OJSPhase2-1.txt");@lines=<fh>;close(fh);
# Process each line of metadata, consolidating lines for the same item.$linenum = 0;%lt=();while ($linenum <= $#lines) { @fields = split(/\t/, $lines[$linenum]); if ($fields[0] =~ /^((v|V)[0-9]+(n|N)[0-9A-Za-z]+)/) { $lt{uc($1)} = [@{$lt{uc($1)}}, $linenum]; } $linenum++;}
# Build the load set for each item.for $key (sort(keys(%lt))) { # Put each load set in its own subdirectory. print "mkdir ./src/$key\n"; system "mkdir ./src/$key"; # Process the lines for this load set. for $i (0 .. $#{$lt{$key}}) { $dir = sprintf("item_%03d", $i); print "mkdir ./src/$key/$dir\n"; system "mkdir ./src/$key/$dir"; # Create the XML for the metadata. open(fh,">:encoding(UTF-8)", "./src/$key/$dir/dublin_core.xml"); print fh '<dublin_core>'."\n"; @fields = split(/\t/, $lines[$lt{$key}[$i]]); $fields[1] =~ s/"//g; $fields[5] =~ s/"//g; if (length($fields[9])>0) { print fh '<dcvalue element="identifier" qualifier="citation">' . "$fields[1]. v$fields[3], n$fields[4] ($fields[5]), $fields[8]-$fields[9]</dcvalue>\n"; } else { print fh '<dcvalue element="identifier" qualifier="citation">' ."$fields[1]. v$fields[3], n$fields[4] ($fields[5]), $fields[8]</dcvalue>\n"; } if (length($fields[10]) > 0) { $fields[10] =~ s/["]{1}([^"])/$1/g; $fields[10] =~ s/("|"")$//g; print fh '<dcvalue element="title" qualifier="">'.$fields[10]."</dcvalue>\n"; } print fh '<dcvalue element="identifier" qualifier="issn">'.$fields[2]."</dcvalue>\n"; print fh '<dcvalue element="date" qualifier="issued">'.$fields[6]."-".$fields[7]."</dcvalue>\n"; # Process multiple authors. if (length($fields[11]) > 0) { $fields[11] =~ s/"//g; @authors = split(/;/,$fields[11]); foreach $author (@authors) { $author =~ s/^\s+//; if (length($author) > 0) { print fh '<dcvalue element="creator" qualifier="">'.$author.'</dcvalue>'."\n"; } } } if (length($fields[12]) > 0) { $fields[12] =~ s/"//g; print fh '<dcvalue element="description" qualifier="">Author Institution: '.$fields[12]."</dcvalue>\n"; } if (length($fields[13]) > 0) { $fields[13] =~ s/"//g; print fh '<dcvalue element="description" qualifier="abstract">'.$fields[13]."</dcvalue>\n"; } print fh "</dublin_core>\n"; close(fh); # Finished creating the XML file.
# Create the contents file. open(fh, ">./src/$key/$dir/contents"); $fields[0] = trim($fields[0]); print fh "$fields[0].pdf\n"; close(fh);
# Move the data files into the load set. print "cp pdfs/$fields[0] ./src/$key/$dir\n"; system "cp pdfs/$fields[0].pdf ./src/$key/$dir"; }}
-------------------------------------------------------------------------------------------------------------------------------
-- loaditems.pl --
#!/usr/bin/perl
#Load the list of issues into an array.open(fh,"loaditems");@lines=<fh>;close(fh);
# Process each issue.$linenum = 0;while ($linenum <= $#lines) { @fields = split(/ /, $lines[$linenum]); chop($fields[1]); # Add the issue to DSpace. system("./import.sh $fields[1] $fields[0]"); $linenum++;}
-- Sample of the load items file --
V074N2 1811/22016V074N3 1811/22017V074N4 1811/22018V074N5 1811/22019
-------------------------------------------------------------------------------------------------------------------------------
-- import.sh --
#!/bin/sh
# import.sh collection_id dir# Import a collection from files generated on dspace# Requires the directory of the destination collection and the collection id.
COLLECTION_ID=$1EPERSON=[name removed]@osu.eduSOURCE_DIR=./src/$2MAP_DIR=./prod-map/BASE_ID=`basename $COLLECTION_ID`MAPFILE=./$MAP_DIR/map.$2/dspace/bin/dsrun org.dspace.app.itemimport.ItemImport --add --eperson=$EPERSON --collection=$COLLECTION_ID --source=$SOURCE_DIR --mapfile=$MAPFILE
-------------------------------------------------------------------------------------------------------------------------------
-- intro.pl --
#!/usr/bin/perl
# Routine to clean up individual fields.sub trim($){ my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string;}
# Read the metadata into an array.open(fh,"<:encoding(UTF-16)", "OJSPhase2-1.txt") or die "Can't open metadata file: $!";@lines=<fh>;close(fh);
# Process each line of metadata, consolidating lines for the same item.$linenum = 0;%lt=();while ($linenum <= $#lines) { @fields = split(/\t/, $lines[$linenum]); if ($fields[0] =~ /^((v|V)[0-9]+(n|N)[0-9A-Za-z]+)/) { $lt{uc($1)} = [@{$lt{uc($1)}}, $linenum]; } $linenum++;}
# Assemble each intro.for $key (sort(keys(%lt))) { open(fh,"./prod-map/map.$key") or next; @fids=<fh>; close(fh); @fids = sort(@fids);
print "Generating intro for $key ...\n"; open(fh,">:encoding(UTF-8)", "./src/$key/intro");
# Create the HTML for each article. for ($i = 0; $i <= $#{$lt{$key}}; $i++) { @fields = split(/\t/, $lines[$lt{$key}[$i]]); if (length($fields[10]) > 0) { $fields[10] =~ s/["]{1}([^"])/$1/g; $fields[10] =~ s/("|"")$//g; print fh "<strong>$fields[10]</strong><br>\n"; } # Create the list of authors. $authcnt = 0; if (length($fields[11]) > 0) { $fields[11] =~ s/"//g; @authors = split(/;/,$fields[11]); foreach $author (@authors) { $author =~ s/^\s+//; if ($authcnt > 0) { print fh "; $author"; } else { print fh $author; } $authcnt++; } } # Add page numbers. if (length($fields[8]) > 0) { print fh " pp. $fields[8]"; } if (length($fields[9]) > 0) { print fh "-$fields[9]"; } print fh "<br>\n"; # Create links for each article. @item_hid = split(/\s/,$fids[$i]); $itemno = $item_hid[0]; $itemhid = $item_hid[1]; $fields[0] = trim($fields[0]); $filename = "./src/$key/$itemno/".$fields[0].".pdf"; @st = stat($filename) or die "No $filename: $!"; $size = int($st[7]/1024); $url_1 = "/dspace/handle/$itemhid"; $url_2 = "/dspace/bitstream/$itemhid/1/$fields[0]"; print fh '<a href="'.$url_1.'">Article description</a> | <a href="'.$url_2.'">Article Full Text PDF ('.$size.'KB)</a><br><br>'; print fh "\n"; } close(fh);}
-------------------------------------------------------------------------------------------------------------------------------
-- installintro.sh --
#!/bin/sh# Install an intro given a dir and a community id.DIR="$1"HANDLE="$2"URL="https://kb.osu.edu/dspace"# Login to DSpacecurl -k -L -s $URL/password-login -d "login_email=[name removed]@osu.edu" -d "login_password=password" -c cookie.txt > /dev/null
# Cut the community_id out of the web page.COMMUNITY_ID=`curl -k -L -s -b cookie.txt \ $URL/handle/$HANDLE \ | grep -m1 name=\"community_id\" \ | cut -d\" -f6`
# Cut the collection_id out of the web page.COLLECTION_ID=`curl -k -L -s -b cookie.txt \ $URL/handle/$HANDLE \ | grep -m1 name=\"collection_id\" \ | cut -d\" -f6`
# Cut the title out of the web page.TITLE=`curl -k -L -s -b cookie.txt \ $URL/tools/edit-communities \ -d "community_id=$COMMUNITY_ID" \ -d "collection_id=$COLLECTION_ID" \ -d "action=4" \ | grep -m1 name=\"name\" \ | cut -d\" -f6`
# Put the introductory text in DSpace.curl -k -L -s -b cookie.txt \ $URL/tools/edit-communities \ -d "name=$TITLE" \ -d "short_description=" \ -d "introductory_text=`cat ./src/$DIR/intro`" \ -d "copyright_text=" \ -d "side_bar_text=" \ -d "license=" \ -d "provenance_description=" \ -d "community_id=$COMMUNITY_ID" \ -d "collection_id=$COLLECTION_ID" \ -d "create=false" \ -d "action=9" \ -d "submit=Update" > /dev/null
-------------------------------------------------------------------------------------------------------------------------------
-- ldallintro.pl --
#!/usr/bin/perl
# Load file of issues into an array.open(fh,"loaditems");@lines=<fh>;close(fh);
$linenum = 0;%lt=();
# Process each intro.while ($linenum <= $#lines) { @fields = split(/\t/, $lines[$linenum]); print("$lines[$linenum]"); system("./installintro.sh $lines[$linenum] "); $linenum++;}
Appendix B. MSS Phase Two Scripts
-- mkxml2.pl --
#!/usr/bin/perl
# Load routines for UTF-16 and UTF-8use Encode;
# Routine to clean up metadata fieldssub trim($){ my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; $string =~ s/^"//; $string =~ s/"$//; return $string;}
# Load metadata into an array.open(fh,"<:encoding(UTF-16)", "MSA-phase-2-v3.txt");@lines=<fh>;close(fh);
$linenum = 0;%lt=();
# Split tab separated metadata fieldswhile ($linenum <= $#lines) { @fields = split(/\t/, $lines[$linenum]); if ($fields[4] =~ /^([0-9]{4}-[^0-9]+[0-9]+)/) { $lt{$1} = [@{$lt{$1}}, $linenum]; } $linenum++;}
$cnt1 = 0; $cnt2 = 0; $cnt3 = 0; $cnt4 = 0; $cnt5 = 0; $cnt6 = 0;
# Process metadata line by linefor $key (sort(keys(%lt))) { $year = substr($key, 0, 4);
# Generate possible image file names. $keyzero = substr($key,0,-1). "0" . substr($key, -1, 1); $keyuc = uc($key); $keyuczero = uc($keyzero);
# Compensate for inconsistent naming of images in metadata. if (-e "../images/$year/$key.jpg") { $filename = $key; } elsif (-e "../images/$year/$keyzero.jpg") { $filename = $keyzero; } elsif (-e "../images/$year/$keyuc.jpg") { $filename = $keyuc; } elsif (-e "../images/$year/$keyuczero.jpg") { $filename = $keyuczero; } else { $filename = ""; print " NO FILE FOUND images/$year/$key.jpg\n"; }
# Divide output into separate load sets based on year. if (($year >= "1946") && ($year <= "1959")) { $dir = sprintf("1/item_%04d", $cnt1++); } if (($year >= "1960") && ($year <= "1969")) { $dir = sprintf("2/item_%04d", $cnt2++); } if (($year >= "1970") && ($year <= "1979")) { $dir = sprintf("3/item_%04d", $cnt3++); } if (($year >= "1980") && ($year <= "1989")) { $dir = sprintf("4/item_%04d", $cnt4++); } if (($year >= "1990") && ($year <= "1999")) { $dir = sprintf("5/item_%04d", $cnt5++); } if (($year >= "2000") && ($year <= "2100")) { $dir = sprintf("6/item_%04d", $cnt6++); }
# Make a directory for the item. print "mkdir $dir\n"; system "mkdir $dir";
# Create XML file from metadata open(fh,">:encoding(UTF-8)", "$dir/dublin_core.xml"); print fh '<dublin_core>'."\n"; print fh '<dcvalue element="identifier" qualifier="none">' .$key.'</dcvalue>'."\n"; print fh '<dcvalue element="type" qualifier="none">Article</dcvalue>'."\n"; print fh '<dcvalue element="language" qualifier="iso">en</dcvalue>'."\n"; $affiliation = ''; $affiliation1 = ''; $affiliation2 = '';
# Metadata for items with multiple authors, each # with individual affiliations, span multiple lines. # Collect them and produce XML for them. for $i (0 .. $#{$lt{$key}}) { @fields = split(/\t/, $lines[$lt{$key}[$i]]); $title = trim($fields[9]); if (length($title) > 0) { $title =~ s/["]{1}([^"])/$1/g; $title =~ s/("|"")$//g; print fh '<dcvalue element="title" qualifier="none">' .$title.'</dcvalue>'."\n"; } $year1 = trim($fields[1]); if (length($year1) > 0) { print fh '<dcvalue element="date" qualifier="issued">' ."$year</dcvalue>\n"; } $author = trim($fields[5]); if (length($author) > 0) { $author =~ s/(\$|\^|\{|\}|\*)//g; print fh '<dcvalue element="creator" qualifier="none">' .$author.'</dcvalue>'."\n"; } $abstract = trim($fields[10]); if (length($abstract) > 0) { print fh '<dcvalue element="description" qualifier="abstract">' .$abstract.'</dcvalue>'."\n"; } if (length(trim($fields[6])) > 0) { $affiliation1 = trim($fields[6]); } if (length(trim($fields[7])) > 0) { $affiliation2 = trim($fields[7]); } if ((length(trim($fields[6])) > 0) || (length(trim($fields[7])) > 0)) { if ((length(trim($fields[6])) == 0) && (length($affiliation1) == 0)) { $append = $affiliation2; } elsif ((length(trim($fields[7])) == 0) && (length($affiliation2) == 0)) { $append = $affiliation1; } else { $append = $affiliation1.", " .$affiliation2; } if (length($affiliation) > 0) { $affiliation = $affiliation. "; ".$append; } else { $affiliation = $append; } } $note = trim($fields[11]); if (length($note) > 0) { print fh '<dcvalue element="description" qualifier="none">' .$note.'</dcvalue>'."\n"; } } # Done processing multiple authors.
# Finish producing the XML for this item. print fh '<dcvalue element="description" qualifier="none">Author Institution: ' .$affiliation.'</dcvalue>'."\n"; print fh '</dublin_core>'."\n"; close(fh);
# Create the 'contents' file. open(fh, ">$dir/contents");
if ($filename != "") { print fh "$filename.jpg"; $cmd = "cp \"../images/$year/$filename.jpg\" $dir"; print $cmd."\n"; system $cmd; } close(fh);} # Finished processing this item.
-------------------------------------------------------------------------------------------------------------------------------
-- import_collections.sh --
#!/bin/sh## Import a collection from files generated on dspace# COLLECTION_ID=1811/6634EPERSON="[name removed]@osu.edu"SOURCE_DIR=./5BASE_ID=`basename $COLLECTION_ID`MAPFILE=./map.$BASE_ID
/dspace/bin/dsrun org.dspace.app.itemimport.ItemImport --add --eperson=$EPERSON --collection=$COLLECTION_ID --source=$SOURCE_DIR --mapfile=$MAPFILE
Appendix C. Example dublin_core.xml for MSS 2009
<dublin_core>
<dcvalue element="identifier" qualifier="none">2009-MJ-10</dcvalue>
<dcvalue element="title" qualifier="none">VIBRATIONAL OVERTONE SPECTRA OF $C_2H_6$ AND $C_2H_4$ IN CRYOGENIC LIQUIDS</dcvalue>
<dcvalue element="date" qualifier="issued">2009</dcvalue>
<dcvalue element="description" qualifier="abstract">Vibrational overtone spectra of $C_2H_6$ and $C_2H_4$ in cryogenic solutions were recorded between 5000 and 14000 cm$^{-1}$. Spectral regions for the first four overtones were measured using a Fourier transform spectrophotometer. The fifth overtone $(\Delta\nu=6)$ spectra between 15,000 and 16,000 cm$^{-1}$ were recorded with a double beam (pump-probe) thermal lens technique using concentrations as low as 10$^{-3}$ mole fraction. The peak frequency shift $(\Delta\omega)$ from gas phase to solution is explained by the change in harmonic frequency and anharmonicity in solution with respect to the gas phase values. The bandwidth $(\Delta\omega_{1/2})$ of the $(\Delta\nu= 6)$ C-H absorption bands in solution can be explained in terms of collisions with the solvent molecules.</dcvalue>
<dcvalue element="description" qualifier="none">Author Institution: Department of Chemistry and Biochemistry, Baylor University, Waco, Texas, 76798</dcvalue>
<dcvalue element="type" qualifier="none">Article</dcvalue>
<dcvalue element="language" qualifier="iso">en</dcvalue>
<dcvalue element="creator" qualifier="none">Diez-y-Riega, Maria H.</dcvalue>
<dcvalue element="creator" qualifier="none">Manzanares, Carlos E.</dcvalue>
</dublin_core>
Appendix D. Section of MSS Author Quality Control Script
-- flipper.pl --
#!/usr/bin/perl
#### Sections omitted ####
#### Begin author correction block ####
$creatorxml = ""; if (length($creators) > 0) { # Creator name are contaminated with comments. # Remove the comments. $creators =~ s/"//g; $creators =~ s/\\thanks\{.+\}//; $creators =~ s/\\thanks \{.+\}//; $creators =~ s/\\footnote\{.+\}//; # Multiple creators are separated by ';' or AND in the metadata. @creatorlist = split(/;| and | AND /,$creators); # Process each creator. foreach $creator (@creatorlist) { # Remove per name comments and punctuation. $creator =~ s/^\s+//; $creator =~ s/FULL NAME OF AUTHOR FROM OTHER LOCATION//; $creator =~ s/\\underline \{(.+)\}/$1/; $creator =~ s/\\address\{//; $creator =~ s/\\//g; $creator =~ s/\{//g; $creator =~ s/\}//g; $creator =~ s/\^//g; $creator =~ s/\'//g; $creator =~ s/\%//g; $creator =~ s/^AND$|^and$//; if (length($creator) > 0) { $creator =~ s/\.(\w)/. $1/g; # Split the name apart on spaces. @nameparts = split(/ /,$creator); # Process each part of the name. for($i = 0;$i <= $#nameparts; $i++) { # Adjust case. @nameparts[$i] = lc(@nameparts[$i]); @nameparts[$i] = ucfirst(@nameparts[$i]); $c = rindex(@nameparts[$i],"-"); # Uppercase hyphenated names. if ($c != -1) { $r = uc(substr(@nameparts[$i],$c+1,1)); substr(@nameparts[$i],$c+1,1,$r); } } $lname = pop(@nameparts); $nl = @nameparts[-1]; # Handle name prefixes. if ($nl eq "Von" || $nl eq "Vander" || $nl eq "Le" || $nl eq "De" || $nl eq "de") { $lname = pop(@nameparts)." ".$lname; } # Handle special case name parts if ($nl eq "Der" ) { $nl2 = @nameparts[-2]; $lname = pop(@nameparts)." ".$lname; if ($nl2 eq "Van" ) { $lname = pop(@nameparts)." ".$lname; } }
# assemble the name and make the XML. $name = $lname .", ".join(" ",@nameparts); $creatorxml .= '<dcvalue element="creator" qualifier="">' .$name.'</dcvalue>'."\n "; } } } # Done processing creators of this item.
#### End author correction block ######## Sections omitted ####
Appendix E. MSS 2009 Batch Loading Scripts
-- mkxml2009.pl --
#!/usr/bin/perl
use Encode; # Routines for UTF encodinguse Text::xSV; # Routines to process CSV files.use File::Basename;
# Open and read the comma separated metadata file.my $csv = new Text::xSV;#$csv->set_sep(' '); # Use for tab separated files.$csv->open_file("MSS2009.csv");$csv->read_header(); # Process the CSV column headers.
# Constants for file and directory names.$basedir = "/common/batch/input/mss/";$indir = "$basedir/2009";$xmldir= "./2009xml";$imagesubdir= "processed_images";$filename = "dublin_core.xml";
# Process each line of metadata, one line per item.$linenum = 1;while ($csv->get_row()) { # This divides the item's metadata into fields, each in its own variable. my ( $identifier, $title, $creators, $description_abstract, $issuedate, $description, $description2, $abstract, $gif, $ppt, ) = $csv->extract( "Talk_id", "Title", "Creators", "Abstract", "IssueDate", "Description", "AuthorInstitution", "Image_file_name", "Talk_gifs_file", "Talk_ppt_file" );
$creatorxml = ""; # Multiple creators are separated by ';' in the metadata. if (length($creators) > 0) { # Create XML for each creator. @creatorlist = split(/;/,$creators); foreach $creator (@creatorlist) { if (length($creator) > 0) { $creatorxml .= '<dcvalue element="creator" qualifier="none">' .$creator.'</dcvalue>'."\n "; } } } # Done processing creators for this item.
# Create the XML string for the Abstract. $abstractxml = ""; if (length($description_abstract) > 0) { # Convert special metadata characters for use in xml/html. $description_abstract =~ s/\&/&/g; $description_abstract =~ s/\>/>/g; $description_abstract =~ s/\</</g; # Build the Abstract in XML. $abstractxml = '<dcvalue element="description" qualifier="abstract">' .$description_abstract.'</dcvalue>'; }
# Create the XML string for the Description. $descriptionxml = ""; if (length($description) > 0) { # Convert special metadata characters for use in xml/html. $description=~ s/\&/&/g; $description=~ s/\>/>/g; $description=~ s/\</</g; # Build the Description in XML. $descriptionxml = '<dcvalue element="description" qualifier="none">' .$description.'</dcvalue>'; }
# Create the XML string for the Author Institution. $description2xml = ""; if (length($description2) > 0) { # Convert special metadata characters for use in xml/html. $description2=~ s/\&/&/g; $description2=~ s/\>/>/g; $description2=~ s/\</</g; # Build the Author Institution XML. $description2xml = '<dcvalue element="description" qualifier="none">' .'Author Institution: ' .$description2.'</dcvalue>'; }
# Convert special characters in title. $title=~ s/\&/&/g; $title=~ s/\>/>/g; $title=~ s/\</</g;
# Create XML File $subdir = $xmldir."/".$linenum; system "mkdir $basedir/$subdir"; open(fh,">:encoding(UTF-8)", "$basedir/$subdir/$filename"); print fh <<"XML";<dublin_core> <dcvalue element="identifier" qualifier="none">$identifier</dcvalue> <dcvalue element="title" qualifier="none">$title</dcvalue> <dcvalue element="date" qualifier="issued">$issuedate</dcvalue> $abstractxml $descriptionxml $description2xml <dcvalue element="type" qualifier="none">Article</dcvalue> <dcvalue element="language" qualifier="iso">en</dcvalue> $creatorxml</dublin_core>XML close($fh);
# Create contents file and move files to the load set.
# Copy item files into the load set. if (defined($abstract) && length($abstract) > 0) { system "cp $indir/$abstract $basedir/$subdir"; }
$sourcedir = substr($abstract, 0, 5); if (defined($ppt) && length($ppt) > 0 ) { system "cp $indir/$sourcedir/$sourcedir/*.* $basedir/$subdir/"; } if (defined($gif) && length($gif) > 0 ) { system "cp $indir/$sourcedir/$imagesubdir/*.* $basedir/$subdir/"; }
# Make the 'contents' file and fill it with the file names. system "touch $basedir/$subdir/contents";
if (defined($gif) && length($gif) > 0 && -d "$indir/$sourcedir/$imagesubdir" ) { # Sort items in reverse order so they show up right in DSpace. # This is a hack that depends on how the DB returns items # in unsorted (physical) order. There are better ways to do this. system "cd $indir/$sourcedir/$imagesubdir/;" . " ls *[0-9][0-9].* | sort -r >> $basedir/$subdir/contents"; system "cd $indir/$sourcedir/$imagesubdir/;" . " ls *[a-zA-Z][0-9].* | sort -r >> $basedir/$subdir/contents"; }
if (defined($ppt) && length($ppt) > 0 && -d "$indir/$sourcedir/$sourcedir" ) { system "cd $indir/$sourcedir/$sourcedir/;" . " ls *.* >> $basedir/$subdir/contents"; } # Put the Abstract in last, so it displays first. system "cd $basedir/$subdir; basename $abstract >>" . " $basedir/$subdir/contents";
$linenum++;
} # Done processing an item.
-------------------------------------------------------------------------------------------------------------------------------
-- import.sh --
#!/bin/sh## Import a collection from files generated on dspace #COLLECTION_ID=1811/6635EPERSON=[name removed]@osu.eduSOURCE_DIR=./2009xmlBASE_ID=`basename $COLLECTION_ID`MAPFILE=./map-dspace03-mss2009.$BASE_ID
/dspace/bin/dsrun org.dspace.app.itemimport.ItemImport --add --eperson=$EPERSON --collection=$COLLECTION_ID --source=$SOURCE_DIR --mapfile=$MAPFILE
Going Mobile in Academia
The California Digital Library has been studying the use of mobile devices among the University of California faculty and students, and this month they released a report on that work.
A few of their findings:
- Slightly more academic survey respondents own mobile phones without internet (61%) than mobile devices that with internet (53%). Faculty were the most likely respondents (63%) to own a mobile device with internet, followed by graduate students (53%) and then undergraduates (41%).
- Of academic survey respondents who own mobile devices with internet, the majority own iPhone (53%) or iPod Touch (20%) devices. The next highest device was Blackberry (10%), and then Droid (9%).
- Some of the most common uses of mobile devices with internet include finding information and accessing email. They are used less for academic purposes, such as accessing campus or library websites or completing coursework.
- Few survey respondents are using eBook devices and tablets for academic reading.
- Most interviewees noted that they did not want to do actual academic research on mobile devices. Many see research as a difficult activity that would only be more difficult on a mobile device.
- Despite this disinclination to do heavy research on mobile devices, there does seem to be an interest in having the option to access library databases, catalogs, and resources from mobile devices. Instead of using these tools to perform actual research, it is more likely that users will use library databases to retrieve known materials or find quick information.
- Despite positive interest in notification by text message in the literature (including library notifications), most of our participants prefer notifications by email instead of text message.
- Sending oneself email is a way to transfer information and files between devices.
See the report for more findings and recommendations to the UC community, as well as other reports at the web site.
Metadata Creation Practices in Digital Repositories and Collections: Schemata, Selection Criteria, and Interoperability, by Jung-ran Park and Yuji Tosaka
Batch Loading Collections into DSpace: Using Perl Scripts for Automation and Quality Control, by Maureen P. Walsh
Authentication and Access: Accommodating Public Users in an Academic World, by Lynne Weber and Peg Lawrence
The Next Generation Library Catalog: A Comparative Study of the OPACs of Koha, Evergreen, and Voyager, by Sharon Q. Yang and Melissa A. Hofmann
Are Your Digital Documents Web Friendly?: Making Scanned Documents Web Accessible, by Yongli Zhou
The Centripetal vs. Centrifugal Forces of Technology
I can remember when all the talk in technology was about convergence. How separate technology products would fuse into one, and nirvana would ensue. Well, maybe I’m overstating the case. But you get my drift. A lot of pundits were talking about convergence as the next big thing. Funny thing is, you don’t hear many people talking about convergence any more.
But do you have less computing devices on your person these days? I’d be surprised if you do. I don’t. I actually have more. I can remember the day (in this century, mind you), when all I would have with me was a PDA — a Sony Clié, to be specific, which I loved and still have. At that point I didn’t even have a cell phone. Now I have a smartphone, which encompasses both the functions of the PDA and a phone.
For me, that’s the one place where convergence actually happened — the fusing of the PDA and phone into the smartphone. Everywhere else we seem to have divergence, or else a combination of centripetal (the move to unify and converge) and centrifugal (the move to expand and diversify) forces vying for supremacy.
Ebook readers came about to provide special purpose functionality, a small and light form factor, long battery life, and a screen easy on the eyes and readable inside and out. But now the iPad is giving special purpose ebook readers a run for their money, with its ability to do so much more, and in color. Again with the convergence, and yet the device itself is a centrifugal force in that it epitomizes a brand new product line.
To put it in plain English, despite the general tendency for some technologies to converge, you will be sold more products, in the end, not less. Better get used to it.
More Advice for Open Source Software Projects
A while back I posted some advice for managing open source software projects effectively, so I was interested to see this post by Ed Corrrado on paying attention to the little things that can really make a difference for those trying to implement your code. I’ll summarize his points here, and comment on them, but you’ll need to go read the full post for his commentary on these points:
- Include complete install instructions. This is huge. If you fail to note a dependency, or miss a key configuration step, or assume specific knowledge on behalf of the people trying to install your code, they may fail completely.
- On your Website include (at least) basic operating instructions and screen shots. I find screen shots very helpful, even simply to convince me to download and install the software.
- Respond to posts on your forum/blog/e-mail list. If you don’t, how would anyone know that the code is being maintained?
- Keep people informed/updated. Even just a quick note to a mailing list or on a blog is a lot better than nothing.
- Treat users (even newbies) with respect. We were all noobs once, so the Golden Rule applies here as it does just about everywhere else.
While these things may seem obvious things to do to maintain a successful open source software project, they happen. They happen because some of these things can be overlooked by a busy person or team who may also have a “day job”. Or, they could be assigned a low priority and no one ever gets around to it. But as Ed points out, they can be exactly the kinds of things that prevent people from installing and using your software.
Living the Digital Life
As you know from reading one of my recent posts (you did, didn’t you?), I was on vacation in Boston for several days this month. A daughter was taking the Five Week Summer Program at the Berklee College of Music. We arrived in time to see her performance near the end of the program before collecting her belongings later in the week and bringing her home.
I tell you this only to explain why I was walking around with over $1,500 worth of digital hardware on my person. And most of the time it was invisible. I had my iPhone in one pocket, a digital camera in another, and a compact digital camcorder in another (they make them small these days). Then I had my iPad behind my back, under my shirt, tucked under my belt. I was packing serious digital heat. And yet each of those devices served a specific purpose and I used them all at least once — and usually often, but individually — throughout the day.
Some of those uses were for information gathering (e.g., looking up a web site), some were transactional in nature (e.g., making dinner reservations or buying tickets), and others related to communication (e.g., phone calls). But then another major use was collection building — taking photographs and videos.
Most of us have growing digital collections of stuff that we collect and try to manage — often clumsily and lazily. But collect we do. And increasingly we will be challenged to manage our digital collections with any semblance of effectiveness.
Those who use Flickr for photos and YouTube for videos may have a slight leg up on the rest of us, since at least they have their content backed up, and possibly tagged and loosely organized. The rest of us likely have a pile of bits, loosely organized by iPhoto or some other personal computer application. And if we aren’t backing those files up on either another hard drive or web services like Mozy, then we’re living on the edge.
Those of us who are librarians may be better at dealing with our own personal collections of digital files, but I wouldn’t bet on it. What’s that saying about the cobbler’s children?
For my part, I’ve begun a discipline that I’ve carried on for the last few years of taking the best of my digital photos (the non-family ones) and putting them up on my own photos web site, with structured metadata. This doesn’t cover the family photos, or the videos, but at least the best of my other work is organized and saved in a place other than my own hard drive. I also have various backups.
As time goes on, and we all collect more digital stuff than lackadaisical organizing techniques can handle, we’ll need better tools at hand. How about an iPhoto that compares your photographs to others on the web and suggests descriptive terms, or even automatically assigns them? It’s quite likely that your photo of Notre Dame, for example, is quite similar to someone else’s.
That’s just one idea, and it will be interesting to see what software companies do to help us with our growing personal collections of digital stuff. We in digital libraries might see some things we can learn from, and use.
Ebooks: The Good, the Bad, and the Ugly
I’m most of the way through my first real ebook reading experience, which has me thinking about what I like and don’t like about ebooks, and the ways in which they differ from print. These thoughts and impressions are clearly preliminary, as I’ve had only this one ebook reading experience, and it’s been on a specific device (iBooks on the iPad). But I thought they might be sufficiently well-formed to share and get a discussion going among others who have had ebook reading experiences. Please feel free to weigh in with your own comments below.
The GoodVariable displays. Is the print too small? Make it bigger. You don’t like the font? Choose a different one. Since the book is not in fixed form it can be altered on the fly in useful ways to support how you wish to read it.
Unlimited content storage. Carrying around more than a couple print books is hard. Carrying around millions of ebooks is easy.
Easy content availability. If you suddenly decide you want to get a new ebook, you just fire up your device and do it. Getting a new print book often involves a vehicle and a drive somewhere. If you’re on a plane and your seat mate recommends a good book, you at least have a chance of getting it if it’s an ebook.
Privacy. It’s much easier to keep what you’re reading private from others around you with an ereader. Just make sure no one is looking over your shoulder.
The BadLending. Lending? What lending? Unlike the widespread and rich ecology of lending books to family, friends, and acquaintances — or even the practice of leaving books “in the wild” for others to pick up — ebooks have no such option. The digital rights management (DRM) software that these books usually have defeats any such use.
Selling. Selling? What selling? Unlike the widespread and rich ecology of used book sales — including many storefronts and sales that add substantial funds for libraries — ebooks have no such option. The digital rights management (DRM) software that these books usually have defeats any such use. In my community alone our Friends of the Library organization raises tens of thousands of dollars a year through book sales.
Showing Off. I have bookcases full of books that anyone coming into my home will see. The books I have will tell them something about me. An ebook reader shields this from view.
Privacy. While those in your immediate vicinity may have difficulty finding out what you’re reading, Apple or Amazon or whomever you’re buying your books from by god knows what you’re reading. Do you trust them?
The UglyVariable displays. The ability to change the font and/or the size of the font is cool, but it plays havoc with the pagination. How does one cite a location in a book when the page numbers are meaningless?
Navigation. It’s much easier for me to flip to the front of a print book to look at a map, or to the back for the index, than it is in a ebook, where I’m afraid of losing my place and where it isn’t always apparent how to get where I want to go. I realize some of this may change as ebook readers change, but for now it still seems like moving back and forth through the book in large jumps is clumsy and error prone.
Those are some of my early impressions about ebooks and ebook reading. So does this mean I’ve sworn off print books? Hardly. I just returned with a big pile from my local Friends of the Library sale, as did my teenagers. It’s still very much a hybrid world, and to my way of thinking that is a good thing.
Why Location-Based Services are the Killer Digital Library App
It hit me while on the road in Boston last week, carrying around my iPad like a dork. Actually, it would often be invisible as I would tuck it under my shirt and stuff it under my belt behind my back. But I found it incredibly useful at odd moments to check something out on the web, make dinner reservations, etc. Yes, I could often do those things on my iPhone instead, but the larger form factor of the iPad made things much easier. But I digress.
What hit me was how often I was using location-based services. That is, my interest level spikes for those things I’m near. If I’m standing in front of an historic building, I may want to know what went on here. When was it built? What types of activities did it shelter over the years? That is when I realized that if we had geographic coordinate data in our systems about the content we hold (and increasingly we do), then a killer app for libraries, museums, and archives would be a “show me things relating to the area in which I’m standing” application.
Imagine being able to pull up historic digital photographs of the area, official documents from the past that were authored nearby, perhaps even the diary of someone who lived in the area. And the only search criteria would be “where I’m standing right now”. I would pay for such an app, and likely more dearly than for an app that shows me how much my stocks have decreased in value over the last little while. Wouldn’t you?
Thankfully, we’re closer to this than you may think. A cooperative project between the Library of Congress and OCLC (my employer) has added geographic coordinates to over 78,000 name authority records. The project, announced in April of this year, is now complete. Specifically, 78,478 records were enhanced with coordinate data in an 034 field. For example, the record for San Francisco (Calif.) now includes:
034 __ |d W1222509 |e W1222509 |f N0374629 |g N0374629 |2 geonames
Now we just have to do some interesting things with it.
Spam Review Is The New Dusting
If you’re anything like me, you have at least a couple of spam filters running to stem the tide of hundreds of unwanted emails each week (or day!). The problem with these filters is that as good as they may be, they sometimes trap legitimate messages. Since you cannot rust them utterly — unless you are ready to relegate Mom’s message to the trash heap of filtered spam — it’s necessary to review the filtered messages before deletion.
This reminds me of dusting. I hate dusting. In fact, my wife of over 27 years would state that basically I never do it. I redeem myself through other acts of penance, such as window washing and pool cleaning, but I seem to have an ocular malformity that renders me incapable of noticing it. So sue me.
Regardless, I am unable to escape reviewing my spam queue for hidden gems. Important messages can sometimes be lodged between offers to enlarge a part of my body that I have no interest in enlarging, and offers of untold wealth merely for assisting in the transfer of large sums of money out of third world countries. I should be so lucky.
So in my world, checking my various spam queues (and believe me, dear reader, I have more than one) is like dusting — something easily overlooked, something that should happen, and something that will result in more pain than satisfaction — at least in my world. But it needs to be done nonetheless. Welcome to modern life.
Reading Tea Leaves
Why the iPad Changes Everything
A few weeks ago my wife gave me an iPad. I had talked vaguely about getting one in the distant future and I had no expectation that she would get me one for my birthday. Needless to say, I was both utterly surprised and delighted. Over the intervening time, I’ve bought some apps, downloaded some books, and have generally gotten to know it to a certain small degree. What I’ve discovered is that it is changing my life in some very unexpected ways.
- I use the Internet in trivial ways at any time, anywhere. It usually sits on the kitchen island, which is dead center of virtually any path through the house. Since it’s trivial to grab it, fall on the couch or some other spot, and check out the latest happenings in the world via the New York Times’ Editor’s Choice app or Flipboard, I do. I also take it with me places I would never lug my laptop.
- I read more frequently, but often in smaller chunks. Since I keep the iPad handy because it has so many other uses, I find myself reading more, but often in smaller doses. Typically, the print book I’m reading at the time sits on my bedside table, which isn’t convenient to me during the day. Now I find that there are times when I pull up iBooks and read a few pages of the latest book I’m reading (presently Matterhorn, if you must know) at odd moments during the day.
- The experience is as seamless as I’ve ever seen. You can move from a special purpose app to the web and back in a way that seems so natural and easy. Apps will often pull up web pages natively within the app, therefore avoiding the mental discord of leaving one environment and entering another.
- The touchscreen interface is a revelation. I really didn’t think touchscreens would feel as natural as they do. I suppose if I had thought about it some more I would have realized how natural it is for us to point, touch, and manipulate with our fingers, which is all that the iPad requires. And I’m not the only one. Note Emily Clasper’s tweet about her child getting angry at other (one might say medieval) devices that lacked such a natural way of interaction.
In other words, I believe the iPad experience is revelatory. It has changed my perspective on computing devices and how I will likely use them in the future. It has changed the way I think about computers. It has changed my life.
From Blog to Book
The Center for History and New Media of George Mason University has announced a new tool that was created at the One Week, One Tool event. What they developed is Anthologize – a WordPress plug-in that allows you to:
- Grab: Easily pull content from blogs.
- Craft: Drag and drop organization and layout.
- Publish: Generate your book and publish in print and digital formats.
Potential use cases they identified include: a class blog that could be pulled together as a bound volume for the library or for other distribution; a scholar who blogs and is interested in collecting various blog posts to publish it in a more formal format; editors of web sites that might want to bring in posts from disparate blogs and publish them in a journal kind of publication they could put online; and museum curators pulling texts and images together online and exporting it in digital format to be published and sold in museum bookstores. The Center itself intends to use it for the Hacking the Academy kinds of events.
Funding for the Sunday through Saturday “One Week” event was provided by National Endowment for the Humanities.
During the One Week “webcast and reveal,” where I heard about this tool, Dan Cohen used it to pull some blog posts together, including his post about the tool, into an e-Pub book, uploaded it to iTunes, sync’d his iPad, and showed it online to the UStream watchers of the event.
For more information see Dan Cohen’’s blog post and the Anthologize web site. FWIW, what alerted me to today’s launch event was seeing a series of tweets coming through about it.
Lessons From 20 Years of Current Cites
With the publication of the July issue of Current Cites we are celebrating 20 years of continuous monthly publication. Standing alone, that statement is not all that impressive in a world of publications that have much longer publishing histories. But I think there are two things that make that statement into something much bigger than it appears: 1) it is produced by an all volunteer team, and 2) the publication has been freely available on the Internet for nearly the entire 20 years (predating the Web). It was distributed on the PACS-L list by October 1991, and on the MELVYL online catalog before that. Here is an early message about it on PACS-L.
I’m the only one left of the original team, largely because I founded it and it has had my enduring personal commitment. But there have been many contributors who have stayed on for years, contributing citations of current literature that they believe are worthy of attention with insightful commentary written in their personal voice.
In thinking about how to celebrate this anniversary, I thought I would do a couple things. One was to create a web page that described how the publication came to be. Another was that I would write about what I’ve learned over the 20 years of doing this kind of thing. The former is now up on the Current Cites web site. The latter I am doing here. These are some of my lessons:
- Current awareness continues to be important. The changes that are battering our profession are many and substantial. It is more important than ever to keep up with what is going on not just in libraries, but also in the societies within which we work. What we should never do is stick our heads in the sand.
- Current awareness continues to be difficult. When I started Current Cites it was with the belief that it was difficult to keep up with rapid technological change in librarianship. If anything, with the advent of the Web it has sped up and diversified. We have a tremendous number of channels through which we can receive information, with precious few ways to filter them appropriately for our own purposes. Therefore, the need for a publication like Current Cites has only increased, although it must be acknowledged that it adds yet another channel to the diversity of information sources.
- The most important ingredient to keeping something going for 20 years is a responsible individual with the will to make it so. I’ve often thought that if the publication was managed by a committee, or even an organization, it long ago would have ended. I believe this to be true for a couple reasons. It is hard for a group of individuals to have enough personal buy-in to do what needs to be done to keep a publication like this alive. And organizations, in these trying economic times, would find it hard to justify keeping a free publication going. In the end, the personal commitment of a single individual who felt responsible for its continued existence was probably the single biggest factor in its longevity.
- Contributors come and go, but the publication remains. Over the years we’ve had 34 contributors, but probably no more than a dozen active ones at any one time — often only about half-a-dozen. Periodically, as enthusiasm wanes or the call of other responsibilities increases, I need to find new contributors. This not only renews the enthusiasm, it can provide different perspectives and/or a different set of publications that are watched.
- Editors come and go, but the publication remains. Current Cites has had three editors in its life: first David F.W. Robison, then Teri Rinne, then me. I doubt anyone would discern much difference in the publication during each of our tenures, but having someone in charge is important. When I decide to step down I’ll be looking for someone to take it over. I’m certain I will be able to find that person and that it will go on.
- Hosts come and go, but the publication remains. Although Current Cites started at UC Berkeley, when it was clear that support for the server where it was hosted was waning I moved it to WebJunction.org. This was long before I joined OCLC, or even thought to do so. I just needed a logical home for it that would be stable and long-term. My personal server doesn’t qualify.
The last 20 years have been interesting, engaging and challenging. The next 20 promises much more of the same, but faster. My sincere hope is that you will continue to have Current Cites help you find the gems in the information technology literature so that you can focus on not just getting libraries through the next 20 years, but enabling them to thrive.
I also hope that by sharing this story it might inspire some young librarian to take on a similar task, and to apply themselves to draw in other talented individuals to make their project successful and useful for a long time. I know they are out there; I’ve met them, I’ve talked to them, I am even privileged to mentor some of them. I really can’t wait to see what they come up with.
Mea Culpa: The Kindle Did NOT Go Down in Flames
Today Amazon released a new Kindle. At the same time, Amazon CEO Jeff Bezos predicted that e-book sales would surpass paperback sales (they have reportedly already bested hardback sales) “sometime in the next nine to 12 months.”
I think now would be a good time to retract my prediction that “the Kindle will go down in flames”. Sure, I was at least in small part responding to what I viewed as hype, as well as the complete lack of sales figures from Amazon. This was in stark contrast with Apple Computer, for example, which has always announced sales figures of its devices. But nonetheless, I made the prediction also partly based on my deep skepticism of single-purpose e-book reading devices.
For a while I felt relatively comfortable in my prediction, as although I travel a fair amount I didn’t notice many Kindle readers. I posted some other things as well, mostly pejorative, which you can peruse if you have more time to kill than most, here. Suffice it to say that although I knew e-reading would become ubiquitous, I didn’t think single purpose devices were it. Clearly millions of paying customers have proved me wrong. Mea culpa.
And now that Amazon has dropped the price on the entry-level Kindle to $140, the war for eyeballs and book sales is clearly on. This is starting to get to a sufficiently low price point to be compelling as a single-purpose device, and it seems targeted to give the pricier (but also much more full-featured and color) iPad a run for its money. So yes, I was wrong and I’m happy to say so, because we are entering a period where the consumer will win. This struggle for our commerce is leading to well-priced devices that are also very functional for their purpose. And what is not to like about that?

