Pontos

É estranho. O ser humano é estranho.
Parece que em cada conversa, cada confronto de ideias, cada contar de histórias, este ser anda a tentar ganhar pontos.

Como se fosse um jogo.

Há pontos por ideais, pontos por conquistas, pontos por escolhas, há pontos para todos os gostos.

Há quem ache que os pontos estão interligados com um número abstrato numa conta bancária.
Há quem ache que os pontos na verdade são inversamente proporcionais à conta bancária.
Os maus jogadores, com poucos pontos, são sempre os outros.

Há quem considere que os pontos são ganhos pelo que comemos, ou vestimos, o número de beijinhos que se dá ao cumprimentar alguém, ou o número numa balança.

Há quem tente ganhar pontos com as horas que trabalha, as horas que não trabalha, os kilometros que voa, ou os kilometros que corre.

Estamos sempre a tentar ganhar pontos, para quê?

Como aquela conversa a que chamamos de “conversa de velha” em que se ganha pontos pela doença mais agressiva, pela dor mais aguda.

“Oh coitada, sofreu mesmo” – ganha mil pontos.

Qual é a cena desta competição, deste anseio por um insuflar fugaz de ego momentâneo?

O Patrão

Não há patrões, nem há empregados, há colegas.
Eu tenho a minha função, e a minha função é conseguir trabalho para esta gente, conseguir matérias primas para esta gente e conseguir que esta gente seja feliz.
Estar atento às suas necessidades.

Esta é a minha função.

Interrupções

Se há uma coisa que me chateia à grande são interrupções quando estou concentrado.

A natureza do trabalho de programação requer um grande trabalho mental continuado em que os pensamentos são formados, encaixados e traduzidos em linguagem de programação.
Ora a meio de uma linha de pensamento destas alguém grita “Oh Santos, coiso coiso coiso”. Pumba! Lá vai a linha de pensamento.
E depois consegue-se retomar exactamente onde se estava? Claro que não! Muitas vezes é preciso voltar até início da lógica.

Por favor, antes de rebentar uma bolha de concentração (que é fácil de perceber pela expressão facial da pessoa), é preciso analisar se o que se tem para dizer é realmente importante.
Caso não seja, sr interruptor, mande um mail 🙂

Update
Acabei de ler este artigo, está muito bom e encaixa aqui perfeitamente:
http://www.businessinsider.com/why-programmers-work-at-night-2013-1

Working on large abstract systems involves fitting the whole thing into your mind – somebody once likened this to constructing a house out of expensive crystal glassand as soon as someone distracts you, it all comes barreling down and shatters into a thousand pieces.

This is why programmers are so annoyed when you distract them.

Preparação das férias – A internet

Antes de ir de férias quiz assegurar que os requisitos geeks estavam satisfeitos.
Como já sabia que não ia ter ligação à net no sítio onde iamos preparei com antecedência ligação para todos os gadgets da família: iPhone, iPad, Galaxy SII, MBP e um ultrabook Toshiba Z830.

TMN 4G – ZTE MF820d
A primeira etapa foi configurar o dongle 4G da TMN no meu Debian.
Primeiro testei com o network-manager do Debian mas só consegui ter até +/- 24Mb/s.
A ligação estava a ser feita com ppp e há uma limitação de velocidade nesse protocolo.
Após muita busca no google finalmente encontrei um módulo (experimental claro) que estava a ser incluído nos kernels mais recentes, o QMI_WAN e uma library que usa esse módulo para inicializar o modem: libqmi-glib.

Lá fui eu então ao mundo dos kernels onde já não ia há alguns anos.

À velha maneira Debian, esse módulo não está incluíndo no kernel default, nem sequer no ramo experimental. Virei-me para os kernels do Liquorix, que não me apetecia nada andar em compilações, e lá consegui o qmi.

É bastante simples a instalação de um kernel do Liquorix:

# adicionar o liquorix à lista de
echo "deb http://liquorix.net/debian sid main" > /etc/apt/sources.list.d/liquorix.list

# Actualizar os pacotes
root@zix:~# apt-get update

# Instalar a key de assinatura de pacotes do liquorix
root@zix:~# apt-get install '^liquorix-([^-]+-)?keyring.?'

# instalar o kernel
root@zix:~# apt-get install linux-image-liquorix-amd64

A libqmi-glib é altamente experimental e puxei com o git, daqui: http://gitorious.org/lanedo/libqmi-glib

Depois dos normais, configure, make, make install, ficamos com dois binários: qmicli e qmi-network.
Para inicializar o modem:

root@zix:~# qmi-network /dev/cdc-wdm0 start
Starting network with 'qmicli -d /dev/cdc-wdm0 --wds-start-network --client-no-release-cid'...
Saving state... (CID: 1)
Saving state... (PDH: 35919936)
Network started successfully

# obter ip
root@zix:~# dhclient wwan0

Para facilitar estes passos, coloquei no /etc/network/interfaces:
allow-hotplug wwan0
iface wwan0 inet dhcp
pre-up /usr/local/bin/qmi-network /dev/cdc-wdm0 start

Com isto basta:
root@zix:~# ifup wwan0
Loading previous state...
Starting network with 'qmicli -d /dev/cdc-wdm0 --wds-start-network --client-no-release-cid'...
Saving state... (CID: 1)
Saving state... (PDH: 35919936)
Network started successfully
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wwan0/12:d0:0d:3a:29:f1
Sending on LPF/wwan0/12:d0:0d:3a:29:f1
Sending on Socket/fallback
DHCPDISCOVER on wwan0 to 255.255.255.255 port 67 interval 8
DHCPREQUEST on wwan0 to 255.255.255.255 port 67
DHCPOFFER from ******
DHCPACK from ******
bound to ****** -- renewal in 3372 seconds.

E está feito.
Em locais com boa cobertura consegui obter quase os 50MB/5MB contratados.
Esta libqmi-glib será integrada no modem-manager e network-manager pelo que daqui a algum tempo estas aventuras já não serão necessárias.

A partilha da net
Os androids têm um bug parvo que não permite ligarem-se a uma rede ad-hoc.
O hotspot que o network-manager configura estava fora de questão.

Virei-me então para o hostapd que cria um access point wireless.
A configuração é mesmo muito simples.

/etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=PontoQuente
hw_mode=g
channel=11
wpa=1
wpa_passphrase=*****
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
wpa_ptk_rekey=600

Para inicializar:
root@zix:~# /etc/init.d/hostapd start
[ ok ] Starting hostapd (via systemctl): hostapd.service.

E pronto, há wireless para toda a gente.
Falta partilhar a net.

Ligar o ipv4 forwarding:
root@zix:~# echo "1" > /proc/sys/net/ipv4/ip_forward

ou permanentemente, colocando/descomentando no /etc/sysctl.conf esta linha
net.ipv4.ip_forward=1

E a regra de firewall
root@zix:~# iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE

Está feita a festa.
O meu ultrabook peso-pluma serviu net para todos os dispositivos sem stress.
E lá consegui ver o feed do aquário.

Entretanto, no sítio das férias, apercebí-me que a cobertura 4G era muito má (1Mb download, uns 100k de upload).
Tive que forçar o modem a ligar-se apenas com 3G (fiquei com +/- 14Mb/1Mb):

root@zix:~# echo -e "AT+ZSNT=2,0,0\r" > /dev/ttyUSB2

O ZTE MF820d suporta outros modos, fica aqui a lista:
AT+ZSNT=0,0,0 (Auto) - Default
AT+ZSNT=1,0,0 GPRS Only
AT+ZSNT=2,0,0 3G Only
AT+ZSNT=0,0,1 GPRS Preferred
AT+ZSNT=0,0,2 3G Preferred
AT+ZSNT=6,0,0 LTE Only (Tested)
AT+ZSNT=0,0,6 LTE Preferred (Not tested yet)

E o que me falta? Ver se estamos a apanhar rede 🙂
Criei um bash script muito simples tmn-signal (também dava um alias no .bashrc):
#!/bin/bash
echo $(echo `gsmctl -d /dev/ttyUSB3 SIG | cut -d' ' -f3` *100/31 | bc)%

root@zix:~# tmn-signal
87%

Ainda escrevi também uma extensão para o gnome3 para colocar o sinal na barra do topo mas foi às 3 pancadas com uma chamada síncrona ao tmn-signal e estava-me a bloquear o gnome uns segundos cada vez que fazia update.
Altamente irritamente, desliguei 🙂

Preparação para as férias – O aquário

foto do aquário

Estes peixes não têm jeito nenhum para pousar para a câmara

Temos um aquário com 3 peixes: 2 peixinhos dourados e um betta.
Como iamos estar fora duas semanas e não havia ninguém disponível para alimentar os bixos todos os dias, virei-me para os automatismos.


Comprei um alimentador automático a pilhas, programável para 12h ou 24h horas.
Testei durante uma semana antes das férias, flawless!
Que descanso 🙂

Comprei também um temporizador analógico para ligar e desligar a luz. Não percebia nada de tais coisas analógicas, o manual não ajudou nada (era bem pior que uma tradução automática) mas encontrei a explicação no youtube.
Era tão simples que me envergonhei e continuo a envergonhar-me aqui online 🙂
Agora a parte geek!
Ficaria eu descansado só com isto? Claro que não!
Eu tinha que ver o que se passava.

Peguei no meu velhinho Asus 1215N que estava guardado numa gaveta e fiz dele a minha webcam. Escolhi pau-para-toda-à-obra-de-video ffmpeg, o seu streaming server, o ffserver e o codec webm para ver no chrome sem chatices.

No servidor, ffserver.conf
Port 8090
BindAddress 94.23.74.32
MaxHTTPConnections 2000
MaxClients 10
MaxBandwidth 10000
CustomLog ffserver.log

<Feed feed1.ffm>
File /var/tmp/feed1.ffm
FileMaxSize 12G
</Feed>

<Stream live.webm>
Feed feed1.ffm
Format webm
NoAudio
VideoCodec libvpx
VideoSize 640x480
VideoFrameRate 10
AVOptionVideo flags +global_header
AVOptionAudio flags +global_header
PreRoll 30
StartSendOnKey
VideoBitRate 400
</Stream>

<Stream stat.html>
Format status
# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>
# Redirect index.html to the appropriate site
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>

Para iniciar:
ffserver -f ffserver.conf

Na source, o comando para enviar o stream:

ffmpeg -r 10 -s 640x480 -f video4linux2 -i /dev/video0 -threads 4 http://marcosantos.me:8090/feed1.ffm  > /dev/null 2>&1 &

E pronto, estava assim:

Tinha o alimentador automático programado para disparar às 8h26 e às 20h26 e aconteceu-me muitas vezes não conseguir ver em directo o bixos a comer.

Então configurei um cron ultra simples para gravar esse momento de suspense.

24 8,20 * * * /home/numian/Utils/fish/get-video.sh

Em que o get-video.sh é:

#!/bin/bash
wget --quiet -O /home/numian/Utils/fish/videos/fish_`date +"%d-%m-%y_%Hh%M"`.webm http://marcosantos.me:8090/live.webm & sleep 120; kill $!

Grava durante 2 minutos para uma dir identificando o ficheiro com data e hora.

E pronto, os peixes sobreviveram 🙂
Para a próxima tento magicar uma troca automática de água e limpeza.