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.