Top 100 Books Of All Time (I Can’t Read) November 23, 2013
Posted by Richard Foote in Richard's Musings, Top 100 Books.18 comments
And now for something completely different.
David Bowie recently revealed a list of his top 100 books. It was a really interesting list, especially considering that being such a huge David Bowie fan for so many years, I had only actually read 2 of the books on his list (“Nineteen Eighty-Four” by George Orwell and “A Clockwork Orange” by Anthony Burgess). So as an avid reader, this got me thinking, what would be in my list of top 100 books and thought it would be a bit of fun to compile and share my own list.
Well after lots of consideration and much dwelling back into my distant past, I’ve come up with a list of my favourite 100 books of all time. I’ve tackled this a little differently in that I’ve tried to view this from the perspective of my feelings and impressions of when I actually first read a book, rather than how I might view a particularly book now. So for example, it was the joy and excitement of a nine year old Richard Foote reading “Comet In Momminland” over a couple of dark winter evenings in Manchester that has an equal vote to the somewhat older current version.
I also decided to treat a series of books as being the one logical book, a “partitioned book” if you like, but only when such a complete series deserves credit (for example “The Lord of the Rings”) but not so if the series doesn’t hold up as a whole (such as with the “Dune” series and the less inspiring follow-ups after the brilliant original novel).
Getting to the 70-80 mark wasn’t actually too difficult but deciding which books get to fill the remaining slots was really quite tricky with various books and authors being in then out then in again. Then I remembered an important book or two which meant something else had to go. But in the end, I think the final 100 I’ve selected is a pretty good overall reflection of what I considered to be a really good read at the time.
Finally, the books are ordered alphabetically as it was just a task too far to try and order them in order of preference. However, there is one notable exception as I do have a clear favourite, that being J. R. R. Tolkien’s classic “The Lord of the Rings”. I remember as if it was only yesterday having a week off school, sick in bed with tonsillitis, when my parents bought me “The Fellowship of the Ring” to cheer me up. Not only did it cheer me up but my introduction to the land of Middle-Earth in many ways changed my life as so many fantasy based novels in my list will testify. It’s also about the only book on the list that I’ve repeated read over the years.
I guess that’s why all the books ultimately made it on the list, having helped in some way (some more than others) to mould me into who I am today. That and considering them a damn fine read at the time of course.
So here they are, my top 100 books of all time. I wonder how many you’ve read 🙂
1 “The Lord of the Rings” J.R.R. Tolkien 1954-1955
2 “The 7 Habits of Highly Effective People” Stephen R. Covey 1989
3 “The Adventures of Tintin” Herge 1929-1976
4 “Alias David Bowie” Peter and Leni Gillman 1987
5 “Animal Farm” George Orwell 1945
6 “Asterix the Gaul” Rene Goscinny and Albert Uderzo 1961-1977
7 “The Axis Trilogy” Sara Douglass 1995-1996
8 “The Belgariad Series” David Eddings 1982-1984
9 “The Bitterbynde Trilogy” Cecilia Dart-Thornton 2001-2002
10 “The Book of Words Trilogy” J. V. Jones 1995-1997
11 “Casino Royale” Ian Flemming 1953
12 “The Cat in the Hat” Dr Seuss 1957
13 “Charlotte’s Web” E. B. White 1952
14 “The Chronicles of Narnia” C. S. Lewis 1950-1956
15 “A Clockwork Orange” Anthony Burgess 1962
16 “The Complete Tales of Hans Christian Andersen” Christian Anderson 1835-1845
17 “The Complete Tales of Mystery and Imagination” Edgar Allan Poe 1839-1943
18 “The Da Vinci Code” Dan Brown 2003
19 “Dali” Max Gerard 1986
20 “The Dark Tower Series” Stephen King 1982-2012
21 “David Bowie – The Pitt Report” Kenneth Pitt 1983
22 “David Bowie Black Book” Miles 1980
23 “David Robert Jones Bowie: The Discography Of A Generalist, 1962-1979” David Jeffrey Fletcher 1979
24 “The Day of the Triffids” John Wyndham 1951
25 “Dune” Frank Herbert 1965
26 “Effective Oracle By Design” Tom Kyte 2003
27 “Ender’s Game Series” Orson Scott Card 1985-1996
28 “Far from the Madding Crowd” Thomas Harding 1874
29 “The Far Side Gallery Series” Gary Larson 1984-1995
30 “The Farseer Trilogy” Robin Hobb 1995-1997
31 “The First Chronicles of Thomas Covenant” Stephen R. Donaldson 1977-1979
32 “The First Law Trilogy” Joe Abercrombie 2006-2008
33 “Footrot Flats Series” Murray Ball 1975-1994
34 “The Foundation Trilogy” Isaac Asimov 1951-1953
35 “The Gap Series” Stephen Donaldson 1991-1996
36 “The Grapes of Wrath” John Steinbeck 1939
37 “Great Escape Stories” Eric Williams 1958
38 “The Green Mile” Stephen King 1996
39 “Greg Mandel Series” Peter F. Hamilton 1993-1995
40 “Gulliver’s Travels” Jonathan Swift 1726
41 “The Hamlyn Children’s Animal World Encyclopedia in Colour” 1967
42 “The Original Hardy Boys Mystery Stories” Franklin W. Dixon 1927-1979
43 “Harry Potter Series” J. K. Rowling 1997-2007
44 “The Hitchhiker’s Guide to the Galaxy” Douglas Adams 1979
45 “HMS Ulysses” Alistair MacLean 1955
46 “The Hobbit” J.R.R. Tolkien 1937
47 “The Hound of the Baskervilles” Arthur Conan Doyle 1902
48 “I, Robot” Iasaac Asimov 1950
49 “The Importance of Being Earnest” Oscar Wilde 1895
50 “Inside Out – A Personal History of Pink Floyd” Nick Mason 2004
51 “Islands In The Sky” Arthur C. Clarke 1954
52 “It” Stephen King 1986
53 “James and the Giant Peach” Roald Dahl 1961
54 “John Lennon – The Life” Philip Norman 2008
55 “Jonathan Livingston Seagull” Richard Bach 1970
56 “Killers of Eden” Tom Mead 1961
57 “Life on Earth” David Attenborough 1979
58 “Lord of the Flies” William Golding 1954
59 “Magician” Raymond E. Feist 1982
60 “The Midwich Cuckoos” John Wyndham 1957
61 “The Millennium Trilogy” Stieg Larsson 2005-2007
62 “The Mists of Avalon” Marion Zimmer Bradley 1983
63 “Moby-Dick” Herman Melville 1851
64 “Moomin Series” Tove Jansson 1945-1970
65 “Mordant’s Need” Stephen Donaldson 1986-1987
66 “The Name of the Wind” Patrick Rothfuss 2007
67 “The Night’s Dawn Trilogy” Peter F. Hamilton 1996-1999
68 “Nineteen Eighty-Four” George Orwell 1949
69 “The Observer’s Book of Birds” S. Vere Benson 1972
70 “Of Mice and Men” John Steinbeck 1937
71 “Optimizing Oracle Performance” Cary Millsap and Jeff Holt 2003
72 “Oracle 7 Database Concepts Manual” Oracle Corporation 1996
73 “The Original Shannara Trilogy” Terry Brooks 1977-1985
74 “Pigs Might Fly. The Inside Story of Pink Floyd” Mark Blake 2007
75 “Practical Oracle 8i – Building Efficient Databases” Jonathan Lewis 2000
76 “The Pythons Autobiography” The Pythons 2003
77 “The Rain Wilds Chronicles” Robin Hobb 2009-
78 “Rainbows End” Vernor Vinge 2006
79 “The Saga of Pliocene Exile” Julian May 1981-1984
80 “Saucerful of Secrets: The Pink Floyd Odyssey” Nicholas Schaffner 1991
81 “The Second Chronicles of Thomas Covenant” Stephen R. Donaldson 1980-1983
82 “The Silmarillion” J. R. R. Tolkien 1977
83 “The Silver Sword” Ian Serraillier 1956
84 “Soldier Son Trilogy” Robin Hobb 2005-2008
85 “A Song of Ice and Fire Series” Gearge R. R, Martin 1991-
86 “The Stand” Stephen King 1978
87 “Syd Barrett – A Very Irregular Head” Rob Chapman 2010
88 “The Tale of Peter Rabbit” Beatrix Potter 1902
89 “Tales of the OakTable” Various Oracle Experts 2003
90 “The Thirty-Nine Steps” John Buchan 1915
91 “The Time Machine” H. G. Wells 1895
92 “Tinker, Tailer, Soldier, Spy” John le Carre 1974
93 “Treasure Island” Robert Louis Stevenson 1881
94 “The View from the Mirror Quartet” Ian Irvine 1998-1999
95 “Void Trilogy” Peter F. Hamilton 2007-2010
96 “The War of the Worlds” H. G. Wells 1898
97 “Watership Down” Richard Adams 1972
98 “The Wheel of Time Series” Robert Jordan 1990-2013
99 “Where Eagles Dare” Alistair MacLean 1967
100 “The Wind In The Willows” Kenneth Grahame 1908
12c Invisible Columns (The Invisible Man) November 19, 2013
Posted by Richard Foote in 12c, Invisible Columns, Oracle Indexes.2 comments
Oracle 12c introduced the ability to make user specified columns “Invisible” such that they’re invisible by default and have to be explicitly referenced to be accessed. So a simple SELECT * won’t display columns defined as invisible, but they will be displayed if explicitly referenced in the SELECT column list.
From an indexing perspective, columns can still be indexed and considered by the cost based optimizer regardless of whether the column is invisible or not. So don’t be confused by an invisible index with an index on an invisible column, they’re two entirely different concepts.
Unless specified otherwise, a column is visible by default. So the following BOWIE table is defined with three visible columns:
SQL> create table bowie (id number, code number, name varchar2(30)); Table created. SQL> insert into bowie select rownum, mod(rownum,10000), 'DAVID BOWIE' from dual connect by level <=100000; 100000 rows created. SQL> commit; Commit complete. SQL> exec dbms_stats.gather_table_stats(ownname=>user, tabname=>'BOWIE', method_opt=>'FOR ALL COLUMNS SIZE 1'); PL/SQL procedure successfully completed.
Let’s now create an index on the CODE column:
SQL> create index bowie_code_i on bowie(code); Index created.
Each column in the table is defined with a unique COLUMN_ID, which determines the logical ordering of the column within the table:
SQL> desc bowie Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER CODE NUMBER NAME VARCHAR2(30) SQL> select column_id, column_name from user_tab_columns where table_name='BOWIE'; COLUMN_ID COLUMN_NAME ---------- --------------- 1 ID 2 CODE 3 NAME SQL> select column_id, segment_column_id, internal_column_id, column_name, hidden_column, virtual_column from user_tab_cols where table_name = 'BOWIE1'; COLUMN_ID SEGMENT_COLUMN_ID INTERNAL_COLUMN_ID COLUMN_NAME HID VIR ---------- ----------------- ------------------ --------------- --- --- 1 1 1 ID NO NO 2 2 2 CODE NO NO 3 3 3 NAME NO NO
If we now run a simple query on BOWIE, we notice the index is used by the CBO and the columns are listed in the order of COLUMN_ID:
SQL> select * from bowie where code=42; ID CODE NAME ---------- ---------- ------------------------------ 90042 42 DAVID BOWIE 70042 42 DAVID BOWIE 80042 42 DAVID BOWIE 42 42 DAVID BOWIE 10042 42 DAVID BOWIE 20042 42 DAVID BOWIE 30042 42 DAVID BOWIE 60042 42 DAVID BOWIE 50042 42 DAVID BOWIE 40042 42 DAVID BOWIE 10 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 853003755 ---------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10 | 210 | 11 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE | 10 | 210 | 11 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | BOWIE_CODE_I | 10 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------------
Let’s now make the CODE column INVISIBLE:
SQL> alter table bowie modify code invisible; Table altered.
We notice the CODE column no longer has a COLUMN_ID defined and that all columns that follow the CODE column (in this case just the NAME column) have the COLUMN_ID value decremented by 1:
SQL> desc bowie Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER NAME VARCHAR2(30) SQL> select column_id, column_name from user_tab_columns where table_name='BOWIE'; COLUMN_ID COLUMN_NAME ---------- --------------- 2 NAME CODE 1 ID SQL> select column_id, segment_column_id, internal_column_id, column_name, hidden_column, virtual_column from user_tab_cols where table_name = 'BOWIE1'; COLUMN_ID SEGMENT_COLUMN_ID INTERNAL_COLUMN_ID COLUMN_NAME HID VIR ---------- ----------------- ------------------ --------------- --- --- 1 1 1 ID NO NO 2 2 CODE YES NO 2 3 3 NAME NO NO
If we now re-run the same SELECT * query:
SQL> select * from bowie where code=42; ID NAME ---------- ------------------------------ 20042 DAVID BOWIE 90042 DAVID BOWIE 70042 DAVID BOWIE 80042 DAVID BOWIE 30042 DAVID BOWIE 60042 DAVID BOWIE 50042 DAVID BOWIE 40042 DAVID BOWIE 42 DAVID BOWIE 10042 DAVID BOWIE 10 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 853003755 ---------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10 | 210 | 11 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE | 10 | 210 | 11 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | BOWIE_CODE_I | 10 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------------
We notice the CODE column is no longer displayed even though it’s still explicitly reference in the WHERE condition and that the index on the now invisible CODE column is still used by the CBO.
To display the CODE column, we need to set colinvisible on in sql*plus, explicitly reference it in the column list, explicitly reference it when inserting a row with a CODE value, etc. etc. :
SQL> set colinvisible on SQL> desc bowie Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER NAME VARCHAR2(30) CODE (INVISIBLE) NOT NULL NUMBER SQL> select id, code, name from bowie where code = 42; ID CODE NAME ---------- ---------- ------------------------------ 20042 42 DAVID BOWIE 90042 42 DAVID BOWIE 70042 42 DAVID BOWIE 10042 42 DAVID BOWIE 80042 42 DAVID BOWIE 30042 42 DAVID BOWIE 60042 42 DAVID BOWIE 50042 42 DAVID BOWIE 40042 42 DAVID BOWIE 42 42 DAVID BOWIE 10 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 853003755 ---------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10 | 210 | 11 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE | 10 | 210 | 11 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | BOWIE_CODE_I | 10 | | 1 (0)| 00:00:01 | ---------------------------------------------------------------------------------------------------- SQL> insert into bowie (id,code,name) values (100001, 42, 'ZIGGY STARDUST'); 1 row created. SQL> commit; Commit complete.
So a column is only “invisible” by default, it can still be referenced and accessed by those who have knowledge of its existence.
If we now make the column VISIBLE again:
SQL> alter table bowie modify code visible; Table altered. SQL> select column_id, column_name from user_tab_columns where table_name='BOWIE'; COLUMN_ID COLUMN_NAME ---------- --------------- 2 NAME 3 CODE 1 ID SQL> select column_id, segment_column_id, internal_column_id, column_name, hidden_column, virtual_column from user_tab_cols where table_name = 'BOWIE1'; COLUMN_ID SEGMENT_COLUMN_ID INTERNAL_COLUMN_ID COLUMN_NAME HID VIR ---------- ----------------- ------------------ --------------- --- --- 2 3 3 NAME NO NO 3 2 2 CODE NO NO 1 1 1 ID NO NO
We notice the CODE column has been assigned a COLUMN_ID again but not the same one as it was previously. Basically, when a column is made visible, it’s assigned the next highest available COLUMN_ID, in this case the value 3.
Note the original, internal physical column order is still maintained via INTERNAL_COLUMN_ID (e.g. a value of 2 for the CODE column) as Oracle of course still needs a way to determine which column physically belongs where within the table.
So by making the previously non-last column invisible and then visible again, we have effectively changed the logical order of the column within the table:
SQL> desc bowie Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER NAME VARCHAR2(30) CODE NUMBER SQL> select * from bowie where code = 42; ID NAME CODE ---------- ------------------------------ ---------- 90042 DAVID BOWIE 42 100001 ZIGGY STARDUST 42 70042 DAVID BOWIE 42 80042 DAVID BOWIE 42 42 DAVID BOWIE 42 10042 DAVID BOWIE 42 20042 DAVID BOWIE 42 30042 DAVID BOWIE 42 60042 DAVID BOWIE 42 50042 DAVID BOWIE 42 40042 DAVID BOWIE 42 11 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 853003755 ---------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10 | 210 | 11 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE | 10 | 210 | 11 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | BOWIE_CODE_I | 10 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------------
We notice the CODE column is now displayed last by default.
They are some limitations to invisible columns, in that they can’t be used for external, cluster or index organized tables.
Making columns invisible is a neat way to now hide the existence columns within a table. It’s also a neat way to now easily change the default ordering of columns within a table …
12c Indexing Extended Data Types Part II (15 Steps) November 14, 2013
Posted by Richard Foote in 12c, Extended Data Types, Function Based Indexes, Oracle Indexes.2 comments
Finally, at long long last, I have a spare 30 minutes in my life to complete this blog entry !!
As discussed previously, Oracle has extended the maximum length of varchar2, nvarchar and raw columns to 32K, but this comes with some challenges when it comes to indexing such columns due to restrictions on the maximum length of an index entry.
A function-based index on the hash of the column value as previously demonstrated can be used for equality based predicates but not for ranged based requirements.
If index accesses are required for ranged based predicates, then a simple sub-string function-based index can be considered. Using the same set-up and demo as in Part I, let’s create a function-based index that stores the first (say) 1000 characters of an extended data type column. This should provide more than enough detail of the column contents to be sufficiently selective in most practical scenarios.
SQL> create index bowie_substr_text_i on bowie(substr(text,1,1000)); Index created. SQL> select index_name, num_rows, leaf_blocks from dba_indexes where index_name = 'BOWIE_SUBSTR_TEXT_I'; INDEX_NAME NUM_ROWS LEAF_BLOCKS -------------------- ---------- ----------- BOWIE_SUBSTR_TEXT_I 100000 306
Such a substr function-based index is viable not only with equality based predicates:
SQL> select * from bowie where text = '42BOWIE'; Execution Plan ---------------------------------------------------------- Plan hash value: 4016785672 ----------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 16 | 80 (0)| 00:00:01 | |* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE | 1 | 16 | 80 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | BOWIE_SUBSTR_TEXT_I | 400 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(INTERNAL_FUNCTION("TEXT") AND "TEXT"='42BOWIE') 2 - access(SUBSTR("TEXT",1,1000)='42BOWIE') Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 4 consistent gets 0 physical reads 0 redo size 610 bytes sent via SQL*Net to client 544 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
But unlike the hash function-based index in my previous post, it can also be considered in a range (pun fully intended) of ranged-based predicates as well, for example:
SQL> select * from bowie where text between '4299BOWIE' and '42BOWIE'; Execution Plan ---------------------------------------------------------- Plan hash value: 4016785672 ----------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2 | 32 | 92 (0)| 00:00:01 | |* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE | 2 | 32 | 92 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | BOWIE_SUBSTR_TEXT_I | 450 | | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(INTERNAL_FUNCTION("TEXT") AND "TEXT"<='42BOWIE' AND "TEXT">='4299BOWIE') 2 - access(SUBSTR("TEXT",1,1000)>='4299BOWIE' AND SUBSTR("TEXT",1,1000)<='42BOWIE') Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 6 consistent gets 0 physical reads 0 redo size 693 bytes sent via SQL*Net to client 544 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 3 rows processed
SQL> select * from bowie where text > 'C'; Execution Plan ---------------------------------------------------------- Plan hash value: 4016785672 ----------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 63040 | 2277K| 181 (0)| 00:00:01 | |* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE | 63040 | 2277K| 181 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | BOWIE_SUBSTR_TEXT_I | 900 | | 4 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(INTERNAL_FUNCTION("TEXT") AND "TEXT">'C') 2 - access(SUBSTR("TEXT",1,1000)>='C') Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 10 consistent gets 0 physical reads 0 redo size 12884 bytes sent via SQL*Net to client 544 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 2 rows processed
OTWUK13 (Battle For Britain) November 14, 2013
Posted by Richard Foote in OTWUK13, Richard's Musings.add a comment
I’ve been fortunate to attend and present at many Oracle conferences over the years but the one I would love to get to one year is the UKOUG conference. It always seems to have a great line-up of speakers and I’ve heard lots of positive feedback. Unfortunately, it’s a long long way from home, but it might be a good way to get to also see my beloved Crystal Palace football team live in action 🙂
For those attending this year, there’s a extra treat in that running in parallel literally across the road will be the OakTable World UK 2013 conference. It has a fantastic line-up of speakers including:
James Morle
Jonathan Lewis
Alex Gorbachev
Iloon Ellen-Wolff
Niall Litchfield
Doug Burns
Joel Goodman
Marcin Przepiorowski
Christian Antognini (now the latest Oracle ACE Director)
Pete Finnigan
David Kurtz
Moans Nogood
The event is free to all those attending the UKOUG conference but you need to register here first.
Maybe next year I’ll finally have a crack at getting to the UK and attending …