Configurando o Debian 9

Este post serve como um guia pessoal de configuração em máquinas recém formatadas usando o Debian 9 stretch.


Qualcomm Atheros QCA6174 Debian 9

Por algum motivo maravilhoso, alguns modelos de notebooks da Dell não vêm com placas wireless reconhecidas pelos drivers genéricos usados em distribuições debian-based (Ubuntu, Debian, etc...).

A fim de conseguir usar a wi-fi da tua máquina (considerando que você também tem esse problema), deve-se baixar o drive necessário e fazê-lo ser reconhecido pelo sistema. No meu caso, eu já sei que a especificação do meu hardware wi-fi é o Qualcomm Atheros QCA6174. Este post será atualizado no futuro. Se você não sabe qual é o seu hardware, por hora, deixo esta tarefa por sua conta. Google it!

Pesquisou e conseguiu identificar seu drive? Ótimo. Os drivers genéricos não são necessariamente únicos em relação ao hardware. Na prática, a descrição de passos a seguir serve para uma família de hardwares. Se o seu não é necessariamente o Atheros QCA6174, cabe a você conseguir confirmação se ele é membro da mesma família que este. Volte ao Google e boa sorte.

Voltou e descobriu que não é da mesma família? Então não siga este tutorial. Como dito, existe pretensão de atualização deste post. No futuro o seu pode estar listado! Porém, não desista. Tente pesquisar e instalar você mesmo. Ao final, me mande um e-mail com a sequência de passos e será devidamente adicionado a este tutorial. Obrigado!

A sequência dos comandos abaixo deve ser executada em terminal com privilégios de super-usuário. Assim, comece pedindo os ditos privilégios:

su

Entre a senha criada quando você formatou a máquina. Não foi você que formatou? Tente a mesma senha do seu usuário. Ainda assim não deu certo? Ligue pra quem formatou a máquina. Adiante.

Cria-se uma pasta para receber os arquivos do driver.

mkdir -p /lib/firmware/ath10k/QCA6174/hw3.0/

Remove-se arquivos desnecessários.

rm /lib/firmware/ath10k/QCA6174/hw3.0/* 2> /dev/null

Baixando os arquivos do driver.
Arquivo 1:

wget -O /lib/firmware/ath10k/QCA6174/hw3.0/board.bin https://github.com/FireWalkerX/ath10k-firmware/blob/7e56cbb94182a2fdab110cf5bfeded8fd1d44d30/QCA6174/hw3.0/board-2.bin?raw=true

Arquivo 2:

wget -O /lib/firmware/ath10k/QCA6174/hw3.0/firmware-4.bin https://github.com/FireWalkerX/ath10k-firmware/blob/7e56cbb94182a2fdab110cf5bfeded8fd1d44d30/QCA6174/hw3.0/firmware-4.bin_WLAN.RM.2.0-00180-QCARMSWPZ-1?raw=true

Dando privilégios de execução a todos os arquivos do driver.

chmod +x /lib/firmware/ath10k/QCA6174/hw3.0/*

Retorne os privilégios de super-usuário:

exit

Pronto. Reinicia a máquina e testa a parada.

Fontes:

http://www.infocotidiano.com.br/2016/06/resolvendo-problemas-com-wireless.html#ixzz4Kp2eFMHG

https://askubuntu.com/questions/761180/wifi-doesnt-work-after-suspend-after-16-04-upgrade


Usando o SUDO

Se você, como eu, veio do Ubuntu, deve ter tentado os comandos do tutorial anterior usando o sudo na frente. Triste final quando descobriu que não existe sudo no Debian. Não desanime: ao final do tutorial você será capaz de usar o sudo no Debian.

Peça privilégios de super-usuário:

su

Instale o sudo no debian:

apt-get install sudo -y

Adicione seu usuário ao grupo de sudoers. Para tanto, é necessário acessar o arquivo que registra os usuários do grupo. É simples, não se desespere. Pra conseguir isso, você vai precisar de um editor de textos funcionando no terminal. Eu aconselho o vim. Pra instalá-lo, basta digitar apt-get install vim.

Abra o arquivo sudoers dentro da pasta /etc/ usando o vim:

vim /etc/sudoers

Usando as setas do teclado, procure pela seguinte linha do arquivo:

O vim tem proteção contra "acidentes" e não permite que você simplesmente comece a editar o arquivo do nada. Para entrar no ambiente de inserção(onde é possível editar as coisas), você só precisar apertar  a tecla no seu teclado (i de insert). Aperte i. Logo abaixo da linha root ALL=(ALL:ALL) ALL, dê um enter e digite a linha abaixo. Onde tem <tab>, leia-se: aperte a tecla TAB do seu teclado. Troque <seu-usuário> pelo usuário que você costuma usar normalmente:

<seu-usuario><tab> ALL=(ALL:ALL) ALL

O arquivo deve ficar semelhante à imagem que segue onde <mejnour> é um dos usuários da minha máquina e deve ser o usuário que você entrou:

Você pode sair do ambiente de inserção do vim apertando <esc> no seu teclado. Aperte <esc>. Você só precisa salvar suas alterações e sair do vim pra concluir tudo. O vim tem um console próprio que aparece no canto inferior do editor quando você aperta : (a tecla dois-pontos, no seu teclado). Vá em frente e, se você não apertou <:> ainda, digite o seguinte:

:wq!

Enquanto você digitou o comando acima, deve ter visto o dito console. Dê enter. Pronto. Você deve ter saído do vim.

Devolva os privilégios:

exit

Seu usuário já tem acesso ao sudo. Não acredita? Tenta o seguinte:

sudo apt-get update

Montando HDs Externos

Terminou de formatar o computador, plugou um hd externo e viu que não funcionou? Se o HD usa exFat como o formato da partição, usa o seguinte:

sudo apt-get install exfat-fuse exfat-utils

E pronto. Pluga de novo e seja feliz.


Configurando o Teclado

Aparentemente, o Debian não vem com o padrão ABNT2 de teclado, que é o padrão que a maioria das fábricas de computadores vendidos no Brasil adota.

Eis como configurá-lo:

setxkbmap -model pc105 -layout br -variant abnt2

Softwares necessários

Atom

https://atom.io/

Spyder

Libs necessárias:
sudo apt-get -y install python3-pip
sudo pip3 install numpy scipy matplotlib pyedflib mne joblib
Spyder
sudo apt install spyder3

Dr. Racket

https://download.racket-lang.org/

NetBeans

LaTeX

sudo apt install texlive-full

[T2][ICG] Pipeline

EDIT:
Nome: José Arnaldo de Assis Pina Neto
Matrícula: 2016064100

Proposto pelo Prof. Christian Pagot, esta postagem faz parte da avaliação da disciplina Introdução à Computação Gráfica como segundo projeto prático, a implementação de um pipeline gráfico.

Afinal, O que é um pipeline gráfico?

Definimos por Pipeline Gráfico todo o conjunto de passos necessários para um computador transformar primitivas (conjunto de vértices que, quando unidos foram figura 2D ou 3D) em desenhos na tela (rasterização). O pipeline em questão é semelhante ao utilizado pela OpenGL.

 

A figura acima ilustra as transformações feitas ao longo do pipeline, que parte do Model Space (Espaço do Objeto/Modelo), passa para o World Space (Espaço do Universo), para o Camera Space (Espaço da Câmera), para o Projection/Clipping Space (Espaço de Recorte), de onde sofre uma transformação canônica e finalmente passa a o Screen Space (Espaço da Tela), onde é rasterizada. Todas as transformações são esmiuçadas ao longo deste trabalho.

Coordenadas Homogêneas

Todo o pipeline gráfico é calculado pela cpu/gpu abstraído através de matrizes. Entretanto, coordenadas cartesianas simples não são capazes de prover envergadura suficiente para que transformações geométricas afins sejam realizadas ao longo de todo o processamento 3D, a saber, as transformações de Escala, Translação e Rotação. Vejamos como converter  coordenadas cartesianas em coordenadas homogêneas:

Convertendo

Na prática, trabalhar com coordenadas  homogêneas significa que, para uma posição cartesiana, digamos, P(x, y), representaremos com uma dimensão w a mais. Assim, em tese, P(x, y) e P'(x, y, w) fazem menção à mesma posição. Explicitando como funciona a conversão, pegamos a coordenada w e multiplicamos por todas as coordenadas disponíveis e, ao fim, atribuímos w como coordenada também. Ex.: Considerando w como 1, e uma posição Q(x, y), Q' (x \cdot 1, y \cdot 1, 1).

A seguir, escrevemos as transformações 3D em relação a coordenadas 2D, utilizando operações com matrizes e vetores já em coordenadas homogêneas.

Matriz de Escala

Seus elementos s_{x}, s_{y} e s_{z} são responsáveis pela escala no respectivo eixo. Se todos os elementos s_{i} forem 1, a matriz se mantém, ou seja, para aumentar ou diminuir a representação, tem de se aplicar, respectivamente, valores maiores ou menores que 1.

\begin{bmatrix}x' \\ y' \\ z' \\ 1\end{bmatrix}=\begin{bmatrix}s_{x} & 0 & 0 & 0 \\ 0 & s_{y} & 0 & 0 \\ 0 & 0 & s_{z} & 0 \\ 0 & 0 & 0 & 1\end{bmatrix}\begin{bmatrix}x \\ y \\ z \\ 1\end{bmatrix}

Matriz de Rotação

Escrevemos a matriz de rotação em torno do eixo x como:

\begin{bmatrix}x' \\y' \\z' \\1\end{bmatrix}=\begin{bmatrix}1 & 0 & 0 & 0 \\0 & \cos{\theta} & -\sin{\theta} & 0 \\0 & \sin{\theta} & \cos{\theta} & 0 \\0 & 0 & 0 & 1\end{bmatrix}\begin{bmatrix}x \\y \\z \\1\end{bmatrix}

Escrevemos a matriz de rotação em torno do eixo y como:

\begin{bmatrix}x' \\y' \\z' \\1\end{bmatrix}=\begin{bmatrix}\cos{\theta} & 0 & \sin{\theta} & 0 \\0 & 1 & 0 & 0 \\-\sin{\theta} & 0 & \cos{\theta} & 0 \\0 & 0 & 0 & 1\end{bmatrix}\begin{bmatrix}x \\y \\z \\1\end{bmatrix}

Escrevemos a matriz de rotação em torno do eixo z como:

\begin{bmatrix}x' \\y' \\z' \\1\end{bmatrix}=\begin{bmatrix}\cos{\theta} & -\sin{\theta} & 0 & 0 \\\sin{\theta} & \cos{\theta} & 0 & 0 \\0 & 0 & 1 & 0 \\0 & 0 & 0 & 1\end{bmatrix}\begin{bmatrix}x \\y \\z \\1\end{bmatrix}

Matriz de Translação

Escrevemos a matriz de translação em termos de coordenadas (d_{x}, d_{y}, d_{z}) como:

\begin{bmatrix}x' \\y' \\z' \\1\end{bmatrix}=\begin{bmatrix}1 & 0 & 0 & d_{x} \\0 & 1 & 0 & d_{y} \\0 & 0 & 1 & d_{z} \\0 & 0 & 0 & 1\end{bmatrix}\begin{bmatrix}x \\y \\z \\1\end{bmatrix}

Pipeline Gráfico

Passamos a explicitar Espaço do Objeto, Espaço do Universo, Espaço da Câmera, Espaço de Recorte, Espaço Canônico e Espaço da Tela, além da Transformação Objeto-UniversoTransformação Universo-CâmeraTransformação Câmera-RecorteTransformação Canônica-Tela.

Espaço do Objeto

Espaço onde se dá a modelagem de objetos. Infinito em todas as direções, apenas especifica as dimensões do objeto e não onde eles se localizam na cena.

Espaço do Universo

Onde os objetos se reúnem. Este espaço congrega os objetos em um sistema de coordenadas, sendo capaz de montar a cena. A fim de definir que porção da cena se deseja visualizar, somos levados ao espaço da câmera.

Espaço da Câmera

No espaço da câmera, todos os objetos precisam ser transformados para um novo sistema de coordenadas, a fim de serem visualizados. Com parâmetros como a posição da câmera (EYE) no espaço do universo, o vetor direção (AT), e o vetor UP, que indica o lado de cima da câmera, somos capazes de montar o espaço da câmera.

Espaço Recorte

Tendo os pontos do espaço da câmera, se faz necessário descartar todos os pontos que não são vistos, tendo vista a eficiência da renderização. Assim, projeta-se tudo em um viewplane e descarta-se o que não for visível. Para tanto, escolhe-se que tipo de projeção se utilizará, que pode ser ortogonal ou perspectiva. A imagem abaixo ilustra as "fronteiras". Fora do "cubo" ou da "pirâmide", nada é visualizado e, portanto, descartado.

Espaço Canônico

É no espaço canônico que as matrizes de todos os objetos são convertidos para coordenadas homogêneas, de maneira que, devido a uma distorção dos vértices, objetos mais próximos da câmera aparecem maiores e objetos distantes, aparecem menores.

Espaço da Tela

Agora que todas as coordenadas estão homogêneas, podemos transferir informação para a tela, multiplando a matriz de coordenadas homogêneas pela matriz view port.

Transformação Objeto-Universo

A matriz responsável por levar informação do espaço dos objetos para o universo, é denominada Model, e é resultado de sucessivas multiplicações de matrizes de Escala, Rotação e Translação.

Transformação Universo-Câmera

Através da matriz View, que aplica mais uma rotação e translação, transferimos o centro da cena para a posição da câmera.

A partir dos parâmetros EYEAT e UP conseguimos determinar o sistema de coordenada da câmera (x_{c}, y_{c}, z_{c}). O eixo é oposto a AT, isto é, fazemos a diferença entre EYE - AT. A direção x_{c} é obtida pelo produto vetorial de AT por UP e y_{c} pelo produto vetorialx_{c}z_{c}. Note que UP não é necessáriamente ortogonal a AT .

z_{c} = \frac{EYE - AT}{||EYE-AT||}

x_{c} = \frac{UP \times z_{c}}{||UP \times z_{c}||}

 y_{c} = z_{c} \times x_{c}

Transformação Câmera-Recorte

Feita pela matriz Projection, esta transformação é  feita pela multiplicando-se da matriz abaixo. Note que ela só depende da distância da câmera (d) até o volume de projeção (ortogonal ou perspectivo).

M_{pt}=\begin{bmatrix}1 & 0 & 0 & d_{x} \\0 & 1 & 0 & d_{y} \\0 & 0 & 1 & d_{z} \\0 & 0 & {\displaystyle-\frac{1}{d}}& 1\end{bmatrix}

Transformação Canônica-Tela

Por fim, para aplicar a última tranformação, é necessário fazer uma escala de -1 no eixo y, uma escala w/2 e h/2 nos eixos x e y, respectivamente, e uma translação de (w-1)/2 em x e (h-1)/2 em y.

Abaixo as matrizes responsáveis.

\begin{bmatrix}x' \\y' \\z' \\1\end{bmatrix}=
=\begin{bmatrix}1 & 0 & 0 & {\displaystyle\frac{w-1}{2}} \\0 & 1 & 0 & {\displaystyle\frac{h-1}{2}} \\0 & 0 & 1 & 0 \\0 & 0 & 0 & 1\end{bmatrix}\begin{bmatrix}{\displaystyle\frac{w}{2}} & 0 & 0 & 0 \\0 & {\displaystyle\frac{w}{2}} & 0 & 0 \\0 & 0 & 1 & 0 \\0 & 0 & 0 & 1\end{bmatrix}\begin{bmatrix}1 & 0 & 0 & 0 \\0 & -1 & 0 & 0 \\0 & 0 & 1 & 0 \\0 & 0 & 0 & 1\end{bmatrix}\begin{bmatrix}x\\y\\z\\1\end{bmatrix}

Capturas de Tela

A primeira imagem mostra um modelo de cubo e a segunda, de um macaquinho. Respectivamente, cube.objmonkey_head2.obj.

Dificuldades

Gostaria de dizer que foram poucas, mas as dificuldades foram muitas. Primeiro, prazo. O prazo para este projeto foi extendido, o que vejo como grande consideração do professor para com a turma e, na mesma linha, os prazos de outras disciplinas também. Então tempo e energia (vontade de continuar vivo), foram cruciais para que se finalizasse este projeto.

O Loader. Brincadeiras a parte, os problemas envolveram basicamente o loader de arquivos *.obj, que, como detalhado na descrição do projeto, seria fornecido e eu não o encontrei. Vergonhosamente, copiei o loader e todas as suas dependências de um projeto pronto de períodos anteriores.

O GLM. Implementar matrizes parece muito simples na teoria com o GLM. Entretando, aliado ao problema do loader e da falta de tempo, não foi possível deixar a implementação perfeita, de maneira que durante a rotação algumas arestas saem do lugar, como é possível ver nas capturas de tela, dando esta impressão "bugada".

Melhorias

Este projeto poderia ser melhorado revisando-se os métodos responsáveis pela passagem de coordenadas dos vértices, afim de manter um equilibrio nas aretas durante a rotação.

Um loader proprietário também poderia ser criado afim de simplificar o problema, utilizando somente implementação estritamente necessária.

Conclusão

Embora atrasado, com loader copiado e aspecto-geral bugado, este projeto me proporcionou dias de aprendizado acelerado e ininterrupto. Não é objeto de grande orgulho neste momento, entretanto, definitivamente pretendo concluí-lo durante as férias e agradeço ao Mestre por tê-lo sugerido como parte da avaliação. Nos vemos período que vem. 🙂