Limpar filtro
Anúncio
Angelo Bruno Braga · Maio 2, 2022
A InterSystems está grata em anunciar o lançamento da versão 1.1 do System Alerting & Monitoring (SAM) version 1.1.
O que é o SAM?
O SAM adiciona à API de Monitoramento baseada em padrões e ao Monitor de Log ferramentas padrão de mercado como o Grafana e o Prometheus para criar uma solução básica de monitoramento e geração de alertas para clusters IRIS.
Para mai informações sobre o SAM, veja o Guia de Monitoramento e Alerta do Sistema.
O que tem de novo no SAM 1.1?
Você notará melhorias de performance para os gráficos dos painéis do Grafana, especialmente quando trabalhando com conjuntos de dados grandes. Se você estiver atualizando a partir do SAM 1.0, você deverá verificar se possui espaço em disco suficiente pois o SAM 1.1 adiciona índices adicionais aos dados.
Veja as notas de lançamento para maiores informações em como atualizar para o SAM 1.1.
Tela inicial do SAM
Página de Detalhes da Instância
Artigo
Larissa Prussak · Maio 23
Apresento o FHIRCraft, uma ferramenta leve para gerar recursos FHIR sintéticos.
Talvez vocês estejam pensando:“Mas... já não existe o Synthea, que gera um monte de recursos FHIR?”Exatamente — e foi justamente por isso que criei este aplicativo.
O FHIRCraft foi desenvolvido para gerar recursos FHIR mais simples, pequenos e focados. Diferente do Synthea, ele não pretende simular prontuários clínicos completos nem fluxos assistenciais. É pensado para quem está começando com FHIR, quer fazer testes de forma progressiva ou explorar como funciona um recurso específico de forma isolada.
Na sua versão atual, o FHIRCraft pode gerar:
Patient
Practitioner
Appointment
Observation
E graças ao seu design modular, é muito fácil expandi-lo para suportar novos tipos de recursos.
Experimentem e me contem o que acharam! 🚀
P.S. Este aplicativo foi desenvolvido como parte do concurso InterSystems FHIR and Digital Health Interoperability Contest.
Artigo
· Mar. 22, 2021
Bom dia, desenvolvedores!
O projeto "apptools-admin" não é apenas um conjunto de ferramentas para o administrador, mas uma plataforma para a criação rápida de um protótipo de qualquer solução.Por exemplo, álbum de fotos, reprodutor de música e biblioteca pessoal, todos juntos em um design de baú de tesouro amigável.
Carregue http: // seu-host: sua-porta / apptoolsrest / a / infochest
Mude o caminho para seus arquivos de tesouro e comece a ver, ouvir ou ler de qualquer dispositivo conveniente: desktop, tablet ou smartphone.
O exemplo estará localizado em $ {CSPdir} / apptools / files
Depois de salvar e atualizar o painel, você pode selecionar uma faixa de música.
O player HTML5 embutido é usado para tocar música.
O componente Lightbox é usado para visualizar fotos e vídeos: UiKit.
Todo o código "baú" está localizado na classe apptools.lte.infochest e pode ser facilmente modificado para atender às suas necessidades.Vote neste projeto apptools-admin.
Boa codificação!
Verifique o aplicativo relacionado no InterSystems Open Exchange
Artigo
Fernando Ferreira · Mar. 18, 2022
Olá comunidade! Nesta parte do artigo temos um cenário onde o nosso ambiente InterSystems Caché/Ensemble possui um ou mais servidores com Shadow e/ou Mirror.
Como comentado no início do artigo, componentes de um software possuem uma evolução natural e outros componentes são deprecados. E uma tecnologia muito utilizada pelos nossos clientes que está deprecada no InterSystems IRIS é o Shadow (esta informação está na página 18 do documento InterSystems IRIS Adoption Guide que volto a recomendar que você faça o download no WRC).
Como o Shadow é um componente deprecado, o cenário que vamos utilizar no artigo é um ambiente com dois servidores em Shadow.
Como primeiro passo, precisamos olhar para os pré-requisitos do nosso ambiente, já comentado na parte 01 do artigo.
Vamos utilizar como exemplo dois servidores Ensemble 2018.1.4 com Shadow rodando em um servidor Red Hat 8.0 e vamos executar a migração no mesmo hardware por estes atenderem os pré-requisitos (o ambiente teste que estou utilizando são duas EC2-t2.medium na AWS).
Não vou tratar neste artigo diferenças do Shadow X Mirror e os detalhes da configuração de ambos, vou deixar aqui alguns links importante sobre o assunto:
Artigo da comunidade internacional: https://community.intersystems.com/post/cach%C3%A9-mirroring-101-brief-guide-and-faq
Convertendo um Shadow para um servidor Mirror: https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GHA_mirror#GHA_mirror_set_bp_shadow
Guia de alta disponibilidade do InterSystems IRS: https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GHA
Uma dica essencial para o processo:
Como, durante este processo de migração, vamos migrar primeiro o servidor secundário do FailOver e depois o primário, ou seja, durante o processo de migração o seu ambiente terá um servidor Caché como primário e um IRIS como secundário. Para que isso seja possível, lembre-se de olhar os pré-requisitos e a matriz de compatibilidade que se encontra no InterSystems IRIS Migration Guide (lembrando que é possível fazer o download via WRC) e ter certeza que os bancos que se encontram no Shadow/Mirror são bancos somente de Globais, pois não existe compatibilidade entre Caché/Ensemble e IRIS nos bancos de rotinas!
Abaixo um exemplo da lista de compatibilidades, existente na documentação oficial:
Então vamos colocar a mão na massa e com a dica mais importante para todo o processo:
Execute todo o processo de migração em ambiente de testes primeiro, valide sua aplicação e BACKUP, BACKUP e BACKUP...... e não esqueça de testar o RESTORE do ambiente!!
Obs: Caso o seu ambiente já possua Mirror, ignorar a etapa 1 do processo abaixo, seguir os passos a partir da etapa 2.
1 - A primeira etapa da migração é migrar os nossos servidores Shadow para Mirror.
Observar os
Shadow Origem:
Shadow Destino:
1.1 O processo de migração se inicia criando o ambiente de Mirror e adicionando o Shadow Origem com membro primário: Criando um Mirror.
Exemplo de configuração do Mirror:
1.2 Agora como próximo passo adicione o Shadow destino como membro do Mirror (Backup failover Member)
Exemplo do servidor secundário como Backup FailOver:
1.3 Adicione os bancos que estão configurados como “Shadowed databases” no servidor primário do Mirror. Adicionando um banco existente no Mirror.
Exemplo com o banco adicionado:
1.4 - Agora precisamos sincronizar o banco de dados no servidor membro, existem duas formas:
Utilizando o backup e restore
Utilizando o utilitário: ConvertShadowDatabases^MIRROR, de acordo com o procedimento em: Convertendo um servidor Shadow para Mirror. Pronto, agora que finalizamos a migração de Shadow para Mirror, podemos migrar nosso ambiente para InterSystems IRIS.
2 - Todos os passos nesta etapa 2 são feitas no servidor secundário membro backup do Failover.
Na documentação oficial: How to migrate to InterSystems IRIS existe uma um capítulo tratando com detalhes esta etapa que vou passar dicas aqui, ela se chama: Mirrored Environment Migration Checklist. (Sempre lembrando que a documentação está disponível no WRC)
2.1 – O primeiro passo é parar o Failover automático no servidor de membro de backup, clicando em Set No Failover:
O novo status do servidor ficará da seguinte maneira: Clear no Failover
2.2 - Caso o ambiente seja Ensemble, lembre-se que é necessário desligar o Auto-Start da produção, este procedimento encontra-se na parte 02 deste artigo.
2.3 - Se o seu ambiente utiliza o mapeamento %ALL, você precisa deletar este mapeamento, caso contrário durante o processo de migração o processo vai falhar e o ambiente ficará em um estado que não é possível a recuperação.
2.4 Agora vamos desligar o servidor secundário membro do ambiente Failover, e verificar o log para confirmar que não existe nenhum problema no ambiente.
2.5 - Como próximo passo é necessário parar e desativar o ISCAgent no servidor secundário membro do ambiente FailOver.
2.6 -Vamos rodar agora o script de instalação do InterSystems IRIS, atualizando o nosso ambiente corrente, lembrando que o instalador reconhecerá a instância de Caché/Ensemble, informando o nome da instância o instalador executará a atualização do ambiente.
2.7 - O alerta que é apresentando após a migração ocorre pois o ISCAgent está desativado. (Executado no passo 2.5).
Log:
O agente também foi atualizado durante o processo de instalação, como próximo passo precisamos reativar o ISCAgent.
2.8 - Após o ISCAgent estar ativo, precisamos validar se o servidor membro do backup FailOver está ativo.
2.9 - Como o servidor primário ficou ativo, precisamos ligar novamente o Mirror para que os bancos sincronizem, clique em Clear no Failover e verifique o monitor do Mirror e valide se todos os bancos sincronizaram:
3 - Agora esta etapa será realizada no servidor primário que está com Caché/Ensemble (neste momento o ambiente não pode ficar disponível para nenhum usuário). Uma dica importante, como no primeiro momento o processo está sendo feito em ambiente de teste, este é um bom momento para medir o tempo de downtime do ambiente a fim de colocar no planejamento da sua migração oficial.
3-1 - Caso o ambiente seja Ensemble, lembre-se que é necessário desligar o Auto-Start e parar a produção, este procedimento encontra-se na parte 02 deste artigo.
3.2 - Se seu ambiente utiliza o mapeamento %ALL, você precisa deletar este mapeamento. Caso contrário, durante o processo de migração o processo vai falhar e o ambiente ficará em um estado que não é possível a recuperação.
3.3 - Como próximo passo agora vamos desligar o servidor primário.
4 - Agora precisamos validar se o servidor secundário membro do Failover assumiu corretamente o posto, e se tornou primário:
É possível verificar no Monitor do Mirror que tudo está certo! 😊
4.1 – Se seu ambiente utiliza o mapeamento %ALL, agora chegou a hora de recriá-lo.
4.2 - Vamos agora compilar as aplicações (Classes, Rotinas e CSP), este procedimento está descrito parte 02 do artigo.
4.3 - Caso seu ambiente seja Ensemble chegou a hora de iniciar a produção.
4.4 -Para prevenir problemas durante a atualização do servidor Caché (que se encontra parado), vamos parametrizar para não ocorrer o Failover automático no servidor IRIS, clicando em Set No Failover.
O status que precisamos é que mude para Clear no Failover:
Podemos reparar no Monitor do Mirror o status Down do servidor.
5 - Esta etapa será realizada no servidor Caché que está desligado. (Antigo servidor primário membro do FailOver).
5.1 - É necessário parar e desativar o ISCAgent no antigo servidor primário membro do ambiente FailOver.
5.2 - Agora vamos rodar o script de instalação do InterSystems IRIS para atualizar o Caché/Ensemble. Lembrando que o instalador reconhecerá a instância do Caché/Ensemble atualmente instalada.
5.3 - Se seu ambiente utiliza o mapeamento %ALL, agora chegou a hora de recriá-lo.
5.4 - Próxima passo é iniciar o ISCAgent.
5.5 - Agora precisamos verificar se o servidor se tornou um membro do Failover, como backup:
5.6 - Caso o ambiente seja Ensemble, já é possível ligar o auto-start da Produção.
5.7 - Podemos ligar o Failover automático novamente, para sincronismo do banco de dados, clicando em Clear No FailOver:
O status mudará para e a sincronização dos bancos deve iniciar:
6 – A migração dos dois servidores foi finalizada, porém, como o procedimento se inicia pelo servidor secundário, o atual servidor secundário (antigo primário) ainda precisa da sua atenção, se faz necessário compilar a aplicação neste servidor e torná-lo principal novamente. Este procedimento também deixará o ambiente indisponível para os usuários.
6.1 – Caso seja Ensemble, parar a produção no servidor primário atual.
6.2 – Desligar o servidor com segurança.
6.3 – Verificar se o servidor se tornou primário:
6.4 – Agora se faz necessário compilar as aplicações (Classes, Rotinas e CSP), este procedimento está descrito parte 02 do artigo.
6.5 – Agora vamos ligar o servidor secundário e verificar o sincronismo dos bancos de dados.
Nossa migração foi finalizada com sucesso!
A próxima parte do artigo, vamos tratar de uma migração de um ambiente com ECP, até lá e obrigado!
Artigo
Larissa Prussak · Out. 21, 2021
Olá comunidade,
O InterSystems IRIS tem um bom conector para fazer Hadoop usando Spark. Mas o mercado oferece outra alternativa excelente para o acesso ao Big Data Hadoop, o Apache Hive. Veja as diferenças:
Fonte: https://dzone.com/articles/comparing-apache-hive-vs-spark
Eu criei um serviço de interoperabilidade PEX para permitir que você use o Apache Hive dentro de seus aplicativos IRIS da InterSystems. Para experimentar, siga estas etapas:
1. Faça um git clone para o projeto iris-hive-adapter:
$ git clone https://github.com/yurimarx/iris-hive-adapter.git
2. Abra o terminal neste diretório e execute:
$ docker-compose build
3. Execute o contêiner IRIS com seu projeto:
$ docker-compose up
4. Abra o Hive Production do projeto (para executar um exemplo de olá): http://localhost:52773/csp/irisapp/EnsPortal.ProductionConfig.zen?PRODUCTION=dc.irishiveadapter.HiveProduction
5. Clique em Iniciar para ir para a produção
6. Agora vamos testar o App!
7. Execute seu aplicativo REST Client (como Postman) as seguintes URLs e comando no corpo (usando o verbo POST):
7.1 Para criar uma nova tabela no Big Data POST http://localhost:9980/?Type=DDL. No CORPO: CREATE TABLE helloworld (message String)
7.2 Para inserir na tabela: POST http://localhost:9980/?Type=DDL. No CORPO: INSERT INTO helloworld VALUES ("hello")
7.3 Para obter a lista de resultados da tabela: POST http://localhost:9980/?Type=DML. No CORPO: SELECT * FROM helloworld (P.S.: Type is DML here)
Agora você tem 2 opções para usar Big Data no IRIS: Hive ou Spark. Aproveite!!
Anúncio
Angelo Bruno Braga · Mar. 31, 2022
Olá e sejam bem vindos aos Lançamentos da Comunidade de Março de 2022!
Fizemos algumas melhorias para aprimorar sua experiência recentemente na Comunidade InterSystems:
Novo mecanismo de busca da Comunidade
Estatísticas Gerais da Comunidade
Conexão com perfil do Facebook
Postagem nas atualizações da página: tags, bloco de autoria, destaques de rascunho
Vamos dar uma olhada nos detalhes abaixo.
Novo mecanismo de busca da Comunidade
Nós implementamos um novo mecanismo de busca na Comunidade. Existem duas opções de busca:
Busca Rápida
Busca Avançada
Com a Busca Rápida da Comunidade, você pode facilmente achar uma postagem/tag/usuário e ir diretamente para a página correspondente.
Não achou nada adequado nas opções propostas ?
Tente utilizar a Busca Avançada da Comunidade clicando no botão 🔍 :
Aqui você consegue facilmente adicionar parâmetros avançados a sua busca:
busca pelas postagens de um usuário específico
busca por uma tag(s) específica(s)
busca por um tipo de postagem específico ou apenas por suas postagens
Você também pode ordenar os resultados por período de tempo e relevância:
Estatísticas Gerais da Comunidade
Agora você pode ver a Comunidade de Desenvolvedores InterSystems em números:
Conexão com o perfil do Facebook
Adicione um link para o Facebook a seu perfil da Comunidade de Desenvolvedores para encontrar novos amigos e ficar próximos uns dos outros.
Vá para seu perfil de usuário da Comunidade de Desenvolvedores --> Editar --> Informações Adicionais --> Perfil do Facebook
Postagem nas atualizações da página: tags, bloco de autoria, destaques de rascunho
Você pediu - e nós fizemos! Agora as Tags da Comunidade de Desenvolvedores estão no corpo das postagens.
Além disto, na página da postagem, você pode ver agora as informações de contato do autor no bloco a direita:
Os rascunhos agora são destacados em azul:
Esperamos que gostem das atualizações!
Enviem suas requisições de melhorias e relatórios de bugs no DC GitHub, ou coloquem suas sugestões nos comentários desta postagem.
Fiquem atentos às novidades!
Artigo
Danusa Calixto · Jun. 23, 2022
A hora que muitos membros da Comunidade de Desenvolvedores, Parceiros da InterSystems e apenas pessoas interessadas nos produtos da InterSystems estavam esperando chegou! Finalmente, após uma pausa dolorosamente longa, o Global Summit deste ano é novamente realizado pessoalmente! Desta vez é em Seattle! Uma bela cidade com colinas íngremes, vistas deslumbrantes de Elliot Bay e, nas palavras dos moradores, clima constantemente ruim
De qualquer forma, para conhecer todo mundo pessoalmente, vale a pena sobreviver ao clima mal-humorado. No primeiro dia (20.06), todos estavam chegando, mas ninguém fez realmente alguma coisa de útil . As pessoas estavam fazendo check-in, circulando, tentando encontrar antigos amigos e conhecidos dos Global Summits anteriores, ou conversando online na Comunidade de Desenvolvedores.
Basicamente, todos estavam esperando por uma recepção de boas-vindas, mas eu decidi começar a preparar o estande do Developer Ecosystem mais cedo, para ter mais tempo no dia seguinte para dormir. Porque você sabe, jet lag. A diferença horária entre Seattle e minha casa é de 10 horas!
Assim, no final do dia (ou melhor, no início do entretenimento noturno), os panfletos estavam nas mesas, o monitor estava funcionando, e os prêmios e brindes estavam todos contabilizados e conferidos. E, em geral, eu estava pronta para cumprimentar as pessoas e responder suas perguntas sobre a Comunidade, o Open Exchange e o Global Masters.
Para quem não acompanha muito de perto os anúncios da DC, agora temos o Consurso de Artigos Tecnicos. Na próxima segunda-feira começa o novo Full Stack Contest. Juntamente com o Global Summit, um novo jogo de detetive foi lançado no Global Masters. Claro, todas essas informações estão disponíveis no estande. Então não hesite em vir me ver. É no Tech Exchange, 5º andar.
Além disso, para aqueles que vierem e conversarem comigo ou com uma das minhas pessoas de apoio emocional, também conhecidos como meus colegas membros da equipe da Comunidade de Desenvolvedores Francesa @Lorenzo Scalese e @Guillaume Rongier (porque eu sou o moderador da CD francesa, olá ), eu tenho presentes legais para dar de presente! E não esqueça que se você jogar o jogo, poderá resgatar seus prêmios diretamente no meu estande. E o melhor - haverá sorteio de mochila, Kindle e AirPods no último dia - veja mais informações no anúncio do Detective Game!
Como eu disse antes, na segunda-feira as pessoas estavam apenas se reunindo, descobrindo o layout do Global Summit e esperando pela Recepção de Boas-vindas. E foi um grande sucesso!
Nossa DJ arrasando!
Basicamente, foi isso para o dia preparatório!
E no dia seguinte a diversão realmente começou!
Após o café da manhã, as palestras começaram. Você pode encontrar os tópicos e os apresentadores no anúncio. Para encurtar a história, as palestras deste dia foram dedicadas ao HealthShare. E todos os palestrantes estavam de uma forma ou de outra ligados a essa linha de pensamento e a esse produto.
Don Woodlock, Head of Healthcare Solutions da InterSystems, estava liderando todas as palestras e painéis.
Terry Ragon, CEO da InterSystems, teve sua palavra de abertura.
Depois do almoço, os estandes começaram a funcionar e as pessoas começaram a fazer perguntas. O que é onde e o que é o quê. Foi muito bom falar na realidade, não apenas online.
Então, as pessoas simplesmente trocavam de lugar, faziam perguntas e gostavam da companhia umas das outras.
Funcionários, clientes e parceiros passeando e discutindo coisas.
E o culminar de tudo aconteceu no Museu de PopArt onde houve jantar, música ao vivo e as exposições
Esta é basicamente uma breve recapitulação do que aconteceu durante a primeira parte do Global Summit. Fique ligado para ler sobre a segunda parte do Global Summit!
Não hesite em compartilhar suas histórias sobre os dois primeiros dias nos comentários! O que você gostou? O que você não gostou? Qual foi o seu painel favorito? Conte-nos como foi!
Se você deseja ouvir painéis, poderá fazê-lo em breve. Eu acredito que pelo menos alguns deles serão compartilhados com todos.
Au revoir!
Artigo
Danusa Calixto · Jul. 11, 2022
O InterSystems IRIS tem um suporte excelente para operações de criptografia, descriptografia e hashing. Na classe %SYSTEM.Encryption (https://docs.intersystems.com/iris20212/csp/documatic/%25CSP.Documatic.cls?LIBRARY=%25SYS&PRIVATE=1&CLASSNAME=%25SYSTEM.Encryption), há métodos de classes para os principais algoritmos no mercado.
##
Algoritmos IRIS e tipos de criptografia/descriptografia
Como você pode ver, as operações são baseadas em chaves e incluem 3 opções:
* **Chaves simétricas**: as partes que executam as operações de criptografia e descriptografia compartilham a mesma chave secreta.
* **Chaves assimétricas**: as partes que conduzem as operações de criptografia e descriptografia compartilham a mesma chave secreta para a criptografia. No entanto, para a descriptografia, cada parceiro tem uma chave privada. Essa chave não pode ser compartilhada com outras pessoas, pois é uma prova de identidade.
* **Hash**: é usado quando você só precisa criptografar, e não descriptografar. É uma abordagem comum para o armazenamento das senhas dos usuários.
## Diferenças entre a criptografia simétrica e assimétrica
* A criptografia simétrica usa uma única chave, compartilhada entre as pessoas que precisam receber a mensagem, enquanto a criptografia assimétrica usa um par de chaves públicas e uma chave privada para criptografar e descriptografar as mensagens durante a comunicação.
* A criptografia simétrica é uma técnica antiga, enquanto a criptografia assimétrica é relativamente nova.
* A criptografia assimétrica foi criada para complementar o problema inerente da necessidade de compartilhar a chave em um modelo de criptografia simétrica, sem precisar compartilhar a chave usando um par de chaves pública-privada.
* A criptografia assimétrica leva mais tempo do que a criptografia simétrica.
< width="172">
Principais diferenças
Criptografia simétrica
Criptografia assimétrica
Tamanho do texto cifrado
Texto cifrado menor do que o arquivo de texto simples original.
Texto cifrado maior do que o arquivo de texto simples original.
Tamanho dos dados
Usada para transmitir dados grandes.
Usada para transmitir dados pequenos.
Uso de recursos
A criptografia simétrica de chaves funciona com baixo uso de recursos.
A criptografia assimétrica requer alto consumo de recursos.
Comprimento da chave
Tamanho de 128 ou 256-bit.
Tamanho de RSA 2048-bit ou superior.
Segurança
Menos segura devido ao uso de uma única chave para criptografia.
Muito mais segura já que duas chaves diferentes estão envolvidas na criptografia e descriptografia.
Número de chaves
A criptografia simétrica usa uma única chave para a criptografia e descriptografia.
A criptografia assimétrica usa duas chaves diferentes para a criptografia e descriptografia
Técnicas
É uma técnica antiga.
É uma técnica moderna.
Confidencialidade
Uma única chave para a criptografia e descriptografia tem o risco de ser comprometida.
Duas chaves são criadas separadamente para a criptografia e descriptografia, o que elimina a necessidade de compartilhar uma chave.
Velocidade
A criptografia simétrica é uma técnica rápida.
A criptografia assimétrica é mais lenta em termos de velocidade.
Algoritmos
RC4, AES, DES, 3DES e QUAD.
RSA, Diffie-Hellman e ECC.
Fonte: https://www.ssl2buy.com/wiki/symmetric-vs-asymmetric-encryption-what-are-differences
## Usando a classe %SYSTEM.Encryption para criptografia, descriptografia e hash
Para treinar o suporte do IRIS para as operações de criptografia, descriptografia e hash, acesse https://github.com/yurimarx/cryptography-sample e siga estas etapas:
1. Use o git pull ou clone o repositório em qualquer diretório local
$ git clone https://github.com/yurimarx/cryptography-samples.git
2. Abra um terminal Docker nesse diretório e execute:
$ docker-compose build
3. Execute o contêiner IRIS:
$ docker-compose up -d
4. Abra o terminal IRIS:
$ docker-compose exec iris iris session iris -U IRISAPP
IRISAPP>
5. Para a criptografia assimétrica com RSA, execute:
IRISAPP>Set ciphertext = ##class(dc.cryptosamples.Samples).DoRSAEncrypt("InterSystems")
IRISAPP>Write ciphertext
Ms/eR7pPmE39KBJu75EOYIxpFEd7qqoji61EfahJE1r9mGZX1NYuw5i2cPS5YwE3Aw6vPAeiEKXF
rYW++WtzMeRIRdCMbLG9PrCHD3iQHfZobBnuzx/JMXVc6a4TssbY9gk7qJ5BmlqRTU8zNJiiVmd8
pCFpJgwKzKkNrIgaQn48EgnwblmVkxSFnF2jwXpBt/naNudBguFUBthef2wfULl4uY00aZzHHNxA
bi15mzTdlSJu1vRtCQaEahng9ug7BZ6dyWCHOv74O/L5NEHI+jU+kHQeF2DJneE2yWNESzqhSECa
ZbRjjxNxiRn/HVAKyZdAjkGQVKUkyG8vjnc3Jw==
6. Para a descriptografia assimétrica com RSA, execute:
IRISAPP>Set plaintext = ##class(dc.cryptosamples.Samples).DoRSADecrypt(ciphertext)
IRISAPP>Write plaintext
InterSystems
7. Para a criptografia simétrica com AES CBC, execute:
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCEncrypt("InterSystems")
8sGVUikDZaJF+Z9UljFVAA==
8. Para a descriptografia simétrica com AES CBC, execute:
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCDecrypt("8sGVUikDZaJF+Z9UljFVAA==")
InterSystems
9. Para uma abordagem antiga com hash MD5, execute:
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoHash("InterSystems")
rOs6HXfrnbEY5+JBdUJ8hw==
10. Para uma abordagem recomendada com hash SHA, execute:
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoSHAHash("InterSystems")
+X0hDlyoViPlWOm/825KvN3rRKB5cTU5EQTDLvPWM+E=
11. Para sair do terminal:
Digite HALT ou H (não diferencia maiúsculas de minúsculas)
##
## Sobre o código-fonte
### 1. Sobre a chave simétrica
# para usar com criptografia/descriptografia simétrica
ENV SECRETKEY=InterSystemsIRIS
No Dockerfile, foi criada uma chave do ambiente para ser usada como chave secreta em operações simétricas.
### 2. Sobre a chave assimétrica
# para usar com criptografia/descriptografia assimétrica, execute openssl req -new -x509 -sha256 -config example-com.conf -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
No Dockerfile, foram geradas uma chave privada e uma chave pública para serem usadas com operações assimétricas.
### 3. Criptografia simétrica
// Amostra de chaves simétricas para criptografia
ClassMethod DoAESCBCEncrypt(plaintext As %String) As %Status
{
// converter para utf-8
Set text=$ZCONVERT(plaintext,"O","UTF8")
// definir uma chave secreta
Set secretkey = $system.Util.GetEnviron("SECRETKEY")
Set IV = $system.Util.GetEnviron("SECRETKEY")
// criptografar um texto
Set text = $SYSTEM.Encryption.AESCBCEncrypt(text, secretkey, IV)
Set ciphertext = $SYSTEM.Encryption.Base64Encode(text)
Write ciphertext
}
A operação AES CBC Encrypt foi usada para criptografar textos.
A codificação base64 retorna os resultados como um texto organizado/legível para o usuário.
### 4. Descriptografia simétrica
// Amostra de chaves simétricas para descriptografia
ClassMethod DoAESCBCDecrypt(ciphertext As %String) As %Status
{
// definir uma chave secreta
Set secretkey = $system.Util.GetEnviron("SECRETKEY")
Set IV = $system.Util.GetEnviron("SECRETKEY")
// descriptografar um texto
Set text=$SYSTEM.Encryption.Base64Decode(ciphertext)
Set text=$SYSTEM.Encryption.AESCBCDecrypt(text,secretkey,IV)
Set plaintext=$ZCONVERT(text,"I","UTF8")
Write plaintext
}
A operação AES CBC Decrypt foi usada para descriptografar textos.
A decodificação base64 retorna o texto criptografado a um binário, para ser usado na descriptografia.
**5. Criptografia assimétrica**
// Amostra de chaves assimétricas para criptografia
ClassMethod DoRSAEncrypt(plaintext As %String) As %Status
{
// obter certificado público
Set pubKeyFileName = "/opt/irisbuild/example-com.cert.pem"
Set objCharFile = ##class(%Stream.FileCharacter).%New()
Set objCharFile.Filename = pubKeyFileName
Set pubKey = objCharFile.Read()
// criptografar usando RSA
Set binarytext = $System.Encryption.RSAEncrypt(plaintext, pubKey)
Set ciphertext = $SYSTEM.Encryption.Base64Encode(binarytext)
Return ciphertext
}
É preciso obter o conteúdo do arquivo da chave pública para criptografar com RSA.
A operação RSA Encrypt foi usada para criptografar textos.
### 6. Descriptografia assimétrica
// Amostra de chaves assimétricas para descriptografia
ClassMethod DoRSADecrypt(ciphertext As %String) As %Status
{
// obter chave pública
Set privKeyFileName = "/opt/irisbuild/example-com.key.pem"
Set privobjCharFile = ##class(%Stream.FileCharacter).%New()
Set privobjCharFile.Filename = privKeyFileName
Set privKey = privobjCharFile.Read()
// obter ciphertext em formato binário
Set text=$SYSTEM.Encryption.Base64Decode(ciphertext)
// descriptografar texto usando RSA
Set plaintext = $System.Encryption.RSADecrypt(text, privKey)
Return plaintext
}
É preciso obter o conteúdo do arquivo da chave privada para descriptografar com RSA.
A operação RSA Decrypt foi usada para descriptografar textos.
### 7. Texto com hash usando MD5 (abordagem antiga)
// Amostra de hash
ClassMethod DoHash(plaintext As %String) As %Status
{
// converter para utf-8
Set text=$ZCONVERT(plaintext,"O","UTF8")
// hash de um texto
Set hashtext = $SYSTEM.Encryption.MD5Hash(text)
Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext)
// converter para texto hex para seguir as melhores práticas
Set hextext = ..GetHexText(base64text)
// retornar usando minúsculas
Write $ZCONVERT(hextext,"L")
}
A operação MD5 Hash fará a criptografia do texto e não será possível descriptografar.
O hash com MD5 não é recomendado para novos projetos por não ser considerado seguro. Por isso, foi substituído por SHA. O InterSystems IRIS oferece compatibilidade com SHA (veja nosso próximo exemplo).
### 8. Texto com hash usando SHA (abordagem recomendada)
Usaremos o método de hash SHA-3 para esta amostra. De acordo com a documentação do InterSystems, esse método gera um hash usando um dos Algoritmos de Hash Seguro dos EUA - 3. Consulte a Publicação 202 dos Federal Information Processing Standards para saber mais.
// Hash usando SHA
ClassMethod DoSHAHash(plaintext As %String) As %Status
{
// converter para utf-8
Set text=$ZCONVERT(plaintext,"O","UTF8")
// hash de um texto
Set hashtext = $SYSTEM.Encryption.SHA3Hash(256, text)
Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext)
// converter para texto hex para seguir as melhores práticas
Set hextext = ..GetHexText(base64text)
// retornar usando minúsculas
Write $ZCONVERT(hextext,"L")
}
No método SHA, é possível definir o comprimento do bit usado em uma operação de hash. Quanto maior o número de bits, mais difícil é decifrar o hash. No entanto, o processo de hashing também fica mais lento. Na amostra, usamos 256 bits. Você pode escolher estas opções de comprimento de bit:
* 224 (SHA-224)
* 256 (SHA-256)
* 384 (SHA-384)
* 512 (SHA-512)
Artigo
Heloisa Paiva · Abr. 4
Rubrica de Perguntas Frequentes (FAQ) da InterSystems
As configurações padrão para Stay Connected e Pool Size para hosts de negócios que usam o adaptador TCP são as seguintes:
StayConnected = -1(no timeout)PoolSize = 1
Se um problema de rede causar a perda de conexão com um host de negócios, o lado da produção não conseguirá detectar isso e não aceitará novas conexões. Nessa situação, nenhum evento é registrado no log de eventos. Se StayConnected estiver definido com seu valor padrão (-1), as conexões não atingirão o tempo limite e você precisará reiniciar o host de negócios antes que ele possa aceitar novas conexões. Recomendamos definir StayConnected para um valor maior ou igual a 0 para evitar essa situação.
Por exemplo, se você configurá-lo para 300 (segundos), um host de negócios TCP pode se desconectar e reconectar automaticamente se não receber novas mensagens por 300 segundos ou mais.
Para sistemas ocupados, você normalmente definiria o valor de StayConnected para um valor menor, como 5 segundos.
Artigo
Henrique Dias · Dez. 24, 2020
Fala pessoal, tudo bem?
Quase final do 2º tempo, mas ainda tudo pode acontecer até o apito final!
Criei o projeto iris-analytics-package para mostrar as empresas o quanto é simples e fácil tirar proveito do InterSystems Analytics e implementa-los em seus softwares.
Seja criando novas soluções simples, seja utilizando o OpenExchange para melhorar suas aplicações existentes.
A maioria das empresas que estão fazendo o upgrade para InterSystems IRIS já estão tirando vantagens de todas as capacidades que a ferramenta oferece; usam frameworks mais avançados e já saem na frente nessa corrida tecnológica.
Minha abordagem nessa competição tem um público-alvo um pouco diferente, as empresas que usam tecnologia a tanto tempo, mas ainda não extraem todo o potencial que ela tem para oferecer.
O projeto foi criado utilizando como base e inspiração alguns projetos existentes no OpenExchange. Valeu @Evgeny.Shvarov @Guillaume.Rongier7183 @Peter.Steiwer
DeepSeeWeb
csvgen
csvgen-ui
AnalyzeThis
Esses projetos juntos se tornam um "Wizard" humildão
Import Wizard
A página principal é simples e o processo é "direto e sem firulas".
Tem alguns campos que são necessários para o Wizard funcionar:
Selecione seu arquivo CSV
Separador
Nome da Classe
Selecione se você quer criar um Cubo ou não
Nome do Cubo
Selecione se o Wizard deve criar um dashboard de exemplo
Para visualizar o que você criou, nós faremos uso do DeepSeeWeb.
Demo
O gif abaixo mostra o processo todo. Depois de clicar no botão upload, pode até parecer que o gif travou, mas é porque ele está importando muitos registros.
O CSV que eu escolhi tem mais de 15Mb, e o processo importa 134.100 registros!
A propósito, os dados utilizados nesta demonstração fora obtido em The Humanitarian Data Exchange - Find, share and use humanitarian data all in one placeVocê pode testar este mesmo dataset; o arquivo CSV está no diretório abaixo:
iris-analytics-package/data
Se você curtiu o app e acha que mereço seu voto, por favor, vote em iris-analytics-package!
https://openexchange.intersystems.com/contest/current
Artigo
Heloisa Paiva · Maio 8
Migrar de Oracle, MSSQL ou outros sistemas de banco de dados puramente relacionais para um InterSystems IRIS multimodel é uma decisão estratégica que requer planejamento e execução cuidadosos. Embora essa transição ofereça benefícios significativos, incluindo desempenho aprimorado, escalabilidade e suporte para arquiteturas modernas, ela também apresenta desafios. Neste artigo, destacarei algumas das considerações relacionadas à codificação para garantir uma migração bem-sucedida. Deixarei tudo o que está conectado a uma migração real de estruturas e dados fora do escopo deste artigo.
Primeiramente, ao considerar migrar para um sistema de banco de dados diferente, você precisa entender sua lógica de negócios, seja ela do lado da aplicação (servidor de aplicação) ou do servidor de banco de dados. Basicamente, onde você tem suas instruções SQL que potencialmente precisará reescrever?
Quando a lógica da sua aplicação depende fortemente de SQL executado diretamente no código da aplicação (em vez de dentro de stored procedures ou triggers no banco de dados), migrar de um banco de dados relacional para o InterSystems IRIS requer um exame cuidadoso das suas instruções SQL. Vamos analisar alguns dos fatores mais importantes nos quais você precisa pensar.
Diferenças de dialeto SQL. O IRIS SQL oferece suporte ao padrão SQL-92. Isso não significa que alguns recursos mais modernos não estejam implementados. Significa apenas que você precisa verificar previamente. Por exemplo, as funções de janela apareceram no SQL:2003, mas você ainda pode escrevê-las no IRIS:
--window function
select id, rating
from (select a.id,
r.rating,
avg(r.rating) over () as avg_rating
from SQLUSER.Actor a join SQLUser.Review r on a.id = r.Reviews) as sub
where rating > avg_rating
Ao mesmo tempo, novos tipos de dados complexos, como XML, JSON, Arrays e tipos de dados geográficos, não são suportados. Então, a seguinte consulta:
SELECT a.id,
a.firstname,
ARRAY_AGG(r.rating) AS ratings
FROM SQLUSER.Actor a LEFT JOIN SQLUser.Review r ON a.id = r.Reviews
GROUP BY a.firstname
retornará um erro: ERROR #5540: SQLCODE: -359 Message: User defined SQL function 'SQLUSER.ARRAY_AGG' does not exist
Mas não é o fim do mundo. Existem muitas funções integradas que permitirão que você reescreva as consultas para obter o resultado esperado.
2. Funções integradas. Diferentes SGBDs (Sistemas de Gerenciamento de Banco de Dados) possuem diferentes funções integradas. Portanto, você precisa entender como elas correspondem às disponíveis no IRIS. Aqui estão vários exemplos do que estou falando, funções usadas no Oracle e seus equivalentes no IRIS:
Oracle
IRIS
NVL
ISNULL(field, default_value)
substr
$extract(field, start_pos, end_pos)
instr
$find(field, text_to_find)
concat
{fn CONCAT(string1,string2)}
Quando sua lógica SQL primária reside dentro de um banco de dados (por exemplo, stored procedures, triggers, views), migrar para o InterSystems IRIS requer uma abordagem diferente. Aqui estão algumas das considerações:
Migração de Objetos de Banco de Dados
Todas as Stored Procedures precisam ser reescritas usando ObjectScript. Este também pode ser um bom momento para mudar para o modelo de objetos, já que você obterá uma tabela de qualquer maneira ao criar uma classe. No entanto, trabalhar com classes permitirá que você escreva métodos (que podem ser chamados como stored procedures) e use todo o poder do paradigma orientado a objetos.
Triggers, Índices e Views são todos suportados pelo IRIS. Você pode até deixar suas Views como estão se as colunas da tabela permanecerem as mesmas, caso não usem nenhuma das funções/sintaxes não suportadas (veja o ponto anterior).
A Migração de Definições também é significativa e pode apresentar alguns desafios. Primeiro, você deve corresponder cuidadosamente os tipos de dados do seu DB anterior ao IRIS, especialmente se estiver usando novos tipos complexos. Além disso, tendo mais flexibilidade com os índices, você pode querer redefini-los de forma diferente.
Aqui estão algumas coisas que você precisa considerar ao decidir migrar para o InterSystems IRIS a partir de um banco de dados relacional diferente. É uma decisão estratégica que pode desbloquear benefícios significativos, incluindo escalabilidade, desempenho e eficiência aprimorados. No entanto, um planejamento cuidadoso é crucial para garantir uma transição perfeita e para abordar as necessidades de compatibilidade, transformação de dados e refatoração de aplicativos.
Artigo
Angelo Bruno Braga · Jun. 30, 2021
Olá Desenvolvedores,
Nesta postagem nós gostaríamos de falar com vocês como tirar o máximo proveito da Comunidade de Desenvolvedores para aprender o máximo que você puder com os experts da tecnologia InterSystems!
Prestem atenção nestes passos para se tornar um usuário avançado de nossa comunidade!
Siga os membros que você se interessa
Você pode seguir qualquer membro da Comunidade que publica conteúdos que você gosta ou se interessa. Para isso, clique no botão "Seguir" na barra lateral direita de qualquer membro e você será notificado por e-mail sempre que este membro publicar uma postagem (artigo/pergunta/anúncio ,etc.) na Comunidade.
Você também pode selecionar no menu superior a opção "Membros" e procurar por uma pessoa específica ou membros com mais visualizações, maior quantidade de likes... e começar a segui-los.
Siga as tags que você tem interesse
Todas as tags utilizadas para descrever as postagens na Comunidade podem ser encontradas na seção "Tags" na página inicial da Comunidade de Desenvolvedores:
Na Árvore de Tags da Comunidade de Desenvolvedores, você poderá encontrar tópicos que você tenha interesse e então seguir as tags relacionadas a eles. Para isso, selecione a tag e clique no botão "Seguir" próxima a ela. Quando você segue qualquer uma das tags, voC~e recebe um e-mail com todas as postagens que utilizam esta tag.
Tags que sugerimos: Melhores Práticas | Dicas e Truques | Iniciante | Tutorial.
Siga as postagem que você se interessar
Seguindo uma postagem, você receberá (por e-mail) todas as atualizações feitas nesta postagem como: novos comentários, se uma segunda parte dela for publicada, ou qualquer outra atividade relacionada a postagem que você esteja seguindo.
Para seguir uma postagem você precisa apenas clicar no ícone de sino abaixo de cada postagem:
-> Como fico sabendo quais membros, tags e postagens que estou seguindo?
Para saber quais membros, tags e postagens que você segue você precisa apenas ir para sua conta, no canto superior direito:
e então selecionar "Inscrições" no menu lateral esquerdo:
E na parte de baixo desta página você poderá ver e customizar suas inscrições através das três abas - cada uma mostrando os membros, tags e postagens que você está seguindo no momento. Por exemplo, no print de tela abaixo você pode verificar que o usuário está seguindo um membro da comunidade e duas tag:
Nota: Se você quiser seguir mambros ou tags em diferentes idiomas você precisa alterar as configurações de sua inscrição para o idioma desejado.
Adicionar postagens aos seus favoritos
Adicione a postagem que você gostar aos favoritos para que você possa acessá-la de forma mais rápida e fácil no futuro.
Se você gostar de uma postagem (artigo, pergunta ou anúncio) e gostaria de ler ele mais tarde ou guardá-lo, você pode adicioná-lo aos favoritos. Desta forma você consegue acessar a postagem de forma fácil e rápida e pode ler e reler ele quando você quiser.
Para adicionar uma postagem aos seus favoritos você precisa apenas clicar no ícone de estrela abaixo de cada postagem:
Para ver todos os seus favoritos, vá para sua conta e então para "Favoritos", no menu lateral a esquerda:
Espero que tenham gostado !
Usem todas as funcionalidades da Comunidade de Desenvolvedores que podem ajudá-lo a se tornar mais um expert nas tecnologias da InterSystems.
E é claro, vocês são muito bem vindos para nos enviar novas formas e dicas de como aprender as Tecnologias InterSystems através da Comunidade de Desenvolvedores nos comentários desta postagem.
Artigo
Danusa Calixto · Set. 14, 2022
O [SDK Nativo para Python](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=BPYNAT_about) da InterSystems é uma interface leve de APIs do InterSystems IRIS que antes estavam disponíveis somente por ObjectScript.
Estou especialmente interessado na capacidade de chamar métodos ObjectScript ou class methods, para ser preciso. Funciona muito bem, mas, por padrão, as chamadas só são compatíveis com argumentos escalares: strings, booleanos, inteiros e floats.
No entanto, se você quiser:
- Transmitir ou retornar estruturas, como dicionários ou listas
- Transmitir ou retornar streams
Você precisará escrever glue code ou usar este [projeto](https://github.com/eduard93/edpy) (instalação com `pip install edpy`). O pacote `edpy` fornece uma simples assinatura:
```python
call(iris, class_name, method_name, args)
```
que permite chamar qualquer método ObjectScript e receber resultados de volta. Faça a importação assim:
```python
from edpy import iris
```
`call` aceita 4 argumentos obrigatórios:
- `iris` — uma referência a um [objeto IRIS](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=BPYNAT_refapi#BPYNAT_refapi_class-iris) estabelecido
- `class_name` — classe IRIS para chamar
- `method_name` — método IRIS para chamar
- `args` — lista de 0 ou mais argumentos
## Argumentos
Cada argumento pode ser um destes:
- string (qualquer comprimento, se for maior do que `$$$MaxStringLength` or 3641144 símbolos, é automaticamente convertida em um stream)
- booleano
- inteiro
- float
- dict (convertido em um objeto dinâmico)
- lista ou tupla (convertidas em array dinâmica)
os argumentos dicionário, lista e tupla podem conter recursivamente outros dicionários, listas e tuplas (enquanto houver memória).
## Valor de retorno
Em retorno, esperamos um objeto/array dinâmico ou um stream/string JSON. Nesse caso, edpy primeiro converteria em uma string em Python e, se possível, interpretaria como um dicionário ou uma lista em Python. Caso contrário, o resultado seria retornado ao autor da chamada da mesma maneira.
É basicamente isso, mas veja alguns exemplos de métodos ObjectScript e como chamá-los usando essa função em Python.
## Exemplo 1: Pong
```objectscript
ClassMethod Test(arg1, arg2, arg3) As %DynamicArray
{
return [(arg1), (arg2), (arg3)]
}
```
Chame com:
```
>>> iris.call(iris_native, "User.Py", "Test", [1, 1.2, "ABC"])
[1, 1.2, 'ABC']
```
Nenhuma surpresa aqui. Os argumentos são colocados de volta em uma array e retornados ao autor da chamada.
## Exemplo 2: Propriedades
```objectscript
ClassMethod Test2(arg As %DynamicObject) As %String
{
return arg.Prop
}
```
Chame desta maneira:
```
>>> iris.call(iris_native, "User.Py", "Test2", [{"Prop":123}])
123
```
Agora para uma invocação mais incorporada:
```
>>> iris.call(iris_native, "User.Py", "Test2", [{"Prop":{"Prop2":123}}])
{'Prop2': 123}
```
Se uma propriedade for muito longa, também não tem problema — os streams serão usados para enviá-la ao IRIS e/ou de volta:
```
ret = iris.call(iris_native, "User.Py", "Test2", [{"Prop":"A" * 10000000}])
>>> len(ret)
10000000
```
Se você precisar de streams garantidos no lado do InterSystems IRIS, você pode usar [%Get](https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=%25SYS&CLASSNAME=%25Library.DynamicObject#%25Get):
```objectscript
set stream = arg.%Get("Prop",,"stream")
```
Se o stream for codificado em base64, você pode decodificá-lo com:
```objectscript
set stream = arg.%Get("Prop",,"stream
Artigo
Danusa Calixto · Jul. 28, 2022

Oi pessoal!
Só queria compartilhar aqui um post rápido sobre meu projeto para o Grand Prix :)
O FHIR Patient Viewer é uma ferramenta de renderização reativa de página única construída no Vue.js que exibe de maneira amigável os dados retornados de uma chamada /Patient/{id}/$everything feita para um servidor FHIR da InterSystems. No readme, incluí 3 coisas principais: 1. Uma demonstração em vídeo conectando o FHIR Patient Viewer a um servidor sandbox IRIS FHIR (a maneira mais rápida de testá-lo); 2. Um segundo vídeo mostrando como eu usaria o FHIR Patient Viewer em um ambiente de produção (usando um backend personalizado para lidar com as chamadas da API, escrito em PHP/Laravel no meu exemplo, mas transferível para outras linguagens/frameworks); e 3. instruções para modificar os componentes, criar sua própria versão da ferramenta e construir seus próprios arquivos dist.
Obrigado a todos! Qualidade incrível nos projetos do concurso!
Dan
Artigo
Larissa Prussak · Maio 23
Depois que implementamos um novo container baseado em containers.intersystems.com/intersystems/irishealth:2023.1 esta semana, percebemos que nosso FHIR Repository começou a responder com um Erro 500. Isso aconteceu devido a violações de PROTECT no novo namespace e banco de dados HSSYSLOCALTEMP utilizado por essa versão dos componentes FHIR do IRIS for Health.
A solução para isso é adicionar a permissão "%DB_HSSYSLOCALTEMP" nas Aplicações Web que processam as requisições FHIR.
Você pode automatizar essa configuração executando o seguinte método de classe nos namespace(s) onde essas Aplicações Web estão definidas:
do ##class(HS.HealthConnect.FHIRServer.Upgrade.MethodsV6).AddLOCALTEMPRoleToCSP()
No nosso caso, isso não foi suficiente. Parte do nosso código customizado precisa acessar o token JWT Bearer enviado pelo cliente, o qual antes era obtido através do elemento AdditionalInfo "USER:OAuthToken", que não está mais presente na build 2023.6.1.809, conforme descrito em:
https://docs.intersystems.com/upgrade/results?product=ifh&versionFrom=20...
Contornamos esse problema adicionando a seguinte lógica para buscar o token diretamente do cache de tokens:
> ` $$$ThrowOnError(##class(HS.HC.Util.InfoCache).GetTokenInfo(pInteropRequest.Request.AdditionalInfo.GetAt("USER:TokenId"), .pTokenInfo))
> set OAuthToken = pTokenInfo("token_string")`