Criando um gráfico com bandeiras dos países.

Esses tempos, um colega me pediu para fazer alguns gráficos tipo os que tem no google analytics, mais especificamente nesse estilo aqui.

É de uma versão mais antiga dessa figura, mas a ideia é essa, basicamente um gráfico de barras na vertical. A única parte difícil, foi as bandeiras, primeiro foi achar essas bandeiras, depois inserir na figura.

Para achar as figuras, a primeira coisa foi procurar algum pacote que tivesse isso pronto, achei que encontraria, mas não achei nenhum, então ao procurar pelas bandeiras, uma fonte seria baixar diretamente do wikipedia, que tem bandeiras para todos os paises, mas eu achei esse conjunto aqui, que inclusive está em um repositorio do github que podemos clonar, o que facilita bastante o trabalho, ali temos as bandeiras em formato png em vários tamanhos, eu preferi usar o de maior resolução.

então clonado o repositório com as bandeiras, eu fiz a figura com o seguinte código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
library(png)
paises<-list.files("64")
 
##Figura country.png
 
country<-c("Brazil","United States","Portugal","Mozambique","Mexico","Germany","Peru","Australia","Cape Verde","Angola")
country_br<-c("Brasil","Estados Unidos","Portugal","Mozambique","México","Alemanha","Perú","Austrália","Cabo Verde","Angola")
sessions<-c(2113,259,85,63,54,49,38,37,36,36)
sessions_percentage<-c(60.39,7.4,2.43,1.8,1.54,1.4,1.09,1.06,1.03,1.03)
 
ampliacao <- 2
jpeg("country.jpg",width = ampliacao*480,height = ampliacao*480,pointsize = ampliacao*12)
escala<-barplot(rev(sessions_percentage),horiz=T,xlim=c(-150,100),xaxt="n",col="#76A7FA")
text(rep(0,10),escala,rev(sessions),pos=2)
text(rev(sessions_percentage)+14,escala,paste(rev(format(round(sessions_percentage, 2), nsmall = 2)),"%",sep=""))
text(rep(-130,10),escala,10:1,pos=2)
text(rep(-120,10),escala,rev(country_br),pos=4)
mtext(c("País","Sessões","% Sessões"),3,0,at=c(-125,-15,35))
 
list.files()
 
for(i in 1:10){
    country[i]
    posicao<-agrep(country[i],paises)
    paises[posicao]
    bandeira<-readPNG(paste("64/",paises[posicao],sep=""))
    rasterImage(bandeira,-133,rev(escala)[i]-0.5,-117,rev(escala)[i]+0.5)
}
dev.off()

Que gera a seguinte figura.

Bem legal eu achei, agora vou fazer alguns comentários do meu código.

Primeiro:

1
2
country<-c("Brazil","United States","Portugal","Mozambique","Mexico","Germany","Peru","Australia","Cape Verde","Angola")
country_br<-c("Brasil","Estados Unidos","Portugal","Mozambique","México","Alemanha","Perú","Austrália","Cabo Verde","Angola")

Bem como são poucos dados, eu digitei o nomes do países em inglês e em português, isso porque o nome em inglês eu uso para achar o nome do arquivo da bandeira, que é o nome do pais, e em português para usar na figura em si.

Depois disso para facilitar a mudança do tamanho, eu costumo guardar uma variável para o tamanho, que multiplica a largura, a altura e o tamanho do ponto, assim só altero ela para mudar o tamanho da figura, a sua resolução.

1
2
3
4
5
6
ampliacao <- 2
jpeg("country.jpg",width = ampliacao*480,height = ampliacao*480,pointsize = ampliacao*12)
 
##Figura
 
dev.off()

A figura em si é um barplot na vertical, a única coisa é que mudo bastante as margens, o tamanho do eixos de forma a caber as outras informações e bandeiras, que são colocadas com a função text para dentro da figura e mtext para a parte de fora. Depois disso, talvez essa parte ainda tenha algo de interesse.

1
2
3
4
5
6
7
for(i in 1:10){
    country[i]
    posicao<-agrep(country[i],paises)
    paises[posicao]
    bandeira<-readPNG(paste("64/",paises[posicao],sep=""))
    rasterImage(bandeira,-133,rev(escala)[i]-0.5,-117,rev(escala)[i]+0.5)
}

Então eu pego o nome do pais em inglês, e uso agrep na lista de nomes de arquivos, agrep, porque é um grep, ou seja acha a palavra na lista, mas permite alguns erros de caracteres, que da para regular com argumentos, mas então com o agrep a gente vai achar o nome do arquivo, com ele a gente le a figura png com o readPNG, que le o raster da figura, então com rasterImage a gente adiciona ela a figura, aqui a gente tem que colocar os quatro pontos da imagem para adicionar ela, veja se da até para colocar a imagem espelhada, feito isso ta pronto. Para economizar, eu fiz um loop para todas as bandeiras.

Bem é isso ai, o script vai estar la no repositório recologia, e se eu escrevi alguma bobeira, algo errado, deixe um comentário corrigindo ou mande um e-mail. Um post bem simples, mas é o tipo de código que é legal guardar, pois pode ser útil copiar e colar um dia.

Iniciando uma pequena Aplicação para controlar atividades no Raspberry

Depois de concluir a faculdade, uma área que eu achei bem legal foi o desenvolvimento web, e resolvi tentar fazer um projeto pessoal na área.

Normalmente eu controlo coisas como áudio e vídeo no raspberry acessando ele remotamente via ssh, mas eu gostaria de controlar do celular ou de qualquer outro dispositivo, e uma forma de fazer isso é com uma aplicaçãozinha web. Eu ja fiz algumas coisas simples como ligar e desligar a música, videos, e apesar de só ser acessível dentro da rede interna aqui que o roteador de casa faz, eu gostaria de fazer algo mais organizado, usando senha.

O que eu quero é fazer algo assim:

Um banner superior com um menu lateral, e algumas informações acima do banner, no centro da tela então eu uma tela com os controles, de som por exemplo.

Então mais especificamente, eu quero fazer algo assim:

Se você entrar na página deslogado, eu peço uma senha, e uma vez que você tenha se autenticado:

A gente começa a aplicação, e deixa algumas informações de login, como quem está logado.

Bem, como eu não conheço muitas tecnologias, o que está mais a mão no raspberry é o php, então eu resolvi usar o php no lado do servidor e html, css e javascript para fazer algumas páginas e formulários. Além disso, vou tentar organizar tudo usando o MVC, model, view e controller.

Eu instalei o apache e o php no raspberry segundo os tutoriais da própria página do raspberry, então dentro da pasta /var/www/html eu criei uma pasta chamada rasp_apps para colocar meu código. O conteúdo dessa pasta está no repositório de mesmo nome aqui, de forma que código fica público, e é fácil administrar mudanças, backup, etc. Acho que não estou adicionando muita coisa aqui, essas são mais notas mentais do que uma explicação do que estou fazendo de verdade.

Mas tudo bem, vamos ao código em si.

Dentro da pasta inicial da minha aplicação, temos um index.php, e nele temos:

1
2
3
4
5
6
7
<?php
require_once 'Controller/controller.php';
ob_start();
session_start(['cookie_lifetime' => 86400,]);
$controller = new Controller();
$controller->init();
?>

Bem, aqui a gente inicia um cookie, que é a forma de manter alguém conectado, de outra forma, não teríamos como manter as variáveis, depois vou tentar escrever sobre a comunicação web, mas depois disso a gente cria um objeto da classe controller que criamos e iniciamos ele, com a função init.

Eu não fiz uma pasta model ainda, pois ainda não comecei a usar banco de dados, até aqui eu só fiz um formulário para entrar com usuário e senha e validar. E como eu faço isso? Para isso server o controller, ele controla tudo, e chama as visualizações.

Quando a gente roda

1
$controller = new Controller();

nos construímos o objeto, que nesse caso, tudo que a gente faz é

1
2
3
4
public function __construct() {
        ini_set('error_reporting', E_ALL);
        ini_set('display_errors', 1);
    }

Habilitar a apresentação dos erros do php, que ajudam a entender porque tudo não funciona, e depois nos rodamos o init

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
 public function init() {       
 
        if (isset($_SESSION['valid'])){
 
            if (isset($_GET['op'])) {
                $op = $_GET['op'];
            } else {
                $op = "";
            }
 
            switch ($op) {
            case 'cfg':
                $this->cfg();
                break;
            case 'logout':
                $this->logout();
                break;
            default:
                $this->index();
                break;
            }
 
        }else{
            $this->login();
        }
 
    }

Esse método, é basicamente um ifelse para saber se a pessoa está autenticada,

1
2
3
4
5
6
7
8
9
10
 
if (isset($_SESSION['valid'])){
 
 
             ###Código
            
 
        }else{
            $this->login();
        }

Senão nos vamos logar, e quanto estivermos logados, vamos cair num switch, que vai administrar as possibilidades da aplicação. Mas então para logar, chamamos o método login.

1
2
3
4
5
6
7
8
9
10
public function login() {
        if (isset($_POST['login']) && !empty($_POST['usuario']) && !empty($_POST['senha'])) {
                $this->valida_login();
        } else{
            if(isset($_SESSION['mensagem'])==false){
                $_SESSION['mensagem']='';
            }            
            require 'View/login.php';
        }
    }

O login, vai olhar se foi enviado algo pelo método post, se o usuário enviou algum dado, como é a primeira entrada no método, nenhuma dessas variáveis existem, então vamos ao else, que olhar se tem alguma mensagem, para apaga-la, e como não tem nada, ele só chama a tela de login.

O que de fato interessa na tela de login é o seguinte:

1
2
3
4
5
6
7
8
9
<?php echo $_SESSION['mensagem']?>
 
	<form action="?op=''" method="post" ?>
 
	    <input type = "text"  name = "usuario" placeholder = "Usuário = teste" required autofocus></br>
	    <input type = "password"  name = "senha" placeholder = "Senha = 1234" required>
	    <button type = "submit" name = "login">Login</button>
 
	</form>

Aquela mensagem, ela vai ser exibida, se tiver algo nela, e temos um formulário, que preenche exatamente aquelas informações de usuário e senha e tem um botão que envia essas informações ao controller, veja que a gente preenche duas coisas, o usuário e a senha, enviando via post.

Agora, vamos denovo passar pelo init, não estamos autenticados ainda, o que nos leva para o método login, mas agora temos um usuário e senha então vamos para o método valida_login

1
2
3
4
5
6
7
8
9
10
11
public function valida_login() {
            if ($_POST['usuario'] == 'teste' && $_POST['senha'] == '1234') {
                $_SESSION['valid'] = true;
                $_SESSION['timeout'] = time();
                $_SESSION['usuario'] = 'Rasp_levins';
            }else {
                unset($_POST);
                $_SESSION['mensagem'] = 'Usuário ou senha incorreto!';
            }
            $this->init();
    }

Agora a gente pode finalmente testar se o usuário e senha conferem, e nesse caso, validar a sessão, ou se o usuário digitou o conjunto usuário e senha errados, nós geramos uma mensagem de erro, e não validamos a sessão.

A princípio, é tudo bem simples, e temos somente um usuário e senha no método de avaliação. Agora o próximo passo é criar uma base de dados com usuário e senha para fazer essa consulta, de forma a não ficar os usuários e senhas ali no meio do código, bem existem muitas coisas a serem feitas ainda, mas fazer a conexão com um banco de dados já possibilita várias outras coisas.

Bem é isso ai, o script vai estar la no repositório rasp_aaps, e se eu escrevi alguma bobeira, algo errado, deixe um comentário corrigindo ou mande um e-mail.

Variância e a desigualdade de Chebyshev

Como falamos antes de média aqui, vamos falar de Variância agora.

Variância é definida como:

Var(X)=E[(X-\mu)^2]

Sendo que esse E é o valor esperado, que é

 E[X]= \sum\limits_{i=1}^\infty x_i \cdot p(x_i)

e o \mu é o centro da distribuição, a média, como vimos aqui

E essa é a forma geral de calcular a variância, que é o espalhamento dos dados em torno da média.

Uma forma mais fácil de calcular é

Var(X)=E[X^2]-E[X]^2

A raiz quadrada da variância é o famoso desvio padrão, que como não está em unidades quadradas, vai estar na mesma unidade de medida dos dados originais. Veja que se a gente tem uma constante multiplicando X

Var(aX)= a^2 \cdot Var(X)

Ela sai da variância ao quadrado.

Para entender melhor vamos calcular a variância de uma jogada de dados, o dado comum de 6 faces.

Sabemos que a valor esperado é:

E[X]=3.5

e

E[X^2]=1^2\cdot\frac{1}{6}+2^2\cdot\frac{1}{6}+3^2\cdot\frac{1}{6}+4^2\cdot\frac{1}{6}+5^2\cdot\frac{1}{6}+6^2\cdot\frac{1}{6}=15.17

Então para a variância temos:

Var(X)=E[X^2]-E[X]^2 = 15.17-3.5^2=2.92

Veja que se a gente usar:

Var(X)=E[(X-\mu)^2]= (1-3.5)^2\cdot\frac{1}{6}+(2-3.5)^2\cdot\frac{1}{6}+(3-3.5)^2\cdot\frac{1}{6}+(4-3.5)^2\cdot\frac{1}{6}+(5-3.5)^2\cdot\frac{1}{6}+(6-3.5)^2\cdot\frac{1}{6}

Como a média está em todas as multiplicações, podemos fatorar ela, que é da onde vem a fórmula anterior, lembrando que a média está dentro de um quadrado, então não da para ir tirando ela diretamente.

Agora qual a variância de uma jogada de moeda com uma chance p para cara.

E[X]=0 \cdot (1-p) + 1 \cdot p = p


E[X^2]= E[X] = p


Var(X)=E[X^2]-E[X]^2=p-p^2=p(1-p)

E essa fórmula é bem conhecida, mesmo sem saber da onde ela vinha, e veja que ela é maximizada no p=0.5

Ou seja, a maior entropia, menos previsibilidade, está numa moeda honesta.

Então suponha que uma variável aleatória X em que O \leq X \leq 1 e E[X]=p

Veja que X^2 \leq X pode ser igual quando pensamos em 1 por exemplo, já que um ao quadrado da 1, mas fora isso, sempre X^2 vai ser maior, então E[X^2]\leq E[X]=p

Assim, Var(X) = E[X^2]-E[X]^2 \leq E[X]-E[X]^2 = p(1-p)

Dessa forma, a variância de Bernoulli é a maior possível para uma variável aleatória entre 0 e 1. O que nos leva a inequação de Chebyshev, que é útil para interpretar de forma geral variâncias.

A inequação mostra que

P( X-\mu \leq k\sigma) \leq \frac{1}{k^2}

Por exemplo, a probabilidade que uma variável aleatória esteja além de k desvios padrões é menos de \frac{1}{k^2}

 2 \sigma = 25\%


 3 \sigma = 11\%


 4 \sigma = 6\%

Mas veja que esse é apenas um limite geral, a probabilidade pode ser bem menor, mas esse é um limite superior independente da distribuição, e essa generalização que torna essa inequação importante, principalmente para afirmações de forma geral.

Bem é isso ai, o script vai estar la no repositório recologia, e se eu escrevi alguma bobeira, algo errado, deixe um comentário corrigindo ou mande um e-mail e esses post está a uns dias parados, então resolvi finalizar logo. Além disso tem uma prova para essa inequação, mas achei a prova muito difícil.

Referência:
Coursera, curso Mathematical Biostatistics Boot Camp 1 do Brian Caffo

Usando o raspberry para administrar os arquivos de torrents.

Um uso que eu acho muito bom no raspberry é para baixar torrents, primeiro porque você deixa de ter que se preocupar com torrents no seu computador, e como ele fica ligado direto e gasta bem menos energia que um notebook por exemplo, é bem interessante.

O meu raspberry usa o Raspbian como sistema operacional, e para administrar os torrents eu uso o Transmission.

Primeiro temos que instalar o Transmission, que é fácil com o apt.

1
2
3
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install transmission-daemon

Aqui, no meu rasp_levins (que é o nome do meu raspberry aqui) tem um hd externo ligado nele, para ele sempre ser montado já na inicialização, eu alterei o arquivo fstab, que monta os drives na inicialização do linux.

proc /proc proc defaults 0 0 PARTUUID=0ce2607c-01 /boot vfat defaults 0 2 PARTUUID=0ce2607c-02 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that # Montagen do hd_externo UUID=38F25F26F25EE7A0 /media/hd_externo ntfs-3g uid=1000,gid=1000,umask=007 0 0

Então como ele é sempre montado no /media/hd_externo, eu criei duas pastas la. Detalhe que ele é formatado como ntfs, para compatibilidade com windows, se precisar, mas eu uso o pacote ntfs-3g para funcionar o sistema de permissões do linux.

1
2
mkdir -p /media/hd_externo/Torrent_completo
mkdir -p /media/hd_externo/Torrent_emprogresso

Outra coisa a se fazer é permitir que o transmission escreva nesses locais, ele roda como o usuario “debian-transmission”, como o hd_externo é do usuario pi e do grupo pi, com permissão 770

drwxrwx--- 1 pi pi 8192 Aug 20 18:21 hd_externo

A gente adiciona o “debian-transmission para conseguir usar o hd_externo

1
sudo usermod -a -G pi debian-transmission

Feito isso, a gente so precisa configurar o Transmission, alterado o arquivo json que fica todas as configurações dele

1
sudo emacs /etc/transmission-daemon/settings.json

O meu ficou assim:

{ "alt-speed-down": 50, "alt-speed-enabled": false, "alt-speed-time-begin": 540, "alt-speed-time-day": 127, "alt-speed-time-enabled": false, "alt-speed-time-end": 1020, "alt-speed-up": 50, "bind-address-ipv4": "0.0.0.0", "bind-address-ipv6": "::", "blocklist-enabled": true, "blocklist-url": "http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz", "cache-size-mb": 4, "dht-enabled": true, "download-dir": "/media/hd_externo/Torrent_completo", "download-limit": 100, "download-limit-enabled": 0, "download-queue-enabled": true, "download-queue-size": 5, "encryption": 1, "idle-seeding-limit": 30, "idle-seeding-limit-enabled": false, "incomplete-dir": "/media/hd_externo/Torrent_completo", "incomplete-dir-enabled": true, "lpd-enabled": false, "max-peers-global": 200, "message-level": 1, "peer-congestion-algorithm": "", "peer-id-ttl-hours": 6, "peer-limit-global": 200, "peer-limit-per-torrent": 50, "peer-port": 51413, "peer-port-random-high": 65535, "peer-port-random-low": 49152, "peer-port-random-on-start": false, "peer-socket-tos": "default", "pex-enabled": true, "port-forwarding-enabled": false, "preallocation": 1, "prefetch-enabled": 1, "queue-stalled-enabled": true, "queue-stalled-minutes": 30, "ratio-limit": 2, "ratio-limit-enabled": false, "rename-partial-files": true, "rpc-authentication-required": true, "rpc-bind-address": "0.0.0.0", "rpc-enabled": true, "rpc-password": "{2d15be92741a1b2cd87ef7af39931c1b088499b0A8PoYK7r", "rpc-port": 9091, "rpc-url": "/transmission/", "rpc-username": "rasp_levins", "rpc-whitelist": "127.0.0.1", "rpc-whitelist-enabled": false, "scrape-paused-torrents-enabled": true, "script-torrent-done-enabled": false, "script-torrent-done-filename": "", "seed-queue-enabled": false, "seed-queue-size": 10, "speed-limit-down": 100, "speed-limit-down-enabled": false, "speed-limit-up": 100, "speed-limit-up-enabled": false, "start-added-torrents": true, "trash-original-torrent-files": false, "umask": 18, "upload-limit": 100, "upload-limit-enabled": 0, "upload-slots-per-torrent": 14, "utp-enabled": true }

Eu alterei o “download-dir”, alterei o “incomplete-dir” e habilitei seu uso com “incomplete-dir-enabled”: true, por padrão ele joga todos os arquivos na mesma pasta, habilitei autenticação em “rpc-enabled”, troquei o “rpc-username” e “rpc-password”, e ao salvar o arquivo e reiniciar o transmission, ele usa um hash na senha, para ninguém ler sua senha nesse arquivo.

Para reiniciar o transmission no terminal eu uso

1
sudo service transmission-daemon reload

E depois disso é so acessar ele pelo ip do seu raspberry na porta 9091, se você não alterou a porta no arquivo acima, aqui em casa eu acesso com o link http://192.168.0.3:9091, ja que eu fixei o ip do rasp_levins.

Espero que ninguém me julgue pelo que estou baixando até o momento desse post heheh, agora outra coisa que eu fiz, é que como já tenho o raspberry rodando um kiosk mode, como visto no tópico passado, eu quis deixar rodando la um pequeno quadradinho para indicar se o torrent está ligado, se tem algo sendo baixado, para saber que estou consumindo banda e algumas estatísticas simples de uso. Isso foi relativamente fácil porque o Transmission tem uma interface php, disponível na página deles, nesse repositório do github, dai podemos usar essa classe para tirar algumas informações e deixar elas aparecendo, no meu caso ficou assim:

Todo o código dessa página do kiosk-mode está no repositório que eu fiz no github, e depois vou explicar melhor o código no README.md do repositório.

Bem é isso ai, estou tomando coragem para voltar a estudar mais seriamente, ainda tenho projeto para terminar de escrever mas o desanimo anda forte, mas vamos levando a vida. Até a Próxima.

Raspberry em modo Kiosk

Opa, não é que fazem 2 meses que eu não posto nada aqui, que vergonha de mim mesmo heheh.

Bem, eu tenho um computador chamado Raspberry pi, basicamente é um computador que é apenas um placa única, ele é bem fraquinho, não vai ser seu notebook, mas da para fazer muitas coisas legais com ele, além de ser muito barato. Eu tenho tentando usar esse tipo de computador, assim como placas de microcontrolador desde a época que escrevi sobre isso aqui e aqui. Bem, você ter essas coisas, arduinos e raspberrys, na maior parte das vezes, é mais fácil que tornar eles em algo útil. Mas vou tentar mostrar como tenho usado o meu, até para eu ter um lembrete de como consertar ele quando eu fizer alguma cagada, porque vira e mexe, eu consigo fazer ele parar de funcionar, mas a experimentação é muito legal.

Bem, uma coisa que eu acho legal, é o que eles chamam de Kiosk Mode, que é deixar uma tela mostrando alguma informação, em muitos lugares a gente vê monitores mostrando propagandas, números de fila, essas coisas, basicamente, o Kiosk Mode é ter um monitor mostrando alguma informação. Como o meu Raspberry fica ligado na tv, eu achei que ao invés de uma tela preta, eu poderia mostrar algo mais legal, deixando ele ligado.

A primeira coisa, é instalar o SO nele, eu uso o Raspbian, mas não instale a versão Lite, pois vamos precisar usar um Brownser, no caso o chromium, que vem com o SO.
As instalação do SO é so seguir o tutorial da página do raspberry, que é um mega projeto legal, mas instalando ele, criando um arquivo ssh sem nada no boot para poder acessar ele remotamente, e colocando ele na rede interna do roteador de casa com um ip fixo, que não cabe aqui explicar, eu faço o seguinte:

Primeiro, após um update, eu instalo o emacs, pois é o melhor editor para o terminal.

1
2
3
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install emacs

Dai o que vamos fazer é ligar o raspberry e depois automaticamente ligar o navegador e modo tela cheia em uma página de interesse nosso.

Bem, um pacote que vamos precisar é o unclutter, que basicamente faz o ponteiro do mouse sumir.

1
sudo apt-get install unclutter

Agora, toda vez que o raspberry é iniciado, ele roda um arquivo chamado autostart, então nesse arquivo, a gente pode colocar comandos para que quando o raspberry seja iniciado, a gente rode esses comandos, iniciar um programa qualquer, mais especificamente, a gente quer iniciar o navegador em modo de tela cheia. Então eu uso o emacs para alterar esse arquivo.

1
emacs ~/.config/lxsession/LXDE-pi/autostart

Detalhe, que o modo gráfico inicia automaticamente, e inicia como o usuário pi, que é padrão da instalação, por isso usamos o autostart do usuário pi, mas cada usuário pode ter um autostart diferente, ou seja, esse autostart não é independente de do usuário ativo. Mas vamos comentar duas linhas dele(o autostart do usuário pi), que é a que liga o protetor de tela, porque ter alguma informação por 5 minutos e depois tela preta não é o intuito aqui, e tirar o comando que move o ponteiro para o iniciar do menu gráfico.

Agora as linhas do xset são para desligar o controle de economia de energia para com o desligamento da tela após um período de inatividade.
A próxima linhas do @sed é para o caso do raspberry reiniciar sem usar o shutdown corretamente, por exemplo em pique de energia, e a próxima linha é para iniciar o navegador, em kiosk mode, que é tela cheia.

Para experimentar, primeiro colocamos a página do google, e iniciamos no modo incognito e desabilitamos aquelas mensagens chatas de traduzir a página.

1
2
3
4
5
6
7
8
9
10
11
12
13
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
 
##Kiosk	Mode
 
#@xscreensaver -no-splash
#@point-rpi
 
@xset s off
@xset -dpms
@xset s noblank
@sed -i 's/"exited_cleanly": false/"exited_cleanly": true/' ~/.config/chromium-browser Default/Preferences
@chromium-browser --noerrdialogs --kiosk http://google.com --incognito --disable-translate

Bem, agora já estamos começando o raspberry rodando o chromium em tela cheia na página do google, mas não é isso que queremos ainda.

Vamos instalar o lamp, para podermos construir uma página que mostre alguma informação útil.

A primeira coisa que fiz foi extrair algumas informações básicas do raspberry e exibir usando um script de php da seguinte forma.

O meu raspberry principal eu chamo de rasp_levins em homenagem ao Richard Levins, que uma pena ter falecido, o sonho da minha vida foi ter ido fazer algum tipo de trabalho com ele, ainda mais que ele era super gente boa respondendo email de perguntas estupidas minhas, mas tudo bem.

Então três informações úteis são a quanto tempo o rasp_levins ta ligado, quanto foi o último boot, a temperatura do processador e o uso do CPU, essas informações a gente consegue usando comandos do terminal, que basta dar um shell_exec no php e dar um parse na saída.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<h2>rasp_levins Status</h2>
 
 
<p><b>Tempo Ligado:</b><br>
    <?php echo shell_exec('uptime -p');?></p>
 
<p><b>Último boot:</b><br>
    <?php echo shell_exec('uptime -s');?></p>
 
<p><b>Temperatura:</b><br>
    <?php
    $temperatura = intval(shell_exec('cat /sys/class/thermal/thermal_zone0/temp'))/1000.00;
    echo round($temperatura,2);
    ?> graus celsius.
</p>
 
<p><b>CPU:</b><br>
    <?php
    $uso_cpu = sys_getloadavg();
    echo number_format($uso_cpu[0],2);
    ?>%.
</p>

Então esses script exibe o seguinte:

Como e tenho mais de um raspberry na rede, o outro eu tenho o mesmo script dentro dele, mas ai no rasp_levins eu fiz o seguinte script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
try {
    $homepage = file_get_contents('http://192.168.0.4/info_padrao.php');
 
 
if ($homepage===false) {
    echo "<h2>rasp_hanski Status</h2>";
    echo "<p><b>Offline</b></p>";
}
 
}catch (Exception $e) {
    /*Lembrete
      Keep in mind that if you use a URL as the filename attribute, and the external
      resource is not reachable, the function will not return FALSE but instead an
      exception will be thrown.
    */
    echo '<p>Exceção capturada: ',  $e->getMessage(), "</p>";
}
echo $homepage;
?>

Ilkka Hanski é meu outro idolo das teoria de metapopulações. Bem aqui eu tento acessar ele para pegar as informações, se não conseguir, eu deixo apenas exibo a informação que ele está offline.

Agora é so colocar essas informações numa página, no caso eu uso o index.php de uma pasta dentro do apache.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html>
 
  <head>
 
    <title>Quarto</title>
    <meta http-equiv="refresh" content="7200">
    <link rel="stylesheet" type="text/css" href="estilo.css">
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script type="text/javascript" src="scripts.js"></script>
 
  </head>
 
  <body>
 
 
    <div class="info_status">
      <div id="levins_info_padrao" class="levins_info_padrao">
	<p>Iniciando!!!</p>    
      </div>
 
      <div id="hanski_info_padrao" class="hanski_info_padrao">
	<p>Iniciando!!!</p>    
      </div>
    </div>
 
 
  </body>
</html>

E veja que nessa página chamamos um script chamado script.js no cabecalho, que basicamente vai escrever em um div a saída daqueles scripts de php com um intervalo de tempo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function update_levins_info_padrao () {
    $('#levins_info_padrao').load('info_padrao.php');
}
 
function update_hanski_info_padrao () {
    $('#hanski_info_padrao').load('hanski_info_padrao.php');
}
 
function update_info_padrao () {
    update_levins_info_padrao();
    update_hanski_info_padrao();
}
 
var tempo_info_padrao  = setInterval(update_info_padrao, 5000);

E agora temos algumas informações legais ao ligar a TV, temos uma página padrão sendo exibida, com algumas informações sobre o raspberry.

E o rasp_levins está do lado da TV, eu deixo um hd externo ligado nele, pois uso ele para guardar arquivos, principalmente para arquivos via P2P usando Torrent e backups o meu roteador.

Bem é isso ai, eu fiz um repositório especifico para esse projetinho do kiosk mode no https://github.com/Squiercg/kiosk_mode, mais porque ainda quero expandir ele, primeiramente medindo a temperatura ambiente do meu quarto usando um arduino e um esp8266, e se eu escrevi alguma bobeira, algo errado, deixe um comentário corrigindo ou mande um e-mail.