sábado, 10 de junho de 2017

Recuperação do arranque após instalação do Windows

Após a instalação do Microsoft Windows o grub, utilizado para o arranque do Linux, é substituído pelo bootloader do Windows.
De seguida apresentam-se os passos para voltar a colocar o grub como bootloader principal do computador.

Arranque com um LiveCD ou pen do Linux Mint (ou outro).

Acedendo à consola deve confirmar-se quais as partições, deve colocar-se a letra do disco pretendido, normalmente será 'a' ou seja, /dev/sda:

sudo fdisk -l /dev/sdX
Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1  *     2048 62500863 62498816 29.8G 83 Linux
...

Deve ter-se atenção e procurar a partição linux, normalmente identificada com o código 83 (etx3, etx4 ou afins)

De seguida deve montar-se a partição para ser utilizada (neste caso seria /dev/sda1):

sudo mount /dev/sdXY /mnt

Após estar montada é possível restaurar o grub através da sua instalação no disco (neste caso /dev/sda):

sudo grub-install --root-directory=/mnt/ /dev/sdX

Esta operação deve concluir com sucesso e após isto é possível reiniciar o computador.
Ao arrancar o grub deverá ser carregado e deverá estar igual ao que estava antes da instalação do Windows.

Deve arrancar-se então com o Linux instalado e no final atualizar o grub para procurar outros sistemas operativos:

sudo update-grub

O sistema operativo Windows deverá ser reconhecido e pode reiniciar-se o computador para confirmar que já é possível escolher o Linux e o Windows.

domingo, 28 de maio de 2017

Instalação de um servidor OpenHAB

A interação com a IoT (Internet das Coisas) pode ser feita de diversas formas. O projeto OpenHAB permite tornar esta tarefa mais fácil e intuitiva de ser efetuada.

Atualmente na versão 2, o OpenHAB tem um conjunto de configurações que permitem aceder e configurar os diversos dispositivos de forma gráfica e fácil.

Neste guia será feita apenas a instação e configuração inicial do OpenHAB2.

0 - Pré-Requisitos

Neste caso será utilizado um servidor ubuntu 16.04 LTS designado de openhab.

As informações relativas à instalação do OpenHAB opem ser encontradas aqui:
http://docs.openhab.org/installation/index.html

É necessário garantir o suporte para JAVA, como não o java não vem instalado, é possível instalar:
apt install openjdk-8-jre-headless

É indicado que, por questões de compatibilidade, deve utilizar-se a versão 8 e pelo menos a revisão 101. É possível verificar se é o caso com:
java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-0ubuntu1.16.04.2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

1 - Instalação do OpenHAB2

Há várias formas de instalação do OpenHAB, neste caso será utilizada a versão estável oficial. Assim, é necessário adicionar a chave apt do servidor:
wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' | apt-key add -
apt-get install apt-transport-https

Adicionar o repositório:
echo 'deb https://dl.bintray.com/openhab/apt-repo2 stable main' | tee /etc/apt/sources.list.d/openhab2.list

Atualizar a cache apt:
apt-get update

Instalar o OpenHAB2 e addons (este último é opcional):
apt install openhab2 openhab2-addons

Verificar se o serviço está a correr:
systemctl status openhab2.service
* openhab2.service - openHAB 2 - empowering the smart home
   Loaded: loaded (/usr/lib/systemd/system/openhab2.service; enabled; vendor preset: enabled)
   Active: active (running) [...]

Arrancar o serviço:
systemctl start openhab2.service

Parar o serviço:
systemctl stop openhab2.service

Instalar o serviço para arranque automático com o sistema:
systemctl daemon-reload
systemctl enable openhab2.service

É possível verificar que o serviço já se encontra disponível abrindo através do browser:

2 - Cópias de Segurança

Na documentação de instalação é sugerido o seguinte procedimento para realizar cópias de segurança dos ficheiros de configuração e do utilizador relativos ao serviço openhab2.

Parar o serviço
systemctl stop openhab2.service

Criar o backup
TIMESTAMP=`date +%Y%m%d_%H%M%S`;
mkdir  ~/openhab2-backup-$TIMESTAMP
cp -arv /etc/openhab2 ~/openhab2-backup-$TIMESTAMP/conf
cp -arv /var/lib/openhab2 ~/openhab2-backup-$TIMESTAMP/userdata

Voltar a iniciar o serviço
systemctl start openhab2.service

3 - Configuração Inicial

Ao aceder pela primeira vez ao servidor OpenHAB através do browser ele permite a escolha do pacote de configurações a instalar:
Standard - Configura o PaperUI, Basic UI e HABPanel.
Simples - Configura apenas ferramentas para interação gráfica simples.
Expert - Instala todas as configuarações incluindo opções da versão 1.x

Neste caso foi escolhido o Expert pois permite aceder a todas as opções, incluindo as mais avançadas.

Referências

[1] - https://www.openhab.org - Página do projeot OpenHAB2
[2] - http://docs.openhab.org/installation/index.html - Informações gerais sobre o processo de Instalação
[3] - http://docs.openhab.org/installation/linux.html - Informação detalhada sobre o processo de instalação em Linux
[4] - http://docs.openhab.org/configuration/index.html - Informações sobre a configuração do OpenHAB2

sexta-feira, 26 de maio de 2017

Utilizar o NodeMCU - ESP8266

A board ESP8266 / NodeMCU permite ter um microcontrolador (como se fosse um arduino) com acesso direto à rede wireless 802.11 b/g/n por um preço muito atrativo (por cerca de 2,5€). [1] e [6]



Torna-se assim fácil criar projetos para a famosa IoT Internet of Things ou Internet das Coisas que podem registar informações (temperaturas, luminosidade, humidade, etc) ou efetuar operações (acionar iluminação, motores, bombas, etc), as opções estão limitadas apenas à imaginação e/ou capacidade técnica de cada um.

0 - Pré-requisitos

O óbvio será apenas um NodeMCU, cabo microUSB e computador.

Depois de algumas pesquisas sobre como se pode programar o NodeMCU, encontrei esta solução que me parece muito interessante e é a que mais me agrada.

Até aqui quando utilizava arduinos programava o código no Atom [2] e utilizava o Arduino IDE para fazer o upload do código para os Nano ou Uno.
Ao procurar formas de programar o NodeMCU encontrei algumas soluções que utilizam o arduino IDE [7] mas tropecei no PlataformIO [5] que permite dotar o Atom das ferramentas de compilar, upload, monitor de série, terminal, etc que funcionam de forma similar ao ambiente do arduino IDE. Simplesmente fantástico!

O PlatformIO permite também acrescentar os comandos de shell que permitem instalar e desinstalar bibliotecas e funcionalidades do PlatformIO.

Assim, para se começar a programar será necessário:

  1. Instalar Atom [2]
  2. Instalar PlatformIO [3]
  3. Instalar Shell Commands [4]


1 - Colocar o NodeMCU a piscar

Neste domínio o projeto mais simples é o pisca-pisca.

Criar um novo projeto para NodeMCU (a lista é longa...) e indicar a pasta onde vai ficar guardado o projeto.

Criar o ficheiro main.cpp na pasta src com:

#include <Arduino.h>
// Esta função é executada apenas uma vez quando a placa é ligada
void setup() {
  pinMode(D0, OUTPUT); // Inicializar D0 como output
  Serial.begin(9600);  // Inicializar a interface série
}

// Esta função está sempre a executar em loop
void loop() {
  digitalWrite(D0, LOW);  // Ligar o led da placa (sim, com LOW)
  Serial.println("On");
  delay(1000);            // Esperar 1000ms=1 segundo
  digitalWrite(D0, HIGH); // Desligar o led da placa
  Serial.println("Off");
  delay(1000);            // Esperar 1000ms=1 segundo
}

De seguida deve utilizar-se o botão de Compilar para confirmar se está tudo correto e a compilação funciona sem problemas.

Depois deve ligar-se o NodeMCU por USB ao computador e utilizar o comando de Upload para enviar o projeto compilado anteriormente para a placa. Enquanto é programada a placa pisca rapidamente um led no módulo ESP-12 e, se tudo correr bem, passados alguns segundos o led do NodeMCU perto da porta miniUSB começa a piscar de segundo a segundo.

Ao abrir o Serial Monitor é possível observar que quando D0 está LOW o led acende e quando está HIGH o led apaga.

2 - Instalar suporte para outros componentes

Como referido anteriormente o PlatformIO permite adicionar diversas funcionalidades através de alguns comandos simples.

Abrindo o Terminal do PlatformIO é possível procurar bibliotecas (libraries), por exemplo, sobre o sensor DHT11:
platformio lib search dht11

Aparece depois uma lista que indica as bibliotecas que possuem DHT11 e é possível depois instalar uma ou várias dessas bibliotecas através da opção install seguida do número do pacote, por exemplo:
platformio lib install 849 

Neste caso vai ser instalada a biblioteca SimpleDHT por Winlin [8].

Instalar suporte para o sensor DS18B20
platformio lib install 54 

Neste caso, para além da biblioteca DallasTemperature desenvolvida por Guil Barros, Miles Burton, Rob Tillaart, Tim Newsome [9], será também instalada a biblioteca OneWire que permite a comunicação I2C utilizada pelo DS18B20.

Para desinstalar utiliza-se a opção uninstall seguida do número da biblioteca instalada.
platformio lib uninstall 123


Referências

[1] - http://nodemcu.com/index_en.html - Informações e documentação sobre o NodeMCU

[2] - https://atom.io - Informações e instruções de instalação do IDE Atom

[3] - http://platformio.org - Insformações e documentação sobre o PlatformIO

[4] - http://docs.platformio.org/en/latest/installation.html - Instalar shell commands do PlatformIO

[5] - https://www.losant.com/blog/getting-started-with-platformio-esp8266-nodemcu - Programar o NodeMCU através do PlatformIO

[6] - https://www.htlinux.com/esp8266-nodemcu/ - Informações gerais sobre o NodeMCU

[7] - https://oneguyoneblog.com/2017/01/17/esp8266-nodemcu-arduino-ide-linux/ - Programar o NodeMCU através do arduino IDE.

[8] - http://platformio.org/lib/show/849/SimpleDHT - Biblioteca do PlatformIO para o DHT11

[9] - http://platformio.org/lib/show/54/DallasTemperature - Biblioteca do PlatformIO para o DS18B20

domingo, 21 de maio de 2017

Scanner de rede com o Raspberry Pi

Instalar software

# apt-get update
# apt-get install sane

Testar funcionamento do scanner no servidor

Abrir shell como utilizador saned
# su saned -s /bin/sh

Mostrar os grupos do utilizador saned
$ groups
saned scanner

$ sane-find-scanner
[...]
found USB scanner (vendor=0x03f0 [HP], product=0xc111 [Deskjet 1510 series]) at libusb:001:004
[...]

$ scanimage -L
device `hpaio:/usb/Deskjet_1510_series?serial=CN39219N8W05YR' is a Hewlett-Packard Deskjet_1510_series all-in-one

NOTA: Caso os dois comandos anteriores não funcionem, teste-os como root ou com sudo. Se funcionarem convém verificar as permissões de:

# ls /dev/bus/usb/001/ -la
total 0
drwxr-xr-x  2 root root    120 Jan  1  1970 .
drwxr-xr-x  3 root root     60 Jan  1  1970 ..
crw-rw-r--  1 root root 189, 0 May 21 20:39 001
crw-rw-r--  1 root root 189, 1 May 21 20:39 002
crw-rw-r--  1 root root 189, 2 May 21 20:39 003
crw-rw-r--+ 1 root lp   189, 3 May 21 20:54 004

Adicionar o utilizador saned ao grupo lp
# adduser saned lp

Configurar servidor

Editar e ativar o daemon RUN=yes
# nano /etc/default/saned
[...]
RUN=yes

Editar  /etc/sane.d/saned.conf e acrescentar rede:
[...]
## Access list
192.168.1.0/24

E descomentar
data_portrange = 10000 - 10100

Arrancar o servidor SANE
# systemctl start saned.socket

Ativar o arranque automático do serviço aquando do arranque da máquina
# systemctl enable saned.socket

Verificar o estado do serviço
# systemctl status saned.socket
● saned.socket - saned incoming socket
   Loaded: loaded (/lib/systemd/system/saned.socket; enabled)
   Active: active (listening) 
   Listen: [::]:6566 (Stream)
 Accepted: 0; Connected: 0

Configurar o cliente

No cliente existem várias soluções. A normal será o xsane ou o simple-scan (que vem instalado por defeito no Linux Mint).

Editar o ficheiro
$ sudo nano /etc/sane.d/net.conf

E acrescentar o IP ou hostname do servidor
[...]
## saned hosts
192.168.1.103
[...]

De seguida resta iniciar a aplicação de digitalização e o scanner de rede deverá ser detetado.
Caso não seja detetado pode ser necessário adicionar o utilizador ao grupo scanner
sudo adduser utilizador scanner

Após isto é necessário terminar sessão e voltar a entrar.

Referências

[] - https://samhobbs.co.uk/2014/07/raspberry-pi-print-scanner-server
[] - https://wiki.debian.org/SaneOverNetwork

domingo, 26 de março de 2017

Canon DSLR Time Lapse

Canon DSLR tem um jack de 2.5mm para fazer o disparo de fotografias.

Pinout das máquinas Canon (2.5mm):
ponta - obturador - shutter
anel - focus
malha - ground

Ao fechar o circuito entre ponta e malha é disparado o obturador e é capturada uma ou várias fotografias.
Ao fechar o circuito anel e malha a máquina faz a focagem (caso tenha AF autofocus)

Para efetuar capturas em Time-Lapse é possível utilizar um microcontrolador, neste caso um arduino nano, e algumas ligações para permitir o disparo automático num ritmo interessante.

Algumas informações sobre os intervalos de captura [1].

Esquema de Ligações

É nessário depois ligar um cabo stereo (com três condutores) à câmara (minijack 2.5mm stereo do lado da câmara).

Código para arduino

/***********************************************************
  T I M E  -  L A P S E
    by Mário Pinto @ 2017.03.24
    for CANON DSLR

    about:
    Code will autofocus once when it startups and then will release shutter
    after the number of seconds specified in DELAY.
    SHUTTER and FOCUS will define pins used for each of these camera functions.
    LED will define the pin to have a status led blinking.

    blink code:
      » startup: 4 quick blinks to autofocus
      » runtime: 1 blink each SHUTTER released

    tips:
      » Choose an interval that allows time for the camera to store the file
      before next capture, this way will ensure no frames are dropped.
      » It's advised to focus the lens before the captures start and set the
      lens to MF (manual focus) so it will always take the photos (regardless
      of focusing).
      » More great tips from Ryan at
      http://www.learntimelapse.com/how-to-select-a-time-lapse-interval/

      1 second
      Moving traffic
      Fast moving clouds
      Drivelapses

      1- 3 seconds
      Sunsets
      Sunrises
      Slower moving clouds
      Crowds
      Moon and sun near horizon (or telephoto)
      Things photographed with a telephoto[/one_fourth]

      15 – 30 seconds
      Moving shadows
      Sun across sky (no clouds) (wide)
      Stars (15 – 60 seconds)

      Longer
      Fast growing plants (ex vines) (90 – 120 seconds)
      Construction projects (5min – 15min)[/one_fourth_last]

************************************************************/
int DELAY   = 2;          // Intervalo entre capturas

int SHUTTER = 3;          // Pin para SHUTTER
int FOCUS   = 2;          // Pin para FOCUS
int LED     = 13;         // Pin para LED

// blink(LED)
void blink(int pin){              // Piscar o LED 50ms
  digitalWrite(pin, HIGH);        // Ligar LED
  delay(50);
  digitalWrite(pin, LOW);         // Desligar LED
}

// focus(FOCUS)
void focus(int pin){               // Focar durante algum tempo

  int n=3;
  digitalWrite(pin, LOW);
  while(n-- > 0){
    blink(LED);
    delay(500);
  }
  digitalWrite(pin, HIGH);
}

void setup(){
  pinMode(SHUTTER, OUTPUT);       // Definir o pin do SHUTTER como output
  digitalWrite(SHUTTER, HIGH);
  pinMode(FOCUS, OUTPUT);         //
Definir o pin do FOCUS como output 
  digitalWrite(FOCUS, HIGH);
  pinMode(LED, OUTPUT);           // Definir o pin do LED como output
  digitalWrite(LED, LOW);
  focus(FOCUS);                   // Focar
}

void loop(){
  digitalWrite(LED, HIGH);          // Ligar LED
  digitalWrite(SHUTTER, LOW);       // Ativar SHUTTER
  delay(100);                       // Esperar um pouco para libertar

  digitalWrite(SHUTTER, HIGH);      // Desativar SHUTTER
  digitalWrite(LED, LOW);           // Deligar LED
  delay(1000 * DELAY);              // Esperar

}


Referências

[1] - http://www.learntimelapse.com/how-to-select-a-time-lapse-interval/

terça-feira, 7 de março de 2017

Proxmox VE 4 | upgrade a partir de 3.x

Ao instalar o Promox VE 4 utilizei ZFS RAID1 (com dois discos de 2TB).

Após a instalação do Proxmox VE são apresentados dois armazenamentos:
- local
- local-zfs

Copiar dados e informação

Devem criar-se dumps dos contentores no servidor antigo (Proxmox 3.x) e anotar todas as informações de rede de cada um deles.
Após a criação dos dumps dos contentores, é necessário copiá-los para o novo servidor para se terminar depois o processo de migração [0].
- Montar disco com os dumps dos containers OpenVZ (feitos no Promox VE 3.x)
- Mover para /var/lib/vz/dump

O disco com a informação antiga estava com software RAID1. Assim, para aceder ao disco antigo (mdadm com RAID1) para copiar a informação para o novo host foi necessário [1]:
mount /dev/sdc2 /mnt/old_hdd
mount: unknown filesystem type 'linux_raid_member'

Para verificar o estado do RAID na partição
mdadm --examine /dev/sdd4

Para criar o dispositivo md
mdadm -A -R /dev/md1 /dev/sdc2

Para montar é necessário utilizar o mapper LVM para montar o volume com o nome pve-data:
mount /dev/mapper/pve-data /media/BACKUP

É possível agora copiar toda a informação para o novo host.

Migração de OpenVZ para LXC

Uma vez copiados os dumps, é necessário aceder ao armazenamento e escolher cada um dos dumps e restaurá-lo (Restore).
É necessário definir toda a configuração de rede de cada contentor antes de o arrancar.

Partilha de informação por bind mount

A partilha de informação via bind mount (montar uma pasta do host num ou vários contentores) continua a ser possível mas faz-se de forma diferente [2].
Adicionar no ficheiro conf do LXC em questão /etc/pve/lxc/100.conf (para o contentor 100):
mp0: /srv/DATA/media,mp=/srv/media

Onde mp0 é o primeiro ponto de montagem do contentor, /srv/DATA/media é a pasta no host a montar no cliente em /srv/media.
No total é possível especificar para cada contentor 10 pontos de montagem desta forma (mp0, mp1, mp2, etc).

Após a definição de todos os bind mount points de cada contentor é possível arrancar o contentor e confirmar se a informação está correta.



domingo, 5 de março de 2017

Debian com OpenBox, Conky, Tint2, etc

.:.:.work.in.progress.:.:.

Colocar utilizador com permissões sudo
usermod -aG sudo <username>

Instalar software base

apt install uptimed tmux sshfs cups sshuttle curl hdparm rsync curl cabextract

Instalar ambiente gráfico

apt install openbox lightdm light-locker conky conky-all tint2 terminator gmrun gvfs gvfs-backends thunar thunar-volman thunar-archive-plugin tumbler xarchiver geany galculator arandr gsimplecal alsa-utils pulseaudio evince mousepad

Tipos de Letra

apt-get install fonts-linuxlibertine fonts-mgopen ttf-adf-* fonts-lobster* ttf-anonymous-pro ttf-bitstream-vera fonts-vollkorn fonts-tuffy fonts-tomsontalks fonts-stix mscore ttf-liberation

Calibri e outras distribuídas com Windows 7
https://wiki.debian.org/ppviewerFonts

Virtualização com Virtualbox

https://www.virtualbox.org/wiki/Linux_Downloads

Instalar Som

apt-get install alsa-utils pulseaudio volti
usermod -a -G pulse mjp

pulseaudio --start

Adicionar volti & ao autostart
Pode ser necessário alterar a configuração em ~/.config/volti/config para indicar outro card_index em vez de 0 (caso sejam detetadas diversas placas).

Instalar Desktop Software

Firefox
apt install firefox-esr

Brave Browser
 
Opera
 
Software diverso: Thunderbird, Remmina, Darktable, Gimp, VLC, Filezzila, OBS
apt install thunderbird remmina remmina-plugin-rdp darktable gimp audacious vlc filezilla obs-studio 
 
Netbeans
apt install default-jre



Instalar deb-multimedia.org

Ativar o repositório:

Instalar as chaves com
apt-get update
apt-get install deb-multimedia-keyring





apt-get install audacity

jessie
Gimp - 2.8.14
Audacity - 2.0.6
Fotowall - 0.9-11
Mediainfo-gui

apt-get install gimp audacity fotowall mediainfo-gui

jessie-backports
Darktable - 2.0.7
Inkscape - 0.92.0.3
Blender - 2.74
Calibre - 2.75.1

apt-get install -t jessie-backports darktable inkscape blender calibre

Lightworks on Debian Jessie
- Necessita da libjpeg8 que apenas existe no wheezy (old-stable!!) e no sid...
wget http://ftp.us.debian.org/debian/pool/main/libj/libjpeg8/libjpeg8_8d1-2_amd64.deb
dpkg -i libjpeg8_8d1-2_amd64.deb
dpkg -i lwks-12.6.0-amd64.deb
apt-get install -f



HACKS and TWEAKS

Executar ficheiros a partir de ~/bin.
Editar .bashrc e adicionar:
export PATH=$PATH:~/bin

Virtualbox
 sudo usermod -a -G vboxusers $USER

Instalar suporte para AMD A10 Kaveri APU
Não suportava resoluções acima de 1920x1080 (por exemplo, 2560x1080)
apt install firmware-linux-nonfree
reboot


Gestão de janelas
O ficheiro de configuração do openbox é ~/.config/openbox/rc.xml

Na secção para especificação de teclas encontra-se a seguir a:
<!-- Keybindings for running aplications -->

Aqui é possível perceber melhor o funcionamento: http://openbox.org/wiki/Help:Bindings

A sintaxe específica define uma combinação de teclas, por exemplo: W-p para Windows+p ou S-C-p para SHIFT*CTRL+p
<keybind key="my-key-combination">
  <action name="my-action">
    ...
  </action>
</keybind>

Para executar um comando a ação é:
<action name="Execute">
  <command>my-command</command>
</action>

As ações que se podem utilizar estão disponíveis em: http://openbox.org/wiki/Help:Actions

Para saber as teclas pressionadas pode dar jeito utilizar o comando xev que, a partir de um terminal lista os eventos ocorridos (rato e teclado).


[https://wiki.archlinux.org/index.php/Openbox#Window_snapping]
    <!-- 50% LEFT, CENTER, RIGHT -->
    <keybind key="W-KP_4">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <height>100%</height>
        <width>50%</width>
        <x>0</x>
        <y>0</y>
      </action>
    </keybind>
    <keybind key="W-KP_5">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <height>100%</height>
        <width>50%</width>
        <x>25%</x>
        <y>0</y>
      </action>
    </keybind>
    <keybind key="W-KP_6">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <height>100%</height>
        <width>50%</width>
        <x>-0</x>
        <y>0</y>
      </action>
    </keybind>
    <!-- 25% LEFT, CENTER, RIGHT -->
    <keybind key="W-KP_1">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <height>100%</height>
        <width>25%</width>
        <x>0</x>
        <y>0</y>
      </action>
    </keybind>
    <keybind key="W-KP_2">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <height>100%</height>
        <width>25%</width>
        <x>38%</x>
        <y>0</y>
      </action>
    </keybind>
    <keybind key="W-KP_3">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <height>100%</height>
        <width>25%</width>
        <x>-0</x>
        <y>0</y>
      </action>
    </keybind>
    <!-- 33% LEFT, CENTER, RIGHT -->
    <keybind key="W-KP_7">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <height>100%</height>
        <width>33%</width>
        <x>0</x>
        <y>0</y>
      </action>
    </keybind>
    <keybind key="W-KP_8">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <height>100%</height>
        <width>33%</width>
        <x>33%</x>
        <y>0</y>
      </action>
    </keybind>
    <keybind key="W-KP_9">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <height>100%</height>
        <width>33%</width>
        <x>-0</x>
        <y>0</y>
      </action>
    </keybind>
    <!-- MAXIMIZE -->
    <keybind key="W-KP_0">
      <action name="ToggleMaximizeFull"/>
    </keybind>
    <!-- RESIZE WIDTH TO SHOW CONKY -->
    <keybind key="W-KP_Divide">
      <action name="UnmaximizeFull"/>
      <action name="MoveResizeTo">
        <width>1030</width>
        <height>100%</height>
        <x>0</x>
      </action>
    </keybind>
    <!-- MOVING UP,DOWN 50% HEIGHT-->
    <keybind key="W-Up">
      <action name="MoveResizeTo">
        <height>50%</height>
      </action>
      <action name="MoveToEdge">
        <direction>north</direction>
      </action>
    </keybind>
    <keybind key="W-Down">
      <action name="MoveResizeTo">
        <height>50%</height>
      </action>
      <action name="MoveToEdge">
        <direction>south</direction>
      </action>
    </keybind>
    <!-- MOVING LEFT<>RIGHT -->
    <keybind key="W-Left">
      <action name="MoveToEdge">
        <direction>west</direction>
      </action>
    </keybind>
    <keybind key="W-Right">
      <action name="MoveToEdge">
        <direction>east</direction>
      </action>
    </keybind>
Abrir aplicações e programas
rc.xml
    <!-- LOCK SCREEN -->
    <keybind key="W-l">
      <action name="Execute">
        <command>/usr/bin/dm-tool lock</command>
      </action>
    </keybind>
    <!-- SCREENSHOT -->
    <keybind key="Print">
      <action name="Execute">
        <command>scrot -s -e 'mv $f ~/downloads/'</command>
      </action>
    </keybind>
    <keybind key="A-Print">
      <action name="Execute">
        <command>scrot -e 'mv $f ~/downloads/'</command>
      </action>
    </keybind>
    <!-- EXECUTAR -->
    <keybind key="W-r">
      <action name="Execute">
        <command>gmrun</command>
      </action>
    </keybind>
    <!-- TERMINAL -->
    <keybind key="W-t">
      <action name="Execute">
        <command>terminator</command>
      </action>
    </keybind>
    <!-- FILE EXPLORER -->
    <keybind key="W-e">
      <action name="Execute">
        <command>thunar</command>
      </action>
    </keybind>
    <!-- GEANY -->
    <keybind key="W-f">
      <action name="Execute">
        <command>geany</command>
      </action>
    </keybind>
    <!-- GALCULATOR -->
    <keybind key="W-c">
      <action name="Execute">
        <command>galculator</command>
      </action>
    </keybind>
    <!-- Audacious -->
    <keybind key="W-a">
      <action name="Execute">
        <command>audacious</command>
      </action>
    </keybind>
    <!-- Opera -->
    <keybind key="W-o">
      <action name="Execute">
        <command>opera</command>
      </action>
    </keybind>
    <keybind key="W-S-o">
      <action name="Execute">
        <command>opera --private</command>
      </action>
    </keybind>
    <!-- Firefox -->
    <keybind key="W-p">
      <action name="Execute">
        <command>firefox</command>
      </action>
    </keybind>
    <keybind key="W-S-p">
      <action name="Execute">
        <command>firefox --private-window</command>
      </action>
    </keybind>
    <!-- Chrome -->
    <keybind key="W-i">
      <action name="Execute">
        <command>google-chrome</command>
      </action>
    </keybind>
    <keybind key="W-S-i">
      <action name="Execute">
        <command>google-chrome --incognito</command>
      </action>
    </keybind>

Para carregar alterações:
openbox --reconfigure


Temas
GTK2
apt-get install gtk-theme-switch gtk2-engines gtk2-engines-murrine

Dark:
[http://www.deviantart.com/art/CathexiS-Suite-329275044]

Bloquear sessão
apt-get install light-locker
dm-tool lock

Proteção de ecrã

apt-get install xscreensaver xscreensaver-gl
Adicionar em /etc/xdg/openbox/autostart
xscreensaver -no-splash &

Para configurar executar:
xscreensaver-demo

Gsimplecal
Ao clicar no calendário do tint2 é possível abrir o calendário com o gsimplecal
tint2rc:
clock_lclick_command = gsimplecal

O ficheiro de configuração do gsimplecal:
~/.config/gsimplecal/config
show_calendar = 1
show_timezones = 0
mark_today = 1
show_week_numbers = 0
close_on_unfocus = 0
external_viewer = firefox https://www.google.com/calendar/render?action=TEMPLATE\&text=\&dates="%Y%m%d"T090000Z/"%Y%m%d"T100000Z\&details=\&location=\&sf=true\&output=xml
clock_format = %a %d %b %H:%M
force_lang = en_US.utf8
mainwindow_decorated = 0
mainwindow_keep_above = 1
mainwindow_sticky = 1
mainwindow_skip_taskbar = 1
mainwindow_resizable = 0
mainwindow_position = mouse
mainwindow_xoffset = 0
mainwindow_yoffset = 0
clock_label = UTC
clock_tz = :UTC
clock_label = Local
clock_tz =

A opção external_viewer permite definir o programa a executar quando se clica duas vezes num dia. Neste caso é aberto o browser com uma ligação para a criação de um novo evento no calendário Google na data clicada.



Hack on tint2
[https://wiki.archlinux.org/index.php/tint2]
[https://gitlab.com/o9000/tint2/blob/master/doc/tint2.md]
[https://petermolnar.net/hacking-tint2-panel-weather-cpu-temperature-and-volume-executors/]

 Outras coisas

[https://www.prahladyeri.com/blog/2016/02/minimal-debian-desktop-setup.html] - check
[https://wiki.debian.org/Openbox] - falta temas

domingo, 30 de outubro de 2016

Raspberry Pi - Imagem a Preto e Branco com RCA

Nada melhor para tentar dar vida a um velho "aquário" Grundig de 35cm que não se ligava há anos e colocá-lo como display de um Raspberry Pi para entreter petizes.


Problema: A televisão apenas tem entrada SCART e a saída analógica do Raspberry Pi é RCA... Existem vários adaptadores SCART para RCA [1], mas neste processo acontecia magia...

Verificar tudo:
Rpi » RCA>SCART  » "Aquário" - Imagem a Preto e Branco...
Rpi » RCA>SCART  » TV Recente - Imagem a Cores

Conclusão, o SCART da TV velha deixou de dar a cores, mas...
Box TV » SCART » "Aquário" - Imagem a Cores

Parece que o problema reside na forma como o Raspberry Pi envia os sinais de vídeo composto (RCA) que por defeito é NTSC e o "aquário" apenas suporta PAL (daí funcionar na TV Recente). [2] e [3]

Assim, é necessário aceder ao ficheiro config.txt localizado na partição de arranque (boot) do cartão e descomentar ou adicionar a linha:
sdtv_mode=2

Os modos sdtv suportados são:  0 NTSC, 1 NTSC Japão, 2 PAL, 3 PAL Brasil.


[1] - Adaptadores SCART/RCA no Aliexpress
[2] - https://www.raspberrypi.org/forums/viewtopic.php?f=26&t=17074
[3] - http://elinux.org/R-Pi_Troubleshooting#Composite_displays_only_black_and_white_image

sábado, 22 de outubro de 2016

Servidor de Impressão Raspberry Pi

Utilização de um Raspberry Pi 2B como servidor de impressão de uma impressora HP Deskjet 1510 PSC (Print Scan Copy).

A partir de uma imagem Raspbian Jessie Lite é possível configurar todo o sistema remotamente por SSH e browser.

Há muitas informações úteis na página do projeto debian [1] permitem perceber melhor o funcionamento.

Instalação e Configuração do CUPS

sudo apt-get install cups hplip

Para configuração remota via web é necessário ativar o acesso à interface web através da alteração da configuração Listen e acrescentar os endereços que têm acesso à mesma (neste caso a rede 192.168.0.*):
sudo nano /etc/cups/cupsd.conf
(...)
ServerAlias *
Listen *:631
(...)
# Restrict access to the server...
<Location />
  Order allow,deny
  Allow 192.168.0.*
</Location>

# Restrict access to the admin pages...
<Location /admin>
  Order allow,deny
  Allow 192.168.0.*
</Location>

Atualização: A diretiva ServerAlias * permite aceder ao servidor CUPS através do IP ou do nome.

Por defeito o CUPS permite a autenticação a utilizadores do SystemGroup [2] e o utilizador pi não pertence a nenhum destes grupos.

Adicionar pi ao grupo lpadmin.
sudo usermod -a -G lpadmin pi

Para confirmar os grupos do utilizador:
groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev spi i2c gpio lpadmin

Para reiniciar o serviço após alterações às configurações é necessário:
sudo systemctl restart cups.service 

A partir daqui é possível configurar uma nova impressora via browser acedendo a:
http://raspberrypi:631

Ao adicionar uma impressora é reconhecida a impressora e de seguida é necessário escolher o driver da lista muito numerosa, neste caso:
HP PSC 1510 Series, hpcups 3.14.6

É necessário ativar a partilha da impressora aquando da instalação ou então mais tarde na configuração CUPS (Share printers connected to this system)

A partir daqui qualquer máquina na rede com o CUPS (normalmente qualquer Linux com sistema de impressão, por exemplo, ubuntu, Mint, etc) vai ver a impressora sem ser necessário qualquer instalação.

Resolução de Problemas

1. Ao aceder através do nome do servidor na porta 631 dá erro Bad Request
É necessário utilizar a diretiva ServerAlias *, que permite aceder ao servidor CUPS através do IP ou do nome.

2. Quando se manda imprimir o trabalho não é enviado
Confirmar se a impressora não está parada ou com erro através da página de administração: https://raspberrypi:631/printers

3. Debug
Pode ajudar alterar a diretiva LogLevel de warn para debug de forma a ter mais detalhes nos logs:
sudo less /var/log/cups/error_log

Referências

quinta-feira, 20 de outubro de 2016

Kodi e CEC - Debug e alteração de teclas do comando

Com um Raspberry Pi a correr o OpenELEC, o KODI reconhece o CEC enviado pela televisão. Contudo, não há qualquer tecla no comando que faça voltar para atrás, o que traz alguns inconvenientes na interação com o KODI.

Uma forma para fazer isso trata-se em colocar uma reafetação de inputs do CEC de forma a verificar o que está a ser pressionado, se está bem, se há outras teclas, etc. Foi o que descobri no blog de Steven Occhipinti [0].

É necessário ter acesso à pasta ~/.kodi/userdata/keymaps/ e aí colocar o ficheiro remote.xml [1] que permite fazer o debug e reiniciar o openelec.

Por SSH (a senha de root é openelec)
ssh root@openelecIP
cd ~/.kodi/userdata/keymaps/

wget https://gist.github.com/stevenocchipinti/42f2eca2a9f04ed9e52f/raw/d9fbf3c20edbff85d71b99b47d202d8a0ab1a8d9/remote.xml
reboot

Ao arrancar, de cada vez que se pressionar uma tecla aparece uma notificação indicando que ação foi desencadeada.

No meu caso todas as teclas que funcionam estão corretas e não há qualquer tecla nova. No entanto, reparei que quando pressionava rapidamente tecla verde e tecla amarela, aparecia a ação Title.
Como esta ação não serve para muito, poderia utilizar esta forma para ativar a ação Back que permite voltar para trás e dá muito jeito na interação com o kodi.

Assim, para reafetar a ação da tecla Title, resta copiar um remote.xml original, encontrar a ação Title e trocar para Back.

Por SSH:
ssh root@openelecIP
cd ~/.kodi/userdata/keymaps/

cp /usr/share/kodi/system/keymaps/remote.xml .
nano remote.xml
(...)
      <rootmenu>PreviousMenu</rootmenu>
      <title>Back</title>

      <info>Info</info>
(...)

É possível então alterar todas as entradas da ação Title para que faça execute Back.
No nano para procurar CTRL+W e pode procurar-se por <title> e ir substituindo.

Após guardar e reiniciar, a conjugação de teclas verde/amarela passou a funcionar como o voltar para trás, permitindo voltar ao menu principal, por exemplo.


[0] - http://blog.stevenocchipinti.com/2015/04/04/configuring-a-hdmi-cec-remote-in-kodi/
[1] - remote.xml - https://gist.github.com/stevenocchipinti/42f2eca2a9f04ed9e52f