Unix and Me

Dmitry's blog

Usando letras com lista em LaTeX

2014-12-10 12:32:00 -0300

O LaTeX tem listas enumeráveis e não enumeráveis, o encadeamento de listas já ajuda bastante, mas algumas pessoas tem preferência para usar primeiro números e em seguida letras ao invés de encadear as listas.

Exemplo:

1. Item 1
2. Item 2
  a. Subitem 1

Usando

Para mudar como as listas funcionam usarei o pacote enumerate. Instale-o usando:

% tlmgr install enumerate

Para usá-lo, basta iniciar o \begin{enumerate} com um [a.] no final:

\begin{enumerate}[a.]

Um exemplo completo:

\documentclass[11pt]{article}
\usepackage{enumerate}
\usepackage[utf8]{inputenc}

\begin{document}

  \begin{enumerate}
    \item Primeira questão
      \begin{enumerate}[(a)]
        \item Letra a;
        \item Letra b;
        \item Letra c;
        \item Letra d.
      \end{enumerate}
    \end{enumerate}
\end{document}

Referência

"Numbering - How Do I Change the enumerate List Format to Use Letters instead of the Default Arabic Numerals? - TeX - LaTeX Stack Exchange." Accessed December 10, 2014. http://tex.stackexchange.com/questions/2291/how-do-i-change-the-enumerate-list-format-to-use-letters-instead-of-the-defaul.

Gurupi+PUG-PI (29/11/2014)

2014-11-30 12:11:00 -0300

Muito obrigado ao Carlos Filho e ao Haerto por encontrarem um local para os encontros.

As palestras foram, na ordem de apresentação:

  • "Projeto X - inovação tecnológica e pesquisa aplicada", Francisco Marcelino (sem slides, apenas foi falado do projeto e algumas(muitas) fotos);
  • "Testes, testes everywhere", Dmitry (slides no final da página :);
  • "Centralizando logs em ~tempo real~", Carlos Filho;
  • "Conhecendo Clojure", Samuel Flores;

Sobre minha palestra

Falei sobre os conceitos de teste automatizados (inclusive os "errados") e por fim fiz um "live coding".

A apresentação foi ótima, imaginei que seria apenas eu falando a torto e a direita sobre um "ambiente ideal" (inicialmente eu iria falar somente sobre esse ambiente), mas com a participação das pessoas resolvi falar apenas mesmo o que eu uso, i. e., sem aquele "rigor" dos testes.

Links

Nerd Fitness (Dia 39)

2014-11-23 18:02:00 -0300

Muito obrigado ao @abrcoelho que me ajudou a corrigir o primeiro exercício que eu estava fazendo errado.

Relembrando a lista de exercícios:

  • 20 body weight squats (agachamento);
  • 10 push ups (flexão);
  • 20 walking lunges;
  • 10 dumbbell rows (using a gallon milk jug);
  • 15 second plank;
  • 30 Jumping Jacks (polichinelo);

O primeiro exercício (e provavelmente mais algum outro) eu estava fazendo errado.

Veja esses dois videos para corrigir o exercício:

Então pelo que entendi, para o agachamento:

  • Os pés devem ficar "rente" com os ombros;
  • Mantenha a curvatura "normal" da coluna, i. e., sem forçar demais e nem de menos;
  • Você deve fazer como "se existisse um banco" para você sentar, aka, os joelhos não devem passar da "linha dos pés";

Minha média de tempo é: 13min.

Migrar disco com Arch Linux

2014-11-20 11:48:00 -0300

Vou usar o exemplo da minha máquina, então, claro que se estiver migrando do HD /dev/sdb para o /dev/sdc modifique-os de acordo, não me responsabilizo caso você perca TODOS OS SEUS ARQUIVOS.

Eu fiz todos os processos usando um pendrive de instalação do Arch, assim todos os passos seguintes foram feitos usando o usuário root.

Primeiro, crie a partição que será de destino, no meu caso, usei o cfdisk e criei o sistema de arquivo assim:

# mkfs.ext4 -U aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee /dev/sdb2

É importante usar o mesmo UUID do HD anterior para que não seja necessário mudar as configuraões em /etc, mas se você souber quais são os arquivos que devem ser modificados, não haverá problema algum.

Montei a partição anterior em /last-root:

# mkdir /last-root
# mount -t ext4 /dev/sda2 /last-root

E a partição de destino em /next-root:

# mkdir /next-root
# mount -e ext4 /dev/sdb2 /next-root

Com isso feito usei o rsync, desta forma:

# rsync -a --delete -xHAXW /last-root/ /next-root

ATENÇÃO: digite o comando rsync tal qual pois, por exemplo: se esquecer o / do /last-root pode, e dará, errado.

A flags do rsync:

  • -a, é para archive, i. e., arquivar;
  • --delete, faz com que os arquivos apagados em /last-root/ sejam também apagados em /next-root (isso é útil caso inicie o processo, mas seja necessário parar por algum motivo qualquer para voltar a usar o HD antigo);
  • -W, é para copiar arquivos inteiros, por padrão o rsync copia apenas os diffs, mas como não estamos trabalhando com sincronização que precisa ser feito regularmente ou trabalhando via rede…;
  • -H, preserva hardlinks;
  • -A, preserva ACLs;
  • -X, preserva atributos extendidos;

Entrei no /next-root com o comando arch-chroot:

# arch-chroot /next-root

E executei o comando para reinstalar os pacotes:

# pacman -S $(pacman -Qnq)

A primeira vez que eu migrei de HD tive problemas com as permissões de alguns comandos, então mandei apenas reinstalar o comando que deu problema e tudo voltou ao normal, desta vez estou preferindo reinstalar tudo.

Esse último comando mantem quais pacotes foram explicitamente instalados.

Ainda dentro do chroot, reinstalei o grub:

# grub-install --recheck /dev/sdb

Como eu usei a mesma UUID para o novo disco, certifique-se de que removeu o HD anterior (ou que formatou, gerando assim uma outra UUID).

E, se assim como no meu desktop: tiver mais de um HD, certifique-se também de escolher o novo HD no momento do boot.

Fonte

"Linux - Copy Entire File System Hierarchy from One Drive to Another - Super User." Accessed November 18, 2014. http://superuser.com/questions/307541/copy-entire-file-system-hierarchy-from-one-drive-to-another.

"Pacman - ArchWiki." Accessed November 18, 2014. https://wiki.archlinux.org/index.php/pacman#How_do_I_reinstall_all_packages. 2C_retaining_information_on_whether_something_was_explicitly_installed_ or_as_a_dependency.3F.

Nerd Fitness (Dia 1)

2014-10-15 21:59:00 -0300

Muito obrigado ao https://twitter.com/abrcoelho que me ajudou a entender como fazer o exercício.

Pelo que entendi o Nerd Fitness é "fazer mudanças positivas e viver uma vida melhor" para "nerds, burocratas e pessoas medianas".

Essa melhora de vida se dá por meio de melhor alimentação e exercícios físicos.

Sobre alimentação existem vários guias por aê… O desafio mesmo para mim é fazer os exercícios de forma correta.

De início segui o Beginner Body Weight Workout.

Há algumas regras para fazer esse circuito:

  • Fazer 2-3 vezes na semana (e nunca em dias consecutivos);
  • No outro dia fazer uma caminha (dar tempo para os músculos se recuperarem);
  • Fazer o circuito 3 vezes.
  • A sequência é essa:
    • 20 body weight squats;
    • 10 push ups;
    • 20 walking lunges;
    • 10 dumbbell rows (using a gallon milk jug);
    • 15 second plank;
    • 30 Jumping Jacks;

Então… eu tava fazendo o circuito em dias alternados, mas não 3 vezes.

Da primeira vez que fiz os 3 rounds, no início do terceiro round pensei que não conseguiria terminar, mas consegui concluir em 13:03.

Além do circuito em si procure como fazer os exercícios do jeito certo, isso é muito importante principalmente para não se machucar e ter o efeito inverso.

Update

Da segunda vez eu fiquei menos cansado e fiz em 13:32,25.

DWM for president

2014-09-23 07:58:00 -0300

O DWM é um "tiling window manager" minimalista, i. e., é um gerenciador de janelas lado a lado minimalista.

Confesso que sempre achei muito estranho usar todas as janelas maximizadas, mas como gosto de testar, principalmente para melhorar meu uso do PC, resolvi usar os "tiling wm" por um tempo.

O primeiro que testei foi o Awesome com seus arquivos de configuração em Lua, estava interessado em Lua, não necessariamente para me tornar exímio programador nela, mas apenas para ampliar um pouco meus conhecimentos.

Depois testei o xmonad, que é em Haskell, pelo mesmo motivo acima, por causa da linguagem que é feito.

Awesome tinha muitas opções de configuração, particularmente não gosto disso :/, e parei de usar xmonad apenas por que eu parei um tempo de estudar Haskell, mas eu já havia pego o gosto pelos "tiling wm", procurando um pouco achei o dwm, por seu carater minimalista e por sua leveza logo me agradou muito.

Instalação e Configuração

Primeiro git clone:

% git clone http://git.suckless.org/dwm

Copie o arquivo config.def.h para config.h:

% cp config.def.h config.h

Edite-o e faça as suas configurações (falarei delas mais adiante).

Para terminar a instalação, falta apenas:

% make && make install

Se quiser, pode instalar num PREFIX diferente:

% make && make PREFIX=/opt/dwm install

O último passo da instalação é criar o arquivo /usr/share/xsessions/dwm.desktop com o seguinte conteúdo:

[Desktop Entry]
Encoding=UTF-8
Name=dwm
Comment=Dynamic window manager
Exec=/usr/local/bin/dwm
Icon=dwm
Type=XSession

Nota: Edite o Exec acima de acordo com seu make install.

Agora o dwm já deve aparecer no seu gerenciador de login gráfico (KDM, GDM, LightDM, …).

Uma dica é você instalar pelo seu gerenciador de pacotes da sua distro o dmenu para chamar os programas, sem precisar abrir um terminal.

Configuração

A configuração é a parte mais chata, pelo único fato de que você:

  • Faz a configuração editando o config.h;
  • Compila e "instala" novamente :/;
  • Reinicia o X;

Pelas minhas pesquisas tem como não precisar reiniciar o X, mas como eu não vou ficar fazendo os processos acima todo os dias da minha vida, resolvi não mudar nada nesse fluxo.

Teclas de atalho básicas (Estou usando um teclado apple, então a tecla abaixo command deve ser o equivalente ao alt para você):

  • command+shit+q, para fechar o dwm;
  • command+shit+c, para fechar a janela atual;
  • command+p, para chamar o dmenu (para executar os programas);
  • command+return, para chamar o terminal (que por padrão é o st, edite o config.h e mude para o que você usa);
  • command+N (onde N é um número de 1-9) para mudar a "tag" (algo como os ambientes de trabalho virtual no gnome/kde/xfce);
  • command+shift+N (onde N é um número de 1-9) para mandar a janela atual para outra tag;
  • command+j (ou command+k) para mudar entre as janelas da tag atual.

Abra o arquivo config.h para ver mais teclas e também para customizar.

Usage

O dwm não trabalha somente com as janelas maximizadas, mas ele pode também colocar uma ao lado da outra (gerenciador de janelas lado a lado, sacou?), ou deixar você livre para escolher o tamanho e disposições delas.

Devo adimitir que nesse ponto o xmonad (não lembro sobre o awesome, pois faz muito tempo que usei) se sai melhor, mas para as minhas necessidade ele faz o que preciso.

As combinações de tecla para isso são:

  • command+t, coloca uma do lado da outra, neste modo pode-se usar o command+i para mudar para vertical ou o command+d para ficar na horizontal;
  • command+f, float mode, modo "flutuante", aqui as janelas tem o comportamento "normal" dos outros gereciadores de janelas;
  • command+m, modo de janela única, i. e., somente uma janela por vez é mostrada e ela fica maximizada sempre, para mudar entre janelas, use o command+j (ou command+k);

Fonte

“Tiling Window Manager.” Wikipedia, the Free Encyclopedia, September 20, 2014. http://en.wikipedia.org/w/index.php?title=Tiling_window_manager&oldid=613735109.

Instalando LaTeX "manualmente"

2014-09-13 21:59:00 -0300

Usei Arch Linux para estes testes, mas acredito que funcione em qualquer outra distribuição.

Na verdade deveria ser: "Instalando o LaTeX sem usar o gerenciador de pacotes da distribuição" :P.

Baixe o arquivo install-tl-unx.tar.gz de http://www.tug.org/texlive/acquire-netinstall.html.

Para iniciar a instalação basta extrair o tar.gz e executar o script install-tl:

% tar xfz install-tl-unx.tar.gz
% cd install-tl-20140911
% ./install-tl

Será extraido um diretório nesse padrão: install-tl-YYYYMMDD, para mim é o diretório acima, para você pode ser que mude.

O script install-tl, vai mostrar um menu com algumas opções, você pode escolher a opção I para iniciar a instalação, mas eu gosto de instalar apenas o pacote básico e no meu espaço de usuário.

Para instalar somente o básico escolha a opção S e depois escolha:

e [X] minimal scheme (plain only)

Tecle R para voltar ao menu anterior.

Agora vou configurar para instalar no meu espaço de usuário, escolha a opção D, depois a opção 1 e por fim digite o caminho de instalação, normalmente eu coloco:

~/local/texlive/2014

R para voltar ao menu anterior. E depois I para iniciar a instalação.

Adicione ao seu $PATH o caminho ~/local/texlive/2014/bin/x86_64-linux.

Pacotes extras

Para completar a instalação do LaTeX eu instalo ainda esses pacotes

% tlmgr install latex latex-bin latexconfig latex-fonts amsmath babel \
carlisle ec geometry graphics hyperref lm marvosym oberdiek parskip \
pdftex-def url babel babel-portuges mathtools tools

Basicamente todo arquivo que crio usam esses pacotes.

Se tiver algum problema em rodar o comando para gerar o PDF tente pesquisar usando o tlmgr:

% tlmgr search --global PKG

Para procurar por um arquivo:

% tlmgr search --global --file ARQUIVO.EXT

Após todos esses passos minha instalação do LaTeX ficou em cerca de 228M.

Fonte

“LaTeX/Installation - Wikibooks, Open Books for an Open World.” Accessed September 12, 2014. https://en.wikibooks.org/wiki/LaTeX/Installation

Aprendendo Python com testes automatizados

2014-07-02 18:19:00 -0300

Estou aprendendo ainda Python, então se o código puder ser melhorado, pode comentar ;)

Então… Eu estava assistindo as aulas do Python for Zumbies e me deparei com alguns códigos para fazer. Porém quando se inicia o aprendizado de alguma linguagem você quer ver seu código funcionando, para mim existem duas forma de ver meu software funcionando:

  • Automatizar os testes com o software;
  • Entregar o projeto para o usuário (que pode até mesmo ser eu).

Eu como usuário gosto de usar software apenas "funcional", i. e., para que que eu vou usar uma Sequência de Fibonacci ou um software que contabiliza médias de notas se eu não estou tendo aulas?

Então a melhor forma que resolvi testar foi criando testes automatizados.

Sequência de Fibonacci

Primeiro vou criar o arquivo de teste:

Após estudar um pouco cheguei no seguinte código:

import unittest
from fib import fib

class FibTestCase(unittest.TestCase):
  def test_fib1(self):
    self.assertEqual(fib(1), 1)

  def test_fib0(self):
    self.assertEqual(fib(0), 0)

  def test_fib6(self):
    self.assertEqual(fib(6), 8)

  def test_fib6_again(self):
    self.assertTrue(fib(6) == 8)

unittest.main()

Se esse código for executado gera o seguinte erro:

% python fib_test.py
Traceback (most recent call last):
  File "fib_test.py", line 2, in <module>
    from fib import fib
ImportError: No module named 'fib'

Até aí tudo bem, eu ainda não criei o código fibonacci, vamos criar então:

# fib.py
def fib(n):
  if n < 2:
    return(n)

  a = fib(n-1)
  b = fib(n-2)

  return(a+b)

E executando, temos:

% python fib_test.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK

Orientação a objetos

Depois que aprendi a orientação a objetos em python eu fiz alguns exemplos, entre eles:

Primeiro o teste:

import unittest
from televisao import Televisao

class TelevisaoTestCase(unittest.TestCase):
  def setUp(self):
    self.tv_sala = Televisao('Sala')

  def test_uma_nova_televisao_deve_ser_desligada(self):
    self.assertFalse(self.tv_sala.ligada)

  def test_eu_posso_mudar_o_status_para_ligada(self):
    self.tv_sala.ligada = True
    self.assertTrue(self.tv_sala.ligada)

  def test_eu_posso_mudar_o_canal(self):
    self.tv_sala.canal_mais_um
    selft.assertEqual(self.tv_sala.canal, 2)

unittest.main()

Agora a classe:

class Televisao:
  def __init__(self, local):
    self.ligada = False
    self.canal = 1
    self.local = local

Esse exemplo da classe Televisao eu fiz ao estilo TDD, criava o teste e depois o código.

Ficou faltando um método na classe Televisao, se estiver estudando semelhante a mim, adiciona lá ;)

Confira o Python for Zumbies tem várias vídeo aula em português e diversos exercícios bem práticos!

Fontes

“26.3. Unittest — Unit Testing Framework — Python 3.4.1 Documentation.” Accessed September 1, 2014. https://docs.python.org/3/library/unittest.html.

“Python Para Zumbis Com Fernando Masanori.” Accessed September 2, 2014. http://pycursos.com/python-para-zumbis/.

Envio de e-mail com ssmtp

2014-05-20 12:19:00 -0300

Nota: Todos os comandos eu executei como root, caso não seja root use o sudo antes dos comandos.

Enviando e-mail de máquina unix usando o ssmtp.

No ubuntu instale com o apt-get:

# apt-get install ssmtp

Depois basta configurar para usar o Amazon SES no arquivo /etc/ssmtp/ssmtp.conf:

root=username@mydomain.com
mailhub=email-smtp.us-east-1.amazonaws.com:465
hostname=myserver.mydomain.com

FromLineOverride=YES

AuthUser=AAAAABBBBBCCCCCDDDDD
AuthPass=AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGGHHHHHIIII
UseTLS=YES
AuthMethod=LOGIN

Se for usando o Gmail1:

root=username@gmail.com
mailhub=smtp.gmail.com:587
hostname=myserver.mydomain.com

FromLineOverride=YES

UseSTARTTLS=YES
AuthUser=username@gmail.com
AuthPass=MyPassword

Depois de fazer a configuração tem ainda que deixar as permissões corretas:

# chmod 640 /etc/ssmtp/ssmtp.conf
# chown root:mail /etc/ssmtp/ssmtp.conf

Se quiser que algum usuário envie e-mail, basta adicioná-lo ao grupo mail, editando diretamente o /etc/group ou:

# gpasswd -a username mail

Enviando e-mail

Para testar (caso seu usuário não seja do grupo mail use o sudo antes do ssmtp):

# echo "Testing" | /usr/sbin/ssmtp username@gmail.com

Ou se quiser use um arquivo, por exemplo:

From: username@mydomain.com
Subject: This is Sparta!

Hi.

E chamando via linha de comando:

# ssmtp username@mydomain.com < /tmp/mail.txt

Rails

Para configurar no Rails basta usar algum arquivo de configuração no initializers semelhante a:

Rails.application.configure do
  config.action_mailer.delivery_method = :sendmail
  config.action_mailer.sendmail_settings = { :arguments => '-i' }
  config.action_mailer.default_url_options  = { :host => "mydomain.com" }
end

Ou então colocar em config/environments/production.rb.

Exemplo de scripting

O script abaixo eu coloquei num servidor para me enviar um e-mail com as atualizações que são necessárias, no meu caso coloquei uma vez por dia no crontab:

#!/bin/bash

apt-get update >/dev/null 2>/dev/null
count=$(/usr/lib/update-notifier/apt-check --human-readable | grep -v ^0 | wc -l)

if [ $count -ne 0 ]
then
  file=/tmp/updates-notify-$$

  echo -e "To: username@mydomain.com
From: $(hostname)@mydomain.com
Subject: $(hostname -f) has updates

The server $(hostname -f) has updates:

$(/usr/lib/update-notifier/apt-check --human-readable)

$(apt-get -s -o Debug::NoLocking=true upgrade | grep 'Inst' | cut -d' ' -f2)
" >> $file

  ssmtp username@mydomain.com < $file
  rm $file
fi

Fontes

"SSMTP - ArchWiki". ArchWiki. Accessed May 19, 2014. https://wiki.archlinux.org/index.php/SSMTP.

"How to Use GMail as a Free SMTP Server and Overcome Captcha". Accessed May 19, 2014. http://stackoverflow.com/questions/1607828/how-to-use-gmail-as-a-free-smtp-server-and-overcome-captcha.

"Rails & Sendmail Recipients with -T Option Not Supported." Accessed May 31, 2014. http://stackoverflow.com/questions/6456205/rails-sendmail-recipients-with-t-option-not-supported.


1 Cuidado que o gmail tem um problema de autenticação, caso toda sua configuração esteja certa e mesmo assim receba erro de autenticação, visite: http://www.google.com/accounts/DisplayUnlockCaptcha ou https://www.google.com/a/yourdomain.com/UnlockCaptcha para autorizar o envio de e-mail pelo seu servidor.

Recomendação de Leitura: A Dança do Universo

2014-04-02 21:21:00 -0300

Livro de linguagem acessível sobre as teorias da criação do universo. Muito recomendado para quem gosta de ciência e teorias sobre a criação/existência do universo.

Antes de iniciar a leitura recomendo ouvir esses dois episódios do podcast Dragões de Garagem.

O primeiro fala claramente do livro, mas não achei que possar ter expoliers, até por que o livro fala de teorias científicas e querendo ou não você já ouviu falar de algumas delas, o que pode é não lembrar.

Foi até por causa do episódio #23 que iniciei a leitura.

Local para comprar:

Se gosta da série Cosmos recomendo o livro e o podcast.