Clear filter
Article
Peter Steiwer · Dec 21, 2018
Easily transform a CSV file into a personalized preview of DeepSee - InterSystems BI
AnalyzeThis can be found on InterSystems Open Exchange. Use the Download link to navigate to GitHub and begin installing the project. Follow the “Installation” section of the GitHub README.
After installation, navigate to the User Portal from the Management Portal:
Once here, a new Link will have been added, click on the link and then select "New" to begin:
Use “Browse” to locate a csv file to import:
Click on “Next” to see a preview of your data and select “Measure” or “Dimension”:
As defined, “Measures” are the value you would like to aggregate. “Dimensions” are the values you would like to aggregate on.
You can also select to hide properties that are not good Dimensions or Measures. For example, “ProviderId” is unique, so this will not be a good value to group on. We also do not want any sort of sum or aggregate of this number, so we will not include it here:
All properties default to a Dimension. We will find some properties we want to change to be Measures:
Here we can see that “TotalDischarges”, “AverageCoveredCharges”,”AverageTotalPayments”, and “AverageMedicarePayments” would be good values to aggregate. We will make them Measures:
We also know these are dollar amounts, so we will change their type from Integer to Currency:
Now that we are happy with our data, we can click “Import”. This will start processing the data as seen here:
Once this stage is complete (speed depends on the amount of data being processed), we will see some new buttons on the dialog box:
Here we will click on “Sample Dashboard” to view the generated sample based on our data:
We can now have our data in a Cube so that we can start exploring the analytics capabilities in just a few minutes.
If any bugs are experienced during this process, please feel free to email me at psteiwer@intersystems.com, or file a bug report on GitHub. For general questions, please comment on this article so others can benefit from the information as well.
Head over to InterSystems Open Exchange and download AnalyzeThis today! We had to chose one out of these 4 book covers for AnalyzeThis, we chose #1, do you agree with us? Yes, the 1st one is a full match)@Peter.Steiwer, do you plan also to share the short screencast on how to use the tool in the best way? We could deploy it on Community Channel I do not currently have a screencast, but on the Community Channel there is the Flash Talk from Global Summit 2018 that can be viewed for now Hi @Peter.Steiwer!Tried to play with the demo and got the following:Installed on IRIS Docker Community version: IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2019.2 (Build 107U) Wed Jun 5 2019 17:26:23 EDT Hello @Evgeny.Shvarov,
Just to close the loop on this issue, @Peter.Steiwer fixed it back in July 24, 2019. Please feel free to download the latest version here.
Thanks,
Asaf Hi, @Asaf.Sinay , @Peter.Steiwer!
Yes, tried this on mac recently with 2019.3 on IRIS docker CE. This bug is solved - great!
But on the final step, it says "It's working"... - and it's working for a long time. Never saw the result, yet)
Hi @Evgeny.Shvarov
Please feel free to create an Issue on GitHub. Please include the CSV file you are trying to use as well
Peter done https://github.com/psteiwer/AnalyzeThis/issues/35 Objectscript Package manager has the updated version 1.1.2 as well. So Analyzethis can be installed as:
USER:zpm>install analyzethis Hi @Evgeny.Shvarov
This is fixed in v1.1.3
Announcement
Jeff Fried · Jan 21, 2019
The preview release of InterSystems IRIS 2019.1 is now available - give it a try!Kits and container images are available via WRC's preview download site.InterSystems IRIS Data Platform 2019.1 is the third major version of InterSystems IRIS. It has many new capabilities including:Significant enhancements to SQL usability and performanceImproved scalability and operations for sharded clustersClient language updates and performance boostsNew interoperability capabilities that speed configuring and troubleshooting of productionsSystem security, performance, and efficiency enhancementsThese are detailed in the draft documentation and release notes for InterSystems IRIS.Server platform support for traditional installations have been updated, as have the base OS layer and storage drivers for InterSystems IRIS containers. You can read details in the draft Supported Platforms document.With 2019.1, InterSystems IRIS now officially supports self-service BI tools using ODBC connections, specifically Tableau and PowerBI. Customers interested in using these are encouraged to take the Power BI survey or Tableau survey; this feedback will help us in providing dedicated connectors to these tools in a future release.Preview releases allow our customers to get an early start working with new features and functionality. They are supported for development and test purposes, but not for production. Glad to see thew newest version, great work.Hope to see some details about community and expression editions. Unfortunately, both of these versions did not work well for me as I expected, so, I would like to see how they differ from the original version and about limitations. Is there an ETA for 2019.1 preview versions of Caché and Ensemble, for those who haven't yet migrated to InterSystems IRIS? Great news Jeff. It looks like a significant release and the one we will be targeting for our move from Caché to IRIS.But in this context, what I'm missing from your announcement and the release notes is mention of an upgrade installation from Caché to IRIS (rather than a completely new install and then having to manually create all configuration and security items that exist on the Caché platform and having to rename database files and so on and so on). You stated in late November that was in the works and coming for 2019.1. Hi John - for Caché and Ensemble we have just released a 2018.1.1 version, and will shortly have a 2018.1.2. We don't plan a 2019.1 version of Cache and Ensemble - we're focused on keeping these stable and adding in specific enhancements as needed, and on making it easy for customers to migrate to InterSystems IRIS when it's right for them. Hi Wolf - You are correct, this preview does not include the upgrade installation from Caché to IRIS. Still in the works; we'll have more news about this shortly. In that case I'd like to lobby for devchange JGM785 to get into Ensemble 2018.1.2. This devchange addresses a longstanding weakness in Portal, namely that its schema editor didn't respect server-side source control. Thanks, John...yes this request is already registered and your lobbying seems to have already started through a different channel ;-) OK, we will get out some of these details. If you can drop a line about what didn't work that would be great. - email joe.carroll@intersystems.com, or file something in the WRC, or use the feedback button on the quickstarts - There is a known issue that you may be looking at w.r.t. limitation on the # databases. We'll also have a 'call for feedback' on the Developer Community forum about this soon, have a few things to adjust first.
Announcement
Jeff Fried · May 9, 2019
The preview release of InterSystems IRIS 2019.2 is now available - give it a try!
Container images are available via the WRC's preview download site.
The build number for these releases is 2019.2.0.100.0.
InterSystems IRIS Data Platform 2019.2 is the first CD (continuous delivery) release of InterSystems IRIS. It has many new capabilities including:
Addition of the IRIS Native API for Python and Node.js and relational access for Node.js
Simplified sharding architecture and flexible sharded schema design
Support for the new PowerBI connector for InterSystems IRIS
New look in the Management Portal
System security, performance, and efficiency enhancements
Enhancements to the InterSystems Cloud Manager
These are detailed in the prerelease documentation and release notes.
As this is a CD release, it is only available in OCI (Open Container Initiative) a.k.a. Docker container format. The platforms on which this is supported for production and development are detailed in the Supported Platforms document. For more information on what a CD release is, review the new release cadence post on InterSystems Developer Community.
Preview releases allow our customers to get an early start working with new features and functionality. They are supported for development and test purposes, but not for production. Nice to see this preview appear, and being a Docker container made it easy for me to download, spin up and verify that our Serenji extension for VSCode seems to work fine. Not that I'm surprised, seeing how good at maintaining backward compatibility I've always found ISC to be. Great news, Jeff!Could we expect IRIS Community Edition 2019.2 preview too?
Announcement
Jeff Fried · Jun 10, 2019
The 2019.2 version of InterSystems IRIS Data Platform is now Generally Available! Container images for InterSystems IRIS are available via the WRC's download site.The build number for these releases is 2019.2.0.107.0. InterSystems IRIS Data Platform 2019.2 is the first CD (continuous delivery) release of InterSystems IRIS. It has many new capabilities including:Addition of the IRIS Native API for Python and Node.js and relational access for Node.jsSimplified sharding architecture and flexible sharded schema designSupport for the new PowerBI connector for InterSystems IRISNew look in the Management PortalSystem security, performance, and efficiency enhancementsEnhancements to the InterSystems Cloud Manager These are detailed in the InterSystems IRIS 2019.2 documentation and release notes. As this is a CD release, it is only available in OCI (Open Container Initiative) a.k.a. Docker container format. The platforms on which this is supported for production and development are detailed in the Supported Platforms document. For more information on what a CD release is, review the new release cadence post on InterSystems Developer Community. Thanks, Jeff!When the Community version of InterSystems IRIS 2019.2 will be available on Docker Hub too? Will there be a Caché 2019-version released this year or will it stop at version 2018 ? Is it just Docker container now? will there be a classic Full Kits? The CD releases are only in containers. review the new release cadence post IRIS 2019.2 is available on Docker Hub.The line for Dockerfile is:
ARG IMAGE=store/intersystems/iris:2019.2.0.107.0-community
Announcement
Anastasia Dyubaylo · Jun 12, 2019
Hi Everyone!One more session recording from Global Summit 2018 is available on InterSystems Developers YouTube Channel:InterSystems IRIS in a Container This video covers all aspects of deploying InterSystems IRIS in a container. We will discuss capabilities, benefits, best practices, and our support for containers. To get the most from this session, attendees should be familiar with Docker containers.Takeaway: InterSystems IRIS is a first-class citizen of the container world.Presenters: @Saurav.Gupta, Louise ParberryAdditional materials to the video you can find in this InterSystems Online Learning Course.Enjoy watching the video!
Question
Colin McCudden · Feb 4, 2019
Hello, I am new to InsterSystems Cache - having a SQL Server background. However I am dealing with a Third Party who use InterSystems Cache to hold some of our data. To do some analysis I need to view a backup of the database. They are prepared to send me a backup.My question is - how can I view this backup ( would this be the CACHE.dat file?).Do I effectively need to have an installation of CACHE on my machine to be able to view this? Is it possible to view it from SQL Server? Any help would be appreciated.ThanksColin Hi Robert - thanks for confirming this for me. Regarding Cache/SQL Server I am certainly open to exploring Cache further. Thanks, Colin #1) if it is a Caché Backup you need an Installation of Caché to restore it.#2) if it is a CACHE.DAT file you also need an installation of Caché and mount this as an additional DataBase.Without the installation of Caché it's a thrilling exercise to high-level experts. Not really advisable.try to have the same processor type { big / little endian :== (Intel/AMD) or not } as the original Caché instances. This saves some headache.Forget about SQL Server. Caché is far more efficient and advanced technology!
Announcement
Anastasia Dyubaylo · Jul 3, 2019
Hi Community!Please welcome a new video on InterSystems Developers YouTube Channel:InterSystems IRIS Roadmap In this video you will learn where InterSystems IRIS is headed. We'll discuss our vision and key investments we are making for the future.Takeaway: InterSystems is committed to fueling my innovations by giving me the technology I need.Presenter: @Jeffrey.Fried, Director of Product Management, InterSystemsAnd...Additional materials to the video you can find in this InterSystems Online Learning Course.Don't forget to subscribe our InterSystems Developers YouTube Channel. Enjoy and stay tuned!
Article
Evgeny Shvarov · Jul 18, 2019
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and manager pledge to making participation in InterSystems Developer Community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
* We accept any claims and assessments regarding the behavior and features of InterSystems Data platforms, but we don't accept and don't discuss the behavior and level of service of any InterSystems departments and employees.
* We reserve the right to remove any posts (without giving a reason) that we believe do not provide useful information to members of the community.
* We reserve the right to restrict access to the community (without giving any reason) to individuals whose posts have been deleted multiple times.
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies to any public contribution to InterSystems Developer Community which could be found on community.intersystems.com and openexchange.intersystems.com. Representation of community may be further defined and clarified by InterSystems Community management.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the [project team](https://community.intersystems.com/about#intsys-team). The Community team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The community team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
InterSystems Developer Community members who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the Community Management.
## Disclaimer
The views and opinions expressed by InterSystems employees (marked as Staff) do not necessarily reflect the official stance or position of the company unless explicitly stated otherwise, for example, by using the tag InterSystems Official.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
Article
Evgeny Shvarov · Apr 22, 2017
Hi!
If you see this page you are in the InterSystems Developer Community!
You are very welcome!
This is the place where you can read about and discuss InterSystems products and technologies: InterSystems IRIS, Caché, Ensemble, HealthShare, DeepSee, and iKnow.
What type of content can I find here?
We have three types of content on Developer Community(DC): articles, questions, announcements. And answers to questions. And videos.
The articles are about the best practices and experience with InterSystems technology and products. Both InterSystems employees and community members post articles. You can find release notes and new features descriptions and the articles regarding experiences and InterSystems technology examples.
And of course, its a place where you can ask your question and get the answer from the most experienced engineers in InterSystems technology from all over the world.
Why register?
Register on DC to post and comment articles, ask questions and give answers regarding InterSystems Data Platforms, solutions built with InterSystems Data Platforms and tools, technologies and approaches which help to build, deploy and maintain solutions on InterSystems Data Platforms. Here are the guidelines on how to post.
Note! Moderators may remove posts that are not related to InterSystems products and technologies.
InterSystems Developers community code of conduct.
Registered members can vote. Vote if you like an article, a question or an answer.
When should I vote down?
Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect.
If you downvote, please consider adding a comment if you think the post can be improved.
See more about votes.
How does the site work?
Posts are categorized by Tags. There are mandatory tags, which called Groups in editiing. Mandatory tags are related either to InterSystems Products, or InterSystems Services. You need to supply at least one of these tags. Tags are tags, the things which help to categorize posts. You can subscribe for tags to get notifications via email or RSS.
Also, you can follow the member you like - it's a subscription to member's posts and comments.
On the main page, you can see the feed of posts where the topmost is the either latest posted or the latest commented or answered.
You can use feed filters to see only the tags you subscribed, the most voted and new postings as well.
Also, we have DC analytics site to check some figures about DC members, posts, answers, etc.
For all the rest see the Developer Community FAQ.
Subscriptions and notifications
Registered members can receive email notifications regarding different actions on the Developers Community. Please see this article how to deal with that.
Also, everyone can subscribe to RSS: for everything and for specific tags.
InterSystems Global Masters!
It's our InterSystems Advocacy Hub. If think you are an advocate of InterSystems Technology please join the team of hundreds of InterSystems advocates all over the world. We'll provide you challenges, badges, and rewards of course. See the details.
InterSystems Open Exchange!
Find tools, frameworks, solutions, technology examples on InterSystems Open Exchange! Learn more.
What else?
If you have any questions about the site, ask in this group or see the FAQ.
We have Twitter to tweet about all what is valuable in Developer Community and Facebook page if you like it more.
Here is InterSystems Developers LinkedIn information channel and InterSystems Developers LinkedIn Group.
And we have DC Telegram channel for the same purpose if you like Telegram.
And we started the InterSystems Developers YouTube Channel
And also we have Developer Community Subreddit for all the most interesting announcements.
Welcome to InterSystems Developer Community!
This is nice documentation.I am still confused between GROUPS and TAGS, they seem like the same thing.Also, it would have been nice to have this information and much, much more at the beginning.I did ask for documentation when DC was just starting but was told it should be intuitive, but it was never that to me.(at least that was in my memory).Anyway, the documentation is nice, but should be expanded and available through a shortcut, or is that a tag or group?You say if I have any more questions, ask in this Group, how do I know what Group I am in? And how do I ask in a Group?Thank you Hi, Mike!Thanks for the feedback!I am still confused between GROUPS and TAGS, they seem like the same thing.Groups and tags are both tags. But the group is the way for us to be sure, that every post relates to something very significant to what our Company does. It's either InterSystems product, technology or service. Anyway, the documentation is nice, but should be expanded and available through a shortcutThere is a shortcut on the Links widgetand in Community menu - "About the site" You say if I have any more questions, ask in this Group, how do I know what Group I am in? And how do I ask in a Group?Sorry, Mike! I just forgot to put the link to the group. But of course, you can ask here in this post too.And yes, this post would be updated once new features and new better ideas to describe the Community will appear. Hi Evgeny,I couldn't help notice that this post has a -1 rating.I can't see anything wrong with the post so curious what the reason for a down vote would be.On stack overflow they explain the use of down voting as...When should I vote down?Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect.You have a limited number of votes per day, and answer down-votes cost you a tiny bit of reputation on top of that; use them wisely.This post has an interesting conversation around down votes...https://meta.stackexchange.com/questions/135/encouraging-people-to-explain-downvotesAs the original poster explains...Where the down-vote has been explained I've found it useful & it has improved my answer, or forced me to delete the answer if it was totally wrongThis initiated a change that prompts down voters with the message, "Please consider adding a comment if you think the post can be improved".We all make mistakes so its good to get this type of feedback. It also helps anyone landing on the answer months or years down the line and not realising the answer they are trying to implement has a mistake. Perhaps the DC site could do with something similar?Sean. Sean,I was the one who put the downvote in, and I explained myself in the reply.Maybe you are not the person to ask, but you brought in the comment:"You have a limited number of votes per day, and answer down-votes cost you a tiny bit of reputation on top of that; use them wisely."I don't understand how using down-votes cost someone "a tiny bit of reputation"Seems to me when a down-vote is used, it should enhance ones reputation as you are increasing the quality of a post.Also, if the down-vote is used when:"Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect."If that is the criteria for downvotes, they will never be used, so why even have them? Hi, Sean!Thanks for the feedback, this is very useful and fair input. So I've introduced the statement about downvotes to the description.We'll add a hint about commenting triggering by downvote. Thanks! In relation to stackoverflow I think the intention was to stop people abusing the implementation of the down vote.I'm not sure that's relevant here, unless the main DC site started displaying some kind of reputation score in the same way as stackoverflow.> Then downvotes will never be used, they why even have them?I think dangerously incorrect is a poor description and perhaps needs down voting :)It should just say "contains incorrect information".Despite that, there are 1,000,000+ users on stackoverflow regularly using the down vote so it must be working. We have a nice welcome video now. Check it out! Recently we got yet another "spam" post. It was hidden.
So this post was updated with the statement:
Note! Moderators may remove posts that are not related to InterSystems products and technologies.
Hi, Community!You can apply your enhancement requests to DC in this repository.And you can monitor the progress in this kanban projects. E.g. here is the June 2018 project. How to solve this error local host:5772 says Internal server error Hi Masilu! Could you please submit a new question with the description of the problem? In DC ANALYTICS / Authors what do these column headers stand for?
Comment Rating
Post Rating
VPP Context
VPP Absolute
For Rating I'd expect Votes ? But VPP ? VPP=Votes per post Thanks!
Question
Evgeny Shvarov · Jun 20, 2017
Hi, Community!
How do you store the source files of your Caché project? What is the directories structure? What are the benefits?
I prefer the following structure:
/cls/package/subpackage/class.cls
/mac/package/routine.mac
/int/package/routine.int
/inc/macro.inc
/dfi/folder/sample.pivot.dfi
Example
Benefits:
folders are packages.
easy to understand what type of sources are in the project.
What is your approach? Hi, Rubens!Thank you for the wide answer, very interesting.I agree with you on "no subfolders for routines" and separate folder for server-side code. May I wonder what are you using as IDE (Studio? Atelier? Something else?) and how do you import/export your code with Caché. I develop using a mix of Caché Studio with Visual Studio Code.I use Visual Studio Code for dealing with front-end code, while using Caché Studio for back-end.I don't use Caché Studio to edit static files. I'm actually doing experiments using my Port library for managing export/import operations. About how I keep the server code close to it's client counterpart is quite simple. By default Port exports project following the template /CacheProjects/{NAMESPACE}/{PROJECT}, so instead of depending on it, I overwrite that path to /my-repo/server.From this point exported files will follow:/my-repo/server/cls/My/Class.cls/my-repo/server/cls/Another/Deep/Package/Whatever.cls/my-repo/server/int/myroutine.int/my-repo/server/mac/myroutine.mac/my-repo/server/dfi/mydef.dfi/my-repo/server/int/myinclude.incAnd so on, for every recognized Caché file format.Now notice that I didn't said anything about static files. That's where a module bundler like Webpack is used to orchestrate the client-side workflow.Now Caché only needs to send readable data back to the SPA (preferably JSON using %CSP.REST).When the project repo reaches a milestone. I build a release to actually export the files to the path, like this: /my-repo/server/web/app/bundle-[chunkhash].js/my-repo/server/web/app/bundle-[chunkhash].cssSince [chunkhash] is unique per build, the consumer shouldn't have any issues with browser cache.Now there's an issue: the bundled files still aren't inside the CSP folder, so I need to import the project back to Studio using Port.Files are imported using UDL instead of XML. But Port always keep a project XML up-to-date along with the UDL code.As you can see I can work with Caché code AND Client-code, alternating between both editors, thus keeping their own development scope, even though their code remain inside the same repo. cls/My/Deep/Class.clsI don't think subdirectories should be applied for routines, originally routines aren't supposed to have submodules or subpackages and dots might be part of their name. Also if you need some complexity, you wouldn't prefer using routines but classes to keep things organized. I DO NOT recommend using src, unless you want to mix both back-end and front-end code. Or you want to keep the server code in a separated repository.Here is a scaffolding based on React for better understanding.my-app-project / package.json server cls mac int csp <- this is our build path, nothing should be added manually because everything is handle by the bundler. scripts / test.js build.js dev.js config / webpack.config.dev.js webpack.config.prod.js webpack.config.test.js src / components Header index.js Header.js HeaderSearchBar.js Footer index.js Footer.js FooterCopyright.js AppContainer index.js AppContainer.js containers App.js tests components Header Header.js HeaderSearchBar.js Footer Footer.js FooterCopyright.js AppContainer index.js AppContainer You can use folders to separate both client and server codes inside the same project. You can even structure your projectusing a monorepo approach if you want to keep multiple application modules together. Now since React will be using webpack's hot module reloading along with webpack-dev-middleware that builds everything within the memory, your Caché server should only work following SPA conventions and providing consumable data.There's a catch though, whenever the developer builds a new version (using webpack.config.prod), it's mandatory to delete the older bundle and import the project back to Caché to keep the source in sync on the server and the project. I think the most important part of source control file structure is mirroring package structure in Studio, since that is the view we spend the most time with. That said it looks something like this:
root/
Package1/
Class.cls
Class2.cls
Routine.mac
Include.inc
Package2/
Class.cls
Class2.cls
Routine.mac
Include.inc
Additionally:
Web app should be stored in a separate repository.If there's docs/dictionaries/etc, then all sources should be in a /src folder instead of repository root.All libs/modules/etc should be moved into their separate repositories each and plugged in as a submodules.Builds, if any should not be stored in a repo but rather meta-managed (releases).Commit messages and granular commit history is one of the most helpful things when analysing project history, enforce commit message style (title is the most important i.e. PART/SUBPART - thing done in a commit).
Article
Eduard Lebedyuk · Feb 19, 2016
Suppose you have developed your own app with InterSystems technologies stack and now want to perform multiple deployments on the customers' side. During the development process you've composed a detailed installation guide for your application, because you need to not only import classes, but also fine-tune the environment according to your needs.To address this specific task, InterSystems has created a special tool called %Installer. Read on to find out how to use it.%Installer
Using this tool, you can define the installation manifest, which describes the desired Caché configuration instead of the installation steps. You need only to describe what you want, and Caché will automatically generate the necessary code to modify the environment for you. Therefore, you should distribute only the manifest itself, while all the installation code will be generated for the specific Caché server at compile time.To define a manifest, create a new XData block with detailed description of the target configuration and then implement a method to generate Caché ObjectScript code for this XData block (this code is always the same). Once the manifest is ready, you can access it from a terminal or Caché ObjectScript code or automatically during Caché installation. The manifest must be executed in the %SYS namespace. Manifests can handle both system parameters (superport, OS, mgr directory, etc.) and arbitrary user-supplied parameters. In general, each installation class must meet the following requirements:
Contain a link to %occInclude.incContain an XData block with the Caché server configurationThe block can be have any valid nameAdd [XMLNamespace = INSTALLER] after the block's name if you want to see prompts from StudioThe root item (there must only be one) is called <Manifest> and comprises all other itemsYou also need to implement the setup() method which will generate the necessary program code for the XData block.
Installer basics
You can execute an installation manifest in several ways:
In the %SYS namespace using a terminal or from a Caché ObjectScript code
do ##class(MyPackage.MyInstaller).setup()
Automatically during the installation of Caché. To do this, export the installer's class into DefaultInstallerClass.xml stored in the folder with Caché installation package (i.e. where setup_cache.exe or cinstall are stored). During Caché installation, this class will be imported into the %SYS namespace and executed via the setup() method.
Example
Let's consider a simple example. Create the class called App.Installer containing an installer that will generate a new namespace with the user-defined name, create default web app and import code into this new namespace:
Include %occInclude
Class App.Installer {
/// You can see generated method in zsetup+1^App.Installer.1
XData Install [ XMLNamespace = INSTALLER ]
{
<Manifest>
<If Condition='(##class(Config.Namespaces).Exists("${Namespace}")=0)'>
<Log Text="Creating namespace ${Namespace}" Level="0"/>
<Namespace Name="${Namespace}" Create="yes" Code="${Namespace}" Ensemble="0" Data="${Namespace}">
<Configuration>
<Database Name="${Namespace}" Dir="${MGRDIR}${Namespace}" Create="yes"/>
</Configuration>
</Namespace>
<Log Text="End Creating namespace ${Namespace}" Level="0"/>
</If>
<Role Name="AppRole" Description="Role to access and use the App" Resources="%DB_CACHESYS:RW,%Admin_Secure:U" />
<Namespace Name="${Namespace}" Create="no">
<CSPApplication Url="/csp/${Namespace}" Directory="${CSPDIR}${Namespace}" AuthenticationMethods="64" IsNamespaceDefault="true" Grant="AppRole" />
<IfDef Var="SourceDir">
<Log Text="SourceDir defined - offline install from ${SourceDir}" Level="0"/>
<Import File="${SourceDir}"/>
</IfDef>
</Namespace>
</Manifest>
}
///Entry point method, you need to call
/// At class compile time it generate Caché ObjectScript code from the manifest
/// After that you can run this installer from a terminal:
/// Set pVars("Namespace")="NewNamespace"
/// Set pVars("SourceDir")="C:\temp\distr\"
/// Do ##class(App.Installer).setup(.pVars)
ClassMethod setup(ByRef pVars, pLogLevel As %Integer = 0, pInstaller As %Installer.Installer) As %Status [ CodeMode = objectgenerator, Internal ]
{
Quit ##class(%Installer.Manifest).%Generate(%compiledclass, %code, "Install")
}
}
In this example, installer performs the following actions:
Checks if a namespace with the same name as the value of Namespace variable exists (for clarity let's specify that the Namespace variable is set to NewNamespace)If not, then logs that a new namespace called NewNamespace will be createdDefines a new namespace:Name is NewNamespaceCreates a new namespaceRoutines database is NewNamespaceDo not enable EnsembleGlobals database is NewNamespaceCreates a new databaseName is NewNamespace;Creates it in the mgr/NewNamespace folder (note that the MGRDIR variable is available by default)Creation of the namespace is completed and loggedCreates new role: AppRole (with resources %DB_CACHESYS:RW and %Admin_Secure:U)Default web application /csp/NewNamespace is created (it also grants AppRole automatically)If SourceDir variable is defined then imports all files from there into NewNamespace
To run this installer in a terminal, execute the following commands:
Set pVars("Namespace")="NewNamespace"
Set pVars("SourceDir")="C:\temp\distr\"
Do ##class(App.Installer).setup(.pVars)
During execution terminal displays relevant information:
2016-02-17 19:26:17 0 App.Installer: Installation starting at 2016-02-17 19:26:17, LogLevel=0
2016-02-17 19:26:17 0 : Creating namespace NewNamespace
2016-02-17 19:26:17 0 : End Creating namespace NewNamespace
2016-02-17 19:26:17 0 : SourceDir defined - offline install from C:\temp\distr\
2016-02-17 19:26:18 0 App.Installer: Installation succeeded at 2016-02-17 19:26:18
2016-02-17 19:26:18 0 %Installer: Elapsed time .545148s
To receive even more information about what is going on specify LogLevel (from 0 (default) to 3 (raw); higher number = more information).
Do ##class(App.Installer).setup(.pVars, 3)
Now let's talk about what can be done in installer manifest.
Availible nodes
A manifest is composed of the following items:
NodeParent nodeAttributes (default values)DescriptionArgInvoke, ErrorValue – value of an argumentPasses an argument into a method called via Invoke or ErrorClassMappingConfigurationPackage – a package to be mappedFrom – name of the source database used for mappingCreates a class mapping from a database to the namespace which contains this Configuration itemCompileNamespaceClass – names of classes for compilationFlags – compilation flags (ck)IgnoreErrors – ignore errors (0)Compilers classes. Calls $System.OBJ.Compile(Class, Flags)ConfigurationNamespace Used for creating namespaces and databases. Closing tag activates mappings and updates the CPF fileCopyClassNamespaceSrc — source classTarget — target classReplace — remove the source class (0)Copies or moves the source class definition to the target oneCopyDirManifestSrc — source directoryTarget — target directoryIgnoreErrors — ignore errors (0)Copies a directoryCopyFileManifestSrc — source fileTarget — target fileIgnoreErrors — ignore errors (0)Copies a fileCredentialProductionName – name of the access credentialsUsername – user namePassword – user passwordOverwrite – overwrite if the account already existsCreates or overrides the access credentialsCSPApplicationNamespaceAuthenticationMethods – enabled authentication methodsAutoCompile – automatic compilation (in CSP settings)CSPZENEnabled – the CSP/ZEN flagChangePasswordPage – path to change password pageCookiePath – session cookie pathCustomErrorPage – path to custom error pageDefaultSuperclass – default superclassDefaultTimeout – session timeoutDescription – descriptionDirectory – path to CSP filesEventClass – event class nameGrant – list of roles assigned upon logging into the systemGroupById – group by Id propertyInboundWebServicesEnabled – inbound web services flagIsNamespaceDefault – Namespace Default Application flagLockCSPName – Lock CSP Name flagLoginClass – path to login pagePackageName – package name propertyPermittedClasses – permitted classes propertRecurse – recurce flag (serve subdirectories) (0)Resource – resource required to access web appServeFiles – service files propertyServeFilesTimeout – time, in seconds, of how long to cache static files.TwoFactorEnabled – two-step authenticationUrl – name of the web applicationUseSessionCookie – use cookies for the sessionCreates or modifies a web application. For details, refer to documentation and the Security.Applications classDatabaseConfigurationBlockSize – block size in bytes of the databaseClusterMountMode – mount the database as a part of the clusterCollation – sorting orderCreate – whether to create a new database (yes/no/overwrite (yes))Dir – directoryEncrypted – encrypt databaseEncryptionKeyID – ID of the encryption keyExpansionSize – size in MB to expand byInitialSize – initial sizeMaximumSize – maximum sizeMountAtStartup – mount upon launchMountRequired – specifies that the database MUST be successfully mounted at startup.Name – database namePublicPermissions – public permissionsResource – resourceStreamLocation – directory where the streams associated with this database go.Creates or modifies a database. For details, refer to documentation, the Config.Databases and SYS.Database classesDefaultManifestName – variable nameValue – variable valueDir – variable value (if this is a path to a folder/file)Sets the variable value (if it is not set yet)ElseManifest, NamespaceWill be executed when the if statement is falseErrorManifestStatus – error codeSource – source of the errorThrows an exception. Note that ${} and #{} syntax is not availableForEachManifestIndex – variable nameValues – list of values for the variableCollection-controlled loopGlobalMappingConfigurationGlobal – global nameFrom – name of the database for mapping
Collation – sorting order (Caché Standard)Maps a globalIfManifest, NamespaceCondition – a conditional statementConditional if statementIfDefManifest, NamespaceVar – variable nameConditional if statement used when the variable is already setIfNotDefManifest, NamespaceVar – variable nameConditional if statement used when the variable is not set yetImportNamespaceFile – file/folder for importFlags — compilation flags (ck)IgnoreErrors — ignore errors (0)Recurse – import recursively (0)Imports files. Calls:$System.OBJ.ImportDir(File,,Flags,,Recurse) and $System.OBJ.Load(File, Flags)InvokeNamespaceClass – class nameMethod – method nameCheckStatus – check the returned statusReturn – write the result into a variableMakes a call to a method of a class with various arguments and returns the execution resultsLoadPageNamespaceName – path to the CSP pageDir – folder with CSP pagesFlags — compilation flags (ck)IgnoreErrors — ignore errors (0)Loads CSP file using $System.CSP.LoadPage(Name, Flags) and $System.CSP.LoadPageDir(Dir, Flags)LogManifestLevel – logging level from 0 (minimum) up to 3 (detailed)Text – string up to 32,000 characters in lengthAdds a message to a log when the logging level is greater or equal to the "level" attributeManifest Root item. The only one root item in a manifest; contains all other itemsNamespaceManifestName – name of the namespaceCreate – whether to create a new namespace (yes/no/overwrite (yes))Code – database for program codeData – databaseEnsemble – enable Ensemble for the namespaceAll other attributes are applicable to the Ensemble web applicationsDefines the installer's scopeProductionNamespaceName – production nameAutoStart – automatic launch of the productionConfigures the Ensemble productionResourceManifestName – resource nameDescription – resource descriptionPermission – public permissionsCreates or modifies a resource.RoleManifestName – name of the roleDescription – role description (can't contain commas)Resources – resourcesgiven to role, represented as "MyResource:RW,MyResource1:RWU"
RolesGranted – whether to grant the corresponding rolesCreates a new roleRoutineMappingConfigurationRoutines – routine nameType – routines type (MAC, INT, INC, OBJ or ALL)From – source databaseCreates a new mapping for routinesSettingProductionItem – configurable itemTarget – parameter type: Item, Host, AdapterSetting – parameter nameValue – parameter valueConfigures an item in the Ensemble production Makes a call to the Ens.Production:ApplySettings methodSystemSettingManifestName – class.property of the Config packageValue – attribute valueSets the values for attributes of the Config package (using the Modify method)UserManifestUsername – user namePasswordVar – variable containing the passwordRoles – list of user's rolesFullname – full nameNamespace – startup namespaceRoutine – starting routineExpirationDate – date after which the user will be deactivatedChangePassword – change the password upon next login into the systemEnabled – whether the user is activatedCreates or modifies a user.VarManifestName — variable nameValue – variable valueAssigns a value to the variable
Variables
User-supplied variables
Some attributes can contain expressions (strings) that are expanded when the manifest is executed. There are three types of expressions that can be expanded, as follows:
${<Variable_name>} – value of the variable (user-defined or environment variable; see below) is calculated during the execution of the manifest;${#<Parameter_name>} – will be replaced with the value of the specified parameter from the installer's class during compilation;#{<Caché_ObjectScript_code>} — the value of the specified Caché ObjectScript statement will be calculated during the execution of the manifest. Make sure to put quotation marks as required.
Parameter values are defined during compilation and therefore can be a part of a variable or Caché ObjectScript statement. Since variables are interpreted before the Caché ObjectScript code, you can use them in Caché ObjectScript statements, e.g: #{$ZCVT("${NAMESPACE}","L")}.
System variables
The following variables are always available:
VariableDescriptionSample valueSourceDir(Available only when the installer is run) Directory from which the installation (setup_cache.exe or cinstall) is running./InterSystems/distr/ISCUpgrade(Available only when the installer is run) Indicates whether this is a new installation or an upgrade. This variable is either 0 (new installation) or 1 (upgrade).0 (installation)1 (update)CFGDIRSee INSTALLDIR./InterSystems/Cache/CFGFILEPath to the CPF file/InterSystems/Cache/cache.cpfCFGNAMEName of the instanceCACHECPUCOUNTNumber of CPU cores4CSPDIRThe CSP directory/InterSystems/Cache/csp/HOSTNAMEName of the web serverSCHOOL15HTTPPORTPort of the web server80INSTALLDIRDirectory where Caché is installed/InterSystems/Cache/MGRDIRManagement directory (mgr)/InterSystems/Cache/mgr/PLATFORMOperating systemUNIXPORTPort of the Caché superserver1972PROCESSORName of the platformx86-64VERSIONVersion of Caché2015.1.1
Debugging
Sometimes it may be hard to understand what values can be assigned as node attributes' values. To figure this out, check the generated int code for the setup method. In most cases, the main call is made to the tInstaller.<ElementName> which is an object of the %Installer.Installer class which, in turn, will make direct calls to the system methods. Alternatively, you can check the code of the %Installer.<ElementName> class in which the node attributes are class properties. The program code is generated in the %OnBeforeGenerateCode, %OnGenerateCode and %OnAfterGenerateCode methods.For debugging purposes, I recommend that you wrap a call to the installer into a transaction. For example, you can use the TSTART/TROLLBACK commands to easily undo all changes made within Caché (however, external changes, such as creating a new database file, will not be reverted).
Lastly, don't forget to set LogLevel to 3.
Examples
The MDX2JSON project provides an installer. To install the project, import the installer.xml file containing the MDX2JSON.Installer class into any namespace. You can perform import either from the SMP or by drag&dropping the file into Studio.Then run the following command in a terminal:
do ##class(MDX2JSON.Installer).setup()
As a result, Caché will load application files from the GitHub repository and then perform installation in the default MDX2JSON namespace/MDX2JSON database, map the MDX2SJON package to %All and SAMPLES, map the ^MDX2SJON global to %All and SAMPLES create the REST application called /MDX2JSON, and so on – you will see all these steps in the terminal. For more detailed information on MDX2JSON installer, please refer to the project readme.
Even more examples
Example from the documentation.The Sample.Installer class in the Samples namespace.The CacheGitHubCI projects provides an installer.The SYSMON Dashboards project provides an installer.The DeepSee Audit project provides an installer.
Summary
%Installer is a convenient tool for distributing and deploying applications based on InterSystems Caché and Ensemble.
References
Documentation Great article.I like to use this approach with CacheUpdater tool. It adds a Task in Caché with parameters of github repo URL and credentials if needed.So if I need to update the app with new code from github repo I just run the task. @Eduard.Lebedyuk it is possible to import a HL7 Schema from Installer? Hi David! How does HL7 schema look like? Is it a class or Global or what? How do you import an HL7 Schema from ObjectScript?
You can call any method with Invoke.
I'm not aware of anything HL7 specific in %Installer, but maybe HealthShare has something. I see.
So I guess I should use EnsLib.HL7.SchemaDocument class https://docs.intersystems.com/irisforhealthlatest/csp/documatic/%25CSP.Documatic.cls?APP=1&LIBRARY=ENSLIB&CLASSNAME=EnsLib.HL7.SchemaDocument but can't find an example of how import/export programatically.
In response to @Evgeny.Shvarov I am talking about Custom HL7 Schemas (https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=EHL72_tools#EHL72_customhl7schema_editor) in IRIS for Health. Use custom schemas is something very usual and I think that to include this import feature in Installer could be very useful... I'll try to make it works and if I am success I'll post the how-to :-D ##class(EnsLib.EDI.XML.SchemaXSD).Import("C:\path\to\schema.xsd") Do auto install using DefaultInstallerClass.xml wotk with IRIS For Health? In my expirience it does not. But after IRIS is installed I can manualy import the DefaultInstallerClass.xml and run the setup method in terminal and it works.
That is how my install package looks:
Maybe I'm missing something. Looks like it doesn't work with single file kits https://docs.intersystems.com/iris20222/csp/docbook/DocBook.UI.Page.cls?KEY=GCI_manifest#GCI_manifest_invoke_auto Thanks for this!
Announcement
Evgeny Shvarov · Feb 28, 2016
Hi Community!Meet the new group in Developer Community:InterSystems Data Platform Blog!In this group you'll find technical posts form InterSystems engineers and Community about InterSystems Data Platform technology cases which we consider as good or even best practices.Every article in this blog passes InterSystems engineers' reviewing procedure and only then becomes available. You are very welcome to comment and share it!We'll find best practices of InterSystems Technology implementations, will transform it into articles and will deliver for you in this group on a regular basis.Don't miss new posts and subscribe to InterSystems Data Platform Blog today!Evgeny Shvarov,InterSystems Community Manager
Article
Eduard Lebedyuk · Apr 25, 2016
Introduction
If you manage multiple Caché instances across several servers, you may want to be able to execute arbitrary code from one Caché instance on another. System administrators and technical support specialists may also want to run arbitrary code on remote Caché servers. To address these needs, I have developed a special tool called RCE.In this article, we will discuss what are the typical ways of solving similar tasks and how RCE (Remote Code Execution) can help.
What possible approaches are available?
Execute OS commands locally
Let's start with the simplest – executing OS commands locally from Caché. You can do it by executing the $zf command:
$ZF(-1) will call a program or command of the operating system. A call is made from a new process, and the parent process waits until the child process is finished. Once the command is executed, $ZF(-1) returns the resulting code for the child process: 0 if executed successfully, 1 if executed with errors or -1 if the system was unable to create the child process.It looks like this: set status = $ZF(-1,"mkdir ""test folder""")$ZF(-2) is similar command except that the parent process does not wait until the child process is finished. The command returns 0 if the process was created successfully or -1 if the system was unable to create the child process.
There are also methods of the %Net.Remote.Utility class (for InterSystems use only) which provides convenient wrappers for standard functions and displays the results of called processes in a more user-friendly form:
RunCommandViaCPIPE executes a command using Command Pipe. Returns the created device and the output of the process.RunCommandViaZF executes a command using $ZF(-1). Writes the process output to a file and returns the process output
An alternative option is using the terminal command ! (or $ which is the same) that opens the standard shell of the operating system directly within the Caché terminal. Two working modes are available:
One-line mode – the entire command is passed with ! and immediately executed by the shell's interpreter, while its output is sent to the current Caché device. The previous example looks like this:
SAMPLES>! mkdir ""test folder""
Multi-line mode – the system executes ! first and then opens the shell where you can enter the necessary commands of the operating system. To close the shell, enter "quit" or "exit" depending on the shell you are working in:
SAMPLES>!
C:\InterSystems\Cache\mgr\samples\> mkdir "test folder"
C:\InterSystems\Cache\mgr\samples\> quit
SAMPLES>
Remote execution of Caché ObjectScript code
Remote execution is possible via the %Net.RemoteConnection class (deprecated) which provides the following functionality:
Open and modify stored objects;Execution of class methods and objects;Execution of queries.
Sample code demonstrating these capabilities
Set rc=##class(%Net.RemoteConnection).%New()
Set Status=rc.Connect("127.0.0.1","SAMPLES",1972,"_system","SYS") break:'Status
Set Status=rc.OpenObjectId("Sample.Person",1,.per) break:'Status
Set Status=rc.GetProperty(per,"Name",.value) break:'Status
Write value
Set Status=rc.ResetArguments() break:'Status
Set Status=rc.SetProperty(per,"Name","Jones,Tom "_$r(100),4) break:'Status
Set Status=rc.ResetArguments() break:'Status
Set Status=rc.GetProperty(per,"Name",.value) break:'Status
Write value
Set Status=rc.ResetArguments() break:'Status
Set Status=rc.AddArgument(150,0) break:'Status // Addition 150+10
Set Status=rc.AddArgument(10,0) break:'Status // Addition 150+10
Set Status=rc.InvokeInstanceMethod(per, "Addition", .AdditionValue, 1) break:'Status
Write AdditionValue
Set Status=rc.ResetArguments() break:'Status
Set Status=rc.InstantiateQuery(.rs,"Sample.Person","ByName")
This code performs several actions:
Connects to the Caché serverOpens the Sample.Person class instance with ID=1Obtains the attribute valueModifies the attribute valueSets arguments for the methodCalls the method of the instanceExecutes the Sample.Person:ByName query
For operation on the server side %Net.RemoteConnection requires installed C++ binding.It is also worth mentioning the ECP technology. The technology allows you to execute JOB processes remotely on a database server from your application server.In general, combination of these two approaches can efficiently solve our task, but users still need a simple workflow of creating batch scripts, as these approaches can be rather difficult to understand and implement.
RCE
Thus, the project's goals were as follows:
Execution of scripts on remote servers from Caché;No need for configuring remote servers (client side);Minimum configurations on local servers (server side);Transparent switch between commands of the operating system and Caché ObjectScript;Support both Windows-based and Linux-based clients.
Hierarchy of classes in the project looks like this:
The "Machine – OS – Instance" hierarchy stores the information required for accessing remote servers.All commands are stored in the RCE.Script class which contains the sequential list of RCE.Command class objects serving as either OS commands or Caché ObjectScript code.Examples of commands:
Set Сommand1 = ##class(RCE.Command).%New("cd 1", 0)
Set Сommand2 = ##class(RCE.Command).%New("zn ""%SYS""", 1)
The first argument is the text of the command, the second argument is the execution level: 0 – OS, 1 – Cache.Sample creation of a new script:
Set Script = ##class(RCE.Script).%New()
Do Script.Insert(##class(RCE.Command).%New("touch 123", 0))
Do Script.Insert(##class(RCE.Command).%New("set ^test=1", 1))
Do Script.Insert(##class(RCE.Command).%New("set ^test(1)=2", 1))
Do Script.Insert(##class(RCE.Command).%New("touch 1234", 0))
Do Script.%Save()
In this example, the system will execute the 1st and 4th commands at the OS level and the 2nd and 3rd commands at the Caché level. Switching between these two level is absolutely transparent for users.
Execution mechanisms
Presently, the following execution paths are supported:
Server Client Linux Linux, Windows (the SSH server must be installed on the client side) Windows Linux, Windows (you should install an SSH server on the client side or psexec on the server side)
If ssh is supported on the client side, the server will generate the ssh command and execute it on the client side using the standard %Net.SSH.Session class.If both server and client operate under Windows OS, the system will generate a BAT file and then execute it on the client side using psexec.
Adding a server
Load classes from the repository into any namespace. If your server operates under Windows and you want to manage other Windows-based servers, then assign the ^settings("exec") global a path to psexec. And that's all!
Adding a client
Adding a client is basically saving all the data required for authentication.
Example of the program code that creates a new hierarchy "PC – OS – Instance"
Set Machine = ##class(RCE.Machine).%New()
Set Machine.IP = "IP or Host"
Set OS = ##class(RCE.OS).%New("OС") // Linux or Windows
Set OS.Username = "Operation system user"
Set OS.Password = "User password"
Set Instance = ##class(RCE.Instance).%New()
Set Instance.Name = "Caché instance name"
Set Instance.User = "Caché user name" // Unrequired on minimal security settings
Set Instance.Pass = "Caché user password" // Unrequired on minimal security settings
Set Instance.Dir = "Path to cterm" // Required only on Windows clients, who don't have cterm in PATH
Set Instance.OS = OS
Set OS.Machine = Machine
Write $System.Status.GetErrorText(Machine.%Save())
Script execution
And finally, let's execute our scripts. It's very simple – all we need to do is to run the ExecuteScript method from the RCE.Instance class into which the script object and the namespace (%SYS by default) are passed:
Set Status = Instance.ExecuteScript(Script, "USER")
Summary
RCE provides a convenient mechanism of remote code execution for InterSystems Caché. Since the tool uses only stored scripts, you need to write each of them only once and then execute them wherever you want on any number of clients.
References
GitHub repository of RCEArchive of classes from the RCE project Good article, Eduad. Is this prototype only or you do use it in production somehow?
Announcement
Olga Zavrazhnova · Dec 29, 2019
Hi Community!
Thank you so much for being with InterSystems Developer Community yet another year!
We want to know how helpful the Developer Community is for you today.
Could you please go through this short survey which will let us know what do you think and what could be improved.➡️ Developer Community Survey 2019 (4 min)
We wish you a Merry Christmas and a Happy New Year! ✨
Sincerely,
Your InterSystems Developer Community Team
Announcement
Anastasia Dyubaylo · Jan 17, 2020
Hi Developers,
New video, recorded by @Benjamin.DeBoe, is already on InterSystems Developers YouTube:
⏯ Python and InterSystems IRIS
InterSystems Product Manager @Benjamin.DeBoe talks about using Python, InterSystems IRIS Data Platform, and the native Python API's.
Try InterSystems IRIS: https://www.intersystems.com/try
Enjoy watching the video! 👍🏼