04 Too many open files (no handles left)

Esta é a 26ª edição em que vos escrevo, fez este mês cinco anos e sete meses que tenho a honra e o privilégio de editar a Revista PROGRAMAR, tantas vezes lutando conta o tempo, escrevendo até altas horas, escrevendo mais do que seria “habitual”, fazendo mais um “git push”, esticando os limites, contornando o tempo, a disponibilidade, pedindo aos autores mais um esforço, para que se faça mais uma edição!

O que seriam “demasiados ficheiros abertos”? Seriam 25 demais? Seriam antes 26? Bem, não querendo fazer profecias, mas desafiando todos aqueles que participam, já foram publicadas 55 edições, esta é a 56ª! Esperemos que falamos tantas quanto o máximo número possível de ser representado em binário com 16 bits sem sinal! Seja esse o objectivo e essa a vontade, de quem escreve e de quem lê!

Num momento de “maior sanidade”, menos ousado, mas ambicionado, num lapso de tempo que se espera não seja muito alargado, chegaremos à edição 64! Pode não parecer muito mas se fossem bits, muito se poderia representar! Façamos um “git push”, tenhamos a vontade, e daqui por um ano e alguns meses, estaremos a ler a 64ª edição!

Até lá, boas leituras e muita escrita
António Santos

Os segredos do lado negro da BIOS

Introdução

A BIOS

Ao longo dos anos, muito tem sido escrito sobre possíveis vectores de vulnerabilidade utilizando a bios. No entanto, além do antigo vírus de Chernobyl, que acabou por apagar a BIOS, pouco tem sido dito.

Tal como amplamente descrito, a BIOS é um firmware de arranque designado a ser executado assim que um computador recebe corrente. A função inicial da BIOS é identificar e testar os dispositivos de sistema, como a placa gráfica, as unidades de armazenamento (disco rígido), antigamente as drives de disquetes (agora já são incomuns) e outro hardware, com o objectivo de preparar a máquina e colocá-la num estado conhecido, de forma a que os softwares armazenados nos meios de armazenamento possam ser carregados e executados, para lhes ser “entregue” o controlo do computador. Este processo é o chamado “booting”, que é a abreviatura de “bootstrapping”.

Nos computadores PC compatíveis, alguns periféricos, tais como unidades de disco rígido, placas gráficas, etc… têm a sua própria extensão da ROM da BIOS, com o objectivo de fornecer funcionalidades adicionais. Os sistemas operativos e outro software designado para o efeito, criam uma interface para as aplicações utilizarem estes dispositivos.

Continuar a ler

Otimizando os sistemas embebidos

Recentemente calhou em conversa com um amigo meu sobre programação de sistemas embebidos, visto que ele estava a avançar com um projeto muito interessante com um equipamento semelhante ao Arduino. Esta conversa relembrou-me os tempos em que programava em ANSI C (de 89) num LPC2106 da Phillips e aos tempos que andava a aprender ANSI C (de 89) e o belo do assembly, e surgiu a ideia para este artigo.

Quando alguém começa a programar num Arduino (ou equipamentos semelhantes) vai seguindo os exemplos que vai encontrando e vai adaptando às usa necessidades. No entanto, mais cedo ou mais tarde, vai querer implementar uma ideia que teve e, quem sabe, mais tarde transformar essa solução num produto que possa comercializar. A ideia deste artigo é oferecer um conjunto de técnicas e de pontos de interesse a ter em atenção por forma a maximizar os recursos que já têm, reduzindo o “desperdício” dos recursos.

Continuar a ler

Tipos em Python

Python sempre foi uma linguagem fortemente tipada, para surpresa de muitos que confundem a tipagem dinâmica com a ausência de tipos. Na realidade, os tipos em Python funcionam tão bem e de forma tão automática que muitas vezes esquecemos que eles existem.

Mas nem tudo é perfeito. Hoje existem programas gigantescos escritos em Python e os programadores precisam de ferramentas poderosas para entender e navegar neste código. Aí tínhamos um problema, pois ferramentas de edição mais avançadas com recursos de autocomplete (intellisense), refactoring e simplesmente de navegação no código fonte se tornaram extremamente complexas. Dadas as propriedades dinâmicas da linguagem, escrever este tipo de ferramentas para o programador Python se tornou uma tarefa complicada. Cada ferramenta era responsável por inferir o tipo de cada método ou função sendo chamada e esta não é uma tarefa simples, uma vez que temos poucas indicações de tipo no programa em si.

Continuar a ler

Gerir a Qualidade do Código

Vamos dar uma martelada? Quem nunca ouviu esta expressão enquanto trabalhava numa aplicação, quer seja no seu desenvolvimento, quer seja na sua manutenção. Este tipo de prática não abona em nada as nossas aplicações e com o tempo acaba por ser um procedimento, uma feature da aplicação que não nos conseguimos livrar.

Este simples exemplo, é apenas um num enorme lote de más práticas que são realizados ao longo dos tempos em muitos projetos. Como fica a nossa aplicação, a sua performance, o seu grau de manutenção, de legibilidade? Podemos dizer que a aplicação tem qualidade?

Quando falamos de qualidade, do que nos estamos a referir? O que é a Qualidade? O que é a Qualidade de uma aplicação? Como podemos medir? Como a podemos gerir?

Continuar a ler

Cifra Feistel

Nesta edição decidimos trazer até si, caro leitor, um artigo sobre uma cifra que data ao ano de 1973. Criada por Horst Feistel enquanto trabalhava na IBM, este algoritmo pertence à criptografia simétrica.

Para os leitores que não estão tão habituados a este tema, existem dois tipos de cifras. A simétrica e a assimétrica. Em termos práticos, a criptografia simétrica tende a ser mais rápida uma vez que exige menos capacidade computacional. Contudo é considerada menos segura uma vez que a mesma chave é usada para encriptar e desencriptar a informação é partilhada pelos diversos intervenientes (na criptografia assimétrica são usadas duas chaves distintas – a chave privada para desencriptar e a chave pública para encriptar a informação – apenas a chave pública é partilhada entre emissor e receptor sendo que a chave privada é usada para decifrar a informação).

Continuar a ler

NodeMCU e Telegram Bots

Introdução

Existem imensas formas interessantes de colocar um equipamento a comunicar, de forma mais ou menos simples. Na edição 51, foi abordada esta temática mais focada na utilização de sockets, para comunicar com o dispositivo. Continuando um pouco a temática, desta feita, é sobre a utilização do popular software de chat Telegram, utilizando chatbots, para comunicar com o circuito.

O Telegram, é um popular serviço de mensagens instantâneas, baseado na nuvem, disponível para a esmagadora maioria dos sistemas operativos, bem como em formato de aplicação web. Entre as muitas características que o podem destacar, convém realçar o facto de ser de código aberto, possuir criptografia ponto-a-ponto, e um serviço de APIs independentes. Além de tudo isso, existem bibliotecas para o uso do telegrama na internet das coisas (IoT), como é o caso da Universal Telegram Bot Library.

Continuar a ler

Introdução aos testes Unitários em C# com MS Unit Test

Introdução

Neste artigo será apresentada uma introdução básica aos testes unitários exemplificando como os escrever na linguagem C#, usando as ferramentas que acompanham o Visual Studio Community. Escrever testes de caso é uma parte importante do teste de software. Testar software é sempre um “quebra-cabeças” para programadores e testadores pois existem imensos tipos de casos de teste possíveis. Os testes unitários são um método pelo qual pedaços de um programa, módulos ou até conjuntos de módulos, são testados por forma a determinar se estão em condições de serem utilizados.

Para escrevermos bons testes unitários, devemos entender como é que um caso de teste funciona, e porque precisamos de o testar!

Continuar a ler

Depois da casa roubada, trancas na porta!

Muito se tem falado desde a passada sexta-feira sobre cyber-segurança, mas antes disso pouco se dizia. Isso faz lembrar o ditado português, “depois da casa roubada, trancas na porta”. Ora bem, na passada sexta-feira, um ransomware, infectou imensos sistemas, colocando os dados reféns de um resgate a ser pago aos criadores do malware. Até aqui, nada de inédito, este tipo de ataques tem sido cada vez mais co- mum! O estranho é o “pânico” gerado em volta da situação e mais estranha será a falta de uma política “pró-activa” de prevenção!

Um ransomware, encripta os dados contidos nos discos rígidos e solicita um pagamento de um resgate! Bem, se existirem cópias de segurança, para quê pagar resgate? Restaura-se a cópia de segurança e recomenda-se aos “autores” do “dito cujo” que vão “plantar nabos num qualquer deserto”, porque os dados continuam disponíveis e o ataque foi apenas mais um fracasso! Situação em que se poderia dizer que “venha de lá o assalto” que as trancas estão na porta! Mas infelizmente numa grande quantidade de situações tal não aconteceu!

Continuar a ler

Android com C# – Introdução ao desenvolvimento

Nesta edição vamos fazer a review do Livro Android com C# – Introdução ao Desenvolvimento escrito por Henrique Loureiro.

O livro introduz o programador que tem conhecimentos em .NET, nomeadamente em C#, ao paradigma de desenvolvimento em mobile, utilizando o Visual Studio com plataforma de desenvolvimento e utilizando o Xamarin para o desenvolvimento mobile.

O livro está organizado em duas partes, a primeira mais teórica com alguns exercícios para consolidar os conhecimentos no final de cada um dos capítulos e uma segunda parte com alguns projetos completos mais abrangentes.

Continuar a ler