Efficient DBA Part 1 Presentation

I presented to the Twin Cities Oracle User Group on January 19th, 2012 on part one of an ongoing series called “Efficient DBA”. The focus of the series is how to minimize or eliminate processes or keystrokes for doing repeatable steps in a DBA’s day-to-day activities.

The PowerPoint presentation can be downloaded here.

New Digs

I’d like to say that my absence over the last few months has something to do with my job change, but that just doesn’t hold water. Especially, since I only changed jobs three weeks ago. I just haven’t felt like writing anything for the last few months. I often think about blogging but it seems that every time I psyche myself up to do it, I can’t think of anything unique to offer. In other words, the stuff that I want to write about has already been done and written about many times over. I’m slowly convincing myself that it doesn’t matter and that this medium is as much of an outlet for me as it is a consumable for others.

I have a lot of complaints about my previous employer, but no regrets. I learned a lot from my work, the technology I used, the people I worked with and the experiences I gained over the last three years. I left amicably (as amicably as possible when leaving a job) and could see myself there again sometime in the future. In fact, I suggested as much.

My new employer as of the beginning of November is entirely different from my previous one. For one thing, it is a large company, as in many, many times the size in people and revenue. I was very hesitant because I have only worked in small or medium size companies for my entire IT career. I have always had all the keys, passwords and clearance.

Now I have very little and my jurisdiction is clearly defined. In the past three weeks, I have come to love the fact that I am somewhat locked down in my silo of database services. Database is what I fell in love with and committed to way back in the beginning. A recent trip to Oracle OpenWorld renewed that passion and made this transition the obvious right choice.

So now I am a “Database Analyst – Oracle” (according to my business card). Everything else is provided to me through a company service. By the time I see the server the OS is installed, the configuration of the network, disk, etc. is done and verified and the installation files I need are mounted on an NFS share. Sweet! You mean I actually get to start and finish a project without having to babysit or do every process in between that I’m not supposed to be doing? I’ll take it.

Here’s the really fun part. I’m working directly with people that are as passionate about technology and career growth as I am. Everywhere I look there is someone to laud and strive to emulate. These things make for a very challenging and fulfilling work day.

Possibly the most important thing is the person I report to. Management methods vary as much as personalities so finding the right person to work under can be very challenging. I believe I have found close to what I have characterized in my mind as the ideal manager. The way I see a manager in a professional environment is someone whose end goal is to deliver objectives to his superior. Everything else should be a means to that end.

So when I hear my manager say that he doesn’t have time to manage me as an individual and he only expects me to deliver the finished product on time, I feel that the totality of the effort I put in to succeed in my job is going to make myself look just as good to my manager as my manager will look to his director. I don’t have to worry about the stuff that doesn’t matter like figuratively punching a timecard or worrying about scheduling dentist appointments after work hours.

I realize I am only in week three and a lot can change in a short time, but I feel like I’m in the right place now and I’m ready to really showcase my skills and see if this company is ready to accommodate what I am looking for and capable of producing.

By the way, the coffee here is fantastic and free!

Use Service Name in Oracle to Disable Database Login

Recently I was trying to do some database updates to a development database, but I was running into problems truncating and deleting from tables because other users on the system had rows locked with NOWAIT. I wanted to find a way to disable user access without actually taking down the database. I also had the problem of having other production databases on the same server so just shutting down the listener was not an option. The third option was to take down the forms application server, but that is also serving multiple instances. So the best option seemed to be to disable the service that the listener was connecting to.

First, I confirmed the tnsnames.ora on the app server was pointing to service name instead of sid. Then, I used dbms_service to disable the service.

execute dbms_service.STOP_SERVICE(‘serv’);

That didn’t seem to do anything though so I looked at the dba_services table to make sure it was disabled. What I found was that all of the services were disabled.

SYS$BACKGROUND NO
SYS$USERS NO
servXDB NO
serv NO

I’m not sure why this didn’t work or why all of the services are disabled, but I ended up altering the tnsnames.ora on the application server so that the forms couldn’t connect. If there are any thoughts as to how to accomplish what I was trying to do, please leave a comment.

What Is Missing Is The Vision

I recently attended W. Curtis Preston’s (aka Mr. Backup) Backup Central Live full day event in downtown Minneapolis. I look forward to this event every year. This event was my third with Preston in as many years although technically, this event was the first of it’s kind in this city. Preston’s road shows used to be produced by TechTarget, but now they are produced by his own company, Truth in IT. The differences between the two shows are noticeable in a number of ways including the improvement of the schedule format, the inclusion of other independent thought leaders in the industry (Jacob Farmer from Cambridge Computers) and even live audience polling throughout the day. This presentation was a significant improvement over past years. A schedule of upcoming Backup Central Live! events is available here: http://www.backupcentrallive.com

There were close to 50 end users in attendance as well as a dozen vendor folks. I had some very good conversations with both end users and vendors. With both groups of people, our conversations were generally not about how certain vendor software works versus another. The conversations were more often centered around the issues IT professionals have with their data and those that they report to.

The thing that most inspired this blog post and hit so close to home with me is the vision of what to do with data and how to accomplish that vision. I am not so much referring to the tactics or logistics, but more with strategy and end goals of where and how that data should be maintained, deleted, formatted, etc.

Mr. Preston talked about the differences between “Backup” and “Archive” and then asked a poll question of the audience about their company’s backup and archive strategy. The answer was predominantly that there was a lack of strategy and most businesses only backup their data with no forethought of how it would be restored, nor the consequences of not having an archiving strategy.

There is little doubt that backup and especially restore are all too often at the bottom of the priority list unless (and sometimes not even if) a server crash or data loss occurs. This lack of priority seems to happen in my situation because the priority list is constructed based on what the most pressing issue of the day is. Should we forget about what needs to happen tomorrow or next week and write the priority list based on what is relatively more important like data protection? Not necessarily, but what seems to be missing is the vision of where the company is or needs to be going and how IT’s role will play out in that vision.

An issue brought up during the conference was data retention. Specifically, what is a company’s legal obligations for data retention and what happens to the data once those obligations have been clearly defined. Most company’s attitude seems to be, “Save everything just in case…” Mr. Preston suggests that the opposite should be the case. The default of data retention should be, “Unless it needs to be saved, delete it as soon as possible.”

There are multiple reasons for doing this, but the most relevant is based on the fact that we are such a litigious society today. If data exists that is relevant to a case, the defendant must produce it regardless of the cost. However, if that same data was properly and legally deleted on a regular and consistent basis (e.g. not immediately following a subpoena), the defendant would not incur the expense of discovering and producing that data. The onus then of producing evidence of wrong-doing would be on the plaintiff.

The vision of a company when it comes to their data should include the potential of someday (or the inevitability of soon, depending on who you’re talking to) having the situation described here along with myriad other possibilities. The narrow and limited view of data protection as defined by saving all data backups forever does very little and will likely cost a lot when it comes time to restore or retrieve data when an “event” occurs.

The subject of data protection is ubiquitous in the circles I run in and the differing opinions on how to do it are not lacking in quantity or passion. What seems to be a consensus though is that it is not something to be taken lightly. It is not something to plan for later when a situation presents itself. And it is certainly not something to be ignored completely.

One of the final requests the audience members were left with from Preston, was to (in my own words) inspire some vision for the way your company protects, retains and treats its data. Try to change the philosophy around your data instead of treating it like leftover exhibits of evidence after a case has been closed. Many managers/directors/c-levels won’t get it, but some will and those companies will be better off in the long run which means you as the IT professional will be better off as well.

Iomega NAS iSCSI Issues

A few months ago, we bought a low end NAS to supplement our SAN and DAS which are in a perpetual state of emergency. I love having a NAS for obvious reasons and it has helped immensely by moving non-critical, non-transactional data off of our primary storage.

The model we have is an “Iomega StorCenter Pro NAS ix4-200r”. Fancy title. It’s four 2TB sata drives in a RAID 5 giving 5.5TB of usable disk. It is a sort of unified storage platform in that it can also do iSCSI and torrent hosting alongside NFS/CIFS.

We had a big boo-boo a couple of months back with the iSCSI. I am familiar with iSCSI because of my experience on our SAN which is EqualLogic. EqualLogic was acquired by Dell a few years back and is strictly an iSCSI product. EqualLogic SANS are relatively easy to set up and manage, but do include fairly extensive security settings for the iSCSI volumes. Along with filtering on IP, you can specify that only a certain initiator can connect and if that’s not enough, you can specify a two-way CHAP security.

The file share security on the Iomega NAS is pretty basic in that you can filter on which IP and which users can connect to which share as well as quotas on the shares. For the iSCSI block storage though, there is no security whatsoever other than limiting which users can log in to the NAS GUI and have access to those volumes. Any server with an iSCSI initiator and knowledge of the NAS IP, can connect and mount up all of the enabled iSCSI volumes.

Do I know this because I read the manual from front to back before racking the NAS? No, we learned the hard way.

We had an Oracle database that was about to exceed the free space on the direct attached storage in its server. This was a data warehouse database and did not need fast disk for this particular tablespace. I created an iSCSI volume and mounted it to the Windoze server that was housing the database. I added the volume as another drive and created a file for the tablespace. Works great!

Another group in the company was looking for additional disk and asked for an iSCSI volume for their server. I went about creating it and told them it would be ready later that afternoon. The NAS takes a couple of hours to format a 100GB volume for iSCSI. Thirty minutes later, the database that just inherited the new file on the first NAS iSCSI volume I created crashed. When looking at the drive, the file and folder were gone. After a short investigation of the logs on the NAS, it was discovered that another server had mounted the same iSCSI drive that was housing my Oracle database’s data file. They had mounted the volume, wiped and created a new partition table and then low-level formatted the entire volume.

It turns out that this other group saw a iSCSI volume from the same location they had asked for it, with the same size they had requested and assumed that I had overestimated the time it took to create their drive. They took the opportunity to mount it, fdisk the partition table (despite seeing an existing NTFS partition) and format it for their use. Yes they were wrong, but the mistake was understandable.

This post is a cautionary tale about lower end unified storage appliances and the security (or lack thereof) they offer on their storage. Be aware of who has access to what with your shared storage appliances.

Groupwise to SalesForce Database Migration Experience

SalesForce contacts sales manager.
Manager buys SalesForce.
Manager recruits salespeople to migrate existing CRM data to SalesForce.
Manager makes promises he can’t keep.
Everyone comes begging DBA to fix problem on a deadline.

This type is situation is nothing new to a DBA, especially one in a smaller shop. Here’s the situation. Our current CRM is ContactWise which is a Novell product. The database is Oracle 9i with a thick client front end.

The data to be migrated from ContactWise into SalesForce was exported using Excel spreadsheet canned reports through the client interface. I heard that this was going on while they were doing it and warned my manager that if they were planning on migrating additional data at a later time, they had better include a unique identifier with their reports so there is something to cross-reference. That warning apparently fell on deaf ears because no such identifier was included.

They got all the contacts and accounts loaded into SalesForce and realized that they did not include any of the historical notes that go along with them. All they had were names and addresses which did them little good when dealing with existing clients.

Sure enough I got a meeting invite to “Discuss ContactWise Notes Migration” shortly after the management high-five’d each other on “Moving to the Cloud”. You can probably figure out the rest. I was asked how we can get all of the notes from ContactWise to their respective owners in SalesForce. My short answer was, “You can’t”. The best you can do is to match on as many unique names as possible and hand enter the rest. This was two weeks ago and I am still working on it.

There were a few issues that popped up that I wasn’t expecting which prompted me to write this post. The biggest issue being that the notes had RTF markup that needed to be eliminated before migrating them. Thanks to Tom Kyte and a feature of Oracle called “Oracle Text” I was able to do this in batch and with little scripting. More about that later.

The first thing to do was to get the contact names and unique id’s out of SalesForce (SF). SF has a neat little tool called Apex Data Loader (ADL). It is an installable client side program that spits out your data in CSV format and can also load it from CSV spreadsheets. There are not a lot of bells and whistles but it works.

The first snag was the fact that the password I tried to use to log ADL into SF did not work. After some research I came across a link in the SF Knowledge Base that told me I need to generate a key for my PC and add it to the end of my password when logging in.

The contact extract from SF consisted of Unique SF ID, Account ID that the contact belonged to, last name, first name and combined name (for ease of use). Then I needed to create a sqlldr parameter file to load the data into the ContactWise (CW) database.

Sqlldr Parameter File “A”

load data
  infile 'contact_extract.csv'
  into table sf_contacts
  fields terminated by "," optionally enclosed by '"'
  (id,accountid,lastname,firstname,name)

Sql Statement “A”

select id, na_fname firstname, na_lname lastname
,translate(hi_subject,',',' ') subject
,translate(no_note,',',' ') note, hi_date||'|'
from cw_note
join cw_history on (no_key=hi_no_key)
join cw_name on (hi_na_key=na_key)
join sf_contacts on (lower(lastname) = lower(na_lname) and lower(firstname) = lower(na_fname))
where dbms_lob.getlength(no_note) < 1000
and no_note not like '%set the associated company for this contact to%'
and no_note not like '%changed the associated company for this contact from%'
and no_note not like '%" created "%'
and lower(name) not in
(
select lower(name) name from sf_contacts group by lower(name) having count(*) > 1
)
order by lastname desc, firstname, hi_date;

Now that I have the contacts that were transferred out of CW into SF back into CW, I can cross reference and see what matches. I eliminated any contacts without notes by creating an inner join on cw_note and cw_history which creates the one to many relationship from contact name to notes within CW. The only thing to cross-reference between CW and SF databases at this point is first name and last name so I join cw_name to sf_contacts on these two columns using the lower function in the off chance that case was changed in the process of migration or manipulation of the data after the migration.

The actual note data is contained in a clob column because it could either be text or an attached document. The folks that requested this data were told that no documents would be transferred; only text. The dbms_lob.getlength function eliminates any documents since a document converted to text will almost always exceed 1000 characters.

The first batch of this project was to find any contact cross-referenced between the two databases with attached notes that was unique on first name and last name. The “having” clause eliminates any contacts that are not unique on firs tname and last name.

This initial batch gave me about 90% of the notes that needed to be migrated along with first name, last name, subject and date. They were then exported into a pipe delimited file using the translate function to eliminate commas in the note and subject. The commas were eliminated because the ADL only loads CSV’s.

As mentioned before the note column was marked up with RTF which CW automatically translates and SF does not so I needed to find a way to eliminate it. Since there were 40,000 some odd records, eliminating it by hand was not an option.

A little research revealed a Tom Kyte post about Oracle Text and using a filter to eliminate RTF markup. It wasn’t quite what I was looking for, but it was enough to piece together what I needed. I didn’t want to do this in the CW database because I didn’t want to add tables and I needed a 10g database so a new schema was created in an existing dev database.

Sql Statement “B”

define MAKEUSER = 'TEST'
define USERPASS = 'TEST'
define USERTBS = 'TEST'

create user &MAKEUSER identified by "&USERPASS" default tablespace &USERTBS;
grant execute on "CTXSYS"."CTX_DDL" to &MAKEUSER;

Then I needed a couple of tables; one for the source data and one for the formatted data.

Sql Statement “C”

CREATE TABLE NOTES
(   "ID"            VARCHAR2(50),
    "FIRSTNAME"     VARCHAR2(255),
    "LASTNAME"      VARCHAR2(255),
    "SUBJECT"       VARCHAR2(255),
    "HI_DATE"       VARCHAR2(255),
    "NOTE"          VARCHAR2(1000),
    "FILTER_ID"     NUMBER,
    "ERROR_NUMBER"  NUMBER,
    "ERROR_MESSAGE" VARCHAR2(100));

create table filter ( query_id number, document clob );

The next step was to load the notes data in the test environment I just created. If you look closely at Sql Statement A, you can see I appended a pipe symbol to the last column. More on that in a second.

I ran Sql Statement A in Sql Developer to generate the data. It was then exported to a file using pipe delimitation. I transferred the pipe delimited file to the test server. When looking at it in vim, I saw the ubiquitous “^M” (carat M) at the end of each line so I ran the file through “dos2unix”.

Through a lot of trial and error I found out that there needs to be some tweeking done to the sqlldr parameter file to get the data to load properly. The notes column contains RTF markup as well as carriage returns. The standard sqlldr parameters interprets a carriage return as the end of the record which screws everything up.

Sqlldr Parameter File “B”

options (BINDSIZE=20971520, READSIZE=20971520)
load data
  infile 'notes_export.csv' "str '|;'"
  into table notes
  replace
  fields terminated by "|" optionally enclosed by '"' trailing nullcols
  (id,firstname,lastname,subject,note char(1000),hi_date)

Sqlldr lets you modify the end of record character by adding it to the end of the “infile” parameter. As you can see in Sqlldr Parameter File B, I modified it to “str ‘|;’”. “str” tells sqlldr to load the data in stream format so it doesn’t use the carriage return to indicate end of record. “‘|;’” tells sqlldr that the end of record will be indicated by the combination of a pipe symbol and a semi-colon. You can change this to whatever you want it to be. I picked the combination because I knew that it would not be in the data itself.

The pipe delimited file needed to be tweeked a little more before I could load the data. The end of record as it was spit out of Sql Developer looked like this:

"00360000013IyTRAA0"|"andrew"|"wemhoener"|"L introduction letter sent"|"{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil MS Sans Serif;}}
\viewkind4\uc1\pard\f0\fs20 A merge document was created from the\par
C:\\Documents and Settings\\All Users\\Desktop\\ContactWise\\Quote Template.doc\par
document on Monday  February 18  2008 6:16 PM.\par
\par
\par
\par
}
"|"18-FEB-08 05.16.20 PM|"

You can see the RTF markup and the end of the record is ended with a pipe and double quote. I need the end of the record to end with a double quote to enclose the last column, and a combination of a pipe and semi-colon to indicate end of record. This nifty global search and replace in Vim game me exactly what I needed:

%s/|"$/"|;/g

The same record now looks like this:

"00360000013IyTRAA0"|"andrew"|"wemhoener"|"L introduction letter sent"|"{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil MS Sans Serif;}}
\viewkind4\uc1\pard\f0\fs20 A merge document was created from the\par
C:\\Documents and Settings\\All Users\\Desktop\\ContactWise\\Quote Template.doc\par
document on Monday  February 18  2008 6:16 PM.\par
\par
\par
\par
}
"|"18-FEB-08 05.16.20 PM"|;

The other thing that needs to be addressed is the “options (BINDSIZE=20971520, READSIZE=20971520)” parameter which increases the array size for larger file loads. “char(1000)” is added to the note column because the default data type and size for a column is “char(255)” which wasn’t big enough for the 1000 byte column I was trying to load.

Now the data can be loaded into the notes table using Sqlldr Parameter File B. Double check the rows once they are loaded into the table to check for skewing in case there was an extra pipe symbol somewhere in your data.

Now we start getting into the Oracle Text stuff. The first thing to do is create a Text Index on the note column of the notes table so we can run a filter on it. This can take quite awhile depending on how many rows are in the notes table.

CREATE INDEX notes_idx ON notes(note) indextype is ctxsys.context parameters('DATASTORE CTXSYS.DEFAULT_DATASTORE FILTER CTXSYS.AUTO_FILTER');

Create a unique id on each row of the notes table so it can be cross-referenced with the filter table once the filter has been run.

UPDATE notes
   SET filter_id = (SELECT rn
                  FROM (SELECT rownum AS rn, row_id
                          FROM (SELECT rowid AS row_id
                                  FROM notes b)
                        )
                 WHERE row_id = notes.rowid);

Create a unique index on the filter_id row of the notes table so the CBO is not doing full scans just for a unique index join.

CREATE UNIQUE INDEX PK_NOTES ON NOTES (FILTER_ID);

Now we can run the filter on the note column while at the same time transferring over the unique id for cross-reference and properly handling errors if there are any.

declare
seq rowid;
notes_index varchar2(20) := 'NOTES_IDX';
filter_table varchar2(20) := 'FILTER';
err_num NUMBER;
err_msg VARCHAR2(100);

type note_type is table of notes%ROWTYPE
  index by binary_integer;
note_arr note_type;

begin

/* Create array, eliminating any records that have already been done
   so this loop can be run multiple times */
select * bulk collect into note_arr
from notes
where not exists
(select 1
from filter
where filter.query_id = notes.filter_id);

for i in note_arr.first..note_arr.last loop
begin

/* ctx_doc.filter uses rowid of the column to match to the index record ingested */
select rowid
into seq
from notes
where filter_id = note_arr(i).filter_id;

/* Run the filter using the Text index created */
ctx_doc.filter( notes_index, seq, filter_table, note_arr(i).filter_id, TRUE );

exception
when others then
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 100);

/* Populate the offending row with the error information for later review */
update notes
set error_number = err_num
,error_message = err_msg
where filter_id = note_arr(i).filter_id;

end;
end loop;
end;
/

You should now have the before filter and after filter (sans RTF markup) versions of the note column on the notes table. Connect Sql Developer up to this test schema if you haven’t already to export this information to a CSV file for loading into SF.

Check error_number and error_message columns of the notes table to make sure there were no fails on the filter process. I have had a couple due to funky data but for the most part the filtering worked perfectly. Now you can select from the notes and filter table to pull the data back out to load into SF.

select id parentid
,substr(to_char(to_date(hi_date, 'DD-MON-YY HH.MI.SS AM'), 'YY/MM/DD')||' - '||subject, 1,80) title
,document body
from filter join notes on (query_id = filter_id)
where document is not null
and error_number is null
-- and query_id between 1 and 5000
order by lastname, firstname, to_date(hi_date, 'DD-MON-YY HH.MI.SS AM') desc;

You may want to uncomment the query_id predicate and do your load in batches if you have tens of thousands of rows. Export your data to a xls format spreadsheet. Why not straight to a CSV? Because of the carriage returns in the note column. Sql Developer does not properly double quote the columns and they are not properly delimited.

Open the xls file just created in Excel or OpenOffice and save as a standard CSV file. This file will be properly formatted to load into SF.

Review of the Asus EP121 Slate

I had never handled a slate/pad device for more than a few seconds before the Asus EP121 Slate arrived at my home. My excitement was piqued by this product because of its claim of being “The world’s most powerful tablet device”.

Although I tried to be as unbiased as possible and give my honest review, there is no such thing as unbiased. My idea of a slate/pad device is shaped by the iPAD. I have never used the iPAD for more than a few minutes and most of what I know of it is from reviews and opinions of peers.

When I arrived at my home last week, I thought that the fairly large box sitting on my kitchen floor was far too big and heavy to be the pad device I was expecting. Sure enough the 15.5”x10”x3.25” box inside had the clear labeling of an Asus product.

The product is packaged well with the device right on top as you open the box and all of the accessories underneath it. I was a little surprised at how heavy the box and the device itself was until I found out what was contained in this relatively small package.

The slate itself is a little under 12.5 inches wide (in horizontal orientation) and 8.25 inches tall. It is less than three quarters of an inch deep. I looked up the specs to relate what I was holding to the computing power it was capable of.

The EP121 has a Intel Dual-Core i5 470um at 1.33GHz with integrated graphics. The premium model that I was testing had 4GB of DDR3 RAM and a 64GB solid state drive. The screen is 12.1 inches (hence the model EP121) and is capable of 1280×800 display resolution. These hardware specs are about the same as my desktop at my work. Once I made the comparison and realized the amount of power I was holding, the unit didn’t seem quite so bulky.

The rest of the items in the box include a basic user manual, support DVD, power cord, cleaning cloth, stylus and refill nibs, tool to replace stylus nibs, a leather cover/folio and a bluetooth keyboard with a set of batteries.

When looking at the screen of the device before it’s powered on, the glossiness is almost overwhelming and if anyone has used the device before you, the screen looks like a smart phone display after having a half hour phone conversation on a humid day. If you want this thing to look nice and perform well when using your fingers, it will need to be cleaned often.

There are numerous ports and connections on the sides of the unit. On the left side from bottom to top in a horizontal orientation is a speaker, an SD card reader, USB 2.0 port, internal microphone, another USB 2.0 port, a combination mic in/headphone out audio jack, mini HDMI port, a volume up/down rocker, charging port and charging LED. The USB ports are covered by somewhat difficult to open covers; probably assuming they would not often be used.

The top side from left to right has a power button/slider and LED, a keyboard button, orientation lock switch and a slot for the Wacom Digitizer pen, also known as the stylus. By default the keyboard button is simply a shortcut to show the on-screen keyboard at any time, although there are also several ways to bring it up from the screen. The right side simply contains another speaker towards the bottom and the bottom of the device does not have any ports or connections.

The included bluetooth keyboard is quick and easy to set up and link to the device. Switch the keyboard on, which should automatically put it into discoverable mode. Double click the bluetooth icon in the lower right hand corner of the screen and click add device. Type the security password that comes up directly into the keyboard and press enter.

The Wacom Digitizer pen (referred to from now on as the “pen”) is not your ordinary pen/stylus. It actively works with the slate in multiple ways. One of the more common cons of most touch pad devices is that there is no “hover” option with the cursor, because the surface of the device will only react when touched and touching, by default, dictates an action. In the case of this pen, the slate senses its location while it is held within approximately a quarter inch of the glass. This makes it easy to hover the mouse just as if using a desktop. When using the pen, the slate is sensitive to the pressure applied. The most obvious evidence of this is when using the ArtRage program and using a pencil or shading feature. The package comes with replacement nibs which are the plastic inserts to the pen. There is also a tool to help replace the nibs.

The unit startup is very quick with the powerful processor and solid state drive, despite being a complete Windows operating system. It boots up a lot quicker even than my smart phone with a proprietary OS. The installed operating system is Windows 7 Home Premium with a couple of extra programs from Asus. The OS is of course configured exactly for this device with tablet extensions enabled and wizards galore. I knew this unit had Windows 7, but I was expecting something a little more locked down in the way of a smart phone or iPAD, but this device is as open as if installed from scratch on a full desktop computer.

Keep in mind that Asus packed a lot of computing power into a relatively very small space. The unit will get warm and the heat expelled will vary in temperature depending on what the user is doing. You will also hear and feel the warm air from the cooling fan which seems to blow heat only out of the top left vent (in horizontal orientation). Way to go Asus. I know quite a few other laptop manufacturers that should take a hint and expel heat in a strategic location.

The first thing I did after power-up was to download the Google Chrome browser to compare a piece of software not necessarily designed or configure for this device. The install was a piece of cake, very automatic and gave no indication this was not a typical Windows desktop. The only usability difference I could find is that the flick and scroll functions of the touch screen did not work in Chrome automatically as they do by default in Internet Explorer. After a quick search, I found a plugin for Chrome that fixed the flick and scroll functions.

The web cam testing was pretty basic. The only thing I really use a web cam for is Skype and on a much more seldom basis, YouTube response videos. I used the native Windows Movie Maker program to record a short video using the web cam and the built in microphone on the left side. The quality was good and sound was surprisingly clear. The functionality is what I would expect for a monitor mounted web cam.

ArtRage Studio is an included program that gives an art easel interface with over a dozen tools for creating digital art. This program is obviously included because it is a perfect compliment to a tablet device with a touch screen interface. I didn’t spend a lot of time in this program, but it appears to have a massive following according to the number of posts on the ArtRage Forums. This is a great tool to show off the obvious advantages to a touch screen device and appears in almost every review YouTube video post I have seen. If you are an artist (I am definitely not), this type of program will have an obvious incentive.

One of the more useful tools I found was the device settings for the “ASUStek Touch-NB” device contained within the control panel. It is more easily found as the picturesque icon in the task panel. The links contained are the most useful for finding programs and settings specifically pertaining to this device. Also contained is a digital version of the user manual, which although not extensively detailed is worth taking a look at for basic operations. There is also a link for the Amazon eReader, games, applications, multimedia programs and utilities. This screen is a good place to start.

The EP121 has an accelerometer and is able to rotate the screen depending on the orientation the user has the unit in. It is not as quick as a smart phone. The screen is changing resolution and takes a couple of seconds between changes. This ability can be suppressed by switching on the orientation lock next to the power switch. I was surprised at how well this works. It seems only advantageous to switch to portrait mode when browsing the internet or using a word processor and taking notes. The resizing is accurate and operationally clean (no obvious bugs).

This device is obviously much more than a media consumption tool, but I wanted to make sure that capability was covered anyway. YouTube videos play great, even in full screen all the way up to 1080p HD if you can find them. However, going from 720p to 1080p shows a noticeable difference in smoothness of playback. 1080p seems to be just a little too much for the integrated graphics to handle. Netflix which runs in Microsoft Silverlight ran perfectly in full screen.

The on screen keyboard has two modes; keyboard mode and free-hand recognition mode. When a text field is clicked in the browser, a small icon appears below or above it to pop up the keyboard in the last mode it was used. There is also a pop-out icon from the side that can be docked anywhere on the left side of the screen. A small version of the keyboard can float anywhere on the screen or a full version can be docked at the bottom or top of the screen. The keyboard can also be shown in its last docked position by pushing the keyboard button on the side/top of the unit as mentioned earlier.

There is nothing much special about the keyboard in either mode and could be vastly improved by Microsoft just by adopting some of the mobile keyboard technology such as T9 or Swype. The keyboard is old school hunt-n-peck with the addition of some internet domain shortcuts. The handwriting has a lot more options and learns your handwriting nuances as you go. You can also teach it certain aspects of how you write to provide better recognition. It is worth spending a little time on this if you will not be always using the physical keyboard. It will save you time and frustration in the long run.

This version of the OS comes with some Microsoft games designed specifically for a touch screen as well as the usual suspects of solitaire and minesweeper. They are simple games but they do a good job of displaying the graphics, sound and touch screen capabilities of the device. By the way, these games are designed for finger touch, not the pen.

Most of my computer time consists of remote access of some kind to another network through VPN. I installed Cisco VPN and tried to do a little of everything I would as if I were working from home for a week. This included Remote Desktop to a Windows server, SSH or Telnet to a Linux server, VNC to either Windows or Linux, file transfer, java programs and a half a dozen other activities. Everything worked without a problem. Most of these things were more difficult if I wasn’t using the keyboard but the pen worked just fine for getting around the desktop in the absence of a mouse.

Up until this experience with the EP121, I was convinced there were five tiers for consumer compute devices. The smart phone being the smallest of the five is a pure consumption device as well as a phone and is good to always have on my person. The pad device is a larger media consumption tool and should be used when a wifi signal is not present or long battery life is a must. The netbook and notebook are the next two tiers and can be qualified by portability, battery life and capability. Then, finally is the desktop for full non-portable work and play.

The Asus EP121 puts a sixth tier into my scale. I would fit it in between the netbook and the notebook. It has the capabilities of both but also contains much of the media consumption capability of the pad and matches the power of the notebook. Where the slate suffers is with battery life. Although it will outlast my laptop by a good hour or two, the netbook will match or beat it even when working on cpu intensive applications. Of course, the netbook doesn’t have near the screen size or resolution of the slate.

Being that I use my computers much more for business than anything, I can see the ultimate use for this device as a C-level executive’s or manager’s pad. They would still have a laptop, but this would be the perfect device for providing the power, screen size, capability and versatility for someone using it in a mostly or purely business centric way. The consumer can use it as a general purpose slate if they are needing more than a simple media consumption device but not a powerhouse for playing high-end games. If the price tag doesn’t bother you, go for it. You won’t be disappointed.