Clear filter
Announcement
Anastasia Dyubaylo · Feb 6, 2023
Hi Community,
It's voting time! Cast your votes for the best applications in our InterSystems Developer Tools Contest:
🔥 VOTE FOR THE BEST APPS 🔥
How to vote? Details below.
Experts nomination:
InterSystems experienced jury will choose the best apps to nominate the prizes in the Experts Nomination. Please welcome our experts:
⭐️ @akoblov, Support Specialist⭐️ @Guillaume.Rongier7183, Sales Engineer⭐️ @Eduard.Lebedyuk, Senior Cloud Engineer⭐️ @Steve.Pisani, Senior Solution Architect⭐️ @Timothy.Leavitt, Development Manager⭐️ @Evgeny.Shvarov, Developer Ecosystem Manager⭐️ @Dean.Andrews2971, Head of Developer Relations⭐️ @Alex.Woodhead, Technical Specialist⭐️ @Andreas.Dieckow , Principal Product Manager⭐️ @Aya.Heshmat, Product Specialist⭐️ @Benjamin.DeBoe, Product Manager⭐️ @Robert.Kuszewski, Product Manager⭐️ @Carmen.Logue , Product Manager⭐️ @Jeffrey.Fried, Director of Product Management⭐️ @Luca.Ravazzolo, Product Manager⭐️ @Raj.Singh5479, Product Manager⭐️ @Patrick.Jamieson3621, Product Manager⭐️ @Stefan.Wittmann, Product Manager⭐️ @Steven.LeBlanc, Product Specialist⭐️ @tomd, Product Specialist
Community nomination:
For each user, a higher score is selected from two categories below:
Conditions
Place
1st
2nd
3rd
If you have an article posted on DC and an app uploaded to Open Exchange (OEX)
9
6
3
If you have at least 1 article posted on DC or 1 app uploaded to OEX
6
4
2
If you make any valid contribution to DC (posted a comment/question, etc.)
3
2
1
Level
Place
1st
2nd
3rd
VIP Global Masters level or ISC Product Managers
15
10
5
Ambassador GM level
12
8
4
Expert GM level or DC Moderators
9
6
3
Specialist GM level
6
4
2
Advocate GM level or ISC Employees
3
2
1
Blind vote!
The number of votes for each app will be hidden from everyone. Once a day we will publish the leaderboard in the comments to this post.
The order of projects on the contest page will be as follows: the earlier an application was submitted to the competition, the higher it will be on the list.
P.S. Don't forget to subscribe to this post (click on the bell icon) to be notified of new comments.
To take part in the voting, you need:
Sign in to Open Exchange – DC credentials will work.
Make any valid contribution to the Developer Community – answer or ask questions, write an article, contribute applications on Open Exchange – and you'll be able to vote. Check this post on the options to make helpful contributions to the Developer Community.
If you changed your mind, cancel the choice and give your vote to another application!
Support the application you like!
Note: contest participants are allowed to fix the bugs and make improvements to their applications during the voting week, so don't miss and subscribe to application releases! quite interesting.OEX was unreachable just now for some timeand now my previous voting is gone.no problem, I still remember.It's a warning to other early voters. Since the beginning of the voting we have the results:
Expert Nomination, Top 5
OpenAPI-Suite by @Lorenzo.Scalese
irissqlcli by @Dmitry.Maslennikov
iris-tripleslash by @henry
Intersystems IRIS platform queue trend monitoring component by @yubo.mao
message_key_query by @wang.zhe
➡️ Voting is here.
Community Nomination, Top 5
Intersystems IRIS platform queue trend monitoring component by @yubo.mao
iris-tripleslash by @henry
message_key_query by @wang.zhe
DX Jetpack for VS Code by @John.Murray
OpenAPI-Suite by @Lorenzo.Scalese
➡️ Voting is here.
So, the voting continues.
Please support the application you like! Wow thanks Robert,Thank you for bringing to our attention the issue with the votes during the downtime of the OEx website. As soon as we got down alerts we started working to resolve the problem and get OEx back up and running.
But the good news here is that OEx has been gaining popularity, and we understood that this has put additional strain on our server resources. Rest assured that we have taken this into consideration while fixing the issue. At the moment we have next results:
Expert Nomination, Top 5
irissqlcli by @Dmitry Maslennikov
OpenAPI-Suite by @Lorenzo Scalese
iris-tripleslash by @Henry Pereira
iris-geo-map by @Muhammad.Waseem
IRIS Data Migration Manager by @Oleh.Dontsov
➡️ Voting is here.
Community Nomination, Top 5
iris-tripleslash by @Henry Pereira
Intersystems IRIS platform queue trend monitoring component by @Yubo Mao
irissqlcli by @Dmitry Maslennikov
OpenAPI-Suite by @Lorenzo Scalese
message_key_query by @王喆
➡️ Voting is here.
Don't forget to vote for your favorite app!
Please check out today's voting results:
Expert Nomination, Top 5
irissqlcli by @Dmitry Maslennikov
OpenAPI-Suite by @Lorenzo Scalese
iris-geo-map by @Muhammad Waseem
iris-tripleslash by @Henry Pereira
iris-log-viewer by @Oliver.Wilms
➡️ Voting is here.
Community Nomination, Top 5
iris-tripleslash by @Henry Pereira
Intersystems IRIS platform queue trend monitoring component by @Yubo Mao
irissqlcli by @Dmitry Maslennikov
OpenAPI-Suite by @Lorenzo Scalese
message_key_query by @王喆
➡️ Voting is here. Developers!
Last call!Only one day left to the end of voting!
Cast your votes for applications you like!
Announcement
Anastasia Dyubaylo · Feb 13, 2023
It's time to announce the winners of the InterSystems Developer Tools Contest!
But first, we'd like to say Thank you to all our amazing participants who submitted 21 applications 🔥
We are thrilled to know that you think this subject is important! Now, without further ado, the winners are...
Experts Nomination
🥇 1st place and $5,000 go to the irissqlcli app by @Dmitry.Maslennikov
🥈 2nd place and $3,000 go to the DX Jetpack for VS Code app by @John.Murray
🥉 3rd place and $1,500 go to the OpenAPI-Suite app by @Lorenzo.Scalese
🏅 4th place and $750 go to the iris-geo-map app by @Muhammad.Waseem
🏅 5th place and $500 go to the iris-tripleslash app by @José.Pereira, @Henrique, @Henry.HamonPereira
More winners:
🏅 $100 go to the iris-log-viewer app by @Oliver.Wilms
🏅 $100 go to the iris-persistent-class-audit app by @Stefan.Cronje1399
🏅 $100 go to the iris-connections app by @Yuri.Gomes
🏅 $100 go to the cos-url-shortener app by @Daniel.Aguilar
🏅 $100 go to the iris-deploy-tools app by @Francisco.López1549
Community Nomination
🥇 1st place and $1,000 go to the iris-tripleslash app by @José.Pereira, @Henrique, @Henry.HamonPereira
🥈 2nd place and $750 go to the Intersystems IRIS platform queue trend monitoring component app by @yubo.mao
🥉 3rd place and $500 go to the irissqlcli app by @Dmitry.Maslennikov
Our sincerest congratulations to all the participants and winners!
Join the fun next time 😎 Congrats to all winners WOW!!!! this is the first time that I participate in a Intersystems contest and it won't be the last... thanks for all voted and congrats to the winners Congratulations to all the winners Congrats everyone. There were so many worthy projects this time around that voting was really tricky. Thank you all for your contributions and Congrats to the Winners!! Congratulations to all!
It was a fantastic contest!This is the first time I have seen so many applications. Congratulations to all winners!!
Congrats to all the winners! Congratulations everyone! Well done everyone! Congratulations to all the participants! This was an amazing contest! Congratulations to all Video highlighting the winners
Announcement
Anastasia Dyubaylo · Apr 21, 2023
Hi Community,
Watch this video to see how to connect to InterSystems Cloud Services from your Java application using the InterSystems JDBC driver:
⏯ Connecting to InterSystems Cloud Services with Java
Subscribe to InterSystems Developers YouTube and stay tuned!
Announcement
Anastasia Dyubaylo · Apr 28, 2023
Hey Community,
Watch this video to see how to connect to InterSystems Cloud Services from your Python application using the InterSystems DB-API driver interface:
⏯ Connecting to InterSystems Cloud Services with Python
Stay tuned and don't forget to subscribe to InterSystems Developers YouTube!
Announcement
Anastasia Dyubaylo · May 5, 2023
Hey Community,
Watch this video to see how to connect to InterSystems Cloud Services from your .NET application using the InterSystems ADO.NET Managed Provider:
⏯ Connecting to InterSystems Cloud Services with .NET
Stay tuned for more educational videos on our InterSystems Developers YouTube channel!
Announcement
Anastasia Dyubaylo · May 12, 2023
Hi Community,
Watch this video to see how to connect to InterSystems Cloud Services from your C++ application, using the InterSystems ODBC Driver:
⏯ Connecting to InterSystems Cloud Services with ODBC
Subscribe to our InterSystems Developers YouTube channel to stay updated!
Announcement
Anastasia Dyubaylo · Mar 17, 2023
Hey Community,
Tired of entering login-password during the docker build with your InterSystems IRIS every time?
There is a handy way to turn it on and off – use the passwordless zpm module.
Watch this video to explore how to use the passwordless ipm module to turn on and off entering login-password during docker build with your InterSystems IRIS:
⏯️ Passwordless mode for development with InterSystems IRIS
Add zpm "install passwordless" in %SYS namespace during your docker build phase, and IRIS will no longer ask for a password.
Example application with passwordless.
Article
Chad Severtson · Apr 12, 2023
Spoilers: Daily Integrity Checks are not only a best practice, but they also provide a snapshot of global sizes and density. Update 2024-04-16: As of IRIS 2024.1, Many of the below utilities now offer a mode to estimate the size with <2% error on average with orders of magnitude improvements in performance and IO requirements. I continue to urge regular Integrity Checks, however there are situations where more urgent answers are needed.
EstimatedSize^%GSIZE- Runs %GSIZE in estimation mode.
##class(%Library.GlobalEdit).GetGlobalSize(directory, globalname, .allocated, .used. 2) - Estimate the global size programmatically returning the allocated space and used space. Note the final parameter must be a 2.
CALL %SYS.GlobalQuery_Size('directory', '','*',,,2) - Retrieve estimated global sizes by SQL
Tracking the size of the data is one of the most important activities for understanding system health, tracking user activity, and for capacity planning ahead of your procurement process. InterSystems products store data in a tree-structure called globals. This article discusses how to determine global sizes – and therefore the size of your data. The focus is on balancing impact versus precision.
SQL tables are simply a projection of underlying globals. Looking at table size currently means needing to look at the corresponding global sizes. A more efficient sampling-based mechanism is currently being developed. Understanding the relationship between tables and globals may require some additional steps, discussed below.
Data
The specific data that needs to be collected varies depending on the specific question you're trying to answer. There is a fundamental difference between the space "allocated" for a global and the space "used" by a global which is worth considering. In general, the allocated space is usually sufficient as it corresponds to the space used on disk. However, there are situations where the used space and packing data are essential -- e.g. when determining if a global is being stored efficiently following a large purge of data.
Allocated Space - These are units of 8KB blocks. Generally, only one global can use one block. Therefore, even the smallest global occupies at least 8KB. This is also functionally the size on disk of the global. Determining allocated space only requires examining bottom-pointer blocks (and data-blocks which contain big-strings). Except in rare or contrived scenarios, there are typically multiple orders of magnitude fewer pointer blocks than data blocks. This metric is usually sufficient to understand growth trends if collected on a regular basis.
Used Space – “Used” is the sum of the data stored within the global and the necessary overhead. Globals often allocate more space on disk than is actually “used” as a function of usage patterns and our block structure.
Packing: Calculating the actual space used will also provide information about the global “packing” – how densely the data is stored. It can sometimes be necessary or desirable to store the globals more efficiently -- especially if they are not frequently updated. For systems with random updates, inserts, or deletes, a packing of 70% is generally considered optimal for performance. This value fluctuates based on activity. Spareness most often correlates with deletions.
IO Cost: Unfortunately, with great precision comes great IO requirements. Iterating 8KB block by 8KB block through a large database will not only take a long time, but it may also negatively impact performance on systems that are already close to their provisioned limits. This is much more expensive than determining if a block is allocated. This operation will take on the order of (# of parallel processes) / (read latency) * (database size – free space) to return an answer.
InterSystems provides several tools for determining the size of globals within a particular database. Generally, both the global name and the full path of the underlying database directory need to be known in order to determine the size. For more complex deployments, math is required to determine the total size of a global spread across multiple databases via subscript level mapping.
Determining Global Names:
Use the Extent Manager to list the globals associated with a table:
SQL: Call %ExtentMgr.GlobalsUsed('Package.Class.cls')
Review the storage definition within the Management Portal, within VS Code (or Studio), or by querying %Dictionary.StorageDefinition.
SQL: SELECT DataLocation FROM %Dictionary.StorageDefinition WHERE parent = 'Package.ClassName'
ObjectScript: write ##class(%Dictionary.ClassDefinition).%OpenId("Package.ClassName").Storages.GetAt(1).DataLocation
Hashed Global Names are common when the tables are defined using DDLs, i.e. CREATE TABLE. This behavior can be modified by specifying USEEXTENTSET and DEFAULTGLOBAL. Using hashed global names and storing only one index per global have shown performance benefits. I use the following query to list the non-obvious globals in a namespace
SQL for All Classes:
SELECT Parent, DataLocation, IndexLocation, StreamLocation
FROM %Dictionary.StorageDefinition
WHERE Parent->System = 0 AND DataLocation IS NOT NULL
SQL for Specific Classes:
CALL %ExtentMgr.GlobalsUsed('Package.Class.cls')
Determining Database Path:
For the simplest deployments where a namespace does not have additional global mappings for application data, it is often possible to substitute "." for the directory. That syntactic sugar will tell the API to look at the current directory for the current namespace.
For SQL oriented deployments, CREATE DATABASE follows our best practices and creates TWO databases -- one for code and one for data. It’s best to verify the default globals database for the given Namespace in the Management Portal or in the CPF.
It is possible to programmatically determine the destination directory for a particular global (or subscript) in the current namespace:
ObjectScript:
set global = "globalNameHere"
set directory = $E(##class(%SYS.Namespace).GetGlobalDest($NAMESPACE, global),2,*)
For more complex deployments with many mappings, it may be necessary to iterate through Config.MapGlobals in the %SYS Namespace and sum the global sizes:
SQL: SELECT Namespace, Database, Name FROM Config.MapGlobals
Determining Global Sizes:
Once the name of the global and the destination database path are determined, it is possible to collect information on the global size. Here are a few options:
Integrity Check – Nightly Integrity Checks are a good practice. An even better practice is to perform them against a restored backup to also verify the backup and restore process while offloading the IO to another system. This process verifies the physical integrity of the database blocks by reading each allocated block. It also tabulates both the allocated space of all the globals AND tracks the average packing of the blocks along the way.
See Ray’s great post on Integrity Check performance.
In IRIS 2022.1+, Integrity Checks can now even multi-process a single global.
Example Integrity Check Output:
Global: Ens.MessageHeaderD 0 errors found
Top Pointer Level: # of blocks=1 8kb (2% full)
Pointer Level: # of blocks=25 200kb (19% full)
Bottom Pointer Level: # of blocks=3,257 25MB (79% full)
Data Level: # of blocks=2,630,922 20,554MB (88% full)
Total: # of blocks=2,634,205 20,579MB (88% full)
Elapsed Time = 238.4 seconds, Completed 01/17/2023 23:41:12
%Library.GlobalEdit.GetGlobalSize – The following APIs can be used to quickly determine the allocated size of a single global. This may still take some time for multi-TB globals.
ObjectScript: w ##class(%Library.GlobalEdit).GetGlobalSize(directory, globalName, .allocated, .used, 1)
Embedded Python:
import iris
allocated = iris.ref("")
used =iris.ref("")
fast=1
directory = "/path/to/database"
global = "globalName"
iris.cls('%Library.GlobalEdit').GetGlobalSize(directory, global, allocated, used, fast)
allocated.value
used.value
%Library.GlobalEdit.GetGlobalSizeBySubscript – This is helpful for determining the size of subscript or subscript range. E.g. Determine the size of one index. It will include all descendants within the specified range. Warning: as of IRIS 2023.1 there is not a “fast” flag to only return the allocated size. It will read all of the data blocks within the range.
ObjectScript: ##class(%Library.GlobalEdit).GetGlobalSizeBySubscript(directory, startingNode, EndingNode, .size)
%SYS.GlobalQuery.Size – This API is helpful for surveying multiple globals within a database, with or without filters. A SQL Stored Procedure available for customers that primarily interact with IRIS via SQL.
SQL: CALL %SYS.GlobalQuery_Size('database directory here', '','*',,,1)
^%GSIZE – Executing this legacy utility and choosing to “show details” will read each data block to determine the size of the data. Without filtering the list of globals, it may read through almost the entire database block by block with a single thread.
Running ^%GSIZE with details is the slowest option for determining global sizes. It much slower than our heavily optimized Integrity Checks!
There is an additional entry point that will return the allocated size for a particular global – including when scoped to a subscript. Unfortunately, it does not work on subscript ranges.
ObjectScript: write $$AllocatedSize^%GSIZE("global(""subscript"")")
Database Size – The easiest case for determining global size is when there is only a single global within a single database. Simply subtract the total free space within the database from the total size of the database. The database size is available from the OS or via SYS.Database. I often use a variation of this approach to determine the size of a disproportionately large global by subtracting the sum of all the other globals in the database.
ObjectScript: ##class(%SYS.DatabaseQuery).GetDatabaseFreeSpace(directory, .FreeSpace)
SQL: call %SYS.DatabaseQuery_FreeSpace()
Embedded Python:
import iris
freeSpace = iris.ref("")
directory = "/path/to/database"
iris.cls('%SYS.DatabaseQuery').GetDatabaseFreeSpace(directory, freeSpace)
freeSpace.value
Process Private Globals - PPGs are special process-scoped globals stored within IRISTEMP. They are often not enumerated by the other tools. When IRISTEMP is expanding rapidly or reporting low freespace, PPGs are frequently the explanation. Consider examining the per process usage of PPGs via %SYS.ProcessQuery.
SQL: SELECT PID, PrivateGlobalBlockCount FROM %SYS.ProcessQuery ORDER BY PrivateGlobalBlockCount DESC
Questions for the readers:
How often do you track your global sizes?
What do you do with global size information?
For SQL focused users, do you track the size of individual indices?
Chad, thank you for complete explanation of available options. As to you questions:
1. We have a TASKMGR task which calculates the size of each global in all databases. It's usually scheduled by our customers for daily run.2. The main purpose of collecting such info is the ability to quickly answer the questions like this: "why my database is growing so fast?". Integrity Check is not used for the similar purpose because it can't be scheduled for daily run due to its relative slowness in our versions of Cache and IRIS. Wow, what a useful thread! Thank you.
I especially like the fact that you offer solution in each IRIS language : SQL, Python, ObjectScript. Great article Chad!
FWIW, we're working on a faster version of ^%GSIZE (with an API more fitting the current century ;-) ) that uses stochastic sampling similar to the faster table stats gathering introduced in 2021.2? I'll also take the opportunity for a shameless plug of my SQL utilities package, which incorporates much of what's described in this article and will take advantage of that faster global size estimator as soon as it's released. I plan to delete this article the second that the version containing Stochastic Sampling is installed everywhere. In the meantime, I can think of a few customers that need alternatives.
Your SQL utilities are great and also available via Open Exchange. @Stefano.Cairoli reminded me of my vow to update this with the release of the stochastic estimator. @Sarah.Matthews did a fantastic job building it!
Announcement
Jessica Simmons · Nov 1, 2022
VetsEZ is seeking a full-time remote InterSystems HealthShare / IRIS Architect to design and deliver integrated health solutions for our federal healthcare clients with a focus on automation and semantic interoperability. This role focuses on understanding complex technical and business requirements and translating them into highly scalable, robust integration architectures. Act as a technical lead, and mentor team members while maintaining a hands-on role.
The candidate must reside within the continental US.
Responsibilities:
Architecting and configuring the InterSystems HealthShare / IRIS platform with a focus on Automation and CI/CD
Utilizing Healthcare Interoperability Standards (HL7v2, FHIR, CCDA, IHE, X12) appropriately in solution designs
Understanding and translating business and technical requirements, particularly those that are unique to healthcare, into architectures and solution designs
Lead development teams in building solutions as an architect and automating processes
Developing and implementing APIs and Web Services (REST, SOAP) and designing API-based solutions
Utilizing CI/CD technologies and processes including but not limited to Git, Jenkins, Docker
Using AWS-based cloud architectures, VM and Containers, and deployment strategies to Architect solutions
Implementing and using authorization frameworks, including OAuth 2.0, OIDC, and SAML 2.0
Utilizing Enterprise Integration Patterns in solution designs
Requirements:
Bachelor's degree in Information Technology, Computer Science, or other related fields
3+ years of experience in InterSystems ObjectScript, .NET (C#), Java, or other Object-Oriented Programming languages
Strong interpersonal skills with hands-on Architect leadership experience to guide and mentor a team
Flexible and able to adapt to frequently changing standards and priorities
Proven experience developing and implementing highly scalable enterprise-level interoperability solutions
Passion for deploying scalable, robust solutions with an eye towards futureproofing
HealthShare Unified Care Record Technical Specialist
Additional Qualifications:
Must be able to obtain and maintain Public Trust Clearance
Background in the Department of Veterans Affairs and healthcare preferred
Certified Maximo Deployment Professional and Certified SAFe Agile Architect
Benefits:
Medical/Dental/Vision
401k with Employer Match
Corporate Laptop
PTO + Federal Holidays
Training opportunities
Remote work options
Qualified applicants will receive consideration for employment without regard to race, color, religion, sex, national origin, sexual orientation, gender identity, disability, or protected veteran status.
Sorry, we are unable to offer sponsorship currently.
https://vetsez.breezy.hr/p/391438edae0f01-intersystems-healthshare-architect-remote-opportunity?state=published
Question
Vishnu G · Dec 14, 2022
Does InterSystems has CDS Hook implementations?
if yes, where I could get the details. What's CDS? I suppose this is it Hi Vishnu!
InterSystems has recently released a beta of the Healthcare Action Engine for limited customer testing. The Healthcare Action Engine is an extended healthcare decision support service; it includes workflows for implementing your own CDS Hooks services and for brokering connections between clients, data sources, and third-party CDS Hooks Services.
The Healthcare Action Engine is a stand-alone product, but it is designed to integrate seamlessly with InterSystems HealthShare product ecosystem. Because of this, documentation for the product is included as part of our HealthShare documentation, here. (Note that, for security reasons, you must authenticate as a registered HealthShare customer with your WRC credentials to access HealthShare documentation.)
If you'd like to learn more about the Healthcare Action Engine, I encourage you to contact your organization's InterSystems sales associate. As the technical writer responsible for documenting the Healthcare Action Engine as it continues to develop, I'm also happy to answer further questions. Following up on Shawn's response, these resources might also be helpful in the meantime, and perhaps for others -
A Global Summit 2022 session titled Healthcare Action Engine and CDS Hooks: Sneak Peek (includes PDF slides and recording).
An online exercise titled Configuring Alerts for Clinicians with the Healthcare Action Engine.
"See how to use key features of the Healthcare Action Engine to set up real-time alerts for clinicians. In this exercise, you will build decision support, design a notification using a CDS Hooks card, and write a rule to deliver it."
[I believe the same comment Shawn mentioned about being required to be a HealthShare customer in order to access this content is relevant here as well.] Thank you very much. I got it. Thank you very much. I got it. Now you can see also the latest related session from Global Summit 2023:
https://www.intersystems.com/clinical-alerts-notifications-on-fhir-putting-the-healthcare-action-engine-into-the-workflow-intersystems/
Announcement
Elena E · Feb 20, 2023
Dear all,
We would like to invite you to an exciting online event related to the InterSystems Open Exchange app gallery. The purpose is to discuss the features and upgrades of the Open Exchange and gather feedback from the Community.
Date: March 1st, 2023Time: 9:00 am Boston // 3:00 pm Berlin // 6:00 pm Dubai // 10:00 pm Beijing time>> Registration here <<
Topics that we will cover:
There are many packages.
There are duplications of functionality the packages provide.
Most packages only have one contributor - teamwork encouragement
Many packages haven't been updated in a long time.
Apps bundles
Demo for the apps
The format of the event will be an open table discussion, where we will present our ideas and the vector of development. Then, we will ask for your feedback and encourage everyone to participate in the discussion.
Agenda:
5 min - A short overview of app quality check feature (for moderators)
10 min - Questions and feedback
10 min - Our vision to address the issues mentioned above.
20 min - Questions and feedback
25 min - open talk - other ideas, wishes, comments towards Open Exchange
If you have any other ideas or topics that you would like to discuss, feel free to put them in the comments or announce them during the meeting.
We look forward to seeing you there and having an engaging discussion.
>> Register here << . You are correct module.xml indicates IPM/ZPM usage and that's OK.But "Packages" is much wider since it also includes those parts that do not contain installable code or data to load but (if well prepared) a bunch of additional information like (hopefully) user guides, installation guides, description of the purpose of the packages, as well as screenshots, examples, ..... All this is not part of the IPM module. for good reasons.I would feel "module" as a downgrade of the excellent work the contributors provided to the community. . I think by "packages" @Elena.E6756 means any applications on OEX. Fully agree:Package was used for the chapter of OEX from day zero!.Instead of semantic discussions, it would be much more important to take care of quality and completeness and easy-to-evaluate examples for the community.Every member of the community is a customer. To my understanding this is majorpoint of being different do other code exchange and discussion platforms.I have checked almost all packages (except the commercials) and most contributors seem to share this understanding. Though I have to admit that there are also lessservice-minded contributors that just don care about issues and PRs.A community of white sheep only is an illusion.I've seen too much to have such dreams Was this event recorded?
How did it go? Hi @Adam.Coppola We haven't recorded the event, unfortunately.We got some useful feedback from Dmitry Maslennikov, as he was the most active participant. Now the feedback is getting processed and as soon as we put anything on the roadmap I will let community know.If you have any questions, requests or ideas you may contact me anytime via direct messages.
Article
David Hockenbroch · Jun 2, 2023
We are looking at what we need to do to migrate from our current usage of Zen reports to InterSystems Reports. One of the hurdles for us is figuring out ways to interact with InterSystems reports programmatically from ObjectScript routines. There is a Java API for it, but it is possible to generate a report from InterSystems reports to a stream object in ObjectScript without diving into Java by using a %Net.HttpRequest. Here is a code example, followed by an explanation:
#include %cspInclude
GetStream(catalog="",report="",type="2",paramnames,paramvalues,str) public{
try{
set namelist = $LFS(paramnames)
set valuelist = $LFS(paramvalues)
if $LL(valuelist) '= $LL(namelist){
$$$ThrowStatus($$$ERROR(5001,"Mismatched parameter name and value list sizes."))
}
if report = ""{
$$$ThrowStatus($$$ERROR(5001,"No report name provided"))
}
if catalog = ""{
$$$ThrowStatus($$$ERROR(5001,"No catalog name provided"))
}
set myreq = ##class(%Net.HttpRequest).%New()
set myreq.Server = "127.0.0.1"
set myreq.Port = "8888"
set myreq.Location = "jinfonet/tryView.jsp"
set myreq.Username = "MyUserName"
set myreq.Password = "MyPassword"
do myreq.SetParam("jrs.report",$$$URLENCODE(report))
do myreq.SetParam("jrs.catalog",$$$URLENCODE(catalog))
do myreq.SetParam("jrs.result_type",type)
for i=1:1:$LL(namelist){
do myreq.SetParam($$$URLENCODE("jrs.param$"_$LG(namelist,i)),$$$URLENCODE($LG(valuelist,1)))
}
set sc = myreq.Get()
if $$$ISERR(sc) {$$$ThrowStatus(sc)}
set response = myreq.HttpResponse.Data
if $ISOBJECT(response){
set sc = response.Rewind()
if $$$ISERR(sc) {$$$ThrowStatus(sc)}
while 'response.AtEnd{
set sc = str.Write(response.Read())
if $$$ISERR(sc) {$$$ThrowStatus(sc)}
}
}
else{
set sc = str.Write(response)
if $$$ISERR(sc) {$$$ThrowStatus(sc)}
}
}
catch ex{
do ex.Log()
return ex.AsStatus()
}
return $$$OK
}
This routine takes the following arguments:
catalog - The catalog name in InterSystems reports, including directory (i.e. /MyCatalog/Catalog.cat)
report - The report name in InterSystems reports, including directory (i.e. /MyCatalog/MyReport.cls)
type - The file type to create. I have set 2 as the default because that's the type for PDF, which is what we typically use. 1 is HTML, 2 is PDF, 3 is TEXT, 4 is Excel, 5 is PostScript, 6 is RTF, and 7 is XML.
paramnames - If the report has parameters, this is a comma-separated list of report parameters
paramvalues - The values to use for those parameters, in the same order as the names.
str - A %Stream.Object (or any class that inherits from it) which should be passed by reference. This is the stream that will eventually hold the report.
I have some initial checking at the top for a few things that will cause a problem. The type has to be 1-7, so I throw an error if it's not. (Side Note: I apologize for my overuse of the throw/catch error checking; it's a construct I'm used to from other languages!) The lists of parameter names and values should be the same size. There must be a catalog and a report provided.
The server and port for the request must be the domain/IP and port of your InterSystems report server. This assumes it's running on the same server as your IRIS instance at its default port. If not, adjust accordingly. The location is /jinfonet/tryView.jsp. This is a web page on the report server that uses accepts a GET request. It's also a handy one to redirect a browser to if you want to link to a report. If the user is not authenticated, it redirects to a login prompt. If the report has parameters and they are not provided, it will then prompt for parameters. I'm going to set some parameters on the request to handle all of that so we can get straight to the report. That's why we're setting the Username and Password properties on the HttpRequest object; they must be a valid username and password for your InterSystems Reports server.
The tryView.jsp can accept quite a few parameters. They are fully documented by Logi here, but for purposes of this example, I'm keeping it pretty basic. We set a parameter called jrs.report that contains the URL encoded report name, jrs.catalog which contains the url encoded catalog name, and jrs.result_type which uses our type argument to tell the JSP what kind of file to generate.
After that, I loop through the parameter name and value lists to send the parameters to the report. The name of the HttpRequest parameter is jrs.param$ followed by the report parameter name, and is set to whatever value needs passed to this parameter. So my report has a parameter called "OrderNumber" the HTTP request parameter must be named jrs.param$OrderNumber and be set to whatever order number the report parameter should be set to. At that point, we're ready to send the request off using the Get() method.
Once the response comes back, the report's stream is now in the request object's HttpResponse.Data, which depending on length, can sometimes be a string and sometimes be a stream, so I've got some steps to check that, then write that data to the %Stream.Object that was passed by reference.
And there you have it; an InterSystems Report generated to a stream.
Article
Oleksandr Zaitsev · Jul 3, 2023
Introduction
A password manager is an important security tool that allows users to store and manage their passwords without the need to remember or write them down in insecure places. In this article, we will explore the development of a simple password manager using the Flask framework and the InterSystems IRIS database.
Key Features
Our password manager application will provide the following key features:
User registration with account creation.
User authentication during login.
Adding new passwords with a title, login, and password.
Encryption and secure storage of passwords in the database.
Viewing the list of saved passwords for a user.
Editing and deleting saved passwords.
Ability to log out and end the session.
Future Plans
While the current version of our password manager application already offers essential functionality, there are several potential future enhancements that can be considered:
Password strength evaluation: Implement a feature to analyze the strength of passwords entered by users. This can include checking for complexity, length, and the presence of special characters.
Two-factor authentication (2FA): Integrate a 2FA mechanism to add an extra layer of security during login. This can involve using SMS verification codes, email verification, or authenticator apps.
Password generator: Include a password generator that can generate strong, random passwords for users. This feature can provide suggestions for creating unique and secure passwords.
Password expiration and change reminders: Implement a mechanism to notify users when their passwords are due for expiration or recommend periodic password changes to enhance security.
Secure password sharing: Allow users to securely share passwords with others, such as family members or team members, while maintaining the necessary encryption and access controls.
By incorporating these enhancements, our password manager can evolve into a more robust and feature-rich application, catering to the increasing security needs of users.
Tools Used
To develop our password manager, we will be using the following tools:
Flask: A lightweight web framework for building web applications in Python.
InterSystems IRIS: A high-performance database that provides reliable data storage and management.
Benefits of Using Flask and InterSystems IRIS
Flask provides simplicity and conciseness in web development by offering a wide range of tools and functionalities.
Flask allows easy creation of routes, handling requests, and returning HTML responses.
InterSystems IRIS ensures reliable data storage, providing high performance and security.
Using a database for storing passwords ensures encryption and protection against unauthorized access.
Conclusion
A password manager developed using Flask and InterSystems IRIS provides a convenient and secure way to store and manage passwords. It allows users to store complex passwords without the need to remember or write them down in insecure places. Developing such an application is a great exercise for learning web development with Flask and working with databases. Hi Oleksandr,
Your video is available on InterSystems Developers YouTube:
⏯️Password app iris db
Please enjoy!
Question
Ashok Kumar T · Jun 10
Hello Community,
I encountered the following errors while installing the ZPM module on version 2025.1. The ZPM install command failed on the Community Edition of IRIS for Health.
Skipping installation of python wheel 'attrs-25.1.0-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.
Full error message
Skipping installation of python wheel 'attrs-25.1.0-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'certifi-2025.1.31-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'charset_normalizer-2.1.1-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'idna-3.10-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'jsonschema-4.23.0-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'jsonschema_specifications-2024.10.1-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'oras-0.1.30-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'referencing-0.36.2-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'requests-2.32.3-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'typing_extensions-4.12.2-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.Skipping installation of python wheel 'urllib3-2.3.0-py3-none-any.whl' due to error: '0 ;«WCould not find a suitable pip caller. Consider setting UseStandalonePip and PipCallerÓUSERÇ'e^OnAsStatus+1^%Exception.General.1^1/e^AsStatus+1^%Exception.AbstractException.1^15e^OnPhase+28^%IPM.ResourceProcessor.PythonWheel.1^1)e^%Initialize+8^%IPM.Lifecycle.Base.1^1-e^ExecutePhases+163^%IPM.Storage.Module.1^1+e^LoadNewModule+118^%IPM.Utils.Module.1^1e^Load+44^%IPM.Main.1^1"d^ShellInternal+48^%IPM.Main.1^1d^Shell+2^%IPM.Main.1^1e^ZPMLoad+3^IPM.Installer.1^1e^setup+63^IPM.Installer.1^1"e^AsyncSetup+2^IPM.Installer.1^1d^^^0'. You may need to install this wheel manually or from PyPI to use certain features of IPM.
The ZPM installation failed with a 'not found in any repository' error for the applications I attempted to install on the 2024 and 2025 versions.
USER>zpm "install System-Task-REST"
ERROR! 'System-Task-REST' not found in any repository.
USER>zpm
=============================================================================
|| Welcome to the Package Manager Shell (ZPM). Version: 0.10.2 ||
|| Enter q/quit to exit the shell. Enter ?/help to view available commands ||
|| No registry configured ||
|| System Mode: <unset> ||
|| Mirror Status: NOTINIT ||
=============================================================================
IRIS for Windows (x86-64) 2025.1 (Build 223U) Tue Mar 11 2025 18:18:59 EDT [Health:8.2.2]
zpm:USER>install "System-Task-REST"
ERROR! 'System-Task-REST' not found in any repository.
zpm:USER>install swagger-ui
ERROR! 'swagger-ui' not found in any repository.
zpm:USER>install "swagger-ui"
ERROR! 'swagger-ui' not found in any repository.
zpm:USER>
@Ashok.Kumar - could you please raise it here too? As for community images - the latest releases do not have community registry enabled by default.
Use this command to make them work:
USER>zpm repo -r -n registry -url https://pm.community.intersystems.com/ -user "" -pass "" I've raised the issue. Thanks! The issue is caused by the PythonRuntimeLibrary not being configured. Starting from version 2024.2, Python is no longer bundled with IRIS due to the introduction of the Flexible Python Runtime feature. As a result, the Python directory is missing, preventing the installation of the Wheel file.
Check this post about this configuration. @Ashok.Kumar thank you for raising these issues - we'll make the error message cleaner and explicitly point to flexible python runtime configuration as the likely culprit. Thanks for the quick response on the issue — improving the clarity of the error message will definitely help.
Announcement
Anastasia Dyubaylo · Jul 18
Hi Community,
Enjoy the new video on InterSystems Developers YouTube:
⏯ From Idea to Impact: The InterSystems Approach @ Global Summit 2024
Tune in for the discussion of the structured approach to accelerating innovation within the company, emphasizing culture, process, and execution using InterSystems technologies. Innovation tournaments, speed brainstorming, innovation loops, and test beds are used to drive idea development from inception to impact.
Presenters:🗣 @Jeffrey.Fried, Director, Platform Strategy, InterSystems🗣 @Alki.Iliopoulou, Innovation Ecosystem Leader, InterSystems
Stay ahead of the curve! Watch the video and subscribe to keep learning!