Search

Clear filter
Article
Peter Steiwer · Mar 23, 2022

InterSystems IRIS BI: Getting Started with Selective Build

What is Selective Build? Selective Build is a BI feature in InterSystems IRIS (introduced in version 2020.1). Selective Build allows you to build specific elements of your cube while keeping your cube online. What is special about Selective Build? Before getting into the details of Selective Build, a brief recap of the different phases during a regular cube build is important. Here are the phases in a regular cube build:1) Delete existing data in cube2) Populate cube with full set of data3) Build all indices in the cube Now that we are familiar with how a normal build works, we can understand the benefits of Selective Build. During a regular build, the cube must be offline since the first step is to delete the existing cube data and then populate the full cube again. This is not the case with Selective Build. Selective build takes only the specified cube elements offline and updates the data for these specific elements. This means that existing data is not deleted. Since existing data is not deleted, the cube does not need to be offline. The elements being built will be offline, which means if a user tries to query against these offline elements, they will see an error message. When should this be used? Selective Build is a great way to deploy updates to a cube model without needing to take the cube offline for extended periods of time. Depending on the size of the cube, it can take hours or even days to fully build the cube. Having the cube offline for an extended period of time to add a new dimension does not encourage frequent updates to the model. How is it used? From UI In Architect, any modified elements will automatically be kept track of. When you try and build your cube from the UI, the dialog box will give you the option to use Selective Build by default. This default selection also has any modified elements automatically selected. If you prefer to build the entire cube by using a regular build, this option can be selected. Build Cube API A new parameter was added to the Build Cube API. This new parameter is described as follows from the documentation: "pFactList is a list of specific Property names in the cube's fact class. If pFactList is supplied, the build will only update the columns listed in that fact list. This list can have either comma-delimited or $LB format. The specific facts being updated will be individually marked as unavailable for queries and queries referencing dimensions based on those facts will throw an error on prepare." I expect that the UI is used while actively developing modifications to a cube and the API is used while deploying changes to a different system. To learn more about Selective Build, please see the documentation.
Announcement
Evgeny Shvarov · Jun 30, 2020

Posts and Tags problem for InterSystems IRIS AI contest

Hi Developers! Here in Developers Community, we have posts, which are categorized by tags. Tags - are specific topics, which relate to InterSystems products, InterSystems services, or any concept related to software development, deployment, or maintenance etc. Tag is a helpful thing because it gives the option to follow/subscribe to the tag, filter the search by the tag, understand how popular or not unpopular the topic and more. And we have a problem! Actually two problems. The tags for the post are selected by the author of the post, and we have the following issues: the author chooses wrong tags for a post, and the post lacks proper tags. And we think this problem could be solved with AI/ML approach and so we suggest you solve it during the InterSystems IRIS AI Contest. Here is the posts-and-tags repository, which uses the Python Gateway template, which contains two classes: Community.Post and Community.Tag. Clone it or Fork it and run: $ docker compose up -d and it will build an InterSystems IRIS image and will load these two classes along with data from Post and Tag globals. Community. Post class contains the data on all the developer community posts with fields: Name - for the post title, Text - for the post text, Tags - for the comma-separated list of tags. You can get the data with the following SQL query: select top 20 * from Community.post order by id desc And you can get posts which have the particular tag with the query: SELECT * FROM Community.Post WHERE ($LISTFIND($ListfromString(Tags,','),'Contest')>0) ORDER BY ID DESC Community.Tag class contains tags and its descriptions. The task Find the optimal set of tags, for every post which matches the text of the post. Two hypotheses how this could be solved: 1. Find a matching tag for the post upon the tag description. Every tag has a description, which could match the title and content of the post. 2. Find proper tags considering that the majority of choices from authors are the right choices. So if text similar to some post, it can have similar tags. Looks like a typical data categorization problem, right? Also, it would be great to introduce new tags which we probably missed but we have posts which could be represented by these tags. I'm not a data scientist so probably this problem can be solved with some professional approach. Maybe iKnow - InterSystems NLP engine can be used here too. Anyway: we have the problem, we have the data, and possibly we could find a solution using InterSystems IRIS. We are looking forward to see your solutions! Great! I was working on a webcrawler to take the posts... now we have the data =) Hi! Exploring the tables, the post table has this Column HasCorrectAnswer. Do you have the replies of each post too? Would be useful to explore these data and compliment my classificators.
Article
Sergey Mikhailenko · Oct 20, 2020

InterSystems: Solution for Technical Support and DBMS-Interoperability Administration

In this article, we'll talk about an application that I use every day when monitoring applications and integration solutions on the InterSystems IRIS platform and finding errors when they occur. While looking for a solution for logging object changes in InterSystems IRIS, Ensemble, and Caché DBMS, I came across a great article about [logging with macros](https://community.intersystems.com/post/logging-using-macros-intersystems-cach%C3%A9). Inspired by the idea, I forked the project the paper had described and adapted it to some specific needs. The resulting solution is implemented as a panel subclass, %CSP.Util.Pane, which has the main window for commands, the Run button, and enabled command configuration. This application enables viewing and editing global arrays, executing queries (including JDBC and ODBC), emailing search results as zipped XLS files, viewing and editing objects, as well as several simple graphs for system protocols. The apptools-admin application is based on jQuery-UI, UiKit, chart.js, and jsgrid.js. You are welcome to have a look at the [source code](https://openexchange.intersystems.com/package/apptools-admin). ###Installation All installation methods are described in detail in the repo. However, the simplest approach is to use the package manager command: ``` zpm "install apptools-admin" [apptools-admin] Reload START [apptools-admin] Reload SUCCESS [apptools-admin] Module object refreshed. [apptools-admin] Validate START [apptools-admin] Validate SUCCESS [apptools-admin] Compile START [apptools-admin] Compile SUCCESS [apptools-admin] Activate START [apptools-admin] Configure START http://hp-msw:52773/apptools/apptools.core.LogInfo.cls http://hp-msw:52773/apptools/apptools.Tabs.PanelUikitPermissMatrx.cls?autoload=Matrix [apptools-admin] Configure SUCCESS [apptools-admin] Activate SUCCESS ``` The first suggested link must be opened in the address field of the browser. And in the loaded panel enter `?` and press the "Execute" button. The application then displays command examples. ![](https://lh5.googleusercontent.com/Tsh6XG7TAcQJHcxWPFIWU8FK6rPFYhxzTvxtiKvjw_QAKxGicy_sJt0WhTcG8zBXNvkQzLlRQPTN4juAk8vOn3gyUXJREfgPs9rqUoM8) ###Commands In the panel, you can run utilities, view and edit globals, and execute queries. Each launch is saved in history in the context of the namespace, so it can be found and repeated. In this context, the word "launch" means starting the execution of commands, and commands will mean everything that we enter in the panel. This screenshot shows an example of a global array `^%apptools.History` view command ![](https://lh4.googleusercontent.com/Viy-pXX3dVlNrfUX7SV4Alxb9pM3I-uDKAYgHRVJKP1hK9BuvkMIuP6oPfDNYrmJb-VTl8b12Fy61q63O-nH0FYG2u8zIeux2e-vvl1h) As you know, automatic error detection and notifications can be handled by popular solutions like Prometheus. But often the severity of errors can be assessed visually. Very often I need to quickly get information about bugs in production in all namespaces. For this, I implemented a utility: `##class(apptools.core.Production).FindAndDrawAllErr` This starts a daily search request for errors for each namespaces that contains working products, and allows you to view these errors with a quick transition to visual tracing. You can run this utility like any others in the apptools panel with the `xec` prefix. ![](https://lh3.googleusercontent.com/0olzck-lNvNLsCwBphoTWLwZdSZJrNpb3qbkul4WuuXD9NnMnwpXofCsay9FxVW8S4iWvZD7L3z-s5UrKpicBofeXUrHsAfeQrnkEU8C-fjXqcdV3dmVGBcZOtgnSuFxWAHI-2Dr) All useful commands can be memorized in the global extensions, in the context of the scope, to be found and repeated at any time. ![](https://lh4.googleusercontent.com/qBRtuZL_gOFOZD92CQOr0-w-NH8PfpVhIpQZYZENmblg8_jpW-dN_pF7bKiPAcWjkE3Tew6pU0k0NsLelUE1KFcCd4Xhl3bF4SjNdtttUGqNq0_eW6GtTIiP9iBx7bjJ2UnAkrF8) ###Globals A large part of the apptools-admin application is dedicated to working with globals. Globals can be viewed in reverse order, as well as by applying a filter on both the link and the data. The displayed notes can be edited or deleted. ![](https://lh4.googleusercontent.com/_FfwdGX_A11k4ue8vZ51_3qwuVvTJd8a0UgFqDPsRJICYuUGmcRMFjOxdG1sdHkLJR3Ea7m30BHSpx33wjDDCd5qVvN01ewWUefSfgNaTzA9Z9HK2iFdYmZZ9yLYuTlTSHFAGfqJ) You can enter the `*` wildcard after the global name to get a list of globals with additional characteristics. A second `*` will add a new field, Allocated MB. A third one will add the Used MB field. This syntax resolves to a Union of the two reports, and the asterisks divide the report that is typically rather long into manageable sections. ![](https://lh6.googleusercontent.com/1osTx0tWcdQlteMHlFjIw3K6SEjH_3gO6EpTUEsfyPgR3_ns8LR3mMIPQGt31ToANPqx0fB_Fkjh6tc6WeUSwS9_8bYx5UgRjHnOkUF0o0izVz7dBB9eok2skmsCoWZbeB7gk_kY) When you get a report as a list of globals (in the screenshot above), you can follow the active links to view the global itself. You can also view and edit the global in the standard way from the management portal, by clicking `R` or `W` in the `Permission` field. Quite often, writing to the global is used to log the states of variables and objects when debugging a project. I use special macros for this: `set $$$AppL("MSW","anyText")=$$$AppObJs(%request)` In this example, `$$$AppL` forms a link to a glob with the `^log` prefix, and the date and time in the index value. `$$$AppObJs` is the object serialization macro. ![](https://lh4.googleusercontent.com/AOTb2Axpzo_YlYNJacWM4k9RAdO0OmYlkYjnUtvEWM3Djc9VQL6NTuEo1mXR5m5K-PtHtsRVUXNwsd7lwkKjuicOvRCq5j2Mwx5P2eBN8lpyPiFacue4riVFkmakPidY5P5-Iyrw) You can view the protocol global in the panel, and the object can be displayed in the window fully formatted. ###Query The function that sees almost as much use as globals is query. You run this function by entering a statement as a command. For example, you can perform an SQL statement. ![](https://lh3.googleusercontent.com/uPQs2IAuSpdORQXaxy_rlzSFmaB9RxKoiVWRGyLsG_tthobEpxU8uBunOxOTi695q9yDCHr0Xjez8IE-U8HKWKOzpvczDmmgaFrcmHfCpo6hMXsxJCP05LtdeohTiTrrooYuSRyh) You can also save the result in the global `^mtempSQLGN`. ![](https://lh4.googleusercontent.com/HE44MxizdxfluYQyuEvEs1k7vmSNganzvoxPWTGfYnjJwgYWD7u9fBlCmHUFT2LOPzfLp8vBC23yJyDDYvnMZU7gwIoJjKaVMhv5WQ8Da2-_F-NrNdjpcYyd4V0BakEiRCcrbejZ) Subsequently, the saved result in the global can be displayed in the panel. ![[](https://lh3.googleusercontent.com/yJVXXpPBZMsT-eXI0FCaWs6f7YvWpMH4zBIKAv-ejtpCdAxqK8fSh3YEy_IbF-aPv9ijRLZXcgy026xLLEAS449CtVjzeKiv2coQa9eK7OmyIbCFOs7pLxJa7Trw525xO3DJFsMH) ###Converting Reports to Excel Format One of the things that was missing in the standard management portal was the ability to execute queries configured in the database JDBC or ODBC sources, output the results in XLS format, and then archive and send the file via email. To achieve this in the application, you simply select the Upload to Excel file checkbox before executing the command. This feature saves a lot of time in my daily routine, and allows me to successfully incorporate ready-made modules into new applications and integrated solutions. ![](https://lh4.googleusercontent.com/LhyeRllHAL6q-rBiRNbCAgGOflKF8OZjomLMCjVapJ2qbvhouPS44dIHmbwt4I3-LmADhgaSNPg-u57am73bcdNGTH97rWtdL1FEmXHI5O9eQYyTBINjidT2H8TGIrXIc6kt4MnV) To enable this functionality, you first need to configure the path for creating files on the server, user credentials, as well as the mail server. For that, in turn, you need to edit the nodes of the global program settings, `^%apptools.Setting`. ![](https://lh4.googleusercontent.com/cTDe7pUN7bhHYiweuWbdL0bXsF98UoVCPsyLt84xlp-vCEH5edjvTgxiNfPIZbKRnCGpUk1m8mr0aPKHFMs0JdIDdwqS53wCF_997Z3KrRrBqv6jKCam0zlPkklC_YTxm8gRXhPb) ###Saving Reports Globally Quite often, you need to save the results of a report execution to the global. For this, you can use these procedures: | | functions | |------------------------------|---------------------------------------------------------------------| |For JDBC: |##class(apptools.core.sys).SqlToDSN | |For ODBC: |##class(apptools.core.sys).SaveGateway | |For SQL: |##class(apptools.core.sys).SaveSQL | |For Query: |##class(apptools.core.sys).SaveQuery | For example, using the `##class(apptools.core.sys).SaveQuery` function, saves the result of the query `%SYSTEM.License:Counts` to the global `^mtempGN`. ![](https://lh5.googleusercontent.com/VTwoteSkKE0MRg00CojD8HCpcK7CNAr8wAVldyVRp3dweYbXampTmhfAkwdIqGdj6H3zkJQ4_qdnCugQkkdpkga1hbXCghSHyZ5pIOufqwu5vcEv9YF3zdE__AwHaPN-5DeK2t9k) You can then display in the panel what you’ve saved with the following command: `result ^mtempGN("%SYSTEM.License:Counts", 0)` https://lh5.googleusercontent.com/KCIekwZw3guq79GWxVdHYdAbWQc4u97-dr-hWT26lYE2oEzUTSkwCE4ki1zvNqRFBg6dKQshSqcy3YSgUbjFKgX3v7Ecpa5Bm_NEQuZhP8Fn8p1gzrmAdTR-Cg9jBeVcNWGukW3a ###Enhanced Functionality Modules What else simplified and automated my work? Changes that enabled me to execute custom modules when forming a query string. I can embed new functionality into the report on the fly — like active links for additional operations on the data. Let’s see some examples. We display the query result in the browser using the function: `##class(apptools.core.LogInfoPane).DrawSQL` ![](https://lh3.googleusercontent.com/2s0tgxOgbOBLy-Pt1e8bx_gKJWNe5YQ6AWLRUCU02TcpTiUscKYeoBEce2qdzCGlbAPzIukRn5EuJ9jwu8eATPCH13zoR8A2fQoAWZfx3RpieD_8rACgikcCZpcIoAIofxlzv2mT) Let's add the word marking function `##class(apptools.core.LogInfo)`.MarkRed to parameter 5. ![](https://lh6.googleusercontent.com/OyotzU3vmjoXw_MzA6amZbpPlpbL-li71OH5JRw7sAfiVoEsAvi8wSfY588kzdyXTURtGtinj0WvIKDhNLGyy50BD40E7NEQSpNv2Iv85lQisJaMBquvheuXVrMravp6OlNxkcqI) In the same way, you can supplement the output with additional features, for example, active links or tooltips. The globals editor in this solution is implemented according to the same principle. Here's a list of functions for outputting globals and queries in tabular form: | | functions | |---------------------------|----------------------------------------------------------------------------------------------------------------------------------------| |For globals: |##class(apptools.core.LogInfoPane).DrawArray("^mtempSQLGN") | |For SQL: |##class(apptools.core.LogInfoPane).DrawSQL("select * From %SYS.ProcessQuery") | |For Query: |##class(apptools.core.LogInfoPane).DrawSQL("query %SYSTEM.License:Counts") | |For global result: |##class(apptools.core.LogInfoPane).DrawSQL("result ^mtempSQLGN") | Working with the apptools.core.Parameter Class This link will open the CSP application in a browser in the context of an instance on which apptools-admin is installed: `http://localhost:52773/apptools/apptools.Form.Exp.cls?NSP=APP&SelClass=apptools.core.Parameter` Or select the active link in the panel. ![](https://lh4.googleusercontent.com/dt3oFX7Aum3yuJ4lvOtmhUWqm55GyFPPRGbsW7phZWRAnnJkB5xE0CdD3ddFEnS0-5xzSD_ydNe2hXp8Eqk1R39aioTZunY7bymF4EkPfaukm86sfFb-YrQp5Mx_KOyU9sr9cGbR) The CSP application will be loaded for editing instances of stored classes, in this example: `apptools.core.Parameter.` ![](https://lh5.googleusercontent.com/OLXVridH04HDDbufXUp9kZ70h08ptXrRcvDRThemPEira4KANa2ECTVGUJm7nuc3crqAnerWcJMToyipqM4YZCcnwqWRVXbOFKN0ZakCvpqrpdMsQZ0yXtCBgUt8z2U_JOmKnSFF) ![](https://lh4.googleusercontent.com/8JO4JQRssC22LGhab6dZiG6PnD2NRYIQtYsY9zj-Z99IIHxVpekzsxfV3Pw04SgxEqto_JepTXcht6vBu17D834Z_7_Hh-Yr5GmXSOsI5axLf7vIHxUi-tmTwcJH9DFlomurpgCH) ###Creating a apptools.core.Parameter via the Table Navigator If you open this link in a browser in the context of the instance on which apptools-admin is installed: `http://localhost:52773/apptools/apptools.Form.Exp.cls?panel=AccordionExp&NSP=APP` Or select the active link in the panel. ![](https://lh3.googleusercontent.com/5me2dJ5aItW6iixR4mBfVRMJHDZfXRnq_pkGrlmCtCTeKzsRx0MbopN0YcLdvEsoWs46Aqw_0fVJGk6L88AaFNWeajDgggpwYawRTbdUIhHRxWo7pFiv3dqj_JdO5wgmm_uZTL5_) The CSP application will be loaded for navigating the stored classes with the ability to edit them. ![](https://lh3.googleusercontent.com/TjtNmzFRS8fTOpsRU0XAXYCHYHNpenI9H1WsEPEtVz7bT2jhakKjsfdJ_inLXX-cBsu5PlKgSJjIS3VoHXD6dqzEm0PDrhy2eOPFT-BoHx6ToPB6Jio21lN1bloGk1xtdlRR7Gd-) ###An example of a simple CSP application If you open this link in a browser in the context of the instance on which apptools-admin is installed: `http://localhost:52773/apptools/apptools.Tabs.PanelSample.cls` Or select the active link in the panel. ![](https://lh3.googleusercontent.com/mqMOjz96bd2YmJdIQtdVYsZhYDFW73BMJtjQh2q1wzzKYrzE39kWGTd2-M0kpBQlxIT2bkv2V7o7ieIlyV7aU8XNF29oI3spIoLGJJAHOKppLrTVrrR2XwOJHAQgLXM3TEQPWGGj) This example also shows the ability to edit class instances `apptools.core.Parameter.` ![](https://lh4.googleusercontent.com/sFXN0QJJb1UuyNJPhykvDOJeOEWC3RrO7oV1dqYixKnPlgEDFJdBqj5bORhaXlftxvngbu-UdgCqvG2UEr7_hKUhjGtJk6jrDNgc43f7DwWCmuDnFubMuIcavHAh7Z1--R72Pf_Q) ###Graphs To visualize database growth, the application offers a page that displays a graph of the monthly measured database size. This graph is derived from the IRIS file.log (cconsole.log for Caché) on records "Expand" retrospectively from the current day. The program traverses the protocol, finds the database extension records and subtracts the incremental megabytes from the current database size. It turns out a graph of the growth of databases. For example, the screenshot below shows a graph of events in InterSystems IRIS formed by the protocol file. ![](https://lh4.googleusercontent.com/EbO0ZVyJwj1EgKF9SR6BpKPyBERj3cNgK4ckrDrzVWVu35LUlQAINvsbArTJ946XQWBhDUzS_dm4m3ize-RM7EjyRLQkesaNvNQOvK8FuUGwKx_8gqYlCMvmC2Xy2ih0xgZKx_q-) Another example below: a schedule of events in the system based on the system protocol file.log (cconsole.log). ![](https://lh6.googleusercontent.com/s3Uz-F88rFnBWSCS5_m4vtCQL9kdS2dEL101oWtlfmmNpfjF1PgtPppI2GC1g3syXIr39X1dUBO0O-gC5mDXcT1k6xOkXrz19TeRqpRAWrNG_FL6kMoyAZqS2N7mIDjG2BKpPy_j) ###Summary The application we’ve discussed in this article was designed to help me perform my daily tasks. It includes a set of modules which you can use as building blocks for a custom administrator tool. I would be very glad if you found it useful in your work. You are welcome to add your wishes and suggestions as tasks to the project [repo](https://github.com/SergeyMi37/apptools-admin).
Announcement
Anastasia Dyubaylo · May 4, 2020

Winners of the 2nd InterSystems IRIS Programming Contest!

Hi Developers! The second InterSystems Online Programming Contest is over. Thank you all for participating in our IRIS Competition! As a result - 7 great apps! And now it's time to announce the winners! A storm of applause goes to these developers and their applications: 🏆 Experts Nomination - winners were determined by a specially selected jury: 🥇 1st place and $2,000 go to the iris-history-monitor project by @Henrique 🥈 2nd place and $1,000 go to the Production Manager project by @Nikolay.Soloviev 🥉 3rd place and $500 go to the JSON-Filter project by @Lorenzo.Scalese 🏆 Community Nomination - an application that received the most votes in total: 🥇 1st place and $1,000 go to the iris-history-monitor project by @Henrique 🥈 2nd place and $500 go to the simple-spellchecker project by @henry Congratulations to all the participants! Thank you for your attention to the contest and the efforts you pay in this exciting coding competition! And what's next? A whole series of programming contests awaits InterSystems Developers! Join the next IRIS Contest already in May! ➡️ More details in this post. Hi!Congrats for your victory @Henrique and all nominate @Nikolay.Soloviev, @henry! Thanks to the community team for their advice and @Evgeny.Shvarov for his help and availability. Thank you for your votes! Hi, Thanks @Lorenzo.Scalese ! Congrats to all participants and special thanks for this community for the incredible support Thanks @Lorenzo.Scalese and congrats for the JSON-filter and the deserved nomination Congrats to all participants and the winners: @Henrique, @Nikolay.Soloviev and @Lorenzo.Scalese For such incredible appsThanks to all community Congratulations @Henrique for your great achievement! Congrats to all other winners and participants for their interesting and useful contributions! Thanks, @Francisco.Ramalho ! I'm thrilled to be remembered by you. You are an inspiration for me and for those who want to bring innovation! Hey Community, You should know all the contest participants and their cool apps! Please welcome: 🔥 @Oliver.Wilms and his REST for Tasks on my Status Report. 🔥 @Sergey Mikhailenko and his project isc-apptools-admin. 🔥 @alex kosinets and his EXCEL as a REST application. 🔥 @Henrique Gonçalves Dias and his project iris-history-monitor. 🔥 @Henry Pereira and his simple-spellchecker. 🔥 @Lorenzo Scalese and his JSON-Filter. 🔥 @Nikolay Soloviev and his project Production Manager. Thank you all for your great contribution to the InterSystems' world of developers! Hi guys, We're pleased to invite you to the Online Meetup with the Winners of the 2nd IRIS Programming Contest on Friday, May 8 at 11:00 EDT! What awaits you at this virtual Meetup? Please find all the details in this post. Join us! 😉
Announcement
Ksenia Samokhvalova · Aug 28, 2020

Share your thoughts on configuring and managing InterSystems products!

Hello Developer Community! We are looking to better understand how our users configure and manage our products. If you have a few minutes, please fill out this quick survey https://www.surveymonkey.com/r/N2JX3TQ If you're willing to participate in an in-depth interview about your experiences, you might be eligible for a $100 gift card! Indicate in the survey that you'd like to talk to us and we will be in touch the second week in September! Feedback from real users like you in invaluable to us and helps us create better product. Thank you so much! If you have any questions, please contact me at Ksenia.samokhvalova@intersystems.com I look forward to hearing from you! Ksenia Ksenia SamokhvalovaUX Designer | InterSystemsKsenia.samokhvalova@intersystems.com
Announcement
Anastasia Dyubaylo · Jan 7, 2021

InterSystems Multi-Model Contest Kick-off Webinar

Hi Developers, We're pleased to invite all the developers to the upcoming InterSystems Multi-model contest kick-off webinar! The topic of this webinar is dedicated to the Multi-model contest. On this webinar, we will demonstrate the APIs for each data model in action. Date & Time: Monday, January 11 — 10:00 AM EDT Speakers: 🗣 @Benjamin.DeBoe, InterSystems Product Manager🗣 @Robert.Kuszewski, InterSystems Product Manager - Developer Experience🗣 @Evgeny.Shvarov, InterSystems Developer Ecosystem Manager So... We will be happy to talk to you at our webinar! ➡️ JOIN THE KICK-OFF WEBINAR Today! Don't miss our kick-off webinar! ➡️ JOIN THE WEBINAR HERE Hey Developers, The recording of this webinar is available on InterSystems Developers YouTube! Please welcome: ⏯ InterSystems Multi-Model Contest Kick-off Webinar Big applause to our speakers! 👏🏼 And thanks to everyone for joining our webinar!
Announcement
Evgeny Shvarov · Jan 11, 2021

Technology Bonuses for Applications in InterSystems Multi-Model Contest

Hi Developers! Here're the technology bonuses for the InterSystems Multi-Model Contest that will give you extra points in the voting: InterSystems Globals (key-value) InterSystems SQL InterSystems Objects Your data model ZPM Package deployment Docker container usage See the details below. InterSystems Globals (key-value) - 2 points InterSystems Globals are multidimensional sparse arrays that are being used to store any data in InterSystems IRIS. Each Globals node could be considered a key, which you can set a value for. InterSystems IRIS provides a set of APIs, including ObjectScript commands and Native API to manage Globals. Tools: Managing globals in the management portal Documentation: Using Multidimensional Storage (Globals) Using Globals Articles: Globals are Magic Swords for managing data The art of mapping Globals to Classes Videos: Globals QuickStart You can collect 2 points for using Globals via ObjectScript or Native API in your InterSystems SQL - 2 points InterSystems IRIS provides SQL access to data via ObjectScript, REST API, JDBC. Tools: VSCode SQL Tools DBeaver SQL in Management Portal Other SQL tools Documentation: SQL Access InterSystems SQL Reference Articles: Class Queries in ObjectScript Videos: SQL Things you should know Collect 2 bonus points by using InterSystems SQL in your application. InterSystems Objects - 2 points InterSystems IRIS provides the way to store and change instances of objects in globals via ObjectScript/REST API, Native API for Java/.NET/Node.js/Python, and XEP for Java/.NET. Documentation: Object Access Get 2 bonus points for the usage of Object Access in your application. Your data model - 2 points InterSystems IRIS can be used as a data platform that exposes your own data model API. You are able to use ObjectScript, REST API or Native API to expose your own API which provides any special data model, like Time-Series, Spatial, Graph, RDF/Triple, Column store, Document store. Introduce any of the new data-model API and collect 2 bonus points. 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. Docker container usage - 2 points The application gets a 'Docker container' bonus if it uses InterSystems IRIS running in a docker container. You can collect the bonus if you use any of the following docker templates: IRIS Interoperability Template Feel free to ask any questions about using the listed technologies. Good luck in the competition! P.S. The current tech. bonus list is subject to change before the contest starts - stay tuned with the updates. Hi participants! In order to simplify the assessment for bonuses could you please include in the readme the links where your app uses a certain model type? E.g.: Object: https://github.com/intersystems-community/iris-multi-model-api-template/blob/8b3247f9dcd1e6e70274fde6bfdbe3f54ca0b95d/src/dc/Sample/MultiModelREST.cls#L85 SQL: https://github.com/intersystems-community/iris-multi-model-api-template/blob/8b3247f9dcd1e6e70274fde6bfdbe3f54ca0b95d/src/dc/Sample/MultiModelREST.cls#L95 Key-value: https://github.com/intersystems-community/iris-multi-model-api-template/blob/8b3247f9dcd1e6e70274fde6bfdbe3f54ca0b95d/src/dc/Sample/MultiModelREST.cls#L104 Hi Manager! According to your request, I added the model corresponding link in the readme file!Hope to get technical score in the competition。 Application name:HealthInfoQueryLayer readme file:https://github.com/ZBT-95/-IRIS-/blob/main/README.md Thanks, Botai Zhang!
Article
Eduard Lebedyuk · Jan 12, 2021

How to work with InterSystems IRIS from DataGrip

DataGrip is a multi-engine database environment targeting the specific needs of professional SQL developers, DataGrip makes working with databases an enjoyable and productive experience. To work with InterSystems IRIS from DataGrip you'll need to add InterSystems JDBC driver first (once per DataGrip) and after that add all your InterSystems IRIS connections. Part 1: Add InterSystems IRIS JDBC Driver 1. Go To File → DataSources 2. Go to + → Driver 3. Set Driver properties: Name: InterSystems IRIS Class: com.intersystems.jdbc.IRISDriver Add JDBC Driver file: path to /<IRIS>/dev/java/lib/JDK18/intersystems-jdbc-3.2.0.jar (version can change, also if you don't have InterSystems IRIS installed, you can download the drivers here) Add URL Template: Basic jdbc:IRIS://{host}[:{port}]/{database} (you can add additional parameters as described here) 4. Click OK to save the driver definition. Part 2: Add InterSystems IRIS Instance 1. In the same DataSources window go to +→InterSystems IRIS 2. Specify connection settings depending on your instance and click Test Connection. You'll see an error or connection successful. It it's a new local installation the defaults likely are: Host: localhost Port: 1972 User: _SYSTEM Password: SYS Database: USER 3. Click OK to save. That's it! Now you can query and explore InterSystems IRIS through Datagrip.
Article
José Pereira · Sep 1, 2021

Implementing an IMAP Client in InterSystems IRIS - part I

This article explains how to use the InterSystems IRIS platform to write a basic IMAP client. First, we present an overview of IMAP, then we discuss the main IMAP commands and client implementation. Finally, we offer a simple use of this IMAP client on the IRIS interoperability application. Note that this article isn’t a detailed IMAP explanation. For more detailed information, please check the references of this article. IMAP Overview The Internet Message Access Protocol (IMAP) lets users retrieve emails. Mark Crispin proposed IMAP in the 1980s, and since then, the protocol has been published and revised in RFC 3501. At the time of writing this article, its current version is IMAP4rev1. It’s important to note that this protocol is designed for retrieving only. You must use another protocol, the Simple Mail Transfer Protocol (SMTP), if you need to send emails. There’s also an older protocol for email retrieval that’s as popular as IMAP, called Post Office Protocol version 3 (POP3). Trying Basic IMAP Commands Like POP3, IMAP is a plaintext protocol. You can easily try some of its commands by yourself, using a TCP client like Telnet or OpenSSL. First, you need your IMAP host and email server port. For instance, at the time of writing this article, this is the host and port to connect to the Microsoft Outlook service: outlook.office365.com:993 Let’s connect to this server using our TCP client. Enter the command below and hit ENTER. Note the use of the -crlf flag. This flag is mandatory for IMAP as carriage return and line feed (CRLF) is its line terminator. $ openssl s_client -connect outlook.office365.com:993 -crlf -quiet After you hit enter, the IMAP server shows you some information and stays waiting for input. depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert ... * OK The Microsoft Exchange IMAP4 service is ready. [...] Now we can perform our first IMAP command: CAPACITY. As its name suggests, this command presents features that the server can provide. Note that the first line is the IMAP command itself, and the others lines are its output - this is the same for all other IMAP commands presented here. TAG1 CAPABILITY * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+ TAG1 OK CAPABILITY completed. Note the token before the CAPABILITY command: TAG1. A tag must precede every IMAP command and is any string you want. They identify what command instance the server is responding to. Generally, a simple counter with a prefix fits all your needs. The IMAP server finishes the response with the tag you used to issue the command and a flag indicating the command’s status, followed by miscellaneous information related to the command and status. The statuses allowed are: OK (success), NO (failure), and BAD (wrong command). The command LOGIN expects user and password as arguments. First, let’s check how the server responds if someone gives an invalid username and password: TAG2 LOGIN user@outlook.com wrong-password TAG2 NO LOGIN failed. Note the NO status after the command tag. Now, let’s proceed to a valid login: TAG3 LOGIN user@outlook.com password TAG3 OK LOGIN completed. Now we’re logged in. To finish our session, we use the LOGOUT command: TAG4 LOGOUT * BYE Microsoft Exchange Server IMAP4 server signing off. TAG4 OK LOGOUT completed. We need other commands to implement our IMAP client, so we need to reconnect and log into our IMAP server again. Let’s get some information about the inbox next. First, we must tell the server which mailbox we want to access, INBOX in this case. TAG5 SELECT "INBOX" * 14 EXISTS * 0 RECENT ... TAG5 OK [READ-WRITE] SELECT completed. Now we are ready to access messages in our inbox, but we need a way to refer to them first. There are two ways to do that: by message number or by a unique identifier (UID). Message numbers are just counters, starting from 1 and going up to the number of messages within the inbox. When you delete a message, all following messages have their numbers decremented by 1. You can think of this as an array that has one of its elements removed. UIDs, on the other hand, keep their value whatever happens to the other messages. You can get UIDs using the UID SEARCH command. This command accepts a message number if you'd like to get a specific UID or the ALL parameter to get all UIDs in the directory. In the example below, we search for UID for message number 1, which is 483. TAG6 UID SEARCH 1 * SEARCH 483 TAG6 OK SEARCH completed. Now let’s retrieve message information, like headers, body, and attachments. We use the FETCH command for this. This command has plenty of parameters, which you can explore in detail on RFC 3501. In this article, we only address parameters related to the needs of the IMAP client implementation. The first information we need for this demonstration is the message size. We can get this information using the RFC822.SIZE parameter: TAG7 FETCH 1 RFC822.SIZE * 1 FETCH (RFC822.SIZE 70988) TAG7 OK FETCH completed. This indicates that the size of message number 1 is 70,988 bytes. Note that it’s also possible to use UIDs rather than message numbers to fetch message information: TAG8 UID FETCH 483 RFC822.SIZE * 1 FETCH (RFC822.SIZE 70988 UID 483) TAG8 OK FETCH completed. You can also get the basic From, To, Date, and Subject message headers: TAG9 FETCH 1 (FLAGS BODY[HEADER.FIELDS (FROM TO DATE SUBJECT)]) * 1 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS (FROM TO DATE SUBJECT)] {157} Date: Thu, 22 Apr 2021 15:49:05 +0000 From: Another User <anotheruser@outlook.com> To: user@outlook.com Subject: Greetings from Another User! FLAGS (\Seen)) TAG9 OK FETCH completed. Now let’s retrieve the message body. We can retrieve all the body content using this command: TAG10 FETCH 1 BODY[] * 1 FETCH (BODY[] {9599} ... MIME-Version: 1.0 --00000000000041bd3405c3403048 Content-Type: multipart/alternative; boundary="00000000000041bd3205c3403046" --00000000000041bd3205c3403046 Content-Type: text/plain; charset="UTF-8" ... --00000000000041bd3405c3403048 Content-Type: image/png; name="download.png" Content-Disposition: attachment; filename="download.png" ... TAG10 OK FETCH completed. We can see in this code that some blocks are delimited by hex numbers between -- --, called parts. A message with parts is called a multipart message. It’s possible to get such parts directly by passing the part index to the command. In order to delete messages, the protocol has the commands STORE and EXPUNGE, which mark a message as deleted and commit such an operation. TAG11 STORE 1 +FLAGS (\Deleted) * 0 EXISTS * 0 RECENT TAG11 OK [READ-WRITE] SELECT completed; now in selected state TAG12 EXPUNGE EXPUNGE: TAG12 OK EXPUNGE completed The last command is simple: NOOP. This command does nothing but is used to implement a keep-alive strategy. By default, the IMAP session closes after 30 minutes without commands. So, issuing the NOOP command keeps the connection active. TAG17 NOOP TAG17 OK NOOP completed. And this finishes our IMAP overview. If you’d like more information, there are a lot of good articles on the Web (I've selected some in resources section), and of course always remember the RFC 3501. Resources Atmail’s IMAP 101: Manual IMAP Sessions Fastmail’s Why is IMAP better than POP? IETF’s Internet Message Access Protocol IETF’s Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies Nylas’ Everything you need to know about IMAP Next part, you'll use those commands within IRIS and see them in action! See you!
Announcement
Anastasia Dyubaylo · Dec 9, 2021

Video: InterSystems HealthShare Unified Care Record

Hey Developers, Learn about the recent changes to InterSystems HealthShare Unified Care Record and what is coming next: ⏯ InterSystems HealthShare Unified Care Record Presenters:🗣 @Sebastian.Musielak, Product Manager, HealthShare Operations, InterSystems🗣 Melanie Davies, Product Manager, Unified Care Record, InterSystems Subscribe to the InterSystems Developers YouTube channel and stay tuned!
Announcement
Anastasia Dyubaylo · Dec 27, 2021

2nd InterSystems Tech Article Contest: And the Winners are...

Hey everyone, Lots of new content to read! Thanks to our wonderful participants of the 2nd InterSystems Tech Article Contest! 🌟 25 AMAZING ARTICLES 🌟 So it's time to announce the best of them! Let's meet the winners and their articles: ⭐️ Expert Awards – winners selected by InterSystems experts: 🥇 1st place: Data anonymization, introducing iris-Disguise by @henry 🥈 2nd place: IntegratedML hands-on lab by @José.Pereira 🥉 3rd place and two winners: VSCode-ObjectScript on GitHub by @Dmitry.Maslennikov Invite the FHIR® Accelerator Service to your Kubernetes Microservice Party by @sween ⭐️ Community Award – winner selected by Community members, article with the most likes: 🏆 Data anonymization, introducing iris-Disguise by @henry Hope this win will be a great Christmas present for all of the winners! ⭐️ This time, we'd like to reward some more authors for the number of contributions: @Yuri.Gomes: 4 articles! @MikhailenkoSergey: 3 articles! These guys will get Apple AirPods Pro OR Amazon Kindle 8G Paperwhite OR Raspberry Pi 4 8GB with InterSystems IRIS Community Edition ARM installed! And... Let's congratulate all our heroes at https://community.intersystems.com/contests/2: @Robert.Cemper1003 @Henrique @Muhammad.Waseem @Rob.Tweed @John.Murray @alex.kosinets @Iryna.Mykhailova @Oliver.Wilms @Rizmaan.Marikar2583 THANK YOU ALL! You have made an incredible contribution to our Dev Community! Happy Holidays to everyone! 🎅 The prizes are in production now. We will contact all the participants when they are ready to ship Thanks my reward and congrats for the participants, great articles! Congratulations everyone. Very impressive! ![yeee](https://media0.giphy.com/media/l4FGAREbOSRLKMiNq/giphy.gif) What a wonderful surprise!! Thank you all community and congratulations to all participants Congratulations all, and happy new year Congratulations to ALL. It was nice competition Congratulations to the authors :-) Thanks everybody!!! Congratulations! We're lucky to have airpods as the third place prize. Those were easy to split equally between the tied contestants :-) Congratulations! Well done everyone! And now we have beautiful badges for all the winners on Global Masters tied to levels - so these badges will help you to move up through GM levels! Congrats and Happy New Year! Dear participants, regarding prizes and swag delivery: we will be in touch with you at the beginning of January - shortly after the Holidays.
Announcement
Anastasia Dyubaylo · Sep 10, 2022

[Video] Overview of Basic Components for InterSystems Integration Solutions

Hey Community, In this demonstration you will see the building blocks of an integration in InterSystems IRIS for Health and HealthShare and see how messages are received, processed, and sent—including messages in the HL7 format: ⏯ Overview of Basic Components for InterSystems Integration Solutions Don't miss the latest videos for InterSystems developers on our DC YouTube!
Announcement
Anastasia Dyubaylo · Apr 6, 2022

InterSystems at "J On The Beach" International Conference in Málaga, Spain

Hey Developers, Good news! One more upcoming in-person event is nearby. We're pleased to invite you to join "J On The Beach", an international rendezvous for developers and DevOps around Big Data technologies. A fun conference to learn and share the latest experiences, tips & tricks related to Big Data technologies, and, the most important part, it’s On The Beach! 🗓 April 27-29, 2022 📍Málaga, Spain This year, InterSystems is a Gold Sponsor of the JOTB. We're more than happy to invite you and your colleagues to our InterSystems booth for a personal conversation. As always, there will be some surprises on it... 😁 In addition, on the first day of the Conference @David.Reche and @Eduardo.Anglada will give a talk called "Captain Kirk, exoplanet found on route using Auto Machine Learning. 🎯 More details can be found at jonthebeach.com Looking forward to seeing you soon!
Announcement
Anastasia Dyubaylo · Aug 26, 2022

[Video] Using the Business Process Designer in InterSystems IRIS

Hey Developers, New video is already on InterSystems Developers YouTube channel: ⏯ Using the Business Process Designer in InterSystems IRIS See how to construct a new business process, which provides business logic and routing capabilities within an InterSystems production. Learn how to build a BPL business process using the Business Process Designer in the Management Portal. Also, try building one yourself using an InterSystems IDE. Enjoy watching!
Announcement
Anastasia Dyubaylo · Aug 30, 2022

[Video] Creating Complex Decision Logic with InterSystems IRIS

Hey Developers, Meet the new video on InterSystems Developers YouTube channel: ⏯ Creating Complex Decision Logic with InterSystems IRIS Using the graphical interface of the Business Rule Editor in InterSystems IRIS data platform, nontechnical users can set up business rules to better process records and untangle complex data. Like and share! Very helpful and nice use of features. I appreciate the real-world use case and thorough explanation!