Imposto Microsoft

“Imposto Microsoft” é a designação dada, regra geral por utilizadores de outros sistemas operativos, ao valor da licença Microsoft Windows pré-instalada nos equipamentos novos (este valor já se encontra incluído no preço de venda ao público).

Esta prática é vulgarmente designada por “venda casada”: “a prática dos fornecedores de condicionar a venda de um bem ou utilização de um serviço à aquisição de outro(s), bem como, sem qualquer justificativa, impor quantidade mínima a ser comprada.” (source), e é proibida.

No caso do “imposto microsoft”, quem não pretender fazer uso do sistema operativo pré-instalado, pode pedir o reembolso do valor dessa licença.

Eu assim fiz, com sucesso. 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

Intel XDK New

É recompensador quando a tecnologia cumpre a sua função e nos mostra resultados no tempo esperado.

“The Intel® XDK NEW development system is designed for developers who want to use their HTML5 expertise to build hybrid HTML5 apps for mobile devices (e.g., phones and tablets) and other platforms that host HTML5 web apps (such as a Google Chrome* extension or a mobile web site).”

No caso deste Intel XDK New demorou mais uns minutos: embora a interface de instalação (install_GUI.sh) diga que apenas o Ubuntu 12.04 é suportado, no arquivo vem um rpm.

O download pode ser feito no site oficial. Depois de descomprimir o arquivo, encontrarão o rpm no directório “rpm” (será qualquer coisa como intel-xdk-0154-2.0-0.x86_64.rpm, sendo que o nome do arquivo depende da versão)

A instalação decorrerá sem problemas: basta executar na linha de comandos

$ sudo yum install intel-xdk-0154-2.0-0.x86_64.rpm

Depois disto são precisos mais dois pequenos truques:

  1. corrigir permissões:
    $ sudo chmod 0755 /opt/intel/XDK/
  2. corrigir o symlink libudev.so.0: no meu caso a correcção passou por
    $ sudo unlink libudev.so.0; sudo ln -s /usr/lib64/libudev.so.1 /opt/intel/XDK/libudev.so.0

Depois disto, a oferta da Intel cumpriu.
Arrancou
interface principal do Intel(R) XDK Newe em poucos minutos deu frutos (Sapo A5)

Screenshot da aplicação a correr num Sapo A5