Search

Clear filter
Announcement
Bob Kuszewski · Apr 1, 2022

Using InterSystems IRIS containers with Docker 20.10.14+

Docker 20.10.14 (released March 23, 2022) changes the Linux capabilities given to containers in a manner that is incompatible with the Linux capability checker in InterSystems IRIS 2021.1 (and up) containers. Users running Docker 20.10.14 on Linux will find that IRIS 2021.1+ containers will fail to start and the logs will incorrectly report that required Linux capabilities are missing. For example: [ERROR] Required Linux capability cap_setuid is missing. [ERROR] Required Linux capability cap_dac_override is missing. [ERROR] Required Linux capability cap_fowner is missing. [ERROR] Required Linux capability cap_setgid is missing. [ERROR] Required Linux capability cap_kill is missing. [FATAL] Your IRIS container is missing one or more required Linux capabilities. Resolution Users experiencing this problem will need to adjust the command line passed to the container’s entrypoint to disable checking for Linux capabilities. From the command line, add --check-caps false after the image in your docker run or docker start command. For example: docker run containers.intersystems.com/intersystems/iris-community:2022.1.0.152.0 --check-caps false If you're using docker-compose, the corresponding change would be as follows: command: --check-caps false The capability check acts as a way of checking for common misconfigurations before starting the IRIS processes. Disabling the Linux capability check has no impact on the IRIS processes running in the container. More Reading Docker 20.10.14 release notes Running InterSystems Products in Containers In the docker-compose file the command is still command: --check-caps false If the = is left in the command the following error will be returned PARSE ERROR: Argument: --check-caps=false iris_1 | Couldn't find match for argument | Brief USAGE: iris_1 | /iris-main [--ISCAgentPort <integer>] [--ISCAgent <bool>] [--check-caps iris_1 | <bool>] [-k <license key>] [-L <<licenseID> <host1>,<port1>[ iris_1 | ,<dir1>] [<host2>,<port2>[,<dir2>]]>] [-p <password file>] iris_1 | [-t <command>] [-c <command>] [-e <command>] [-a <command>] iris_1 | [-b <command>] [-l <log file>] [-s <bool>] [-u <bool>] [-d iris_1 | <bool>] [-i <instance>] [--] [--version] [-h] iris_1 | iris_1 | For complete USAGE and HELP type: iris_1 | /iris-main --help Thanks Bob for the timely post. If you're using IKO, you can pass the "--check-caps false" argument in your iriscluster yaml like this: apiVersion: intersystems.com/v1alpha1 kind: IrisCluster metadata: name: ephelps-1 spec: licenseKeySecret: name: license-key configSource: name: iris-cpf imagePullSecrets: - name: docker-secret updateStrategy: type: RollingUpdate topology: data: mirrored: true shards: 1 image: containers.intersystems.com/intersystems/iris:2021.2.0.651.0 podTemplate: spec: args: - --check-caps - "false" serviceTemplate: spec: type: LoadBalancer externalTrafficPolicy: Local version: '3.6' services: iris: build: context: . dockerfile: Dockerfile restart: always command: --check-caps false ports: - 1972 - 52773:52773 - 53773 volumes: - ./:/irisrun/repo Using cap-add might allow for a more fine-grained control: --cap-add SETUID --cap-add DAC_OVERRIDE --cap-add FOWNER --cap-add SETGID --cap-add KILL Or in docker compose: version: '2' services: iris: cap_add: - SETUID - DAC_OVERRIDE - FOWNER - SETGID - KILL Please, next time, when you spontaneously add flags and remove flags or features that prevent starting IRIS in Docker, think about end-users, who would need, to run different versions of IRIS, it makes it more complicated to follow all those changes. One version does not work with flags, another does not work with this flag. We need something more stable. When I need to configure the CI process for multiple versions, now I should somehow decide which version has this flag and which has not. How would I go about creating an image using a Dockerfile that is based on one of these images? How can I get the docker build to include the --check-cap false? Hi Mike! You can check this or that example, the simplest dockerfiles with IRIS. The command with check-caps false can be found e.g. here in Docker-compose Glad this was the first Google result for "docker required linux capability is missing"
Announcement
Vita Tsareva · Jul 29, 2022

The First Demo Day of InterSystems FHIR Startup Incubator — Caelestinus

Hi Community! We’re so glad to announce that InterSystems FHIR startup incubator — Caelestinus held its first virtual Demo Day on June 29th! 16 startups have showed off their products and solutions built with InterSystems FHIR Server, or IRIS for Health or Health Connect to an audience of about 15 investors & partners. The Demo Day is the result of a four-month journey — the equator of the incubator, in which startups have explored InterSystems tech, validated their ideas and presented it on the first Demo Day. In case you missed it, enjoy watching it on InterSystems Developers YouTube: 📣 The First Demo Day of InterSystems FHIR Startup Incubator — Caelestinus Here is the list of presenters with pitch decks of the startups. 🤩 We're very proud of progress that startups made in such a short time! Enjoy watching and stay tuned!
Announcement
Anastasia Dyubaylo · Sep 12, 2022

Time to vote in InterSystems Interoperability Contest: Building Sustainable Solutions

Hi Community, It's voting time! Cast your votes for the best applications in our Interoperability Programming Contest focused on building sustainable solutions: 🔥 VOTE FOR THE BEST APPS 🔥 How to vote? Details below. Experts nomination: InterSystems experienced jury will choose the best apps to nominate the prizes in the Experts Nomination. Please welcome our experts: ⭐️ @akoblov, Support Specialist⭐️ @Alex.Woodhead, Technical Specialist⭐️ @Guillaume.Rongier7183, Sales Engineer⭐️ @Alberto.Fuentes, Sales Engineer⭐️ @Dmitry.Zasypkin, Senior Sales Engineer⭐️ @Daniel.Kutac, Senior Sales Engineer⭐️ @Eduard.Lebedyuk, Senior Cloud Engineer⭐️ @Steve.Pisani, Senior Solution Architect⭐️ @James.MacKeith, Principal Systems Developer⭐️ @Nicholai.Mitchko, Manager, Solution Partner Sales Engineering⭐️ @Timothy.Leavitt, Development Manager⭐️ @Benjamin.DeBoe, Product Manager⭐️ @Robert.Kuszewski, Product Manager⭐️ @Stefan.Wittmann, Product Manager⭐️ @Raj.Singh5479, Product Manager⭐️ @Jeffrey.Fried, Director of Product Management⭐️ @Evgeny.Shvarov, Developer Ecosystem Manager Community nomination: For each user, a higher score is selected from two categories below: Conditions Place 1st 2nd 3rd If you have an article posted on DC and an app uploaded to Open Exchange (OEX) 9 6 3 If you have at least 1 article posted on DC or 1 app uploaded to OEX 6 4 2 If you make any valid contribution to DC (posted a comment/question, etc.) 3 2 1 Level Place 1st 2nd 3rd VIP Global Masters level or ISC Product Managers 15 10 5 Ambassador GM level 12 8 4 Expert GM level or DC Moderators 9 6 3 Specialist GM level 6 4 2 Advocate GM level or ISC Employees 3 2 1 Blind vote! The number of votes for each app will be hidden from everyone. Once a day we will publish the leaderboard in the comments to this post. The order of projects on the contest page will be as follows: the earlier an application was submitted to the competition, the higher it will be in the list. P.S. Don't forget to subscribe to this post (click on the bell icon) to be notified of new comments. To take part in the voting, you need: Sign in to Open Exchange – DC credentials will work. Make any valid contribution to the Developer Community – answer or ask questions, write an article, contribute applications on Open Exchange – and you'll be able to vote. Check this post on the options to make helpful contributions to the Developer Community. If you changed your mind, cancel the choice and give your vote to another application! Support the application you like! Note: contest participants are allowed to fix the bugs and make improvements to their applications during the voting week, so don't miss and subscribe to application releases! Since the beginning of the voting we have the results: Expert Nomination, Top 5 Sustainable Machine Learning by @Lucas.Enard2487 n8n-nodes-iris by @Dmitry.Maslennikov iris-energy-isodata by @Muhammad.Waseem samba-iris-adapter by @Yuri.Gomes iris-megazord by @José.Pereira ➡️ Voting is here. Community Nomination, Top 5 iris-megazord by @José.Pereira Sustainable Machine Learning by @Lucas.Enard2487 iris-energy-isodata by @Muhammad.Waseem n8n-nodes-iris by @Dmitry.Maslennikov samba-iris-adapter by @Yuri.Gomes ➡️ Voting is here. So, the voting continues. Please support the application you like! Hi, Developers! Here are the results after two days of voting: Expert Nomination, Top 5 Sustainable Machine Learning by @Lucas Enard n8n-nodes-iris by @Dmitry Maslennikov iris-energy-isodata by @Muhammad Waseem samba-iris-adapter by @Yuri Marx iris-megazord by @José Roberto Pereira ➡️ Voting is here. Community Nomination, Top 5 iris-megazord by @José Roberto Pereira Sustainable Machine Learning by @Lucas Enard iris-energy-isodata by @Muhammad Waseem samba-iris-adapter by @Yuri Marx n8n-nodes-iris by @Dmitry Maslennikov ➡️ Voting is here. Please support our participants with your vote! 😊 Voting for the InterSystems Interoperability Contest goes ahead! And here're the results at the moment: Expert Nomination, Top 5 Sustainable Machine Learning by @Lucas Enard iris-energy-isodata by @Muhammad Waseem n8n-nodes-iris by @Dmitry Maslennikov Recycler by @Oleh.Dontsov samba-iris-adapter by @Yuri Marx ➡️ Voting is here. Community Nomination, Top 5 iris-megazord by @José Roberto Pereira Sustainable Machine Learning by @Lucas Enard iris-energy-isodata by @Muhammad Waseem samba-iris-adapter by @Yuri Marx Recycler by @Oleh.Dontsov ➡️ Voting is here. Please check out today's voting results: Expert Nomination, Top 5 Sustainable Machine Learning by @Lucas Enard iris-energy-isodata by @Muhammad Waseem iris-megazord by @José Roberto Pereira samba-iris-adapter by @Yuri.Gomes n8n-nodes-iris by @Dmitry Maslennikov ➡️ Voting is here. Community Nomination, Top 5 iris-megazord by @José Roberto Pereira Sustainable Machine Learning by @Lucas Enard iris-energy-isodata by @Muhammad Waseem n8n-nodes-iris by @Dmitry Maslennikov samba-iris-adapter by @Yuri.Gomes ➡️ Voting is here. Keep voting!Our participants need your support! Last day of voting! ⌛ Please check out the Contest Board.Our contestants need your votes! 📢
Announcement
Anastasia Dyubaylo · Sep 20, 2022

Give us your Feedback on InterSystems Interoperability Contest 2022

Hey Community, We greatly appreciate all your feedback on the InterSystems Interoperability Contest! Please take a short survey and answer a few questions to help us improve our contests. 👉 Quick survey: Interoperability Contest Survey 2022 Feel free to share your feedback in the comments of this post as well!
Announcement
Anastasia Dyubaylo · Jul 28, 2022

Extra Bonuses for InterSystems Tech Article Contest: Python Edition

Hey Community! Here are the bonuses for participants' articles that take part in InterSystems Tech Article Contest: Python Edition: Article Topic (5) Video (3) Discussion (1) Translation (1) New member (3) Total points Working with Globals in Embedded Python + + + + 10 Accessing Management Portal System Dashboard information and display cache table data on the web page with the help of embedded python + + 6 IRIS Climate Change application that shows how temperature is increasing worldwide as a proof of global warming + + 6 Time zone conversion utility using embedded python + + + 9 IRIS Embedded Python with Azure Service Bus (ASB) use case + + 8 Create Stored Procedures using Embedded Python + 5 Getting known with Django + + 6 Getting known with Django part 2 + 5 Introduction to Web Scraping with Python - lets Extract some Job Data + + + 9 Dealing with large content in Python Native API + + + 9 Concept for Human Face Detection and Understand their Feeling Using Python + + 4 Getting known with Django part 3 + 5 Bonuses are subject to change upon the update. Please claim your bonuses here in the comments below! Hi @Anastasia.Dyubaylo Thanks for sharing the points.Both of the articles "Accessing Management Portal System Dashboard information and display cache table data on the web page with the help of embedded python" and "IRIS Climate Change application that shows how temperature is increasing worldwide as a proof of global warming" are using "Embedded Python", wondering why Topic points are not awarded?Looking forward Thanks Added to your article ;) Thanks for noticing @Muhammad.Waseem! Thanks @Anastasia.Dyubaylo
Announcement
Evgeny Shvarov · Mar 21, 2022

Technical Bonuses for InterSystems IRIS Globals Programming Contest 2022

Hi Developers! Here're the technology bonuses for the InterSystems IRIS Globals Contest 2022 that will give you extra points in the voting: Data-model implementation - 5 Functional index implementation - 5 Data Move usage - 3 Embedded Python - 4 Docker container usage - 2 ZPM Package deployment - 2 Online Demo - 2 First Article on Developer Community - 2 Second Article On DC - 1 Code Quality pass - 1 Video on YouTube - 3 See the details below. Data-model implementation - 5 pointsIntroduce an application that provides an API to implement any new to InterSystems IRIS data model. E.g. columnar data store, time-series database, graph datastore, document store, key-value database. An API should contain at least the options to create/alter entities metadata, insert/update/delete data, query data, index data. E.g. here is an example of iris-graph implementation (not finished and abandoned project). You are also welcome to fork it and finish the implementation for the contest. The implementation can also mimic any other database engine of such in IRIS, e.g. mimic MongoDB or Redis in IRIS. Examples: InterSystems IRIS as MongoDB InterSystems IRIS as Redis (Implementation 1, Implementation 2) The implementation should be "non-trivial" - e.g. CRUD API for key-value to globals will not be enough, but the implementation with the support of metadata management, indexing, and search/query will work. Functional Index Implementation - 5 points Introduce an implementation of Functional Index with globals and collect 5 extra points. Documenation. Example. Data Move usage -3 points DataMove is a powerful feature for moving data from one database to another in a live environment, but it operates at a fairly low level. Adding a layer around it for easy archiving of table data, an interface to keep track of (potentially large numbers of) subscript-level mappings, etc.. would be examples of helpful utilities in the big global space. Embedded Python - 4 points Use Embedded Python in your application and collect 4 extra points. You'll need at least InterSystems IRIS 2021.2 for it. Docker container usage - 2 points The application gets a 'Docker container' bonus if it uses InterSystems IRIS running in a docker container. Here is the simplest template to start from. ZPM Package deployment - 2 points You can collect the bonus if you build and publish the ZPM(InterSystems Package Manager) package for your Full-Stack application so it could be deployed with: zpm "install your-multi-model-solution" command on IRIS with ZPM client installed. ZPM client. Documentation. Online Demo of your project - 2 pointsCollect 2 more bonus points if you provision your project to the cloud as an online demo. You can do it on your own or you can use this template - here is an Example. Here is the video on how to use it. Article on Developer Community - 2 points Post an article on Developer Community that describes the features of your project and collect 2 points for the article. The Second article on Developer Community - 1 point You can collect one more bonus point for the second article or the translation regarding the application. The 3rd and more will not bring more points but the attention will all be yours. Code quality pass with zero bugs - 1 point Include the code quality Github action for code static control and make it show 0 bugs for ObjectScript. Video on YouTube - 3 points Make the Youtube video that demonstrates your product in action and collect 3 bonus points per each. The list of bonuses is subject to change. Stay tuned! Good luck in the competition! Things I mentioned in the kickoff webinar: %SQL.AbstractFind/%Library.FunctionalIndex implementations:Semantic version index:https://github.com/intersystems-community/zpm/blob/master/src/%25ZPM/General/SemanticVersion/Index.clshttps://github.com/intersystems-community/zpm/blob/master/src/%25ZPM/General/SemanticVersion/Find.clshttps://github.com/intersystems-community/zpm/blob/master/src/%25ZPM/Repo/Filesystem/Cache.clsSpatial index: https://github.com/intersystems-ru/spatialindexImage color index: https://openexchange.intersystems.com/package/iris-image-index-demoInspiration for a project:Implement a hierarchical index that operates on a table with a self-referential field (e.g., an employee table with a manager field) to return (via a %SQL.AbstractFind implementation) all records above (directly/indirectly), below (directly/indirectly), or in the same tree (or graph - need to consider circular references) as a given record. r we planing to add columnar/time-series/graph into IRIS?
Announcement
Anastasia Dyubaylo · Nov 4, 2022

[Kick-off Webinar] InterSystems FHIR for Women's Health Contest

Hey Community, We are glad to invite you to the upcoming kick-off webinar on the FHIR for Women's Health programming contest. FemTech (software for women’s health) is an integral part of modern healthcare delivery that individualizes care and encourages patient empowerment. The women’s digital health market is projected to continue to grow as we prioritize and de-stigmatize women’s health issues. In this webinar, we'll show you some of the general principles and problems of solving issues connected to women's health, as well as share some great ideas for your inspiration. As always, we’ll discuss and answer the questions on how to build solutions using InterSystems IRIS for Health. Date & Time: Monday, November 14 – 11:00 AM EDT Speakers: 🗣 @Aya.Heshmat, Product Specialist🗣 @Dean.Andrews2971, Head of Developer Relations 🗣 @Evgeny.Shvarov, InterSystems Developer Ecosystem Manager >> Register here << Hey Developers, Watch the recording of the Kick-off Webinar on InterSystems Developers YouTube: ⏯ [Kick-off Webinar] InterSystems FHIR for Women's Health Contest
Announcement
Evgeny Shvarov · Nov 12, 2022

Technology Bonuses for InterSystems IRIS for (Women's) Health Contest 2022

Hi Developers! Here're the technology bonuses for the InterSystems Women’s Health FHIR Contest 2022 that will give you extra points in the voting: Women’s Health Topic Women’s Health Dataset IRIS For Health FHIR or FHIR Cloud Server Usage Healthcare Interoperability Embedded Python usage Docker container usage ZPM Package Deployment Online Demo Code Quality pass Article on Developer Community The second article on Developer Community Video on YouTube First Time Contribution See the details below. Women’s Health Topic - 5 points Collect 5 bonus points if your application is helping with any Women’s Health problems solution. For example if your application can help pregnant patients discover trends in tracking pregnancy symptoms and/or build an integration to share symptoms and pregnancy journal notes with a partner application Women’s Health Dataset - 3 points Collect 3 bonus points if you submit a Women’s Health dataset into Open Exchange and use it in your application. Here are examples of datasets in Open Exchange: titanic, community posts, health datasets. Dataset should be a separate Open Exchange application. IRIS For Health or InterSystems FHIR Server Cloud Usage - 2 points Collect 2 bonus points if your solution uses FHIR server via IRIS for Health or InterSystems FHIR Server on AWS. Get IRIS For Health template with FHIR server running here. You can spin up your instance of FHIR server here. Healthcare Interoperability - 4 points Collect 4 bonus points if your application is healthcare interoperability solution that uses InterSystems Interoperability to transfer or/and transform healthcare data via messages or it uses healthcare formats data transformation. Here is an example of healthcare interoperability solution. Embedded Python - 3 points Use Embedded Python in your application and collect 3 extra points. You'll need at least InterSystems IRIS 2021.2 for it. Docker container usage - 2 points The application gets a 'Docker container' bonus if it uses InterSystems IRIS running in a docker container. Here is the simplest template to start from. ZPM Package deployment - 2 points You can collect the bonus if you build and publish the ZPM(ObjectScript Package Manager) package for your Full-Stack application so it could be deployed with: zpm "install your-multi-model-solution" command on IRIS with ZPM client installed. ZPM client. Documentation. Online Demo of your project - 2 pointsCollect 3 more bonus points if you provision your project to the cloud as an online demo. You can do it on your own or you can use this template - here is an Example. Here is the video on how to use it. Code quality pass with zero bugs - 1 point Include the code quality Github action for code static control and make it show 0 bugs for ObjectScript. Article on Developer Community - 2 points Post an article on Developer Community that describes the features of your project. Collect 2 points for each article. Translations to different languages work too. The Second article on Developer Community - 1 point You can collect one more bonus point for the second article or the translation regarding the application. The 3rd and more will not bring more points but the attention will all be yours. Video on YouTube - 3 points Make the Youtube video that demonstrates your product in action and collect 3 bonus points per each. Examples. First Time Contribution - 3 points Collect 3 bonus points if you participate in InterSystems Open Exchange contests for the first time! The list of bonuses is subject to change. Stay tuned! Good luck with the competition!
Announcement
Anastasia Dyubaylo · Dec 5, 2022

Winners of the InterSystems IRIS for Health Contest: FHIR for Women's Health

Hey Community, We are super excited to announce the winners of the InterSystems IRIS for Health Contest: FHIR for Women's Health! Thank you all for participating in our coding competition! Without further ado, the winners are... Experts Nomination 🥇 1st place and $5,000 go to the FemTech Reminder app by @KATSIARYNA.Shaustruk, @Maria.Gladkova, @Maria.Nesterenko 🥈 2nd place and $3,000 go to the Pregnancy Symptoms Tracker app by @José.Pereira, @Henrique, @henry 🥉 3rd place and $1,500 go to the Contest-FHIR app by @Lucas.Enard2487 🏅 4th place and $750 go to the fhir-healthy-pregnancy app by @Edmara.Francisco 🏅 5th place and $500 go to the iris-fhir-app app by @Oliver.Wilms More winners: 🏅 $100 go to the Dia-Bro-App app by @Dzmitry.Rabotkin, Maria Muzychuk, Maxim Eliseykin 🏅 $100 go to the NeuraHeart app by @Grzegorz.Koperwas 🏅 $100 go to the FHIR Questionnaires app by @Yuri.Gomes 🏅 $100 go to the Beat Savior app by @Jan.Skála 🏅 $100 go to the ehh2022-diabro app by @Maksym.Shcherban 🏅 $100 go to the Dexcom Board app by @Daniel.Šulc, Matěj Žídek, Tomáš Dorda Community Nomination 🥇 1st place and $1,000 go to the Pregnancy Symptoms Tracker app by @José.Pereira, @Henrique, @henry 🥈 2nd place and $750 go to the FemTech Reminder app by @KATSIARYNA.Shaustruk, @Maria.Gladkova, @Maria.Nesterenko 🥉 3rd place and $500 go to the fhir-healthy-pregnancy app by @Edmara.Francisco Our sincerest congratulations to all the participants and winners! Join the fun next time 😎 Congratulations everyone! Well done! Congratulations to the winners! Good Work Thank you all for this contest and for this opportunity! Congratulations everyone! Great contest with a lot of awesome new apps!
Article
Timothy Leavitt · Jun 4, 2020

AppS.REST - a new REST framework for InterSystems IRIS

Over the past year or so, my team (Application Services at InterSystems - tasked with building and maintaining many of our internal applications, and providing tools and best practices for other departmental applications) has embarked on a journey toward building Angular/REST-based user interfaces to existing applications originally built using CSP and/or Zen. This has presented an interesting challenge that may be familiar to many of you - building out new REST APIs to existing data models and business logic. As part of this process, we've built a new framework for REST APIs, which has been too useful to keep to ourselves. It is now available on the Open Exchange at https://openexchange.intersystems.com/package/apps-rest. Expect to see a few more articles about this over the coming weeks/months, but in the meanwhile, there are good tutorials in the project documentation on GitHub (https://github.com/intersystems/apps-rest). As an introduction, here are some of our design goals and intentions. Not all of these have been realized yet, but we're well on the way! Rapid Development and Deployment ​Our REST approach should provide the same quick start to application development that Zen does, solving the common problems while providing flexibility for application-specific specialized use cases. Exposing a new resource for REST access should be just as easy as exposing it a a Zen DataModel. Addition/modification of REST resources should involve changes at the level being accessed. Exposure of a persistent class over REST should be accomplished by inheritance and minimal overrides, but there should also be support for hand-coding equivalent functionality. (This is similar to %ZEN.DataModel.Adaptor and %ZEN.DataModel.ObjectDataModel.) Common patterns around error handling/reporting, serialization/deserialization, validation, etc. should not need to be reimplemented for each resource in each application. Support for SQL querying, filtering, and ordering, as well as advanced search capabilities and pagination, should be built-in, rather than reimplemented for each application. It should be easy to build REST APIs to existing API/library classmethods and class queries, as well as at the object level (CRUD). Security ​​Security is an affirmative decision at design/implementation time rather than an afterthought. When REST capabilities are gained by class inheritance, the default behavior should be to provide NO access to the resource until the developer actively specifies who should receive access and under what conditions. Standardized implementations of SQL-related features minimize the surface for SQL injection attacks. Design should take into consideration the OWASP API Top 10 (see: https://owasp.org/www-project-api-security) Sustainability ​Uniformity of application design is a powerful tool for an enterprise application ecosystem. Rather than accumulating a set of diverse hand-coded REST APIs and implementations, we should have similar-looking REST APIs throughout our portfolio. This uniformity should lead to: Common debugging techniques Common testing techniques Common UI techniques for connecting to REST APIs Ease of developing composite applications accessing multiple APIs The set of endpoints and format of object representations provided/accepted over REST should be well-defined, such that we can automatically generate API documentation (e.g., Swagger/OpenAPI) based on these endpoints. Based on industry-standard API documentation, we should be able to generate portions of client code (e.g., typescript classes corresponding to our REST representations) using third-party/industry-standard tools. Awesome! @Timothy.Leavitt this is amazing! I'll be making use of it in my application :) I was looking into the OpenExchange description, and in the Tutorial and User Guide, I think the links are broken. I got a "Not found" message when I try to access the URLs. https://openexchange.intersystems.com/docs/sample-phonebook.md https://openexchange.intersystems.com/docs/user-guide.md Thank you for your interest, and for pointing out that issue. I saw it after publishing and fixed it in GitHub right away. The Open Exchange updates from GitHub at midnight, so it should be all set now. minimum platform version of InterSystems IRIS 2018.1 Porting old apps with a framework available on new version of the platform (IRIS) only, no contradictions here? :) Is there something fundamental preventing the framework from being used on Cache too? Maybe I'm wrong, but the minimum requirement here it's because you don't have %JSON.Adaptor on Caché. The %JSON. Adaptor is missing in Caché but %JSON.Formatter was backported half a year ago. it is in OpenExchange available @Henrique is right - that's the reason for the minimum requirement. IMO, getting an old app running on the new version of the platform is a relatively small effort compared to a Zen -> Angular migration (for example). Hi @Timothy.Leavitt I'm testing the AppS.REST to create a new application, following the Tutorial and Sample steps in Github I created a Dispatch Class: Class NPM.REST.Handler Extends AppS.REST.Handler { ClassMethod AuthenticationStrategy() As %Dictionary.CacheClassname { Quit ##class(AppS.REST.Authentication.PlatformBased).%ClassName(1) } ClassMethod GetUserResource(pFullUserInfo As %DynamicObject) As AppS.REST.Authentication.PlatformUser { Quit ##class(AppS.REST.Authentication.PlatformUser).%New() } } And a simple persistent class: Class NPM.Model.Task Extends (%Persistent, %Populate, %JSON.Adaptor, AppS.REST.Model.Adaptor) { Parameter RESOURCENAME = "task"; Property RowID As %String(%JSONFIELDNAME = "_id", %JSONINCLUDE = "outputonly") [ Calculated, SqlComputeCode = {Set {*} = {%%ID}}, SqlComputed, Transient ]; Property TaskName As %String(%JSONFIELDNAME = "taskName"); /// Checks the user's permission for a particular operation on a particular record. /// <var>pOperation</var> may be one of: /// CREATE /// READ /// UPDATE /// DELETE /// QUERY /// ACTION:<action name> /// <var>pUserContext</var> is supplied by <method>GetUserContext</method> ClassMethod CheckPermission(pID As %String, pOperation As %String, pUserContext As AppS.REST.Authentication.PlatformUser) As %Boolean { Quit ((pOperation = "QUERY") || (pOperation = "READ") || (pOperation = "CREATE") || (pOperation = "UPDATE")) } } But when I try the REST API using Postman GET: http://localhost:52773/csp/npm-app-rest/api/task/1 I'm getting a 404 Not Found message. Am I doing something wrong or missing something? Thanks @Henrique , do you have a record with ID 1? If not, you can populate some data with the following (since you extend %Populate): Do ##class(NPM.Model.Task).Populate(10) Yes, I already populated the class. Give CSPSystem user access to the database with a REST broker. @Eduard.Lebedyuk is probably right on this. If you add auditing for <PROTECT> events you'll probably see one before the 404. I added auditing on everything, and the <PROTECT> error never showed up. So, I started everything from scratch and found out a typo on Postman. Thanks, @Eduard.Lebedyuk @Timothy.Leavitt PS: Sorry, guys. I think not sleeping enough hours isn't good for health and cause this kind of mistakes This is really cool, and we will be using this in a big way. But I have encountered an issue I can't fix. I took one of my data classes (Data.DocHead) and had it inherit from AppS.REST.Model.Adaptor and %JSON.Adaptor, set the RESOURCENAME and other things and tested using Postman and it worked perfectly! Excellent! Due to the need to have multiple endpoints for that class for different use cases, I figured I would set it up using the AppS.REST.Model.Proxy, so I created a new class for the Proxy, removed the inheritance in the data class (left %JSON.Adaptor), deleted the RESOURCENAME and other stuff in the data class. I used the same RESOURCENAME in the proxy that I had used in data class originally. I compiled the proxy class, and get the message: ERROR #5001: Resource 'dochead', media type 'application/json' is already in use by class Data.DocHead > ERROR #5090: An error has occurred while creating projection RestProxies.Data.DocHead:ResourceMap. I've recompiled the entire application with no luck. So there must be a resource defined somewhere that is holding dochead like it was still attached to Data.Dochead via a RESOURCENAME, but that parameter is not in that class anymore. How do I clear that resource so I can use it in the proxy? @Richard.Schilke, I'm glad to hear that you're planning on using this, and we're grateful for your feedback. Quick fix should just be: Do ##class(AppS.REST.ResourceMap).ModelClassDelete("Data.DocHead") Background: metadata on REST resources and actions is kept in the AppS.REST.ResourceMap and AppS.REST.ActionMap classes. These are maintained by projections and it seems there's an edge case where data isn't getting cleaned up properly. I've created a GitHub issue as a reminder to find and address the root cause: https://github.com/intersystems/apps-rest/issues/5 That did the trick - thank you so much! Best practice check: When I have a data class (like Data.DocHead) that will need multiple Mappings (Base, Expanded, Reports), then the recommended way is to use the proxy class and have a different proxy class for Data.DocHead for each mapping? For example, RESTProxies.Data.DocHead.Base.cls would be the proxy for the Base mapping in Data.DocHead, while RESTProxies.Data.DocHead.Expanded.cls would be the proxy for the Expanded mapping in Data.DocHead, etc. (the only difference might be the values for the JSONMAPPING and RESOURCENAME prameters)? I'm fine with that, just checking that you don't have some other clever way of doing that... @Timothy.Leavitt, I've run into another issue. The proxy is setup and working great for general GET access. But since my system is a multi-tenant, wide open queries are not a thing I can use, so I decided to try to use a defined class Query in the data class Lookups.Terms: Query ContactsForClientID(cClientOID As %String) As %SQLQuery{SELECT * FROM Lookups.TermsWHERE ClientID = :cClientOIDORDER BY TermsCode} Then I setup the Action Mapping in my proxy class RESTProxies.Lookups.Terms.Base: XData ActionMap [ XMLNamespace = "http://www.intersystems.com/apps/rest/action" ]{<actions xmlns="http://www.intersystems.com/apps/rest/action"><action name="byClientID" target="class" method="GET" modelClass="Lookups.Terms" query="Lookups.Terms:ContactsForClientID"><argument name="clientid" target="cClientOID" source="url"/></action></actions>} And I invoked this using this URL in a GET call using Postman (last part only): terms_base/$byClientID?clientid=290 And the result: 406 - Client browser does not accept the MIME type of the requested page. In the request, I verified that both Content-Type and Accept are set to application/json (snip from the Postman): So what have I missed? @Richard.Schilke , yes, having a separate proxy for each mapping would be best practice. You could also have Data.DocHead extend Adaptor for the primary use case and have proxies for the more niche cases (if one case is more significant - typically this would be the most complete representation). What's the MEDIATYPE parameter in Lookups.Terms (the model class)? The Accept header should be set to that. Also, you shouldn't need to set Content-Type on a GET, because you're not supplying any content in the request. (It's possible that it's throwing things off.) If you can reproduce a simple case independent of your code (that you'd be comfortable to share), feel free to file a GitHub issue and I'll try to knock it out soon. I'll also note - the only thing that really matters from the class query is the ID. If nothing else is using the query you could just change it to SELECT ID FROM ... - it'll constitute the model instances based on that. (This is handy because it allows reuse of class queries with different representations.) Good to know and, yes, very handy! Thank you! I posted an issue with my source to Github. Surfaced another issue this week-end. (I remember when I used to take week-ends off, but no whining!) So I have a multiple linked series of classes in Parent/Child relationships: DocHead->DocItems->DocItemsBOM->DocItemsBOMSerial So if I wanted to express all of this in a JSON object, I would need to make the "Default" mapping the one that exposes all the Child Properties, because it looks like I can't control the Mapping of the Child classes from the Parent class. This doesn't bother me, as I had already written a shell that does this, and your Proxy/Adaptor makes it work even better, but just wanted to check that the Parent can't tell the Child what Proxy the child should use to display its JSON. It's even more complicated than that, as sometimes I want to show DocHead->DocItems (and stop), while, in other Use Cases, I have to show DocHead, DocItems, and DocItemsBOM (and stop), while in other Use Cases, I need the entire stack. Thanks for posting - I'm taking a look now. This issue is starting to ring a bell; I think this looks like a bug we fixed in another branch internally to my team. (I've had reconciling the GitHub branch and our internal branch on my list for some time - I'll try to at least get this fix in, soon.) Re: customizing mappings of relationship/object properties, see https://docs.intersystems.com/healthconnectlatest/csp/docbook/Doc.View.cls?KEY=GJSON_adaptor#GJSON_adaptor_xdata_define - this is doable in %JSON.Adaptor mapping XData blocks via the Mapping attribute for an object-valued property included in the mapping. Wow - I think that means I can handle all my Use Cases with that capability. Nice! Thanks again! @Timothy.Leavitt , have you had a chance to see if this error I'm getting on Actions was resolved? @Richard.Schilke I'm planning to address it tomorrow or Friday. Keep an eye out for the next AppS.REST release on the Open Exchange - I'll reply again here too. (This will also include a fix for the other issue you reported; I've already merged a PR for that.) @Timothy.Leavitt , I will be looking for it. I'm trying to do something with a custom Header that I want to provide for the REST calls. Do I have access to the REST Header somewhere in the service that I can pull the values, like a %request? And in something of an edge case, we're calling these REST services from an existing ZEN application (for now as we start a slow pull away from Zen), so the ZEN app gets a %Session created for it, and then calls the REST service. It seems that Intersystems is managing the License by recognizing that the browser has a session cookie, and it doesn't burn a License for the REST call - that's very nice (but I do have a request in to the WRC about whether that is expected behavior or not so I don't get surprised if it gets "fixed"!). Does that mean your REST service can see that %Session, as that would be very helpful, since we store User/Multi-tenant ID, and other important things in there (the %Session, not the cookie). @Richard.Schilke - on further review, it's an issue with the Action map. See my response in https://github.com/intersystems/apps-rest/issues/7 (and thank you for filing the issue!). I'll still create a new release soon to pick up the projection bug you found. Regarding headers - you can reference %request anywhere in the REST model classes, it just breaks abstraction a bit. (And for the sake of unit testing, it would be good to behave reasonably if %request happens not to be defined, unless your planning on using Forgery or equivalent.) Regarding sessions - yes, you can share a session with a Zen application via a common session cookie path or using GroupById. You can reference this as needed as well, though I'd recommend wrapping any %session (or even %request) dependencies in the user context object that gets passed to CheckPermissions(). @Timothy.Leavitt - thanks so much for the response. The Action worked perfectly with your corrections! I will take your advice and work with the %session/headers in the context object, since that makes the most sense. What are the plans (if any) to enable features in a resultset such as pagination, filters, and sorting? Users are horrible, aren't they? No matter what good work you do, they always want more! I appreciate what you have done here, and it will save my company probably hundreds of hours of work, plus it is very elegant... @Richard.Schilke - great! We have support for filtering/sorting on the collection endpoints already, though perhaps not fully documented. Pagination is a challenge from a REST standpoint but I'd love to add support for it (perhaps in conjunction with "advanced search") at some point. I'm certainly open to ideas on the implementation there. :) Users are the best, because if you don't have them, it's all just pointlessly academic. ;) @Timothy.Leavitt - stuck again. I'm in ClassMethod UserInfo, and found out some interesting things. First off, I was wrong about the REST service using the session cookie from the Zen application when it is called from the Zen application. Displaying the %session.SessionId parameters for each call shows that they are all different, and not the same as the SessionId of the Zen application calling the REST service. So the idea that it holds a license for 10 seconds can't be correct, as it seems almost immediate. I run 20 REST calls to different endpoints in a loop, and I saw a single License increase. You said I should be able to expose the session cookie of the Zen application, but I don't see a way to do that either. I can't even find a way to see the header data in the UserInfo ClassMethod of the current REST call. Sorry to be a pest...but since you''re giving answers, I'll keep asking questions! Have a nice evening... @Richard.Schilke , you should be able to share a session by specifying the same CSP session cookie path for your REST web application and the web application(s) through which your Zen pages are accessed. Alternatively, you could assign the web applications the same GroupById in their web application configuration. You likely also need to configure your REST handler class (your subclass of AppS.REST.Handler) to use CSP sessions (from your earlier description, I assumed you had). This is done by overriding the UseSession class parameter and setting it to 1 (instead of the default 0). To reference header data in the UserInfo classmethod, you should just be able to use %request (an instance of %CSP.Request) and %response (an instance of %CSP.Response) as appropriate for request/response headers. 💡 This article is considered as InterSystems Data Platform Best Practice. How would the AppS.REST Handler co-exist with a 'Spec-first' approach, where the dispatch class should not be modified manually - only by re-importing the API spec? The AppS.REST user-guide states: 'To augment an existing REST API with AppS.REST features, forward a URL from your existing REST handler to this subclass of AppS.REST.Handler.' How would this work in practice with the above? Thanks in advance.
Announcement
Anastasia Dyubaylo · Sep 16, 2020

New Video: Get InterSystems IRIS from the Docker Store

Hi Community! Please welcome the new video on InterSystems Developers YouTube: ⏯ Get InterSystems IRIS from the Docker Store In this video, you'll learn how to navigate to the InterSystems IRIS listing on the Docker Store and pull a Community Edition image. ⬇️ InterSystems IRIS Community Edition on Docker Enjoy and stay tuned! 👍🏼
Announcement
Anastasia Dyubaylo · Apr 28, 2021

New Video: InterSystems API Manager: Gummy Bear Factories

Hi Community, Enjoy watching the new video on InterSystems Developers YouTube: ⏯ InterSystems API Manager: Gummy Bear Factories InterSystems API Manager allows developers to manage multiple APIs and consumers. This demo environment uses InterSystems API Manager, or IAM, to monitor and control the HTTP-based API traffic coming from three different candy factories, leading to an endpoint in InterSystems IRIS data platform. Stay tuned! 👍🏼
Announcement
Marcus Wurlitzer · Apr 21, 2021

Git for InterSystems IRIS - Native Git workflow for the IRIS platform

Hi Developers, I am glad to announce Git for InterSystems IRIS, my first submission to OpenExchange and part of the current Developer Tools Contest. Git for InterSystems IRIS is a source control package that aims to facilitate a native integration of the Git workflow with the InterSystems IRIS platform. It is designed to work as a transparent link between InterSystems IRIS and a Git-enabled code directory that, once setup, requires no user interaction. A detailed description can be found on GitHub. I am looking forward to learn what you think about this approach. Does it make sense? Would this help you with establishing a Git-based deployment pipeline? Are there any issues that may have been overlooked? A ready-to-run docker demo is available on OpenExchange. The application is in a usable proof-of-concept state, with some features still to be implemented. I am happy to receive any feedback from you. Thank you for publishing!! I am curious ... did you start with one of the existing open source Git hooks for ObjectScript or did you start from scratch with this project? Hi Ben, the project started as a fork of Caché Tortoize Git, which was a good starting point, and initially I intended to change only a few things. As development went on, however, most of the code has been rewritten and I think only 10-20% is left from the original code. There were just too many differences in the basic concepts, including the Globals structure, handling of namespaces and projects, and interaction with Git (hooks -> REST) and Studio (none). This is really interesting - I've been starting on a similar project with the same starting point. Got it Marcus - thanks for the history :) Thank you Marcus, great initiative! Any thoughts about how to manage environment specific variables in the pipeline e.g. different interoperability host configurations for dev / prod? @Janne.Korhonen - typically these are managed using System Default Setting: https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=ECONFIG_other#ECONFIG_other_default_settings Hello Marcus, Thank you for sharing. I'm building a dockerised DEV environnement. The main issue I am encountering at this moment is the modification from the portal of Business Process or Transform for exemple. I have to export manually my new processes. If I forget it, I just lose it ... I try to install and configure GIT directly on my image. The aim is to link my local repo to the container. I don't want GIT at all. This way, I will have a automatical export. But, it is quite difficult to use in command line. I always have to perform an INIT when I start my container. I tried to perform an init from my DockerFile (do ##class(SourceControl.Git.Utils).UserAction("","%SourceMenu,Init")) but it does not work. Do you have a clean way to install and configure GIT from a DockerFile ? Thanks Regards, Matthieu. My iris start in my DockerFile : RUN iris start IRIS \ && iris session IRIS -U %SYS < /tmp/iris.script \ && iris stop IRIS quietly my iris.script : //On installe ZPM set $namespace="%SYS", name="DefaultSSL" do:'##class(Security.SSLConfigs).Exists(name) ##class(Security.SSLConfigs).Create(name) set url="https://pm.community.intersystems.com/packages/zpm/latest/installer" Do ##class(%Net.URLParser).Parse(url,.comp) set ht = ##class(%Net.HttpRequest).%New(), ht.Server = comp("host"), ht.Port = 443, ht.Https=1, ht.SSLConfiguration=name, st=ht.Get(comp("path")) quit:'st $System.Status.GetErrorText(st) set xml=##class(%File).TempFilename("xml"), tFile = ##class(%Stream.FileBinary).%New(), tFile.Filename = xml do tFile.CopyFromAndSave(ht.HttpResponse.Data) do ht.%Close(), $system.OBJ.Load(xml,"ck") do ##class(%File).Delete(xml) do ##class(%SYSTEM.Process).CurrentDirectory("/opt/irisapp") //On charge les installer et les deployer do $SYSTEM.OBJ.Load("InstallerLibrary.cls", "ck") //On installe les namespaces set sc = ##class(App.InstallerLibrary).setup() // Je ne sais pas pourquoi mais je dois redéfinir le dossier de travail do ##class(%SYSTEM.Process).CurrentDirectory("/opt/irisapp") //On importe les default settings + le plugin GIT (SURTOUT LAISSER LES PASSAGES A LA LIGNE) zn "LIBRARY" zpm "install git-source-control" d ##class(SourceControl.Git.API).Configure() /irisdev/app/LIBRARY/ // Pour éviter de devoir modifier le mdp SuperUser. zn "%SYS" w ##class(Security.Users).UnExpireUserPasswords("*") // Pour faire fonctionner le plugin Git, il faut que le path défini existe, par défaut il est à chaine vide et cela fait planter le plugin. En l'enlevant cela fonctionne k ^SYS("SourceControl","Git","%gitBinPath") zn "LIBRARY" do ##class(SourceControl.Git.Utils).UserAction("","%SourceMenu,Init") halt Hi Matthieu, so you want to use Git for IRIS for an automated export of classes and set it up from the iris.script, which will be invoked in the Dockerfile. From the code you have pasted, it seems like you use a different Git Source Control implementation (zpm "install git-source-control“). The implementation discussed in this thread would be installed with zpm "install git-for-iris“ There, you can use the API functions in SourceControl.Git.Utils in the iris.script: do ##class(SourceControl.Git.Utils).AddDefaultSettings() do ##class(SourceControl.Git.Utils).AddPackageToSourceControl(„<My.Package.Name>“, „<MyNamespace>“) do ##class(SourceControl.Git.Utils).SetSourceControlStatus(1) A default package is added to source control via module.xml for demo purposes, as well as the /csp/user/sc web application for callbacks from git, both of which you may want to remove. As a final step, you will have to activate the source control class in IRIS. The manual process is described here https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ASC#ASC_Hooks_activating_sc_class, you might look into the corresponding CSP page to find out how to do it programatically. Hope this helps. Currently there is a select few of us in the group that use Git and Local Repos for VS code, but I want to make this more wide spread for our team as most use the Editors off of the Management Portal to do their coding. Does anyone have steps they have used in the past to move towards Server Side Source Control from creating the Repos on your Server, getting the IRIS Code into the new Repo you created on your server, and pushing it to github? Git for IRIS has been updated to v0.3. It now provides source control for lookup tables and supports deletion of classes. Also, improvements were made to provision default settings, and Git hooks are now disabled by default to avoid unwanted side-effects (writing hooks to the .git directory, setting a random password for the technical user). A complete guide for deploying Git for IRIS to an existing IRIS instance has been added to README.md along with detailed descriptions of settings, Globals and behaviour.
Announcement
Anastasia Dyubaylo · Sep 13, 2021

Video: iKnow: Open Source NLP in InterSystems IRIS

Hi Community, Enjoy watching the new video on InterSystems Developers YouTube: ⏯ iKnow: Open Source NLP in InterSystems IRIS Learn about this open-source NLP technology and its unique approach to text analytics. See how the new Python library works, and learn about the exciting journey towards a robust public CI/CD pipeline. Presenters: 🗣 @Benjamin.DeBoe, Product Manager, InterSystems 🗣 @Aohan.Dang, Systems Developer, InterSystems Enjoy and stay tuned!
Article
Nikolay Solovyev · Nov 23, 2021

InterSystems Package Manager ZPM 0.3.2 release

A new release of ZPM has been published - ZPM 0.3.2. New in this release: Various changes in the output command of help Changes in colors in the outputs Added an ability to add more repo types Added an ability to specify a post-installation message, with AfterInstallMessage tag in module.xml Added variable ${webroot}, which refers to url with host and port where the internal web-server is available Fixed issue when during install if no module was specified (issue #243) Fixed issue with uppercased FileCopy resource Some other minor bugfixes How to use AfterInstallMessage ? Described in Documentation. And here is an example.