Monday, November 13, 2006

IBM QEDWiki

I was reading Rod Boothby's blog and he mentioned this new technology from IBM. From the developerWorks Emerging Technology blog:

QEDWiki is a platform for collaboration

  • Lightweight standards based collaboration environment
  • Unstructured to Structured Data Definition
  • Enables personal publishing

QEDWiki is a runtime for aggregated services:

  • Dynamic platform for integrating “live” data
  • Personalization in consumption of external services
  • Application Concept (navigation, menus, install, config)

QEDWiki is an IDE for users to build ad-hoc applications:

  • Consumes SOA services via Wiki markup
  • Flexible visual drag-drop and markup based application development features
  • Enable mark-up based client development
Here's a demo of QEDWiki in action.


And a follow up article from Zend's Developer Zone.

This, combined with the IBM Application Designer for Medium Business, shows a concerted move by IBM that mirrors Microsoft's recent announcements (via Gregg Eldred). There appears to be a desire to push application development down to the masses and I'm not sure where that's coming from.

The concepts are great, I just find the hype overwhelming. You can't force such a fundamental change through, it takes time. It seems like the analysts who sit on the sidelines want this to be the new new thing so they can be proven true in their predictions, but those of us in the trenches really want to take it slowly to avoid disasters.

I spent most of the 1990's cleaning up non-programmers' attempts at application development in Visual Basic and Access. Time will tell whether this is a good thing or not.

Friday, November 10, 2006

IBM alphaWorks: Application Designer for Medium Business

I found this on alphaWorks a few days ago and downloaded it, and only got around to installing it today. From the alphaWorks website:

What is Application Designer for Medium Business? Application Designer for Medium Business bundles together two technologies: a pre-release of Lotus® Component Designer 6.0 and WebSphere® Application Server, Community Edition (WAS CE) 1.1. Lotus Component Designer is an Eclipse-based Integrated Development Environment (IDE) that helps non-Java developers to create database-driven Web applications for an IBM WebSphere Portal 6 environment. The use of Application Designer for Medium Business enables Lotus Component Designer to be deployed to WAS CE. In addition, Lotus Component Designer provides four sample applications to help users get started quickly and understand what a typical application looks like.

That sounds like it's right up my alley, considering I have no clue how to do anything with Java. However, what is delivered doesn't quite live up to the promise. Installation is extremely simple, just double-click and follow the prompts. When you're done a webpage is loaded that outlines the next steps and helpfully suggests creating a simple application and deploying it. I'd love to, but I can't figure out how.

After loading the WAS CE server, which took a while, I double-clicked the Lotus Component Designer icon. After that finally loaded the initial window is pretty, but I'm not sure what to do with it:
I moused over the various graphics and clicked the Tutorials button, which is the one with the green check mark.

I clicked the first one: Create an IBM Lotus Component Designer component. The tutorial opened in a separate window with a rather strange layout:


There are no navigation hints at this point, you have to expand the section under the "Getting started" bit to get to the real meat of the tutorial.

You'll notice there are now Previous and Next links on the pages. Okay, now that that bit of insanity is behind us, let's get down to it. Lesson 1 says:

To create a component, perform these tasks:

  1. Open Lotus Component Designer.
  2. Click File > New > Component.
  3. In the IBM Lotus Component Designer - New Component dialog box, type Designer Tutorial in the Name field.
  4. In the Description field, type This component is for the Lotus Component Designer tutorial.
  5. Keep Start with blank component selected.
  6. Click OK.
The Designer Tutorial component is listed in the Designer Navigator.

I follow the instructions, my hard drive runs like crazy for about 3 minutes, and then I'm back at the Tutorial list. I can't find the Designer Navigator anywhere. It's not listed in any of the menus and no new tab was loaded, so I have no clue where the component went. After several minutes digging around I got frustrated and gave up trying to find the Designer Navigator.

Instead I decided I'd load one of the sample applications, which the website promised would "help users get started quickly and understand what a typical application looks like." I clicked the Samples button on the Welcome page (it's the collection of shapes) and a list of several samples is provided. No matter which one I select all I get is a help page telling me about the sample. I can't figure out how to actually load the sample and the help doesn't tell you. Going to the menu and selecting File > Open doesn't do anything, so I'm at a complete and utter loss.

And with that, my review is done. I can't actually do anything with Lotus Component Designer and the information in the tutorials is inaccurate or lacking in enough detail to be useful to complete beginners. I think if I knew how to use Eclipse I wouldn't be so frustrated or feel so helpless, but this is supposedly geared toward people with no experience using the tools. As such I find it an utter failure. I have Eclipse for Dummies at home and I'll read it this weekend, then report back.

Thursday, November 09, 2006

SNTT - Calling an agent using RunOnServer when saving a new document

Enough of the politics, let's have even more RunOnServer fun! Let's say that when a user saves and closes a document you want to update the newly saved document with information from an agent. RunOnServer takes a NoteID so it looks like a no brainer. In reality it proved to be more a little more difficult.

The first hurdle: I started out using the QuerySave event and the NoteID was always 0. I dug into the Notes.Net developerWorks Notes forum and learned that the NoteID doesn't exist until the document is saved to the hard drive. Okay, I'll use the PostSave event. Since it's called "PostSave" I expected the document to be saved to disk. Well, either it isn't or the PostSave event occurs before the NoteID is populated. The solution: force the document to save from PostSave. I'm not sure why this forced save is necessary, but it works. Calling doc.Save from QuerySave gave a save conflict warning, but calling it from PostSave doesn't.
Sub Postsave(Source As Notesuidocument)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim agent As NotesAgent
Dim doc As NotesDocument

Call Source.Document.Save(True, False)
Set doc = Source.Document
Set db = session.CurrentDatabase
Set agent = db.GetAgent("Process Service Fees")

If agent.RunOnServer(doc.NoteID) <> 0 Then
Msgbox "There was an error and the service fee notice was not sent.", 48, "Service Fees"
End If
End Sub
This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.

,

Wednesday, November 08, 2006

It's official: I'm a second class citizen

It all started on May 1, 1991 with the case of Baehr v. Lewin. The state of Hawaii was sued by same-sex couples to be allowed to get married. Fast forward to 1996, and the so-called Defense of Marriage Act was signed into law. I'm not sure what it defended, but it did allow states to not recognize marriages that were legal in other states, for the first time in our country's history.

Yesterday South Carolina Amendment 1 passed by a landslide. A previous law introduced in 1996 already established the definition of marriage as being between one man and one woman. This goes a step further by preventing civil unions of any type. It is an obvious attempt to forestall legislation that would allow same sex civil unions.

I'm reminded of Martin Niemoeller's poem First they Came...
They came first for the Communists,
and I didn't speak up because I wasn't a Communist.
Then they came for the Jews,
and I didn't speak up because I wasn't a Jew.
Then they came for the trade unionists,
and I didn't speak up because I wasn't a trade unionist.
Then they came for the Catholics,
and I didn't speak up because I was a Protestant.
Then they came for me,
and by that time no one was left to speak up.

* This version is from the New England Holocaust Museum.
I wonder what they'll brand me with when they put me in a camp?

Tuesday, November 07, 2006

SNTT - Updating a UI document from an agent called with RunOnServer

Here's a technique to run an agent on the server, close the UI document, and have it reopen showing the updates done in the agent. In this case my agent is issuing LC LSX calls to update data from DB2. The following code is in a Hotspot button on the document. The tricky part here is knowing to use Delete on the NotesDocument. You have to delete the document from the object cache after the agent runs to force it refresh when you reopen it.
Sub Click(Source As Button)
Dim uiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim db As NotesDatabase
Dim agent As NotesAgent
Dim doc As NotesDocument
Dim noteid As String

Set uidoc = uiws.CurrentDocument
Call uidoc.Save

Set db = uiws.CurrentDatabase.Database
Set agent = db.GetAgent("Get Account Info")
Set doc = uidoc.Document
noteid = doc.NoteID

If agent.RunOnServer(doc.NoteID) <> 0 Then
Msgbox "There was an error looking up the account information.", 48 _
, "New Account Setup"
End If

Call uidoc.Close(True)
Delete doc
Set doc = db.GetDocumentByID(noteid)
Set uidoc = uiws.EditDocument(True, doc)
End Sub

This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.


,

Monday, November 06, 2006

HBO: Hacking Democracy

The e-voting systems in use throughout the US are proprietary and are not reviewed by independent security analysts. We have to take the vendors' word that the information is secure. As dramatically illustrated in HBO's expose, that is emphatically not the case.

The most widely used e-voting systems are provided by Diebold. First the team went into the Diebold General Elections Management System (GEMS) and altered results. Diebold said this was not possible without creating an audit trail, but nothing the team did produced an access log. They were able to alter results in a number of ways. Speaking of access, votes are stored in a Microsoft Access database. I am very familiar with Access' security, but I also know from personal experience that it can be circumvented and as shown in this documentary, it doesn't take a knowledgeable person very long to do it.

As a final test, the team successfully altered the results of a mock election by directly altering the memory card used in the voting machine. According to Diebold it is not possible. The security analyst only touched the memory card for the voting machine prior to it being inserted in the machine. He never touched the machine itself, nor did he have access to the card after it was put into the machine. When the voting machine came up it printed a 0 total report, showing that there were no votes already in the unit. 8 total votes were cast, 6 were "No", 2 were "Yes", then a final tally was printed. It showed 7 "Yes" and 1 "No".

To verify these were actually recorded results and not just the result of altering the report, they loaded the results into GEMS. It showed the altered results. According to Diebold this is absolutely not possible. In reality, it absolutely is. This is the most likely way that John Kerry ended up with negative votes in some Florida counties in 2004.

Friday, November 03, 2006

SNTT - Saving a text file to an iSeries and processing it with LotusScript

Working with the iSeries platform has its own challenges. One of them is if you create a mail-in database that accepts attachments and you need to process them. Saving the attachment to the file system then processing it shouldn't be that big a deal, but on an iSeries it is. By default the file is saved as EBCDIC, while LotusScript expects it to be ASCII. Doing the conversion isn't really difficult, but it does take some fiddling around to figure out all the bits to flip. Here's how:
Shell("COPY OBJ('" & EBCDICFileName & "') TOOBJ('" & ASCIIFileName & "') _
TOCCSID(*PCASCII) DTAFMT(*BINARY) REPLACE(*YES)"
)

This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.

,

Wednesday, November 01, 2006

SNTT - Replacing tokens in Rich Text and preserving styles

A fairly common thing in Notes is to create a form with a Rich Text field so users can produce standard letters. To achieve this people often use tokens that later will be replaced in an agent, such as [DATE] or [ACCOUNT NAME]. Typically this is fairly easy, but there some instances where it gets tricky. What if you want the text that replaces a token to be in the same style as the token, such as a specific font, font size or color? And what about replacement text that spans multiple lines? Here is a function that will take care of it for you.
Sub ReplaceToken(Byval Token As String, Byval Replacement As String, _
RTBody As NotesRichTextItem, NewLineChar As String)
Dim rtNav As NotesRichTextNavigator
Dim rtNavEnd As NotesRichTextNavigator
Dim rtRange As NotesRichTextRange

Dim linelength As Integer
Dim oneline As String

Set rtNav = RTBody.CreateNavigator
Set rtRange = RTBody.CreateRange

If rtNav.FindFirstString(Token) Then
'Mark the original token so you can delete it later
Call rtRange.SetBegin(rtNav)
Set rtNavEnd = rtNav.Clone
Call rtNavEnd.SetCharOffset(Len(Token))
Call rtRange.SetEnd(rtNavEnd)

'Preserve the existing style. This gets a little convoluted.
' 1) The style is associated with a NotesRichTextRange.
' 2) You have to BeginInsert before you can AppendStyle.
Call RTBody.BeginInsert(rtNav)
Call RTBody.AppendStyle(rtRange.Style)

'Break up multiple lines (assumes a single character delimiter)
linelength = Instr(1, Replacement, NewLineChar)
Do Until linelength = 0
oneline = Left$(Replacement, linelength - 1)
Call RTBody.AppendText(oneline)
Call RTBody.AddNewline(1)
Replacement = Mid$(Replacement, linelength + 1)
linelength = Instr(1, Replacement, NewLineChar)
Loop

'Add the final line of replacement text, or the only line if there are
' not multiple lines of replacement text
Call RTBody.AppendText(Replacement)
Call RTBody.EndInsert

'Delete the original token.
Call rtRange.Remove
End If

Set rtRange = Nothing
Set rtNav = Nothing
Set rtNavEnd = Nothing
End Sub
This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.


See, I do write code sometimes! :-)

,

Tuesday, October 31, 2006

CNN report - Mainframes making a comeback

It's true: everything old in IT becomes new again. I caught this Associated Press article on CNN.com and couldn't help but chuckle:
Cheap little servers handle so much of the Internet's dirty
work that giant computers known as mainframes, which debuted
50 years ago and often cost more than $1 million, are supposed
to be passe.
...
[if] you were to break modern computing history into its
simplest terms, it would go something like this: There was the
centralized-mainframe era, and then there was the
distributed-computing era. And the former ended a while ago.
...
"For every application, many times it takes five servers in
a distributed environment," said Jim Stallings, who runs IBM's
mainframe division. "Many customers are saying, 'I can't deal
with the complexity."'

It's interesting that this also applies to Domino. One of my key complaints about a open source or MS collaboration solution is the number of products one has to implement and manage. Domino is the mainframe of collaboration software, in more ways than one.

The cool thing is a Brazilian game company called Hoplon is releasing a new game that's hosted on an IBM mainframe. Showing the true flexibility of a mainframe, they aren't even using their own:
But rather than shelling out precious startup capital to own
a mainframe, Hoplon is remotely accessing one stashed in an
IBM data center in Brazil. The same machine manages a retirement
fund for IBM's Brazilian employees and handles operations for
a building-tools manufacturer.

Now that is something nifty. Oh, and the game looks pretty awesome, too.

Monday, October 30, 2006

Omitting holidays from @BusinessDays

Domino Administrator allows you to create holidays that users can download to their own calendars. The next logical step is to include this in calculations where you need business days, but you don't want to include holidays. Here's how to do it in Formula:
dateHolidays := @DbColumn("":"Cache";"mail":"names.nsf";"Holidays";2);
intBusDays := @BusinessDays(StartDate;EndDate;1 : 7; dateHolidays)
This omits Saturdays, Sundays, and the list of dates in the Holidays view. You may consider adding some logic to filter out only holidays for the current year, depending on your requirements. Also be aware that the view only lists the first date entered in the repeating date field. If you have the holiday set to repeat you will have to account for this.

This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.

Back from vacation!

I'm back from a wonderful time spent travelling Eastern and Middle Tennessee. The hot air balloon ride was a bust, it was too windy. And the trout fishing was a wash, too, because they were generating electricity at the nearby dam. The guide we were going with said the water volume went from 160 feet per minute to 4800, which washed the fish downstream and it was too dangerous, besides.

We had a great time in Chattanooga, which was much more cosmopolitan than I expected. I was last there in 1993 when they opened the Tennessee Aquarium River Journey, and since then they have opened the Ocean Journey and a new visitor's center. The most delightfully unexpected feature was the butterfly aviary, which I can't say enough good things about.

The downtown area of Chattanooga is impeccably clean and we stayed at the Sheraton Read House, which was a convenient walk to nearly everything. I highly recommend the Read House, but if you're staying there it pays to shop around. We booked it for $59 per night on Priceline. Chattanooga has a free shuttle in the downtown area and it was a godsend at the end of a tiring day of walking. The Hunter Museum has some extremely interesting glass pieces and a nice collection of pop art. Recommended places to eat include 212 Market, The Back Inn Cafe, and Southside Grill.

The Jack Daniels Barbecue was like a trip to a foreign country. I'm from Eastern Tennessee, but this was an experience unlike any I've ever had. Picture 40,000 people all in the same place to worship barbecue. Now imagine your stereotpyical idea of someone who would make such a pilgrimage would look like. It made for some interesting people watching. Stay tuned for pictures of this, the aquarium, and the rest of our trip.

Also be on the lookout for some new posts about Notes. I finished my Notes Multiuser Migrator, and I'm working on some techniques for replacing tokens in richtext while maintaining the style associated with the token. And there's still that DXL UI Updater and SQL Query Runner, both of which I'm working on that as time permits.

Saturday, October 21, 2006

On vacation again

Next week I'll be doing a trip through Tennessee and I'm not taking a laptop so I won't be blogging. This trip came about because October 27th is my partner, Myron's, birthday. Every year since he was 35 (he's turning 53) he has travelled somewhere for his birthday. This year I suggested we attend an event in central Tennessee, and the next thing I know he has a whole week of activities planned! I still don't think he'll upstage the Tortola trip from my birthday, though. :)

On Sunday we are driving to Sevierville, which is near the world-infamous Dollywood, then Monday morning are going on a sunrise hot air balloon ride. Monday will be a leisurely day driving to Chattanooga, where we will spend three days visiting the city and the surrounding area. They have a wonderful aquarium, and the city is located in the foothills of the Great Smoky Mountains. Thursday is a trip to some tiny unknown (to me) town for a day of fly fishing. Neither Myron nor I have done that before, so it should be fun. I dunno what we're doing Friday, it's Myron's birthday and I think he has some all day history thing planned. Saturday is what I'm looking for: Lynchburg.

Anyone who is a foodie knows why I'm going there. Anyone who is a fan of bourbon knows another reason I'm going there. Saturday, October 28th is the 18th Annual Jack Daniel's World Championship Invitational Barbecue. It's two of my favorite things in the whole world combined into one. I'm from Bluff City, in extreme northeastern Tennessee and I grew up with barbeque. My love of bourbon was cultivated in more recent years, but I'm a diehard fan now.

So that's where I'll be next week. Enjoy the silence. :-)

Thursday, October 19, 2006

Going to Lotusphere 2007

It's official, I'll be going to Lotusphere 2007. My boss is considering going, too, and I'm not sure what kind of dynamic that might create. I think he will most likely be in the PHB sessions while I'm mingling with the technonerd crowd, but I'm sure we will have some good opportunities to share information and maybe even sit in on a few sessions together.

So I'll see you there!

Wednesday, October 18, 2006

How to implement a social networking solution in Domino?

One thing that has always baffled me is the application of consumer-oriented technologies to business. Instant Messaging was one I adopted early because I support 300 people spread across 15 sites in two timezones, but the concept of blogs and wikis just left me scratching my head. Adeleida Bingham posted a comment on Rocky Oliver's blog including a link to an irreverent look at Web 2.0. It was an extremely helpful and really helped me understand more about why I should care about this new-fangled stuff. In the slides there was a reference to another blog posting called The Porous Membrane: Why Corporate Blogging Works. That included a link to Wiki This - A Model for Customer Support Using Blogs and Wikis.

None of this is likely news to anyone reading this, but it helped me wrap my head around it all. Now I get it. I grok in fullness. Now... how do I actually do it? Building the databases isn't the problem, there are OpenNTF templates to help me along (thank guys *waves*). But how to you go about making it something coherent and comprehensive? I'm looking at Peanuts Portal, and I have some ideas, but I was hoping someone could share some insight on how to make all this stuff fit together in a Domino world. Are there any examples of sites that have already done it?

Sunday, October 15, 2006

Crazy cool technology - CouchDB

Most people reading my blog are probably familiar with Damien Katz, likely read his blog, and already know about CouchDB. For the other 2 of you, go check it out. From the overview:

What CouchDb is
  • A stand-alone document store, accessible via XML REST.
  • Ad-hoc and schema-free with a flat address space.
  • Distributed, featuring robust, incremental replication with bi-directional conflict detection and resolution.
  • Query-able and index-able, featuring a table oriented reporting engine with a simplified formula query language.
The CouchDb data model was partially inspired by the Lotus Notes and Domino backend.
What it is not
  • A relational database.
  • A replacement for relational databases.
  • An object-oriented database. Or more specifically, meant to function as a seamless persistence layer for an OO programming language.
I downloaded Alpha 4 and installed it, now I'm trying to figure out what to do with it. For now I think it will likely end up on my "neat stuff to try" list since I'm working on increasing my marketability. As nifty as this is, I don't think it's going to help me get a job anytime soon. Who knows, maybe CouchDB and Fabric will be the new new thing.

Thursday, October 12, 2006

Is there an @ function to tell if a document is "dirty"?

I could swear I was reading someone's list of their favorite new features in Notes 7 and it included something about a new and undocumented @ function that would let you know if anything on a document had been changed. I didn't bookmark it, of course, and I've been searching for two days and can't find that reference. Does anyone out there have any ideas about this? Was I delusional?

Wednesday, October 11, 2006

an upward and outward spiral

I had a discussion with my boss a while back and shared my candid views on my lack of upward mobility and feeling like I was being treated like a commodity. At the time my frustration level was high, my patience was low, and it didn't take much to set me off.

One thing my boss said stuck with me. He said he "viewed life as an upward and outward spiral." He went on to describe this as the movement foward, the betterment of his and his family's lives, and the positive social impact he felt he was having. Initially I credited his charmed trust-fund existence with his being able to make such a blithe statement.

I don't know exactly when or why, but I finally got it. I'm not Pollyanna by a long shot, but I do realize now that I have choices. I can choose to better myself or I can choose to languish. I can choose to be positive or I can choose to be negative. I can choose whether my life is a downward descent into despair, or an upward and outward spiral toward happiness.

Tuesday, October 10, 2006

In response to Rod Boothby's simplistic assertions

Rod Boothby recently posted a blog entry about how simple it is to migrate a Notes application to a "Web 2.0" paradigm. He was thoroughly trounced, so he tried again. And had various body parts handed back.

First he suggested screen scraping Domino data out of HTML. Crude, but effective... but then what? Ripping data out of Domino is easy. The hard part is getting the business logic, the workflow, and the other eleventy billion bits to translate to another platform. Furthermore, Rod is proposing doing everything on the WEB! Rod, I suggest you talk to real users, not management types. I know people who have quit jobs because tools they used were moved to web-based apps. Users hate them, with a passion.

In my experience Rod's so-called "innovation creators" and "knowledge workers" accept that what they use at home or for personal use is not appropriate for them getting their work done. Rod goes on to suggest that end users should be responsible for making changes to applications on the fly. If users are tweaking apps who is doing their real job? I agree that users need to be involved in the design process, but the answer isn't to give them a completely open tool with little structure and tell them to design what they need. It is possible, even with Notes, to deliver a structured system based on user input and feedback, that is extensible and flexible.

Just who is Rod Boothby, you might ask? He's a management consultant for Ernst & Young. His only exposure to Notes has been as an end user. Somehow in his mind that makes him an expert on the Domino platform and what it takes to implement new solutions as well as migrate away from it. I must not be as smart as him because I've not been able to do it. Read my blog, you'll see that I've tried and failed. I guess all the people Microsoft put on their Red Bull initiative must be likewise untalented. It sounds like Mr. Boothby has struck a goldmine since he's the only one capable of doing this.

Actually I think he's a crackpot. If his proposition weren't so absurd he might even be dangerous. As it stands, I think the following from Despair.com is fitting:

Friday, October 06, 2006

Notes single to multi-user migrator

I created a utility that will take the traditional single-user configuration for Windows Terminal Services and migrate users to a multi-user install. It has to be run for every user, but it reduces the installation down to just entering the user's password, clicking Finish on the "Advanced Services" box, then clicking OK on the "Setup Complete" box. Is anyone interested in it? It' s driven by an INI:

UserOldNotesPath=m:\notes\data\
UserNewNotesPath=%UserProfile%\Local Settings\Application Data\Lotus\Notes\Data\
SharedNotesPath=C:\Documents and Settings\All Users\Application Data\Lotus\Notes\Data\
FilesToCopy=bookmark.nsf;desktop6.ndk;*.id;names.nsf;user.dic

If there is interest I'll figure out a way to post my utility, and include source and a writeup on how it works. I wrote it in VB5. Yeah, I know it's old, but it's what I had handy. :-P

Tuesday, October 03, 2006

Dialog to select a template?

I posted on Notes.net but I thought I would repeat it here... does anyone know how to get @Prompt([ChooseDatabase]) to show templates? According to the help there is a values property that can be set to "2", but that doesn't seem to have any effect. It appears to be possible because when you do a File > Database > Open in Domino Designer it shows both NSF's and NTF's, but I have no idea what mechanism they're using to display that dialog. I'm not afraid of going to the C API if I have to, I really really need this functionality.