Search

Clear filter

#InterSystems IntelliCare

5 Posts0 Followers

#InterSystems Demo Games

15 Posts0 Followers

#InterSystems Reports (Logi)

42 Posts2 Followers
Article
Robert Cemper · Aug 26, 2017

From The Roots to InterSystems

This is a rather personal view of the history before Caché.It is in no sense meant to compete with the excellent books from Mike Kadow discussed in an earlier article.We have different histories and so this is meant to create a different perspective of the past. The whole story started in 1966 at MGH (Mass.General Hospital) on a PDP-7 Ser.#103with 8K of memory (18-bit words) [ today = 18K byte ] as a spare system. "Serial Number 103 - was located in the basement of the now demolished Thayer Building,currently [2014] the site of the Cox Cancer Center at MGH.""Neil Papparlardo and Curt Marble under the guidance of Octo Barnett developed and releasedthe initial software on this machine." They named it MUMPS. (source) PDP-7 The language itself was rather close to old-style Basic.But there were remarkable improvements over other programming languages: The big idea was to store and retrieve persistent data without the need to deal with a file system. This was an enormous step forward at that time compared to other systems where storing and reading persistent data could easily take 30%+ of your available memory and no idea if sorting, indexing, .... No strong data types anymore or data types imposed by names (ALGOL, FORTRAN, ..) an endless source for formal errors and conversions. Dynamic (sparse) arrays without frozen structure and pre-allocated half-empty space in memory Indexing persistent data with variable-length structured indices (subscripts) allowing easy sorting, grouping, subgrouping,.. You may want to compare it to old code in COBOL, FORTRAN or PL/1 to estimate the dimension of that revolution.The new software took its way along fast-moving hardware development until it reached PDP-11and was finally known as MUMPS 4b. 1978 was a remarkable year:- InterSystems was founded by Terry Ragon- DEC rolled out its first VAX-11 Cluster (at Carnegie Mellon ?)- DEC completed DSM-11 (Digital Standard Mumps) : Besides following the rather fresh standard it had new Global Module that improved storage performance radically. It easily outperformed any other DataBase named product by magnitudes. The author of this Global module was a brilliant engineer with international experience: Terry Ragon.- I myself joined DEC also in 1978 as Sales and Support Engineer for DSM-11 meeting Terry at the first support training in Maynard. DEC at that time was completely high with the new VAX-11 and the VAX-Cluster.The new high-performing DB was ignored and its power totally misunderstood.All requests from software developers to have DSM native on VAX to take advantage of the new box were ignored. This persistent ignorance of customer requests was the base to encourage a customer of mine to invite me:"If they don't do it join us and we will do it !" [How often have you got the offer to write an OS like this from scratch?]I just couldn't resist and I joined and we wrote it up from point zero on bare-boned VAX-750.The OS was named VISOS and lived as long as the supported VAX models existed. Some time later DEC presented DSM as a layered product on top of VMS.In the beginning, performance was dictated by the underlying RMS and didn't reflect the gain in processing power. It moved out of my scope and I didn't care about it anymore.Years later the best on my opinion that DEC did was: They sold its unloved product DSM to InterSystems.Not too long before they were sold themselves. When I joined InterSystems 20 years later I found in Caché again so many details I had implemented myself.So I could enjoy a very warm feeling of being at home. Caché is today far far away from all its predecessors but still source compatible.The power of Globals is still there. There might be only a few constellations where youcan't outperform a competing DB. My favorite example out of many others: GAIA Project run by European Space Agency (ESA) This is obviously a quite personal perspective into technologic history and part of a personal story.If you have questions or feel the need to correct me you are welcome.With my location in Vienna (Austria) I always had the impression to watchdecisions in Cambridge, Maynard, Boston from far far away at the border of the Milky Way. Thanks for a nice story :)I myself got familiar with those nice PDP-11 computers on 1977. I wrote programs with FAS language that was developed in Finland at VTKK (The Computer Center of the State).Then later, maybe late 1986 we started the move to MUMPS using ISM-11 and ISM-11+ on a PDP-11/44.Then there were times with some VAX/VMS-clusters with Intersystems' M(umps) and Caché technology and now I'm working with Caché and Ensemble on aix, Windows and RHL.We are also still using also the good old VA's Kernel as well as the FileMan filesystem.I find myself privileged because I have had the opportunity to work with such a company that InterSystems has been an still is.Now I'm already at "the cooling stage", working only three days a week and only until the end of this year 2017. Thank you Heikki,I have passed this "cooling" too and missed the "heat." So my mind is back and the body stays at home Robert,Great history lesson! I have a question for you though. As you were there at the begining or close to it perhaps you might have some insight. I came from a background in MultiValued databases (aka PICK, Universe, Unidata) joining InterSystems in 2008 when they were pushing Cache's ability to migrate those systems. From the beginning I was amazed at the parallel evolution of both platforms. In fact when I was preparing for my first interviews, having not heard of Cache before, I thought it was some derivative of PICK. Conceptually both MUMPS and PICK share a lot of commonality. Differing in implementation of course. I have long harbored the belief that there had to be some common heritage. Some white papers or other IP that influenced both. Would you have any knowledge on the how the original developers of MUMPS arrived at the design concepts they embraced? Does the name Don Nelson ring a bell?Thanks again for the history. Hi Rich,I remember we met several times @internal meetings and @Devcon / Summit.The common branch of M and MV might be The Ubiquitous B-Tree - 1979 by Dougles Comer.On the other hand mid 60ties it was time to have something new to support creative and faster development.So they might quite well taken ideas from each other.So as you find many lingual constructs that are pretty similar to Java.Don Nelson didn't pass my way. But I have a personal gap from '85 to '99 where I was on a complete different road. Hi Robert, thank you for sharing with the rest of us this great piece of computer history. They say life is making circles. I believe it's about time for MUMPS to make history again in database management and database modeling with Associative Semiotic Hypergraph engine build on top of Intersystems Cache globals and a powerful OOP API in Python for data analytics. Stay tuned, I am fond of old pioneers of computer technology and I do respect a lot their efforts and strangle of their time. We build powerful meaningful relationships easily ;-) Thank you Athanassios! I see these cycles everywhere. Almost every relational DB today has its B-tree index. Well known here since DSM-11.Similar when I did an evaluation of HBase and scratched a little bit under the surface : I found a tiny Global structurewith limited subscripts.You are right there is a lot of power left for new development on this base. And have you noticed that what ever the model and data structure we cannot escape from the fundamental principle of managing data allocation space with references, i.e. pointer based logic, memory addressing ? Isn't this the fundamental mechanism of programming languages too ? The problem I see with all these modern nosql databases, especially graph databases is that they provide a higher level abstraction for the end developer but they hide and lock completely the access to the low level storage and retrieval mechanism including indexes. Even in key-value stores you cannot see or understand the sorting of indexes, you cannot easily reference data values.Transparency in computer science is a huge issue. Wizards and pioneers of computer hardware and software, have created multiple abstraction layers and here comes the next generation that is asked to program the machine without understanding what is going on underneath. And even if there is such a desire, the environment, the language and the tools, DO NOT help towards this direction. Intersystems cache does make the difference from many aspects. There is a built-in database with subscripted arrays and multi-dimensional keys similar to the variables used by most programming languages to access main memory.Let me repeat this, a programming language MUMPS-Cache objectscript with a built-in database. I think this is a fundamental aspect that they have been missing when others invented new programming languages. They are missing the innate common characteristic that both databases and programming languages share which is the pointer, reference based logic. So I believe it's time to return back and fix this for new generation databases AND post-modern programming languages too. What do you think ;-0 You hit the point:Transparency is important.Not be forced to use it but as an offer to developers to make the underlying mechanics visible Let me repeat this, a programming language MUMPS-Cache objectscript with a built-in database. I think this is a fundamental aspect that they have been missing when others invented new programming languages. They are missing the innate common characteristic that both databases and programming languages share which is the pointer, reference based logic. So I believe it's time to return back and fix this for new generation databases AND post-modern programming languages too.This is a core part of the QEWD.js project: to make JavaScript a first-class language for Global Storage databases - and therefore give JavaScript a built-in database. The cache.node module provides the high-performance in-process connection needed to allow the intimate relationship between JavaScript and the Cache database engine. The ewd-document-store module aims to provide the JavaScript equivalent of the ^ in COS (ie blurring the distinction between in-memory and on-disk JavaScript objects). JavaScript's dynamic, schemaless objects are a perfect fit with the dynamic, schemaless nature of Global Storage, making it an ideal modern substitute language instead of COS. For more information see the online tutorial at http://docs.qewdjs.com/qewd_training.html - specifically parts 17 - 27 Hi Rob, thank you for the update on your QEWD project. One of the main reasons I chose Python as the binding language for Cache in our project instead of Javascript is that in data analysis, data science area the first is already well established, extremely popular and there is big momentum on developing further a vast collection of tools and libraries that extent the language. But the second clearly wins the battle in web platform development. I am sure I will definitely re-visit your project and perhaps ask you to collaborate when I reach the stage of developing the front end and/or another client API. For our readers I must also mention that your article on a universal NoSQL engine using Globals is a must read for anyone that wants to understand the power of multi-dimensional, schema-free, hierarchically structured, sparse, dynamic arrays, i.e. Global Storage databases. And for the history it appeared right at the birth (re-birth) of NoSQL movement back in 2010 ;-) Robert Cemper is a great example of how to reinvent yourself and always be in line with technological trends, without forgetting the lessons of the past. His articles and applications on this DC are my favorites. It's great to always be able to enjoy his great and continuous contribution here. Robert is our GOAT. @Yuri.Gomes thank you.! To some extent, I'm an actor too and enjoy pleasing my audience Congrats, @Robert.Cemper1003 ! BTW, how come this article is shown as new and came in April's digest? I see comments from 2017 It is from 2017During the Quality Assurance of the article it was updated Great to discover your article after 6 years @Robert.Cemper1003, thanks to a QA update! 😉
Question
Jon Jensen · Sep 26, 2017

InterSystems IRIS group?

Is there a group for InterSystems IRIS? If not, can you create it? Hi, Jon!InterSystems IRIS group is introduced.
Question
Carina Mueler · Jul 8, 2018

InterSystems Platform Functions

Hi, I have general question regarding the InterSystems Platform.Which features does the platform have, that the other similar platforms doesn't have? what product/component are you interested in?IRISENSEMBLEHEALTHSHARECACHÉTRAKiKNOWDEEPSEE.....and others is as wide as the whole software industryplease be more specific What is the difference for example between Ensemble and IRIS ans Cache? reply posted as an answer As by your concrete questionCachéInterSystems Caché® is a high-performance database that powers transaction processing applications around the world. It is used for everything from mapping a billion stars in the Milky Way, to processing a billion equity trades in a day, to managing smart energy grids. EnsembleInterSystems Ensemble® is a seamless platform for rapid connectivity and the development of new connectable applications. Ensemble users typically complete projects twice as fast compared to previous generations of integration products. InterSystems IRISInterSystems IRIS Data Platform™ sets a new level of performance for rapidly developing and deploying important applications. All of the needed tools and capabilities are provided in a reliable, unified platform spanning data management, interoperability, transaction processing, and analytics.more
Article
Dmitry Maslennikov · Nov 5, 2018

Abnormal programming with InterSystems

I bet that not everyone familiar with InterSystems Caché knows about Studio extensions for working with the source code. You can actually use the Studio to create your own type of source code, compile it into interpretable (INT) and object code, and sometimes even add code completion support. That is, theoretically, you can make the Studio support any programming language that will be executed by the DBMS just as well as Caché ObjectScript. In this article, I will give you a simple example of writing programs in Caché Studio using a language that resembles JavaScript. If you are interested, please read along. If you go to the SAMPLES namespace, you will find an example of working with user-defined file types. The example suggests opening a document of the “Example User Document (.tst)” type, and there is only one file of this type called TestRoutine.TST, which, in fact, is generated on the go. The class required for working with this file type is called Studio.ExampleDocument. Let’s not get into this example too deeply and create our own instead. The ".JS" file type is already being used in the Studio and JavaScript that we want to support is not exactly the original JavaScript. Let’s call it CacheJavaScript and the file type will be ".CJS". To start off, create a %CJS.StudioRoutines class as a subclass of the %Studio.AbstractDocument class and add the support of the new file type to it. /// The extension name, this can be a comma separated list of extensions if this class supports more than one Projection RegisterExtension As %Projection.StudioDocument(DocumentDescription = "CachéJavaScript Routine", DocumentExtension = "cjs", DocumentIcon = 1, DocumentType = "JS"); DocumentDescription — displayed as the type description in the open file window in the list of filters;DocumentExtension — the extension of the files that will be processed by this class;DocumentIcon — the icon number starts from zero; the following icons are available: DocumentType — this type will be used for code and error highlighting; the following types are available:INT — Cache Object Script INT codeMAC — Cache Object Script MAC codeINC — Cache Object Script macro includeCSP — Cache Server PageCSR — Cache Server RuleJS — JavaScript codeCSS — HTML Style SheetXML — XML documentXSL — XML transformXSD — XML schemaMVB — Multivalue Basic mvb codeMVI — Multivalue Basic mvi code We will now implement all the necessary methods for supporting the new source code type in the Studio. ListExecute and ListFetch methods are used for obtaining a list of files available in the namespace and for showing them in the open file dialogue. ClassMethod ListExecute(ByRef qHandle As %Binary, Directory As %String, Flat As %Boolean, System As %Boolean) As %Status { Set qHandle=$listbuild(Directory,Flat,System,"") Quit $$$OK } ClassMethod ListFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = ListExecute ] { Set Row="",AtEnd=0 If qHandle="" Set AtEnd=1 Quit $$$OK If $list(qHandle)'=""||($list(qHandle,4)=1) Set AtEnd=1 Quit $$$OK set AtEnd=1 Set rtnName=$listget(qHandle,5) For { Set rtnName=$order(^rCJS(rtnName)) Quit:rtnName="" continue:$get(^rCJS(rtnName,«LANG»))'=«CJS» set timeStamp=$zdatetime($get(^rCJS(rtnName,0)),3) set size=+$get(^rCJS(rtnName,0,«SIZE»)) Set Row=$listbuild(rtnName_".cjs",timeStamp,size,"") set AtEnd=0 set $list(qHandle,5)=rtnName Quit } Quit $$$OK } We will store the description of the programs in the ^rCJS global, and the ListFetch method will traverse this global to return strings containing the following: name, date, and size of the found file. In order for the results of being displayed in the dialogue, you need to create an Exists method that checks whether a file with such a name exists. /// Return 1 if the routine 'name' exists and 0 if it does not. ClassMethod Exists(name As %String) As %Boolean { Set rtnName = $piece(name,".",1,$length(name,".")-1) Set rtnNameExt = $piece(name,".",$length(name,".")) Quit $data(^rCJS(rtnName))&&($get(^rCJS(rtnName,«LANG»))=$zconvert(rtnNameExt,«U»)) } The TimeStamp will return the date and time of the program. The result is also shown in the file open dialogue. /// Return the timestamp of routine 'name' in %TimeStamp format. This is used to determine if the routine has /// been updated on the server and so needs reloading from Studio. So the format should be $zdatetime($horolog,3), /// or "" if the routine does not exist. ClassMethod TimeStamp(name As %String) As %TimeStamp { Set rtnName = $piece(name,".",1,$length(name,".")-1) Set timeStamp=$zdatetime($get(^rCJS(rtnName,0)),3) Quit timeStamp } We will now need to load the program and save the changes in the file. The text of the program, line by line, is stored in the same ^rCJS global. /// Load the routine in Name into the stream Code Method Load() As %Status { set source=..Code do source.Clear() set pCodeGN=$name(^rCJS(..ShortName,0)) for pLine=1:1:$get(@pCodeGN@(0),0) { do source.WriteLine(@pCodeGN@(pLine)) } do source.Rewind() Quit $$$OK } /// Save the routine stored in Code Method Save() As %Status { set pCodeGN=$name(^rCJS(..ShortName,0)) kill @pCodeGN set @pCodeGN=$ztimestamp Set ..Code.LineTerminator=$char(13,10) set source=..Code do source.Rewind() WHILE '(source.AtEnd) { set pCodeLine=source.ReadLine() set @pCodeGN@($increment(@pCodeGN@(0)))=pCodeLine } set @pCodeGN@(«SIZE»)=..Code.Size Quit $$$OK } Here comes the most interesting part: compilation of our program. We will compile into INT code and therefore have full compatibility with Caché. This article is just an example, which is why I used just a small fraction of the capabilities of CachéJavaScript: declaration of variables (var), reading (read), and data output (println). /// CompileDocument is called when the document is to be compiled /// It has already called the source control hooks at this point Method CompileDocument(ByRef qstruct As %String) As %Status { Write !,«Compile: „,..Name Set compiledCode=##class(%Routine).%OpenId(..ShortName_“.INT») Set compiledCode.Generated=1 do compiledCode.Clear() do compiledCode.WriteLine(" ;generated at "_$zdatetime($ztimestamp,3)) do ..GenerateIntCode(compiledCode) do compiledCode.%Save() do compiledCode.Compile() Quit $$$OK } Method GenerateIntCode(aCode) [ Internal ] { set varMatcher=##class(%Regex.Matcher).%New("[ \t]*(var[ \t]+)?(\w[\w\d]*)[ \t]*(\=[ \t]*(.*))?") set printlnMatcher=##class(%Regex.Matcher).%New("[ \t]*(?:console\.log|println)\(([^\)]+)\)?") set readMatcher=##class(%Regex.Matcher).%New("[ \t]*read\((.*)\,(.*)\)") set source=..Code do source.Rewind() while 'source.AtEnd { set tLine=source.ReadLine() set pos=1 while $locate(tLine,"(([^\'\""\;\r\n]|[\'\""][^\'\""]*[\'\""])+)",pos,pos,tCode) { set tPos=1 if $zstrip(tCode,"*W")="" { do aCode.WriteLine(tCode) continue } if varMatcher.Match(tCode) { set varName=varMatcher.Group(2) if varMatcher.Group(1)'="" { do aCode.WriteLine($char(9)_«new „_varName) } if varMatcher.Group(3)'=“» { set expr=varMatcher.Group(4) set expr=..Expression(expr) do:expr'="" aCode.WriteLine($char(9)_«set „_varName_“ = „_expr) } continue } elseif printlnMatcher.Match(tCode) { set expr=printlnMatcher.Group(1) set expr=..Expression(expr) do:expr'=“» aCode.WriteLine($char(9)_«Write „_expr_“,!») } elseif readMatcher.Match(tCode) { set expr=readMatcher.Group(1) set expr=..Expression(expr) set var=readMatcher.Group(2) do:expr'="" aCode.WriteLine($char(9)_«read „_expr_“,»_var_",!") } } } } ClassMethod Expression(tExpr) As %String { set matchers($increment(matchers),«matcher»)="(?sm)([^\'\""]*)\+[ \t]*(?:\""([^\""]*)\""|\'([^\']*)\')([^\'\""]*)" set matchers(matchers,«replacement»)="$1_""$2$3""$4" set matchers($increment(matchers),«matcher»)="(?sm)([^\'\""]*)(?:\""([^\""]*)\""|\'([^\']*)\')[ \t]*\+([^\'\""]*)" set matchers(matchers,«replacement»)="$1""$2$3""_$4" set matchers($increment(matchers),«matcher»)="(?sm)([^\'\""]*)(?:\""([^\""]*)\""|\'([^\']*)\')([^\'\""]*)" set matchers(matchers,«replacement»)="$1""$2$3""$4" set tResult=tExpr for i=1:1:matchers { set matcher=##class(%Regex.Matcher).%New(matchers(i,«matcher»)) set replacement=$get(matchers(i,«replacement»)) set matcher.Text=tResult set tResult=matcher.ReplaceAll(replacement) } quit tResult } You can view the generated INT code for each compiled program or class. To do that, you will need to write a GetOther method. It’s pretty simple — its purpose is to return a comma-delimited list of programs that were generated for the source code. /// Return other document types that this is related to. /// Passed a name and you return a comma separated list of the other documents it is related to /// or "" if it is not related to anything. Note that this can be passed a document of another type /// for example if your 'test.XXX' document creates a 'test.INT' routine then it will also be called /// with 'test.INT' so you can return 'test.XXX' to complete the cycle. ClassMethod GetOther(Name As %String) As %String { Set rtnName = $piece(Name,".",1,$length(Name,".")-1)_".INT" Quit:##class(%Routine).%ExistsId(rtnName) rtnName Quit "" } We implemented a method of blocking a program so that just one developer at a time could edit a program or class on the server. Don’t forget about writing a method for deleting programs. /// Delete the routine 'name' which includes the routine extension ClassMethod Delete(name As %String) As %Status { Set rtnName = $piece(name,".",1,$length(name,".")-1) Kill ^rCJS(rtnName) Quit $$$OK } /// Lock the current routine, default method just unlocks the ^rCJS global with the name of the routine. /// If it fails then return a status code of the error, otherwise return $$$OK Method Lock(flags As %String) As %Status { Lock +^rCJS(..Name):0 Else Quit $$$ERROR($$$CanNotLockRoutine,..Name) Quit $$$OK } /// Unlock the current routine, default method just unlocks the ^rCJS global with the name of the routine Method Unlock(flags As %String) As %Status { Lock -^rCJS(..Name) Quit $$$OK } All right, we have written a class that allows us to work with our type of programs. However, we cannot write such a program just yet. Let’s fix it. The Studio enables you to define templates and there are 3 ways of doing it: a simple CSP file of a particular format, a CSP class inherited from the %CSP.StudioTemplateSuper class, and, finally, a ZEN page inherited from %ZEN.Template.studioTemplate. In our case, we will use the last option for simplicity. Templates can be of 3 types as well: for creating new objects, just code templates, and add-ins, which generate no output. In our case, we will need a template for creating new objects. Let’s make a new class called %CJS.RoutineWizard. Its content is pretty simple – you will need to describe a field for entering the program’s name, then describe the name of the new program and its mandatory content for the Studio in the %OnTemplateAction method. /// Studio Template: /// Create a new Cache JavaScript Routine. Class %CJS.RoutineWizard Extends %ZEN.Template.studioTemplate [ StorageStrategy = "" ] { Parameter TEMPLATENAME = "Cache JavaScript"; Parameter TEMPLATETITLE = "Cache JavaScript"; Parameter TEMPLATEDESCRIPTION = "Create a new Cache JavaScript routine."; Parameter TEMPLATETYPE = "CJS"; /// What type of template. Parameter TEMPLATEMODE = "new"; /// If this is a TEMPLATEMODE="new" then this is the name of the tab /// in Studio this template is dispayed on. If none specified then /// it displays on 'Custom' tab. Parameter TEMPLATEGROUP As STRING; /// This XML block defines the contents of the body pane of this Studio Template. XData templateBody [ XMLNamespace = "http://www.intersystems.com/zen" ] { } /// Provide contents of description component. Method %GetDescHTML(pSeed As %String) As %Status { Quit $$$OK } /// This is called when the template is first displayed; /// This provides a chance to set focus etc. ClientMethod onstartHandler() [ Language = javascript ] { // give focus to name var ctrl = zenPage.getComponentById('ctrlRoutineName'); if (ctrl) { ctrl.focus(); ctrl.select(); } } /// Validation handler for form built-into template. ClientMethod formValidationHandler() [ Language = javascript ] { var rtnName = zenPage.getComponentById('ctrlRoutineName').getValue(); if ('' == rtnName) { return false; } return true; } /// This method is called when the template is complete. Any /// output to the principal device is returned to the Studio. Method %OnTemplateAction() As %Status { Set tRoutineName = ..%GetValueByName("RoutineName") Set %session.Data("Template","NAME") = tRoutineName_".CJS" Write "// "_tRoutineName,! Quit $$$OK } } That’s it. You can now create your first program written in Caché JavaScript in the Studio. Let’s call it “hello”. The source code in CachéJavaScript can look like this, for example: // hello console.log('Hello World!'); var name=''; read('What is your name? ', name); println('Hello ' + name + '!'); Let's save it. After save and compile we will see that int code was generated compiled as well successfully, in the output: Compilation started on 11/04/2018 12:57:00 with qualifiers 'ck-u' Compile: hello.CJS Compiling routine : hello.int Compilation finished successfully in 0.034s. Let's look at another source. We can now run it in the terminal USER>d ^hello Hello World! What is your name? daimor Hello daimor! This is how you can describe any language (to a certain extent, of course) that you like and use it to code the server-side business logic for the Caché/IRIS Data platform. There definitely will be problems with code highlighting if this language is not supported by the Studio. This example demonstrates the work with programs, but can definitely create Caché classes the same way. The possibilities are nearly limitless: you just need to write a lexical parser, a syntax parser, and a full-fledged compiler, then come up with the right mapping between all Caché system functions and specific constructs in the new language. Such programs can also be exported and imported with compilation, as it is done with any other programs in Caché. Anyone willing to do it at home can download the source codes here in udl or xml. Just curious is anybody already uses such feature in their work or looking to use? The title looks "scary" )Dmitry, does your approach need Caché Studio only? Could it be used for Eclipse or Visual Studio Code? At this time, it is supported only with Studio. I can easily add support to VSCode, not sure how it will be possible for Eclipse Atelier. That's amazing, Dmitry. Thanks for the introduction.About the parts of lexical parser, syntax, parse, and full-fleged compiler.... how should that be done, and integrated into the framework once they are done? Oh, I missed them in your post. I think that is what you were referring in the method CompileDocument(). Alternatively you could use proper JavaScript via Node.js and the cache.node / iris.node interface :-)
Announcement
Amir Samary · Sep 23, 2019

InterSystems Evaluation Service

Hi everyone, I am pleased to announce that the Evaluation Service is now LIVE! If you are an InterSystems End User or an InterSystems Partner and you want to try the latest version of IRIS with all its enterprise features (mirroring, ECP and sharding), and you want it NOW, this is for you. The Evaluation Service allows you to get your hands on an IRIS kit and a very powerful IRIS license for evaluation purposes in less than 1 minute. No paperwork. No need to talk to anyone. Fully self-service. This service is only for IRIS and IRIS for Health and it is very easy to use. There are two ways to get to the service: WRC - If you are an end user or a partner, you can access the service using our Worldwide Response Center service at http://wrc.intersystems.com Partner Hub - If you are a partner, you can access the service using the Partner Hub at http://partnerhub.intersystems.com WRC To access the service using WRC you must have a WRC user account. If you need help to setup your WRC user account, please send an e-mail to support@intersystems.com and they will be glad to help you. Once you have access to WRC, just click on Online Distributions. Then click on the Evaluations button. Partner Hub If you are an InterSystems Partner you can access the evaluation service from WRC or the Partner Hub. You will see an Evaluation Service button on your main dashboard. The Service Here is a screenshot of the service under WRC: It is now so very easy! Just pick a product, pick a platform, pick a version and click on the big green button! The evaluation service will send you the license key to use with the IRIS product, platform and version you picked and will start the download of the kit. What is the Size of the Evaluation License? The license enables 256 cores and has all its enterprise features enabled (Mirroring, ECP and Sharding). It also has NLP, Interoperability and Analytics. In summary, everything is enabled and the license lasts for 35 days. What happens after the license expires? After 35 days, the license will expire. You can come back to the service and get a new one! Simple like that. Your account manager will get a notification every time you request a new license or renew an existing one. They will be offering help to support your evaluation. InterSystems IRIS 2019.1.1 is there! InterSystems IRIS 2019.1.1 allows in place upgrades of Caché and Ensemble and can be used with IRIS API Management. InterSystems IRIS and IRIS for Health 2019.1.1 is now available on the Evaluation Service! If you are evaluating migrating to IRIS, now it is your change to go to the Evaluation Service and get a powerful evaluation license! Where do I get help? If you have more questions, just send an e-mail to support@intersystems.com and we will be glad to help you! For anyone currently at Global Summit 2019, @Amir.Samary will be demonstrating the new Evaluation Service TODAY at from 1:30-2:15 in the Tech Exchange, table 3. Come and check it out and give us your feedback! Thanks, Ben Spead Manager, Application Services, InterSystems Excellent News, Amir! Great and timely project! Congrats! Great news! thanks Amir. Fantastic !!! Ready, Set, CODE !
Question
Matías Peña · Nov 15, 2019

Connect Oracle with InterSystems

Hello everyone, It is my first post in the community. Very recently I started working using IRIS, creating services with Cache. Today they gave me a new task and I'm really lost. How can I use an oracle database to create services using iris? Throughout the day I was looking for a guide to use a remote Oracle database. but unfortunately I only managed the connection in SQL Gateway Yes, no problem.I must create a very simple service. I should only use a procedure that is already created in the Oracle database.I must use that procedure and do a rest service. You can map an Oracle Stored procedure to IRIS method using the SQL Gateway. Once the mapping is done, you can expose it with a service or any other means IRIS provides. Hello, I thought I achieved the connection with the oracle, I was able to call the procedure, but now when I have the procedure in sql, it doesn't throw any data at me. The procedure does not work Could you give us a bit more details? What kind of services you should create with IRIS and why from Oracle, or how? Have you used JDBC drivers before? I have a couple of connections that I have created through JDBC to connect to Oracle to pull data from an Oracle table to create an HL7 message. Currently we are using the Oracle JDBC driver to connect to the Oracle system.
Question
Oliver Wilms · Nov 28, 2019

InterSystems Cache DSN

Hello, I work with Ensemble Business Operation with SQL Outbound Adapter. I try to query a DSN defined database that happens to be Cache on the same machine in the same instance of Healthshare 2017.1.3. This worked fine on Linux server when I used JDBC driver. Now I want to run it on my Windows 10 laptop. I set up DSN and I can test connection successfully. I provided DSN in Operation DSN setting and I tried with and without Credential. I get ERROR <Ensd>ErrOutConnectFailed: ODBC Connect failed for 'myDSN' / 'myDSN' with error ERROR #6022: Gateway failed: DSN/User Connect. I tried to set up SQL Gateway Connection. I choose ODBC. I only see two DSN which were created by install for Samples and User databases. Any advice is welcome and will be appreciated. I believe I need System DSN, not User DSN. How do I create System DSN? I need to run Control Panel as Administartor? It does not allow me... System DSN and Credential was required. Now it works without error. Thank you You are on the right way.It has to be a SYSTEM DSN. in win10 clich to startthen click the GEAR symbolnext search for ODBC and you should be there. OR search from WINDOWS control panel -> administration -> ODBC data sources (64bit) -> System DSN
Question
David Foard · Jun 5, 2019

InterSystems integration with Kafka

Has anyone done any integration with Kafka, especially prior to IRIS? If yes what was your experience such as specific pain points to be overcome. David If you are planning to implement an interface with Kafka, I suggest reading the following:https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=EJVG_instructions#EJVG_instructions_operationhttps://community.intersystems.com/post/ensemble-rabbitmq-java-client-quick-start-guideWhen it comes to specific pain, there are just a lot of pieces to maintain compared to common interfaces, such as HL7, etc.Also, if you plan to send a large volume of messages, you'll have to do that asynchronously. The problem with that is you may send 100 or even 1000 messages before you realize there is a connection or other problem. You'll have to think of a way to keep track of what messages have been sent successfully and which didn't, and requeue messages that have failed. Of course, if you are not worried about "losing" messages, that's not an issue.
Announcement
Evgeny Shvarov · May 21, 2019

InterSystems Developers in Spanish!

Hi Community!I'm pleased to announce the official start of InterSystems Developer Community in Spanish!Here is the landing page which describes the thing:Also, you can switch between sites using two language buttons in the top right corner.So!If you know Spanish welcome to contribute articles, discuss articles and answer questions about InterSystems data platforms now in Spanish too!Also!If you posted an article in English it could be translated by anyone in Spanish and will be helpful for even more people! Check the translation guide.And! You can expand the audience and translate your question into another language - just click the "Es" switcher in your English question and proceed with translation - the translated question will be generated in another language. For Example: And let me introduce you @David.Reche from InterSystems Iberia office as creator and now as a manager of InterSystems Developer Community in Spanish!Don't hesitate to provide your feedback to David how to make Spanish InterSystems community better!Welcome to InterSystems Developers Community in Spanish, and stay tuned! Congratulations to all Spanish community and, in particular, congratulations to @David.Reche for this great work.Muchas gracias When will Russian language support be available? Hi Vitaly! Thanks for the idea! Please submit a task and vote for it. If we have a lot of votes will consider to add it. I have one problem with it - if we introduce Russian Community, will you stop answering questions in English? ) If we have a lot of votes will consider to add it. Do we still have to vote for this? On-my enough one moreover, that moderators (you and Dmitry) and engineers InterSystems (Eduard, Alexander, Anton, Sergey, Anastasia, Timur, etc.) - Russian-speaking. I have one problem with it - if we introduce Russian Community, will you stop answering questions in English?) 1. I here like writing code more than words. 2. It will depend on who is asking.
Article
Evgeny Shvarov · Nov 26, 2018

InterSystems Best Practices

Hi Community!We are introducing a new feature on DC site - Best Practices of InterSystems Data Platforms.It is the tag, which highlights articles on DC considered as Best Practices on how to develop, test, deploy and manage solutions on InterSystems Data Platforms. Why do we do this?You often asked us(InterSystems) what is the attitude to different posts on DC? How to distinguish posts with InterSystems message for developers from "just thoughts"? Actually, you can subscribe to Product Managers and Technology architects directly, but we must admit that there are a lot of articles from Community members which have tons of experience, bright solutions, and knowledge and which are in fact the Best Practices for InterSystems Data Platforms. And we want to highlight this content.Who makes the decision? We established a council of InterSystems Product Managers and Technology Architects who review articles and decide on whether it is considered as InterSystems Best Practice.What posts will be reviewed?All articles and some questions on DC which have best practices answers.How often will we see new Best Practices on DC?Every week we'll tag a new Best Practices article. You can get the notification about it if you subscribe to Best Practice tag page. Also we'll put a comment to the post from DC administration that it is selected as Best Practices.When will we start?We already started. Subscribe to the tag and stay tuned!And we are waiting for your InterSystems Best Practices article! Consider adding @Sascha.Kisser article on [DeepSee troubleshooting](https://community.intersystems.com/post/deepsee-troubleshooting-guide) Great point, Alexander! It's in a queue. Hi Evgeny,this looks great,could we also hv one in CN DC?Thx! Michael @Evgeny.Shvarov Hi... I'm not a programmer, I work with QA. And I see development-related issues everyday as basic functionality bugs and also related to specification, spelling and so on. In a way, could I write something along these lines? Of care we should have when developing? Hi Andre! Yes, sure, give it a try Thanks @Evgeny.Shvarov. I will try it. And thanks for the opportunity. Hello again Evgeny Shvarov. It's done. Where can I put a preview of my article so you, or someone else, could read it before I get embarrassed. Feel free to create a draft here and send the link to @Evgeny.Shvarov. Hi everyone... My name is André Larsen Barbosa, known “popularly” as Larsen. Unlike most community members, I'm not a programmer, and in fact, I don't like programming at all. Yes, there are other areas in IT besides these. Come on, I believe all of you developers do testing after development, right? Or are they so confident that they believe they can't make mistakes? Or, do they wait for the problem to appear in the user? Then just launch an update and fix or undo this mistake. So, that's exactly where we work with quality (well, everyone should work with quality), but I'm referring to a specific area, which is QA, or Quality Assurance. When I talk about this, at the same time, I know that there are many companies that already work in this way, with very specific departments and with a somewhat rigid process. However, we also know that many are self-employed, independent programmers, who perhaps, and only perhaps, have not had or do not have this opportunity, which I tell you, is unique. No, I don't want to convert anyone, but I'm sure if you've read this far, you'll think about it. What is quality software? Only software that doesn't give an error when opening it? Is it fast software? Cheap? Simple? Who meets what has been proposed? Which meets the customer's needs? Well, we have a lot of possibilities, but, I tell you all, when we talk about customers, they certainly expect all these questions to be answered by the software you've developed. And I go further, it's not just the code used, if it's clear, if it has comments, if it follows some rules and basic concepts. This is just part of the process, which crosses some boundaries and affects many areas. Process, there is a very important word for the “acquisition” of quality in a project. So, how to achieve the expected result if we don't get a satisfactory interview with the client? Therefore, we will not know exactly what to build. How can we do something with quality if we don't participate in the negotiation of deadlines? Thus, it is true to say that quality must be involved throughout the entire process. I'm not saying that it's a rule and that if it doesn't, it won't work, but it will positively influence this participation. With one more interesting point mentioned, which in fact is software (and here I open to any and all work that can be done, whether it is software, building a house, a cake recipe, anyway, anything, once that Quality, or the concept of quality is universal) of quality? It is very subjective to speak, but, thinking of a way to translate this, we would have something like: “The totality of characteristics of a product or service that can satisfy a certain need of a certain customer. And it is achieved through the permanent search for better results based on the best performance of each of the elements of a process, always oriented towards the customer, meeting their needs and above all exceeding their expectations.” What motivated me to do this article (if I can afford to call it that)? You would be surprised by the absurdities we see. It's about losing sleep. Hi Andre I have read your article and I think that it is worthy of being included in this thread as you speak many truths. I am sure that many people work with technology, from the Customer Project Managers, the Business Analysts, the Team Leaders, the Scrum Master, the Senior Developers, Junior Developers, Testers, Customer UAT testers, and ultimately the Users of the resultant Technology Solution who view their role in the chain with Blinkers and work on the basis that as long as they do their job properly (and that is a word that can mean many different things) and are either unconcerned about the people who fill the other roles in the chain or view them as a necessary evil. But I also believe that there are technologists who are very conscious of the fact that they are an important element in the overall delivery of a solution. It is very rare to find people who can wear the hat of all of the players in this chain. I have met maybe 3 people in my entire career who just stood head and shoulders above everyone else in their ability to communicate and understand the needs and requirements of the customer, translate those requirements into a set of tasks for the Business Analysts to prioritize, document, create the project scope and timeline, write requirement specifications that can be understood by the customer and the development team, be able to sit with the senior developers and discuss the possible approaches to crafting a solution, who can clearly identify which tasks should be handled by the senior developers and those that should be delegated to the more junior developers, create testing plans for the testers and the documentation writers and ultimately guide the Customer UAT team through the stringent test scenarios to ensure that the application does what was requested, does not crash, does not present the user with an explosion of colour and animation and finally go back to the customer and get that all-important sign-off so that the invoicing and payments can be finalised. Some of us have been lucky enough to have been assigned to a project where we were able to interact with the customer, understand their business, understand their pain or their ambitions, then take that knowledge and produce the requirement specifications, technical process flows, choose the software elements, write the code that pulls all of the components into a functioning whole, documents their code such that future developers who have to work with that code can do so without messing it up because they are unaware that a statement in line 23 of 5000 lines will inadvertently cause the logic on line 2356 to take an unexpected step to the left and render the program unusable. Very few developers get to spend time with the quality assurance staff and ultimately the users who have to use the application to do their jobs and be able to go home without a blinding headache and a sense of dread that tomorrow they are going to have to fight with the application to get the printout or that all-important "Your data has been saved. Click OK to proceed" popup. I have seldom met a programmer who will concede that their code is not as good as the person coding next to them, or for that matter finding a developer who can gracefully and politely read some truly awful code of another developer and take the time to work with that bad developer and help them become a better programmer without inadvertently step on 1 f 20 emotional and ideological traps that arise in every one of these encounters. Or maybe I would use the analogy of the McDonalds Ice-cream specialist who was born to whip up the most perfect McFlurry who has to stand and watch a steady stream of ice-cream servers who don't give a damn and will be leaving in a month to go and pour soda at Wendy's. For the last 50 years software creators, whether they be individuals or technology companies, have discussed, and theorized, and consulted psychologists and time-management experts, and even astrologers to come up with the definitive guide to creating perfect, absolutely perfect, application. Entire libraries of books and templates and methodologies and Predictive Indicators intended to match the right person to the right role and despite those 50 years and the brilliant, practical, theorists and technologists who have contributed, with dedication and fervor to this topic, And yet, for every model that has emerged from these think tanks, 100 bad applications are spilling out the doors of the technology companies. And I haven't even started on the external forces, the project managers, the customer relations manager, the accountants, the middle managers, and worst of all the salesmen who, in just doing their jobs, manage to inflict sufficient damage to the 'plan' thus guaranteeing that the final product will be ....less. But then you encounter a group of people who have formed themselves into a community, a 'Developer Community', who come from a myriad of different backgrounds, skills, methodologies, personalities, and socio-economic, gender-based cultures who miraculously have one thing in common. They love to code. Their hearts soar when they interact with a user who says 'Thank you because of some modification that they have made that has made that user's life just that little bit better. And all of us have at some time or other written a bad piece of code or have struggled to fit into the 'TEAM', or had to deal with a salesman who has sold unrealistic solutions and unachievable timelines to a customer who in reality didn't actually know what they actually wanted to start with. We have seen it all, we have notched up successes and strive hard to forget the failures and yet we go to bed at night and we dream of tropical islands with dancers wrapped in fine silks with pet tigers on leads and woken up the following morning with 5 pages of code written vividly on the insides of their skulls and in a blinding flash of light they know that they have cracked it. The mists of possibilities and uncertainties and intrusions and indecision that has plagued them for the previous 4 weeks have overnight coalesced into the 'Perfect' solution. Their fingers are already tapping at their laptops as they eat their breakfast and for the next 8, 18, 80 hours magic flows from their fingers into that IDE that is the interface between their imagination and the architecture that will swallow up their code and compile it into the module and voila! It's done, and it's beautiful. And then we go home and get up the next day and do it all again. And as we create solutions we come to our community and we bounce ideas off each other, we seek out the nuggets of knowledge and experience from our friends who went through the process of being the first person to master a technique or understand a piece of functionality that is almost incomprehensible to most of us because or minds might not be wired in such a way that understanding that functionality was as easy as watching the Eurovision song contest without crying. What we all share in common though are years and years of tuning our coding styles, learning and absorbing emerging technologies, developing the skills to share our knowledge with the people we work with without making them run from the room sobbing because you have been too brutal in your appraisal of their work and it is through a community like ours that so many of us have become the skilled and dedicated developers that we are. What I do know is that generally speaking, I have met more developers who have been able to help the Business Analysts understand the requirements, ask the right questions of the customer to find out what they actually need, pacify the project managers that their agile, and scrum, and Jira, and storyboards will get to the finish line without incurring penalties for late delivery. Who find the time to document their code knowing that no matter how well it is written it is going to take another developer some time to work out what you have written and how it fits into the bigger picture and finally, one day, they get to meet the user who is using that application who turns round and comments that this application has helped them get their work done quickly and efficiently, that doesn't shower them with pompous popups asking them how they could be so stupid to put a text letter into a numeric field. We may not be able to ensure that every element in the chain is going to work as expected and that ideas and requirements don't occasionally get twisted in translation nor make every single user equally happy but we can control the space that we occupy and we know what we are doing and we have adopted different coding styles over the years and we find our selves at a point where we believe that we can layout a template, a structure, a developers ethical code and produce a set of standards and conventions on which we all (give or take) agree, if followed, will stand a chance of guaranteeing that the programs we write work, are readable and maintainable and when fitted into the whole will generate an application that works, is good, beautiful even. We take pride in our community. We welcome the input of the outside world, we like to learn and experiment and listen to the experiences of our comrades and when we are in Boston we will gather in a fairly dark room and drink a little too much and listen and watch as one of ours demonstrates his latest little app or tool or plugin and it makes us happy and we feel very much at home. Nigel. Hi Nigel, despite your tone of vengeance, I agree with you, I know the ability that developers have and that in many cases, they know much more than the user, or even anyone else who claims to know the process. And if it generated this feeling, I'm sorry, it wasn't the idea, and yes, it's good to have a different view. At the same time, you agree with me that this look from the outside also influences, no? And, I saw in your text a good part of the questions that I live in my work. I can only thank you for your "comment" and apologize if it was too general and offended you as a whole. At the same time, I believe that we have different views and that uniting them is certainly beneficial. So thanks and sorry. And these discussions, in my opinion, are very healthy and provide growth. Hi Andre, I would like to apologise if the tone of my reply came across as vengeful,, that was certainly not my intention. An hour ago I started writing a response where I took two examples from documentaries that I had watched during these long Covid Lockdown hours. One was about the production of a single Rolls Royce car and the amount of time, craftsmanship, quality control, pride and perfection that goes into the manufacture of each car. Each component is crafted by an individual who has practised his art over decades of trial and error. If the component has the slightest 'fault', quite often some imperfection that 99% of the population would not notice but the man who crafted the component and the quality control manager did notice and the item would be scrapped and the process would start all over again and I guess that it is for that reason that the best Rolls Royce cars sell for around $12 million. Probably half of that cost goes into those discarded items that did not meet the standard of quality that Rolls Royce prides itself in. The second documentary was about the ice cream machines that franchise owners of McDonald's restaurants have to buy when they buy a McDonald's restaurant and how those machines have a very complicated cleaning program, which, should it fail, renders the machine unusable until a certified mechanic is called out to come and fix the machine. The mechanics are certified by the manufacturers of the ice cream machines and the rates they charge are high and in the food business where profit margins are slim is easy to understand why roughly one-third of McDonald's restaurants in the USA are not serving ice cream as the machine is 'broken'. 25% of the companies revenue is derived from the 'services' of their mechanics. The company could probably make an ice cream machine that doesn't break down but to do so would eliminate 25% of their revenue. It just so happens that the company that makes the ice cream machines are located in the same city as McDonald's headquarters and they have had a 50-year relationship where McDonald's earn a certain amount of revenue through the sales of the ice cream machines and the ice cream machine manufacturer earns 25% of their revenue by supplying machines that in a sense are designed to fail periodically. It also turns out that both McDonald's and the ice cream manufacturer are owned by a nameless holding company. In the original version of this reply I went into far greater detail about each documentary and then two things happened. For the last month I have been using a program called Grammarly which, in the free version, will do basic spelling checks and other gramatical errors but in the paid version it will analyse your text and using fairly sophisticated algorithms will score your text against 10 different criteria and make suggestions, very good suggestions, as to how a paragraph could be rephrased as the original is too verbose or is too passive or aggressive and so on. I suspect that if I had run my original message it would have detected that the tone was a bit 'vengeful' and would have suggested ways that I could express the concepts I was trying to convey in a more palatable manner. The other thing that happened is I accidentally hit the back page button and I lost all of the text that I had written and so I rewrote it and given that I didn't have an hour to write out all of the detail in my original I ended up writing this text instead. Grammarly tells me that I score 5/5 for Informal, 4/5 for optimistic and 3/5 for confidence. I guess the last one, confidence, is due to the fact that I haven't yet linked the messages behind the documentaries to the subject of software. I have worked in software companies that have been in business for 30 years or so and there were people and practices within those companies that led to a certain sense of 'we do it like this because we have always done it like this'. That can work in two ways, if you happen to have worked out a formula where all of the constituent parts are tried and tested and produce a certain level of excellence then that software company is likely to produce good applications and will continue in business for many years to come. Somewhere in those companies you are likely to find individuals who take great pride in their work and that sense of excellence influences those around that person and challenges them to aim for the same levels of excellence. On the otherhand it can lead to a company that started off with an innovative product that sold well and as a result they have applied the same standard to everything that they have done thereafter irrespective of changes in technology or fresh ideas brought in by new employees but eventually fail as the software they produce is no longer innovative and probably fails periodically requiring a 'sotware expert' to come on site and fix it. It is a fine balance to maintain. Companies cannot just change the way that they do things at the say so of some fresh employee with bright ideas. Nor can they remain stuck in a certain well trodden path because eventually they will be left behind as other younger and more adventurous companies enter the market with their innovative products and steal the lime light. Excellence comes at a price. Those individuals who have taken their craft seriously and have become masters in their trade do not come cheap. Companies that try and produce excelllence using people with fewer skills and a willingness to work for lower wages are likely to produce poor software. The art is in matching the right people for the right tasks. Investing in the areas that demand excellence whilst not ignoring the role of the often overlooked managers who hold the whole enterprise together with their stoic reliance on repetative tasks. At this point Grammarly is telling me that I have said enough. My ratings are now showing 5/5 for Optimistic and Confident and 5/5 for Formal as opposed to 5/5 for informal that it scored me half way through the text. Yours respectfully Nigel @Evgeny.Shvarov can we add a same Chinese tag in CN DC? Thx!
Announcement
Evgeny Shvarov · Nov 26, 2018

InterSystems IRIS on AWS

Hi Community! I'm pleased to share the announcement that InterSystems IRIS Data Platform is available on Amazon Web Services marketplace! Few details: Version: InterSystems IRIS 2018.2 Preview; OS: Ubuntu 18.04 LTS; License: BYOL. Ease deploying your InterSystems IRIS cloud solutions now on AWS! Stay tuned! Hi Evgeny,Any new on when the Community Edition of IRIS will be available ?Steve As it was announced on Global Summit it should happen in November. We have at least one more week of November. So, stay tuned )
Article
Sylvain Guilbaud · Sep 25, 2023

InterSystems IRIS trainings

Hi Community, to learn quickly and in total autonomy on IRIS, I offer you some links which can help you in this beautiful bicycle ride rich in discoveries: InterSystems Developer Hub​​​​​​ Full Stack Tutorial Build the IT infrastructure for a company that roasts and sells coffee. See how InterSystems IRIS can serve as your IT architecture backbone REST + Angular Application Build a simple URL bookmarking app using InterSystems IRIS, REST service engine, and the Angular web framework Apply Machine Learning Create, train, validate and use prediction models for hospital readmissions based on a publicly available historical database InterSystems Interoperability Test drive our integration framework for connecting systems easily and developing interoperable applications. Getting Started with InterSystems ObjectScript Developing in ObjectScript with Visual Studio Code Building a Server-Side Application with InterSystems Getting Started with InterSystems IRIS for Coders Managing InterSystems IRIS for Developers InterSystems IRIS Management Basics Predicting Outcomes with IntegratedML in InterSystems IRIS Writing Applications Using Angular and InterSystems IRIS Writing Python Applications with InterSystems Configuring InterSystems IRIS Applications for Client Access Connecting Java Applications to InterSystems Products Connecting .NET Applications to InterSystems Products Connecting Node.js Applications to InterSystems Products Analyzing Data with InterSystems IRIS BI Building Business Integrations with InterSystems IRIS Building Custom Integrations If you want to get started with your own local IRIS instance, I recommend using our templates available at OpenExchange : intersystems-iris-dev-template iris-interoperability-template iris-embedded-python-template iris-fullstack-template iris-analytics-template Thanks @Sylvain.Guilbaud This is pretty useful. This is a great list of resources for the beginners! I think would be great to expand the first link, which contains 4 interactive in-browser tutorials Thanks for the advice @Dmitry.Maslennikov I added direct links to the 4 subsections wow! amazing guide for beginners 🤩 thank you, @Sylvain.Guilbaud!!