Google Chrome/Chromium DNS cache

Com certeza esta é daquelas funcionalidades que tem tanto de excelente no que diz repeito à performance como de irritante para quem altera com frequência o ficheiro de hosts.

Tanto o Google Chrome como o Chromium têm um mecanismo de cache de nomes e que não é limpa juntamente com A cache.

Para gerir a cache de DNS, existe uma interface acessível pelo URL chrome://net-internals/#dns.

O botão “Clear host cache” faz A magia ;)

git-pushed

git-pushed é uma ferramenta de linha de comandos capaz de listar as referências alteradas num repositório git remoto.

Caso de uso

$ git-pushed https://github.com/PauloASilva/node-http-mitm-proxy.git

Nota

git-pushed mantém a informação sobre as referências de um repositório no directório $HOME/.cache/git-pushed
Na primeira execução para um dado repositório, todas as referências serão dadas como modificadas.

Motivação

Gitlab inicia um projecto jenkins aquando dum evento push num dado repositório.
O projecto jenkins job executa comandos remotamente via SSH, comandos esses que devem fazer checkout do repositório se e só se o evento (push) ocorreu numa dada referência (head). Continue reading

Comprimento duma string formatada

Para um printf("Vamos dizer %s\n", "ola") não precisamos sequer pensar qual o comprimento final do texto a imprimir, porque o recurso “não tem” limitação de espaço. Mas e quando queremos armazenar o resultado em memória?

Para armazenar em memória precisamos saber qual o tamanho do “slot” a alocar, mas se ainda não conhecemos o resultado final eventualmente o melhor que podemos fazer é alguma aritmética menos automática:

comprimento("Vamos dizer %s\n") - comprimento("%s") + comprimento("ola")

O bom é que isto pode ser automatizado. Continue reading

nginx: desenvolvimento de módulos

Uma referência incontornável na introdução ao desenvolvimento de módulos nginx é sem dúvida o artigo Emiller’s Guide To Nginx Module Development.
Não menos valiosa é ainda a contribuição do Antoine Bonavita: Development of modules for nginx (tradução para Inglês do artigo original em Russo).

Para um servidor http com o potencial do nginx esta é, até agora, a melhor literatura que encontrei especificamente sobre o desenvolvimento de módulos.
O projeto em si padece de falta de documentação técnica e a bibliografia em geral não cobre detalhadamente esta componente.

Como quando se começa com uma nova linguagem de programação, a tentação é procurar um exemplo “hello world” que também o há para o nginx, no entanto, dada a facilidade de borrar a pintura entre apontadores e referências, parece-me mais prudente iniciar a experiência com um módulo cuja principal funcionalidade é não fazer nada. Neste contexto, “não fazer nada” significa que vamos conseguir compilar o nosso módulo junto com o restante código fonte do nginx (ao contrário dos módulos de Apache que são dinamicamente linkados, os módulos nginx são compilados com o core) , não quebrando o seu funcionamento.

Continue reading

nginx + php-fpm: File not found.

Uma pesquisa pelos termos “nginx + php-fp File not found.” oferece um vasto leque de literatura e receitas para, expectavelmente, resolver o problema.
Se por acaso “aterrou” nesta página já em último reduto, talvez a origem do problema não esteja no ficheiro de configuração do nginx.

No error_log pode ler-se ainda: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, reforçando a possibilidade de tratar-se dum problema de permissões.

Se já confirmou que o utilizador/grupo nginx (ou outro com o qual o nginx esteja a ser executado) tem permissões para executar os scripts, então confirme que o php-fpm está a correr com esse utilizador.

  1. Abrir o ficheiro ficheiro de configuração da pool (/etc/php-fpm.d/www.conf)
  2. Procurar por “user”
  3. Modificar, se necessário, os valores de “user” e “group”
  4. Reiniciar o php-fpm (/etc/init.d/php-fpm restart)

No meu caso a pool por omissão estava configurada para o utilizador e grupo “apache”.

Introdução à computação paralela

Um bom recurso sobre pthreads: POSIX Threads Programming.

This tutorial is the first of eight tutorials in the 4+ day “Using LLNL’s Supercomputers” workshop. It is intended to provide only a very quick overview of the extensive and broad topic of Parallel Computing, as a lead-in for the tutorials that follow it. As such, it covers just the very basics of parallel computing, and is intended for someone who is just becoming acquainted with the subject and who is planning to attend one or more of the other tutorials in this workshop. It is not intended to cover Parallel Programming in depth, as this would require significantly more time. The tutorial begins with a discussion on parallel computing – what it is and how it’s used, followed by a discussion on concepts and terminology associated with parallel computing. The topics of parallel memory architectures and programming models are then explored. These topics are followed by a series of practical discussions on a number of the complex issues related to designing and running parallel programs. The tutorial concludes with several examples of how to parallelize simple serial programs.in Introduction to Parallel Computing

Reiniciar MAC Address

O VirtualBox permite reiniciar o MAC Address de qualquer adaptador de rede, mas nem sempre isto é tão pacífico como desejável.

Quando produzimos uma appliance para fornecer a terceiros estes têm a oportunidade de reiniciar o seu MAC Address, mas aquando do boot provavelmente vão estar bloqueados alguns minutos enquanto o network manager “percebe” que os adaptadores de rede não correspondem (MAC Addresses diferentes para a mesma interface) e inicializa uma nova interface de rede (provavelmente um eth1).

Para contornar este problema e antes de exportar a máquina virtual, podemos fazer as seguintes alterações no sistema operativo da máquina virtual (assumindo que é linux):

  1. Remover o ficheiro /etc/udev/rules.d/70-persistent-net.rules
    $ sudo rm /etc/udev/rules.d/70-persistent-net.rules
  2. Remover o ficheiro /lib/udev/rules.d/75-persistent-net-generator.rules
    $ sudo rm /lib/udev/rules.d/75-persistent-net-generator.rules
  3. Criar um link simbólico para /dev/null
    $ sudo ln -s /dev/null /lib/udev/rules.d/75-persistent-net-generator.rules

Reiniciando a máquina, é expectável que o boot não fique bloqueado a tentar “levantar” a(s) interface(s) de rede.

Este procedimento foi testado em Ubuntu 12.10