发布新帖

查找

问题
· 十月 10, 2024

Rename function in class %File is not removing files from the original folder

SOURCFILE="/home/user1/file1.dat"

DESTFILE="/opt/users/file1.dat"

##class(%File).Rename(SOURCFILE,DESTFILE,.STATUS) when this is executed in IRIS,  SOURCEFILE is getting moved to the folder in DESTFILE but it is not getting deleted from SOURCEFILE folders. Same call is working as expected in cache. Has anyone experienced this issue? We are trying convert to IRIS from cache.

 

2 Comments
讨论 (2)1
登录或注册以继续
公告
· 十月 10, 2024

InterSystems Tech Video Challenge

Hey Community,

We’re excited to introduce a whole new way for you to showcase your creativity and skills! This time, we’re inviting you to participate in our first-ever video challenge:

📹 InterSystems Tech Video Challenge 📹

Submit a video on any topic related to InterSystems IRIS products or services from October 21 - November 10, 2024.

🎁 Gifts for everyone + main prizes!


🔍 What’s the challenge?
Create a short video (up to 15 minutes) demonstrating a unique use of InterSystems technology. Whether it’s an innovative solution, a creative project, or a cool use case, we want to see it all!

📢 How to Enter:
To participate, you have to fill out the form where you will be required to upload your video. After we upload it to Developer Community YouTube we will post the link in the comments to this post for you to use everywhere.

Who can participate: Any Developer Community member, except for InterSystems employees (contractors are welcome to participate). Create an account!

General Requirements:

  1. The video must focus on InterSystems products or services and be technical in nature.
  2. All content must be in English (incl. code, screenshots, etc.).
  3. Videos must be 100% original and cannot be translations of any previously submitted videos for contests in any community.
  4. All information presented must be accurate and reliable.
  5. Videos should be less than 15 minutes long.
  6. Different authors can submit videos on the same topic with distinct examples.

NB. Our panel of experts will make the final decision on whether a video qualifies for the contest based on criteria such as quality and relevance. Their decision is final and cannot be appealed.

Contest Timeline

📝  October 21 - November 10: create a video and fill out the form throughout this period. DC members can vote for published videos with Likes – votes in the Community award.

📝  November 11-17: experts voting time

📝  November 18: winners' announcement

Prizes

1. Everyone Wins! All participants will receive a special gift:

🎁 Nike Golf Dri-FIT Swoosh Perforated Cap

2. Expert Awards – videos will be judged by the InterSystems experts:

🥇 1st place: 10.9-inch iPad Wi‑Fi 64GB / Sony WH-1000XM5 Wireless Headphones

🥈 2nd place: Moleskine Vertical Device bag - 15" //LEGO NASA Artemis Space Launch System

🥉 3rd place: AirPods 4 with Active Noise Cancellation / LEGO Hogwarts™ Castle: The Great Hall

As an alternative, any winner can choose a prize from a lower prize tier than his own.

3. Developer Community Award – video with the most likes. The winner will have the option to choose one of the following prizes:

🎁 AirPods 4 with Active Noise Cancellation / LEGO Hogwarts™ Castle: The Great Hall

Note: Authors can only win once per category (up to two total prizes: one from Expert and one from Community). In case of a tie, the number of expert votes will serve as the tie-breaking criterion.

Note: Each winning video will be awarded a single prize, regardless of the number of authors.

🎯 Extra bonuses

Here is the list of additional bonuses to help you win the prize! Please welcome: 

Bonus Nominal  Details

Topic bonus

3

Choose a topic from the list of the proposed topics below to get this bonus. 

Article bonus

Write a brand new explanatory article to support your video and use the tag #Video in it.

Application bonus

5

Upload a new application (or an improved version of an existing one) from your video to Open Exchange.

Translation bonus

2

Translate your video into one of the languages of our regional communities (ES, PT, JP, CN, FR) and upload it using the same form; mention in the description that it is a translation, and provide a YouTube link to the original.

YouTube Shorts bonus

2

Create a YouTube Short for your video (vertical video, up to 60 seconds).

LinkedIn bonus

1

Share the video on your LinkedIn, mentioning that you’re participating in the InterSystems Tech Video Challenge, and tagging the Developer Community LinkedIn page.

Proposed topics

Here's a list of proposed topics that will give your article extra bonuses:

✔️ Using AI / GenAI / RAG
✔️ Using Embedded Python in Interoperability
✔️ Using External Language Gateways (C#, Java, Python)
✔️ Using Data Fabric / Data Lake / Data Warehouse / Data Mesh
✔️ Using FHIR
✔️ Using REST
✔️ IKO common deployments

---

Get ready to shine and inspire others with your tech skills! We can't wait to see what you come up with. ✨


Note 1: By participating in the contest, you agree to have your video uploaded to the Developer Community YouTube.

Note 2: Delivery of prizes varies by country and may not be possible for some of them. A list of countries with restrictions can be requested from @Liubka Zelenskaia

 
15 Comments
讨论 (15)7
登录或注册以继续
讨论 (0)1
登录或注册以继续
文章
· 十月 10, 2024 阅读大约需 10 分钟

Desenvolvendo Intergrações com o InterSystems IRIS - SOAP Inbound Adapter

Projeto 1 - Integração utilizando SOAP Inbound Adapter

A idéia deste novo conjunto de postagens é apresentar uma série de integrações utilizando o InterSystems IRIS. Vamos ver integrações REST, SOAP, utilizando adaptadores ODBC, Arquivos e outros.

Vamos montar nossa primeira integração completa, passando pelas camadas de BS, BP e BO, e devolvendo a resposta esperada. Vamos montar essa nossa primeira integração utilizando o SOAP como o adaptador de entrada, e como cliente vamos utilizar o SoapUI.

Vamos então começar:

1. SoapUI

Baixe o SoapUI do site de download dele (https://www.soapui.org/downloads/soapui/) Nesta tela você poderá optar por baixar o SoapUI Open Source conforme a tela abaixo:

 

 

Baixe e instale o produto. Ao executar você verá a seguinte tela:

Pronto. Você já está com o SoapUI instalado e pronto para realizar os testes na sua integração.

2. IRIS

Agora vamos para o IRIS. Após instalar o IRIS e criar um namespace com a opção de Interoperabilidade ativada, vamos então criar as mensagens que vão fazer parte da nossa integração. Vamos criar um Request e um Response conforme abaixo:

Class ws.demo.msg.Request Extends Ens.Request
{

Property string1 As %String;

Property string2 As %String;

}

 

Class ws.demo.msg.Response Extends Ens.Response
{

Property saida As %String;

Property status As %Boolean;

Property mensagem As %String;

Property sessionId As %Integer;

}

 

Note que Request tem como superclasse Ens.Request e Response tem como superclasse Ens.Response. Isso é importante para que as funcionalidades do barramento estejam disponíveis nas mensagens. Após criar nossas mensagens de Request e Response Vamos criar nosso BS, que é quem vai receber as requisições:

Class ws.demo.bs.Service Extends EnsLib.SOAP.Service
{

Parameter ADAPTER = "EnsLib.SOAP.InboundAdapter";

Parameter SERVICENAME = "entrada";

Method entrada(pInput As ws.demo.msg.Request) As ws.demo.msg.Response [ WebMethod ]
{
              Set tSC=..SendRequestSync("bpEntrada",pInput,.tResponse)
              If $$$ISERR(tSC) Do ..ReturnMethodStatusFault(tSC)
              Quit tResponse
}

}

 

Note que nosso BS tem como superclasse EnsLib.DSOAP.Service e usa o adaptador EnsLib.SOAP.InbloudAdapter. Isso habilita nosso BS a trabalhar como um BS SOAP, recebendo as requisições neste padrão.

Agora vamos criar nosso BO conforme abaixo:

Class ws.demo.bo.Operation Extends Ens.BusinessOperation [ ProcedureBlock ]
{
Method entrada(pRequest As ws.demo.msg.Request, Output pResponse As ws.demo.msg.Response) As %Library.Status
{
 Set pResponse=##Class(ws.demo.msg.Response).%New()
 Set pResponse.status=1
 Set pResponse.mensagem="OK"
 Set pResponse.sessionId=..%SessionId
 Set pResponse.saida=pRequest.string1_" "_pRequest.string2
 Quit $$$OK
}
XData MessageMap
{
<MapItems>
              <MapItem MessageType="ws.demo.msg.Request">
                            <Method>entrada</Method>
              </MapItem>
</MapItems>
}

}

Aqui no BO temos a estrutura XData que recebe qual a classe que vai chegar e direciona para o método que deve tratar aquela etrada.

Note também que neste BO não estamos utilizando nenhum adaptador. Ele trabalha sem fazer chamadas externas. Desta fora não vamos precisar para este exemplo de nenhum tipo de comunicação. As próximas integrações já teremos chamadas externas.

Agora, por fim, vamos montar nosso BP, que é o orquestrador das chamadas da integração. No nosso exemplo teremos apenas uma única chamada, mas nosso BP poderia orquestrar chamadas para diversos BOs.

 

O código do nosso BP ficará assim:

/// 
Class ws.demo.bp.entrada Extends Ens.BusinessProcessBPL [ ClassType = persistent, ProcedureBlock ]
{ /// BPL Definition
XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl]
{
<process language='objectscript' request='ws.demo.msg.Request' response='ws.demo.msg.Response' height='2000' width='2000' >
<sequence xend='200' yend='350' >
<call name='boEntrada' target='boEntrada' async='0' xpos='200' ypos='250' >
<request type='ws.demo.msg.Request>
<assign property="callrequestvalue="requestaction="set" languageOverride="" />
</request>
<response type='ws.demo.msg.Response>
<assign property="responsevalue="callresponseaction="set" languageOverride="" />
</response>
</call>
</sequence>
</process>
} Storage Default
{
<Type>%Storage.Persistent</Type>
}

}

Agora vamos criar nossa production e colocar as classes nela. Vamos no Painel de Administração->Interoperabilidade e vamos configurar uma nova produção, lembrando que a classe da produção já está no pacote de download:

Clique em Novo e preencha a tela a seguir:

 

Clique em OK e a produção estará criada. Agora clique no botão (+) ao lado do título Services para incluir o nosso BS na produção:

 

Preencha a tela conforme acima e clique em OK.

 

Pronto. O BS já está na production. Agora clique em OK na tela que está apresentada para voltar a tela da produção.

A seguir cliqye no botão (+) ao lado do título Process para incluir o nosso BP:

 

Preencha a tela conforme acima e clique em OK.

 

 

Pronto. Nosso BP já está na produção. Agora clique em OK para voltar a tela de configuração da produção. E então vamos clicar no botão (+) ao lado do título Operations:

 

Preencha a tela conforme acima, clique em OK e teremos nosso BO na produção.

 

 

Agora clique em OK para voltarmos a tela de configuração da produção:

 

 

Temos nossos 3 componentes configurados na produção. Clique na bola verde ao lado de bpEntrada para ver as conexões entre os componentes:

 

 

 

 

 

Agora clique sobre o nome do nosso BS expanda a área Parâmestros de Conexão e marque a caixa Habilitar Requisições Padrão, conforme a tela a seguir:

 

Feita a configuração da produção nossa integração está pronta para uso. Abra o SoapUI e vamos agora importar nosso WSDL. O WSDL é a definição do serviço SOAP. Caso você queira ve-lo antes da importação abra um navegador e vá para o endereço http://localhost/csp/<namespace>/ws.demo.bs.Service.cls?WSDL=1 onde <namespace> é o nome do namespace que você criou para armazenar sua integração. No nosso caso o namespace se chama integra:

 

 

Então, voltando ao SoapUI, vamos importar nosso WSDL:

 

Abra o SoapUI e no menu File clique em New Soap Project:

 

 

 

Preencha a caixa Initial WSDL com o endereço do nosso WSDL. O SoapUI vai preencher sozinho a caixa Project Name. A seguir clique em OK

Abra o treeview do projeto até chegar em Requst 1. Clique neste titulo e você verá a tela com as informações para chamar o serviço:

 

 

Preencha string 1 e string 2 com o que você quiser, seu nome e sobrenome por exemplo, e clique na seta verde de play. Você verá então a resposta do serviço na janela ao lado:

 

 

Pronto! Realizamos a chamada do nosso serviço e foi devolvida a resposta:

 

<?xml version="1.0" encoding="UTF-8" ?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema'>

<SOAP-ENV:Body><entradaResponse xmlns="http://tempuri.org">

<entradaResult><saida>Abel Silva</saida>

<status>true</status>

<mensagem>OK</mensagem>

<sessionId>17</sessionId>

</entradaResult></entradaResponse>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

 

Agora podemos voltar a nossa produção e ver o trace da nossa integração. Clique sobre o nome do nosso BS e a seguir clique em Mensagens e a seguir em Ir para o Visualizador de mensagens. Localize o SessionID que você recebeu na sua resposta e clique neste número. Então você verá o trace da nossa integração:


Veja que você pode ver o que cada componente recebeu, o tempo de duração de cada chamada, o que foi devolvido e o fluxo geral da integração. Isso é especialmente útil para você administrar ambientes complexos e com grande número de integrações, além de permitir que em caso de necessidade você possa reenviar uma mensagem que por algum motivo não tenha sido processada.

 

 

 

 

Agora, caso se deseje incluir uma autenticação no serviço, vamos primeiro precisar criar um usuário. Vamos em Portal de Administração/ Segurança/Usuarios e clique em Criar Novo Usuário:

 

Preencha a tela conforme acima. Informe a senha desejada e lembre de marcar as caixas ‘A senha nunca expira’ e ‘A conta nunca expira’ para que a conta esteja ativa. Você pode aqui colocar as opções de expiração de acordo com o que seu ambiente exija de segurança. Para nosso teste vamos deixar sem expiração.

Após salvar o usuário clique em Roles e selecione a Role %All para este usuário. Clique em Associar. Esta role %All dará total acesso ao seu ambiente para este usuário.

Pronto. O usuário está criado. Podemos criar um usuário com acesso mais restrito, mas no nosso caso não estamos avaliando a questão de segurança e nível de acesso, apenas determinando que o serviço tenha autenticação. Em próximas etapas veremos a parte de segurança do IRIS que é bem completa.

IMPORTANTE: Depois, se for o caso, exclua este usuário do seu ambiente. Ele tem acesso FULL a sua instancia IRIS.

Agora vá em Administração do Sistema/Segurança/Aplicações/Aplicações Web e procure a aplicação web referente ao seu namespace. No nosso caso /csp/integra:

 

Procure a sessão Métodos permitidos para autenticação, desmarque a caixa Não Autenticado e marque a caixa Senha, e a seguir clique em Salvar.


Volte ao SoapUI e novamente clique no botão de Play. Você verá que agora o SoapUI recebeu um erro da integração:

 

<?xml version='1.0' encoding='UTF-8' standalone='no' ?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema' xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secex..." >

  <SOAP-ENV:Body>

    <SOAP-ENV:Fault>

      <faultcode>wsse:FailedAuthentication</faultcode>

      <faultstring>The security token could not be authenticated or authorized</faultstring>

      <detail></detail>

    </SOAP-ENV:Fault>

  </SOAP-ENV:Body>

</SOAP-ENV:Envelope>

 

Veja que o serviço informou que não pode validar o token de segurança pois o mesmo não foi informado. Vamos criar esse token alterando a Request Properties do serviço, logo abaixo na tela do SoapUI:

 

 

Informe o nome do usuário, senha e na caixa WSS-Password Type selecione PasswordText. Agora reenvie a sua requisição e você terá a resposta correta:

 

 

3. TCPTRACE

Uma ferramenta muito útil quando estamos trabalhando com integrações é o TCPTrace que permite verificar o tráfego TCP de uma conexão. Vamos colocar o TCPTrace para rodar e configurar nosso ambiente para vermos o trace das informações. Execute o TCPTrace do seu local de instalação:

 

 

Você verá a tela de configuração. Essa configuração diz ao TCPTrace para monitorar a porta 8080 e repassar o que receber para a porta 80. Preencha como acima e clique em OK. Agora volte ao SoapUI e vamos dizer que o serviço deve se comunicar com a porta 8080 que é a que o TCPTrace está “escutando”:

 

Logo após o localhost do endereço do serviço informa que a porta é a 8080. O endereço completo ficará assim:

http://localhost:8080/csp/integra/ws.demo.bs.Service.cls

 

Clique novamente no botão de Play e veja a tela do TCPTrace:

 

 

Todo o tráfego foi registrado, tanto do envio do SoapUI quanto do retorno do serviço. Podemos ver, por exemplo o token de segurança do nosso serviço:

<wsse:UsernameToken wsu:Id="UsernameToken-6780B0C4521A4F63E517261668857132"><wsse:Username>service</wsse:Username><wsse:PassworIntegrações utilizando o InterSysted Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-p...">123</wsse:Password>

IMPORTANTE: Aqui estamos usando o que chamamos de Basic Auth, ou seja uma autenticação básica. Os dados de usuário e senha são enviados no header do pacote sem criptografia. Em produção devemos para este caso estar usando um protocolo HTTPS para que o pacote seja criptografado. A ativação do HTTPS envolve um certificado a ser instalado no seu web server (IIS, Apache ou outro suportado pelo IRIS).

Assim fechamos nossa primeira integração. As classes envolvidas estão no pacote de download, basta baixar o pacote e importar para dentro do seu namespace. Após isso você pode abrir todas as classes e verificar todos os pontos.

Utilizamos em nosso teste o IRIS 2024.1, o SoapUI e o TCPTrace. Todos estão disponíveis para download nas suas versões Community na internet.

Até a próxima integração!

4 Comments
讨论 (4)4
登录或注册以继续
InterSystems 官方
· 十月 10, 2024

Pesquisas de Vetores mais Rápidas com Índice de Vizinho mais Próximo — agora disponível no Programa de Acesso Antecipado de Pesquisa de Vetores

Recentemente, disponibilizamos uma nova versão do InterSystems IRIS no Vector Search Early Access Program, apresentando um novo índice Approximate Nearest Neighbor baseado no algoritmo de indexação Hierarchical Navigable Small World (HNSW). Essa adição permite pesquisas altamente eficientes e aproximadas de vizinhos mais próximos em grandes conjuntos de dados vetoriais, melhorando drasticamente o desempenho e a escalabilidade da consulta.

O algoritmo HNSW foi projetado para otimizar a pesquisa vetorial para dados de alta dimensão, construindo uma estrutura baseada em gráfico, tornando mais rápido encontrar vizinhos aproximados em grandes coleções de vetores. Quer você esteja trabalhando com sistemas de recomendação, processamento de linguagem natural ou outros aplicativos de aprendizado de máquina, o HNSW pode reduzir significativamente os tempos de pesquisa, permitindo que você ajuste o nível de precisão com a compensação de que maior precisão resulta em tempos de consulta mais lentos.

Os principais benefícios do HNSW incluem:

  • Pesquisas mais rápidas, mesmo com o aumento do tamanho do conjunto de dados
  • Redução da pegada de memória, mantendo alta precisão
  • Integração perfeita com os recursos de pesquisa de vetores IRIS existentes

Como Começar 

A versão mais recente já está disponível por meio do nosso Programa de Acesso Antecipado do Vector Search. Para participar, inscreva-se aqui, baixe a nova versão e comece a testar. Seu feedback é essencial à medida que continuamos a aprimorar o Vector Search!

Incentivamos você a explorar as melhorias de desempenho e compartilhar suas ideias com a comunidade. Entre em contato comigo com quaisquer perguntas ou feedback que você tenha durante a fase de acesso antecipado.

 

Boa codificação! 

讨论 (0)1
登录或注册以继续