Two versions of a protocol is one too many

There is always a temptation, when facing a hard design decision in the process of creating an interface or a protocol, to produce two (or more) versions. It’s sometimes a good idea, as a way to explore where each one takes you so you can make a more informed choice. But we know how this invariably ends up. Documents get published that arguably should not. It’s even harder in a standard working group, where someone was asked (or at least encouraged) by the group to create each of the alternative specifications. Canning one is at best socially awkward (despite the appearances, not everyone in standards is a psychopath or a sadist) and often politically impossible.

And yet, it has to be done. Compare the alternatives, then pick one and commit. Don’t confuse being accommodating with being weak.

The typical example these days is of course SOAP versus REST: the temptation is to support both rather than make a choice. This applies to standards and to proprietary interfaces. When a standard does this, it hurts rather than promote interoperability. Vendors have a bit more of an excuse when they offer a choice (“the customer is always right”) but in reality it forces customers to play Russian roulette whether they want it or not. Because one of the alternatives will eventually be left behind (either discarded or maintained but not improved). If you balance the small immediate customer benefit of using the interface style they are most used to with the risk of redoing the integration down the road, the value proposition of offering several options crumbles.

[Pedantic disclaimer: I use the term "REST" in this post the way it is often (incorrectly) used, to mean pretty much anything that uses HTTP without a SOAP wrapper. The technical issues are a topic for other posts.]

CMDBf

CMDBf v1 is a DMTF standard. It is a SOAP-based protocol. For v2, it has been suggested that there should a REST version. I don’t know what the CMDBf group (in which I participate) will end up doing but I’ve made my position clear: I could go either way (remain with SOAP or dump it) but I do not want to have two versions of the protocol (one SOAP one REST). If we think we’re better off with a REST version, then let’s make v2 REST-only. Supporting both mechanisms in v2 would be stupid. They would address the same use cases and only serve to provide political ass-coverage. There is no functional need for both. The argument that we need to keep supporting SOAP for the benefit of those who implemented v1 doesn’t fly. As an implementer, nobody is saying that you need to turn off your v1 services the second you launch the v2 version.

DMTF Cloud

Between the specifications submitted directly to DMTF, the specifications developed by DMTF “partner” organizations and the existing DMTF protocols, the DMTF Cloud effort is presented with a mix of SOAP, RESTful and XML-RPC-over-HTTP options. In the process of deciding what to create or adopt I am sure that the temptation will be high to take the easy route of supporting several versions to placate everyone. But such a “consensus” would be achieved on the back of the implementers so I very much hope it won’t be the case.

When it is appropriate

There are cases where supporting alternatives options is worth the cost. But it typically happens when they serve very different use cases. Think of SAX versus DOM, which have clearly differentiated sweetspots. In the Cloud world, Amazon S3 gives us interesting examples of both justified and extraneous alternatives. The extraneous one is the choice between REST and SOAP for the S3 API. I often praise AWS for its innovation and pragmatism, but this is an example of something that only looks pragmatic. On the other hand, the AWS import/export mechanism is a useful alternative. It allows you to physically ship a device with a few terabytes of data to Amazon. This is technically an alternative to the S3 programmatic interface, but one with obviously differentiated use cases. I recommend you reserve the use of “alternative APIs” for such scenarios.

If it didn’t work for Tiger Woods, it won’t work for your Cloud API either. Learn to commit.

[CLARIFICATION: based on some of the early Twitter feedback on this entry, I want to clarify that it's alternative versions that I am against, not successive versions (i.e. an evolution of the interface over time). How to manage successive versions properly is a whole other debate.]

Do You Search or Organize?

Photo by mcfarlandmo on Flickr used under Creative Commons

On a web conference today, I caught a glimpse of someone’s inbox.

Protip: Close your email and IM if you’re presenting something. Unless of course, you want me to see your email folders, including the ones where you store “house” email.

But I digress. The person’s inbox had probably 40 folders, some of them with nested folders, which I’m guessing isn’t that uncommon.

As I’ve stated before, I used to organize email into logical folders, but filing email always took too much time. Inevitably, some email wouldn’t fit nicely into an existing folder, prompting a new folder, causing an infinite loop of organizing and reorganizing.

Years ago, I switched to the flat inbox approach. No folders, just one long list. I now have a local email store of 35,000 emails, plus another 4,000 on the server.

I’m generally able to find email I need based on attributes like, who I think sent it, when I received it, etc. For any others, I use Google Desktop. It’s a lot like my workspace and personal paperwork, i.e. organized clutter.

This system works well for me. As a hopelessly neurotic organizer, I’m freed from the obsessive compulsive desire to file everything. I usually have a good recall of where something is based on its attributes, which is kind of like organizing I suppose, without the filing bit.

Of course, there are occasions when I can’t find something by searching, which is maddening, but they’re rare.

I know a lot of people file email (and dead tree documents) and many even use filters and rules to file email for them.

This seems counterproductive to me. People complain endlessly about having too much digital communication, so why do they add meta-work to each artifact?

Maybe that’s why people cannot achieve inbox Zen because they enforce filing constraints on the process of “doing email”, rather than just doing it.

What do you think? Are you a filer? If so, why? Are you like me, i.e. a searcher? What works/does not work for you about that system?

Find the comments.

Update: Realizing I feel the same way about Facebook and Twitter lists, i.e. too much work. Search needs to be better.Possibly Related Posts:

Software is Hard

Photo by jared on Flickr used under Creative Commons

I’m convinced that innovation on the consumer side of the web is great for enterprise software.

I’m similarly convinced that innovation on the consumer side of the web is terrible for enterprise software.

Reading Marc Benioff’s post “The Facebook Imperative” on TechCrunch last week reminded me of these mutually-exclusive conclusions.

On the one hand, as Benioff points out, the consumer web has driven new methods for delivering software, i.e. the xSP model to make enterprise software more like Amazon.

Well before that, the browser was facilitating collaboration and distributed work within the walls of companies, as intranets and networked software applied the concepts of the WWW to their businesses.

And now, Facebook is completing the old question “why can’t enterprise software be more like blank?”

Obviously, the consumer web has driven major innovation into enterprise software.

It has also simultaneously driven complexity and cost.

What do I mean by that?

Imagine you have a piece of software that does one unit of work, and this unit of work is critical to your business. Along comes Facebook, and suddenly, everyone wants to add a social on top of this unit of work.

It’s a good idea because people do that unit of work, and sometimes they cannot all be in the same room. So, adding a social layer will help collaboration.

By deciding to add social, you’ll now need to determine how to do it. Usually, the decision is between build or buy. Assuming you bought the software initially, it makes sense to see if the vendor has an upgrade that will add social.

If they do, you can go with the upgrade, but that will require an implementation team and careful planning because you cannot disrupt the working software because it’s critical to your business.

Plus, once the upgrade is ready, you’ll need to retrain your users because it’s a good bet that the addition of a new feature has changed how the software works.

If your original vendor doesn’t have the social layer you want, you’ll need to find a vendor that has what you want, and you’ll want that vendor to support some level of integration with the existing unit of work because the social layer will only add value on top of your existing software.

Many companies turn to analysts at this point because analysts know who offers what and have compared vendors to each other. They’ve done the legwork already.

Whether it’s produced by the analyst or the company, a request for proposal (RFP) typically follows. The RFP goes out to vendors who reply with their capabilities.

Software companies want to earn business, natch. So, once new items begin to appear on RFPs, e.g. social, they will need to answer, which leads to the development of features.

On the development side, you can’t avoid complexity by streamlining and removing features, or if you do, you do so at your peril. Facebook can redesign and remove features with impunity because their users don’t pay to use the service.

Enterprise software is obviously for-pay, and as much as you might like to be like 37 Signals, you really can’t expect to keep customers if you remove features they use.

What choice is there? If you don’t add new features, you won’t win business. If you don’t win business, you go out of business.

Once a vendor is selected, the implementation begins and typically follows the same path as an upgrade. It might take a bit longer due to integration testing with your existing software and new training for users.

Pretty involved process. Compare that to switching social networks or joining a new social network in the consumer world.

So, making enterprise software more like Facebook drives complexity, by adding features, and cost, by requiring new software.

Just like making enterprise software like Amazon did and making it more like the Internet and more like a PC did before that.

So, you can see the juxtaposition of good and bad here. That’s why I always say that software is hard.

The key is balancing innovation with complexity.

Thoughts?Possibly Related Posts:

Grid Control Scripts

Like most Oracle shops, we use Grid Control to monitor and give insight into our DB environments. The Grid Control repository is loaded with lots of useful information which sometimes is not always evident or accessible via the Grid Control GUI. Some of us have even attempted to reverse engineer the GC schema to try and answer some questions that we have. This is a collection of scripts/queries I use against the GC repository to get some answers I am looking for. If you have some scripts/pointers, then please share them :) .

Run the following query for current metrics. This shows what thresholds Alerts will be triggered for (Alerts not email/pager notification – that is part of notification rules).

SELECT a.target_name, a.target_type, a.metric_name, a.metric_column,
       DECODE(TRIM(a.warning_threshold), '',
       DECODE(TRIM(a.critical_threshold), '', 'DISABLED', 'ENABLED'), 'ENABLED') STATUS ,
       a.warning_operator, a.warning_threshold, a.critical_operator,
       a.critical_threshold,
       REPLACE(REGEXP_SUBSTR(b.schedule_ex, '"[^"]*"'), '"', '') FREQUENCY,
       NVL(REPLACE(REPLACE(REGEXP_SUBSTR(b.schedule_ex, 'T="[^"]*"'), 'T=', ''),'"', ''), 'Minutes') FREQUENCY_UNIT,
       c.frequency_code, a.occurence_count, a.warning_count,
       a.critical_count, c.is_enabled
FROM MGMT$METRIC_COLLECTION a, SYSMAN.MGMT_METRIC_COLLECTIONS b, sysman.MGMT$TARGET_METRIC_COLLECTIONS c
WHERE a.target_guid = b.target_guid
  and a.target_guid = c.target_guid
  and b.metric_guid = c.metric_guid
  and a.metric_name = c.metric_name
ORDER BY target_name, target_type, a.metric_name;

Next, Notification Methods need to be queried to determine which alerts Oracle sends our emails for.

SELECT RULE_NAME, OWNER, TARGET_TYPE, TARGET_NAME, TARGET_GUID,
                 METRIC_NAME, METRIC_COLUMN, KEY_VALUE, KEY_PART_1, KEY_PART_2,
                 KEY_PART_3, KEY_PART_4, KEY_PART_5, WANT_CLEARS, WANT_WARNINGS,
                 WANT_CRITICAL_ALERTS, WANT_TARGET_UP, WANT_TARGET_DOWN,
                 WANT_TARGET_UNREACHABLE_START, WANT_TARGET_UNREACHABLE_END,
                 WANT_TARGET_METRIC_ERR_START, WANT_TARGET_METRIC_ERR_END,
                 WANT_TARGET_BLACKOUT_START, WANT_TARGET_BLACKOUT_END,
                 WANT_POLICY_CLEARS, WANT_POLICY_VIOLATIONS,
                 WANT_WARNING_JOB_SUCCEEDED, WANT_WARNING_JOB_PROBLEMS,
                 WANT_CRITICAL_JOB_SUCCEEDED, WANT_CRITICAL_JOB_PROBLEMS,
                 WANT_POLICY_JOB_SUCCEEDED, WANT_POLICY_JOB_PROBLEMS, IGNORE_RCA
FROM SYSMAN.MGMT_NOTIFY_RULE_CONFIGS;

This final Query will combine the 2 to show alerts and if they will be notified on.

SELECT DISTINCT a.target_name,
           a.target_type,
           a.metric_name,
           a.metric_column,
           DECODE (
              TRIM (a.warning_threshold),
              '',
              DECODE (TRIM (a.critical_threshold), '', 'DISABLED', 'ENABLED'),
              'ENABLED'
           )
              STATUS,
           NVL (d.rule_name, 'NO RULE') rule_name,
           a.warning_operator,
           a.warning_threshold,
           a.critical_operator,
           a.critical_threshold,
           REPLACE (REGEXP_SUBSTR (b.schedule_ex, '"[^"]*"'), '"', '')
              FREQUENCY,
           NVL (
              REPLACE (
                 REPLACE (REGEXP_SUBSTR (b.schedule_ex, 'T="[^"]*"'), 'T=', ''),
                 '"',
                 ''
              ),
              'Minutes'
           )
              FREQUENCY_UNIT,
           c.frequency_code,
           a.occurence_count,
           a.warning_count,
           a.critical_count,
           c.is_enabled
    FROM   MGMT$METRIC_COLLECTION a,
           SYSMAN.MGMT_METRIC_COLLECTIONS b,
           sysman.MGMT$TARGET_METRIC_COLLECTIONS c,
           (SELECT DISTINCT DECODE (TRIM (y.target_name),
                             '%', x.target_name,
                             y.target_name) target_name,
                     y.rule_name,
                     y.metric_name,
                     y.metric_column
              FROM   SYSMAN.MGMT$METRIC_COLLECTION x,
                     SYSMAN.MGMT_NOTIFY_RULE_CONFIGS y
             WHERE   (x.target_name = y.target_name
                      OR TRIM (y.target_name) = '%')
                     AND x.metric_name = y.metric_name
                     AND x.metric_column = y.metric_column) d
   WHERE       a.target_guid = b.target_guid
           AND a.target_guid = c.target_guid
           AND b.metric_guid = c.metric_guid
           AND a.metric_name = c.metric_name
           AND a.target_name = d.target_name(+)
           AND a.metric_name = d.metric_name(+)
           AND a.metric_column = d.metric_column(+)
ORDER BY   target_name, target_type, a.metric_name;

If you see any errors above, then please let me know so I can fix them!

Lastly, we run a script against the Grid Control repository to pull out availability metrics such as database uptime %, Avg Host CPU Util %, Avg Host memory Util %, and ASM Disk Group total space and free space. Hopefully if will give you a pretty good idea of where the information is so you can modify it for your own use with your own metrics of interest.

Basically SQLPLUS spools it out to an Excel file and then the script emails it out.

First, the shell script

#!/bin/bash

export CYM=$(date '+%Y%m')
export MCY=$(date '+%B %Y')
export SQLD=$HOME/scripts
export ORACLE_SID=emrep
export ORACLE_HOME=/u001/app/oracle/product/db10g

$ORACLE_HOME/bin/sqlplus -s "sysman/sysman_password" @$SQLD/metrics.sql

cp /home/oracle/scripts/spool/oracle_metrics.xls /home/oracle/scripts/spool/oracle_metrics_$CYM.xls

echo "Oracle Metrics Collection - ${MCY}" | /usr/bin/mutt -a /home/oracle/scripts/spool/oracle_metrics_${CYM}.xls -s "Oracle Metrics Collection - ${MCY}" email_address@domain.com
exit 0

Really you could email with sendmail or mailx, but you will need uuencode to encode the attachment and then pipe that into your mail program.

Next is the SQL script to use. You will need to identify you ASM targets (Chances are you only want one of them). You will also have to put a filter. If you read the script you will see what you have to put in. I will do some tweaking to see if I can’t make it more universal without editing needed.

SET MARKUP HTML ON HEAD "<title>Production Metrics Report</title> - <meta http-equiv='Content-Type' content='application/vnd.ms-excel;'> <style type='text/css'> <!-- BODY {background: red} --> </style>"
set pagesize 50000
set trimspool on
set feedback off
set echo off
set term off
spool /home/oracle/scripts/spool/oracle_metrics.xls
select
  distinct a.target_name "Target Name",
  nvl(b.uptime,100) "Database Uptime (%)"
from
  sysman.MGMT$AVAILABILITY_HISTORY a,
  (select target_name,
     round((100-(sum(trunc(86400*(end_timestamp-start_timestamp)))/trunc(86400*(add_months(trunc(sysdate,'MM'),-0)-add_months(trunc(sysdate,'MM'),-1))))),5) uptime
   from
     sysman.MGMT$AVAILABILITY_HISTORY
   where
     target_type in ('oracle_database','rac_database')
     and target_name like '%somefilter%'
     and target_name not like 'st%'
     and target_name not like 'dg%'
     and target_name not like 'meta%'
     and target_name not like 'emrep%'
     and start_timestamp between add_months(trunc(sysdate,'MM'),-1) and add_months(trunc(sysdate,'MM'),0)
     and availability_status = 'Target Down'
   group by target_name) b
where
  a.target_name = b.target_name(+)
  and a.target_type in ('oracle_database','rac_database')
  and a.target_name like '%somefilter%'
  and a.target_name not like 'st%'
  and a.target_name not like 'dg%'
  and a.target_name not like 'meta%'
  and a.target_name not like 'emrep%'
  order by a.target_name;

select t.target_name "Target Name", TO_CHAR(round(avg(value_average),2)) "Avg Host CPU Util (%)"
from mgmt_metrics_1hour h, mgmt_targets t where
h.target_guid in (select target_guid from mgmt_targets t where
target_type = 'host' and
target_name in (select target_name from mgmt_targets where target_type='host' and target_name like '%somefilter'
                                 )) and
h.metric_guid = (select m.metric_guid from mgmt_metrics m where
                          m.target_type = 'host' and
                          m.metric_name = 'Load' and
                          m.metric_column = 'cpuUtil'and
                          t.type_meta_ver = m.type_meta_ver and
                         (t.category_prop_1 = m.category_prop_1 OR m.category_prop_1 = ' ') and
                         (t.category_prop_2 = m.category_prop_2 OR m.category_prop_2 = ' ') and
                         (t.category_prop_3 = m.category_prop_3 OR m.category_prop_3 = ' ') and
                         (t.category_prop_4 = m.category_prop_4 OR m.category_prop_4 = ' ') and
                         (t.category_prop_5 = m.category_prop_5 OR m.category_prop_5 = ' ')) and
h.target_guid = t.target_guid and
--rollup_timestamp > sysdate-31
rollup_timestamp between add_months(trunc(sysdate,'MM'),-1) and add_months(trunc(sysdate,'MM'),0)
group by t.target_name;

select t.target_name "Target Name", TO_CHAR(round(avg(value_average),2)) "Avg Host Memory Util (%)"
from mgmt_metrics_1hour h, mgmt_targets t where
h.target_guid in (select target_guid from mgmt_targets t where
target_type = 'host' and
target_name in (select target_name from mgmt_targets where target_type='host' and target_name like '%somefilter_such as domain name'
                                 )) and
h.metric_guid = (select m.metric_guid from mgmt_metrics m where
                          m.target_type = 'host' and
                          m.metric_name = 'Load' and
                          m.metric_column = 'memUsedPct'and
                          t.type_meta_ver = m.type_meta_ver and
                         (t.category_prop_1 = m.category_prop_1 OR m.category_prop_1 = ' ') and
                         (t.category_prop_2 = m.category_prop_2 OR m.category_prop_2 = ' ') and
                         (t.category_prop_3 = m.category_prop_3 OR m.category_prop_3 = ' ') and
                         (t.category_prop_4 = m.category_prop_4 OR m.category_prop_4 = ' ') and
                         (t.category_prop_5 = m.category_prop_5 OR m.category_prop_5 = ' ')) and
h.target_guid = t.target_guid and
--rollup_timestamp > sysdate-31
rollup_timestamp between add_months(trunc(sysdate,'MM'),-1) and add_months(trunc(sysdate,'MM'),0)
group by t.target_name;

select decode(t.target_name,'YOURASM_TARGET','FRIENDLY NAME','YOURDRASM_TARGET','FRIENDLY NAME') "Target Name", TO_CHAR(round(max(b.value_average)/1024,0)) "Total Space (GB)",
TO_CHAR(round(max(a.value_average)/1024,0)) "Total Free Space (GB)"
from mgmt_metrics_1hour a, mgmt_metrics_1hour b, mgmt_targets t
where a.target_guid in (select target_guid from mgmt_targets t where
target_type = 'osm_instance' and
target_name in (select target_name from mgmt_targets where target_type='osm_instance' and target_name like '+ASM1%'
and target_name not like 'st%'))
and
a.metric_guid = (select m.metric_guid from mgmt_metrics m where
                          m.target_type = 'osm_instance' and
                          m.metric_name = 'DiskGroup_Usage' and
                          m.metric_column = 'free_mb' and
                          t.type_meta_ver = m.type_meta_ver and
                         (t.category_prop_1 = m.category_prop_1 OR m.category_prop_1 = ' ') and
                         (t.category_prop_2 = m.category_prop_2 OR m.category_prop_2 = ' ') and
                         (t.category_prop_3 = m.category_prop_3 OR m.category_prop_3 = ' ') and
                         (t.category_prop_4 = m.category_prop_4 OR m.category_prop_4 = ' ') and
                         (t.category_prop_5 = m.category_prop_5 OR m.category_prop_5 = ' '))and
b.metric_guid = (select m.metric_guid from mgmt_metrics m where
                          m.target_type = 'osm_instance' and
                          m.metric_name = 'DiskGroup_Usage' and
                          m.metric_column = 'total_mb' and
                          t.type_meta_ver = m.type_meta_ver and
                         (t.category_prop_1 = m.category_prop_1 OR m.category_prop_1 = ' ') and
                         (t.category_prop_2 = m.category_prop_2 OR m.category_prop_2 = ' ') and
                         (t.category_prop_3 = m.category_prop_3 OR m.category_prop_3 = ' ') and
                         (t.category_prop_4 = m.category_prop_4 OR m.category_prop_4 = ' ') and
                         (t.category_prop_5 = m.category_prop_5 OR m.category_prop_5 = ' ')) and
a.target_guid = t.target_guid and
b.target_guid=t.target_guid and
--a.rollup_timestamp > sysdate-31
a.rollup_timestamp between add_months(trunc(sysdate,'MM'),-1) and add_months(trunc(sysdate,'MM'),0)
group by t.target_name;

spool off
exit

And that’s all I have for now, but please leave feedback on any errors or if there are some scripts you like to run against the repository.

Part of the Puzzle: Oracle XMLDB NFS Functionality

This story is long overdue and no its NOT about the Oracle Database 11g Database File System (DBFS). Its about an “undocumented” NFS functionality that, maybe someday, will be serviced by the XMLDB XDB Protocol Adapter. This post is “long overdue” because the actual attempts to try to figure it out were done during the [...]

Part of the Puzzle: Oracle XMLDB NFS Functionality

This story is long overdue and no its NOT about the Oracle Database 11g Database File System (DBFS). Its about an “undocumented” NFS functionality that, maybe someday, will be serviced by the XMLDB XDB Protocol Adapter. This post is “long overdue” because the actual attempts to try to figure it out were done during the bank holidays between X-mas and new year 2009.

So what is it all about. I once discovered in the Oracle 11gR1 documentation a small entry in the xmlconfig.xsd XML Schema regarding NFS elements that look like that they are or will be used for enabling NFS functionality based on the Oracle XMLDB Protocol Server architecture. In those days, when Oracle 11gR1 was just of the shelve, I made a few attempts, based on the xdbconfig.xsd XML Schema to adjust the corresponding xdbconfig.xml file that controls the XDB Protocol Server functionality, to see what would happen. At that time I only was able to get this far (see the picture) and I promised myself that I should look deeper into it trying to figure out if I could get it working and/or what the concepts were that made it tick in the XMLDB architecture but somewhere down the line I just didn’t come to it and it got “forgotten” by me due to my daily DBA workload.

NFS Protocol Server functionality enabled manually

Click picture to enlarge


The XDB Protocol Server

XML was/is a lot about interfacing. Oracle has from the start with the XMLDB functionality, officially supported since database version 9.2.0.3.0, implemented an enormous amount of W3C and other XML standards. One of this was the need to have a repository. The XDB Protocol Server provides easy access to this repository and on the side opens up database content and functionality you maybe not even aware off. The XDB Protocol Server adapter is build on a very old (Oracle 7) SQL*Net architecture once called “The Multithreaded Server” architecture (MTS) or as it is known nowadays The Shared Server architecture. This architecture was introduced in those Oracle 7 days to minimize the memory resources of dedicated SQL*Net connections of the corresponding server processes in a decade that memory was still incredible expensive.

Click picture to enlarge

You can control the functionality of this XDB Protocol Server adapter architecture on three levels:

  • Via the Listener: the listener.ora and other related configuration files
  • Via the Database: by setting database parameters via the pfile or spfile database configuration file(s)
  • Via the Protocol Server adapter: xdbconfig.xml configuration file

In its behavior and possibilities the xdbconfig.xml file has a lot in its look and feel like the Apache httpd.conf file or a server.xml file of an Application Server. The configuration defines for example MIME types, memory and locking behavior, configuration of “servlets” (naming probably derived from the WebDAV definitions) like HTTP, FTP, Native Database Web Services (NDWS), PL/SQL Gateways like local APEX support, security, etc., etc.

Click picture to enlarge

The xdbconfig.xml file is restricted by one of the by Oracle defined XML Schemata called “xdbconfig.xsd” and you will need the XDBADMIN database role to alter its content. These schemata are located in the “sys” directory of the XDB Repository. Be aware that you should treat this “sys” directory (or so called “resource” in WebDAV terms) as if it were the SYS user schema in the database. Oracle will uphold its right to alter the structures in this directory as it pleases, also regarding the (ACL) security, versioning etc. So never use this “sys” directory/resource or sub-directories as a placeholder for you application files or resources.

Click picture to enlarge

So within the limits of the xdbconfig.xsd, you could add you own specific protocol server needs in terms of extra PL/SQL gateway definitions or adding MIME types, so you would be able to trigger a by you defined method to act on a certain file extension or file extension content. The xdbconfig.xml file which is actually a record in a table called XDB$CONFIG is protected by Access Control Lists (ACL), underneath enforced by Oracle’s VPD methods. Due to the fact that Oracle is using VPD internally to make this work, to enforce ACL security, this part is free of license as is Oracle XMLDB functionality by the way.

Click picture to enlarge

Besides acting as a web server (HTTP/HTTPS), Oracle build in, by default, FTP access (FTP Server functionality), the mentioned Native Database Web Service (the database acts as a web service), and support for its own applications (APEX, a servlet called “ReportFmwkServlet” for DB Console / OEM reporting) and the “DBURI” servlet, which makes it possible to query (via XPath) and report database table content.

These so called Servlets can make use of Java, PL/SQL or C interfacing methods. The C related servlets, like the NDWS, DBURI and “ReportFmwkServlet” hook directly into the Oracle kernel and are, regarding its internal workings, only known to Oracle and not further documented. That is, the only thing that is described, is how they can be enabled and how they should be used.

But there is more.

Another cool feature is that XDB Repository actions/events can be triggering by an Oracle defined action/method (e.g. shredding XML data directly into a corresponding table after being FTP-ed or drag/dropped by WebDAV in the XDB Repository) or, as of Oracle 11gR1, user actions/methods. The latter is called “Repository Events“. Repository Events are events which get triggered via defined methods on the Repository. These XDB Repository Events need defining an “Event Listener“, an “Event Handler” and a “Event Configuration” file, which hooks everything together.

Be aware that a Repository Event is NOT a database trigger. Also a repository operation can be associated with one or more repository events. To name a few: creating, deleting, locking, unlocking, placing under version control, checking in, checking out, unchecking out, opening, and/or updating a resource (aka a file or folder).

If you need more info and/or examples, have a look at the “XFiles” XMLDB Demo Application that demonstrates, among others, lightweight content management functionality, NDWS and more.

Trying to figure out XDB NFS Functionality

Now that you have an overview, where does this XDB NFS kickin in all of this? In the current latest release, Oracle 11gR2, the existence of this XDB NFS functionality can be found via accessing the configuration web pages of the local DB Console. In the DB Console server menu tab, you can find the XDB Configuration URL and after clicking it you will see the following page in Oracle 11gR2.

Click picture to enlarge

Clicking on the “ENABLE” button will bring you in the “exports” and NFS port configuration file.

Click picture to enlarge

After configuring and exporting, for example, the /public and /home of the WebDAV / XDB Repository directories and its resources (aka files) and clicking on the “OK” button, the xdbconfig.xml configuration file will have been updated and the listener will show a status that has an extra entry for the servicing the NFS protocol. IN 2007 I did configure the NFS entries by hand based on the xmlconfig.xsd XML Schema. The DB Console pages will do this for you.

Trying to figure out how all elements hooked in each other I started searching and tracing from the inside out (database, protocol server, listener, OS) or at least described here in “reverse” order.

The Database Part

I am guessing that the NFS XDB functionality probably hooks into a C kernel based “servlet” somehow. At least part of it already can be controlled my the xdbconfig.xml file and the user XDB has a table called XDB$ROOT_INFO that supports NFS entries.

SQL> sho user
 
USER IS "XDB"
 
SQL> DESC XDB$ROOT_INFO
 
 Name                                      NULL?    Type
 ----------------------------------------- -------- ----------------------------
 RESOURCE_ROOT                                      ROWID
 RCLIST                                             RAW(2000)
 FTP_PORT                                           NUMBER(5)
 FTP_PROTOCOL                                       VARCHAR2(4000)
 HTTP_PORT                                          NUMBER(5)
 HTTP_PROTOCOL                                      VARCHAR2(4000)
 HTTP_HOST                                          VARCHAR2(4000)
 HTTP2_PORT                                         NUMBER(5)
 HTTP2_PROTOCOL                                     VARCHAR2(4000)
 HTTP2_HOST                                         VARCHAR2(4000)
 NFS_PORT                                           NUMBER(5)
 NFS_PROTOCOL                                       VARCHAR2(4000)

Other semi build in table structures that can be found in the XDB user schema or the 11gR2 database that are or that probably are XMLDB NFS related:

SQL> DESC XDB$CONFIG
 
 Name                                      NULL?    Type
 ----------------------------------------- -------- ----------------------------
TABLE of SYS.XMLTYPE(XMLSchema "http://xmlns.oracle.com/xdb/xdbconfig.xsd" Element "xdbconfig") STORAGE BINARY
 
SQL> DESC SERVLET
 
 Name                                      NULL?    Type
 ----------------------------------------- -------- ----------------------------
TABLE of SYS.XMLTYPE(XMLSchema "http://xmlns.oracle.com/xdb/XDBStandard.xsd" Element "servlet") STORAGE Object-relational TYPE "SERVLET_T"
 
SQL> DESC "SERVLET_T"
 
 Name                                      NULL?    Type
 ----------------------------------------- -------- ----------------------------
 SYS_XDBPD$                                         XDB$RAW_LIST_T
 icon                                               VARCHAR2(4000 CHAR)
 servlet-name                                       VARCHAR2(4000 CHAR)
 servlet-LANGUAGE                                   XDB$ENUM_T
 display-name                                       VARCHAR2(4000 CHAR)
 description                                        VARCHAR2(4000 CHAR)
 servlet-class                                      VARCHAR2(4000 CHAR)
 jsp-file                                           VARCHAR2(4000 CHAR)
 servlet-schema                                     VARCHAR2(4000 CHAR)
 load-on-startup                                    VARCHAR2(4000 CHAR)
 security-role-ref                                  security-role-ref6_COLL
 
SQL> DESC "security-role-ref6_COLL"
 
 "security-role-ref6_COLL" VARRAY(65535) OF security-role-ref5_T
 
 Name                                      NULL?    Type
 ----------------------------------------- -------- ----------------------------
 SYS_XDBPD$                                         XDB$RAW_LIST_T
 description                                        VARCHAR2(4000 CHAR)
 role-name                                          VARCHAR2(4000 CHAR)
 role-link                                          VARCHAR2(4000 CHAR)
 
SQL> DESC XDB$MOUNTS
 
 Name                                      NULL?    Type
 ----------------------------------------- -------- ----------------------------
 DOBJ#                                              NUMBER
 DPATH                                              VARCHAR2(4000)
 SOBJ#                                              NUMBER
 SPATH                                              VARCHAR2(4000)
 FLAGS                                              NUMBER
 
SQL> DESC DBMS_XDBNFS
 
SQL> SELECT * FROM TABLE( myunwrapper( 'DBMS_XDBNFS','XDB', NULL));
 
COLUMN_VALUE
-----------------------------------------------------------------------
PROCEDURE DUMP_NFSSTATS
 
FUNCTION NFSFH2RESID RETURNS RAW
 Argument Name                  Type                    IN/Out DEFAULT?
 ------------------------------ ----------------------- ------ --------
 FH                             RAW                     IN
 
PROCEDURE RESET_NFSSTATS
 Argument Name                  Type                    IN/Out DEFAULT?
 ------------------------------ ----------------------- ------ --------
 SKIP                           BINARY_INTEGER          IN
 TRACE                          BINARY_INTEGER          IN
 
PROCEDURE SYNCRESOURCE
 Argument Name                  Type                    IN/Out DEFAULT?
 ------------------------------ ----------------------- ------ --------
 RESID                          RAW                     IN
 
PACKAGE BODY DBMS_XDBNFS AS
 
FUNCTION NFSFH2RESID(FH IN RAW) RETURN RAW IS
BEGIN
  RETURN SUBSTR(FH, 1, 32);
END;
 
PROCEDURE SYNCRESOURCE(RESID IN RAW) IS
  EXTERNAL
  NAME "DBMSXDB_SYNC_RESOURCE"
  LANGUAGE C
  LIBRARY DBMS_XDB_LIB
  WITH CONTEXT
  PARAMETERS (CONTEXT,
              RESID   RAW,
              RESID   INDICATOR SB4,
              RESID   LENGTH SB4);
 
PROCEDURE DUMP_NFSSTATS IS
  EXTERNAL
  NAME "DBMSXDB_DUMPNFSSTATS"
  LANGUAGE C
  LIBRARY DBMS_XDB_LIB;
 
PROCEDURE RESET_NFSSTATS(SKIP IN PLS_INTEGER, TRACE IN PLS_INTEGER) IS
  EXTERNAL
  NAME "DBMSXDB_RESETNFSSTATS"
  LANGUAGE C
  LIBRARY DBMS_XDB_LIB
  WITH CONTEXT
  PARAMETERS (CONTEXT,
              SKIP           UB4,
              TRACE          UB4);
 
END DBMS_XDBNFS;
 
SQL> SET head off
SQL> SELECT * FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME IN ('XMLDB_NFS_CLEANUP_JOB');
 
SYS                            XMLDB_NFS_CLEANUP_JOB
                               REGULAR     SYS
STORED_PROCEDURE
xdb.dbms_xdbutil_int.cleanup_expired_nfsclients
                  0
CALENDAR
Freq=minutely;interval=5
XMLDB_NFS_JOBCLASS             FALSE TRUE  FALSE DISABLED                   3
         0                        0                        0
OFF         FALSE TRUE

Anyway, testing set NFS functionality revealed that it has to be set after database start-up and for now doesn’t automatically load-on-startup, even after entering/updating for example table XDB$ROOT_CONFIG with the proper values.

The Protocol Server Part

Tracing the functionality as described in “ORA-31098: Internal event to turn on XDB tracing”, even combined with tracing on the appropriate shared server process id via the Oracle support facility called oradebug

Methods used where setting the event 31089 XDB protocol trace event on database level, like in the following example or higher and combining it with the 10046 event set via oradebug for the proper shared server process.

-- Used level 2 and higher to trace
SQL> ALTER system SET event= '31098 trace name context forever, level 2' scope=spfile;
 
SQL> oradebug setorapid 18
Oracle pid: 18, Unix process pid: 28368, image: oracle@srv01-18-102.amis.LOCAL (S000)
 
SQL> oradebug event 10046 trace name context forever, level 12
Statement processed.
 
-- To disable the event
-- SQL> ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF
-- Statement processed.

As you can see/read, I had way to much time, to search the database, but then again working in between bank holidays can be a very quiet and productive time. What helps as well b.t.w. is using a Linux or Unix environment and search, for example, with some “grep” statements through the $ORACLE_HOME/rdbms/admin scripts. Searching through those scripts I found also hints that Oracle started thinking or building this functionality in approximately during/after the year 2005, based on the comments in the header of those scripts.

The Listener / OS part

Initially when I started it took me a while that by default Oracle Enterprise Linux has NFS services running in its “out of the box” state (not OK I think), So after stopping or even killing every NFS related daemon or service I started tracing on the Oracle listener part. Stopping every NFS part on the OS side is important due to the fact that otherwise the enabled port on the listener side (in my case 2049) will be blocked due to the fact that the defined port has already been taken by an OS daemon/service or maybe could trigger other “smart” processes like portmapper and others. In all intervening with my mount / trace attempts.

So the setting was as follows:

[root@srv01-18-103 oranfs]# su - oracle -c 'lsnrctl status'
 
LSNRCTL FOR Linux: Version 11.2.0.1.0 - Production ON 28-DEC-2009 14:31:38
Copyright (c) 1991, 2009, Oracle.  ALL rights reserved.
Connecting TO (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
 
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR FOR Linux: Version 11.2.0.1.0 - Production
Start Date                15-DEC-2009 18:24:37
Uptime                    12 days 20 hr. 7 min. 1 sec
Trace Level               off
Security                  ON: LOCAL OS Authentication
SNMP                      OFF
Listener Log File         /u01/app/oracle/diag/tnslsnr/srv01-18-103/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=srv01-18-103.amis.LOCAL)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=srv01-18-103.amis.LOCAL)(PORT=8080))(Presentation=HTTP)(Session=RAW))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=srv01-18-103.amis.LOCAL)(PORT=2100))(Presentation=FTP)(Session=RAW))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=srv01-18-103.amis.LOCAL)(PORT=2049))(Presentation=NFS)(Session=RAW))
Services Summary...
Service "ORCL" has 1 instance(s).
  Instance "ORCL", STATUS READY, has 1 handler(s) FOR this service...
Service "ORCLXDB" has 1 instance(s).
  Instance "ORCL", STATUS READY, has 1 handler(s) FOR this service...
 
The command completed successfully

I created a directory on the Linux side /oranfs/public and opened it up for the world regarding its security settings (btw secure linux is not enabled on my test OEL linux system nor any firewall). I attempted connections / mount options via the NFS3 and NFS4 protocols but both weren’t successful (at least that was what I thought) via variations on the following:

[root@srv01-18-103 oranfs]# mount -v -t nfs srv01-18-103:2049/public /oranfs/public -o ro,sync,auto,hard,intr
 
mount: Unable TO connect TO 10.252.252.103:111, errno 111 (Connection refused)
mount: trying 10.252.252.103 prog 100003 vers 3 prot tcp port 49096
mount: Unable TO connect TO 10.252.252.103:49096, errno 111 (Connection refused)
mount: mount TO NFS server 'srv01-18-103' failed: System Error: Connection refused.
 
[root@srv01-18-103 oranfs]# mount -v -t nfs srv01-18-103:/public /oranfs/public -o ro,sync,auto,hard,intr
 
mount: Unable TO connect TO 10.252.252.103:111, errno 111 (Connection refused)
mount: trying 10.252.252.103 prog 100003 vers 3 prot tcp port 49096
mount: Unable TO connect TO 10.252.252.103:49096, errno 111 (Connection refused)
mount: mount TO NFS server 'srv01-18-103' failed: System Error: Connection refused.

I had enabled the listener to trace on support level via the following so I could follow if at least the listener would try to pick up the mount request and do a hand off to a part in the database.

LSNRCTL> SET trc_level 16
 
Connecting TO (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER parameter "trc_level" SET TO support
 
The command completed successfully

I will spare you the whole listener and trace file (you could try it yourself anyway if your interested), but using the NFS4 protocol mount options were picked up by the listener.

-- listener.log
Thu Dec 31 12:34:46 2009
31-DEC-2009 12:34:46 * NFS * (ADDRESS=(PROTOCOL=tcp)(HOST=10.252.252.103)(PORT=65128)) * handoff * NFS * 0

and in the trace file…

...
2009-12-31 12:34:46.775605 : nsglnphc:Connected WITH client. Protocol: tcp  Presentation: NFS.
...
AND a bit later
...
2009-12-31 12:34:46.787677 : nsbequeath:NSE=12586
2009-12-31 12:34:46.787784 : nsbequeath:error reading REDIR/NSE msg
...

Summery

What did I learn? In principal not that much, just that some of the structures (or residue depending on the view) regarding XDB NFS Protocol Server adapter support is build in. On the other hand, besides the tedious monk work regarding trace 31098 levels, the whole exercise crawling through all those database setup and installation scripts, the tracing as is, and deep dive into database parts gave me a better understanding and insight of the internal workings of it all.

I would really like to see this functionality in a next release, not only because I think that the Securefile Development team functionality of the Database File System (DBFS) is a bit of a fuzz on pointers like having to use FUSE and a DBFS client to make it all happen. Despite they did great work to make it happen in the first place, but being me a XMLDB nerd, why not use a much more simpler set-up without all those prerequisites. The XDB Repository and the XDB Protocol Server architecture have so much to offer in terms of extra’s along the side like “Repository Events“, ACL Security build-in, Versioning, etc, to just name a few.

And yes, XMLDB has also a lot of hook-ins regarding securefile support or for instance DICOM support as a old “XFiles” demo application will prove automatically recognizing EXIF information in JPG/PNG and other pictures. Oracle please implement it after all, if not only due to enabling an extra possibility to exchange XML based data.

Just an idea.

M.

Want to see it all in action?

I will be giving some demonstrations on the mentioned subject in this post during a presentation of mine called: “Boost your environment with Oracle XMLDB”. You can attend this presentation during the “MOTS” and “MOW” events this year.

Introducing Terri Noyes, Guest Author

I am very pleased to welcome Terri Noyes to this blog's panel of guest authors.  Terri leads the Oracle E-Business Suite Platforms Engineering team, which handles EBS porting and related documentation, and database and technology certifications on non-base operating systems and hardware architectures.  Regular readers know that a significant number of certifications announced here are performed by our E-Business Suite Platforms Engineering team, so we're very lucky that she's going to be a regular contributor here.

Terri Noyes is the Senior Director of E-Business Suite Platform Engineering and Product Management in the Applications Development Organization.  She joined Oracle in 1991, after software engineering positions at MIT Lincoln Laboratories and General Electric.  She has a BS in Computer Science and a second degree in Mathematics from University of Massachusetts Amherst, and an MS in Computer Science and Computer Engineering from RPI.  After a 10-year stint at Oracle headquarters in Redwood Shores, California, Terri relocated to the Boston Area to be closer to her native state of Maine.  Her team is spread over the US, India, China and the Philippines.

A lot of people ask Terri why she has been at Oracle so long, and her answer is "It's a very exciting place, and always changing... I've loved Oracle since the minute I walked in the door."

Another reason to expect number-crunching and big-data management to converge

Dan Olds argues that Oracle is likely to pursue commercially-substantive high performance computing (HPC), emphasis mine:

I just don’t see Oracle abandoning HPC entirely. I think it may call it by some other name or describe it differently, but it will be in the high throughput computing business for the foreseeable future.

There are some interesting angles for it to pursue. Many of its best commercial customers have sizeable HPC or HPC-like workloads that Oracle can now (with the addition of Sun) compete for. I don’t see it passing up those opportunities.

Oracle can also look to specialize on certain subsets of the market and provide more of a solution rather than piece parts. I wouldn’t be surprised to hear of it offering an Exadata-like system that is optimized for, say, seismic or financial services. In fact, Exadata as it stands today is a decent fit for financial service analytic workloads.

HPC can be a profitable business and, in a lot of organizations, it’s growing faster than traditional business processing. From Oracle’s perspective, what’s not to like?

Now, except for the Exadata-in-financial-services comment, that’s not directly an argument for the convergence of number crunching and data management.  However, I think Netezza and Aster Data are showing the way for that convergence. So, up to a point, is the scientific-research community. And of course the Hadoop guys think they have the best way to that convergent future.

But if Dan Olds is right that the best technologies for Oracle to pursue HPC and big-data processing with aren’t all that far apart, then the chances that Oracle will indeed pursue their convergence are pretty high. And that would amount to critical mass for the trend.

Subversion – branching, merging and reintegration

Subversion is a great source control system. One of the great features is it’s branching and merging support. Although many developers avoid it, branching is very powerful and useful and should not be something to be afraid off but something to be familiar with. And for the stable and controlled development is it almost a [...]

Hyperion, SQL and APEX, Lies, Damn Lies and Statistics, SOA, OBIEE


Hyperion

Just came across a Hyperion blog I hadn't seen before, one run by Johnson & Associates Consulting called the Hyperion Consultant Blog. Let me know what you think of it.

SQL and APEX

A posting over at John's Blog touches the tip of the veritable iceberg of the potential impact of views on performance. Through a simple example he shows how you can end up with a reduntant sort operation from using a view. But there can be lots of other impacts, and I've seen views of such intricacy and inefficiency that they've turned out to be the cause of major performance problems. Often it starts out as: well, we just need a view to simplify coding this report. Then over the months and years it is forgotten that the view was created for a specific report and it starts to be used as if it were a table, then there are modifications, then someone creates a view that uses the view as an element, and from there it's all downhill in a handbasket.

So views are a great way to help out developers, but don't let them take on a life of their own or they can become a real problem.


On APEX, have you been hearing the hoopla about Application Express for a long time and meaning to 'get around to that'? Well, have a look at this site and you can set up an account and mess around in your very own workspace to get familiar with APEX. I think you will find it an elegant and useful product for fast development (and a lot of more complex tasks).


One more item in the wonderful world of APEX this week: How to Avoid Bot Spammers in APEXover at Martin Giffy D'Souza's APEX blog.

Lies, Statistics and Their Ilk

In a posting entitled Autotrace Lies Too! Kerry Osborne digs in to some of the behavior of autotrace and the intricacies of how close an explain plan is to what the optimizer really ends up doing. He points back in the posting to an excellent posting from Tom Kyte on the same subject.

SOA

Looking for a trimmed down summary of SOA 11g: Cluster installation? Well, there's the link over at the SOA@Oracle SCA, BPEL, BPM & Service Bus. The blog title is almost as long as the process.

OBIEE

Working with OBIEE? You should definitely take a look at the Oracle Business Intelligence obiee 101 blog. Lots of nice little technical how-to's. Definitely something to add to your RSS feeds. Example: OBIEE Popup Box.

Complex Event Processing – Java Magazine – Sources & References

This article contains the resources for an article on Complex Event Processing (using Oracle CEP) that is published in the March 2010 issue of the Dutch Java Magazine. This article describes the interaction between CEP and Java Applications, using examples of temperature sensors that are monitored (aggregating their readings and looking out for any broken [...]

We’ll Be at Chirp

Not long ago, Twitter announced its inaugural developer conference, whimsically called Chirp, would be held April 14 and 15, 2010 in San Francisco.

It may or may not be coincidental that the dates are one week earlier than Facebook’s annual f8 developer conference.

Anyway, Chirp looks to be an outstanding opportunity to learn more about Twitter, the Twitter API and the developers using it.

The agenda is equally interesting. April 14 is an expected day of conference sessions about the API, its features, OAuth, strategies, roadmap, all the usual content.

April 15 is a 24-hack day, starting at 6 PM and ending until the following day at 6 PM. It’s not that unusual for developer-focused conferences to provide a space for around-the-clock hacking, after all, coding in groups can often produces the best code.

This is the first time I’ve seen an entire day of a conference devoted solely to hacking, but then again, I’m not a developer.

I do play one on TV though.

I hear you asking why we’re going to a Twitter developer conference at all, which is a fair question.

Reason 1: The Twitter API is the gold standard among application APIs. We could debate that, but it’s true. Twitter’s API handles a significant amount of their overall traffic, which was recently reported to be 50 million tweets each day.

From what I’ve read, it’s difficult to measure client traffic, but I’ve seen estimates that put API usage at about half, meaning half of Twitter’s users are tweeting via a client.

Since most so-called power users use clients (vs. twitter.com), it’s conceivable that the API could handle more traffic than twitter.com does.

Plus, the Twitter API has created an ecosystem of apps around Twitter, which in turn has launched other ecosystems, like oneforty.

So what?

Well, WebCenter 11g Patchset 1 has REST APIs for several of its services. We’re using some of them internally, and anything we can learn from Twitter about API scalability, design and implementation will only help us.

Reason 2: As the social web advances, companies are flocking to Twitter and Facebook (and LinkedIn to a lesser extent) to interact and build their brands, or if they’re not already thinking about this, the analysts they trust are.

This means demand for integration with these sites will make them list items on RFPs that sales will have to answer. Because I expect this will happen in the very near future, Chirp offers a timely way to get a bootcamp on the Twitter API.

Plus, it won’t be enough to build a client. Any integration, especially from within a corporate firewall, will need to use OAuth to be taken seriously, and OAuth just so happens to be a topic for Chirp, natch.

Reason 3: People. A 24-hack day with Rich and Anthony should be a fun (and intense) experience, as we go from concept to reality at warp speed, fueled by chocolate, Mountain Dew and coffee. I always enjoy working with my team on real projects.

Plus, there will be a ton of great networking with other developers and with Twitter employees.

So, as we head into March, we’ve got about six weeks to kick around ideas for a hack day project. Rich has one already, and I have some nebulous thoughts that might make an idea.

This is where you can help. Drop your ideas for what we could build in the comments.

Or just comment. Ideas are not required.

And hey, if you want to attend and hack with us, sign up now, the more the merrier.Possibly Related Posts:

Larry’s suddenly Sunny disposition

Speaking at an event over the weekend celebrating his triumphant return with The America’s Cup in hand, Oracle chairman Larry Ellison said he expects his other prize - Sun Microsystems - to be profitable “right away”.

This is not exactly breaking news. Just last month at the combined company’s debut, Chairman Larry said he expected to revive Sun’s sagging fortunes, pulling the company back into the black even by the end of this month. At that event he said he expected to make about $1.5 billion in operating profit from Sun’s portfolio after owning the company for a full year and that he  expected to take that number much higher over the next few years.

This sort of unbridled optimism gives one pause however. From early September, when the European Commission (EC) began its investigation of Oracle’s acquisition of Sun, until late December we heard a steady rant from Mr. Ellison about how that investigation was slowly strangling Sun’s chances for survival.

For instance, in late September speaking at a dinner sponsored by The Churchill Club, the chairman said the investigation was significantly contributing to Sun losing some $100 million a month. This statement came in the heels of Sun having reported a quarterly loss of $147 million.

In that talk the good chairman said the longer the EC’s approval process takes “the more money Sun is going to lose, and that’s not good for anybody. We want to get this (acquisition) done to save as many jobs as we can.”

Also contributing to Sun’s cloudy outlook around that time were multiple analyst reports surfacing indicating Sun was losing huge chunks of market share to archrivals IBM and HP in server hardware. A major contributor, of course, was the lingering uncertainty of Sun’s fate thanks to the EC’s investigation, which prompted Sun users to halt purchasing decisions or jump ship.

But with yesterday’s comments, all the angst Larry had over the EC’s four-month long investigation sun setting Sun’s future seems to have dissipated rather quickly. Now he is talking boldly about hiring a couple of thousand new employees to bolster Sun’s products instead of laying them off (although he did indicate there could be up to 1,000 employees let go), and exhibiting confidence about how the Oracle-Sun developed  Exadata 2 super server, and the various stack computing strategies built around it, will soon outgun any offerings from IBM and HP.

So was Larry crying wolf to the EC about its investigation crippling Sun, or is his bold optimism about Sun’s chance simply masking the tough task he has ahead of him to make this deal succeed over the short term? It is hard to say, it may be a little of both. But given his claim he will make Sun profitable by the end of the month, it won’t take long to find out.

If you are concerned about Larry giving up his day job to spend more time plotting his defense of The America’s Cup, don’t be.  The 65-year-old chairman says is not ready for retirement indicating he will continue to pursue software and sailing with an equal amount of vigor.

“I love Oracle and I love sailing, and I think I can do both,” he said.

Apply Caution to Interwebs, Rinse, Repeat

Photo by chokola from Flickr used under Creative Commons

Last week’s kerfuffle about foursquare and how it exposes you to would-be burglars was hilarious to me.

More accurately, it’s Twitter that poses the risk, which isn’t a new problem. Foursquare encourages people to socialize their game-playing by adding friends from Facebook, Twitter and GMail. As with any service, this is to their advantage.

Although, I would argue foursquare is not a classic social network and should not be played with the same cast of interwebs characters with whom you tweet, the majority of people join foursquare and immediately invite their entire list of followers.

So many people merrily broadcast their movements about town to a network of people they “know” from Twitter. Not something I’d recommend, but hey, what do I know.

This obviously isn’t a fourquare problem.

The tongue-in-cheek burglary site points out a different problem, i.e. that if you’ve authenticated Twitter, you can broadcast your checkins there as well, which in turn announces your location not only to your followers, but to everyone on the intertubes thanks to Twitter search, Google and Bing.

By announcing to everyone that you’re not home, you’re making yourself easier to rob.

ZOMG.

Thankfully there have been many level-headed responses (my favorite) to this attempt to “raise awareness”. First off, I’d expect that a burglar savvy enough to find this information would steal identities, rather than take a meat life risk.

Second, in order to rob someone who’s not home, you have to know where they live, which is not something as easily garnered from Twitter.

Yeah, it’s risky to tell Twitter you’re not at home, but let’s be honest, on the internet thar be dragons, quickly becoming my favorite quote, so it’s all risky.

What turns out to be the biggest risk about foursquare is that many people checkin to their homes and their friends’ homes. Since foursquare has an API, you have no way of knowing who’s using your checkin data for what.

In actuality, none of these are foursquare problems, they’re simply misunderstandings on the user’s behalf. Although, as we’ve seen with the recent “facebook login” hat dance, it doesn’t always matter where blame falls.

Sound off with your thoughts in comments.Possibly Related Posts:

Raimonds Updates ActiveRecord Oracle Adapter

Ruby enthusiast and friend of the ‘Lab Raimonds Simanovskis (@rsim) just released a maintenance update to his ActiveRecord oracle-enhanced-adapter, bringing it to version 1.2.4.

This will be the final version of the adapter for Rails 2, after which he’ll move it to Rails 3.

Last month, he updated ruby-plsql.

As you know, we’re big fans of Ruby in all its incarnations, and if you’re an Oracle developer, you know PL/SQL. So, the great thing about Raimonds’ work with Oracle and Ruby is that allows you to build dynamic web apps against data in Oracle databases leveraging skills you already have.

Of course, now the Oracle database stable also includes MySQL, which is the database for Rails apps.

So now you can use Raimonds’ adapters to build dynamic and modern web apps against Oracle databases using your existing skills and expand those skills by tinkering with MySQL and the tens of thousands of Rails gems out there built for it.

It’s a good time to be an Oracle developer.

Are you planning to learn MySQL and/or Rails now that the Sun acquisition has closed?

Find the comments.Possibly Related Posts: