quarta-feira, 26 de julho de 2017

owncloud upgrade para ubuntu 16.04

O setup inicial era este:
- ubuntu 14.04.5 LTS
- owncloud 8.1.9.2

Após o upgrade para ubuntu 16.04 pretendia também atualizar o owncloud. Contudo no repositório a última versão era a 9... E não é possível fazer upgrades de vários major.

Assim, é necessário ir fazendo o upgrade entre as diversas versão major:
https://owncloud.org/changelog/#latest8.0

Neste caso
- 8.1.9.2 » 8.1.11
- 8.1.11 » 8.2.11
- 8.2.11 » 9.0.10
- 9.0.10 » 9.1.6

Fazer backup da instalação anterior
cd /var/www
mv owncloud owncloud_8.1.9

Obter última versão e extrair
tar xjvf owncloud-8.1.11.tar.bz2

Copiar configuração da versão anterior (neste caso não é necessária a pasta data porque na configuração está definida noutro local e não dentro da pasta owncloud)
cp owncloud_8.1.9.2/config/config.php owncloud/config/config.php

chown www-data:www-data -R owncloud

Executar o upgrade
cd /var/www/owncloud
sudo -u www-data ./occ upgrade

Repetir os passos para cada uma das versões.

Configurar repositórios

wget -nv https://download.owncloud.org/download/repositories/stable/Ubuntu_16.04/Release.key -O Release.key
apt-key add - < Release.key
Run the following shell commands as root to add the repository and install from there.

sh -c "echo 'deb http://download.owncloud.org/download/repositories/stable/Ubuntu_16.04/ /' > /etc/apt/sources.list.d/owncloud.list"
apt-get update
apt-get upgrade


PlexMediaServer e minidlna no ubuntu 16.04

Plex Media server

Ao fazer o upgrade do ubuntu 14.04.5 LTS para o 16.04 o plexmediaserver não funcionava e não era instalado a partir do repositório oficial.

Havia um bug no instalador plexmediaserver_1.7.5.4035-313f93718_amd64.deb e entretanto foi lançada uma versão que ainda não está nos repositórios, a 4036.

Assim, é necessário remover a versão instalada, descarregar manualmente a nova e instalar:
apt-get remove plexmediaserver

wget "https://doc-04-7o-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/726psu5fkd99d3vha2cvlf3t71h6elik/1501056000000/17568712713587208033/*/0B57qR6p2QjXpVWtZYjVUcVI1WjQ?e=download" -O plexmediaserver_1.7.5.4036-fef9bbe02_amd64.deb

dpkg -i plexmediaserver_1.7.5.4036-fef9bbe02_amd64.deb

Mais informações aqui:
https://forums.plex.tv/discussion/277748/cant-install-plex-1-7-5-on-ubuntu-16-04

minidlna

Também o minidlna ficou com problemas após a atualização.
A solução passou por remover o pacote e voltar a instalar mantendo a configuração (/etc/minidlna.conf)

apt-get remove minidlna

apt-get install minidlna

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