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

Para venda – Mini Android 4.0 PC

rikomagic mk802II e comando WirelessRikomagic MK802II

Model: MK802 II
OS: Android 4.0 / Can also run desktop versions of Linux from a bootable SD Card.
Main Chip: Allwinner A10/ 1GHz Cortex-A8
Memory: 1GB
Storage: 4GB
Graphics: MALI 400 Processor
Network: Wireless 802.11b/g/n, WAPI(Ralink8188)
Expansion: Micro SD 2-32GB Memory
IO/Ports: Micro USBX2; USB2.0X1; HDMIX1; MicroSDX1
Keyboard: Supports virtual keyboard, supports 2.4G wireless keyboard, fly mouse
Audio: AAC, AAC+, eAAC+, AMR-NB, AMR-WB, QCP, MP3, WMA, WAV, MIDI, M4A
Video: WMV/ASF/MP4/3GP/3G2M4V/AVI/MJPEG/RV10/ DivX/VC-1/MPEG-2/
MPEG-4/H.263/H.264/1280*720P HD 30 fps, 1080P/720*480 D1 30fps
Apps: Google PlayStore, Youtube, Twitter, AngryBirds, Office, Gmail, Browse, Skype.
HDMI: Output 720P, 576P, 480P, 1080P&2160P
Power Input: Powered by USB port.
HDMI: female to male cable,Power adapter(optional).
Unit Size: 9.7*2.8*1.2cm
Total weight: 0.2kg

Measy RC11

Marca: Measy
Modelo: RC11
Cor: Preto
Material: Caixa de plástico
Método de conexão: Sem fio
Distância de Operação: 10M
Resolução: 1000 dpi
Fonte de Alimentação: 3 pilhas AAA
OS System: Windows 98 / Me / NT / 2000 / XP / Vista / Linux