Pular para o conteúdo principal

Postagens

Mostrando postagens de 2010

O Problema de Gestão de I/O

A palestra que dei no Sétimo Encontro do Grupo de Usuários de C e C++ do Brasil apresentou meu resultado atual na pesquisa de um framework baseado em uma forma de orientação a aspectos em C++ descrita no "Modern C++ Design" do Alexandrescu. Minha palestra não apresentou, porém, o que é exatamente o problema a resolver, assumindo que fosse razoavelmente conhecido. Seu foco foi apresentar todos os mecanismos disponíveis para se resolver o problema no Linux 2.6, suas peculiaridades e seus aspectos comuns. Uma certa razão me motivou, após esta apresentação, a rebobinar meu raciocínio e considerar o problema original. [1] O que há exatamente de tão problemático na gestão de I/O em um programa? A imagem inicial é a de um programa cujo objetivo é interagir com um dos dispositivos ligados ao computador. A forma básica dessa interação é a cópia de dados do dispositivo para a memória e da memória para o dispositivo, sendo que trabalho útil por parte do programa ocorre enquanto os...

Análise Sintática Incremental

Em 2008, perguntei na ccppbrasil.org sobre uma boa maneira de produzir parsers incrementais. Dois anos depois, pude parar e estudar o manual do Bison o suficiente para descobrir ali o meu objetivo: push parsers . Este exemplo do manual é precisamente o que eu quero: int status; yypstate *ps = yypstate_new (); do { status = yypush_parse (ps, yylex (), NULL); } while (status == YYPUSH_MORE); yypstate_delete (ps); Meu objetivo é aplicar esta técnica para produzir o decodificador de mensagens de protocolo de aplicação em um servidor baseado em readiness-notification e non-blocking I/O.

Por que goto é considerado prejudicial?

Recentemente, o Fabiano Vasconcelos abriu uma discussão no Grupo de Usuários de C e C++: De cara eu vi algo aqui um pouco estranho, se que o amigo Márcio me permite comentar: que muitos programadores, inclusive eu (se que posso ser rotulado como programador) foram instruídos com o princípio de NUNCA usar o goto, por ser considerado um mau estilo de programação. Durante a discussão, o Eduardo Vieira puxou um artigo da KernelTrap sobre uma discussão similar ocorrida no grupo de desenvolvimento do Linux, onde Robert Wilken disse o seguinte: In general, if you can structure your code properly, you should never need a goto, and if you don't need a goto you shouldn't use it. It's just "common sense" as I've always been taught. Unless you're intentionally trying to write code that's harder for others to read. É preciso colocar a máxima "goto considered harmful" na perspectiva histórica adequada. Acredito que praticamente todo programador trein...

Test Driven em C++ cross-compiled é possível

afe! Enquanto não rola um estudo retrospectivo maneiro, aqui vão minhas primeiras impressões. por mais que pareça andar de ré, tenha um porting para o sistema do desenvolvedor, onde a compilação não é cruzada; não exija frameworks xUnit e faça bilhões de programecos se necessário; guarde no coração que não é preciso reflection nem mesmo shared objects para aplicar dependency injection; não despreze a tediosa tarefa de testar parte a parte, pequena parte a pequena parte; não tenha escrúpulos para satisfazer dependências aleatórias com stubs. A maior revelação para mim nesse processo foram os pontos 2, 3 e 5 acima. Após um longo tempo digerindo o problema, e após diversas discussões sobre que framework de testes usar, por fim completei a tarefa da forma mais tosca possível: cada teste é um programa executável individual.  O projeto usa cmake para configurar a construção, e o ctest funciona legal com essa lista de programas de teste. O maior esforço nesse processo foi refat...

Análise vs. Projeto

Eu diria que a ruptura entre Análise e o Projeto acontece quando acabam as considerações sobre o problema e começam as considerações sobre a solução. Em outras palavras, o papel do Analista é considerar o problema, enquanto o papel do Projetista é o de considerar a solução. Assim, o Analista aparece quando um problema aparece, e dá lugar ao Projetista quando o problema foi devidamente analisado, restando produzir para ele uma solução. E diria que a ruptura entre a Especificação e a Implementação acontece quando acabam os artefatos para consumo por humanos e começam os artefatos para consumo por máquinas. Em outras palavras, o papel do Especificador é produzir artefatos para consumo por humanos, enquanto o papel do Implementador é produzir artefatos para consumo por máquinas. Assim, o Especificador aparece quando a atividade é produzir efeitos sobre humanos, e dá lugar ao Implementador quando os humanos estão devidamente satisfeitos e a atividade prossegue para produzir efeito...

Independente de plataforma? Mentira.

Independência de plataforma é uma mentira. O seu sistema Java não é independente de plataforma. Ele é dependente da plataforma Java versão 4. Ou 5. Ou 6. Você não pode rodá-lo na plataforma Java versão 1. Ou na plataforma Micro Edition. Seu sistema C++ também não é independente de plataforma. Ele pode rodar em todos os Windows, mas não roda no Linux. Ele pode rodar no Windows e no Linux, mas não roda no Mac. Ele pode rodar no Windows, no Linux e no Mac, mas não roda no BeOS. Ele pode rodar no Windows, no Linux, no Mac e no BeOS, mas não roda no Symbian. Mesmo que o seu sistema seja puro C -- ISO C89! -- então esta é a sua plataforma, e o seu sistema não roda onde não há implementação para C, como chips experimentais que executam Java bytecode. Não existe código independente de plataforma. Todo requisito de portabilidade deve expressar explicitamente para quais plataformas o sistema deve ser portável.

Sobre regulamentação da profissão e o valor da graduação

A discussão sobre a proposta de regulamentação da profissão de Analista de Sistemas que está circulando no Senado provoca o debate sobre o verdadeiro valor da graduação. Sobre esse assunto eu tenho uma coisa para dizer com firmeza. O mercado não ensina você a ser um Analista de Sistemas. O mercado ensina você a ser um Horse . O mercado não tem nem a capacidade nem o interesse em transformar você em um Analista de Sistemas. A formação desse especialista é custosa e demorada. O fato de um diploma de graduação não ser suficiente para caracterizar um Analista de Sistemas não contradiz esse fato; ele o reforça . A empresa capaz de transformar incompetência em competência é Mecca para todos nós. Essa empresa não está contratando. Se você acha que não precisa estudar em uma escola porque já sabe tudo o que precisa, ela não o contrataria, de qualquer modo.

bla-bla-bla do JAX-RS não me impressiona

Está irritante ler o Java EE 6 Tutorial sobre RESTful web services. A interpretação que o texto dá para REST é um amontoado de lixo sobre o conceito original. O texto constrói uma distinção artificial entre REST e SOAP no que me parece uma tentativa de distinguir os mercados para JAX-WS e JAX-RS. É claro que isso é uma tolice, porque SOAP é um protocolo e uma representação de dados, enquanto REST é um princípio de arquitetura e design . Um design REST reproduz o design da Web: transferência de representações de recursos a.k.a. download. Um tal design não possui sessão e portanto o relacionamento entre cliente e servidor não mantém estado. Isso não tem nada a ver com usar ou não usar SOAP, usar ou não usar WSDL, estabelecer vínculos complexos ou simples com a aplicação cliente. Ninguém merece.

SOAP sobre HTTP não me impressiona

Todo esse papo sobre as vantagens e maravilhas do SOAP sempre pareceram um pouco suspeito, e agora finalmente eu percebi o porquê. De algum modo, me parece que o discurso de benefícios o SOAP é uma versão travestida do seguinte argumento: o melhor é reusar o HTTP porque o melhor é reusar os servidores HTTP pré-existentes ou, ao menos, porque o problema de implementação de um servidor HTTP tem solução conhecida. Uma crítica fundamental ao SOAP sobre HTTP é o fato de o HTTP não ter sido projetado como protocolo de transporte para outros protocolos; na prática, esse fato é simplesmente desconsiderado. Creio que isso evidencia as razões histórias para esse esquema: o valor não está tanto nas capacidades do HTTP como protocolo de transporte, mas nas capacidades das implementações do HTTP de suportar esta forma de reuso. Entendendo as coisas por esse ângulo, faz perfeito sentido que ao inventar uma plataforma de web services um sujeito reusasse, digamos, o Apache HTTP Server, ou o Mic...

C++0x vai mudar sua vida: listas de inicialização

Com a nova sintaxe para listas de inicialização, é como se agora houvesse uma notação para o valor literal de praticamente qualquer estrutura de dados. Observe meu teste de unidade construindo um "attribute template" PKCS #11 com std::vector direto na inicialização: std::vector attributes {   CK_ATTRIBUTE { CKA_CLASS, &object_class, sizeof(object_class) },   CK_ATTRIBUTE { CKA_TOKEN, &on_token, sizeof(on_token) },   CK_ATTRIBUTE { CKA_LABEL, &label, sizeof(label) },   CK_ATTRIBUTE { CKA_APPLICATION, &application, sizeof(application) },   CK_ATTRIBUTE { CKA_VALUE, &data, sizeof(data) } }; O segredo da notação está nessa pseudo-gramática:   type-name identifier { initializer-list }; que é análoga em significado a:   type-name identifier ( argument-list ); ou:   type-name identifier = type-name ( argument-list );