27 de fev de 2014

Primeiros passos no Git

Vou escrever aqui  meus primeiros passos usando o Git. Os tutoriais pela internet mostram como fazer coisas mais avançadas, mas acredito que, como eu, tenha muitos usuários aí sem saber o que fazer com o básico.

Após instalar e criar um login, fazemos a configuração local. No terminal, digite:

git config --global user.name "Fulano de Tal"
git config --global user.email fulano@site.com.br

Essas informações sempre aparecerão no cabeçalho dos arquivos de log das alterações. Escolhemos uma pasta onde ficará o código, provavelmente uma pasta já com conteúdo. Vá então até essa pasta e digite:

git init

Este comando fará com que sua pasta esteja sendo monitorada LOCALMENTE pelo Git (mas nada está online ainda, no https://github.com/seu_nome_de_usuario). Para verificar a presença do Git, dê um ls .git


A pasta está sendo monitorada, mas os arquivos não. Se dermos um git status, veremos uma mensagem de aviso que os arquivos da pasta não estão sendo monitorados (Untracked files). Vamos, então, começar a separar os arquivos que devem ser monitorados e quais não. Para monitorar, dê:

git add arquivo(s)

É bom, também, ter um arquivo README, esse pode ser feito online, por sugestão do próprio github, ou ser feito localmente e ser enviado depois, como todos os outros arquivos do seu código. Para adicioná-lo, seria git add README. Para ignorar arquivos, edite o arquivo .gitignore, adicionando os nomes dos arquivos ou expressão regular.

Adicionados todos os arquivos, vamos fazer o commit, que significa, de grosso modo, avisar ao git que eu tenho uma nova versão pronta do arquivo. Em todo commit, você deve escrever um comentário sobre que alterações foram feitas. Como este é o primeiro commit, digite:

commit -m "Primeira versao crua, incompleta, bugada e sem tratamento de erros"


Ou algo menos exagerado que isso. Mas, o backup ainda está sendo local, nada na sua página no github. Agora, vem o pulo do gato. Vá à sua página no github - https://github.com/seu_nome_de_usuario - e crie um novo repositório. Lá, haverá uma instrução para você tornar seu repositório online através da linha de comando. A tela é como a seguinte:

Então, os comandos a serem dados nesse primeiro momento são:

git remote add origin https://github.com/seu_nome_de_usuário/nome_do_repositório.git
git push -u origin master

Ele pedirá seu usuário e senha do github e voilà, seus arquivos estarão online.


Para adicionar novos arquivos e adicionar arquivos alterados, repita as operações de add, commit e, após isto, use o git push. Este comando submete o commit ao online. Lembre-se sempre de controlar seus arquivos com o git status. Para adicionar o log do git status ao seu commit, use a opção commit -v.

Qualquer informação que esteja errada, por favor, não avacalhem, apenas avisem amavelmente, estou apenas aprendendo e expondo meu aprendizado. Editarei o arquivo sempre que for preciso.

Referências:
Grande parte do conteúdo foi resumido do git-scm.com. Outra boa referência é o Guia Definitivo do Stack Overflow.

25 de fev de 2014

Colocar data automaticamente em arquivos de fotos (Linux)

Fiz um programa em bash para colocar aquela estampa de data (timestamp) em arquivos com base na última modificação do arquivo. Muitas vezes acontece de você ter a foto em si, mas não ter programado a câmera para gerar automaticamente esse carimbo na foto. Ou, como foi meu caso, achar que não tinha importância a data e, depois, começar a querer colocar, além de que os aplicativos padrão de Câmera de celular não terem essa funcionalidade (pelo menos eu nunca tive contato com um que tivesse, somente aplicativos instalados a mais, como o Camera360).


Para quem quiser pegar o programa, pode fazer o download, mas, aqui, vou explicar o que fiz, deixando o código   e que referências de consulta usei. É bom para aprender um pouquinho de Bash e alguns comandos de Linux e, para quem quiser, modificar o programa para outros propósitos (Filosofia do Código Aberto ;) ).

O primeiro passo do programa é testar a entrada do programa. Eu quero que o programa receba apenas uma entrada, portanto, se a chamada ao programa for diferente de 1 argumento, devo dar uma mensagem de erro e sair.

Para obter a data da última modificação do arquivo, usamos o comando stat. Consultando o manual, vemos que a opção -c corresponde a: "use the specified FORMAT instead of the default; output a newline after each use of FORMAT". Ou seja, se usarmos o stat sozinho, ele dará uma série de informações sobre o arquivo, mas só nos interessa a data da modificação, então usamos a opção -c e pedimos o formato que queremos, que é obtido usando %y.

    %y     Time of last modification, human-readable
Trecho do manual sobre a opção %y

Usando o comando stat -c %y [referência], obteremos algo do tipo:

2014-02-25 15:37:46.000000000 -0300

Mas só nos interessa a data, que vem no formato yyyy-mm-dd. Então, usando uma manipulação de string, localizamos o espaço e pegamos o conteúdo até onde ele ocorrer. Usamos o operador %% seguido do caracter desejado, no caso, o espaço e um asterisco ($string=${string%%-*} - substituí o espaço por um traço para ficar mais palpável). Note que o comando verificará a primeira ocorrência do marcador, mesmo que a string pode tenha o mesmo marcador depois. Entretanto, se usarmos o operador % (simples), ele localizará a última ocorrência, que é o que queremos nesse instante: separar a substring que vem antes do espaço. 

O operador ##, por outro lado obtém o que estiver depois do marcador, sendo que a ordem entre o marcador e o asterisco se inverte ($string=${string##*-}). Servirá para obter a extensão do arquivo, como será visto ao longo deste texto. Não quis me alongar muito nessa explicação para não perder o objetivo principal do post, mas tem exemplos aqui, aqui e o meu exemplo (link no GitHub).

Voltando à data, vamos usar o operador "%% *" para obter o pedaço "2014-02-25" da saída obtida com o comando stat. Segue o trecho do código responsável:

  1. #obtem data de ultima modificacao do arquivo
  2. data=$(stat -c %$1)
  3. data=${data%% *}

No programa, eu gerei um nome de saída para o arquivo com a data com base no nome de entrada, adicionando a ele a data e hora em que foi gerado. Para isso, temos que pegar o nome do arquivo (que é dado pelo usuário ao rodar o programa, ou seja, é o argumento 1 - $1 - da chamada via linha de comando, por exemplo ./datarFoto lago.jpg), obter todo o nome até o último ponto (usando o tratamento de substrings que eu expliquei acima) e também guardar a extensão, que usará o operador ## para guardar a substring depois do marcador. Para concatenar duas strings, basta colocá-las lado a lado depois do sinal de =, como na última linha do trecho abaixo:

  1. #gerar nome do arquivo de saida
  2. nomeSaida=$1
  3. extensao=${nomeSaida##*.}
  4. nomeSaida=${nomeSaida%.*}
  5. nomeSaida=$nomeSaida$(date +"_%y%m%d_%H%M")

Faltou explicar o funcionamento do date [referência]. O sinal de + indica o formato que eu quero que a data seja exibido. O comando date sozinho dá a data atual, usando os operadores +"_%y%m%d_%H%M", a data será exibida no tipo _140131_1251, onde 14 é o ano (2014), 01, o mês e 31 o dia. Os sublinhados foram escolha minha, você podia botar outros caracteres para separar, mas , como estamos lidando com nome de arquivo, não seria legal colocar certos caracteres como barra e dois pontos.

Para mudar o formato da data (a ser carimbada na foto e não no nome do arquivo de saída) para o nosso formato tradicional (dd/mm/yyyy), também usamos o comando date. Mas, dessa vez, damos como entrada a data obtida pelo stat. Para isto, usamos a opção --date= que indica ao date que é para usar determinada data e não a do dia de hoje.

  1. #converte o formato da data de yyyy-mm-dd para dd/mm/yyyy
  2. texto=$(date --date=$data +"%d/%m/%y")

Por fim, vamos carimbar a foto. Usamos o comando convert. Como não consegui rodar o comando de uma vez, coloquei o comando numa string e mandei a string ser rodada, através do eval. As opções do convert que merecem destaque são a gravity (mais informações aqui), que serve para mudar a origem das coordenadas. A opção draw diz em que posições vertical e horizontal vai ser colocado o texto. Usando a opção gravity Southeast, essas posições são dadas com relação à ponta inferior direita, sendo assim, independente do tamanho, o carimbo sempre vai ser dado neste canto.

  1. #usar o formato para usar o comando convert
  2. executar="convert -pointsize 20 -fill yellow -gravity Southeast -draw 'text 20,20 \"$texto\"' $1 $nomeSaida.$extensao"
  3. eval $executar

Referências:
http://www.instructables.com/id/Add-text-to-images-with-Linux-convert-command/2/?lang=pt
http://www.linuxquestions.org/questions/programming-9/get-file-modification-date-time-in-bash-script-163731/
http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/
http://www.win.tue.nl/~aeb/linux/misc/convert/convert-draw-text.html
http://tldp.org/LDP/abs/html/string-manipulation.html

14 de fev de 2014

Como dividir um mp3 grande em vários menores de mesmo tamanho

Vou mostrar o procedimento que usei para dividir um grande arquivo contínuo de áudio em vários menores de 15 minutos.

Em primeiro lugar, eu queria baixar o arquivo de áudio do Youtube, mas, por ser grande, não consegui baixar usando um conversor online. Então, usei o Youtube Options, do qual já falei em um post anterior. É preciso baixar sua versão completa, fazendo o download do arquivo e arrastando-o para o Chromium. A versão encontrada para baixar pela central de aplicativos da Google não é a completa e não permite fazer downloads.

Após a instalação do YTO, já é possível ver links para fazer
o download em diferentes extensões de vídeo
O próximo passo foi converter o vídeo em mp3 (já que não é exatamente um vídeo). Eu escolhi converter de 3gp:

avconv -i arquivo.3gp -acodec libmp3lame -ar 22050 -f wav arquivo.mp3

Se vier uma mesagem de erro escrito Unknown encoder 'libmp3lame', será necessária a instalação de um codec:

sudo apt-get install libavcodec-extra-53

E aí sim, dar o comando do avconv. Para fazer a divisão em vários arquivos, será necessária a instalação do programa mp3splt

sudo apt-get install mp3splt

Para entender as opções, recomendo a leitura do manual. Vale notar que o programa permite, inclusive cortar automaticamente com base em silêncios (útil se o arquivo grande for um disco completo e você quer dividir em faixas). Não testei essa função porque o meu objetivo aqui era apenas dividir um arquivo grande em partes iguais de 15 minutos. O comando é o seguinte:

mp3splt -t 15.0 arquivo_grande.mp3 -o "@n @f"

O pedaço "-t 15.0" indica o tempo dos arquivos de saída, no formato "minutos.segundos" e "-o @n @f" indica que o nome do arquivo de saída será o número do pedaço (@n) mais o nome original do arquivo (@f)

Referências:
Is there an easy way to split mp3 files? - Super User (Fórum de perguntas, em inglês)
How can I split a mp3 file? -Ask Ubuntu (Fórum de perguntas, em inglês)

9 de fev de 2014

Ativando som via HDMI no notebook Positivo Premium (Ubuntu 12.04)

Problema: ao conectar o cabo HDMI, a imagem sai na televisão usando a tecla Fn correspondente, mas o som sai no laptop.

Configuração
: Positivo Premium S6040 com Ubuntu 12.04. TV LG
Solução:
Verificamos se o HDMI é reconhecido com o comando aplay -l (este comando mostra todos os dispositivos de áudio reconhecidos). Tive dois resultados, a placa de som e o áudio HDMI:

$ aplay -l
**** Lista de Dispositivos PLAYBACK Hardware ****
placa 0: PCH [HDA Intel PCH], dispositivo 0: ALC269VB Analog [ALC269VB Analog]
  Dispositivo secundário: 1/1
  Dispositivo secundário #0: subdevice #0
placa 0: PCH [HDA Intel PCH], dispositivo 3: HDMI 0 [HDMI 0]
  Dispositivo secundário: 1/1
  Dispositivo secundário #0: subdevice #0

Teste então, com o cabo conectado à TV, se haverá uma saída de som tipo TV fora de canal usando este comando:
speaker-test -c 2 -r 48000 -D hw:0,3

Após alguns segundos, deve apaecer uma saída assim:


O resultado correto é ouvir o ruído na TV vim da direita e esquerda alternadamente. Pressione ctrl+c para parar.  

Isso comprova que a saída de som HDMI está sendo reconhecida e em funcionamento. Abrindo as configurações de som (acessada pelo ícone de volume), clique na aba "Hardware". Lá, deve ter a opção HDMI, na caixinha "Perfil", na parte de baixo, como mostrado na figura:


Atenção à parte de baixo: "Configurações para o dispositivo selecionado"
Ao mudar ali, o som saiu perfeitamente pela TV. Para voltar ao som do laptop, volte ao som estéreo.

OBS: Como o som é do chipset da Intel, para o caso do Positivo S6040, não é necessária a instalação de drivers adicionais. Mas, dependendo do modelo da placa mãe, pode ser necessário. 

OBS2: Eu segui os passos desse site para atualizar o kernel, mas não sei se foi necessário, no fim das contas. 

Referências:
http://askubuntu.com/questions/112512/ubuntu-refuses-to-output-audio-via-hdmi
https://github.com/GM-Script-Writer-62850/Ubuntu-Mainline-Kernel-Updater

Quem sou eu

Raphael Fernandes
Carioca, Brasileiro, Estudante de Robótica
Hiperativo, Imperativo
Gosto de tecnologia, de transporte, de Rock, de reclamar e de propagandas criativas (e outras coisas que posso ter falado em um post ou não)
Musicalmente falando, sou assim.

Related Posts Plugin for WordPress, Blogger...

Veja também...