Clear filter
Announcement
Anastasia Dyubaylo · May 25, 2020
Hey Developers,
The recording of the Kick-Off Webinar for InterSystems IRIS Native API Online Programming Contest is now available on InterSystems Developers YouTube:
Speakers: @Robert.Kuszewski, InterSystems Product Manager@Evgeny.Shvarov, InterSystems Developer Ecosystem Manager
The topic of this webinar is dedicated to the InterSystems IRIS Native API programming contest. In this competition, we would like to see what kinds of interesting applications can be built using the Native API.
This video describes the Native API Contest Template that demonstrates all 4 NativeAPIs setup and work. This template will help you to get started with the contest.
⬇️ Download the Native API Contest Template
We hope that you’ll enjoy the new APIs and have fun hacking!
Stay tuned! 👍🏼 I was unable to attend so I took the recording. The content was important and good to understand.But the shared desktops are all unreadable in the video. Hi Robert,
Please try again. 1080 HD is already available. 😊 Sorry my fault: my quality was set back to 240 (!) as I was watching High Noot wich Garry Cooper last time
with 1080 HD it is excellent Great! I was unable to attend too. I have some points with the IRIS Native API documentation whats the best channel to report? Good luck for all contestants Hi Renato!
Thanks for participating in the contest!
You can submit a new question here on Developers Community, or ask in Discord, or report on the problem to support@intersystems.com
Announcement
Anastasia Dyubaylo · Jun 23, 2020
Hi Developers,
Please welcome the new coding talk on InterSystems Developers YouTube:
⏯ How to Generate Modules for InterSystems Package Manager (ZPM)
This video describes how to generate module.xml descriptions for InterSystems IRIS Package Manager (ZPM) automatically.
Useful Resources:
Download ZMP from Open Exchange
ZPM 0.2.3 Release
ZPM Documentation
Big applause to @Evgeny.Shvarov! 👏🏼
Enjoy and stay tuned! How could you know that I was just looking for this ??? Because this is how we work, Robert :) Only this way ;)
Thanks @Anastasia.Dyubaylo!
Announcement
Georgina Finneran · Aug 12, 2020
All Interested Applicants Please Apply Here : https://www.indeed.com/job/remote-software-engineer-must-have-intersystems-or-iris-experience-cb27a40d004e96ec
RxMx is a fast-growing company at the intersection of technology and healthcare. Founded by four specialist physicians, our driving philosophy is developing medical systems that ensure the safe delivery of complex and sophisticated medicines, with minimal burden on both physicians and patients. We supply innovative technology solutions to our pharmaceutical clients that improve patient safety, reduce the complexity in drug launch and provide a platform for real world data.
We are looking for a Software Engineer to enhance, maintain and support new and existing software products and solutions. This role will work closely with clinical staff and product managers to product requirement specifications and work closely with other developers and QA Engineers to product high quality working software.
Essential Functions:
Participate in SDLC that leverages best practice and supports the design and delivery of sophisticated clinical applications.
Support the conversion of business systems and functional requirements into working software in established timelines and using best practices.
Work with clinical staff and product managers to produce requirement specifications and establish timelines for delivery.
Proactive and create thinking to problem solving to develop out of the box products. As well as Enhancing, maintaining, and supporting existing solutions.
Create and maintain appropriate documentation for software produced.
Correct errors by making appropriate changes and then rechecking the program to ensure that the desired results are produced.
Conduct trial runs of programs and software applications to be sure they will produce the desired information and that the instructions are correct.
Compile and write documentation of program development and subsequent revisions, inserting comments in the coded instructions so others can understand the program.
Clearly communicate and consult with managerial, engineering, and technical personnel to clarify program intent, identify problems, and suggest changes.
Conduct code reviews, and approve or reject pull requests.
Participate in capacity planning, assignment of work, team meetings and stand ups.
Qualifications:
Degree in Computer Science or related technical field and/or 5+ years of related practical work experience.
Experience with source control. BitBucket experience beneficial.
Experience with Atlassian tools such as JIRA and Confluence.
Experience with Agile methodologies.
Must be independent yet a team player with great communication skills.
Must be a go-getter, that can make things happen in a high paced environment.
Experience in Healthcare IT working with HL7 and other EMR and Lab integrations.
Experience with full stack development, with Angular experience preferred.
Experience with Intersystems technology is required.
To be successful in this role, you must have/be:
Ability to effectively identify what is important and prioritize competing projects.
Ability to problem solve in a resourceful and data-driven manner while working in a fast-paced, demanding environment.
A self-driven, results-oriented problem solver with a positive outlook.
We are proud of our collaborative culture and our dedicated team driven to improve treatment options for patients. Our company offers great benefits including flexible hours, remote work, and fun perks such as an extra vacation day on your birthday. While our offices are in Sydney, New York, and Berlin, we maintain the atmosphere of a small, close-knit company with employees who enjoy being social.
Further information on our company background and mission can be found at: https://rxmxcorp.com/
RxMx, Inc. provides equal employment opportunity to all individuals regardless of their race, color, creed, religion, gender, age, sexual orientation, national origin, disability, veteran status, or any other characteristic protected by federal, state or local law.
All Interested Applicants Please Apply Here : https://www.indeed.com/job/remote-software-engineer-must-have-intersystems-or-iris-experience-cb27a40d004e96ec
Article
Andrey Shcheglov · Dec 13, 2018
Astronomers’ tools
5 years ago, on December 19, 2013, the ESA launched an orbital telescope called Gaia. Learn more about the Gaia mission on the official website of the European Space Agency or in the article by Vitaly Egorov (Billion pixels for a billion stars).
However, few people know what technology the agency chose for storing and processing the data collected by Gaia. Two years before the launch, in 2011, the developers were considering a number of candidates (see “Astrostatistics and Data Mining” by Luis Manuel Sarro, Laurent Eyer, William O’Mullane, Joris De Ridder, pp. 111-112):
IBM DB2,
PostgreSQL,
Apache Hadoop,
Apache Cassandra and
InterSystems Caché (to be more precise, the Caché eXTreme Event Persistence technology).
Comparing the technologies side-by-side produced the following results (source):
Technology
Time
DB2
13min55s
PostgreSQL 8
14min50s
PostgreSQL 9
6min50s
Hadoop
3min37s
Cassandra
3min37s
Caché
2min25s
The first four will probably sound familiar even to schoolchildren. But what is Caché XEP?
Java technologies in Caché
If you look at the Java API stack provided by InterSystems, you will see the following:
The Caché Object Binding technology that transparently projects data in Java. In Caché terms, the generated Java proxy classes are called exactly like that - projections. This approach is the simplest, since it saves the “natural” relations between classes in the object model, but doesn’t guarantee great performance: a lot of service metadata describing the object model is transferred “over the wires”.
JDBC and various add-ons (Hibernate, JPA). I guess I won’t tell you anything new here apart from the fact that Caché supports two types of transaction isolation: READ_UNCOMMITTED and READ_COMMITTED – and works in the READ_UNCOMMITTED mode by default.
The Caché eXTreme family (also available in .NET and Node.js editions). This approach is characterized by the direct access to the low-level data representation (so-called “globals” – quanta of data in the Caché world) ensuring high performance. The Caché XEP library simultaneously provides object and quasi-relational access to data.
Object – the API client no longer needs to care about object-relational representation: following the Java object model (even in cases of complex multi-layer inheritance), the system automatically creates an object model on the Caché class level (or a DB schema if we want to use the terms of the relational representation).
Quasi-relational – in the sense that you can run SQL queries against multiple “events” stored in a database (to be exact, requests using the SQL subset) directly from the context of an eXTreme-connection. Indices and transactions are fully supported as well. Of course, all loaded data become immediately accessible via JDBC and a relational representation (supporting all the powerful features of ANSI SQL and SQL extensions specific to the Caché dialect), but the access speed will be completely different.
Summing up, here’s what we have:
“schema” import (Caché classes are created automatically), including
import of the Java class hierarchy;
instant relational access to data – you can work with Caché classes the way you work with tables;
support of indices and transactions via Caché eXTreme;
support of simple SQL queries via Caché eXTreme;
support of arbitrary SQL queries via the underlying JDBC over TCP connection (Caché uses the standard Type 4 (Direct-to-Database Pure Java) driver).
This approach offers some advantages in comparison with comparable relational (higher access speed) and various NoSQL solutions (instant access to data in the relational style).
The “nuance” of configuring Caché eXTreme prior to connecting is the environment set-up:
the GLOBALS_HOME variable has to point to the Caché installation folder and
LD_LIBRARY_PATH (DYLD_LIBRARY_PATH for Mac OS X or PATH for Windows) has to contain ${GLOBALS_HOME}/bin.
Additionally, you may need to increase the stack and heap size of the JVM (-Xss2m -Xmx768m).
Some practice
The authors were interested in how Caché eXTreme would behave while writing an uninterrupted stream of data in comparison with other data processing technologies. We used historical stock price data in the CSV format from the website of the “Finam” holding. Sample data file:
<TICKER>,<PER>,<DATE>,<TIME>,<LAST>,<VOL>
NASDAQ100,0,20130802,09:31:07,3 125.300000000,0
NASDAQ100,0,20130802,09:32:08,3 122.860000000,806 906
NASDAQ100,0,20130802,09:33:09,3 123.920000000,637 360
NASDAQ100,0,20130802,09:34:10,3 124.090000000,421 928
NASDAQ100,0,20130802,09:35:11,3 125.180000000,681 585
The code of the Caché class modeling the above structure might look like this:
Class com.intersystems.persistence.objbinding.Event Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, SqlTableName = Event ]
{
Property Ticker As %String(MAXLEN = 32);
Property Per As %Integer(MAXVAL = 2147483647, MINVAL = -2147483648);
Property TimeStamp As %TimeStamp;
Property Last As %Double;
Property Vol As %Integer(MAXVAL = 9223372036854775807, MINVAL = -9223372036854775810);
}
We also wrote some basic and naive test code. This “naive” approach can be justified by the fact that we are not really measuring the speed of the code generated by JIT, but the speed at which the code that is completely unrelated to JVM (with the exception of Apache Derby) can write to the disk. Here’s how the test program window looks like:
Our contenders:
Apache Derby 10.14.2.0
Oracle 10.2.0.3.0
InterSystems Caché 2018.1 (JDBC)
InterSystems Caché 2018.1 (eXTreme)
Note that since tests are somewhat approximate, we saw no practical purpose in providing exact numbers: the margin of error is fairly high, while the goal of the article is to demonstrate the general tendency. For the same reasons, we are not specifying the exact version of JDK and the settings of the garbage collector: the server-side JVM 8u191 with -Xmx2048m -Xss128m reached a very similar level of performance on Linux and Mac OS X. One million events were saved in each test; several warm-up runs (up to 10) were performed before each test of a particular database. As for Caché settings, the routine cache was increased to 256 MB and the 8kb database cache was expanded to 1024 MB.
Our testing yielded the following results (the write speed values are expressed in events per second (eps)):
Technology
Time, s (less is better)
Write speed, eps (more is better)
Apache Derby
140±30
7100±1300
Oracle
780±50
1290±80
Caché JDBC
61±8
17000±2000
Caché eXTreme
6.7±0.8
152000±17000
Caché eXTreme, transaction journaling disabled
6.3±0.6
162000±14000
Derby offers speeds varying from 6200 to 8000 eps.
Oracle turned out to be as fast as 1290 eps.
Caché in the JDBC mode gives you a higher speed (from 15000 to 18000 eps), but there is a trade-off: the default transaction isolation level, as mentioned above, is READ_UNCOMMITTED.
The next option, Caché eXTreme, gives us 127000 to 167000 eps.
Finally, we took some risk and disabled the transaction log (for a given client process), and managed to achieve the write speed of 172000 eps on a test system.
Those who are interested in more accurate numbers can view the source code. You will need the following to build and run:
JDK 1.8+,
Git,
Maven
Oracle JDBC driver (available from Oracle Maven Repository)
Maven Install Plugin for for creating local Caché JDBC and Caché eXTreme artifacts:
$ mvn install:install-file -Dfile=cache-db-2.0.0.jar
$ mvn install:install-file -Dfile=cache-extreme-2.0.0.jar
$ mvn install:install-file -Dfile=cache-gateway-2.0.0.jar
$ mvn install:install-file -Dfile=cache-jdbc-2.0.0.jar
and, finally,
Caché 2018.1+.
Great post! I have a followup question: How did you load the Finam data? Was it "over the wire" all at once? Or were you reading from one or more csv files? Hi Joel!Finam.ru is a trade broker for MOEX - Russian stock exchange. Previously they had an API to download quotes for any securities. What I see now they at still have the UI to download quotes e.g. in CSV - here is the link do download GAZPROM quotes. Evgeny, if I understand you, you're saying that they downloaded the quotes to a CSV file and then they read in the CSV file. I'm now wondering if/how they "chunked" the quotes. Did they read in and store each quote one at a time, or did they read in 1000 quotes into a Java array and then store those quotes, read in another 1000 and store those, etc. Joel, the code just reads one line at a time, immediately storing its parsed value into the database (within the same execution thread).Strictly speaking, this is a mix of a CPU-bound and I/O-bound tasks within the same thread, and we should have 3 threads instead:one reading from the local disk (I/O);the 2nd one parsing the CSV line, andthe last one storing the parsed value into the (potentially, remote) database.The 3-thread approach should improve the timings (for all the databases being tested), but the relative values are unlikely to reveal any substantial changes.Additionally, I have to remark that the auto-commit flag is off over each session, with a single commit issued after all the data are saved. In a real-life application, one should additionally issue intermediate commits (say, after each 1000 or 10000 of records). Can you tell me if all the figures stated are those that Intersystems created/monitered/collated from their own installations of the alternative databases or are the figures collated and verified by an external 3rd party company?forgive me but its easy to slant figures based upon marketing requirements.kevin Kevin, all the benchmarks have been run by me at one of my workstations (Intel Core i7-4790).The same Seagate ST1000DM010-2EP102 7200 rpm HDD was dedicated to host the data files over all experiments, with no other read or write operations interrupting it during each session.So, summing it up, there has been no relation to ISC infrastructure.I can share the detailed hardware specs if you need them. Or you can try and run the benchmark on your own hardware. Hi Kevin!I examined the article. It has two sources of figures: from EISA and from Andrey's personal research. Both have no relation to InterSystems official benchmarking.So, the answer is no - nothing Intersystems official here, only 3rd party researches. Andrey, Evgeny:while it was 3d party research, there are some signs of Caché performance tuning: global cache and routine cache were manually enlarged, journaling was switched off at the process level. Were the similar tuning steps performed for other DBMSs used in the research? AFAIK, Oracle would not allow to stop transaction logging (=journaling) at all. Only few people have appropriate knowledge of all DBMS products listed in the article (maybe Andrey is one of them), and nobody would touch hidden or semi-hidden performance parameters without it.That's why I doubt if an Oracle engineer (or even DBA) would approve such "derby" results. Shouldn't we agree with an author of the sentence? :...a single view of Oracle has lead to vastly different results, like the difference between a circle and a square. Always remember that there is no substitute for a real-world test that simulates the actual behavior of your production systems, using your own production SQL (http://www.dba-oracle.com/t_benchmark_testing.htm) hv they migrate to IRIS? how is IRIS performance against others?
Announcement
Anastasia Dyubaylo · Dec 4, 2018
Hi Everyone!
As you know Advent of Code 2018 is in full swing! Till the 25th of December 2018 each day 2 programming problems to sharpen your programming skills!
And now we're ready to present great prizes for Members of InterSystems Global Masters Advocate Hub!
Win Conditions: To win our prize you should be on the top of ObjectScript Leaderboard and upload all the solutions in a public repository and present the code in InterSystems ObjectScript in UDL form. The example of the repo.
Prizes:
→ 1st Place: 10 000 points on Global Masters and FREE registration & hotel accommodation for the next InterSystems Global Summit 2019 [!!!]
→ 2nd Place: 5 000 points on Global Masters
→ 3rd Place: 3 000 points on Global Masters
Note: Don't forget to use our own InterSystems Leaderboard, with the code 130669-ab1f69bf or the direct link.
Good luck to all of you! How to join Global Masters?Please leave a comment to this post and we'll send you an invite! Yet another great example of a repo for Advent of Code in ObjectScript Hi Anastasia. I'd like to receive an invite to join Global Masters. Thank you. Hi Angelo!You're invited. Please check you mail! What I have seen happen a few times allready is that people from our leaderboard just copy the solution from another person in another language and submit the results without having done any coding at all. For example day 7 last solution to fill top 100: 00:30:52fastest solution part1: 00:09:27fastest solution part2(after doing part1): 00:03:34Someone on our leaderboard got this:solution part1: 00:39:16solution part2: 00:00:13He did the second part in 13 seconds while the fastest person on the leaderboard took 3 minutes and half to do it. The second solution took quite a bit of programming and the 100th player to finish star 2 needed allmost 10 minutes. Someone on our leaderboard: 13 seconds.This means he just copied a solution from another player, put in answer 1, after that was accepted he inserted answer 2 and submitted again.Clearly because a big price is involved people resort to playing unfairly.I only see 2 ways to fix this:- Remove players who have been caught cheating- Let all people post their public repository on here and after each star rerquire them to push their solution to that repository.This doesnt stop people from copying from other players in our competition but at least forces people to use Caché. Blantant copying will still be spotted because the code will resemble another competitors code. Also this will make it so that a copying person cant win the day anymore cause he will have to wait for at least one other caché player before he can start copying.What are your thoughts on this? My public repo: https://bitbucket.org/bertsarens/aoc2018/ Maybe we should even start the competition from the day where we are working on the new way. Hi Bert!I think you are right twice. First, no one can stop cheating in the world and the second no one can win this contest with cheating. And of course no one can stop copy-n-paste in coding :) On the other hand, there is a chance to know something new even with copy-pasting.As a community manager, I would love to see more open repositories with ObjectScript and I like what we had last year - the open discussion of Advent of Code problems solved with ObjectScript. Thanks for sharing your repo! Speaking about the prize it's clear that it can be interesting only to people who develop with InterSystems Data Platforms and I believe this is the key motivation to win. As we see it now the competition is active and healthy, we don't plan to change any rules but encourage the fair play. Submitted code is not public by default.Players get different inputs for puzzles.All timings are calculated from the moment the puzzle is published, not the moment you start working on it.Assuming fastest coder would publish the code, finding it and rewriting it is going to take time.Moreover fastest solutions usually use, let's say, advanced language-specific concepts, so starting from scratch could often go even faster. My repo the same for previous years. https://github.com/daimor/AdventOfCode Changing the rules during a competition is a very bad idea.Participating in a game includes accepting the published and know rules. Accept it or run a different game.Even my grand-children starting from 5 understand this. Bert,
I'd be curious where you get the data points from, I haven't been able to see other people's times. Also keep in mind, sometimes the way you do a solution is a maker/breaker on how quickly you get the second part. Day10 was another great example for that.
I don't think you're accusing me of this since it took me more than 16 minutes to get from part1 to part2 on day7. But just in case you're doubting, here's my code: https://github.com/kazamatzuri/AoC/tree/master/AoC/User
And yes, I did day 2/3 in python ... And for the record, I'm quite certain I'm not eligible for the price anyways ;) I would also be very cautious of trying to make judgements based on the way people implemented things. For some of the puzzles there are very clear 'best solutions' and one would expect people with the necessary training in data structures/algorithms will simple go with a similar implementation because 'that's the way you solve a problem like that'. I'm sure once we get to harder problems that might change, but for these beginning problems there isn't a good way to fix this. I am not accusing you of anything Fabian, on the contrary your results seem to show you are creating solutions yourself.The data points can be found here: https://adventofcode.com/2018/leaderboard/private/view/130669.jsonYou can view the results for yourself. Nice visualiser for the results: https://mcpower.github.io/aoc-leaderboard-viewer/ ah! I hadn't found the json api, that's neat. Thanks for pointing me towards that! I decided to participate too!Here is my repo.And here is a short "Coding talks" Video on how to code Advent of Code and use Github and VSCode. Wow day 15 took time but was a lot of fun:I allmost made the leadeboard today:
15 02:27:08 159 0 02:39:24 132 0
This is the current leaderboard:Though leaders are high, the nature of the contest lets anyone who'll join the game today to win the contest!So, join and win with InterSystems ObjectScript ) grats :)
I gave up for the night and finished late today.
~~~
15 19:11:21 1809 0 19:23:16 1624 0
~~~
worst time for me so far :) You still have lot of coding to do ;)
Congratz all, it was a fun race. Cool battle! Congrats, to all participants and @Fabian.Haupt as a winner!@Bert.Sarens, @Fabian.Haupt - you have more than 1,000 points both in ObjectScript leaderboard: why don't you listed on a general leaderboard? It was! Good Game everybody & Merry Xmas!
COS has some nice features, but most of the time it is lacking basic functionality that would make us competitive in these types of contests.
On top of that, there are no libraries, so you always have to code everything from scratch. Which has a certain appeal to it, but will not not get us close to the leaderboard. The closest I got was place 137 on day22, part2.
Given that mumps/COS only supports the most basic constructs and lacks any modern influence of programming tools, there isn't all that much we can do about that ;) Interesting thoughts, thank you, Fab!@Bert.Sarens, @Timothy.Leavitt, @Dmitry.Maslennikov, @Michael.Breen,@Sean.Connelly, @ivo.VerEecke4987 and others - and what are your top places by days?And your comments about ObjectScript and how could we perform better e.g. next year are very welcome too! Congratulations Fabian and Bert for completing all of the challenges.It's 5am when the challenges open up here so its hard to compete, but I think I would still be far behind some of the times that you have been achieving.Plus I get a little side tracked with the challenges, I've been learning Python this year so its been interesting looking at Python solutions after I've done it in ObjectScript. The code is always much more cleaner and compact. It got me thinking on day 6 about building helper libraries specific to the competition. I ended up with a solution that looks like this...
ClassMethod Day6()
{
set file=$$$file("C:\aoc\day6.txt",.sc) $$$QuitOnError(sc)
set matrix=file.ToMatrix(", ")
do matrix.Min(.minx,.miny)
do matrix.Max(.maxx,.maxy)
for x1=minx:1:maxx {
for y1=miny:1:maxy {
set min=""
while matrix.ForEach(.key,.x2,.y2) {
set dist=$zabs(x1-x2)+$zabs(y1-y2)
if dist=min set nearest="."
if (min="")||(dist<min) set min=dist,nearest=key
}
set count(nearest)=$get(count(nearest))+1
if (x1=minx)||(x1=maxx)||(y1=miny)||(y1=maxy) set infinite(nearest)=""
}
}
set most=0
set key=$order(count(""))
while key'="" {
if '$data(infinite(key)),count(key)>most set most=count(key),hasMost=key
set key=$order(count(key))
}
return count(hasMost)
}
I then got very side tracked on day 7 and started looking at transcompiling Python to ObjectScript. I managed to use Pythons own AST library to parse Python and push it into a global Mumps tree so I could tinker around converting Python to ObjectScript. Turns out the two languages are very compatible, unlike JavaScript which I gave up on a few years back. The interesting thing about Python is its incredible growth in popularity over the past few years, there is a really interesting article here on it...
https://stackoverflow.blog/2017/09/06/incredible-growth-python/
But then I would just settle on a "for x in y" in ObjectScript... Thanks Sean, very interesting! Looking forward to see your Python-to-ObjectScript transcompiler. Here is the final Leaderboard for the contest is:1st place - @Fabian.Haupt2nd place -@Bert.Sarens3rd place - @Dmitry.MaslennikovCongrats to winners and to all the participants!We'll provide all the prises shortly and would appreciate if you share your repos (a lot of participants already did).It would be great to know how people solve the same tasks with ObjectScript independently. Thanks in advance! It was great fun :)
https://github.com/kazamatzuri/AoC My congrats to winners and Season Greetings to everybody!I'm just curious: why some surnames are emphasized with green in the leader board? Hi, Alexey! Greens are clickable ) Hi Evgeny!Good joke - haha. All of them are clicable as all of them are drawn on the same jpeg file, aren't they? Some users configured with link to their GitHub account, and they shown in green, so can click, other users does not have links. If you would register there and have joined our leaderboard, you would be able to check it by yourself. But we don't see this stuff at community site. It's always funny (at least for me) when some stuff is discussed as commonly known while it really is not.Happy New Year to everyone! Sorry, Alexey )They are clickable for real but on the leaderboard pages. Here is the ObjectScript leaderboard, which you can join if you register on Advent of code site with email - and you'll have normal "white" name, and "green clickable one", if you join via Github or any other applicable for Advent site OpenID provider.E.g. see the overall "world-wide" leaderboard which is available without authentication. My top place by day was 242 on day 8 (that was the only day that I actually did the puzzle at midnight though - I'm not at all a night owl).My three wishes for ObjectScript would be:A greater variety of high-performance data structures with low-level support (rather than shoehorning everything into a local array/PPG/$ListBuild list to keep it wicked fast, or building more expensive objects that do exactly what I want)Libraries for working with those (and existing) data structures (or, better yet, an OO approach to everything, similar to %Library.DynamicArray/%Library.DynamicObject)Functional programming capabilities
Announcement
Anastasia Dyubaylo · Mar 26, 2019
Hey Developers!Do you want to reap the benefits of the advances in the fields of artificial intelligence and machine learning? With InterSystems IRIS and the Machine Learning (ML) Toolkit it’s easier than ever.Join InterSystems Sales Engineers, @Sergey.Lukyanchikov and @Eduard.Lebedyuk, for the Machine Learning Toolkit for InterSystems IRIS webinar on Tuesday, April 23rd at 11 a.m. EDT to find out how InterSystems IRIS can be used as both a standalone development platform and an orchestration tool for predictive modelling that helps stitch together Python and other external tools.InterSystems IRIS also makes it easy to:Leverage the model in a live environment.Integrate seamlessly with transactional real-time business processes.Develop intelligent business processes with the business processes UI designer.After we get our models running, during their whole lifecycle, they generate many artifacts: tables, images, data structures, etc. IRIS Analytics can help with visualizing and exploring these artifacts. ML Toolkit use cases will also be presented to show how you can best utilize them in your solution.Date: Tuesday, April 23rd at 11 a.m. EDTRecommended Audience: Developers, Solution Architects, Data Scientists, and Data Engineers.Note: The language of the webinar is English.Register for FREE today! It is tomorrow! Don't miss Register here!
Article
Evgeny Shvarov · Apr 14, 2019
Hi guys!Portrait of Madame X, Gustave Caillebotte.One of the features I like in InterSystems ObjectScript is how you can process array transformations in a specific method or a function.Usually when we say "process an array" we assume a very straightforward algorithm which loops through an array and does something with its entries upon a certain rule.The trick is how you transfer an array to work with into a function. One of the nice approaches on how to pass the information about an array is using $Name and Indirection operator. Below you can find a very simple example which illustrates the thing.Suppose we have a method which accepts an array and does the multiplication by two of all the values for all the keys on a level one. The array passed could be an array of any type: global, local, or PPG.Here is the code of the method:
ClassMethod ArraySample(list) As %Status
{
set key=$Order(@list@("")) //get initial key
while key'="" {
set @list@(key)=@list@(key)*2 // multiply all the keys in a list
set key=$Order(@list@(key))
}
}
How this could be used?
E.g. we have a global ^A and we want all the entries of the first level in global ^A to by multiplied by 2. Here is the code:
set arr=$Name(^A)
kill @arr
for i=1:1:10 {
set @arr@(i)=i
}
w "Initial array:",!
zw @arr
do ..ArraySample(arr)
w !,"Multiplied arrays:",!
zw @arr
}
if you run this it will produce the following:
USER>d ##class(Ideal.ObjectScript).ArraySampleTest()
Initial array:
^A(1)=1
^A(2)=2
^A(3)=3
^A(4)=4
^A(5)=5
^A(6)=6
^A(7)=7
^A(8)=8
^A(9)=9
^A(10)=10
After multiplication:
^A(1)=2
^A(2)=4
^A(3)=6
^A(4)=8
^A(5)=10
^A(6)=12
^A(7)=14
^A(8)=16
^A(9)=18
^A(10)=20
Notice @arr@(index) construct. This is called double indirection or subscript indirection.
if arr contains the path to an array subscript indirection lets you refer to subscripts of any initial arr. This could be useful in many cases e.g. if you want to shortcut the long global path or to use in methods as in this case.
Notice $Name function:
set arr=$Name(^A)
in this case $Name sets into arr the name of an array which lets you work with subscripts of ^A using @arr@(subscirpt1,subscript2,...) constructions.
This is similar to
set arr="^A"
But $Name could be used not only for a global name itself but to get a path to any subscript level of the global. E.g. It's very handy when we have strings on the level which saves us from double quotes:
set arr=$Name(^A("level one",3,"level three"))
is much handier than:
set arr ="^A(""level one"",3,""level three"")"
So, $Name helps you to get a fully qualified name for any global, local, or PPG path when you want to process the subscripts of it in the function/procedure/method and you don't want to transfer the data, but provide only the name of an array. Usage $Name + plus double indirection @list@() does the work.
This ObjectScript flexibility could be really helpful if you build API, or libraries, which work with a large amount of persistent data.
I put placed the code above into this simple class, which you can find also in Open Exchange.
So!
I'm not telling "Don't try this at home!". In contrary: "Try it on your laptop"!
The fastest and coolest way is to checkout the repo and as soon as the repo is dockerized you are able to run the example with IRIS Community Edition on your laptop using three following commands in the repo directory:
build container:
$ docker-compose build
run container:
$ docker-compose up -d
start IRIS terminal and call the sample method:
$ docker-compose exec iris iris session iris
USER>zn "OSCRIPT"
OSCRIPT> do ##class(Ideal.ObjectScript).ArraySampleTest()
Added VSCode settings with the last commit - so you are able to code and compile immediately after you open the project in VSCode. And the settings of VSCode which does the "instant-coding" effect are:
{
"objectscript.conn.version": 3,
"objectscript.conn.ns": "OSCRIPT",
"objectscript.conn.port": 52773,
"objectscript.conn.active": true
}
The file.
Announcement
Olga Zavrazhnova · Sep 27, 2019
Hey Developers,
Have you already reviewed InterSystems Caché or IRIS on the Gartner Peer Insights? If not, here is your chance to get two $25 VISA Cards - one from Gartner Peer Insights and one from InterSystems!This promotion ends on December 5, 2019.
See the rules below.
✅ #1: Follow this unique link and submit a review for IRIS or Caché.
✅ #2: Make a screenshot of the headline and text of your review.
✅ #3: Upload a screenshot in this challenge on Global Masters. Done? Great! After your review is published you will get two $25 VISA Cards!
Note:
• InterSystems IRIS and Caché reviews only.• Use mentioned above unique link in order to qualify for the gift cards.• The survey takes about 10-15 minutes. Gartner will authenticate the identity of the reviewer, but the published reviews are anonymous. You can check the status of your review and gift card in your Gartner Peer Insights reviewer profile at any time.
Done? Awesome! Your cards are on the way!
Article
Evgeny Shvarov · Sep 29, 2019
Hi Developers!
When you prepare your modules for ZPM (InterSystems Package Manager) it expects the certain directory structure for ObjectScript source files.
ObjectScript in your source folder need to be stored by types in the following subfolders. E.g. if you have the source folder named as /src the structure should be as follows:
/src
/cls - for classes
/inc - for include files
/mac - for mac files
/int - for interpretable files
/gbl - for globals
And the ObjectScript should be in CLS (a.k.a UDL) and not in XML.
Example.
Ok! But how could you setup it for your current ObjectScript packages? Manually?
Never!
There are at least 2 ways to manage this.
1. Use isc-dev module
Import isc-dev module via ZPM as:
zpm:USER>install isc-dev
Or import the release into the namespace.
Setup the workdir for isc-dev:
USER>Do ##class(dev.code).workdir("/yoursourcedir")
USER>Do ##class(dev.code).export()
It will export all the source code in CLS into "/yoursourcedir" folder and will create proper folders structure with file types and packages.
2. Another way to do the proper export is to use VSCode ObjectScript
1. Open the folder with your project where your want to export sources.
2. Create the source folder, .e.g. /src
3. Put the src folder in VSCode settings.json and add
"objectscript.export.addCategory": true,
and
"objectscript.export.folder": "src"
into the settings. E.g. here is the example of settings.json file:
"objectscript.conn.active": true,
"objectscript.conn.version": 3,
"objectscript.conn.ns": "USER",
"objectscript.conn.port": 52773,
"objectscript.export.addCategory": true,
"objectscript.export.folder": "src"
After that open InterSystems ObjectScript section in VSCode, find the package you want to export or all of them and click Export:
Announcement
Anastasia Dyubaylo · Nov 20, 2020
Hey Developers,
Please welcome the first session from InterSystems Virtual Summit 2020:
⏯ Creating InterSystems IRIS Analytics Solutions Using Docker & VSCode
See an InterSystems IRIS business intelligence solution created from the ground up using Docker, VS Code, and Open Exchange tools. We used the IRIS Analytics Template from Open Exchange.
Additional materials to this video you can find in this InterSystems Online Learning Course.
Subscribe to InterSystems Developers YouTube and stay tuned! Great end to end demo with IRIS analytics. Zpm módulos was very nice to import data and expose as angular web app.
Announcement
Anastasia Dyubaylo · Oct 7, 2020
Hey Developers,
New demo show by InterSystems Product Manager @Raj.Singh5479 is already on InterSystems Developers YouTube:
⏯ Develop a Python Flask app with InterSystems IRIS in 10 minutes
Use InterSystems IRIS as your back end database platform for a web application built in Python Flask. The short story is it's just as easy as with any other database. Configure an ODBC connection to the database and use SQL inside Python to communicate with it.
⬇️ Python Flask middleware app with InterSystems IRIS as the back end database Raw
Enjoy and stay tuned!
Announcement
Anastasia Dyubaylo · Nov 5, 2020
Hi Community,
Please welcome the new video recorded by @Evgeny.Shvarov on InterSystems Developers YouTube:
⏯ Developing InterSystems IRIS solution using GitHub Codespaces
A quick demo on how to use GitHub Codespaces and develop InterSystems IRIS application in a browser using Docker and VSCode.
⬇️ objectscript-docker-template on Open Exchange
Stay tuned! Great info. I'm on the waiting list for Codespaces Thanks, Herman! Technology is not ideal yet but already gives the feeling of next-level innovation)
Announcement
Anastasia Dyubaylo · Oct 9, 2022
Hey Community,
New video is already on InterSystems Developers YouTube channel:
⏯ Using the DTL Editor in InterSystems IRIS to Transform X12 Messages
See how you can use the graphical DTL Editor in InterSystems IRIS® data platform to convert X12 messages to other formats without writing any code. You will also learn how to replace identification codes between source and target messages.
Enjoy watching and stay tuned!
Announcement
Robert Leff · Mar 3, 2022
This message links to 14 recent advisories that were posted on the InterSystems Product Alerts and Advisories page. All of the items affect HealthShare products, and the first three items affect InterSystems IRIS for Health as well.
FHIR Search with an Assigning Authority but no Identifier Omits Results
Some FHIR Queries that use _include and _revinclude Fail Silently
FHIR Queries May Omit Results
FHIR Queries that Specify a Quantity but no Units of Measure Return Incorrect Results
Time Zone Offsets not Applied to FHIR Resources
FHIR Searches that Specify a Time Range may Improperly Include or Exclude some Data
Clinical Viewer may lose “Standard Types” on Upgrade
Cross-site Scripting Issue in the Clinical Viewer
MPI Demographics May Contain Unconsented Data
When No Consent Group is Specified, Clinical Consent Rules May Fail
HS.Stream Global in Edge Gateways Not Cleared After Errors
HealthShare Care Community Tasks can be Assigned to Members of a Care Team who do not have Permission to View or Take Action on them
Cross-site Scripting Vulnerability in HealthShare Patient Index
Medications with a Blank “Start Date” may not Display in the Clinical Viewer
Announcement
Anastasia Dyubaylo · Jul 26, 2022
Hey Developers,
Learn the basics of HL7® V2 message management in InterSystems IRIS for Health™:
⏯ Introduction to HL7 V2 Integrations in InterSystems IRIS for Health
Enjoy watching on InterSystems Developers YouTube channel and stay tuned!