#Ferramentas

0 Seguidores · 32 Postagens

Uma ferramenta  de programação ou ferramenta de desenvolvimento de software é um programa de computador que os desenvolvedores de software usam para criar, depurar, manter ou oferecer suporte a outros programas e aplicações.

Artigo Heloisa Paiva · Out. 19, 2025 14m read

Visão Geral

Esta interface web foi projetada para facilitar o gerenciamento de Tabelas de Pesquisa de Dados (Data Lookup Tables) por meio de uma página web amigável. É particularmente útil quando os valores da sua tabela de pesquisa são grandes, dinâmicos e mudam frequentemente. Ao conceder aos usuários finais acesso controlado a esta interface web (permissões de leitura, escrita e exclusão limitadas a esta página), eles podem gerenciar os dados da tabela de pesquisa de forma eficiente, de acordo com suas necessidades.

Os dados gerenciados por meio desta interface podem ser utilizados perfeitamente em regras ou transformações de dados do HealthConnect, eliminando a necessidade de constante monitoramento e gerenciamento manual das tabelas de pesquisa, economizando tempo significativo.

Nota: 

Se a Tabela de Pesquisa de Dados padrão não atender aos seus requisitos de mapeamento, você pode criar uma tabela personalizada e adaptar esta interface web, juntamente com sua classe de suporte, com modificações mínimas. O código de exemplo da classe está disponível mediante solicitação.

0
0 15
Artigo Davi Massaru Teixeira Muta · Out. 11, 2025 10m read

Documentação Técnica — Quarkus IRIS Monitor System

1. Objetivo e Escopo

Este módulo permite a integração entre aplicações Java baseadas em Quarkus e as capacidades nativas de monitoramento de performance do InterSystems IRIS.
Ele possibilita que o desenvolvedor anote métodos com @PerfmonReport, acionando automaticamente as rotinas ^PERFMON do IRIS durante a execução do método e gerando relatórios de performance sem intervenção manual.


2. Componentes do Sistema

2.1 Anotação: @PerfmonReport

  • Definida como InterceptorBinding do CDI.
  • Pode ser aplicada a métodos ou classes.
  • Instrui o framework a envolver a execução do método com a lógica de monitoramento do IRIS.

2.2 Interceptor: PerfmonReportInterceptor

  • Intercepta chamadas a métodos anotados.

  • Fluxo de execução:

    1. Registrar evento de início (LOG.infof("INIT: …"))
    2. Chamar monitorSystem.startPerfmon()
    3. Prosseguir com context.proceed()
    4. No bloco finally:
      • Chamar monitorSystem.generateReportPerfmon(...)
      • Chamar monitorSystem.stopPerfmon()
      • Registrar evento de fim com tempo de execução
  • Garante que o monitoramento sempre será encerrado, mesmo se ocorrer uma exceção.

2.3 Bean DAO: MonitorSystem

  • Bean CDI anotado com @ApplicationScoped.

  • Mantém uma única instância de IRIS inicializada na inicialização.

  • Configuração injetada via @ConfigProperty (URL JDBC, usuário, senha).

  • Utiliza DriverManager.getConnection(...) para obter uma IRISConnection nativa.

  • Contém os métodos:

    • startPerfmon()
    • generateReportPerfmon(String reportName)
    • stopPerfmon()
  • Cada método chama as correspondentes rotinas ObjectScript em iris.src.dc.AdapterPerfmonProc via iris.classMethodVoid(...).

2.4 Adapter ObjectScript: iris.src.dc.AdapterPerfmonProc

  • Define as rotinas que encapsulam a lógica do ^PERFMON:

      Class iris.src.dc.AdapterPerfmonProc Extends %RegisteredObject
      {
          ClassMethod start() As %Status
          {
              Set namespace = $NAMESPACE
              zn "%SYS"
              set status = $$Stop^PERFMON()
              set status = $$Start^PERFMON()
              zn namespace
              return status
          }
    
          ClassMethod generateReport(nameReport As %String = "report.txt") As %Status
          {
              Set namespace = $NAMESPACE
              zn "%SYS"
              Set tempDirectory = ##class(%SYS.System).TempDirectory()
              set status = $$Report^PERFMON("R","R","P", tempDirectory_"/"_nameReport)
              zn namespace
    
              return status
          }
    
          ClassMethod stop() As %Status
          {
              Set namespace = $NAMESPACE
              zn "%SYS"
              Set status = $$Stop^PERFMON()
              zn namespace
    
              return status
          }
      }
    

    Opera no namespace %SYS para acessar as rotinas ^PERFMON e, em seguida, retorna para o namespace original.

  • Opera no namespace %SYS para acessar as rotinas ^PERFMON, retornando ao namespace original.


3. Fluxo de Execução

  1. Uma requisição entra na aplicação Quarkus.

  2. O interceptor CDI detecta a anotação @PerfmonReport e intercepta a chamada do método.

  3. monitorSystem.startPerfmon() é invocado, acionando o monitoramento ^PERFMON do IRIS.

  4. O método de negócio é executado normalmente (acesso a dados, transformações, lógica, etc.).

  5. Após o método retornar ou lançar uma exceção, o interceptor garante que:

    • monitorSystem.generateReportPerfmon(...) seja chamado para criar um relatório de performance .txt.
    • monitorSystem.stopPerfmon() seja executado para encerrar a sessão de monitoramento.
    • O tempo total de execução do lado Java seja registrado usando Logger.infof(...).
  6. O arquivo de relatório gerado é armazenado no diretório temporário do IRIS, normalmente: /usr/irissys/mgr/Temp/

    • O nome do arquivo segue o padrão: <ClassName><MethodName><timestamp>.txt

4. Desafios Técnicos e Soluções

DesafioSolução
ClassCastException ao usar conexões JDBC pooladasUse DriverManager.getConnection(...) para obter uma IRISConnection nativa, em vez do ConnectionWrapper poolado.
Sobrecarga por abrir conexões repetidamenteMantenha uma única instância de IRIS dentro de um bean @ApplicationScoped, inicializada via @PostConstruct.
Garantir que ^PERFMON seja sempre encerrado, mesmo em exceçõesUse try-finally no interceptor para chamar stopPerfmon() e generateReportPerfmon().
Portabilidade de configuraçãoInjete as configurações de conexão (jdbc.url, username, password) usando @ConfigProperty e application.properties.
Gerenciamento de sessões de monitoramento concorrentesEvite anotar endpoints com alta concorrência. Versões futuras podem implementar isolamento por sessão.

5. Casos de Uso e Benefícios

  • Permite visibilidade em tempo real da atividade do IRIS a partir do código Java.
  • Simplifica a análise de performance e otimização de consultas para desenvolvedores.
  • Útil para benchmarking, profiling e testes de regressão do sistema.
  • Pode servir como um registro leve de auditoria de performance para operações críticas.

6. Exemplo Prático de Uso

O código-fonte completo e o setup de deployment estão disponíveis em:


6.1 Visão Geral

A aplicação roda um servidor Quarkus conectado a uma instância InterSystems IRIS configurada com o namespace FHIRSERVER.
A camada ORM é implementada usando Hibernate ORM com PanacheRepository, permitindo mapeamento direto entre entidades Java e classes do banco IRIS.

Quando a aplicação é iniciada (via docker-compose up), são iniciados:

  • O container IRIS, hospedando o modelo de dados FHIR e rotinas ObjectScript (incluindo AdapterPerfmonProc);
  • O container Quarkus, expondo endpoints REST e conectando-se ao IRIS via driver JDBC nativo.

6.2 Endpoint REST

Um recurso REST expõe um endpoint simples para recuperar informações de pacientes:

@Path("/patient")
public class PatientResource {

    @Inject
    PatientService patientService;

    @GET
    @Path("/info")
    @Produces(MediaType.APPLICATION_JSON)
    public PatientInfoDTO searchPatientInfo(@QueryParam("key") String key) {
        return patientService.patientGetInfo(key);
    }
}

Este endpoint aceita um parâmetro de consulta (key) que identifica o recurso do paciente dentro do repositório de dados FHIR.


6.3 Camada de Serviço com @PerfmonReport

A classe PatientService contém a lógica de negócio para recuperar e compor informações do paciente.
Ela é anotada com @PerfmonReport, o que significa que cada requisição para /patient/info aciona o monitoramento de performance do IRIS:

@ApplicationScoped
public class PatientService {

    @Inject
    PatientRepository patientRepository;

    @PerfmonReport
    public PatientInfoDTO patientGetInfo(String patientKey) {

        Optional<Patient> patientOpt = patientRepository.find("key", patientKey).firstResultOptional();
        Patient patient = patientOpt.orElseThrow(() -> new IllegalArgumentException("Patient not found"));

        PatientInfoDTO dto = new PatientInfoDTO();
        dto.setKey(patient.key);
        dto.setName(patient.name);
        dto.setAddress(patient.address);
        dto.setBirthDate(patient.birthDate != null ? patient.birthDate.toString() : null);
        dto.setGender(patient.gender);
        dto.setMedications(patientRepository.findMedicationTextByPatient(patientKey));
        dto.setConditions(patientRepository.findConditionsByPatient(patientKey));
        dto.setAllergies(patientRepository.findAllergyByPatient(patientKey));

        return dto;
    }
}

6.4 Fluxo de Execução

Uma requisição é feita para: GET /patient/info?key=Patient/4

O Quarkus encaminha a requisição para PatientResource.searchPatientInfo().

O interceptor CDI detecta a anotação @PerfmonReport em PatientService.patientGetInfo().

Antes de executar a lógica de serviço:

  • O interceptor invoca MonitorSystem.startPerfmon(), que chama a classe IRIS iris.src.dc.AdapterPerfmonProc.start().

  • O método executa a lógica de negócio, consultando dados do paciente usando os mapeamentos Hibernate PanacheRepository.

Após a conclusão do método:

  • MonitorSystem.generateReportPerfmon() é chamado para criar o relatório de performance.

  • MonitorSystem.stopPerfmon() interrompe o monitoramento de performance do IRIS.

Um relatório .txt é gerado em: usr/irissys/mgr/Temp/

Exemplo de nome de arquivo: PatientService_patientGetInfo_20251005_161906.txt

6.5 Resultado

O relatório gerado contém estatísticas detalhadas de execução do IRIS, por exemplo:

                         Routine Activity by Routine

Started: 10/11/2025 05:07:30PM                    Collected: 10/11/2025 05:07:31PM

Routine Name                        RtnLines  % Lines   RtnLoads  RtnFetch  Line/Load Directory
----------------------------------- --------- --------- --------- --------- --------- ---------
Other                                     0.0       0.0       0.0       0.0         0
PERFMON                                  44.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%occLibrary                         3415047.0      34.1   48278.0       0.0      70.7 /usr/irissys/mgr/irislib/
iris.src.dc.AdapterPerfmonProc.1          7.0       0.0       2.0       0.0       3.5 /usr/irissys/mgr/FHIRSERVER/
%occName                            5079994.0      50.7       0.0       0.0         0 /usr/irissys/mgr/irislib/
%apiDDL2                            1078497.0      10.8   63358.0       0.0      17.0 /usr/irissys/mgr/irislib/
%SQL.FeatureGetter.1                 446710.0       4.5   66939.0       0.0       6.7 /usr/irissys/mgr/irislib/
%SYS.WorkQueueMgr                       365.0       0.0       1.0       0.0     365.0 /usr/irissys/mgr/
%CSP.Daemon.1                            16.0       0.0       1.0       0.0      16.0 /usr/irissys/mgr/irislib/
%SYS.TokenAuth.1                         14.0       0.0       5.0       0.0       2.8 /usr/irissys/mgr/
%Library.PosixTime.1                      2.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislib/
%SYS.sqlcq.uEXTg3QR7a7I7Osf9e8Bz...      52.0       0.0       1.0       0.0      52.0 /usr/irissys/mgr/
%SYS.SQLSRV                              16.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%apiOBJ                                 756.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislib/
FT.Collector.1                            0.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
SYS.Monitor.FeatureTrackerSensor.1        0.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%SYS.Monitor.Control.1                    0.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%SYS.DBSRV.1                            252.0       0.0       4.0       0.0      63.0 /usr/irissys/mgr/
%sqlcq.FHIRSERVER.cls12.1                19.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%sqlcq.FHIRSERVER.cls13.1                74.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%sqlcq.FHIRSERVER.cls14.1                74.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%sqlcq.FHIRSERVER.cls15.1                52.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%SYS.System.1                             1.0       0.0       0.0       0.0         0 /usr/irissys/mgr/

Esses dados fornecem uma visão precisa sobre quais rotinas foram executadas internamente pelo IRIS durante aquela chamada REST — incluindo compilação de SQL, execução e acesso a dados FHIR.

Observação: As rotinas %sqlcq.FHIRSERVER.* registram todas as consultas SQL cache executadas pelo Quarkus dentro do método. Monitorar essas rotinas permite aos desenvolvedores analisar a execução das queries, compreender o comportamento do código e identificar possíveis gargalos de performance. Isso as torna uma ferramenta poderosa para desenvolvimento e depuração de operações relacionadas ao FHIR.

image

6.6 Resumo

Este exemplo demonstra como um serviço padrão Quarkus pode utilizar de forma transparente as ferramentas nativas de monitoramento do IRIS usando a anotação @PerfmonReport.
Ele combina:

  • Interceptadores CDI (Quarkus)
  • Hibernate PanacheRepositories (ORM)
  • Rotinas ObjectScript nativas do IRIS (^PERFMON)

O resultado é um mecanismo de profiling de performance totalmente automatizado e reproduzível, que pode ser aplicado a qualquer método de serviço na aplicação.

0
0 17
Artigo Heloisa Paiva · Set. 12, 2025 3m read

Uma coisa que aprendi ao longo dos anos é que, não importa o quão aprimorada seja a lógica do seu aplicativo, o desempenho do banco de dados acabará por determinar o sucesso ou fracasso da experiência do usuário. Trabalhando com o InterSystems IRIS, recentemente vivenciei isso em primeira mão. Um de nossos clientes estava construindo um painel de relatórios que funcionava perfeitamente durante os testes, mas assim que o conjunto de dados de produção cresceu para milhões, os tempos de resposta ficaram extremamente lentos.

0
0 47
Artigo Heloisa Paiva · Set. 11, 2025 1m read

Um benefício de usar o Doxygenerate é que ele faz mais do que um simples output HTML. Altere o arquivo Doxyfile que informa ao Doxygen o que fazer e você poderá facilmente criar um PDF. Nosso exemplo de aplicação MARINA gerou um PDF de 524 páginas. Aqui está a página 94:

Você pode olhar todas as páginas aqui.

No print acima, note que nós só temos detalhes da superclasse que é parte do app (AuditHistory) A superclasse primeira superclasse, %Library.SerialObject é mostrada desbotada e sem detalhes do que o BankDetails herda dela.

0
0 18
Anúncio Danusa Calixto · Set. 2, 2025

Tenho o prazer de anunciar o lançamento de tree-sitter-objectscript, uma nova gramática de código aberto para tree-sitters que oferece suporte de primeira classe a ObjectScript para editores modernos. Se você viu a prévia na READY '25, ficará feliz em saber que ela já está disponível no Github:

https://github.com/intersystems/tree-sitter-objectscript

O que ela Fornece?

  • Análise Rápida & Precisa: Uma gramática poderosa para ObjectScript, permitindo análise de sintaxe em tempo real, destaque inteligente e edição estrutural em editores de código modernos.
  • Reconhecimento Poliglota: Arquivos .cls do ObjectScript frequentemente incorporam SQL, HTML, Python, JavaScript, JSON, CSS, XML e Markdown. A gramática foi projetada para se integrar perfeitamente a eles.
  • Suporte a Multi-Editores: Funciona em vários editores atualmente, com outros surgindo conforme a adoção do tree-sitter cresce.

Editores Suportados

Estamos trabalhando com tree-sitter-objectscript e os seguintes editores:

Captura de tela (Zed)

Captura de tela de destaque da sintaxe no Zed

(este é o Zed em Windows com o tema Tokyo Night Storm).


Estamos ansiosos para ver como a comunidade usa isso — feedback e ideias são sempre bem-vindos!

Obrigado!

0
0 22
Anúncio Danusa Calixto · Ago. 8, 2025

Usuários do framework %UnitTest agora podem obter informações de cobertura de teste dentro do VS Code combinando a versão mais recente (v2.0.0) da extensão InterSystems Testing Manager com a impressionante Test Coverage Tool de @Timothy.Leavitt.

Acima, você pode ver o painel Cobertura de Teste, que movi para a barra lateral secundária à direita para que possa ser explorado mais facilmente em conjunto com o Explorador de Testes à esquerda.

0
0 31
Artigo Heloisa Paiva · Ago. 2, 2025 3m read

Documentos Word são amplamente utilizados no mercado. Os usuários frequentemente criam contratos, memorandos, currículos, relatórios, análises e outros documentos que podem exigir dados de ou capturados pelo InterSystems IRIS. No entanto, o IRIS não possui uma API, SDK, biblioteca ou adaptador para isso. Essa limitação não existe mais. 

A nova biblioteca Open Exchange iris4wordd (https://openexchange.intersystems.com/package/iris4word)oferece um SDK ObjectScript onde o desenvolvedor passa qualquer %DynamicObject como parâmetro, um arquivo de template Word e, em seguida, recebe um documento pronto, com a estrutura e formatação definidas em seu template.


0
1 25
Artigo Heloisa Paiva · Fev. 19, 2025 7m read


Olá!

Este artigo é uma pequena visão geral de uma ferramenta que ajuda a entender classes e sua estrutura dentro dos produtos InterSystems: do IRIS ao Caché, Ensemble e HealthShare.

Em resumo, ela visualiza uma classe ou um pacote inteiro, mostra as relações entre as classes e fornece todas as informações possíveis para desenvolvedores e líderes de equipe sem fazê-los ir ao Studio e examinar o código lá.

Se você está aprendendo os produtos InterSystems, revisando muitos projetos ou apenas interessado em algo novo nas soluções de tecnologia InterSystems - você é mais do que bem-vindo para ler a visão geral do ObjectScript Class Explorer!

0
0 63
Artigo Heloisa Paiva · Maio 20, 2024 21m read

Há 2 anos eu venho utilizando Python embutido diariamente. Talvez seja o momento de compartilhar um feedback sobre essa jornada.

Por que escrever esse feedback? Porque eu acredito que sou como a maioria das pessoas aqui, um desenvolvedor ObjectScript, e penso que a comunidade poderia ter algum benefício desse feedback e entender melhor os prós e contras de escolher Python embutido para desenvolver em IRIS. Além de evitar algumas armadilhas.

image

Introdução

Eu sou desenvolvedor desde 2010 e trabalho com ObjectScript desde 2013.

Então são aproximadamente 10 anos de experiência com ObjectScript.

Desde 2021 e o lançamento do Python Embutido no IRIS, eu me propus um desafio:

  • Aprender Python
  • Fazer tudo o máximo possível com Python

Quando eu comecei essa jornada, eu não tinha ideia do que era Python. Então, comecei com o básico e ainda estou aprendendo todo dia.

Começando com Python

O lado bom do Python é que é fácil de aprender. É ainda mais fácil se você já conhece ObjectScript.

Por quê? Elas têm muito em comum.

ObjectScriptPython
Não tipadaNão tipada
Scripting languageScripting language
Orientada a ObjetoOrientada a Objeto
InterpretadaInterpretada
Fácil integração com CFácil integração com C

Então, se você conhece ObjectScript você já sabe muito sobre Python.

Porém, há algumas diferenças, dentre as quais algumas não são fáceis de entender.

Python não é ObjectScript

Para manter as coisas simples, vou focar nas principais diferenças entre ObjectScript e Python.

Para mim, há 3 principais diferenças:

  • Pep8
  • Módulos
  • Dunders

Pep8

O que é Pep8 ?

É um conjunto de regras para escrever códigos Python.

pep8.org

Algumas delas são:

  • Convenção de nomenclatura
  • nomes de variáveis
    • snake_case
  • nomes de classes
    • CamelCase
  • indentação
  • comprimento da linha
  • etc.

Por que isso é importante?

Porque é a maneira de escrever código Python. Se você não seguir essas regras, terá dificuldade em ler o código de outras pessoas e elas terão dificuldade de ler o seu.

Como desenvolvedores ObjectScript, também temos algumas regras para seguir, mas não são tão rígidas como a Pep8.

Eu aprendi Pep8 da maneira mais difícil.

Para contar a história, eu sou engenheiro de vendas na InterSystems e estou fazendo várias demos. Certo dia, eu estava fazendo uma demo de Python Embutido para um cliente que era desenvolvedor Python, e a conversa encurtou quando ele viu meu código. Ele me contou que meu código não era nada "Pythonico" (ele estava certo). Eu estava programando em Python como eu programava em ObjectScript. Por causa disso, ele disse que não estava interessado no Python Embutido mais. Eu fiquei chocado e decidi aprender Python do jeito certo.

Assim, se você quer aprender Python, aprenda Pep8 primeiro.

Módulos

Os módulos são uma funcionalidade que não temos em ObjectScript.

Geralmente, em linguagens orientadas a objetos, há classes e pacotes. No Python, temos classes, pacotes e módulos.

O que é um módulo?

É um arquivo com extensão .py. É a maneira de organizar seu código.

Você não entendeu? No começo eu também não. Portanto vamos usar um exemplo.

Geralmente, quando você quer criar uma classe em ObjectScript, você cria um arquivo .cls e coloca sua classe ali dentro. E, se quiser criar outra classe, usa outro arquivo .cls. Por fim, se quiser criar um pacote, você gera uma pasta e coloca os arquivos .cls dentro dela.

Em Python fazemos o mesmo, mas ele tem a habilidade de guardar várias classes num mesmo arquivo. Esse arquivo é chamado módulo. É importante saber que é "Pythônico" ter muitas classes em um mesmo arquivo.

Portanto, planeje de antemão como pretende organizar seu código e como vai nomear seus módulos para não terminar como eu, com um monte de módulos com o mesmo nome das suas classes.

Um mau exemplo:

A bad example :

MinhaClasse.py

class MinhaClasse:
    def __init__(self):
        pass

    def meu_metodo(self):
        pass

Para instanciar essa classe, você fará:

import MinhaClasse.MinhaClasse # estranho, né?

minha_classe= MinhaClasse()

Estranho, né?

Dunders

Dunders são métodos especiais em Python. Eles são chamados de dunder porque começam e terminam com dois caracteres underscores (_).

Eles são similares aos métodos do ObjectScript com '%'.

Eles são usados para:

  • construtor
  • sobrecarga de operador
  • representação do objeto
  • etc.

Exemplo:

class MinhaClasse:
    def __init__(self):
        pass

    def __repr__(self):
        return "MyClass"

    def __add__(self, other):
        return self + other

Aqui temos 3 métodos dunder:

  • __init__ : construtor
  • __repr__ : representação do objeto
  • __add__ : sobrecarga de operador

Métodos Dunders estão por toda parte em Python. São uma grande parte da linguagem, mas não se preocupe; você vai aprendê-los rapidamente,

Conclusão

Python não é ObjectScript, e você terá que aprender. Mas não é tão difícil, então você vai aprender rápido. Apenas mantenha em mente que você deverá aprender Pep8 e como organizar seu código com módulos e métodos dunder.

Bons sites para aprender Python


Python Embutido

Agora que você conhece um pouco mais sobre o Python, vamos falar de Python Embutido.

O que é o Python Embutido?

Python Embutido é uma maneira de executar código Python dentro do IRIS. É uma nova funcionalidade do IRIS 2021.2+. Isso significa que seu código Python será executado no mesmo processo que o IRIS.

No mais, toda classe ObjectScript é uma classe Python, e o mesmo cale para métodos e atributos, e vice-versa. 🥳 Isso é bacana!

Como usar Python Embutido?

Há 3 maneiras diferentes de usar Python Embutido:

  • Usando a tag de linguagem do ObjectScript
    • Method Foo() As %String [ Language = python ]
  • Usando a função ##class(%SYS.Python).Import()
  • Usando o interpretador de Python
    • python3 -c "import iris; print(iris.system.Version.GetVersion())"

Mas se você quiser usar mesmo o Python Embutido, você terá que evitar usar a tag de linguagem.

image

Por quê?

  • Porque não é Pythônico
  • Porque também não é ObjectScript
  • Porque você não terá um debugador
  • Porque você não terá um linter
  • Porque você não terá um formatador
  • Porque você não terá um framework de testes
  • Porque você não terá um gerenciador de pacotes
  • Porque você está misturando duas linguagens no mesmo arquivo
  • Porque quando o seu processo quebra, você não tem um rastreio da pilha
  • Porque você não pode usar um ambiente virtual ou ambientes conda
  • ...

Não me entenda mal, isso funciona e pode ser útil se você quiser testar algo rapidamente, mas na minha opinião não é uma boa prática.

Então, o que eu aprendi nesses 2 anos de Python Embutido, e como utilizá-lo da maneira correta?

Como eu uso Python embutido

Para mim, existem duas opções:

  • Usar libraries do Python como se fossem classes do ObjectScript
    • with ##class(%SYS.Python).Import() function
  • Usar uma abordagem de Python em primeiro lugar.

Usar libraries do Python como se fossem classes do ObjectScript

Você ainda quer usar Python no seu código ObjectScript, mas não quer usar a tag de linguagem. O que você pode fazer, então?

"Simplesmente" usar códigos e libraries do Python como se fossem classes ObjectScript.

Vamos tomar como exemplo:

Você quer usar a library requests (é uma library para fazer requisições HTTP) no seu código ObjectScript

Com a tag de linguagem

ClassMethod Get() As %Status [ Language = python ]
{
	import requests

	url = "https://httpbin.org/get"
	# faça uma requisição get
	response = requests.get(url)
	# pegue os dados do json de resposta
	data = response.json()
	# iterar pelos dados e printar os pares chave-valoe
	for key, value in data.items():
		print(key, ":", value)
}

Por que eu não acho uma boa ideia?

Porque você está misturando duas linguagens no mesmo arquivo, e você não tem um debugador, um linter, um formatador, etc. Se esse código der algum problema, você terá dificuldade de debugar. Se você não tem um rastreio da pilha, não saberá da onde veio o erro. E também não tem a funcionalidade de completar automaticamente.

Sem a tag de linguagem

ClassMethod Get() As %Status
{
	set status = $$$OK
    set url = "https://httpbin.org/get"
    // Importar o módulo Python "requests" como uma classe ObjectScript 
    set request = ##class(%SYS.Python).Import("requests")
    // Chamar o método get da classe request
    set response = request.get(url)
    // Chamar o método json da classe response
	set data = response.json()
    // Aqui os dados são um dicionário Python
    // Para iterar por um dicionário Python, você deve usar o método dunder e items().
	// Importar um módulo pré-existente de Python.
	set builtins = ##class(%SYS.Python).Import("builtins")
    // Aqui estamos usando "len" do módulo de pré-existentes (built in) para saber o comprimento do dicionário.
    For i = 0:1:builtins.len(data)-1 {
        // Agora nós convertemos os itens do dicionário para uma lista, então pegamos a chave e o valor usando o método dunder __getitem__
		Write builtins.list(data.items())."__getitem__"(i)."__getitem__"(0),": ",builtins.list(data.items())."__getitem__"(i)."__getitem__"(1),!
	}
	quit status
}

Por que eu acho isso uma boa ideia?

Porque você está utilizando Python como se fosse ObejctScript. Você está importando a library requests como uma classe ObjectScript e usando como se fosse uma classe ObjectScript. Toda a lógica está em ObjectScript, e você utiliza o Python como uma library. Até para manutenção, é mais fácil de ler e entender; qualquer desenvolvedor ObjectScript consegue entender esse código. A desvantagem é que você tem que saber como usar os métodos dunders, e como usar Python como se fosse ObjectScript.

Conclusão

Acredite em mim, dessa maneira você vai acabar com um código mais robusto e conseguirá debugar facilmente. A princípio parece difícil, mas você vai entender os benefícios de aprender Python mais rápido do que você pensa.

Usar uma abordagem de Python em primeiro lugar

Essa é a maneira que eu prefiro usar Python Embutido

Eu construí várias ferramentas usando essa abordagem e estou muito feliz com isso.

Alguns exemplos:

Então, o que é uma abordagem de Python em primeiro lugar?

Existe apenas uma regra: o código Python deve estar em arquivos . py, o código ObjectScript deve estar em arquivos .cls

Como conseguir isso?

A ideia é criar classes de invólucro de ObjectScript para chamar o código Python.


Vamos tomar o exemplo de iris-fhir-python-strategy :

Exemplo : iris-fhir-python-strategy

Primeiramente, nós temos que entender como o servidor IRIS FHIR funciona.

Todo servidor IRIS FHIR implementa uma Strategy (estratégia).

Uma Strategy é um conjunto de duas classes:

SuperclasesParâmetros de Subclasse
HS.FHIRServer.API.InteractionsStrategyStrategyKey — Especifica um identificador único para a InteractionsStrategy.
InteractionsClass — Especifica o nome da sua subclasse de Interactions (interações).
HS.FHIRServer.API.RepoManagerStrategyClass —Especifica o nome da sua sublcasse InteractionsStrategy.
StrategyKey — Especifica um identificaod único para a InteractionsStrategy. Deve ter o mesmo valor do parâmetro StrategyKey na subclasse InteractionsStrategy.

As duas classes são do tipo Abstract (abstratas).

  • HS.FHIRServer.API.InteractionsStrategy é uma classe Abstractque deve ser implementada para customizar o comportamento do Servidor FHIR.
  • HS.FHIRServer.API.RepoManager é uma classe Abstract que deve ser implementada para customizar o armazenamento do servidor FHIR.

Observações

Para o nosso exemplo, vamos focar apenas na classe HS.FHIRServer.API.InteractionsStrategy, mesmo que a classe HS.FHIRServer.API.RepoManager também seja implementada e obrigatória para customizar o Servidor FHIR. A classe HS.FHIRServer.API.RepoManager é implementada pela classe HS.FHIRServer.Storage.Json.RepoManager, que é a implementação padrão do Servidor FHIR.

##Onde achar o código

Todo o código fonte pode ser achado nesse repositório: iris-fhir-python-strategy A pasta src contém as seguintes pastas:

  • python : contém o código Python
  • cls : contem o código ObjectScript que é usado para chamar o código Python

Como implementar uma Strategy

Nesta prova de conceito, só estaremos interessados em como implementar uma Strategy em Python, não em como implementar um RepoManager (gerenciador de repositório).

Para implementar uma Strategy você deve criar pelo menos duas classes:

  • Uma classe que herda da HS.FHIRServer.API.InteractionsStrategy
  • Uma classe que herda da HS.FHIRServer.API.Interactions class

Implementação de InteractionsStrategy

A classe HS.FHIRServer.API.InteractionsStrategy foca em customizar o comportamento do Servidor FHIR ao sobrescrever os seguintes métodos:

  • GetMetadataResource: chamado para pegar os metadados do servidor FHIR
    • esse é o único método que vamos sobrescrever nessa prova de conceito

HS.FHIRServer.API.InteractionsStrategy também tem dois parâmetros:

  • StrategyKey : um identificador único para a InteractionsStrategy
  • InteractionsClass : o nome da subclasse de Interactions

Implementação de Interactions

A classe HS.FHIRServer.API.Interactions foca em customizar o comportamento do Servidor FHIR ao sobrescrever os seguintes métodos:

  • OnBeforeRequest : chamada antes da requisição ser enviada ao servidor
  • OnAfterRequest : chamada após a requisição ser enviada ao servidor
  • PostProcessRead : chamada após a operação de leitura estar finalizada
  • PostProcessSearch : chamada após a operação de procura estar finalizada
  • Read : chamada para ler um recurso
  • Add : chamada para adicionar um recurso
  • Update : chamada para atualizar um recurso
  • Delete : chamada para deletar um recurso
  • e muito mais...

Nós implementamos a classe HS.FHIRServer.API.Interactions no arquivo src/cls/FHIR/Python/Interactions.cls.

 
Spoiler
Class FHIR.Python.Interactions Extends (HS.FHIRServer.Storage.Json.Interactions, FHIR.Python.Helper)
{

Parameter OAuth2TokenHandlerClass As%String = "FHIR.Python.OAuth2Token";

Method %OnNew(pStrategy As HS.FHIRServer.Storage.Json.InteractionsStrategy) As%Status { // %OnNew é chamado quando o objeto é criado.// O parâmetro pStrategy é o objeto de estratégia criado nesse objeto.// A implementação padrão não faz nada// Primeiro define o caminho do Python de uma variável de ambienteset..PythonPath = $system.Util.GetEnviron("INTERACTION_PATH") // Depois define o nome da classe de Python pela variável de ambienteset..PythonClassname = $system.Util.GetEnviron("INTERACTION_CLASS") // Então define o nome do módulo Python pela variável de ambienteset..PythonModule = $system.Util.GetEnviron("INTERACTION_MODULE")

<span class="hljs-keyword">if</span> (<span class="hljs-built_in">..PythonPath</span> = <span class="hljs-string">""</span>) || (<span class="hljs-built_in">..PythonClassname</span> = <span class="hljs-string">""</span>) || (<span class="hljs-built_in">..PythonModule</span> = <span class="hljs-string">""</span>) {
	<span class="hljs-comment">//quit ##super(pStrategy)</span>
	<span class="hljs-keyword">set</span> <span class="hljs-built_in">..PythonPath</span> = <span class="hljs-string">"/irisdev/app/src/python/"</span>
	<span class="hljs-keyword">set</span> <span class="hljs-built_in">..PythonClassname</span> = <span class="hljs-string">"CustomInteraction"</span>
	<span class="hljs-keyword">set</span> <span class="hljs-built_in">..PythonModule</span> = <span class="hljs-string">"custom"</span>
}


<span class="hljs-comment">// Então, define a classe Python</span>
<span class="hljs-keyword">do</span> <span class="hljs-built_in">..SetPythonPath</span>(<span class="hljs-built_in">..PythonPath</span>)
<span class="hljs-keyword">set</span> <span class="hljs-built_in">..PythonClass</span> = <span class="hljs-keyword">##class</span>(FHIR.Python.Interactions).GetPythonInstance(<span class="hljs-built_in">..PythonModule</span>, <span class="hljs-built_in">..PythonClassname</span>)

<span class="hljs-keyword">quit</span> <span class="hljs-keyword">##super</span>(pStrategy)

}

Method OnBeforeRequest( pFHIRService As HS.FHIRServer.API.Service, pFHIRRequest As HS.FHIRServer.API.Data.Request, pTimeout As%Integer) { // OnBeforeRequest é chamado antes de cada requisição ser processada.if$ISOBJECT(..PythonClass) { set body = ##class(%SYS.Python).None() if pFHIRRequest.Json '= "" { set jsonLib = ##class(%SYS.Python).Import("json") set body = jsonLib.loads(pFHIRRequest.Json.%ToJSON()) } do..PythonClass."on_before_request"(pFHIRService, pFHIRRequest, body, pTimeout) } }

Method OnAfterRequest( pFHIRService As HS.FHIRServer.API.Service, pFHIRRequest As HS.FHIRServer.API.Data.Request, pFHIRResponse As HS.FHIRServer.API.Data.Response) { // OnAfterRequest é chamado depois de cada requisição ser processada.if$ISOBJECT(..PythonClass) { set body = ##class(%SYS.Python).None() if pFHIRResponse.Json '= "" { set jsonLib = ##class(%SYS.Python).Import("json") set body = jsonLib.loads(pFHIRResponse.Json.%ToJSON()) } do..PythonClass."on_after_request"(pFHIRService, pFHIRRequest, pFHIRResponse, body) } }

Method PostProcessRead(pResourceObject As%DynamicObject) As%Boolean { // PostProcessRead é chamada após um recurso ser lido na base de dados.// Retorna 1 para indicar que o recurso deve ser incluído na resposta.// Retorna 0 para indicar que o recurso deve ser excluído da resposta.if$ISOBJECT(..PythonClass) { if pResourceObject '= "" { set jsonLib = ##class(%SYS.Python).Import("json") set body = jsonLib.loads(pResourceObject.%ToJSON()) } return..PythonClass."post_process_read"(body) } quit1 }

Method PostProcessSearch( pRS As HS.FHIRServer.Util.SearchResult, pResourceType As%String) As%Status { // PostProcessSearch é chamado depois de uma busca.// Retorna $$$OK para indicar que a busca teve sucesso.// Retorna um código de erro para indicar que a busca falhou.if$ISOBJECT(..PythonClass) { return..PythonClass."post_process_search"(pRS, pResourceType) } quit$$$OK }

Method Read( pResourceType As%String, pResourceId As%String, pVersionId As%String = "") As%DynamicObject { return##super(pResourceType, pResourceId, pVersionId) }

Method Add( pResourceObj As%DynamicObject, pResourceIdToAssign As%String = "", pHttpMethod = "POST") As%String { return##super(pResourceObj, pResourceIdToAssign, pHttpMethod) }

/// Returns VersionId for the "deleted" version Method Delete( pResourceType As%String, pResourceId As%String) As%String { return##super(pResourceType, pResourceId) }

Method Update(pResourceObj As%DynamicObject) As%String { return##super(pResourceObj) }

}

A classeFHIR.Python.Interactions herda das classes HS.FHIRServer.Storage.Json.Interactions e FHIR.Python.Helper.

A classe HS.FHIRServer.Storage.Json.Interactions é o padrão de implementação do Servidor FHIR.

A classe FHIR.Python.Helper foca em ajudar chamar o código Python pelo ObjectScript .

A classe FHIR.Python.Interactions sobrescreve os métodos a seguir:

  • %OnNew : chamado quando o objeto é criado
    • nós usamos esse método para definir o caminho, nome da classe de, e nome de módulo do Python a partir das variáveis de ambiente.
    • se as variáveis de ambiente não forem definidas, utilizamos valores padrão.
    • também definimos a classe python
    • chamamos o método %OnNew da classe pai.
Method %OnNew(pStrategy As HS.FHIRServer.Storage.Json.InteractionsStrategy) As %Status
{
	// Primeiro, definimos o caminho Python por uma variável de ambiente
	set ..PythonPath = $system.Util.GetEnviron("INTERACTION_PATH")
	// Então, definimos o nome da classe Python pela variável de ambiente
	set ..PythonClassname = $system.Util.GetEnviron("INTERACTION_CLASS")
	// Depois, definimos o nome do módulo Python da variável de ambiente
	set ..PythonModule = $system.Util.GetEnviron("INTERACTION_MODULE")

	if (..PythonPath = "") || (..PythonClassname = "") || (..PythonModule = "") {
		// usa valores padrão
		set ..PythonPath = "/irisdev/app/src/python/"
		set ..PythonClassname = "CustomInteraction"
		set ..PythonModule = "custom"
	}

	// A seguir, definimos a classe Python
	do ..SetPythonPath(..PythonPath)
	set ..PythonClass = ..GetPythonInstance(..PythonModule, ..PythonClassname)

	quit ##super(pStrategy)
}
  • OnBeforeRequest : chamada antes da requisição ser enviada ao servidor
    • chamamos o método on_before_request da classe Python
    • passamos os objetos HS.FHIRServer.API.Service e HS.FHIRServer.API.Data.Request , o corpo da requisição e o tempo limite de execução.
Method OnBeforeRequest(
	pFHIRService As HS.FHIRServer.API.Service,
	pFHIRRequest As HS.FHIRServer.API.Data.Request,
	pTimeout As %Integer)
{
	// OnBeforeRequest é chamado antes de cada requisição ser processada.
	if $ISOBJECT(..PythonClass) {
		set body = ##class(%SYS.Python).None()
		if pFHIRRequest.Json '= "" {
			set jsonLib = ##class(%SYS.Python).Import("json")
			set body = jsonLib.loads(pFHIRRequest.Json.%ToJSON())
		}
		do ..PythonClass."on_before_request"(pFHIRService, pFHIRRequest, body, pTimeout)
	}
}
  • OnAfterRequest : chamado após a requisição ser enviada ao servidor
    • chamamos o método on_after_request da classe Python
    • passamos os objetos HS.FHIRServer.API.Service, HS.FHIRServer.API.Data.Request e HS.FHIRServer.API.Data.Response e o corpo da resposta
Method OnAfterRequest(
	pFHIRService As HS.FHIRServer.API.Service,
	pFHIRRequest As HS.FHIRServer.API.Data.Request,
	pFHIRResponse As HS.FHIRServer.API.Data.Response)
{
	// OnAfterRequest é chamado após cada requisição ser processada
	if $ISOBJECT(..PythonClass) {
		set body = ##class(%SYS.Python).None()
		if pFHIRResponse.Json '= "" {
			set jsonLib = ##class(%SYS.Python).Import("json")
			set body = jsonLib.loads(pFHIRResponse.Json.%ToJSON())
		}
		do ..PythonClass."on_after_request"(pFHIRService, pFHIRRequest, pFHIRResponse, body)
	}
}
  • E por aí em diante...

Interactions em Python

A classe FHIR.Python.Interactions chama os métodos on_before_request, on_after_request, ... da classe Python.

Aqui está uma classe Python abstrata:

import abc
import iris

class Interaction(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def on_before_request(self, 
                          fhir_service:'iris.HS.FHIRServer.API.Service',
                          fhir_request:'iris.HS.FHIRServer.API.Data.Request',
                          body:dict,
                          timeout:int):
        """
        on_before_request é chamada depois que a requisição é enviada ao servidor.
        param fhir_service: o objeto de serviço fhir iris.HS.FHIRServer.API.Service
        param fhir_request: o objeto de requisição fhir iris.FHIRServer.API.Data.Request
        param timeout: o tempo limite de execução em segundos
        return: None
        """
        

    @abc.abstractmethod
    def on_after_request(self,
                         fhir_service:'iris.HS.FHIRServer.API.Service',
                         fhir_request:'iris.HS.FHIRServer.API.Data.Request',
                         fhir_response:'iris.HS.FHIRServer.API.Data.Response',
                         body:dict):
        """
        on_after_request é chamada após a requisição ser enviada ao servidor.
        param fhir_service: o objeto de serviço fhir iris.HS.FHIRServer.API.Service
        param fhir_request: o objeto de requisição fhir iris.FHIRServer.API.Data.Request
        param fhir_response: o objeto de resposta fhir iris.FHIRServer.API.Data.Response
        return: None
        """
        

    @abc.abstractmethod
    def post_process_read(self,
                          fhir_object:dict) -> bool:
        """
        post_process_read é chamado após a operação de leitura finalizar.
        param fhir_object: o objeto fhir
        return: True - o recurso deve ser  retornado ao cliente, False - caso contrário
        """
        

    @abc.abstractmethod
    def post_process_search(self,
                            rs:'iris.HS.FHIRServer.Util.SearchResult',
                            resource_type:str):
        """
        post_process_search é chamada após a operação de pesquisa finalizar.
        param rs: o resultado da pesquisa iris.HS.FHIRServer.Util.SearchResult
        param resource_type: o tipo de recurso
        return: None
        """

Implementação da classe Python abstrata

from FhirInteraction import Interaction

class CustomInteraction(Interaction):

    def on_before_request(self, fhir_service, fhir_request, body, timeout):
        # Extrai o usuário e seus papéis para essa requisição
        # então o consentimento pode avaliado.
        self.requesting_user = fhir_request.Username
        self.requesting_roles = fhir_request.Roles

    def on_after_request(self, fhir_service, fhir_request, fhir_response, body):
        # Limpa o usuário e seus papéis entre as requisições.
        self.requesting_user = ""
        self.requesting_roles = ""

    def post_process_read(self, fhir_object):
        # Avalia consentimento baseado no recurso e usuários/papéis
        # Retornar 0 indica que esse recurso não deveria ser exibido - um erro  "404 Not Found" (não encontrado)
        # Será retornado ao usuário.
        return self.consent(fhir_object['resourceType'],
                        self.requesting_user,
                        self.requesting_roles)

    def post_process_search(self, rs, resource_type):
        # Itera por cada recurso no conjunto de pesquisa e avalia
        # Consentimento baseado no recurso e usuário/papéis
        # Cada linha marcada como deletada e salva será excluída do Bundle (conjunto ad resposta).
        rs._SetIterator(0)
        while rs._Next():
            if not self.consent(rs.ResourceType,
                            self.requesting_user,
                            self.requesting_roles):
                # Marca a linha como deletada e salva.
                rs.MarkAsDeleted()
                rs._SaveRow()

    def consent(self, resource_type, user, roles):
        # Exemplo de lógica de consentimento - só permite que usuários com o papel '%All' vejam
        # Recursos de observações.
        if resource_type == 'Observation':
            if '%All' in roles:
                return True
            else:
                return False
        else:
            return True

Muito longo, faça um resumo

A classe FHIR.Python.Interactions é um invólucro para chamar a classe Python.

As classes abstratas IRSI são implementadas para envolver as classes abstratas Python 🥳.

Isso nos ajuda a manter o código Python e o código ObjectScript separados e então se beneficiar do melhor dos dois mundos.

0
0 93
Artigo Heloisa Paiva · Mar. 15, 2024 6m read

Introdução

Nas próximas semanas, meus colegas de trabalho estão planejando começar a usar VSCode para programar com os produtos InterSystems. Entre as várias vantagens disso, eu gostaria de salientar a possibilidade de se conectar com outras tecnologias, como o GitHub, com facilidade. Além disso, o VSCode também oferece uma extensa loja de extensões, onde você pode achar vários recursos adicionais gratuitos que fazem a programação mais rápida e eficiente. Por último e não menos importante, para conquistar os corações de todo desenvolvedor, é Open Source.

0
0 198
Artigo Danusa Calixto · Fev. 9, 2024 13m read

Talvez você não perceba isso, mas sua conta de login da InterSystems pode ser usada para acessar uma ampla variedade de serviços da InterSystems que ajudam você a aprender e usar o InterSystems IRIS e outras tecnologias da InterSystems de maneira mais eficaz.  Continue lendo para saber mais sobre como descobrir novos conhecimentos técnicos e ferramentas usando sua conta de login da InterSystems.  Além disso, após a leitura, participe da Enquete na parte inferior, para que possamos ver como este artigo foi útil para você!

O que é uma conta de login da InterSystems? 

Uma conta de login da InterSystems é usada para acessar diversos serviços online que atendem a parceiros e clientes atuais e em potencial.  É um conjunto único de credenciais usadas em mais de 15 aplicativos voltados ao público externo.  Alguns aplicativos (como a WRC ou o iService) exigem uma ativação específica para o acesso ser concedido pela conta.  Provavelmente, há recursos disponíveis que ajudarão você, mas você não os conhece: leia sobre todas as opções e teste uma nova ferramenta para melhorar sua técnica!!

Catálogo de aplicativos

Você pode ver todos os serviços disponíveis para você com sua conta de login da InterSystems ao acessar esse catálogo de aplicativos da InterSystems, localizado em:  https://Login.InterSystems.com.  Isso só listará os aplicativos ou serviços a que você tem acesso no momento.  Ele lembra seus aplicativos usados com mais frequência e os lista na parte superior para sua conveniência. 

Não se esqueça de marcar a página como favorita para acessar facilmente todas essas ferramentas na caixa de ferramentas da sua conta de login da InterSystems!

Detalhes dos aplicativos 

Agora, é hora de entrar nos detalhes de cada aplicativo e ver como eles podem ajudar você como desenvolvedor que trabalha com as tecnologias da InterSystems!  Continue lendo e tente encontrar um novo aplicativo que você possa usar pela primeira vez para melhorar sua eficiência e habilidades como desenvolvedor....

 Getting Started - gettingstarted.intersystems.com 

Público

  • Qualquer pessoa que deseja explorar usando a plataforma de dados da InterSystems IRIS®

Descrição

  • Aprenda a criar aplicativos de missão crítica e uso intensivo de dados rapidamente com o InterSystems IRIS.
  • Siga vídeos e tutoriais que usam SQL, Java, C#/.Net, Node.js, Python ou InterSystems ObjectScript.
  • Use um Sandbox gratuito, baseado na nuvem e dentro do navegador -- IRIS+IDE+Web Terminal— para seguir tutoriais. 

Como isso ajuda a melhorar sua técnica

  • Familiarize-se rapidamente com a tecnologia da InterSystems e a veja em ação com código e exemplos reais!
  • Explore o uso de outras linguagens de programação populares com o InterSystems IRIS.

 Online Learning - learning.intersystems.com

Público

  • Todos os usuários atuais e em potencial dos produtos da InterSystems 

Descrição

  • Materiais autoguiados para ajudar você a desenvolver e dar suporte aos aplicativos mais importantes do mundo:
    • Exercícios práticos
    • Vídeos
    • Cursos online
    • Programas de aprendizado

Como isso ajuda a melhorar sua técnica

  • Aprenda, aprenda, aprenda!! 
  • Nada ajudará você a se tornar um desenvolvedor eficiente mais rápido do que seguir um instrutor técnico habilidoso ensinando novos conceitos para usar nos seus projetos do InterSystems IRIS! 

 Documentação - docs.intersystems.com 

Público

  • Todos os usuários atuais e em potencial dos produtos da InterSystems

Descrição

  • Documentação para todas as versões dos nossos produtos
  • Links, quando necessário, para documentação externa
  • Todo o conteúdo recente é fornecido pelo nosso mecanismo de pesquisa.
  • A página de pesquisa deixa você filtrar por produto, versão e outros aspectos.
  • Algumas documentações exigem autorização (pela conta de login da InterSystems):
    • Documentação da AtScale disponível para clientes da Análise Adaptativa
    • Documentação da HealthShare disponível para usuários da HealthShare
  • Use a nova Lista de Verificação de Impacto de Atualização dinâmica no servidor de documentação!

Como isso ajuda a melhorar sua técnica

  • Use rapidamente materiais de referência de classes e documentação de APIs.
  • Encontre amostras de código. 
  • Leia documentação detalhada sobre o uso de partes do InterSystems IRIS em que você precisa se aprofundar.
  • Solicite mais detalhes ou denuncie problemas diretamente nas páginas de documentação através do recurso "Feedback".

 Evaluation - evaluation.intersystems.com

Público

  • Quem deseja baixar software ou licenças da InterSystems para uso em avaliação ou desenvolvimento

Descrição

  • Downloads do InterSystems IRIS e InterSystems IRIS for Health.
  • Qualquer pessoa pode baixar os kits do Community Edition.
  • Os clientes atuais também podem solicitar uma licença avançada para avaliar os recursos corporativos.
  • As versões de prévia estão disponíveis em pré-lançamento.
  • Os pacotes do Programa de Acesso Antecipado permitem que as pessoas enviem feedback sobre produtos e recursos futuros.

Como isso ajuda a melhorar sua técnica

  • Teste versões de prévia de software para ver como os novos recursos podem ajudar a acelerar seu desenvolvimento.
  • Teste recursos corporativos ao solicitar uma licença de avaliação.
  • Confira se todos os desenvolvedores na sua organização têm a versão mais recente do InterSystems IRIS instalada nas máquinas.
  • Forneça feedback para a Gestão de Produtos da InterSystems sobre os Recursos do Acesso Antecipado para garantir que eles atendam às necessidades da sua equipe após o lançamento completo.

 Developer Community - community.intersystems.com

Público

  • Qualquer pessoa que trabalha com a tecnologia do InterSystems (clientes atuais e em potencial, funcionários e parceiros da InterSystems)

Descrição

  • Monitore comunicados relacionados aos produtos e serviços da InterSystems.
  • Encontre artigos sobre uma variedade de tópicos técnicos.
  • Faça perguntas e receba respostas da comunidade.
  • Explore vagas de trabalho ou desenvolvedores disponíveis para contratação.
  • Participe de competições com prêmios em dinheiro de US$ 1000.
  • Fique por dentro de tudo relacionado a InterSystems!

Como isso ajuda a melhorar sua técnica

  • Com o acesso aos principais especialistas do mundo em tecnologia da InterSystems, você pode aprender com os melhores e continuar interagindo com perguntas, tendências e tópicos em alta.
  • Receba atualizações automaticamente na sua caixa de entrada sobre novos produtos, lançamentos e oportunidades do Programa de Acesso Antecipado.
  • Obtenha ajuda de colegas para tirar suas dúvidas e superar obstáculos.
  • Tenha discussões enriquecedoras com Gerentes e Desenvolvedores de Produtos da InterSystems: aprenda direto da fonte!
  • Eleve suas habilidades a um novo patamar ao compartilhar soluções técnicas e código, além de receber feedback de outros.

 Ideias da InterSystems - ideas.intersystems.com

Público

  • Quem deseja compartilhar ideias para melhorar a tecnologia da InterSystems.

Descrição

  • Publique ideais sobre como melhorar a tecnologia da InterSystems.
  • Leia avaliações existentes e vote ou participe em discussões.
  • A InterSystems levará em conta as ideias mais populares para o desenvolvimento de produtos futuros.

Como isso ajuda a melhorar sua técnica

  • Veja suas ideias e necessidades virarem realidade em produtos da InterSystems ou bibliotecas de código aberto.
  • Familiarize-com ideias de colegas e aprenda a usar os produtos da InterSystems de novas maneiras.
  • Implemente ideias sugeridas por outros, explorando novas partes da tecnologia da InterSystems.

 Global Masters - globalmasters.intersystems.com

Público

  • Quem quer apoiar a tecnologia da InterSystems e ganhar emblemas e brindes

Descrição

  • A plataforma de gamificação criada para que os desenvolvedores aprendam, fiquem por dentro e ganhem reconhecimento pelas contribuições através de conteúdo interativo.
  • Os usuários recebem pontos e emblemas pelo seguinte:
    • Engajamento no Developer Community
    • Engajamento no Open Exchange
    • Publicação de posts nas redes sociais sobre produtos e tecnologias InterSystems
  • Troque pontos por brindes ou treinamento gratuito da InterSystems

Como isso ajuda a melhorar sua técnica

  • Os desafios chamam sua atenção para artigos ou vídeos que talvez não tenha visto no Developer Community, site Learning ou canal do YouTube, sempre aprendendo coisas novas para aplicar aos seus projetos!

 Open Exchange - openexchange.intersystems.com 

Público

  • Desenvolvedores que buscam publicar ou usar ferramentas e pacotes de software reutilizáveis

Descrição

  • Ferramentas e pacotes de desenvolvedores criados com as plataformas de dados e os produtos da InterSystems. 
  • Os pacotes são publicados sob uma variedade de licenças de software (em grande parte, de código aberto).
  • Integração com o GitHub para versionamento de pacotes, discussões e rastreamento de bugs
  • Leia e envie avaliações e encontre os pacotes mais populares.
  • Os desenvolvedores podem enviar issues e fazer melhorias nos pacotes por solicitações pull do GitHub para ajudar a avançar o software da comunidade.
  • Os desenvolvedores podem ver estatísticas de tráfego e downloads de pacotes que publicaram

Como isso ajuda a melhorar sua técnica

  • Não reinvente a roda!  Use pacotes de código aberto criados e mantidos pela InterSystems Community para resolver problemas genéricos, deixando que você foque no desenvolvimento de soluções específicas de que sua empresa precisa.
  • A contribuição com os pacotes de código aberto é uma ótima maneira de receber feedback construtivo no seu trabalho e aprimorar seus padrões de desenvolvimento.
  • Ser um contribuidor respeitado em projetos de código aberto é uma forma excelente de aumentar a demanda pelas suas habilidades e insights. 

 WRC - wrc.intersystems.com

Público

  • Sistema de monitoramento para todos os problemas relatados por clientes no InterSystems IRIS e InterSystems HealthShare.  Os clientes com SUTA podem trabalhar diretamente com o aplicativo.

Descrição

  • Aplicativo Central de Suporte (ou "WRC Direct").
  • sistema de monitoramento para todos os problemas relatados por clientes. 
  • Abra novas solicitações. 
  • Veja todas as ações investigativas e adicione informações e comentários sobre uma solicitação. 
  • Veja informações estatísticas sobre seu histórico de chamadas de suporte. 
  • Encerre solicitações e ofereça feedback sobre o processo de suporte. 
  • Revise arquivos de patches ad-hoc. 
  • Monitore pedidos de alterações de software.
  • Baixe versões de software de produto e cliente atuais.

Como isso ajuda a melhorar sua técnica

  • Os Engenheiros de Suporte da InterSystems podem ajudar você a enfrentar obstáculos técnicos em relação ao desenvolvimento ou gerenciamento de sistemas com os produtos da InterSystems.
  • Relate bugs para garantir que os problemas sejam corrigidos em versões futuras.  

 iService - iservice.intersystems.com

Público

  • Clientes que precisam de suporte sob um contrato SLA

Descrição

  • Uma plataforma de tíquetes de suporte para nossos clientes da saúde, na nuvem e hospedados.
  • Permite cálculos e relatórios de compliance com o acordo de nível de serviço (SLA) orientado por regras.
  • Oferece recursos avançados de exportação e pesquisa de aspectos. 
  • Incorpora um sistema de gestão de Segurança Clínica completo.

Como isso ajuda a melhorar sua técnica

  • Os Engenheiros de Suporte da InterSystems podem ajudar você a enfrentar obstáculos técnicos em relação ao desenvolvimento ou gerenciamento de sistemas com os produtos da InterSystems da saúde ou na nuvem.
  • Relate bugs para garantir que os problemas sejam corrigidos em versões futuras.  

 ICR - containers.intersystems.com

Público

  • Qualquer pessoa que queira usar contêineres da InterSystems

Descrição

  • InterSystems Container Registry
  • Um registro de contêineres acessível programaticamente e IU da Web para navegação.
  • Contêineres do Community Edition disponíveis para todos.
  • Versões comerciais do InterSystems IRIS e InterSystems IRIS for Health disponíveis para clientes atendidos.
  • Gere tokens para usar nos pipelines CICD para buscar contêineres automaticamente.

Como isso ajuda a melhorar sua técnica

  • Aumente a maturidade do seu SDLC ao migrar para pipelines CICD baseados em contêineres para desenvolvimento, testes e implantação!

 Diretório de Parceiros - partner.intersystems.com 

Público

  • Quem quer encontrar um parceiro ou o produto de um parceiro da InterSystems 
  • Parceiros que buscam anunciar software e serviços  

Descrição

  • Pesquise todos os tipos de parceiros da InterSystems:
    • Parceiros de implementação
    • Parceiros de soluções
    • Parceiros de tecnologia
    • Parceiros da nuvem
  • Os parceiros existentes podem gerenciar seus anúncios de serviços e software. 

Como isso ajuda a melhorar sua técnica

  • Contrate especialistas certificados para aprender com eles nos seus projetos.
  • Licencie soluções corporativas baseadas na tecnologia da InterSystems para não precisar desenvolver tudo do zero.
  • Leve seus produtos e serviços para um público mais amplo, melhorando a procura e exigindo uma maior capacidade de entrega!

 CCR - ccr.intersystems.com 

Público

  • Organizações selecionadas que gerenciam as alterações feitas em uma implementação da InterSystems (funcionários, parceiros e usuários finais)

Descrição

  • Change Control Record
    • Aplicativo de fluxo de trabalho personalizado integrado na sua própria tecnologia para monitorar todas as personalizações dos produtos de saúde da InterSystems instalados no mundo todo.
  • Versionamento e implantação de código personalizado no local e alterações na configuração.
  • Vários níveis e opções de configuração de fluxo de trabalho.
  • Bastante adaptável para atender às necessidades específicas da fase do projeto

Como isso ajuda a melhorar sua técnica

  • Para equipes com o uso autorizado, encontre e reutilize código ou planos de implementação na sua organização, evitando precisar resolver o mesmo problema várias vezes.
  • Resolva problemas na produção com muito mais rapidez, deixando mais tempo para o trabalho de desenvolvimento. 

 Client Connection - client.intersystems.com  

Público

  • Disponível para qualquer cliente do TrakCare

Descrição

  • InterSystems Client Connection é uma plataforma de colaboração e compartilhamento de conhecimento para clientes do TrakCare.
  • Comunidade online para clientes do TrakCare desenvolvem conexões melhores e mais próximas.
  • Em Client Connection, você encontrará o seguinte: 
    • Notícias e eventos do TrakCare 
    • Materiais de lançamentos do TrakCare, por exemplo, documentação de versões e vídeos de prévia
    • Acesso a guias de produtos atualizados.
    • Materiais de suporte para desenvolver o conhecimento pessoal.
    • Fóruns de discussão para aproveitar o conhecimento de colegas. 

Como isso ajuda a melhorar sua técnica

  • Os especialistas técnicos e de aplicativos nos sites do TrakCare podem compartilhar perguntas e conhecimentos rapidamente, se conectando com outros usuários do mundo todo.  Com respostas mais rápidas, sobra mais tempo para desenvolver soluções!

 Pedidos online - store.intersystems.com

Público

  • Usuários de operações em parceiros/usuários finais de aplicativos selecionados

Descrição

  • Permita que os clientes escolham diferentes produtos de acordo com seus contratos e façam novos pedidos.  
  • Permita que os clientes atualizem/troquem pedidos existentes.
  • Envie pedidos às Operações de Clientes da InterSystems para processá-los para entrega e faturamento.
  • Permita que os clientes migrem as licenças existentes para o InterSystems IRIS.

Como isso ajuda a melhorar sua técnica

  • Honestamente, não ajuda!  É uma ferramenta usada pela equipe de operações, e não usuários técnicos, mas está incluída aqui para ficar completo, já que o acesso é controlado por uma conta de login da InterSystems ;)  

Outras coisas que você deve saber sobre sua conta de login da InterSystems

Aqui estão mais alguns fatos úteis sobre as contas de login da InterSystems...

Como criar uma conta de login

Os usuários podem criar sua própria conta ao clicar em "Create Account" em qualquer aplicativo da InterSystems voltado ao público, incluindo:

Como alternativa, o FRC (First Response Center) da InterSystems criará uma conta de login para clientes atendidos pela primeira vez que precisarem acessar a Central de Suporte (WRC) ou o iService (os clientes atendidos também podem criar contas para os colegas).

Antes de usar a conta, o usuário precisa aceitar os Termos e Condições, durante o processo de autoinscrição ou no primeiro login.

Opções alternativas de login

Alguns aplicativos permitem o login com o Google ou GitHub:

É a mesma conta de login da InterSystems, mas com a autenticação pelo Google ou GitHub.

Perfil da conta

Se você for até https://Login.InterSystems.com e fizer a autenticação, poderá acessar Opções > Profile e fazer alterações básicas na sua conta.  O e-mail pode ser alterado em Options > Change Email.  

Como resolver problemas da conta de login

Os problemas das contas de login da InterSystems devem ser encaminhados para Support@InterSystems.com.  Inclua o seguinte:

  • Nome de usuário utilizado na tentativa de login
  • E-mail
  • Tipo e versão do navegador
  • Mensagens e/ou capturas de tela do erro específico
  • Data e hora do erro recebido   
0
0 146
Artigo Danusa Calixto · Dez. 13, 2023 6m read

Introdução

Como a InterSystems anunciou recentemente a descontinuação do suporte ao InterSystems Studio a partir da versão 2023.2 em favor do desenvolvimento exclusivo de extensões para o IDE do Visual Studio Code (VSC), acreditando que este oferece uma experiência superior em comparação com o Studio, vários desenvolvedores migraram ou estão começando a usar o VSC. Vários talvez tenham se perguntado sobre como abrir o terminal para realizar operações, já que o VSC não tem um painel de saída como o Studio nem um recurso integrado para abrir o terminal IRIS, exceto baixando os plug-ins desenvolvidos pela InterSystems.

Resumo

  • Introdução 
  • Soluções
    • Para usuários com, no mínimo, IRIS 2020.1 ou IRIS 2021.1.2  – Use Web Terminal
    • Para usuários com, no mínimo, IRIS 2023.2 – Use WebSocket Terminal
    • Para usuários com o IRIS baseado em Docker
    • Para usuários com versões do IRIS anteriores à 2023.2 trabalhando em suas máquinas locais
    • Para usuários programando no IRIS com base em um servidor remoto usando uma conexão SSH

Soluções

Há várias maneiras de abrir o terminal no VSC, dependendo da configuração específica que você estiver usando. Resumi aqui as melhores soluções para qualquer situação:

Para usuários com, no mínimo, IRIS 2020.1.1 ou IRIS 2021.1.2 – Use Web Terminal

Usuários que têm, no mínimo, o IRIS 2020.1.1 ou IRIS 2021.1.2 e podem instalar extensões externas (alguém pode não ter permissão para isso devido à política da empresa em relação a aplicativos de terceiros) podem achar útil a extensão Web Terminal para VSC. Para quem não sabe, Web Terminal é um terminal baseado na Web para os produtos da InterSystems desenvolvidos com ObjectScript (por exemplo, IRIS, Caché, Ensemble, HealthShare e TrakCare) que permite usar uma versão mais avançada do terminal dentro do navegador (página do projeto). Essa extensão do VSC possibilita inicializar um terminal baseado na Web diretamente do VSC, com um simples clique.

Para abrir o Web Terminal, clique em: InterSystems Tools (Ferramentas da InterSystems)  > selecione um namespace > clique em um dos seguintes ícones (, ) para abrir o Web Terminal em um painel de terminal do VSC ou no navegador (pressione Alt para mudar o ícone padrão):

 

 

Para usuários com, no mínimo, IRIS 2023.2 – Use WebSocket Terminal

Usuários com, no mínimo, IRIS 2023.2 podem se beneficiar do novo recurso "WebSocket Terminal" incluso na versão mais recente das extensões do VSC e não precisam de alternativas adicionais.

Para abrir o WebSocket Terminal, clique em: InterSystems Tools > selecione um namespace > clique no ícone ao lado do correspondente ao Web Terminal.

Para usuários com IRIS baseado em Docker

Quem trabalha com ambientes do IRIS no Docker e usa o VSC pode iniciar uma sessão de terminal diretamente no ambiente do Docker.  

Clique na voz do Docker na Barra de status e selecione Open Terminal in Docker (Abrir terminal no Docker).

Quero agradecer @Evgeny Shvarov pela foto e explicação sobre esse ponto.

 

Para usuários com versões do IRIS anteriores à 2023.2 trabalhando nas suas máquinas locais

Para usuários que trabalham com uma versão do IRIS executada na máquina local, é possível configurar um terminal do IRIS dedicado no VSC:

    1. Abra o arquivo settings.json. Você pode encontrá-lo de várias maneiras, por exemplo, clicando em View (Ver) > Command Palette (Paleta de comandos) > digite: "settings" (configurações) > Open User Settings (JSON) (Abrir configurações do usuário)
    2. Adicione o seguinte código em "terminal.integrated.profiles.windows":
"terminal.integrated.profiles.windows":{
<span class="hljs-string">"IRIS Terminal"</span>: {

&nbsp;&nbsp;&nbsp; <span class="hljs-string">"path"</span>: [

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="hljs-string">"C:\\InterSystems\\IRISHealth\\bin\\irissession.exe"</span>
&nbsp;&nbsp;&nbsp; ],

&nbsp;&nbsp;&nbsp; <span class="hljs-string">"args"</span>: [<span class="hljs-string">"IRISHEALTH"</span>],

&nbsp;&nbsp;&nbsp; <span class="hljs-string">"icon"</span>: <span class="hljs-string">"terminal-cmd"</span>
} 

}

Observação: insira o caminho correto do seu irissession.exe.

c. Para abrir o terminal a partir do VSC, navegue até: Terminal > New Terminal (Novo terminal) > Launch Profile… (Inicializar perfil) > IRIS Terminal.

d. Uma voz "IRIS Terminal" deve agora estar disponível no menu Terminal:

Para usuários programando no IRIS com base em um servidor remoto usando uma conexão SSH 

Para quem trabalha em uma versão do IRIS baseada em um servidor remoto (por exemplo, o servidor de uma empresa) acessível por conexão SSH (por exemplo, usando PuTTY), é possível usar a extensão Remote - SSH VSC para conectar o VSC diretamente ao servidor. Para fazer isso:

    1. Instale a extensão Remote - SSH: Editing Configuration Files no VSC;
    2. Clique no ícone "Remote Explorer" (Explorador remoto) na barra lateral;
    3. Selecione "Open SSH Config File" (Abrir arquivo de configuração SSH)

  

e abra o arquivo de configuração com o caminho: C:\Users\<username>\.ssh\config

    1. Insira o seguinte código no arquivo de configuração: 
Host my-putty-connection

    HostName < IP address or server name >

    User < username >

    IdentityFile < private key path on your local machine >

    Port < port >

O endereço IP e a porta correspondem ao nome do host e à porta especificada em PuTTY, o nome de usuário é a credencial de usuário usada para acessar o servidor remoto, e IdentityFile é o caminho do arquivo para a chave privada de PuTTY.

Observação:  o formato original da chave privada gerada por PuTTY (.ppk) não pode ser lido pelo VSC. Para estabelecer uma conexão entre o VSC e o servidor remoto via PuTTY, você precisa duplicar a chave privada original e converter a nova versão no formato .pem. Para fazer a conversão:

  1. Inicialize o aplicativo PuTTYgen
  2. No menu File (Arquivo), clique em "Load private key" (Carregar chave privada)
  3. Selecione sua chave privada no formato .ppk e escolha "Open" (Abrir)
  4. No menu Conversions (Conversões), clique em "Export OpenSSH Key (force new file format)", ou "Exportar chave OpenSSH (forçar novo formato de arquivo)".
  5. Defina um novo nome com a extensão .pem e clique no botão Save (Salvar).
  6. Vincule o caminho para esse novo arquivo .pem ao parâmetro IdentifyFile no VSC
    1. Salve o arquivo. Depois de alguns segundos, a nova conexão deve aparecer no painel Remote Explorer;
    2. Clique em "Connect in New Window..." (Conectar em uma nova janela...) para abrir a conexão SSH em uma nova janela do VSC:
  7.  Selecione o sistema operacional da sua máquina remota (somente no primeiro acesso)
  8. Na nova janela, acesse: Terminal New Terminal (ou use os atalhos Ctrl + ò ou Ctrl + Shift + ò).
  9. Agora você está conectado à máquina remota e pode usar seu Terminal IRIS dentro do VSC.

Observação: essa operação só funciona se você iniciar a conexão remota via PuTTY antes, e não funciona se PuTTY for encerrado ou não estiver conectado ao servidor remoto. Essa operação não inicializa PuTTY, só permite que o VSC se conecte ao túnel estabelecido por PuTTY.

Para iniciar uma conexão PuTTY pelo VSC, você pode utilizar um arquivo de lote (no Windows). O arquivo connect_remote.bat fornecido usa o comando Plink, incluso em PuTTY, para iniciar uma sessão:

@echo off

set SESSION="<your saved session name>"

plink -load %SESSION%

Para iniciar a sessão, basta digitar .\connect_remote.bat no terminal do VSC para abrir a conexão remota e inserir suas credenciais.

Observação: com este último método, você ganha acesso a uma versão do terminal compatível com todos os atalhos do VSC! Bem-vindo de volta, Ctrl+V, e adeus, Shift+Insert 🎉

1
0 309
Artigo Danusa Calixto · Dez. 5, 2023 5m read

Deixe-me apresentar meu novo projeto, que é o irissqlcli, um REPL (Read-Eval-Print Loop)  para o InterSystems IRIS SQL 

  • Destaque de sintaxe
  • Sugestões (tabelas, funções)
  • 20+ formatos de saída
  • Suporte ao stdin
  • Saída em arquivos 

Instale com o pip

pipinstallirissqlcli

Ou execute com o docker

dockerrun-itcaretdev/irissqlcliirissqlcliiris://_SYSTEM:SYS@host.docker.internal:1972/USER

Conecte ao IRIS

$ irissqlcli iris://_SYSTEM@localhost:1972/USER -W
Password for _SYSTEM:
Server:  InterSystems IRIS Version 2022.3.0.606 xDBC Protocol Version 65
Version: 0.1.0
[SQL]_SYSTEM@localhost:USER> select $ZVERSION
+---------------------------------------------------------------------------------------------------------+
| Expression_1                                                                                            |
+---------------------------------------------------------------------------------------------------------+
| IRIS for UNIX (Ubuntu Server LTS for ARM64 Containers) 2022.3 (Build 606U) Mon Jan 30202309:05:12 EST |
+---------------------------------------------------------------------------------------------------------+
1 row in set
Time: 0.063s
[SQL]_SYSTEM@localhost:USER> help
+----------+-------------------+------------------------------------------------------------+
| Command  | Shortcut          | Description                                                |
+----------+-------------------+------------------------------------------------------------+
| .exit    | \q                | Exit.                                                      |
| .mode    | \T                | Change the table format used to output results.            |
| .once    | \o [-o] filename  | Append next result to an output file (overwrite using -o). |
| .schemas | \ds               | List schemas.                                              |
| .tables  | \dt [schema]      | List tables.                                               |
| \e       | \e                | Edit command with editor (uses $EDITOR).                   |
| help     | \?                | Show this help.                                            |
| nopager  | \n                | Disable pager, print to stdout.                            |
| notee    | notee             | Stop writing results to an output file.                    |
| pager    | \P [command]      | Set PAGER. Print the query results via PAGER.              |
| prompt   | \R                | Change prompt format.                                      |
| quit     | \q                | Quit.                                                      |
| tee      | tee [-o] filename | Append all results to an output file (overwrite using -o). |
+----------+-------------------+------------------------------------------------------------+
Time: 0.012s
[SQL]_SYSTEM@localhost:USER>

$ irissqlcli--helpUsage: irissqlcli[OPTIONS][URI][USERNAME]

Options: -h, --hostTEXTHostaddressoftheIRISinstance. -p, --portINTEGERPortnumberatwhichtheIRISinstanceislistening. -U, --usernameTEXTUsernametoconnecttotheIRISinstance. -u, --userTEXTUsernametoconnecttotheIRISinstance. -W, --passwordForcepasswordprompt. -v, --versionVersionofirissqlcli. -n, --nspaceTEXTnamespacenametoconnectto. -q, --quietQuietmode, skipintroonstartupandgoodbyeonexit. -l, --logfileFILENAMELogeveryqueryanditsresultstoafile. --irissqlclircFILELocationofirissqlclircfile. --auto-vertical-outputAutomaticallyswitchtoverticaloutputmodeiftheresultiswiderthantheterminalwidth. --row-limitINTEGERSetthresholdforrowlimitprompt. Use 0 todisableprompt. -t, --tableDisplaybatchoutputintableformat. --csvDisplaybatchoutputinCSVformat. --warn / --no-warnWarnbeforerunningadestructivequery. -e, --executeTEXTExecutecommandandquit. --helpShowthismessageandexit.

ou no modo Python Embedded (%Service_CallIn precisa estar ativada)

$ irissqlcliiris+emb:///USERServer:  IRISforUNIX (UbuntuServerLTSforARM64Containers) 2022.2 (Build 368U) FriOct 21 2022 16:39:41EDTVersion: 0.1.0[SQL]irisowner@/usr/irissys/:USER>

Ele é compatível com o stdin, então você pode criar um pipe de um arquivo SQL com várias consultas SQL e comandos irissqcli. Por exemplo, este comando produzirá 3 arquivos em formatos diferentes (de mais de 20 formatos disponíveis)

$ cat <<EOF | irissqlcli iris://_SYSTEM:SYS@localhost:1972/USER

.mode csv; tee -o test.csv; select top 10 TABLE_SCHEMA,TABLE_NAME from information_schema.tables orderby TABLE_SCHEMA,TABLE_NAME; notee;

.mode latex; tee -o test.tex; select top 10 TABLE_SCHEMA,TABLE_NAME from information_schema.tables orderby TABLE_SCHEMA,TABLE_NAME; notee;

.mode html; tee -o test.html; select top 10 TABLE_SCHEMA,TABLE_NAME from information_schema.tables orderby TABLE_SCHEMA,TABLE_NAME; notee;

EOF

Além disso, é possível executar um terminal da Web com o docker

docker run -d --name irissqlcli \
  --restart always \
  -p 7681:7681\
  caretdev/irissqlcli-web irissqlcli iris://_SYSTEM:SYS@host.docker.internal:1972/USER

http://localhost:7681/

E com docker-compose

version: '3'
services:
  iris:
    image: intersystemsdc/iris-community
    ports:
      - 1972
      - 52773
    command:
      - -a
      - '##class(Security.Users).UnExpireUserPasswords("*")'
  cli:
    image: caretdev/irissqlcli-web
    ports:
      - 7681:7681
    environment:
      - IRIS_HOSTNAME:iris
      - IRIS_PORT=1972
      - IRIS_NAMESPACE=USER
      - IRIS_USERNAME=_SYSTEM
      - IRIS_PASSWORD=SYS

Por favor, vote no projeto no concurso

0
0 103
Anúncio Danusa Calixto · Maio 24, 2023

Se você já construiu testes unitários utilizando o %UnitTest framework, ou está pensando em usá-lo, por favor dê uma olhada no InterSystems Testing Manager. 

Agora você pode buscar os testes unitários sem sair do VS Code, executar ou depurá-los, e visualizar os resultados da execução anterior. 

0
0 88
Artigo Heloisa Paiva · Fev. 17, 2023 4m read

Porque decidi escrever esse artigo

Mais uma vez me surgiu um desafio que me custou algum tempo e muitos testes para obter a melhor solução. E agora que consegui, quero compartilhar meu novo conhecimento

O que aconteceu?

Em um namespace havia muitas classes similares, então para deixá-las mais simples há uma superclasse com as propriedades comuns. Além isso, entre essas classes há relações. Eu tinha que exportar uma dessas classes para JSON, mas não poderia mudar nenhuma configuração das superclasses, para não romper o fluxo de outras integrações.

0
0 78
Artigo Gilleady Alves da Silva · Fev. 17, 2023 2m read

O arquivo Messages.log contém muitas informações úteis sobre o IRIS. Às vezes, o arquivo fica grande e não é fácil encontrar os dados que estou interessado em revisar. Seria bom pular para uma data e hora específica em que suspeitamos que um problema possa ter começado.

Sempre que preciso de suporte da InterSystems, o WRC pedirá que envie o arquivo Messages.log. Dependendo de onde o IRIS está implantado, pode ser difícil obter o arquivo Messages.log para enviá-lo para a InterSystems.

0
0 69
Anúncio Angelo Bruno Braga · jan 16, 2023

Olá Desenvolvedores,

Gostaríamos de convidá-lo a participar de nosso próximo concurso, dedicado à criação de ferramentas úteis para facilitar a vida de seus colegas desenvolvedores:

🏆 Concurso InterSystems: Ferramentas para Desenvolvedores 🏆

Envie um aplicativo que ajude a desenvolver mais rapidamente, contribua com código mais qualitativo e ajude no teste, implantação, suporte ou monitoramento de sua solução com o InterSystems IRIS.

Duração: de 23 de Janeiro a 12 de Fevereiro de 2023

Total em prêmios: US$13.500

 

0
0 300
Artigo Danusa Calixto · Ago. 10, 2022 7m read

Depois deste GitHub, vamos ver como o protocolo FIX pode ser facilmente implementado usando a IRIS e o Python.

Se você não tem muito tempo, foque na seção Envie uma Cotação antes do Pedido no final, que explica em alguns minutos como enviar uma Solicitação de Cotação seguido por uma Solicitação de Pedido, além de mostrar o resultado do servidor em menos de cinco cliques.

IRIS-fix-protocol

A implementação do Protocolo FIX usando um contêiner Python da IRIS para o iniciador e um contêiner Python regular para o ativador.

O Protocolo Financial Information eXchange (FIX®) revolucionou o ambiente de negociações, provando ser fundamental na facilitação de várias tendências de negociações eletrônicas que surgiram na última década.

O FIX se tornou uma linguagem dos mercados globais financeiros muito usada por firmas de compra e venda, plataformas de negociação e até reguladores para comunicar informações de negócios.

Esta demonstração tem como objetivo simular um cliente FIX, permitindo ao usuário criar várias sessões conectadas a um servidor (ativador do FIX) e enviar solicitações de compra ou venda.

Requisitos e informações

  • O QuickFix será instalado automaticamente na construção
  • Se você usa VSCode (deve ter visto algumas janelas pop-up no canto direito) e pressionar open in container, todas as extensões necessárias serão instaladas. Esse passo não é obrigatório.

Veja a documentação geral neste site.

Veja a documentação das tags neste site.

Veja os tipos de mensagens neste site.

Demonstração

Começando a demonstração

Para iniciar a demonstração, você precisa usar Docker-compose na pasta iris-fix-protocol:

docker-compose up

Encerrando a demonstração

docker-compose down

Abrindo a demonstração

Se você NÃO estiver dentro do contêiner da IRIS, conecte-se à demonstração usando:

http://localhost:52795/csp/irisapp/EnsPortal.ProductionConfig.zen?PRODUCTION=INFORMATION.QuickFixProduction

Username é SuperUser e Password é SYS

Se você estiver no contêiner:

http://127.0.0.1:52773/csp/irisapp/EnsPortal.ProductionConfig.zen?PRODUCTION=INFORMATION.QuickFixProduction

Usando a demonstração do cliente: Iniciador

Configurações e sessões

Só uma sessão pode ser aberta pela operação Python.Fix---.

Temos uma Sessão de Pedidos, Python.FixOrder, que pode enviar qualquer mensagem/solicitação ao servidor.

Temos uma Sessão de Cotações, Python.FixQuote, que faz a inscrição automática na solicitação de dados do mercado e pode enviar ao servidor qualquer solicitação de cotação.

Se você quiser modificar os parâmetros dessa sessão, clique em Python.FixOrder ou Python.FixQuote e acesse settings na guia à direita, na parte Python e na parte %settings. Aqui, você pode inserir ou modificar quaisquer parâmetros (não se esqueça de pressionar apply depois de terminar).
Veja a configuração padrão para Fix Order:

BeginString=FIX.4.3
SenderCompID=CLIENTORDER
TargetCompID=SERVER
HeartBtInt=30
SocketConnectPort=3000
SocketConnectHost=acceptor
DataDictionary=/irisdev/app/src/fix/spec/FIX43.xml
FileStorePath=/irisdev/app/src/fix/Sessions/
ConnectionType=initiator
FileLogPath=./Logs/
StartTime=00:00:00
EndTime=00:00:00
ReconnectInterval=10
LogoutTimeout=5
LogonTimeout=30
ResetOnLogon=Y
ResetOnLogout=Y
ResetOnDisconnect=Y
SendRedundantResendRequests=Y
SocketNodelay=N
ValidateUserDefinedFields=N
ValidateFieldsOutOfOrder=N

Veja a configuração padrão para Fix Quote:

BeginString=FIX.4.3
SenderCompID=CLIENTQUOTE
TargetCompID=SERVER
HeartBtInt=30
SocketConnectPort=3000
SocketConnectHost=acceptor
DataDictionary=/irisdev/app/src/fix/spec/FIX43.xml
FileStorePath=/irisdev/app/src/fix/Sessions/
ConnectionType=initiator
FileLogPath=./Logs/
StartTime=00:00:00
EndTime=00:00:00
ReconnectInterval=10
LogoutTimeout=5
LogonTimeout=30
ResetOnLogon=Y
ResetOnLogout=Y
ResetOnDisconnect=Y
SendRedundantResendRequests=Y
SocketNodelay=N
ValidateUserDefinedFields=N
ValidateFieldsOutOfOrder=N

Se você quiser modificar os parâmetros da Inscrição no Mercado, clique em Python.FixQuote e acesse settings na guia à direita, na parte Python Adapter e na parte %settings. Aqui, você pode inserir ou modificar quaisquer parâmetros (não se esqueça de pressionar apply depois de terminar).
Veja a configuração padrão para o adaptador Fix Order:

subscribe=True
MarketDepth=0
MDUpdateType=0
SecurityType=FOR
md_types=0;1
symbols=EUR/USD;USD/CZK
products=4;4

Os símbolos e os produtos funcionam juntos e representam uma lista de símbolos + produtos do FIX, que deve ser usada assim: symbols=EUR/USD;EUR/CZK;USD/CZK products=4;4;4

Agora, ao iniciar/reiniciar, a nova configuração será aplicada e as novas sessões serão criadas.

Para criar várias sessões ativas ao mesmo tempo, você pode adicionar uma nova operação com o + perto da coluna Operation. Em Operation Class, selecione Python.FixOrderOperation ou Python.FixQuoteOperation e, em Operation Name, Python.FixOrder2, por exemplo. Agora, você precisa inserir a configuração desejada para a sessão.
Pode ser a mesma configuração padrão anterior ou qualquer outra configuração válida, mas qualquer nova sessão precisa ser adicionada também ao servidor. Observe que ter a mesma configuração de ID da sessão duas vezes pode causar problemas relacionados à conexão com o servidor. Veja mais informações neste site (na guia "Getting started" / "Configuration").

Enviar uma cotação

Primeiro, você precisa iniciar a demonstração, usando o botão verde Start, ou use Stop e Start novamente para aplicar as mudanças nas configurações.

Em seguida, ao clicar na operação Python.FixQuote escolhida e selecionar na guia à direita action, você pode aplicar test à demonstração.

Na janela test, selecione:

Nova cotação

Tipo de solicitação: Grongier.PEX.Message

Em classname, insira:

msg.Request

Para json, veja um exemplo de solicitação de cotação:

{
"header_field":
    {
        "35":"R"
    },
"group_field":
    {
        "146":
        {
            "40":"1;2",
            "55":"EUR/USD;USD/CZK"
        }
    }
}

Agora, você pode clicar em Visual Trace para ver nos detalhes o que aconteceu e visualizar os registros do iniciador.

Enviar um pedido

Primeiro, você precisa iniciar a demonstração, usando o botão verde Start, ou use Stop e Start novamente para aplicar as mudanças nas configurações.

Em seguida, ao clicar na operação Python.FixOrder escolhida e selecionar na guia à direita action, você pode aplicar test à demonstração.

Na janela test, selecione:

Aqui, você pode enviar qualquer mensagem de quickfix para o servidor. Veja um exemplo de uma solicitação de ordem de compra, mas se você seguir o mesmo padrão em quase qualquer tipo de mensagem.

Nova ordem de compra Tipo de solicitação: Grongier.PEX.Message

Em classname, insira:

msg.Request

Para json, veja um exemplo de uma ordem de compra simples:

{
"header_field":
    {
        "35":"D"
    },
"message_field":
    {
        "55": "EUR/USD",
        "40": "1",
        "44": "100",
        "38": "10000",
        "54": "1",
        "21": "1"
    }
}

Agora, você pode clicar em Visual Trace para ver nos detalhes o que aconteceu e visualizar os registros do iniciador.

Envie uma Cotação antes da Ordem

Isso, que é lógica de aplicação, depende do funcionamento das especificações e de como o servidor processa as mensagens. No nosso exemplo, podemos usar Fix.BusinessProcess desta forma:

Tipo de solicitação: Grongier.PEX.Message

Em classname, insira:

msg.Request

Para json, veja um exemplo de uma ordem de compra simples:

{
"header_field":
    {
        "35":"D"
    },
"message_field":
    {
        "55": "EUR/USD",
        "40": "1",
        "44": "100",
        "38": "10000",
        "54": "1",
        "21": "1"
    }
}

É igual a uma solicitação de Ordem, mas no processo enviaremos antes de maneira automática uma solicitação de Cotação, com as informações corretas necessárias, para depois enviar a solicitação de Ordem.

Ao clicar em Visual Trace, você pode ver todas as mensagens.

Usando a demonstração do servidor: ativador

Registros

O ativador está isolado em outro contêiner. Para acessar os registros, você precisa acessar a pasta de origem iris-fix-protocol e a pasta acceptor/Logs. Aqui, você ver os registros para cada sessão.

Nova sessão do ativador

Se você conhece o protocolo FIX, você sabe que criar uma sessão no lado do cliente sem adicioná-la ao lado do servidor causará um erro, o que faz sentido, já que segurança e confiança são palavras-chave para o protocolo FIX.

Para adicionar uma nova sessão ao ativador, você precisa acessar acceptor/server.cfg e incluir as sessões que você quer adicionar no final do arquivo.

Agora, você pode inserir no terminal:

docker-compose up -d --build acceptor

Isso fechará e reiniciará o ativador, então talvez cause problemas relacionados às solicitações enviadas e aos dados armazenados.

0
0 166
Anúncio Angelo Bruno Braga · Abr. 5, 2022

Estamos muito empolgados em anunciar o nosso novo portal para receber suas sugestões e comentários, o InterSystems Ideas!

Nós pretendemos melhorar nossos mecanismos para recebimento de feedbacks de forma que seja possível receber suas sugestões de como nossos produtos podem evoluir para atender aos desafios de seu negócio. As perguntas da Comunidade de Desenvolvedores são uma ótima forma de interagir com seus colegas em algum problema específico de codificação e, o suporte aos clientes é, como sempre, a forma de ter seu problema imediato resolvido.

0
0 71
Anúncio Ben Spead · Jul. 7, 2021

Olá Desenvolvedores!

Vocês já tiveram que converter mensagens HL7v2 para FHIR (Fast Healthcare Interoperability Resources) e acharam o processo de transformação complicado e confuso? A InterSystems está criando uma nova oferta de SaaS baseada em nuvem chamada de Serviços de Transformação de Mensagens do HealthShare que faz com que este processo se torne simples. Estamos muito empolgados de anunciar um Programa de Acesso Antecipado para esta nossa nova oferta e adoraríamos que vocês o utilizassem e então nos dessem seu feedback a respeito do mesmo! Para isso basta que vocês possuam uma conta grátis AWS, com um bucket S3 para colocar suas mensagens HL7v2 e outro bucket S3 para colocar a saída em FHIR. 

0
0 128
Artigo Fernando Ferreira · Mar. 25, 2021 6m read

Olá comunidade,

  Nesta 4ª parte vamos falar de uma funcionalidade do InterSystems IRIS Reports chamada de “Bursting”. Vamos primeiro relembrar o que já vimos até o momento.

Entendemos o que é o InterSystems IRIS Reports, instalamos os ambientes: Designer e Server, verificamos os diversos tipos e formatos de relatórios que podemos desenvolver, e entendemos como distribuir um relatório em diversos formatos.

Mas afinal o que é o “Bursting”? Antes de demonstrar está funcionalidade em ação, vamos primeiro refletir sobre a sua necessidade.

Todos nós já nos deparamos com necessidade de processar relatórios com milhares de linhas, e este tipo de relatório normalmente tem um alto custo de processamento no banco de dados com milhares de linhas que não são destinadas a um único usuário, você precisa segregar as informações por região, por alguma categoria seja de produto ou um tipo de exame, ou por alguma hierarquia existente para o seu tipo de negócio. Sem o InterSystems IRIS Reports, você precisaria desenvolver uma ou mais queries aplicando técnicas para filtrar dados com as opções de “filtro” que usuário precisa ou pode ter acesso, e podem ocorrer mais de uma execução por diversos usuários ao longo do dia.

0
0 177
Artigo Fernando Ferreira · Mar. 17, 2021 10m read

Olá Comunidade,

Chegou a hora de iniciarmos o desenvolvimento dos relatórios utilizando o InterSystems IRIS Reports, powered by Logi Analytcs.

Lembrando que na primeira parte do artigo falamos o que é o InterSystems IRIS Reports, e como ele vem facilitar a vida dos desenvolvedores na entrega de relatórios, e na segunda parte executamos o procedimento de instalação dos ambientes server e designer e o procedimento para fazer o download dos binários de instalação!

Alguns conceitos importantes antes de iniciarmos o desenvolvimento sobre os tipos de relatórios que podemos desenvolver:

  • Estáticos: Os relatórios e seus resultados não podem ser modificados pelo usuário final. O layout e os dados inclusos são definidos pelo desenvolvedor.
  • Dinâmicos: Os relatórios podem ser modificados pelos usuários finais, como no estático o layout e dos dados são inclusos pelo desenvolvedor, porém o usuário final consegue modificá-los em tempo de execução.
  • Ad Hoc – Relatórios e dados são construídos e modificados em tempo de execução pelo usuário final. 
2
0 426
Anúncio Angelo Bruno Braga · Mar. 17, 2021

Olá Desenvolvedores,

Vocês pediram e nós atendemos ! Estamos felizes em anunciar a próxima competição para desenvolvedores Intersystems !

Seja bem vindo ao: 

🏆 Concurso de Programação InterSystems: Ferramentas de Desenvolvimento 🏆

Envie uma aplicação que ajude a realizar um desenvolvimento mais rápido, que contribua com um código mais qualitativo, ajude nos testes, na implantação, no suporte ou no monitoramento de sua solução utilizando o InterSystems IRIS.

Duração: de 29 de Março a 25 de Abril de 2021

Premiação Total: US$ 8,500


0
0 124
Artigo Fernando Ferreira · Mar. 4, 2021 6m read

Olá comunidade,

              Vamos para a 2º parte do artigo InterSystems IRIS Reports.

Somente relembrando na primeira parte do artigo falamos dos desafios existentes para atender a demanda das áreas de negócios, clientes ou usuários finais com a entrega de relatórios em diversos formatos e suas melhorias, e como o InterSystems IRIS Reports vem para facilitar está demanda, facilitando o desenvolvimento, a administração, o deploy de relatórios em diversos formatos, bem como a automação da distribuição por e-mail ou pastas e integração (build-in) em suas aplicações já existentes!

O InterSystems IRIS Reports, powered by Logi Report se encontra disponível para download no WRC (https://wrc.intersystems.com/wrc/coDistribution.csp), lembrando que para clientes que já possuem o licenciamento InterSystems IRIS Advanced Server ou InterSystems IRIS Advanced for Health, precisam somente abrir um chamado solicitando o serial para a instalação do InterSystems IRIS Reports, sem custo adicional.

Como mencionando no artigo anterior o InterSystems IRIS Reports é divido em dois componentes:

Server: O ambiente servidor tem a sua finalidade de administrar as configurações e segurança. É também onde os usuários finais via browser têm acesso aos relatórios, você pode agendar execução de relatórios, aplicar filtros e modificar os relatórios disponibilizados.

Designer: O ambiente designer por sua vez é onde os relatórios são desenvolvidos. É possível visualizar os relatórios antes de disponibilizar acessando diretamente a bases de dados.

0
0 332
Artigo Fernando Ferreira · Fev. 23, 2021 2m read

Olá comunidade,

Todos nós já conhecemos o poder da solução InterSystems IRIS Data platformou IRIS for Health, a facilidade de desenvolver aplicações utilizando Object Script, Java, Node.JS, Python, .NET,  com alto desempenho e confiabilidade do nosso banco de dados multi-modelo altamente escalável de forma horizontal ou vertical, o poder da interoperabilidade entre aplicações, com outros bancos de dados, a possibilidade de integrar utilizando diversos protocolos como REST, SOA, MQTT, FTP, etc., a nossa solução de BI, NLP, tudo em um mesmo binário, em uma mesma plataforma, o que facilita a vida do desenvolvedor a entregar soluções inovadoras e confiáveis!

Mesmo entregando soluções inovadoras, existe um desafio diário para muitos desenvolvedores, demandada pelas áreas de negócios, seja para entregar informação para clientes e ou usuários internos/externos etc., que são os relatórios.

0
0 211
Artigo Claudio Devecchi · Fev. 8, 2021 10m read

HealthShare Patient Index

Enterprise Master Patient Index - Este é o nome dado ao processo que faz com que os inúmeros cadastros e registros coletados dos vários sistemas das instituições e redes de saúde sejam identificados univocamente e interligados através de um identificador único por indivíduo.

Isto viabiliza uma infinidade de benefícios para as instituições ou redes de saúde, pois permite, além da gestão das duplicidades em um mesmo sistema de prontuário eletrônico, que todos os dados segregados por número de cadastro sejam visualizados de forma consolidada por indivíduo. Cada vez mais, as instituições estão buscando uma abordagem holística do cuidado contínuo, da prevenção e da experiência centrada no paciente.

Falando sobre o produto Healthshare Patient Index da InterSystems, podemos dividi-lo em 6 grandes grupos de funcionalidades.

1 - Integração das informações cadastrais dos pacientes

Esta etapa engloba todos os mecanismos de coleta das informações nos sistemas de origem, seja através de API’s com protocolos específicos de saúde como o HL7, seja através de processos específicos ou customizados.

Neste ponto, é importante que a plataforma de integração ofereça uma série de requisitos de interoperabilidade que assegure flexibilidade, governança e segurança.

É muito comum sistemas de prontuário eletrônico internacionais fornecerem nativamente exportações de dados usando o protocolo HL7, que neste caso também é nativo nos produtos da Intersystems. Os sistemas nacionais geralmente demandam processos menos padronizados, e é por isso que é necessário que a plataforma seja de fácil e rápida implementação.

Geralmente as informações são enviadas ou disponibilizadas no momento em que o paciente é admitido nos estabelecimentos de saúde.

A arquitetura deste processo é definida conforme as necessidades de cada organização e disponibilidade dos recursos computacionais.

2 - Análise Qualitativa e Normalização

Normalizar significa trazer para um mesmo plano de comparação informações demográficas que foram cadastradas de formas completamente diferentes. É também nesta etapa que todo o “lixo” é removido. Isto não quer dizer que a informação seja ruim, mas que não serve para o processo do MPI.

Se os dados fossem comparados sem esta etapa, provavelmente cadastros de um mesmo indivíduo nunca seriam comparados, dada à discrepância de sistema para sistema.

Se observarmos o processo de cadastro de cada estabelecimento e sistema de origem, veremos uma infinidade de formas de entrada dos dados e diversas maneiras de armazenamento das informações. Isso depende de como cada sistema foi concebido e como cada processo foi implementado em cada setor da organização.

Um exemplo típico é o processo de admissão em alas emergenciais. Muitas vezes o paciente precisa ser atendido antes mesmo de ser identificado. Isso gera uma série de especificidades que precisam ser tratadas em uma análise qualitativa antes mesmo da implementação do processo de captura dos dados.

O outro exemplo muito comum é o cadastramento de recém nascidos. Cada caso é um caso. Em alguns sistemas os nomes são cadastrados com um prefixo “RN DE” seguido pelo nome da mãe. Isso porque os pais não sabem o nome dos bebês antes do parto e eles já precisam constar nos sistemas de prontuário eletrônico. Como todos os sistemas geralmente exigem o CPF, eles podem ser cadastrados com o mesmo CPF da mãe. É claro que este é só um exemplo de uma situação pontual, mas cada caso deve ser estudado e endereçado da forma mais adequada possível.

Além das especificidades de processo, há as que são de armazenamento dos dados. Documentos como CPF, RG e carteirinhas de seguro são armazenados com pontos e traços em alguns sistemas. Em outros são armazenados sem. O mesmo ocorre com datas. Nomes geralmente são armazenados em um único campo, uns com caixa baixa, outros com alta. Alguns são abreviados pela limitação de caracteres.

Endereços são os vilões na normalização. Os sistemas mais modernos são baseados no CEP, outros não. Os que não são sofrem muitas abreviações devidos aos sufixos, títulos ou até mesmo pela limitação dos caracteres.

Enfim, mesmo que em instituições mais modernas tecnologicamente, há sempre os sistemas legados. Estes também são incorporados ao processo de MPI porque trazem informações históricas valiosas para todo o processo assistencial.

Culturalmente e diferentemente dos sistemas norte americanos, os sistemas brasileiros possuem um único campo para capturar os nomes. Para melhorar a eficácia do processo de vinculação é importante que os sistemas tenham a capacidade de separar os nomes, considerando também os primeiros nomes compostos.

Outra capacidade não menos importante é a capacidade de trabalhar com as abreviações nos endereços. Isto requer um dicionário específico de abreviações para o nosso país.

3 - Indexação ou formação dos pares de comparação

Nesta etapa é que se decide quais serão os cadastros que serão comparados entre si, formando assim os chamados pares de comparação.

A decisão de se comparar registros não se baseia apenas nos documentos do paciente, assim como o CPF. Isso acontece porque há casos que não se tem o CPF do paciente ou casos que os filhos recebem o CPF dos pais. Para isto é necessário que o processo utilize os dados probabilísticos, assim como o nome, a data de nascimento, o sexo, os dados de contato e o endereço.

É preciso que este processo tenha algoritmos sofisticados para que os sistemas não gerem um número excessivo de comparações indevidas, assim como não deixem de fora comparações necessárias.

Por exemplo: A comparação de todos os “Josés” com todos os outros “Josés” não seria tão eficaz, pois poderia acarretar numa sobrecarga de processamento.

Outro ponto não menos importante nesta fase é a capacidade de se trabalhar com algoritmos fonéticos para o mercado brasileiro, que são completamente diferentes dos algoritmos americanos.

Isso significa que nomes escritos de maneiras diferentes ou equivocadas também serão considerados no processo. Exemplo: Dois cadastros de um determinado paciente com os nomes Walter Xavier e Valter Chavier podem se referir ao mesmo indivíduo.

O Healthshare MPI utiliza um processo extremamente eficiente de análise combinatória que evita este tipo de problema, utilizando tanto informações demográficas determinísticas quanto probabilísticas.

4 - Pontuação dos pares

Para cada par de comparação gerado, todas as variáveis demográficas são pontuadas separadamente: Primeiros nomes, nomes do meio, sobrenomes, documentos, sexo, cep, telefones, e-mails e endereços.

Antes de iniciar a comparação, é determinado um peso com uma pontuação máxima e mínima para cada variável, considerando a singularidade de cada uma. Por exemplo, o sexo possui um peso menor que a data de nascimento, que possui peso menor que o nome, que possui um peso menor que o CPF. E assim por diante.

Cada variável possui um algoritmo específico não binário de comparação que vai atribuir uma pontuação entre a mínima e a máxima para cada variável demográfica.

Exemplo: Se o sexo for o mesmo, serão atribuídos 2 pontos. Se não for o mesmo será atribuída a pontuação mínima, -4 pontos. Se o CPF for o mesmo, serão atribuídos 14 pontos,

Primeiros nomes e sobrenomes comuns também recebem pontuações menores que nomes mais comuns, assim como Silva e Souza.

Nomes de casada e solteira também devem ser considerados aqui no Brasil.

5 - Avaliação e determinação do identificador unívoco dos pares

Antes desta etapa, é necessário configurar as faixas de pontuação ou limiares que serão utilizados para vincular (mesmo indivíduo) ou não vincular (indivíduos diferentes) os pares de cadastro.

Neste ponto, pode-se definir também a faixa de pontuação dos pares que irão para uma lista de trabalho, passíveis de uma avaliação ou revisão humana.

Limiares a serem configurados:

Vínculo Automático – Acima de quantos pontos os pares serão automaticamente vinculados. Exemplo: Se o total de pontos dos pares estiver acima de 35 os mesmos serão automaticamente vinculados e não necessitarão de revisão humana.

Vínculo com posterior avaliação na Lista de Trabalho – Entre quantos pontos os pares irão para a lista de trabalho como vinculados (mesmos indivíduos) para avaliação humana. Exemplo: Os pares entre 30 e 35 pontos serão vinculados, mas poderão sofrer revisão de um profissional ou equipe designados para esta tarefa.

Não vínculo – Abaixo de quantos pontos os pares não serão vinculados. Exemplo: Se o total de pontos dos pares for abaixo de 30 eles não serão vinculados (indivíduos diferentes).

Não vínculo com revisão posterior na Lista de Trabalho – Entre quantos pontos os pares irão para a lista de trabalho como não vinculado (indivíduos diferentes) para uma revisão humana. Exemplo: Os pares entre 25 e 30 pontos não serão vinculados, mas poderão sofrer revisão de um profissional ou equipe designados para esta tarefa.

Há várias situações de exceções, onde mesmo pares com pontuação elevada podem não se referir ao mesmo indivíduo. Um exemplo típico são os gêmeos, que moram na mesma residência. Para isso é necessário que o produto disponibilize de artifícios para identificar estes casos.

Há outras situações que pares com baixa pontuação podem sofrer revisões se determinadas situações ocorrerem. Exemplo: pares com o mesmo CPF e data de nascimento e baixa pontuação. Este caso é no mínimo curioso, pois pode apontar um problema na baixa qualidade dos dados.

No HealthShare Patient Index, estes dispositivos são chamados de regras de vinculação (rules), que prevalecem sobre a regra de pontuação.

O produto já possui nativamente uma série de regras de exceção e elas são fundamentais para a segurança e confiabilidade de todo o processo.

Após esta etapa, todos os cadastros recebem um identificador universal denominado MPIID - Master Patient Index Identification. Os cadastros que possuírem o mesmo MPIID são referentes ao mesmo indivíduo.

6 – Serviços e API’s

Concluindo todo o processo de vinculação (Matching), é essencial que a plataforma ofereça maneiras passivas ou ativas de se comunicarem ou interoperarem com os sistemas de origem ou outros sistemas. Neste momento entram novamente todos os requisitos de interoperabilidade do produto, que já estão presentes na plataforma HealthShare da Intersystems.

As API’s de consumo do MPI são disponibilizadas neste momento através de protocolos conhecidos (HTTP Soap ou Rest) para que sistemas consigam obter as informações desejadas para diversos casos de uso.

Estes são alguns exemplos comuns de consumo de API’s do HealthShare MPI:

• Obter identificadores de outros sistemas partindo do identificador do sistema consumidor. Este tipo de consulta é denominada pelo IHE como PIX. Exemplo: Antes de enviar a prescrição para o laboratório o sistema de origem envia o seu identificador do cadastro e recebe uma resposta da API com o número do identificador do mesmo paciente no laboratório.

• Realizar pesquisas probabilísticas por dados demográficos. Exemplo: Consultar se existem cadastros demográficos para o paciente de nome Claudio Devecchi Junior. Este tipo de consulta é denominada pelo IHE como PDQ).

• Obter o melhor dado demográfico (Golden Record ou Composite Record) de um determinado paciente para enriquecer os cadastros demográficos ou para aproveitar os seus dados no momento de um determinado cadastro.

Existem também mecanismos ativos, onde o MPI se comunica com os sistemas para enviar informações úteis. Estes mecanismos também podem ser acionados de forma passiva através da chamada das Api’s.

Alguns exemplos são:

• No momento que um cadastro está sendo incluído ou atualizado o MPI pode fazer uma chamada retornando o identificador universal - MPIID. Desta forma o sistema de origem sempre ficará atualizado com este identificador. Quaisquer mudanças nas Listas de Trabalho são gatilhos para este tipo de chamada (callback)

• Quando algum cadastro for incluído e o MPI identificar que já existe esta mesma pessoa no mesmo sistema de origem, já é possível enviar uma notificação de duplicidade. Para os casos de resolução das duplicidades, é importante que exista um serviço específico para receber as mensagens de fusão de pacientes (PIX merge).

Conclusão

Todo o processo descrito anteriormente demonstra um pouco de como o produto HealthShare Patient Index trata dos desafios na área com relação aos cadastros e identificação dos pacientes e como é importante tratar das especificidades não somente do país, mas de organização para organização.

No próximo artigo, falaremos um pouco de como funciona o Healthshare Unified Care Record (UCR) e de como ele é fundamental para ajudar as instituições na abordagem holística do cuidado contínuo, da prevenção e da experiência centrada no paciente.

0
0 145
Artigo Lorenzo Scalese · Fev. 1, 2021 8m read

Olá comunidade,

  O OpenAPI-Client Gen acaba de ser lançado, este é um aplicativo para criar um cliente de produção de interoperabilidade IRIS a partir da especificação Swagger 2.0.

  Em vez da ferramenta existente ^%REST que cria um aplicativo REST do lado do servidor, o OpenAPI-Client Gen cria um modelo de cliente de produção de interoperabilidade REST completo.

Instalação por ZPM:

zpm "install openapi-client-gen"

  Como gerar produção a partir de um documento Swagger?   É muito simples.

Abra um terminal e execute:

Set sc = ##class(dc.openapi.client.Spec).generateApp(<applicationName>, <Your Swagger 2.0 document>>)

  O primeiro argumento é o pacote de destino onde as classes de produção serão geradas. Ele deve ser um nome de pacote válido e não existente.
O segundo, é o documento Swagger. Estes valores são aceitos:
  1) File path.
2) %DynamicObject.
3) URL.
  A especificação deve estar no formato JSON.
  Se sua especificação usa o formato YAML, ela pode ser facilmente convertida em JSON com ferramentas on-line como onlineyamltools.com
  Exemplo:

Set sc = ##class(dc.openapi.client.Spec).generateApp("petshop", "https://petstore.swagger.io:443/v2/swagger.json")
Write "Status : ", $SYSTEM.Status.GetOneErrorText(sc)

  Dê uma olhada no código gerado, podemos ver muitas classes, divididas em muitos subpacotes:  

  • Business Services: petshop.bs
  • Business Operations: petshop.bo
  • Business Processes: petshop.bp
  • Aplicação REST Proxy: petshop.rest
  • Ens.Request e Ens.Response: petshop.msg
  • Objeto de entrada ou saída analisado: petshop.model.Definition
  • Classe de configuração de produção: petshop.Production    

Classe de operação de negócios

Para cada serviço definido no documento Swagger, existe um método relacionado denominado por <VERB><ServiceId>.

Aprofunde-se em um simples método gerado GETgetPetById  

/// Retorna um único animal de estimação
Method GETgetPetById(pRequest As petshop.msg.getPetByIdRequest, pResponse As petshop.msg.GenericResponse) As %Status
{
    Set sc = $$$OK, pURL = "/v2/pet/{petId}"
    Set pHttpRequestIn = ..GetRequest(pRequest)
    Set pHttpRequestIn.ContentType = pRequest.consume
    Set pURL = $Replace(pURL, "{petId}", pRequest.pathpetId)
    $$$QuitOnError(..Adapter.SendFormDataArray(.pHttpResponse, "get", pHttpRequestIn , , , pURL))
    Set pResponse = ##class(petshop.msg.GenericResponse).%New()
    Set sc = ..genericProcessResponse(pRequest, pResponse, "GETgetPetById", sc, $Get(pHttpResponse),"petshop.msg.getPetByIdResponse")
    Return sc
}

 

  • Em primeiro lugar, o objeto %Net.HttpRequest é sempre criado pelo método GetRequest, fique à vontade para editar e adicionar alguns cabeçalhos, se necessário.
  • Em segundo lugar, o objeto HttpRequest é preenchido usando pRequest `petshop.msg.getPetByIdRequest' (Ens.Request subclass).
  • Em terceiro lugar, EnsLib.HTTP.OutboundAdapter é usado para enviar solicitação http.
  • E, finalmente, há um processamento de resposta genérico pelo método genericProcessResponse:
Method genericProcessResponse(pRequest As Ens.Request, pResponse As petshop.msg.GenericResponse, caller As %String, status As %Status, pHttpResponse As %Net.HttpResponse, parsedResponseClassName As %String) As %Status
{
    Set sc = $$$OK
    Set pResponse.operation = caller
    Set pResponse.operationStatusText = $SYSTEM.Status.GetOneErrorText(status)
    If $Isobject(pHttpResponse) {
        Set pResponse.httpStatusCode = pHttpResponse.StatusCode
        Do pResponse.body.CopyFrom(pHttpResponse.Data)
        Set key = ""
        For  {
            Set key = $Order(pHttpResponse.Headers(key),1 , headerValue)
            Quit:key=""
            Do pResponse.headers.SetAt(headerValue, key)
        }
        Set sc = ##class(petshop.Utils).processParsedResponse(pHttpResponse, parsedResponseClassName, caller, pRequest, pResponse)
    }
    Return sc
}

  Então, podemos analisar um método um pouco mais complexo POSTuploadFile

Method POSTuploadFile(pRequest As petshop.msg.uploadFileRequest, pResponse As petshop.msg.GenericResponse) As %Status
{
    Set sc = $$$OK, pURL = "/v2/pet/{petId}/uploadImage"
    Set pHttpRequestIn = ..GetRequest(pRequest)
    Set pHttpRequestIn.ContentType = pRequest.consume
    Set pURL = $Replace(pURL, "{petId}", pRequest.pathpetId)
    If pHttpRequestIn.ContentType = "multipart/form-data" {
        Set valueStream = ##class(%Stream.GlobalBinary).%New()
        Do:$Isobject(pRequest.formDataadditionalMetadata) valueStream.CopyFrom(pRequest.formDataadditionalMetadata)
        Do:'$Isobject(pRequest.formDataadditionalMetadata) valueStream.Write($Zcvt(pRequest.formDataadditionalMetadata,"I","UTF8"))
        Set:'$ISOBJECT($Get(mParts)) mParts = ##class(%Net.MIMEPart).%New()
        Set mimePart = ##class(%Net.MIMEPart).%New(valueStream)
        Do mimePart.SetHeader("Content-Disposition", "form-data; name=""additionalMetadata""; filename=""additionalMetadata""")
        Do mParts.Parts.Insert(mimePart)
    } Else { 
        Do pHttpRequestIn.InsertFormData("additionalMetadata", pRequest.formDataadditionalMetadata)
    }
    If pHttpRequestIn.ContentType = "multipart/form-data" {
        Set valueStream = ##class(%Stream.GlobalBinary).%New()
        Do:$Isobject(pRequest.formDatafile) valueStream.CopyFrom(pRequest.formDatafile)
        Do:'$Isobject(pRequest.formDatafile) valueStream.Write($Zcvt(pRequest.formDatafile,"I","UTF8"))
        Set:'$ISOBJECT($Get(mParts)) mParts = ##class(%Net.MIMEPart).%New()
        Set mimePart = ##class(%Net.MIMEPart).%New(valueStream)
        Do mimePart.SetHeader("Content-Disposition", "form-data; name=""file""; filename=""file""")
        Do mParts.Parts.Insert(mimePart)
    } Else { 
        Do pHttpRequestIn.InsertFormData("file", pRequest.formDatafile)
    }
    If $ISOBJECT($Get(mParts)) {
        Set mimeWriter = ##class(%Net.MIMEWriter).%New()
        Do mimeWriter.OutputToStream(.stream)
        Do mimeWriter.WriteMIMEBody(mParts)
        Set pHttpRequestIn.EntityBody = stream
        Set pHttpRequestIn.ContentType = "multipart/form-data; boundary=" _ mParts.Boundary
    }
    $$$QuitOnError(..Adapter.SendFormDataArray(.pHttpResponse, "post", pHttpRequestIn , , , pURL))
    Set pResponse = ##class(petshop.msg.GenericResponse).%New()
    Set sc = ..genericProcessResponse(pRequest, pResponse, "POSTuploadFile", sc, $Get(pHttpResponse),"petshop.msg.uploadFileResponse")
    Return sc
}

  Como você pode ver, é exatamente a mesma lógica: GetRequest, preenchendo %Net.HttpRequest, enviar solicitação, processamento de resposta genérica.
 

Classe Proxy REST

Uma aplicação proxy REST também é gerada.
Esta classe REST usa um Projection para criar automaticamente a aplicação web relacionada (ex: "/petshoprest", consulte petshop.rest.REST e petshop.rest.Projection).   Este proxy REST cria a mensagem Ens.Request e envia-a para o Business.Process.

Class petshop.rest.REST Extends %CSP.REST [ ProcedureBlock ]
{

Projection WebApp As petshop.rest.Projection;

...

ClassMethod POSTaddPet() As %Status
{
    Set ensRequest = ##class(petshop.msg.addPetRequest).%New()
    Set ensRequest.consume = %request.ContentType
    Set ensRequest.accept = $Get(%request.CgiEnvs("HTTP_ACCEPT"),"*/*")
    Set ensRequest.bodybody = ##class(petshop.model.Definition.Pet).%New()
    Do ensRequest.bodybody.%JSONImport(%request.Content)
    Return ##class(petshop.Utils).invokeHostAsync("petshop.bp.Process", ensRequest, "petshop.bs.ProxyService")
}

ClassMethod GETgetPetById(petId As %String) As %Status
{
    Set ensRequest = ##class(petshop.msg.getPetByIdRequest).%New()
    Set ensRequest.consume = %request.ContentType
    Set ensRequest.accept = $Get(%request.CgiEnvs("HTTP_ACCEPT"),"*/*")
    Set ensRequest.pathpetId = petId
    Return ##class(petshop.Utils).invokeHostAsync("petshop.bp.Process", ensRequest, "petshop.bs.ProxyService")
}
...
ClassMethod POSTuploadFile(petId As %String) As %Status
{
    Set ensRequest = ##class(petshop.msg.uploadFileRequest).%New()
    Set ensRequest.consume = %request.ContentType
    Set ensRequest.accept = $Get(%request.CgiEnvs("HTTP_ACCEPT"),"*/*")
    Set ensRequest.pathpetId = petId
    Set ensRequest.formDataadditionalMetadata = $Get(%request.Data("additionalMetadata",1))
    set mime = %request.GetMimeData("file")
    Do:$Isobject(mime) ensRequest.formDatafile.CopyFrom(mime)
    Return ##class(petshop.Utils).invokeHostAsync("petshop.bp.Process", ensRequest, "petshop.bs.ProxyService")
}
...
}

  Então, vamos testar a produção com este proxy REST.  

Abra e inicie o petshop.Production

Crie um animal de estimação

  Altere o número da porta, se necessário:

curl --location --request POST 'http://localhost:52795/petshoprest/pet' \
--header 'Content-Type: application/json' \
--data-raw '{
  "category": {
    "id": 0,
    "name": "string"
  },
  "id" : 456789,
  "name": "Kitty_Galore",
  "photoUrls": [
    "string"
  ],
  "tags": [
    {
      "id": 0,
      "name": "string"
    }
  ],
  "status": "available"
}'

  A produção é executada no modo assíncrono, portanto, a aplicação proxy restante não espera pela resposta. Este comportamento pode ser editado, mas normalmente, a produção de interoperabilidade usa o modo assíncrono.   Veja o resultado no visualizador de mensagens e no traço visual

EDIÇÃO: desde a versão 1.1.0, a aplicação Proxy Rest funciona em modo de sincronização

  Se tudo estiver bem, podemos observar um código http de status 200. Como você pode ver, recebemos uma resposta do corpo e ela não está analisada.

O que isso significa?
Isso ocorre quando resposta da aplicação/json ou a resposta 200 da especificação Swagger não é preenchida.
Nesse caso, a resposta 200 não está preenchida.  

Obtenha uma animal de estimação

  Agora, tente obter o animal de estimação criado:

curl --location --request GET 'http://localhost:52795/petshoprest/pet/456789'

  Verifique o traço visual:

  Desta vez, esta é uma resposta da aplicação/json (a resposta 200 está completa nas especificações Swagger). Podemos ver um objeto de resposta analisado.   ### API REST - Gerar e baixar

Além disso, essa ferramenta pode ser hospedada em um servidor para permitir que os usuários gerem e baixem o código.   Uma API REST e um formulário básico estão disponíveis:  

Nesse caso, o código é simplesmente gerado sem compilar, exportado e, em seguida, tudo é excluído.
Este recurso pode ser útil para centralização de ferramentas.
  Veja o README.md para informações atualizadas.     Obrigado pela leitura.  

0
0 235
Anúncio Tatiana Krupenya · Dez. 2, 2020

É um prazer anunciar que o DBeaver suporta a plataforma de dados InterSystems IRIS nativamente desde a versão 7.2.4. Você não precisa realizar uma configuração manual mais, basta identificar o ícone do IRIS na lista de conexões. 

<--break->Todos os campos necessários já vem preenchidos mas, não se esqueça de colocar seu usuário e senha !!!!

0
0 405
Anúncio Rochael Ribeiro · Dez. 1, 2020

Em um mundo onde a pandemia da #COVID19 transformou as videoconferências em modelos essenciais, bagunçar projetos ficou ainda mais fácil. Mas eis que alto surge para desafiar essa bagunça. Conheça o No Project Mess by IRIS, neste divertido vídeo produzido por Henrique Gonçalves Diaspara nosso canal da Comunidade de Desenvolvedores em Português. https://lnkd.in/dTrcCUv

0
0 110
Artigo Henrique Dias · Nov. 25, 2020 4m read

Fala galera! Tudo bem?

Quando @Evgeny Shvarov anunciou o primeiro InterSystems IRIS Programming Contest, Comecei a pensar em algumas ideias. 

Coloquei tudo junto nesse aplicativo e o isc-utils é sobre isso:

  •  Conversões
    • Temperatura
    • Distância
  • Câmbio de Moedas
  • Clima

Conversão de Escala de Temperatura

0
0 102