Jump to content

Karina Harumi

Administradores
  • Contagem de Conteúdo

    933
  • Ingressou

  • Última visita

  • Dias Ganhos

    185

Tudo que foi postado por Karina Harumi

  1. Tópico originalmente criado por: @Jonathan Santos O TClientDataSet é uma estrutura de acesso a dados em memória que está presente no Delphi desde as suas primeiras versões. Este componente é um dos mais utilizados por desenvolvedores, tendo muitas aplicações práticas. Porém, este mesmo componente apresenta alguns problemas com consumo de memória, especialmente em cenários multi-threaded , por não ser um componente que está completamente otimizado este tipo de cenário. Apesar de não apresentar problemas de Memory Leak , o próprio consumo de memória do componente pode causar o travamento da aplicação, geralmente com erros de “Insufficient Memory for this Operation” ou “Out of Memory”. Para reduzir o impacto deste problema, existem alternativas à utlização do TClientDataSet, como trabalhar com dados em arquivo ao invés de memória, trabalhar com estruturas de dados que utilizam Generics ou trocar o TClientDataSet por componentes de terceiros que têm a mesma finalidade, como o KbmMemTable
  2. Tópico originalmente criado por: @Jonathan Santos Durante o desenvolvimento e manutenção de sistemas de software, por melhor que os desenvolvedores possam ser, erros podem ser cometidos. Um dos erros mais difíceis de serem detectados são os chamados Memory Leaks, principalmente por não causarem erros aparentes na execução dos programas, mas nem por isso são menos destrutivos quando não tratados. Memory Leaks, ou “Vazamento de Memória”, é um problema que ocorre quando porções de memória utilizadas pelo programa não são liberadas depois de utilizadas. Isso faz com que o programa passe a usar mais e mais memória, nunca liberando, e pode por fim consumir toda a memória RAM, causando graves problemas ao sistema (ex: lentidão, travamentos, erros de execução, etc). Esse problema é particularmente grave em sistemas que são executados por longos períodos, como serviços, aplicações para servidores, drivers de dispositivos, sistemas embarcados, etc. Portanto, vamos demonstrar como podemos capturar esse problema em nossas aplicações Delphi, usando a ferramenta Eureka Log (versão trial disponível em https://www.eurekalog.com/ 23). Usarei nesse artigo o Delphi 7 com o EurekaLog 7. Vale notar também que até o momento de escrita desse artigo, o EurekaLog é compatível com Delphi 3 em diante até o Delphi XE6. Antes de instalar o EurekaLog, feche quaisquer Delphis abertos. Instalar o EurekaLog é bem simples (inclusive está em português), não vou me alongar muito nesse ponto, apenas gostaria de destacar que é possível escolher para quais versões de Delphi presentes no sistema você deseja instalar o EurekaLog. Depois de instalado, ao abrir o Delphi, notem que foi criado mais um item de menu chamado “EurekaLog”. Porém, não é nesse menu que vamos encontrar as opções que iremos usar. Na verdade, há mais um item de menu criado, dessa vez dentro do menu “Project”, o “EurekaLog Options”. Isso deve-se ao fato de o EurekaLog armazenar suas configurações individualmente para cada projeto. Ao entrar nessa tela, veja que a princípio o EurekaLog encontra-se desativado, portanto devemos ativá-lo marcando “Activate EurekaLog”. Certifique-se de que em “Project Type” esteja selecionado “VCL Forms Application”. Entre na seção “Memory Problems” e certifique-se de estar marcado a opção “Catch memory leaks”, e clique em OK. Depois disso dê um Build em seu projeto (menu Project --> Build). É isso, tudo pronto para detectar os memory leaks do seu projeto! Para demonstração, vou deixar como anexo desse artigo um pequeno projeto com botões que causam memory leaks de duas formas bastante comuns de ocorrer. A primeira forma é não “dar Free” no final de uso de uma instância de objeto. A segunda forma é criar duas instâncias e atribuir as duas à mesma variável, fazendo com que a primeira instância tenha sua referência perdida. Para fins didáticos, deixei nesse projeto o EurekaLog desativado, para ativar siga as etapas já citadas. Agora para detectar os memory leaks, execute sua aplicação e use-a da maneira que achar conveniente. Procure usar os recursos que você desconfia que está causando memory leaks. No caso da demonstração, clique nos botões algumas vezes. Ao fechar o aplicativo, caso haja detecção de leaks, será aberto uma mensagem de erro, informando que o aplicativo contém erros. Se tiver escrito “Application has leaked memory”, encontramos memory leaks. Para abrir um relatório dos leaks encontrados, clique no “click here” da mensagem. Será aberta uma tela enumerando todos os memory leaks encontrados, tipo, tamanho, quantidade, dentre inúmeras outras informações. Em cada leak, há toda a “call stack” do momento da detecção do leak, e essa é a parte mais útil, pois aqui podemos descobrir o ponto exato da sua aplicação que está causando o leak. Para isso, procure na coluna Procedure/Method nomes de rotinas que lhe sejam familiar em relação ao seu projeto. Ao dar clique-duplo na linha, o EurekaLog lhe levará ao Delphi na linha da rotina que causou o memory leak. Para corrigir o memory leak ainda depende do desenvolvedor identificar e corrigir dentro dessa rotina a causa do leak (no caso do exemplo, remover a dupla instanciação). Por fim, algumas observações: ao entregar releases do seu produto aos seus clientes, desative antes o EurekaLog, senão caso aconteça leaks que não foram removidos, ao encerrar a aplicação vai aparecer aquele diálogo do erro por memory leaks. Outro detalhe é mais para os desenvolvedores que utilizam controle de versão (Git, Subversion, Mercurial, etc): o EurekaLog armazena suas configurações junto às configurações do projeto, e isso causa diferenças de versionamento e pode causar alguns problemas. As configurações não são eliminadas mesmo quando desativa-se o EurekaLog, portanto a única maneira que vejo de eliminar as configurações do EurekaLog do seu projeto é desinstalando ele.
  3. Tópico originalmente criado por: @Jonathan Santos Escrito por Andrew Hunt e David Thomas, dois dos fundadores do Manifesto Ágil, o livro The Pragmatic Programmer se tornou uma referência para programadores que buscam aprimorar suas habilidades. Através de análises de casos reais e aprendizados de anos de experiência no mercado, os autores estabeleceram uma série de princípios e conceitos que compreendem as características e responsabilidades de um programador pragmático. Este artigo é uma tentativa de, em poucas palavras, introduzir o conceito de pragmatismo no contexto da programação segundo os autores e servir como um breve resumo do livro. O que torna um programador, pragmático? Apesar de todo programador ser único e possuir pontos fortes e fracos, algumas características são inerentes à todo programador que se diz ser dedicado e responsável em seu trabalho, sendo elas: Adaptação rápida: Instinto por técnicas e tecnologias. Capacidade e interesse em se aprender novas tecnologias e associar o aprendizado ao conhecimento já obtido. Inquisição: Interesse em se obter clareza. Questionar e analisar toda situação intrínseca à dado problema. Pensamento crítico: Atitude de procurar entender e se assegurar da razão e dos motivos antes de fazer qualquer suposição. Realismo: Capacidade de compreender a real natureza de dado problema de forma a não idealizar possíveis soluções, mas sim entender o que pode ser feito de fato. Versatilidade: Disposição em se relacionar com várias áreas. Mesmo enquanto especialista, estar disposto a aprender e adquirir um leque genérico de conhecimento. Para se tornar um programador pragmático é necessário pensar sobre o que você está fazendo, enquanto você está fazendo. Não basta fazer uma auditoria isolada para se obter resultados positivos, mas sim criar o hábito de efetuar uma constante avaliação crítica de cada decisão que você tomou ou que pretende tomar. Em outras palavras, é necessário desligar o piloto automático e se fazer presente e consciente de toda ação tomada, estar constantemente pensando e criticando seu trabalho com base nos princípios do pragmatismo. Princípios a serem seguidos Ao longo dos capítulos o livro trata sobre vários princípios de como aprimorar sua atitude enquanto programador. Existem muitos livros dedicados inteiramente à alguns destes princípios, tamanha a importância e recorrência dos problemas que eles se propõem a resolver. 1. Não se repita (DRY - Don’t Repeat Yourself) Evite ambiguidade e duplicação. Toda parte do conhecimento deve possuir somente uma representação em todo o sistema. 2. Reflita sobre seu trabalho Desligue o piloto automático. Critique e avalie constantemente seu trabalho. 3. Seja um catalisador de mudança Você não pode impor mudanças às pessoas. Ao invés disso, mostre a elas como o futuro pode ser e ajude-as a participar de sua criação. 4. Invista regularmente em seu portfólio de conhecimento Faça da aprendizagem um hábito. Procure apender algo novo relacionado ao seu trabalho todo dia. 5. A maneira como você diz é tão importante quanto o que você diz Não adianta ter ótimas idéias se você não as comunica eficientemente. 6. Facilite a reutilização Se for fácil de reutilizar, as pessoas reutilizarão. Crie as circunstâncias que favoreçam a reutilização. 7. Não suponha, prove Prove suas suposições no cenário real, com dados reais e limites reais. Desta forma não haverá dúvidas sobre a eficácia da solução proposta. 8. Refatore cedo, refatore sempre Assim como você deve regar e cuidar de um jardim, reescreva, reorganize e reconstrua o código quando necessário. Ataque a raiz do problema. 9. Projete para testar Comece a pensar em teste antes mesmo de programar uma linha sequer. Evite código que não possa ser testado. 10. O código não está pronto até todos os testes estarem passando Palavras para se viver. Essas foram somente algumas das dicas e dos princípios apresentados pelo livro, inclusive, em sua versão original, o livro vem acompanhado de uma folha que pode ser destacada servindo como um guia de referência rápido com mais de 70 dicas além de resenhas sobre os pontos mais importantes de cada capítulo. De fato um ótimo item para se ter sempre à disposição. Em suma, se está interessado em saber mais sobre como aprimorar seu trabalho enquanto desenvolvedor, não pense duas vezes antes de adquirir este livro. A versão original em inglês pode ser obtida através da Amazon e já existem versões em português em lojas no Brasil como a Saraiva. Boa leitura.
  4. Comentário originalmente feito por: elijah.junnior Sim eu refiz os testes, agora já estou conseguindo realizar os consumos. Acredito que o problema tenha sido a minha implementação, fiz algumas alterações e tudo passou a funcioanar
  5. Comentário originalmente feito por: @lucas.gusmao Olá @elijah.junnior, como vai? Sobre a documentação, provavelmente ela deu erro pois não está com o domínio pronto! Estamos trabalhando para adicionar um domínio para a nossa solução e, logo logo, você poderá acessá-la por HTTPS (assim como as chamadas da API). Sobre o seu erro, nossa equipe já investigou e corrigiu o motivo do erro. Se possível, faça um novo teste e verifique se o problema persiste. Qualquer dúvida estou a disposição, Obrigado!
  6. Comentário originalmente feito por: elijah.junnior Estou tentando consumir o serviço ‘companies’ mas só recebo o retorno ‘internal server erro’ Codigo: Dim client = New RestClient("http://a47d737df99d09c13.awsglobalaccelerator.com/companies") Dim request = New RestRequest(Method.POST) request.AddHeader("Authorization", $"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7InVzZXJJZ" + "CI6ImFhOTJhMDRjLTlmY2QtNDkyZi04ZjAwLTg5Yjg3N2YxYzczYiIsImVtYWlsIjoiZWxpYXNAZ28yc2lzdGVtYXMuY29tLmJ" + "yIiwieF9hcGlfa2V5IjoiYWIwYmQ0YWJlNzY2NmNjNTE4MzI4NDA0ZTg4ZTY1ZDMiLCJjcmVhdGVkIjoxNjEyNDYxNzIyODgxfS" + "wiaWF0IjoxNjEyNDYxNzIyfQ.9B6kGPIW2Oj8ykbCxZtuwk-FfBdCmRDoap3nlcFYYPs") request.AddHeader("content-type", "application/x-www-form-urlencoded") request.AddParameter("application/x-www-form-urlencoded", "grant_type=client_credentials&role=software_house", ParameterType.RequestBody) Dim csEmpresa As New TSP.Empresa With { .name = "BARBARA E ERICK FERRAGENS ME", .cpfCnpj = "74816061000168", .email = "suporte@rebecaerayssafotografiasltda.com.br", .zipcode = "24350290", .city = "Niteroi", .state = "RJ" } request.AddParameter("application/json", JsonConvert.SerializeObject(csEmpresa), ParameterType.RequestBody) Dim response = client.Execute(request) If response.IsSuccessful Then Dim a = response.Content.ToString() Else Dim csErro As TSP.MessageErro = JsonConvert.DeserializeObject(Of TSP.MessageErro)(response.Content.ToString()) Throw New Exception(csErro.message) End If
  7. Comentário originalmente feito por: elijah.junnior Bom dia, não estou conseguindo acessar a documentação, sempre aparece o erro a seguir: (Editado) pouco tempo depois voltou a funcionar
  8. Comentário originalmente feito por: @lucas.gusmao Olá Sato, boa tarde! Como vai? O QRCode dinâmico possui um campo onde você informa a data de expiração do mesmo. Além dele, existe um campo onde você pode informar a data de vencimento (ambos são opcionais, mas, caso informados em conjunto, a data de expiração deve acompanhar a data de vencimento. Sendo assim, é você quem vai determinar esse tempo de vigência. (não há uma definição no manual sobre um prazo máximo) Já no QRCode estático essa opção não existe! Uma vez gerado, ele pode ser gerado permanentemente e aceita múltiplas transações. Seu uso não é recomendado caso você queira ter um controle dos pagamentos mais refinado no seu ERP. Qualquer dúvida estou a disposição, Grande abraço!
  9. Comentário originalmente feito por: Sato Olá, com respeito ao tempo de validade de uma cobrança PIX. Ela expira em quanto tempo e qual o tempo máximo em que ela pode ficar vigente?
  10. Comentário originalmente feito por: @lucas.gusmao Olá Murilo, boa tarde! Obrigado pelo seu feedback e por compartilhar a solução do problema aqui! Vamos atualizar a nossa documentação e analisar o fato de ter retornado o status 500. Muito obrigado!
  11. Comentário originalmente feito por: murilo descobri o problema, na documentação manda enviar o role e grant_type no form-data, quando na verdade tem que enviar no x-www-form-urlencoded
  12. Comentário originalmente feito por: murilo Estou fazendo a seguinte requisição: curl --location --request POST ‘http://a47d737df99d09c13.awsglobalaccelerator.com/oauth2/token’ –header ‘Content-Type: application/x-www-form-urlencoded’ –header ‘Authorization: Basic bXVyaWxvQGNvbmNlcHRhdXRvbWFjYW8uY29tLmJyOmNvbmNlcHQ2NzQw’ –form ‘grant_type=“client_credentials”’ –form ‘role=“software_house”’ e obtenho o retorno { “code”: 500, “message”: “internal server error, try again later” } talvez eu possa estar enviando alguma coisa errada, mas a api não deveria tratar o erro? Está retornando 500 internal server error, creio eu que seja uma exception não tratada, pro lado de quem consome a api é muito ruim pq eu não fico sabendo qual o problema.
  13. Comentário originalmente feito por: @lucas.gusmao Olá Alfeu, boa tarde! Como vai? Durante o mês de Fevereiro faremos algumas alterações no ambiente de Sandbox, e até o fim do mês, estes cadastros estarão disponíveis! Qualquer dúvida estou a disposição, Obrigado!
  14. Comentário originalmente feito por: alfeu No sandbox não é possível criar companies, accounts e pix. Vocês tem previsão de quando teremos uma área de homologação para testar estes procedimentos?
  15. Comentário originalmente feito por: @lucas.gusmao Olá pessoal, bom dia! Sobre a dúvida quanto aos pagamentos, como disse, não é uma obrigação que os bancos liberem isso. Sendo assim, nessa primeira fase, a API não possuirá essa rotina. De toda forma, caso os bancos liberarem essa rotina, certamente a nossa API vai contemplar esse recurso! Estamos estudando a integração com o Itaú e vimos que eles já tem essa API disponível, porém, o Banco do Brasil não tem (pelo menos, não está disponível em suas documentações). Então, existe a possibilidade de ser um recurso não aplicável para todos! @sandropascoal, sobre sua segunda dúvida, a respeito do cadastro de companym ela é o seu cliente do ERP mesmo, ou seja, o estabelecimento. Uma company pode ter vários accounts (um estabelecimento recebe pagamentos no BB e no Itaú, por exemplo), então o campo accountId é usado para que você faça essa identificação. Qualquer dúvida estou a disposição, Grande abraço!
  16. Comentário originalmente feito por: leandro pelo que entendi, a api não realizará a movimentação financeira em si, servirá apenas para gerar a transação, a outra parte ainda terá que realizar o pagamento através de app, ou seja não servirá para automatizar o pagamento de fornecedores, apenas para o recebimento.
  17. Comentário originalmente feito por: sandropascoal Obrigado Lucas. Bom, então consigo fazer pagamentos e recebimentos dependendo de quem eu colocar como cpf/cnpj pagador e a account recebedora, certo? Agora fiquei com outra dúvida. Você respondeu para o Daniel_Barzilay que por hora a API só pode ser usada para recebimento através do PIX. Link da resposta para o Daniel: Transferencia e pagamento PIX Consigo fazer as duas operações? Na página “Exlicando cada passo”, o “3-Cadastrar uma company”, entendi que essa “company” é o meu cliente do ERP. Vou cadastrar as “accounts” desta company. Uma vez cadastrada posso usar o endpoint “Criar PIX dinâmico” manipulando quem será o pagador “payerCpfCnpj” e o recebedor “accountId”. É isso?
  18. Comentário originalmente feito por: @lucas.gusmao Boa noite Matheus, como vai? Em resumo, ele é o gerente de relacionamento do correntista! Ele é responsável pela identificação e oferta de serviços financeiros do banco para o correntista, que vão de encontro com as necessidades do negócio. Qualquer dúvida estou a disposição, Obrigado!
  19. Comentário originalmente feito por: @lucas.gusmao Olá Wendell, boa noite! Como vai? Estamos estudando o modelo comercial e em breve teremos novidades. Como participantes do grupo piloto, vocês receberão a informação em primeira mão. Qualquer dúvida estou a disposição, Obrigado!
  20. Comentário originalmente feito por: @lucas.gusmao Olá Sandro, boa tarde! Como vai? É isso mesmo, você entendeu o processo corretamente! O payerCpfCnpj é quem vai realizar o pagamento do PIX (QRCode) e o accountId é a conta de quem vai receber o crédito na conta. Qualquer dúvida estamos a disposição, Obrigado!
  21. Comentário originalmente feito por: wendellbmilhomem24 Eu acho que vc´s deveriam incluir essa API PIX na mesma API de Pagamentos/Boletos e cobrar apenas a adesão de quem já utiliza!
  22. Comentário originalmente feito por: sandropascoal Lucas, pode confirmar se entendi certo o processo que li na documentação? O POST “Criar PIX dinâmico” é uma transação onde o “payerCpfCnpj” está fazendo um CRÉDITO em favor do “accountId”, e, esse “accountId” deve estar cadastrada em “accounts”. Se meu cliente, que usa meu ERP, quiser receber um valor ref a uma NFe emitida, o destinatário da NFe será o “payerCpfCnpj” e a “accountId” é a conta do cliente ERP. O inverso, se meu cliente ERP for fazer um pagamento para um fornecedor, o “payerCpfCnpj” é o CNPJ do cliente ERP e o “accountId” é da conta do fornecedor cadastrada em “accounts”
  23. Comentário originalmente feito por: @lucas.gusmao Você pode fazer a chamada através da seguinte URL -> http://a47d737df99d09c13.awsglobalaccelerator.com/ Ela é temporária! No mês que vem vamos definir o domínio e atualizaremos a nossa documentação. Obrigado pela informação e qualquer dúvida estamos disponíveis! Obrigado!
  24. Comentário originalmente feito por: "Rodolfo" Boa tarde… Devo mandar uma requisição para o endpoint, mas qual seria essa URL???
  25. Comentário originalmente feito por: "MatheuSkindrow" o que seria o gerente de cash management?
×
×
  • Create New...