Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Practical
API-Development
with
Gemstone/S
Marten Feldtmann
dimap - das Institut für Markt- und Politikforschung, Hamburg +...
About
●
Marten Feldtmann
– Smalltalker since VisualWorks/Atari-ST
●
GESS Software, Hamburg
– http://www.gessgroup.de/
– CA...
Project/Circumstances
●
Left Smalltalk development around 2002
– VisualWorks with Argos/Versant (OODBMS-Experience)
●
Gene...
How to get to current state
●
Current State
●
Evolution of a way to bring back Smalltalk
– Early Attempts to bring back Sm...
Summary - Platform Overview
PUM
Sencha ExtJS
HTML/5
Cordova
Electron
Android
Browser
Windows
Linux
MacOS
Pi
Python 3.x
Jav...
First attempt
ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemst...
Tribute to Pieter Hintjes
ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Developmen...
Second attempt
ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gems...
In the other company
●
Other Company: dimap
– Project for HbbTV result presentation for an election in
Germany
●
Gemstone/...
Product at the horizon
●
CEO asked for help on new CATI System
– First attempt failed completely
●
Lost on the RDBMS datab...
CATI - System
Supervisoring
Project Management
Interviewing
ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS ...
Product Goals - CATI
●
Initial target (reached)
– 100 interviewers, 10 supervisors, 10 project managers
●
Next target
– 40...
New Attempt
●
Database ?
●
Gemstone/S
– This was not a decision based on facts
– If you start such a project – have fun
●
...
New Attempt
●
Overall Layout
– Central Database is Gemstone/S (free)
– System is running under Linux only
– API-based (if ...
Initial Technical Goal
●
Database Gemstone/S (starting with 3.1.0.5)
●
Two-Core license for about $1500
●
Code generation ...
Modelling and DB-Layout
●
Modelling / Generator Experiences
– Own modeller („PUM“ – Poor Users Modeller)
●
Technical orien...
Programming Model – Decisions
●
Defining Programming Model for Gemstone/S
– Optimistic Locking, Revision Attribute if need...
Programming Model – Decisions
●
Data Type Definition in JSON
– Time (HH:MM:SS)
– Date (YYYY-MM-DD)
– DateTime (YYYY-MM-DDT...
Modelling – Decisions
●
Two Class Hierarchies (in DB)
– Domain oriented: persistent classes
– API oriented: transient clas...
Modelling – Attributes
●
Base Types (int, string, ..)
●
Array of base types (not association)
●
„RcCounter“ support
●
Calc...
Modelling – Features
●
„Access-Path“
– Defines attributes based on access paths from a
domain object to an attribute of an...
Modelling – Associations
●
Implemented as
– Bag, Dictionary, Array, Queue, Set, Sorted, Indexed
●
Additional hints
– Confl...
Modelling – Associations
Dictionary Indexed Ordered Queue Set Sorted
conflict Dictionary
StringKeyDict.
IntegerKeyDct.
Set...
Gemstone – Query Facilities
●
Regardless of database type – queries are a MUST
– Gemstone/S possibilities (Hmm...)
●
Query...
Gemstone/S – PUM Runtime
●
Support
– Optimistic Locking
– Request Retries (up to 6 times)
●
Reduced errors at the client
●...
PUM - Languages
●
Creates topaz-script (now: 12MB) with all source
code
– classes, association handling, migration support...
PUM – Languages - Javascript
●
Creates Javascript files for ExtJS
– Single Files for classes and stores
– Merging process ...
PUM – Languages - Python
●
Initial scripting language candidate: Ruby
●
Change to: Python
– Create Language Runtime based ...
PUM – Languages – Java, C#
●
General
– Either language is used in company, must connect to product or to place a solution
...
PUM – Examples
ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gems...
From passive to active
●
Introduction of 0MQ intro product
– Backend developer defines events for special domain
situation...
Summary - Platform Overview
PUM
Sencha ExtJS
HTML/5
Cordova
Electron
Android
Browser
Windows
Linux
MacOS
Pi
Python 3.x
Jav...
System Layout - Backend
Gemstone/S
Apache/2
(Proxy WebSockets, HTTP(S), Load-Balancer)
EvPublisher
(Python, 0MQ)
0MQ-Event...
Summary - Overall
●
Summary
– People get used to true multi-language development (MLD)
– Long – not easiest, lots of wrong...
Summary - License Costs/User/Year
●
€1050 (Microsoft, Windows)
– VisualStudio Pro. (C#)
●
€650 (JetBrains, Windows + Linux...
Thank you !
Load Balancing
●
API-Call
– Try to group api calls in different pools of similiar time-
behaviour
– Longer API-call may bl...
Gemstone/S – SortedCollection
●
Workhorse
– Speed relates with size
– Enables presorted structure (Speed access !)
– Very ...
Gemstone/S – SortedCollection
ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Develo...
Gemstone/S
●
Interest in Gemstone/S increased ? No. Why ?
– Offers no support for developers in other language
– Offers no...
Modelling – Features
●
„Search-Path“
– Define search paths from the root to a persistent object
– e.g. Address
●
Customer ...
Nächste SlideShare
Wird geladen in …5
×

Practical API-Development with Gemstone/S

680 Aufrufe

Veröffentlicht am

Abstract:
ReStore is an object-relational database interface for Dolphin Smalltalk. A key design philosophy behind ReStore is the use of familiar Smalltalk expressions in preference to relational database terminology. This is particularly evident in the querying subsystem which uses standard Collection expressions, for example:

[[[
Employee storedInstances select: [ :each | each office city = ‘London’]
]]]


Translation of the select block to a SQL query uses the familiar technique of evaluating the block with an analysis object, tracking each message send via doesNotUnderstand:. A shortcoming of this approach is the inability to handle commonly-used optimised/inlined expressions such as isNil, and: etc. This forces the use of less common or non-standard equivalents, compromising the design philosophy and leading to errors where code uses the more familiar expressions.

This presentation describes improvements to ReStore’s query block analyser, using the reflective capabilities of Smalltalk to track optimised expressions via examination and manipulation of the execution stack.

Bio:
I have been working with Smalltalk since 1992, initially in academia and subsequently in a variety of employed and self-employed positions. From 2000 to 2005 I ran my own company creating bespoke systems for SMEs using Dolphin Smalltalk; this was the original impetus behind the creation of ReStore. Following ten years at JPMorgan working with VisualWorks and GemStone, in 2015 I relocated with my family to rural France and resumed working with Dolphin and ReStore.

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

Practical API-Development with Gemstone/S

  1. 1. Practical API-Development with Gemstone/S Marten Feldtmann dimap - das Institut für Markt- und Politikforschung, Hamburg + Bonn infratest-dimap, Berlin GESS Software mbH, Hamburg ESUG 2018
  2. 2. About ● Marten Feldtmann – Smalltalker since VisualWorks/Atari-ST ● GESS Software, Hamburg – http://www.gessgroup.de/ – CATI Software ● dimap, Hamburg and infratest dimap, Berlin – http://www.dimap.de, http://www.infratest-dimap.de/ – Election Results Presentation for Television, HbbTV and Internet (ARD, SWR, WDR, NDR, RB, RBB, BR, ...)
  3. 3. Project/Circumstances ● Left Smalltalk development around 2002 – VisualWorks with Argos/Versant (OODBMS-Experience) ● General good experiences ● Out of Smalltalk business over night (Versant) ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  4. 4. How to get to current state ● Current State ● Evolution of a way to bring back Smalltalk – Early Attempts to bring back Smalltalk – Object-Modelling/DB-Layout/Code Generation – Programming Language Support – Runtime – Infrastructure, Scheduling ● No brilliant ideas – just work over years with an idea in mind. ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  5. 5. Summary - Platform Overview PUM Sencha ExtJS HTML/5 Cordova Electron Android Browser Windows Linux MacOS Pi Python 3.x Java >=8 C# (Sync) C# (Async) Windows Xamarin Android Linux Gemstone ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  6. 6. First attempt ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S ● VA Smalltalk (2012/3) – Seaside + JQueryMobile ● headless task on each computer ● 0MQ networking client – service detection ● installation practise ● ICU Unicode experience ● IC packaging ● Modular system ● CouchDB ● PDF service
  7. 7. Tribute to Pieter Hintjes ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S ● Peter Hintjens ● 1962 - 2016 ● Network Computing using 0MQ ● Thank you !
  8. 8. Second attempt ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S Demo VA + ExtJS :-) Result JS could be the way
  9. 9. In the other company ● Other Company: dimap – Project for HbbTV result presentation for an election in Germany ● Gemstone/S (3.1.0.x) ● Sencha ExtJS (why not jQuery ?) – Manual Coding ALL stuf ● HTTP-Request ● Took long time, but result were ok ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  10. 10. Product at the horizon ● CEO asked for help on new CATI System – First attempt failed completely ● Lost on the RDBMS database side ● No feeling for database – „Rewrite from scratch“ – Look for suitable technology / system ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  11. 11. CATI - System Supervisoring Project Management Interviewing ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  12. 12. Product Goals - CATI ● Initial target (reached) – 100 interviewers, 10 supervisors, 10 project managers ● Next target – 400 interviewers, 50 supervisors, 10 project managers ● Very different user profiles – Interviewer – calling people, execute the interview – Supervisor – managing interviewer, daily project work, statistics – Project Managers – overall project work, statistics ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  13. 13. New Attempt ● Database ? ● Gemstone/S – This was not a decision based on facts – If you start such a project – have fun ● Reaction – Smalltalk ? – License Question ? ● Conditions – No pure Smalltalk application – Fallback considerations in case Gemstone/S is failing – Consider developers in company ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  14. 14. New Attempt ● Overall Layout – Central Database is Gemstone/S (free) – System is running under Linux only – API-based (if a central component is failing) – UI is done in Javascript ● Sencha ExtJS – UI talks with database via HTTP – Scripting language: Ruby (Hype !) ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  15. 15. Initial Technical Goal ● Database Gemstone/S (starting with 3.1.0.5) ● Two-Core license for about $1500 ● Code generation (as in our C# projects) ● Optimal support for UI (Sencha ExtJS Javascript) – Ajax-Calls (Single API Calls) – Store (CRUD – up to four API calls) – Class-based Javascript development – Paging – Sorting, – Filtering – Reminds me of the VASmalltalk Abt-Builder stuff, but at current state of the art UI ● => True seperated programming languages development ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  16. 16. Modelling and DB-Layout ● Modelling / Generator Experiences – Own modeller („PUM“ – Poor Users Modeller) ● Technical oriented modelling tool – Initially used for C#, started around 2003 – Written in VASmalltalk – Very good experiences – Very special programming model for us and results were more than ok – Original C# model was „in-ram,distributed“ database oriented – Now the programming model has to be changed: ● Need for a special Gemstone/S model ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  17. 17. Programming Model – Decisions ● Defining Programming Model for Gemstone/S – Optimistic Locking, Revision Attribute if needed – Initially supporting Swagger (later OpenAPI) – but now obsolete – Initial REST oriented: PUT, DELETE, GET and POST – Changed to POST only – UTF8 only – JSON only - one JSON parameter allowed in each call – Two kind of API calls ● Simple API-calls ● CRUD structure support (4 API calls each CRUD) – Depends only on NeoJSON, Zinc* stuff and base Gemstone/S ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  18. 18. Programming Model – Decisions ● Data Type Definition in JSON – Time (HH:MM:SS) – Date (YYYY-MM-DD) – DateTime (YYYY-MM-DDTHH:MM:SS.sss+xxxx) – Enumeration (as strings) – Flags (like Enums with „|“ as delimiter) ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  19. 19. Modelling – Decisions ● Two Class Hierarchies (in DB) – Domain oriented: persistent classes – API oriented: transient classes – Domain class may have several „corresponding“ api classes – API class may have one „corresponding“ domain class ● Developer‘s world – Gemstone/S - uses both hierarchies – Client-developer – sees API classes only ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  20. 20. Modelling – Attributes ● Base Types (int, string, ..) ● Array of base types (not association) ● „RcCounter“ support ● Calculated attributes – Either Smalltalk block defined in Tool – Calling to-be-implemented method ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  21. 21. Modelling – Features ● „Access-Path“ – Defines attributes based on access paths from a domain object to an attribute of another object – Very often used ● Gemstone/S - „official“ way to access a far away attribute. ● Enriches API classes to return more data than the base domain objet ● Circumvents API classes limitations – API classes knows only their shadowing class attributes ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  22. 22. Modelling – Associations ● Implemented as – Bag, Dictionary, Array, Queue, Set, Sorted, Indexed ● Additional hints – Conflict, Identity, Large, Unique ● Resulting classes – Array, IdentitSet, Bag, StringKeyDictionary, RcQueue, SortedCollection …. – Index support ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  23. 23. Modelling – Associations Dictionary Indexed Ordered Queue Set Sorted conflict Dictionary StringKeyDict. IntegerKeyDct. Set Array RcQueue Set Sorted- Collection identity Dictionary StringKeyDict. IntegerKeyDct. IdentitySet Array RcQueue IdentitySet Sorted- Collection large Dictionary StringKeyDict. IntegerKeyDct. Set Array RcQueue Set Sorted- Collection RcIdentitySet IdentitySet *Bag unique Dictionary StringKeyDict. IntegerKeyDct. Set Array RcQueue Set Sorted- Collection none Dictionary StringKeyDict. IntegerKeyDct. Set Array RcQueue Set Sorted Collection ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  24. 24. Gemstone – Query Facilities ● Regardless of database type – queries are a MUST – Gemstone/S possibilities (Hmm...) ● Query Language ● Filtering ● Sorting ● Multi-Index Searching ● Offset, limit query etc … ● SELECT * FROM TABLE WHERE x=? offset x limit 25 – Speed, Speed (e.g. Buffered-Tables in UI) ● Presorted Structures ? ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  25. 25. Gemstone/S – PUM Runtime ● Support – Optimistic Locking – Request Retries (up to 6 times) ● Reduced errors at the client ● Increasing concurrency ● Increasing database load – JSON serialization of parameter (API Classes) – Application user session handling – Logging, Benchmarking – Support for 0MQ-Events on successful/failure transactions ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  26. 26. PUM - Languages ● Creates topaz-script (now: 12MB) with all source code – classes, association handling, migration support – Index support – Setup persistent domain tree, API calls – Object initialization support – Copying API Classes ↔ DomainClasses – Placeholder for to-be-implemented methods ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  27. 27. PUM – Languages - Javascript ● Creates Javascript files for ExtJS – Single Files for classes and stores – Merging process of newly created files with extensions in older files ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  28. 28. PUM – Languages - Python ● Initial scripting language candidate: Ruby ● Change to: Python – Create Language Runtime based on the initial Swagger adaption of Swagger-Runtime – Simulators (Raspi Rack), service-scripts, background- tasks, API examples – all is written in Python – PUM creates ALL code in ONE large file. Easy to copy to a project. – Very good choice ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  29. 29. PUM – Languages – Java, C# ● General – Either language is used in company, must connect to product or to place a solution within company ● Java – PUM Runtime written from scratch ● External JSON library (Google) – Delivered as jar files to API-developers ● C# (Xamarin and/or .Net/Mono (Unity3D)) – PUM Runtime written from scratch – External JSON library (Newtonsoft) – Two generators (synchronous, asynchronous model) – Delivered as Solution or dll to API-developers – Base of documentation generation (MS Sandcastle + Print & Manual) ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  30. 30. PUM – Examples ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S C#: var anApiClient = new ApiClient( jsonHandler, "http://compi.mydomain.de"); var aCATIAPISessionCreationInfo = new CATIAPISessionCreationInfo(); aCATIAPISessionCreationInfo.login = "root"; aCATIAPISessionCreationInfo.password = "rootpassword"; aCATIAPISessionCreationInfo.customerName = "gess"; var aCATIAPISessionResultList = anApiClient.CreateSession(aCATIAPISessionCreationInfo); Python: aClient = swagger.ApiClient('', "http://compi.mydomain.de") api = webcatiapi.RESTApi(aClient) aCATIAPISessionCreationInfo = webcatiapi.CATIAPISessionCreationInfo() aCATIAPISessionCreationInfo.login = „root“ aCATIAPISessionCreationInfo.password = „“rootpassword“ aCATIAPISessionCreationInfo.customerName = „gess“ aCATIAPISessionResultList = api.CreateSession( aCATIAPISessionCreationInfo)
  31. 31. From passive to active ● Introduction of 0MQ intro product – Backend developer defines events for special domain situations in the model – The backend developer places events in case of commits and failures. – External application are listening to these events ● No polling, language independent – Incredible experience and improvement of the system layout ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  32. 32. Summary - Platform Overview PUM Sencha ExtJS HTML/5 Cordova Electron Android Browser Windows Linux MacOS Pi Python 3.x Java >=8 C# (Sync) C# (Async) Windows Xamarin Android Linux Gemstone ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  33. 33. System Layout - Backend Gemstone/S Apache/2 (Proxy WebSockets, HTTP(S), Load-Balancer) EvPublisher (Python, 0MQ) 0MQ-Event-Bus Events< - > WebSocket (Python, 0MQ) Logger (Python, 0MQ) Apps 00 .. xx (Python, Java, C#, 0MQ) ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  34. 34. Summary - Overall ● Summary – People get used to true multi-language development (MLD) – Long – not easiest, lots of wrong decisions - path of evolution – Great programming model on the backend due to Gemstone/S – Smalltalk used in company – Introduce Python as an accepted language ( :-( ) – Active database due to ● 0MQ-based Event structure (MLD) ● WebSockets (MLD) ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  35. 35. Summary - License Costs/User/Year ● €1050 (Microsoft, Windows) – VisualStudio Pro. (C#) ● €650 (JetBrains, Windows + Linux + Mac) – WebStorm (Javascript), PyCharm (Python) and IntelliJ (Java) ● €1800 – Sencha ExtJS Framework (HTML) ● €500 – Sencha Test Framework ● €1500 – Gemstone/S, 2-core license (Linux) ● €500 - Help and Manual (Documentation) ● Total: ~€4500 + (€1500 - €6000) for database (web licenses) ● Too much ? ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  36. 36. Thank you !
  37. 37. Load Balancing ● API-Call – Try to group api calls in different pools of similiar time- behaviour – Longer API-call may block short calls – Adding more Gemstone/S answering tasks is not always a solution – 2-core license is a limitation here ● Apache/2, different algorithms for load balancing – Bybusiness – not default ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  38. 38. Gemstone/S – SortedCollection ● Workhorse – Speed relates with size – Enables presorted structure (Speed access !) – Very fast operations possible ● Browsing, Buffered Browsing – Consider reverse logic (work at the end of the collection) ● Alternative: IdentitySet with index support – Slower – Constant speed ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  39. 39. Gemstone/S – SortedCollection ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  40. 40. Gemstone/S ● Interest in Gemstone/S increased ? No. Why ? – Offers no support for developers in other language – Offers no basic programming model or database API – Consider Smalltalk as a datascripting language – Everything has to be built from scratch – Others choose PostgreSQL, SQLite, MySQL or MariaDB or MongoDB ● Usable from all other languages out of the box ● User need mostly basic stuff from database: queries, storing etc … – No Windows platform for development ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S
  41. 41. Modelling – Features ● „Search-Path“ – Define search paths from the root to a persistent object – e.g. Address ● Customer (customerID) ● Project (projectID) ● AddressContainer (containerID) ● Address (addressID) – Pretty boring for API-developer ● Switching to „OOP“-Number under Gemstone/S ESUG 2018 * Marten Feldtmann * infratest-dimap * dimap * GESS Software – API Oriented Development with Gemstone/S

×