Detectando vazamentos de memória no Delphi: uma lista definitiva das ferramentas

Detectar vazamentos de memória é uma tarefa muito importante no desenvolvimento em Delphi. Já escrevi sobre isso antes, reforçando que em aplicações servidores como aquelas construídas com o TMS XData, isso é ainda mais importante.

Com a proximidade do lançamento do Delphi 10.4, isso será ainda mais relevante. Um gerenciamento de memória unificado no Delphi vem sendo prometido desde o ano passado e ao que parece, virá nessa nova versão.

Como tudo na vida, essa mudança não é 100% boa ou ruim, há vantagens e desvantagens, mas uma coisa é clara: a forma como a memória é gerenciada será a mesma em todas as plataformas, portanto as formas de detectar vazamentos de memória nas diferentes plataformas serão similares. Pessoalmente eu acho que isso é uma coisa boa. Também é importante notar que isso não significa que teremos mais vazamentos nas aplicações mobile. O mecanismo ARC “antigo” (ainda vigente enquanto escrevo este artigo) também apresenta problemas de vazamentos e, na minha opinião, mais difíceis de detectar, como por exemplo quando lidamos com referências cíclicas.

Mas essa introdução já está longa demais: o humilde propósito deste artigo é ser uma lista atualizada e definitiva de todas as ferramentas que você pode usar para detectar vazamentos de memória no Delphi. O fato de que a forma de gerenciamento da memória será unificado apenas significa que essas ferramentas estão mais relevantes do que nunca: detectar e corrigir vazamentos de memória no Windows irá ajudá-lo ainda mais para que suas aplicações não-Windows não vazem memória também.

Então, vamos à lista!

FastMM (Grátis)

FastMM (ou sendo mais específico, FastMM4) é a ferramenta padrão de-facto para detectar vazamentos de memória no Delphi. O motivo é simples: é o gerenciador de memória default do Delphi, portanto já está incluído e pronto pra usar.

Já que é o FastMM mesmo que aloca e libera a memória da sua aplicação, quem poderia reportar melhor os blocos de memória que não foram liberados? Tudo que você precisa pra começar a usá-lo é adicionar uma única linha de código ao seu projeto:

ReportMemoryLeaksOnShutdown := True;

E voilà, sua aplicação irá mostrar todos os vazamentos de memória quando ela terminar. Se houver vazamentos, uma janela será apresentada listando todos os vazamentos detectados.

Todos os desenvolvedores Delphi deveriam adicionar essa linha nas duas aplicações. Sério. Eu nem sei por que isso não é feito por padrão pelo Delphi, pelo menos tendo a linha envolvida pela diretiva {$IFDEF DEBUG}. Talvez por razões históricas.

Bom, se já está disponível e funciona, por que não terminamos este artigo por aqui e pronto? É que tem alguns detalhes.

O Delphi inclui uma versão reduzida do FastMM4. Ele não possui todos os recursos avançados de depuração e detecção que você precisaria (pra saber, por exemplo, qual linha de código foi alocada a memória que vazou). Pra isso, você tem que usar a versão completa do FastMM4, disponível no repositório público do FASTMM4 no GitHub.

Você também tem que usar uma DLL externa para usar os recursos avançados; não é multiplataforma: só funciona oficialmente no Windows (parece que há uma versão macOS disponível no repositório principal, mas nunca testei). E apesar de ter muitos recursos avançados, pra usá-los você tem que configurar manualmente o arquivo .INC, o que pode não ser muito confortável para alguns usuários.

De qualquer forma, é uma boa ferramenta, a ferramenta “padrão” do Delphi pra detecção de vazamentos de memória. (Nota: o FASTMM5 acabou de ser lançado. Não testamos ele ainda, mas parece que melhorou muito a performance para aplicações multithread, estamos ansiosos para testá-lo com o TMS XData.)

Vantagens

  • Grátis;
  • Código-fonte completo;
  • Incluído no Delphi;
  • Fácil pra começar a usar;
  • Vários recursos avançados.

Desvantagens

  • Somente para Windows;
  • Requer DLL externa para os recursos avançados;
  • Não é amigável pra usar os recursos avançados (não há uma interface-visual);
  • Somente reporta vazamentos de blocos de memória alocados pelo FastMM.

LeakCheck (Grátis)

Delphi LeakCheck é outra excelente opção para detecção de vazamentos de memória. Também é grátis, open source e tem algumas vantagens em relação ao FastMM: é multiplataforma, o que significa que você pode detectar vazamentos diretamente em suas aplicações mobile ou Linux; e integra muito bem com frameworks de teste unitário (mais precisamente DUnit and DUnitX).

A forma de usar também é semelhante à do FastMM: adicione a unit LeakCheck como a primeira unit da cláusula uses do seu dpr, e ele irá se plugar e estará pronto pra uso. Configurar pra uso em teste unitário é um pouco mais complicado, mas isso é esperado e faz parte.

Uma pequena desvantagem é que você estará praticamente por sua conta e risco: o projeto não vem tendo atualizações já há algum tempo (o que não é necessariamente um problema já que ele funciona bem). Mas provavelmente significa que você não conseguirá ajuda diretamente do autor (nunca tentei, pra ser justo). Também não há muita informação sobre ele na internet, encontrei apenas um único artigo que explica como usá-lo, além da descrição no repositório oficial dele no Bitbucket.

Vantagens

  • Grátis;
  • Código-fonte completo;
  • Multiplataforma;
  • Integra bem com bibliotecas de teste unitário (DUnit and DUnitX).

Desvantagens

  • Não há muita informação disponível sobre como usá-lo;
  • Não há atualizações recentes nem suporte oficial;

Deleaker (Comercial)

Delaker é a única ferramenta comercial desta lista que é dedicada exclusivamente a detecção de vazamentos de memória. Isso reflete no produto, que fornece diversas excelentes ferramentas pra isso.

Diferentemente das duas ferramentas anteriores, e similar às seguintes, o Deleaker oferece uma interface visual amigável pra você configurar o ambiente e ver os resultados, que pode ser usada tanto integrada à IDE do Delphi como separadamente. Ele também detecta muitos mais tipos de vazamento de memória: vazamentos de GDI, vazamentos de objetos e handles Windows, em DLLs de terceiros, etc. Justamente por causa disso, ele também oferece opções pra você facilmente ignorar vários tipos de vazamentos – se não fosse isso você iria ter um zilhão de notificações de vazamentos mesmo em aplicações simples.

Outro recurso interessante é a possibilidade de fazer snapshots da memória alocada. Isso permite detectar vazamentos não somente da aplicação como um todo mas em trechos específicos dela.

Vantagens

  • GUI amigável que pode ser usada integrada à IDE do Delphi ou separadamente;
  • Detecta todos os tipos de vazamento de memória;
  • Linha de comando para integração CI;
  • Snapshots do uso da memória;
  • Suporte oficial.

Desvantagens

  • License paga ($99 para Home License, $399 para Single Developer License);
  • Somente Windows;

EurekaLog (Comercial)

EurekaLog é uma ferramenta que já está no mercado há décadas. Não achei nenhuma informação no website a respeito de quando a primeira versão foi lançada, mas a informação mais antiga é do EurekaLog 4.0 que foi lançado em 2002, simplesmente há 18 anos.

Não é uma ferramenta dedicada exclusivamente à detecção de vazamentos de memória. Em vez disso, oferece uma vasta gama de recursos. O objetivo do EurekaLog é detectar vários problemas na sua aplicação – exceções, vazamentos, etc. – do lado do cliente, reportando eles pra você.

Portanto, é uma excelente ferramenta pra melhorar a qualidade do seu software e oferecer um bom suporte aos seus clientes, já que você irá obter informações de vazamentos e erros de todos os seus clientes, em diferentes ambientes, fazendo diferentes operações no seu sistema.

Vantagens

  • Detecta tanto vazamentos de memória como vazamentos de resources;
  • Vazamentos e erros detectados durante o uso pelo cliente são enviados automaticamente a você;
  • Vários outros recursos: relatório de bugs, integração com sistemas de controle de bugs, entre outros;
  • Suporte oficial.

Desvantagens

  • Licença paga ($149 para Professional License, $249 para Enterprise License);
  • Somente Windows;
  • Não oferece recursos muito avançados para detecção de vazamentos de memória especificamente.

madExcept (Comercial)

Costumo dizer que o MadExcept é “primo” do EurekaLog. Ambos estão disponíveis há um tempo parecido (cerca de 20 anos ou mais). Compartilham recursos similares. Têm mais ou menos o mesmo propósito. E assim por diante.

E curiosamente, não há um “vencedor”. Se você procurar na web por comparações entre os dois, vai encontrar várias e não vai chegar a uma conclusão sobre qual é o melhor. Usuários de ambos os produtos estão geralmente satisfeitos e geralmente não podem comentar sobre o concorrente porque nunca usaram. É o meu caso, inclusive. Sou um satisfeito cliente do EurekaLog (apesar de não usá-lo pra detectar vazamentos de memória) e nunca usei o madExcept. Mas poderia simplesmente ser o contrário. Acredito que estaria bem servido com o madExcept também.

Assim, considerei as vantagens e desvantagens do madExcept iguais às do EurekaLog. Talvez a única diferença visível é que enquanto o madExcept é mais barato (existe inclusive uma versão grátis para uso não-comercial), o EurekaLog vem sendo mantido e atualizado com muito mais freqüência.

Vantagens

  • Grátis para uso não-comercial;
  • Detecta tanto vazamentos de memória como vazamentos de resources;
  • Vazamentos e erros detectados durante o uso pelo cliente são enviados automaticamente a você;
  • Vários outros recursos: relatório de bugs, integração com sistemas de controle de bugs, entre outros;
  • Suporte oficial.

Desvantagens

  • Licença paga (€149 para licença com código-fonte completo);
  • Somente Windows;
  • Não oferece recursos muito avançados para detecção de vazamentos de memória especificamente.

AQTime Pro (Comercial)

AQTime é um utilitário top de linha pra auxiliá-lo a melhorar o seu código. É realmente alto padrão, oferecendo não somente recursos avançados pra detecção de vazamentos de memória, (com uma interface visual amigável, monitoramento da memória alocada, snapshots, vazamentos de resources, entre outros), mas também recursos de análise de performance, code coverage, análise de código, entre outros.

É uma ferramenta realmente fantástica, mas tem seus defeitos: é extremamente cara, e está de certa forma em “modo manutenção” – recebe em média uma atualização ou menos por ano, e as novidades são basicamente “suporte à nova versão do Delphi”. Um par de bugs são corrigidos e praticamente não há novos recursos. Ainda assim, não há ferramenta equivalente no mundo Delphi quando se trata de facilidade de uso e recursos poderosos.

Vantagens

  • Detecta vazamentos de memória, resources, GDIs, entre outros;
  • Monitor de alocação de memória em tempo real;
  • Snapshots;
  • Várias outras ferramentas no pacote (performance profiler, code coverage, etc.).

Desvantagens

  • Licença cara ($719 para um node-locked license, $2279 para um node-floating license);
  • Somente Windows.

Nexus Quality Suite (Comercial)

Da mesma forma que acontece entre o EurekaLog e o madExcept, acredito que o Nexus Quality Suite é bem parecido com o AQTime. Ambas as ferramentas fornecem diversas ferramentas para melhorar a qualidade do seu software.

O Nexus Quality Suite oferece detecção de vazamentos de memória e resources, mas também profilers de performance, code coverage e até uma ferramenta de teste de interface visual automatizado.

Eu não testei a ferramenta de detecção de vazamento de memória, então as vantagens e desvantagens serão baseadas apenas no que li do site:

Vantagens

  • Detecta vazamentos de memória e resources;
  • Suporte oficial, fóruns de suporte ativos;
  • Várias outras ferramentas no pacote.

Desvantagens

  • Licença paga (AUD 490, cerca de $300);
  • Somente Windows.

DDDebug (Comercial)

Do site deles: DDDebug é uma coleção de ferramentas de depuração que contém vários módulos: um profiler de memória, um visualizador de threads, um visualizador de módulos, e um tratador de exceções melhorado.

Um aspecto interessante que notei é que abordagem do DDDebug é um pouco diferente: ele fornece as estatísticas de uso da memória imediatamente, de dentro da aplicação. Eu não cheguei a testar mas parece facilitar bastante a detecção de bugs, permitindo que você interaja na aplicação ao mesmo tempo que a analisa.

Também funciona com packages o que é uma vantagem, fornece outras funções além de detecção de vazamentos de memória e, apesar de ser uma ferramenta paga, o preço é bem acessível.

Vantagens

  • Fornece os resultados através de uma interface visual de dentro da sua própria aplicação;
  • Suporta packages;
  • Suporte oficial;
  • Preço acessível (a partir de €59).

Desvantagens

  • Somente Windows.

Spider (Grátis)

O website do Spider lista vários recursos interessantes: análise de exceções, análise de uso da memória em tempo real, vazamentos de memória, análise do call stack, etc.

O problema é que, desta lista, é uma ferramenta que testei uma única vez, e fiquei meio confuso com a interface visual e os resultados obtidos. Eu não consegui usar, mas talvez seja minha culpa. Então está listada aqui, mas não posso dar um parecer justo sobre a ferramenta.

Vantagens

  • Grátis;
  • Código-fonte disponível;

Desvantagens

  • Operação confusa (minha opinião);

Ferramentas não-Delphi

Além das ferramentas acima que são específicas para o Delphi, ou pelo menos também cobrem aplicações Delphi explicitamente – seja integrando ao código-fonte, ou à IDE, etc. – também há ferramentas de uso geral para detecção de vazamentos de memória que podem ser úteis em algumas situações.

Valgrind (Grátis)

O Valgrind é uma ferramenta que possui vários módulos. Um deles é o memcheck, que irá ajudá-lo a detectar vazamentos de memória na sua aplicação.

Eu uso o Valgrind pra detectar vazamentos de memória em aplicações Linux, e na verdade é muito simples de usar: apenas execute o utilitário valgrind e passe via parâmetro de linha de comando o caminho da aplicação que você quer testar. O Valgrind irá executar a aplicação e ao final dela irá fornecer um relatório detalhado incluindo os vazamentos de memória. Claro que há várias opções na linha de comando que permitem a você salvar os resultados em arquivo, escolher o tamanho do call stack reportado, o detalhamento das detecções, etc.

Instruments (Grátis)

Apple Instruments é uma ferramenta poderosa e flexível para análise de performance e teste de aplicações, fazendo parte do conjunto de ferramentas do Xcode. Entre outras coisas, pode ser usado para detectar vazamentos de memória em aplicações iOS e macOS. O Adrian Gallero escreveu um excelente artigo no blog da TMS Software sobre como usar o Instruments para detectar vazamentos de memória no iOS. O post já é um pouco antigo, mas acredito que ainda seja válido.

Conclusão

Não há um vencedor. Cada ferramenta tem suas vantagens e desvantagens e é interessante notar que uma não exclui a outra. Na verdade eu uso diversas delas, em diferentes situações e necessidades.

Eu uso o FastMM para detecções de vazamentos de memória no “dia-a-dia”. O LeakCheck em testes unitários. O Deleaker quando quero verificar outros tipos de vazamentos e usar snapshots. O EurekaLog para relatório de bugs das minhas aplicações usadas pelos usuários finals. O AQTime para análise de performance e o Valgrind para detectar vazamentos no Linux. Como você pode ver, todas tem sua utilidade!

O mais importante é: não deixe sua aplicação vazar memória! Se você está apenas começando neste assunto, tudo que você tem que fazer é:

ReportMemoryLeaksOnShutdown := True;

Adicionar a linha acima ao seu projeto e começar a detectar vazamentos de memória!

(Você conhece alguma outra ferramenta que deveria estar na lista? Você tem uma opinião diferente sobre alguma das ferramentas listadas? Deixe seu comentário e compartilhe seu conhecimento para fazer dessa lista a lista definitiva sobre o assunto. Ela será atualizada frequentemente à medida que soubermos de mais informações).

Uma discussão interessante sobre replicação de dados com TMS Echo

Esta é mais uma das muitas discussões interessantes que tivemos no TMS Business Masterclass em Düsseldorf. Uma delas foi a curiosa discussão sobre field de class ter o nome prefixado com “F” maiúsculo ou não.

Esta é um pouco mais técnica, mas não menos interessante. O assunto era sobre replicação de dados usando o TMS Echo, e a discussão era sobre como as alterações eram enviadas (movidas) e um ponto (nó) a outro.

A questão levantada foi sobre o “servidor” ou “controller” que estaria orquestrando toda essa “movimentação” dos dados alterados. Respondi que não existe um “servidor” (no sentido de que não é um orquestrador central, o sistema é distribuído e pode operar de forma independente de outros nós), somente para me contradizer minutos depois dizendo que é necessário um “servidor” (mas consegui – espero – explicar a contradição).

Uma discussão divertida e interessante, espero que goste e, depois de assistir o vídeo, deixou a questão pra você: há um servidor, ou não? Deixe seu comentário!

A propósito, o conteúdo completo do evento está disponível aqui: TMS Business Masterclass Online.

TMS Business Masterclass disponível online

No mês de novembro de 2019, aconteceu o TMS Training Days 2019 em Düsseldorf, Alemanha e em Wevelgem, Bélgica. Foi o maior evento da TMS Software da história, três dias inteiros em duas cidades diferentes, com o time da TMS vindo de nove países diferentes do planeta.

Foi um evento presencial e mesmo antes do evento começar, pessoas de várias partes do mundo entraram em contato conosco perguntando se poderiam assistir o evento online, já que para eles seria difícil viajar para estar fisicamente presente no evento.

Então, também pela primeira vez, partes de um evento TMS agora estão disponíveis em vídeo, online. Você terá a oportunidade de assistir ambos os eventos TMS Business Masterclass na íntegra – o de Düsseldorf, e o de Wevelgem.

E cuidamos para prover o material com a maior qualidade possível:

  • O audio do instrutor está excelente e as gravações de tela estão disponíveis, é claro.
  • As imagens de uma segunda câmera usada para gravar o instrutor também estão disponíveis, dando uma sensação maior de imersão no evento.
  • Perguntas dos participantes não estavam muito audíveis, mas tivemos todo o trabalho de legendar a maioria das perguntas de modo que você possa entender e acompanhar tudo que está sendo discutido!
  • A gravação completa foi totalmente revisada e quebrada em vários pequenos vídeos, de modo que você não precisa ficar assistindo um vídeo gigante de 8 horas sem nenhum contexto. Assim você terá todo o conteúdo quebrado em pequenas “aulas” com o assunto discutido em cada uma delas. Algumas chegam a ter um ou dois minutos apenas. Desse modo você pode realmente focar no conteúdo desejado e encontrar o conteúdo de forma mais eficiente!

Use os links abaixo para obter mais informações sobre o curso, imagens do evento, visualizar a ementa completa, assistir algumas aulas gratuitas e, é claro, se inscrever no curso!

TMS Business Masterclass em Düsseldorf ($49)

TMS Business Masterclass em Wevelgem ($49)

TMS Business Masterclass Bundle ($79)

A inscrição é apenas $79 (dólares) para ambos os cursos, ou apenas $49 (dólares) para um curso. É importante salientar que todo o curso é em inglês.

Pra terminar este artigo, deixo aqui uma das minhas partes preferidas. Por acaso, quando você cria fields nas classes do Delphi, você prefixa o nome com “F” (maiúsculo)? Parece que isso não é unanimidade… 😉

O maior evento TMS da história

Prepare-se! Em novembro de 2019 acontece o maior evento TMS da história: TMS TRAINING DAYS 2019. Membros da equipe TMS de nove países diferentes falarão sobre desenvolvimento Delphi, bibliotecas e componentes TMS, em palestras que variam do nível básico até o avançado.

Training Days em Dusseldorf (Alemanha)

Nos dias 14 e 15 de novembro acontecem dois dias de treinamento em Dusseldorf, na Alemanha. O evento acontecerá no Lindner Hotel Airport.

Veja abaixo a programação completa para os dois dias.

TMS Business Masterclass
14 de Novembro – Dusseldorf, Alemanha

Bruno Fierens

9h00: Boas-vindas e Introdução (Bruno Fierens)
Boas-vindas a todos os participantes e introdução à programação.


Wagner Landgraf

9h15: Sessão 1 – O Mundo TMS Business (Wagner R. Landgraf) 
Uma jornada pelo mundo do pacote TMS Busines. Iremos aprender sobre as soluções incluídas no TMS Business: os componentes incluídos, as bibliotecas, os casos de uso, o contexto histórico de cada um deles e as motivações para seu desenvolvimento. Produtos analisados: TMS Scripter, TMS Diagram Studio, TMS Workflow Studio, TMS Data Modeler, TMS Aurelius, TMS Sparkle, TMS RemoteDB, TMS XData, TMS Echo, TMS Logging. 
*Nível BIZ: Iniciante


10h00: Coffee break


10h30: Sobre o livro TMS Aurelius (John Kouraklis)
O autor de livros técnicos John Kouraklis fala sobre seu mais recente livro dedicado ao TMS Aurelius e as experiências relacionadas a escrevê-lo.


Wagner Landgraf

11h00: Sessão 2 – Curtindo os Bancos de Dados (Wagner R. Landgraf) 
Uma conversa sobre novas formas de lidar com bancos de dados: O que é uma framework ORM? O que você pode usar para modelar seus bancos de dados. Produtos analisados: TMS Aurelius, TMS Data Modeler.
*Nível BIZ: Intermediário


Wagner Landgraf

12h00: Sessão 3 – Sua App em Todo Lugar: REST API (Wagner R. Landgraf) 
Multicamadas, nuvem, REST, HTTP, SSL: O que, por que, quando e, principalmente, como? Aprenda o que significa um servidor REST, por que você irá se beneficiar em migrar sua aplicação para a nuvem e como fazê-lo de forma RAD. Produtos analisados: TMS XData, TMS Sparkle.
*Nível BIZ: Intermediário


13h00: Almoço


Wagner Landgraf

14h00: Sessão 4 – Os Heróis Anônimos (Wagner R. Landgraf) 
Uma análise mais profunda de três produtos TMS Business que trazem soluções para problemas que você nunca pensou que tinha. Aplicações customizadas pelo usuário, alteração de regras de negócio em runtime, sincronização de dados offline, e migração de sua aplicação para a nuvem em poucos dias. Produtos analisados: TMS Scripter, TMS Echo, TMS RemoteDB.
*Nível BIZ: Iniciante


Wagner Landgraf

15h00: Sessão 5 – Falando Sério sobre a Nuvem (Wagner R. Landgraf) 
Técnicas e conceitos avançados sobre construir servidores REST API: Segurança, processamento em background e análise de códigos do mundo real. Produtos analisados: TMS XData, TMS Sparkle.
*BIZ level: Advanced 


16h00: Coffee break


Wagner Landgraf

16h30: Session 6: Todos Juntos (Wagner R. Landgraf) 
Uma sessão bastante interativa onde serão apresentadas todas as ideias da equipe TMS para o futuro do TMS Business. Iremos discutir o roadmap, faremos um brainstorm sobre as possibilidades e teremos uma sessão de perguntas e respostas.


17h30: Encerramento


TMS DEV Intensive
15 de Novembro – Dusseldorf, Alemanha

Bruno Fierens

9h00: Boas-vindas e Introdução (Bruno Fierens)
Boas-vindas a todos os participantes e introdução à programação.


Bruno Fierens

9h15: TMS VCL UI Pack: Novidades (Bruno Fierens)
O que é de novo e porvir em controles VCL: high-DPI, VCL styles, Office styles, images.


Marion Candau

10h15: Usando o TMS Cryptography Pack para assinar arquivos PDF (Marion Candau)
Marion irá mostrar como assinar documentos PDF usando um token USB com o TMS Cryptography Pack. Serão explicados os mecanismos de criptografia e uma assinatura eletrônica, e o processo de assinatura.


10h45: Coffee break


Adrian Gallero

11h15: TMS Flexcel 7.0: Usando as novas features (Adrian Gallero)
Adrian irá mostrar como criar aplicações para exportar dados para Excel e PDF, usando as últimas novidades introduzidas no Flexcel 7. Também serão mostradas os futuros planos para o Flexcel.


12h15: Almoço


José León Serna

13h15: Novos novos produtos de impacto para o mundo Delphi (José León Serna / Bruno Fierens)
Há mais de um ano, Bruno Fierens, CEO da tmssoftware.com entrou em contato com José Leon Serna para discutir futuras oportunidades para desenvolvedores Delphi. Desde então, uma intensa colaboração começou e nessa sessão os frutos dessa parceria serão mostrados.


Roman Yankovsky

14h15: Usando TMS FixInsight para deixar seu código mais robusto (Roman Yankovsky)
Roman mostrará como usar a análise de código do FixInsight no Delphi para encontrar bugs no seu código, antes que seus clientes façam isso!


15h15: Coffee break


Roman Kassebaum

15h45: TMS WEB Core v1.3 para web, aplicações multiplataforma com Electron e PWA (Bruno Fierens / Roman Kassebaum)
Junto com Bruno Fierens, Roman Kassebaum, arquiteto da integração do TMS WEB Core com a IDE do Delphi, irá mostrar os novos recursos e possibilidades do TMS WEB Core versão 1.3.


Holger Flick

16h45: Misturando tudo: Usando TMS XData backend e TMS WEB Core + TMS FNC UI como front-end (Holger Flick)
Muitas frameworks, muitas plataformas: TMS tem todas as ferramentas. Você já leu sobre isso, mas como usar todas essas tecnologias juntas? Em resumo, você verá um exemplo prático usando TMS XData, TMS RemoteDB, TMS Web Core, VCL, and FNC.


17h45: Perguntas e Respostas e Encerramento. 


Training Day em Wevelgem (Bélgica)

No dia 18 de novembro, haverá um segundo TMS Business Masterclass em Wevelgem, Bélgica. O evento acontecerá na sede da TMS Software. É também uma oportunidade para conhecer a equipe da TMS!

As palestras serão similares à do TMS Business Masterclass em Dusseldorf no dia 14 de Novembro, portanto segue a agenda simplificada. Todas as palestras serão apresentadas por Wagner Landgraf e Bruno Fierens.

TMS Business Masterclass
18 de Novembro – Wevelgem, Bélgica

Palestrantes:

Bruno Fierens
Wagner Landgraf

9h00: Boas-vindas e Introdução (Bruno Fierens)


9h15: Sessão 1 – O Mundo TMS Business (Wagner R. Landgraf) 


10h00: Coffee break


10h30: Sessão 2 – Curtindo os Bancos de Dados (Wagner R. Landgraf)  


11h30: Sessão 3 – Sua App em Todo Lugar: REST API (Wagner R. Landgraf) 


12h30: Almoço


13h30: Sessão 4 – Os Heróis Anônimos (Wagner R. Landgraf) 


14h30: Sessão 5 – Falando Sério sobre a Nuvem (Wagner R. Landgraf) 


15h30: Coffee break


16h00: Session 6: Todos Juntos (Wagner R. Landgraf) 


17h00: Encerramento


PALESTRANTES

Adrian Gallero (Uruguay)

Adrian Gallero é um engenheiro elétrico que trabalha com Delphi desde o Turbo pascal 4. Ele trabalhou no cálculo da distribuição de linhas de energia para empresas elétricas em Montevidéu e no Rio de Janeiro. Viveu por mais de 3 anos em Madri, trabalhando no desenvolvimento de um sistema de gerenciamento de telecomunicações, e mais de um ano em Sydney desenvolvendo soluções personalizadas para uma empresa de expedição de carga.

Ele trabalha com planilhas há mais tempo do que se lembra e, em 1996, desenvolveu um pequeno componente que permitia que seus aplicativos Delphi 1 exportassem os resultados para uma planilha (para sua surpresa, ele aprendeu há um ano que a empresa elétrica ainda está usando esses aplicativos até hoje sem modificações). Esse componente cresceu ao longo dos anos: foi renomeado para FlexCel em 2001 e ingressou na família TMS em 2002. Atualmente, o FlexCel existe nas versões Delphi e .NET e contém mais de um milhão de linhas de código.


Bruno Fierens (Bélgica)

  • Estudou engenharia eletrônica na universidade de Ghent, Bélgica (1987-1992).
  • Iniciou uma carreira como engenheiro de hardware digital de P&D na Barco Graphics Belgium, projetando com FPGA, VHDL, processadores gráficos, PCI, placas complementares Silicon Graphics, controladores de impressoras de ponta, …
  • Começou a escrever software no Turbo Pascal 3.0 desde 1987 e usou todas as versões do Borland Pascal e Delphi desde então.
  • Fundou a TMS Software em 1996, desenvolvendo componentes VCL começando com Delphi 1.
  • A TMS Software se tornou o Borland Technology Partner em 1998 e desenvolveu os componentes de grid premiados pela Delphi Informant.
  • A partir de 2011, os surgiram os componentes multiplataforma FireMonkey, para Windows, macOS, Android e iOS.
  • Em 2016, a TMS Software lançou o FNC, uma arquitetura de componentes que permite usar controles visuais em aplicativos VCL, FMX e LCL.
  • Em 2018, a TMS Software lançou o TMS WEB Core, uma framework para criar aplicações Web usando o ObjectPascal.
  • Atualmente gerencia a equipe de desenvolvimento de VCL, FMX, Web, .NET, IoT, LCL, REST, node.js.
  • É palestrante frequente em conferências (Be-Delphi, DelphiTage, ITDevCon, CodeWay Tour, EKON, DevTracks, SDN, ..).
  • Disponível para consultoria e desenvolvimento de projetos personalizados.
  • Bruno Fierens foi nomeado Embarcadero MVP em 2012.
  • Área de interesse especial são design de interfaces de usuário, UX, desenvolvimento de software RAD, hardware / eletrônicos.

Holger Flick (Estados Unidos)

Desde 1996, o Dr. Holger Flick usa o Delphi como sua principal plataforma de desenvolvimento e tem sido um membro ativo da comunidade. Ele estudou ciência da computação na Universidade de Dortmund e depois escreveu sua dissertação na Universidade Ruhr, em Bochum, no campo da telemedicina. Por sua paixão e conhecimento de Delphi, ele foi nomeado “Delphi MVP” em 2016.

Em 2019, Holger mudou-se para os Estados Unidos da América (EUA) e fundou sua nova empresa FlixEngineering LLC. A empresa se concentra em consultoria, treinamento e desenvolvimento de software usando linguagens de programação orientada a objetos como Delphi, C #, Swift e Objective-C. Holger faz parte da família TMS Software, fornecendo sua experiência como evangelista e engenheiro de controle de qualidade.


John Kouraklis (Reino Unido)

John Kouraklis começou a usar computadores aos 16 anos e desde então vem usando Pascal, desde o Turbo Pascal até as últimas versões do Delphi, inicialmente como hobby depois como uma profissão durante a maior parte de sua vida adulta. Ele desenvolveu uma ampla gama de aplicações, de software financeiro a ferramentas de engenharia reversa. Nos últimos anos, ele ensina administração e programação em cursos de graduação e pós-graduação. Ele é o autor do MVVM em Delphi (Apress, 2016) e Introdução ao Delphi ORM – ORM com TMS Aurelius (julho de 2019).


José León Serna (Espanha)

Criador do Delphi para PHP / HTML5 Builder e ex-diretor de engenharia e gerente de filial da Embarcadero Technologies entre 2010 e 2016. Embora a filial da Embarcadero tenha participado do desenvolvimento de vários produtos, ele foi o principal responsável pelo RAD Studio e, mais especificamente, pelo IDE . Ele participou ativamente da concepção e implementação de uma infinidade de novos recursos, especialmente focados no desenvolvimento de vários dispositivos. Ele esteve envolvido no desenvolvimento de IDE na maior parte de sua carreira e é a área em que ele mais gosta.


Marion Candau (França)

  • PhD em criptografia
  • Desenvolvedora da Cyberens, uma empresa francesa de segurança cibernética localizada em Bordeaux.
  • Arquiteta do TMS Cryptography Pack.
  • Embarcadero MVP.
  • Ela desenvolve principalmente aplicativos relacionados à segurança cibernética e aconselha os clientes a usar ferramentas e bibliotecas criptográficas em seus próprios aplicativos.

Roman Kassebaum (Alemanha)

Roman Kassebaum é freelancer. Ele começou a trabalhar com o Delphi em 1996, depois de se formar em mestrado pela Universidade de Paderborn. Ele é um MVP do Delphi e um parceiro tecnológico da Embarcadero. Nos últimos anos, se tornou membro da grande equipe da TMS e também é um parceiro de consultoria certificado pela TMS. Roman é especialista em todos os tipos de projetos Delphi, incluindo componentes de negócios TMS e a avançada biblioteca TMS WEB Core para a qual ele criou a integração do Delphi IDE.


Roman Yankovsky (Rússia)

Roman Yankovsky é um Embarcadero MVP que trabalha com a Delphi desde o Delphi 2. Ele ingressou na equipe TMS em 2016. É gerente de produtos e arquiteto da ferramenta de análise estática FixInsight para Delphi.

Roman Yankovsky também é o autor do Delphi AST, uma framework open source para análise sintática para linguagem Delphi, que pode ser encontrada aqui: https://github.com/RomanYankovsky/DelphiAST. Essa excelente biblioteca é usada na extensão para Visual Studio OmniPascal.


Wagner Landgraf (Brasil)

  • Formado em Engenharia Eletrônica e Mestre em TI Industrial pela Universidade Tecnológica Federal do Paraná.
  • Mais de 24 anos de experiência (desde 1995) no desenvolvimento Delphi – desde Delphi 1.
  • Arquiteto e desenvolvedor principal de bibliotecas Delphi como TMS Aurelius, TMS XData, TMS RemoteDB, TMS Scripter, entre outros.
  • Gerente de produtos da TMS Software há mais de 20 anos.
  • Fundador do site landgraf.dev e da Nuvem Fiscal.

Bônus Especiais

Há também bônus especiais para os participantes do TMS Training Days!

Livro: Introducing Delphi ORM

Todos os participantes do TMS Business Masterclass em Dusseldorf (14 de novembro) receberão uma cópia gratuita do livro “Introducing Delphi ORM: Mapeamento Objeto-Relacional usando o TMS Aurelius”, escrito por John Kouraklis. Wagner Landgraf, autor do TMS Aurelius, foi um revisor técnico do livro.


Curso “Introdução ao TMS Web Core”: 50% de desconto

Todos os participantes do TMS Training Days receberão um cupom de 50% de desconto coupon para o curso online “Introduction to TMS Web Core”, da landgraf.dev. O instrutor Wagner Landgraf ensinará os conceitos desde o início: o que é um aplicativo da Web, como funciona, o que é o SPA (aplicativo de página única) e o MPA (aplicativo de página múltipla), o que é HTML, JavaScript, CSS, Bootstrap , AJAX. O código fonte completo dos exemplos é fornecido.


Descontos especiais para produtos TMS

A TMS Software também oferecerá descontos especiais para novas licenças de vários produtos TMS, para todos os participantes. Fique atento às ofertas!

Inscrição e mais informações

Você pode encontrar mais informações diretamente do site da TMS Software: TMS Training Days em Dusseldorf e TMS Business Masterclass em Wevelgen.

Valores para inscrição

Nov 14, TMS Business MasterClass: 295 EUR 
Nov 15, TMS Dev Intensive: 295 EUR
Nov 18, TMS Business Masterclass: 295 EUR

Oferta especial para os dois dias em Dusseldorf (14 e 15 de Novembro): 495 EUR 

Emissor NFC-e na nuvem? Confira na Embarcadero Conference!

No dia 22 de outubro de 2019, teremos mais uma edição da Embarcadero Conference. É o maior evento de Delphi do mundo, e acontece aqui no nosso país, em São Paulo. São centenas de participantes.

Nessa edição, assim como no ano passado, teremos sete palestras simultâneas em cada horário, todas acontecendo no mesmo auditório. Você escolhe qual palestra assistir selecionando o canal de áudio correspondente no seu fone de ouvido. A agenda completa está disponível no site do evento.

Com tantas palestras acontecendo ao mesmo tempo, dá até uma ansiedade em conseguir escolher qual palestra assistir. Mas se tem uma palestra que você não pode perder, é esta que vamos sugerir.

Nosso palestrante, Wagner Landgraf, estará apresentando a palestra “Anatomia de um emissor NFC-e na nuvem (REST API)“. Ah sim, estamos recomendando nossa própria palestra. Mas isso é uma mera coincidência, será muito interessante, acredite!

Por que “na nuvem”?

Ok, vamos dar uma palhinha aqui e adiantar algumas coisas. Uma delas é o “porquê”. Quando emitimos um documento fiscal (como NFC-e) com um sistema “na nuvem”, temos uma série de vantagens em relação à emissão do mesmo documento fiscal num sistema desktop ou mobile.

Só pra esclarecer aos mais iniciantes, um sistema “na nuvem” seria uma aplicação rodando na internet em um serviço como Amazon EC2/Lightsail, Microsoft Azure, etc. Isso ficaria acessível a de chamadas HTTP realizadas de qualquer lugar (outras aplicações desktop, outros sites, aplicações mobile, etc.). Isso traz inúmeras vantagens:

  • Um único e centralizado lugar pra configuração do ambiente de emissão (instalação de certificados, configuração de bibliotecas de criptografia, etc.)
  • Reduz o risco de problemas e custo de suporte em ficar configurando centenas de computadores nos clientes
  • Atualização e manutenção do sistema muito mais fácil – também não é necessário atualizar todos os clientes
  • Possibilidade de emitir NFC-e (e outros documentos fiscals) de qualquer plataforma (de uma aplicação desktop Windows, de uma aplicação mobile, até mesmo de um Raspberry PI, por que não?). Basta que haja conexão internet nessa plataforma.
  • Facilidade de desenvolver clientes em outras plataforma. Que tal desenvolver um PDV no mobile de forma muito fácil? Não há necessidade de portar e compilar bibliotecas complexas como emissores fiscais (ACBr por exemplo), geradores de relatório (FastReport, FortesReport), entre outros.

Dá pra falar mais um pouco?

Queremos você lá assistindo e interagindo! Mas pra atiçar um pouco a curiosidade, deixamos abaixo uma captura da tela de parte da documentação da API. Já dá pra ter uma ideia. Na conference iremos esmiuçar tudo isso!

Não é só isso…

Essa palestra será realmente interessante. Haverá mais uma surpresa que, temos certeza, causará um grande impacto em todos aqueles que trabalham com Delphi nessa área fiscal. Isso tudo é só o começo… Nos vemos na Embarcadero Conference 2019!

Bancos de Dados no Ecossistema Delphi: Webinar

No dia 10 de outubro a Softacom estará apresentando um webinar sobre “Bancos de dados no ecossistema do RAD Studio & Delphi. Processo de migração (legado para atualizado, para outro RDBMS), arquiteturas de camadas de dados (ORM), arquiteturas de acesso a dados (REST API)”.

Palestrantes

Wagner Landgraf da landgraf.dev será um dos palestrantes, falando sobre como o acesso a banco de dados evoluiu no Delphi desde suas versões iniciais, sobre Mapeamento Objeto Relacional (TMS Aurelius), Servidores API REST (TMS XData) e acesso remoto a bancos de dados (TMS RemoteDB).

Serge Pilko

Embarcadero MVP & CEO da Softacom

Wagner Landgraf

CEO da landgraf.dev / TMS Software Partner / TMS Business Product Manager

Bruno Fierens

Embarcadero MVP & CEO da TMS Software

O que você irá aprender

Para CEO / Gerentes / CTO / Diretores de TI / Gerente de Produtos:

  • Soluções Delphi atualizadas e frameworks para comunicação com bancos de dados;
  • Armadilhas na atualização do sistema e/ou migração para outro RDBMS;
  • Abordagens e práticas modernas com Delphi e RDBMS;
  • Arguments: vantagens de se utilizar Delphi e RAD Studio para sua aplicação multicamadas;

Para Desenvolvedores e Especialistas Técnicos:

  • Melhores práticas para desenvolver camadas de acesso a dados em projetos RAD Studio;
  • Como usar ORM para projetos Delphi;
  • Como desenvolver servidores REST API como um facade DB;
  • Dicas e truques para desenvolvedores diretamente dos arquitetos de frameworks e ferramentas para Bancos de Dados;

Principais Tópicos do Webinar

  • Padrões de acesso a dados 10-15 anos atrás e hoje
  • Armadilhas na migração de aplicações RDBMS legadas para versões atualizadas;
  • Prós e contras na migração para ORM em lugar de práticas tradicionais;
  • ORM para Delphi: TMS Aurelius – prós e contras da solução;
  • Prós e contras da migração para REST API em vez do uso “clássico” de acesso ao BD;
  • REST API server for Delphi ─ TMS XData. Prós e contras.

Somente para participantes do Webinar!

Não perca a chance de obter seu desconto promocional para novas licenças de produtos TMS Software e para a EKON conference!

Registration

Link para inscrição: https://www.softacom.com/en_softacom_october_webinar. *Todas as palestras em inglês.

5 Motivos para Usar Variáveis Inline no Delphi

O que é esse novo recurso de declaração de variáveis inline (inline variables) do Delphi, surgido na versão Rio 10.3?

Em resumo, é a possibilidade de se declarar uma variável em qualquer linha do seu código. Ou seja, você pode declarar uma variável da forma a seguir, dentro do bloco begin..end:

procedure Test;
begin
  var I: Integer;
  I := 22;
  ShowMessage (I.ToString);
end;

Muita gente já entendeu como esse recurso funciona, mas não entendeu por que ele é interessante. Neste artigo, vou mostrar essa nova funcionalidade com enfoque nas vantagens que ela traz.

1. Organiza seu código

A variável só passa a ser acessível a partir do ponto que ela é declarada. Pra muitas pessoas isso organiza melhor o código num método grande, pois é possível saber melhor onde aquela variável está sendo usada. Considere o seguinte código:

procedure Test;
var 
  A, B, C, D, E: Integer;
  Found, Done, Excluded: Boolean;
  Text: string;
begin
   // muitas
   // linhas
   // de 
   // código
end;

Pode ser confuso saber onde são usadas todas essas variáveis, quando elas estão sendo inicializadas, se ela já foi altera anteriormente, etc.. No código a seguir, sabemos que a variável Text por exemplo não existe no começo do código, e que ela só é utilizada ao final. Ninguém “mexeu” nela antes dessa parte do código:

procedure Test;
begin
   var A, C: Integer;
   // Não podemos usar o Text aqui!
   // linhas
   // de 
   // código
   
   var Text: string;
   // Text só pode ser usada aqui
end;

2. Minimiza bugs

Quem nunca cometeu esse deslize:

procedure Test;
var I: Integer;
begin
  for I := 0 to Count - 1 do
    Process;
  FazAlgoComI(I);
end;

Ou seja, usar a variável do for depois de terminado o loop. Isso não é seguro, e apesar do compilador emitir um warning pra isso, muitas pessoas o ignoram. Usando declaração inline do for, a variável só é válida dentro do for, e usá-la fora do bloco resultará em um erro de compilação:

procedure Test;
begin
  for var I: Integer := 0 to Count - 1 do
    Process;
  FazAlgoComI(I); // Erro de compilação!!
end;

A vantagem acima vem do fato de que o escopo das variáveis é limitado ao bloco em que elas são declaradas. Declarando as variáveis apenas dentro do escopo em que elas são usadas também minimiza a chance de erros. Por exemplo, suponha que você tem um código assim:

procedure Test;
var I: Integer;
begin
  I := CalculaAlgo;
  Persiste(I);
  // muuuuitas linha depois...
  Loga(I);
end;

Então você precisa refatorar esse código de modo que a primeira parte só aconteça em uma determinada condição. Você acha que só ali a variável I está sendo usada, e faz algo assim:

procedure Test;
var I: Integer;
begin
  if Condicao then
  begin
    I := CalculaAlgo;
    Persiste(I);
  end;
  // muuuuitas linha depois...
  Loga(I);
end;

Pronto, você esqueceu da última linha e talvez o valor de I não seja o que você espera. Alterando o escopo da sua variável para o bloco irá gerar erros de compilação caso a variável seja usada fora do bloco, o que vai lhe mostrar o problema imediatamente para você tomar uma decisão:

procedure Test;
begin
  if Condicao then
  begin
    var I: Integer;
    I := CalculaAlgo;
    Persiste(I);
  end;
  // muuuuitas linha depois...
  Loga(I); // Erro de compilação!
end;

3. Economiza digitação

Quem não quer mais produtividade? Se você puder digitar um pouco menos pra declarar uma variável, por que não? Agora é possível declarar e inicializar uma variável ao mesmo tempo:

procedure Test;
begin
  var I: Integer := 22; 
  ShowMessage (I.ToString);
end;

Mas não só isso. Há também a inferência de tipo, o que significa que na maioria dos casos você não precisa incluir o tipo da variável ao declará-la. Basta o código de inicialização para o Delphi saber qual é o tipo da variável.

Parece pouco? Imagine um caso onde o tipo da variável é uma coisa assombrosa usando generics:

procedure NewTest;
var
  MyDictionary: TObjectDictionary<string, TObjectList<TMyAmazingClass>>;
  Pair: TPair<string, TObjectList<TMyAmazingClass>>;
  List: TObjectList<TMyAmazingClass>;
begin
  MyDictionary := TObjectDictionary<string, TObjectList<TMyAmazingClass>>.Create;
  MyDictionary.Add('one', CreateList);
  Pair := MyDictionary.ExtractPair('one');
  List := Pair.Value;
  ShowMessage(List.Count.ToString);
end;

Com a declaração inline e a inferência de tipo, você pode reescrever o código desta forma:

procedure NewTest;
begin
  var MyDictionary := TObjectDictionary<string, TObjectList<TMyAmazingClass>>.Create;
  MyDictionary.Add('one', CreateList);
  var Pair := MyDictionary.ExtractPair('one');
  var List := Pair.Value;
  ShowMessage(List.Count.ToString);
end;

Melhor, não?

4. Aumenta a performance

O fato de as variáveis pertencerem a um escopo mais limitado (dentro de um bloco begin..end) pode até aumentar a performance do código!

Você pode ver mais detalhes sobre isso neste excelente artigo: Inline Variables can increase performance. Mas em resumo: a variável será inicializada apenas se e quando a execução entrar no código, e será finalizada imediatamente quando a execução sair do código. Ou seja, neste código:

procedure TestInlineVars(const ACondition: Boolean);
begin
  // BEFORE
  if (ACondition) then
  begin
    var S := 'Inline String';
    var I: IInterface := TInterfacedObject.Create;
    var F: TFoo;
    F.S := 'Managed Record';
  end;
  // AFTER
end;

As variáveis S, I e F são tipos gerenciados (string, interface e record). O compilador adiciona automaticamente código para inicializar e finalizar essas variáveis.

Se você chamar a procedure TestInlineVars milhões de vezes, isso terá um impacto grande. Porém com o código acima, essas variáveis só serão inicializadas caso ACondition seja verdadeiro e o bloco seja efetivamente executado. Menos código desnecessário sendo executado.

5. Facilita o uso de diretivas de compilação

Até em pequenas coisas esse recurso pode ajudar. Isso me chamou a atenção ao ler este post: Unexpected Benefit of Inline Variables: Conditional Blocks, que mencionou esse benefício.

Se você usa diretivas de compilação onde declara diferentes variáveis para cada situação, você tem que colocar diretivas na declaração também:

procedure DoesSomething;
var
  {$IFDEF CASE1}
  var1: Integer;
  {$ENDIF}
  {$IFDEF CASE2}
  var2: Integer;
  {$ENDIF
begin
  {$IFDEF CASE1}
  // use var1
  {$ENDIF}
  {$IFDEF CASE2}
  // use var2
  {$ENDIF}
end;

Chato, hein? Acho que assim fica mais fácil e legível:

procedure DoesSomething;
begin
  {$IFDEF CASE1}
  var1: Integer;
  // use var1
  {$ENDIF}
  {$IFDEF CASE2}
  var2: Integer;
  // use var2
  {$ENDIF}
end;

Acredito que as variáveis inline tenham ainda outros sutis benefícios, em situações específicas, que não tenha listado aqui. Caso suspeite de mais algum, deixe seu comentário. Se não concordou com os benefícios e acha que as variáveis inline não são uma boa novidade para o Delphi, comente também. Só não se esqueça de uma coisa: se não gostou, é só não usar!

O que gostei no Delphi Rio 10.3.2 update

A Embarcadero acabou de lançar uma nova versão do Delphi Rio (e consequentemente do Rad Studio e C++ Builder): a versão 10.3.2.

É uma atualização “menor” – ou seja, uma alteração no terceiro dígito do número de versão, de 10.3.1 para 10.3.2. Também significa que o codinome do produto ainda é “Rio”, e que os arquivos binários (leia-se DCU’s) são compatíveis com a versão anterior 10.3.1. Com isso, você não precisará recompilar os packages instalados no Delphi.

Por que então um artigo sobre isso? Em geral, atualizações menores contêm apenas pequenas correções e melhorias, porém não é o caso desta. Listo aqui duas novidades que pessoalmente considero significativas. Não custa lembrar que a Embarcadero recentemente publicou o Roadmap do Rad Studio – Maio de 2019 que lista o que eventualmente será incluído nas próximas versões “maiores” do Delphi. Agora, vamos às melhorias:

Suporte ao macOS 64-bit

O Delphi 10.3.2 inclui, finalmente, suporte a aplicações macOS 64-bit. Se você desenvolve aplicações para macOS com o Delphi, sabe o quanto isso é importante.

A Apple está há anos planejando e informando seus usuários de que as aplicações macOS 32-bit deixarão de funcionar. E essa hora chegou. No macOS Mojave, ao abrir aplicações 32-bit (as criadas com Delphi, por exemplo), os usuários tem recebido a seguinte mensagem:

App não está otimizado para o Mac e precisa ser atualizado

Eu diria que com uma mensagem dessa seu aplicativo não inspira muita confiança para o usuário, concorda? Ainda, na próxima versão do macOS, o macOS Catalina (10.15), as aplicações 32-bit simplesmente não funcionarão mais!

Portanto, para você que desenvolve (ou pretende desenvolver) aplicativos macOS com o Delphi, é um alívio saber que isso não é mais um problema: é só gerar os aplicativos em 64-bit e estará tudo certo!

Estabilidade e performance da IDE

Outra melhoria digna de nota é a melhora significa na estabilidade e performance na IDE. A versão inicial do Delphi Rio trouxe uma IDE renovada, com tema dark e um visual mais moderno. Mas também haviam “efeitos” visuais estranhos, lentidões, a tela era redesenhada várias vezes ao redimensionar, maximizar, entre outros problemas.

Isso foi melhorado e muito nessa nova versão. Se você já esta usando o Delphi Rio, acredito que vai sentir a diferença com uma IDE mais fluida e mais rápida em vários aspectos.

O Delphi Rio 10.3.2 já está disponível! Existem várias outras melhorias além dessas citadas. Se já estiver usando este última versão, deixe um comentário contando o que achou!

O que são memory leaks e quais suas consequências?

Um memory leak (ou vazamento de memória) acontece quando sua aplicação aloca um espaço na memória e nunca mais o libera.

Como os memory leaks acontecem em Delphi

Em uma aplicação Delphi, espaços de memória são alocados e liberados o tempo todo. Muitas vezes isso é feito automaticamente pelo compilador ou pela RTL – por exemplo, ao alocar variáveis de tipos primitivos, parâmetros que são passados a funções, etc. – e não precisamos nos preocupar com isso.

Porém, existem muitos casos em que nós alocamos memória manualmente. Um dos mais comuns acontece ao instanciar um objeto:

Obj := TMyObject.Create;

A linha de código acima irá alocar um espaço de memória e a variável Obj irá apontar para esse endereço alocado. Para liberar o espaço, pode-se usar o método Free:

Obj.Free;

Se o desenvolvedor esquecer de chamar o método Free, o espaço de memória associado ao objeto nunca é liberado. Temos um memory leak.

Consequências dos memory leaks

Você pode se perguntar: "Qual o problema? Já vi isso acontecer na minha aplicação e nunca tive nenhum problema prático!".

Realmente, em geral, não se sente muito os efeitos, quando são poucos memory leaks. Mas as consequências tem intensidades diferentes dependendo do tipo de aplicação.

Aplicações no cliente (desktop ou mobile)

Em geral, em aplicações desktop ou mobile, o efeito não é muito grave. Nos sistemas operacionais atuais, em geral a memória alocada pela aplicação é liberada quando a aplicação é encerrada, de modo a não causar instabilidade no sistema.

Mesmo assim, se sua aplicação gera muitos memory leaks, podem acontecer alguns problemas, causados pelo uso excessivo da memória:

  • Lentidão da aplicação e/ou do sistema: Acesso a disco pode ser necessário pra contornar a falta de memória.

  • Fechamento abrupto da aplicação: O sistema operacional pode forçar a finalização do sistema devido ao uso excessivo de memória. Isso é mais comum em aplicações mobile.

  • Bugs no sistema: Partes do sistema que alocam memória podem começar a falhar e causar bugs.

Aplicações no servidor

Quando se fala em aplicativos servidores, o problema fica pior. Isso porque idealmente você nunca irá fechar o servidor – você quer que ele rode para "sempre", sem se incomodar.

As consequências são praticamente as mesmas das aplicações desktop, mas como teoricamente o servidor nunca fecha, qualquer pequeno memory leak terá consequências futuramente. A memória será lentamente consumida ao longo de dias, semanas, meses, e seu servidor começará a apresentar lentidão, bugs e eventualmente irá parar de funcionar.

Como evitar os memory leaks

Existem técnicas e ferramentas para lhe ajudar a detectar e remover os memory leaks da sua aplicação. Isso será abordado em posts futuros.

E você? Já sentiu teve problemas com memory leaks na sua aplicação? Ou considera um item de baixa prioridade e tem coisas mais importantes pra se preocupar no seu código? Deixe seu comentário!