> On Jan 7, 2016, at 12:02 PM, Sam Ruby <[email protected]> wrote:
>
> On Thu, Jan 7, 2016 at 1:45 PM, Craig L Russell
> <[email protected]> wrote:
>> Hi Sam,
>>
>>> On Jan 7, 2016, at 7:00 AM, Sam Ruby <[email protected]> wrote:
>>>
>>> I'm going to ponder this input for a while. You don't like context menus,
>>> would like to have a confirmation dialog telling you what is going to
>>> happen before you commit, and would like to have progress updates as the
>>> changes occur (and if that is not workable, at a minimum tell you what
>>> happened at the end).
>>
>> The new tool currently doesn't have a commit button. Perhaps I misunderstood
>> your intent with the confirmation dialog, which currently says "stub for
>> ICLA, filename: robert-pozarickij-xxx" and then has a single "OK" button.
>
> You didn't misunderstand. My previous intent was that file would do a
> commit. I now have more feedback from you that that is not what you
> want.
>
>> If the intent is to use a real dialog box to detail what happened (svn
>> status of the documents directory, svn diff of the officers directory),
>> propose a commit message, include the cc: list for the email, and then
>> prompt for (Commit) or (Cancel):
>>
>> Yay.
>
> Essentially, yes. My current thinking is to take back over the right
> pane once you push file, and have all of the elements you describe
> above. Once you push commit, the status of items will update as they
> complete, much like the current workbench does.
Ok. The right pane isn't really useful to display the document once the
document is in the "pending commit" state.
>
>>> All possible.
>>>
>>> The primary way in which this tool is different than the current secretary
>>> workbench is that the workbench is completely svn working directory
>>> centric. Everything happens in the working copy. You fetch it from the
>>> server. It contains everything, including spam. Every operation(burst,
>>> rotate, staple) happens there. Sometimes it gets out of sync, but it
>>> mostly works. When you think you are ready, you do a commit.
>>>
>>> In the current tool, nothing happens in svn until the very end. For
>>> example, spam never gets added to the repository, so there is no need to
>>> mark it as a dup, spam, incomplete or whatever, and then perform a commit
>>> completely with a confirmation dialog and progress updates.
>>
>>> Simply delete it and move on.
>>
>> If it is spam, I agree. I just need a delete button. Maybe a spam column in
>> the main window. I would use the spam button for messages such as "EVENTS
>> MANAGEMENT PROTOCOL & ETIQUETTE SEMINAR FOR UN AGENCIES, GOVERNMENT &
>> INTERNATIONAL ORGANISATIONS".
>
> At the moment, there is no button, but "command-delete" works from
> both the main window and when viewing an individual message. In both
> cases, it deleted the entire message (subject to undo). My feeling is
> that that is cleaner than cluttering the window with a spam button per
> line or requiring you to select a row and then move your cursor to
> where the button may be.
As long as it's obvious and the mail can be deleted from the main window or
from the message window.
>
>>> At most, send an email.
>>
>> From the main window, this wouldn't work. There is context for emails. If a
>> signature is missing, I want the email to be copied to pmc and ppmc.
>>
>>> If you change your mind, undelete it and process it.
>>
>> If it's deleted, where would I see it?
>>>
>>> Same thing with respect to rotating, bursting, and stapling. Nothing goes
>>> into SVN until you say so. In fact, since you are adding new documents,
>>> I'm hoping to use svn import instead of svn update; svn add; svn commit:
>>
>> Good. From the message window, when I click a file, the menu should include
>> all of the icla, ccla, grant, mem items but also burst, rotate, etc. These
>> are currently under "other" but it's easier if it's just radio buttons on a
>> second line. No confusion.
>
> Probably will be real buttons (radio buttons select which form is
> shown below), but at some point, I'll leave the tweaks up to you. If
> you want to begin to play, try this locally:
>
> --- a/www/secmail/views/parts.js.rb
> +++ b/www/secmail/views/parts.js.rb
> @@ -66,6 +66,8 @@ class Parts < React
>
> _CheckSignature selected: @selected, attachments: @attachments
>
> + _button 'burst', onClick: self.burst
> +
> # filing options
> _table.doctype do
> _tr do
> @@ -187,7 +189,7 @@ class Parts < React
> # burst a PDF into individual pages
> def burst(event)
> data = {
> - selected: @menu,
> + selected: @menu || @selected,
> message: window.parent.location.pathname
> }
>
>
>> Once a file has been modified, I can return to the main window (see else
>> discussion) which should bring up a dialog "Are you sure you want to revert
>> all changes?" and then all the local (on the file screen) changes would be
>> reverted.
>
> No need to revert the changes upon return to the main window. Things
> that are committed are already committed. Other changes (like burst,
> rotate, etc) will still be there when you come back. These changes
> are stored in the yml files in the officers-secretary directory on the
> machine where the secmail application is run.
What I'm concerned about is making a dog's breakfast of an email and not being
able to revert the changes.
If I spot a typo before commit, I'd like to revert everything done to the
message and its files.
>
>> We do need to think more about the burst work flow. Once burst, documents
>> need to be combined (drag/drop) into new documents, and the new documents
>> need to be filed. There are often multiple documents that have the same pmc
>> and ppmc so these fields should remain populated for multiple documents.
>
> Those fields should remain populated as long as you are processing the
> same document type and haven't left the window. Should you need more
> persistence, we can explore that later.
I've had cases of multiple iclas plus a grant or ccla in the same email
message. IIRC sometimes there is one massive pdf file that needs to be burst
and sometimes individual multi-page icla and grant pdf files.
>
>>> http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.import.html
>>> <http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.import.html>
>>>
>>> Updating iclas.txt will continue to be done as before, but that directory
>>> is orders of magnitude smaller.
>>>
>>> Meanwhile, I'm going to merge this tool into the master branch, and when I
>>> redo the commit process to add a confirmation dialog progress indicator,
>>> I'll be adding the actual commit and email logic, so any documents that are
>>> processed by one tool will need to be deleted from the other until the
>>> cut-over.
>>
>> So where are these documents? I guess when I'm running secmail on my
>> machine, "rake fetch" puts the mails locally. When running secmail on
>> whimsy, where do they go? It doesn't make sense to put it into production
>> until we actually start using secmail on whimsy. Which won't be until we
>> have all (most) of the current secretary assistant functionality implemented.
>
> rake fetch will be run (via a cron job) on whimsy. In order to debug
> secmail, I will likely file a few ICLAs. When I do so, I will remove
> the corresponding document from documents/received.
That's fine. I guess what I'm really asking is how fetch knows which messages
to fetch and which messages have been processed already and how to recover a
message that was accidentally deleted.
>
> If things go as planned, my merging the secmail branch onto master
> should cause the code to be deployed and the gem dependencies
> downloaded. Adding authentication and starting the web application
> should only be one line each to the puppet configuration. What's left
> would be setting up svn checkouts (documents, foundation, etc),
> fetching the mail, and hooking both up to cron jobs.
>
> At that point, should you want to add a button, you should be able to
> test that change locally and push it to GitHub. Once you do, it
> should be deployed for you automatically within 35 minutes.
Sounds scary. ;-)
>
> You should also be able to run this on your own machine. Getting to
> the point where you can send mail from an application (I'm not talking
> about launching an email window, but doing it from the server like the
> current workbench does) requires a bit of setup. If I recall
> correctly, you couldn't get this to work with your oracle email
> address, but were successful using gmail as the mail delivery agent.
Meanwhile, I've succeeded in installing imagemagick convert via port install.
I'm looking for some test messages to test drag/drop. No luck.
>
> But my hope is that the instance running on what is now called
> whimsy-test, but will ultimately replace whimsy, will meet your needs.
I tried to look at 2015-12-06T01:28:49Z and clicking on the file name gives an
error. [1]
We very occasionally get an icla as a single .jpg file. How would I process
this? I don't see how to convert a jpg into a pdf. The right click menu (ok, I
can live with it) gives burst, left, right, and flip. Should we add something
to convert to pdf?
Craig
[1] 2016-01-07 12:27:36 - NoMethodError - undefined method `body' for
nil:NilClass:
/Users/clr/apache/git/whimsy/www/secmail/models/attachment.rb:20:in
`body'
/Users/clr/apache/git/whimsy/www/secmail/server.rb:119:in `block in
<top (required)>'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1609:in
`call'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1609:in
`block in compile!'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:974:in
`[]'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:974:in
`block (3 levels) in route!'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:993:in
`route_eval'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:974:in
`block (2 levels) in route!'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1014:in
`block in process_route'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1012:in
`catch'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1012:in
`process_route'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:972:in
`block in route!'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:971:in
`each'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:971:in
`route!'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1084:in
`block in dispatch!'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in
`block in invoke'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in
`catch'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in
`invoke'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1081:in
`dispatch!'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:906:in
`block in call!'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in
`block in invoke'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in
`catch'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in
`invoke'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:906:in
`call!'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:894:in
`call'
/Library/Ruby/Gems/2.0.0/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in
`call'
/Library/Ruby/Gems/2.0.0/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in
`call'
/Library/Ruby/Gems/2.0.0/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in
`call'
/Library/Ruby/Gems/2.0.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in
`call'
/Library/Ruby/Gems/2.0.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in
`call'
/Library/Ruby/Gems/2.0.0/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in
`call'
/Library/Ruby/Gems/2.0.0/gems/rack-1.6.4/lib/rack/logger.rb:15:in `call'
/Library/Ruby/Gems/2.0.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in
`call'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:218:in
`call'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:211:in
`call'
/Library/Ruby/Gems/2.0.0/gems/rack-1.6.4/lib/rack/head.rb:13:in `call'
/Library/Ruby/Gems/2.0.0/gems/rack-1.6.4/lib/rack/methodoverride.rb:22:in `call'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:181:in
`call'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:2021:in
`call'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1486:in
`block in call'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1795:in
`synchronize'
/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.6/lib/sinatra/base.rb:1486:in
`call'
/Library/Ruby/Gems/2.0.0/gems/puma-2.15.3/lib/puma/configuration.rb:79:in `call'
/Library/Ruby/Gems/2.0.0/gems/puma-2.15.3/lib/puma/server.rb:541:in
`handle_request'
/Library/Ruby/Gems/2.0.0/gems/puma-2.15.3/lib/puma/server.rb:388:in
`process_client'
/Library/Ruby/Gems/2.0.0/gems/puma-2.15.3/lib/puma/server.rb:270:in
`block in run'
/Library/Ruby/Gems/2.0.0/gems/puma-2.15.3/lib/puma/thread_pool.rb:106:in `call'
/Library/Ruby/Gems/2.0.0/gems/puma-2.15.3/lib/puma/thread_pool.rb:106:in `block
in spawn_thread'
>
>> Craig
>>>
>>> - Sam Ruby
>
> - Sam Ruby
>
>>> On Wed, Jan 6, 2016 at 9:14 PM, Craig L Russell <[email protected]
>>> <mailto:[email protected]>> wrote:
>>> Hi Sam,
>>>
>>>> On Jan 6, 2016, at 6:53 AM, Sam Ruby <[email protected]
>>>> <mailto:[email protected]>> wrote:
>>>>
>>>> Cool! This is the type of feedback I've been looking for!
>>>>
>>>> More inline.
>>>>
>>>> On Tue, Jan 5, 2016 at 5:06 PM, Craig L Russell
>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>> 1. When a message is selected, only the from:, to:, and subject: fields
>>>>> are displayed. The text of the message is not visible. This appears to be
>>>>> just in some cases, e.g. 2016-01-05T18:24:03Z and 2016-01-05T17:52:10Z .
>>>>
>>>> That was indeed a bug. Fixed.
>>>>
>>>>> 2. The left frame doesn't size correctly. It initially displays with a
>>>>> scroll bar at the bottom. If the vertical bar separating the data entry
>>>>> from the display is moved, the scroll bar still shows and the last few
>>>>> pixels in the fields are not visible.
>>>>
>>>> Odd. I don't see this with Safari, Firefox, or Chrome, all on a Mac.
>>>> Can you tell me what browser you are using, and perhaps send a screen
>>>> capture?
>>>
>>> MacOSX 10.10 Safari Version 9.0.2 (10601.3.9)
>>> see below. there is a horizontal scroll bar in the icla form.
>>>>
>>>>> 3. When File is pushed, 90 seconds later the alert comes up "stub for
>>>>> ICLA, filename: chaudhary--sunaina". Is it supposed to take over a minute
>>>>> to svn add /Users/clr/apache/documents/iclas/chaudhary--sunaina.pdf?
>>>>
>>>> What's happening here is:
>>>>
>>>> 1) cleanup/revert of any partial commits that may have failed.
>>> ok
>>>
>>>> 2) svn updates to retrieve the latest copy of both foundation/officers
>>>> and documents/iclas
>>>
>>> This is an unwelcome change from the way it works now. If it is a second or
>>> so, ok. But reloading the main page should svn update the repositories.
>>>
>>>> 3) svn add of the relevant document.
>>> ok
>>>
>>>>
>>>> Only #2 above should take a noticeable amount of time, particularly if
>>>> you haven't updated recently. On my machine, I'm seeing a total of 5
>>>> to 6 seconds average for the whole operation. Hopefully we should see
>>>> comparable or better times when this is deployed on whimsy-test.
>>>>
>>>> I may be able to eliminate one svn update. Of course, svn commit and
>>>> email need to be added, which will add to the elapsed time. Overall,
>>>> this should be no worse than the current workbench, and actually
>>>> should be a half-second or so per server interaction better. Note
>>>> that NOT displaying the svn commands as they are being executed
>>>> reduces the number of server interactions.
>>>
>>> But you could still save them and display them after they complete?
>>>>
>>>>> 4. When doing File a second time with the same document name, there is no
>>>>> error that there is already a document by that name. Only when I tried to
>>>>> svn rm the document did it give me the error. There is an error when
>>>>> doing a File with a document that is already in the repository.
>>>>
>>>> The previous (incomplete) commit is cleaned up first.
>>>
>>> It doesn't do a commit, just leaves the document as new in the repository.
>>> I hope the intent is to preserve the current work flow and have an explicit
>>> commit after file.
>>> And doing it a second time without a commit just overwrites the file. This
>>> might not be so bad because the filed document will disappear from the list
>>> of documents that can be processed.
>>> clr% svn rm robert-po-arickij/
>>> svn: E195006: Use --force to override this restriction (local modifications
>>> may be lost)
>>> svn: E195006:
>>> '/Users/clr/apache/documents/iclas/robert-po-arickij/icla.txt' has local
>>> modifications -- commit or revert them first
>>>
>>>>
>>>>> 5. I'd prefer the cursor to change to a "wait for response" instead of
>>>>> the slowly rotating clock.
>>>>
>>>> OK, done.
>>>
>>> When a document is being fetched (press the .pdf file name in the left
>>> area) can the cursor spin? It's not clear what is going on while the
>>> document loads into the right pane.
>>>>
>>>>> 6. It's not clear from the layout of the panel whether the pmc and
>>>>> podling fields are effective with the File button. Perhaps pmc and
>>>>> podling fields should be above the File button?
>>>>
>>>> The file button only updates iclas.txt and placed the pdf into
>>>> documents/iclas. The pmc and podling fields are only used for new
>>>> account requests.
>>>
>>> The current tool uses the pmc and podling fields to send emails on commit.
>>> So I'd still vote for having pmc and podling fields above the File button.
>>>>
>>>>> 7. The flow with the current tool is to fill all the fields, File,
>>>>> Commit, and then request account. What is the intent of the Request
>>>>> Account button on this screen?
>>>>
>>>> The proposed new flow is File (which will do a commit) then Request
>>>> Account (which is now a button).
>>>
>>> I like a separate Commit after File when I can look at the svn diff of the
>>> iclas.txt before commit.
>>>>
>>>>> 8. In the current tool, File brings up the svn commands that can be
>>>>> double checked for errors. The new tool should do something similar.
>>>>> There is an alert if there is a problem with an svn command but the
>>>>> current tool has a better way to present the problem, with the svn
>>>>> commands and then an alert to ask whether it should continue.
>>>>
>>>> I'll look at that in a subsequent pass.
>>>>
>>>>> 9. When filing a document with a digital signature, error: Exception:
>>>>> #<IOError: invalid filename: duncan-godwin>. It should be
>>>>> duncan-godwin/icla.txt and icla.txt.asc. But then I tried again and this
>>>>> time, success: stub for ICLA, filename: duncan-godwin. But sadly, only
>>>>> the .asc file was added.
>>>>
>>>> The first is a bug, and has been fixed.
>>>
>>> Agree. It's fixed.
>>>>
>>>> The second (only filing the .asc) may have occurred if you had
>>>> selected the asc file separately. To prevent this, I've now committed
>>>> a change which will no longer prompt you for the document type of
>>>> files ending in .asc or .sig.
>>>
>>> This is good.
>>>>
>>>>> 10. There should be a button to return to the main screen.
>>>>
>>>> Suggestion for where the button should go?
>>>
>>> Tippy top above "text".
>>>
>>>> Meanwhile, up arrow will
>>>> return you to the main screen.
>>>
>>> That works.
>>>>
>>>>> 11. The drag/drop of .jpg files doesn't appear to work. It should also
>>>>> display the convert commands that are being executed. And there doesn't
>>>>> appear to be an "undo" in case the drag/drop order was wrong. Drag/drop
>>>>> of pdf files works as expected.
>>>>
>>>> What problem are you seeing? If I go to "2015-12-19T17:50:43Z" and
>>>> drag "IMG_1119.JPG" and drop it on "IMG_1118.JPG", I get
>>>> "IMG_1118.png".
>>>
>>> I went to 2016-01-06T06:16:13Z and dragged image005.jpg onto image001.jpg
>>> and ended up with image001.pdf (good) but there is nothing in image001.pdf.
>>>
>>>>
>>>> Where should the convert commands be displayed?
>>>
>>> Whenever there is a message displayed, there should be a File: menu with
>>> operations, dup, spam, incomplete, processed, and unsigned buttons. Perhaps
>>> underneath the text, headers, raw section?
>>>
>>> Whenever there is a file displayed (image003.jpg) there should be a (Do)
>>> menu with burst, flip, etc. that applies to that specific file.
>>>
>>> Whenever there is a bad signature, there should be a menu with email
>>> button. The email should say "bad signature; please try again." I can give
>>> you the exact text from history.
>>> Whenever there is a missing public key, there should be a menu with email
>>> button. The email should say "unable to download public key."
>>>
>>> Right now, the document menu shows icla, grant, ccla, nda, and mem. This
>>> menu should only be for .pdf files and .txt files with matching .txt.asc
>>> files.
>>>
>>> Speaking of signed files, we often get Johnny-ICLA.pdf and
>>> Johnny-ICLA.pdf.asc. These should be renamed icla.pdf and icla.pdf.asc
>>> before being put into iclas/john-jacob-jingleheimer-schmidt. Same for
>>> johnny-icla.txt and johnny-icla.txt.asc.
>>>
>>>> At the moment, the
>>>> right pane will typically show the contents of the file being dragged
>>>> before the drop is complete, and will show the contents of the
>>>> combined file afterwards.
>>>
>>> I have not seen any of this behavior. All I see is the file being dragged
>>> changing the proposed drop target in a green oval. And dropping the file
>>> goes silent for a bit and then nothing appears in the right pane.
>>>>
>>>> A "right click" should bring up a menu that will burst a PDF.
>>>
>>> Do not like right click. Prefer to always have a menu (see above for
>>> suggestions).
>>>>
>>>>> 12. Once a mail has been processed, what should be the indication on the
>>>>> main page? How do I tell that there is new work to do?
>>>>
>>>> Like with the current secretary workbench, the idea is that once a
>>>> document is filed or deleted it will no longer show up in the main
>>>> index.
>>>
>>> Ok. This is fine.
>>>>
>>>> That may mean that with emails such as "2016-01-05T10:54:59Z", you
>>>> will need to file the ICLA and then delete the rest (either
>>>> individually via the context menu or collectively using
>>>> command-delete).
>>>
>>> Once I process the icla.pdf from that email, the rest of the stuff (random
>>> banners, vcf signatures, etc.) is still there, and I'm still looking at the
>>> same email.
>>>
>>> With this new work flow, the extra stuff isn't in svn so it doesn't need to
>>> be removed. But the email needs to be marked as complete. Maybe a
>>> "processed" button that tells the system that nothing else is needed for
>>> this email? Or "ignore" that is used for pure spam as well?
>>>
>>> Craig
>>>>
>>>>> Good progress.
>>>>
>>>> Thanks!
>>>>
>>>>> Craig
>>>
>>>>>
>>>>> Craig L Russell
>>>>> Architect, Oracle
>>>>> http://db.apache.org/jdo <http://db.apache.org/jdo>
>>>>> 408 276-5638 <tel:408%20276-5638> mailto:[email protected]
>>>>> <mailto:[email protected]>
>>>>> P.S. A good JDO? O, Gasp!
>>>>
>>>> - Sam Ruby
>>>
>>> Craig L Russell
>>> Architect, Oracle
>>> http://db.apache.org/jdo <http://db.apache.org/jdo>
>>> 408 276-5638 <tel:408%20276-5638> mailto:[email protected]
>>> <mailto:[email protected]>
>>> P.S. A good JDO? O, Gasp!
>>>
>>>
>>
>> Craig L RussellArchitect, Oraclehttp://db.apache.org/jdo408 276-5638
>> mailto:[email protected]. A good JDO? O, Gasp!
>>
Craig L Russell
Architect, Oracle
http://db.apache.org/jdo
408 276-5638 mailto:[email protected]
P.S. A good JDO? O, Gasp!