quinta-feira, 27 de agosto de 2015

Criando modal do Twitter Bootstrap dinamicamente

O Twitter Bootstrap é mesmo uma mão na roda para os desenvolvedores web - principalmente aqueles que não desejam (ou simplesmente não querem) investir muito tempo em estilização do CSS. Ainda assim, o framework apresenta algumas "dificuldades".

Uma delas, ao meu ver, é com relação ao modal (um dialog padrão bem mais elegante que o proposto pelo jQuery UI). Em contraponto, a caixinha do Bootstrap peca por ser difícil de ser implementada: ao contrário do dialog do jQuery que utiliza um método em JavaScript bem simples, a opção do Bootstrap exige que se trabalhe na personalização do HTML. Ou seja, caso você queira implementar, digamos, 20 modals na sua aplicação, terá que fazer um Ctrl+C e Ctrl+V do HTML mais a edição umas 20 vezes. Assim, desenvolvi um pequeno método em jQuery para criar modals do Bootstrap dinamicamente.

A ideia é parecida com o método do jQuery: passar um objeto com os valores desejados para a implementação do modal e criá-lo em cima de um HTML básico.

O HTML usado é o seguinte:

 <div id="modal-default" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModal" >  
  <div class="modal-dialog">  
   <div class="modal-content">  
    <div class="modal-header">  
     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>  
     <h4 class="modal-title" id="myModal"></h4>  
    </div>  
    <div class="modal-body">  
    </div>  
    <div class="modal-footer">  
    </div>  
   </div>  
   </div>  
 </div>  

Já o método é o apresentado abaixo:

 function build_modal(opt) {  
   var $this = $("#modal-default");  
   if ( opt.is_small ) {  
     $this.find(".modal-dialog").removeClass("modal-lg").addClass("modal-sm");  
   } else if ( opt.is_large ) {  
     $this.find(".modal-dialog").removeClass("modal-sm").addClass("modal-lg");  
   } else {  
     $this.find(".modal-dialog").removeClass("modal-sm").removeClass("modal-lg");  
   }  
   $this.find(".modal-title").html(opt.title);  
   $this.find(".modal-body").html(opt.body);  
   if ( opt.button != undefined ) {  
     var include_buttons = "";  
     for ( var i in opt.button ) {  
       console.log(opt.button[i]);  
       include_buttons += '<button type="button" class="btn ' + opt.button[i].type + '"';  
       if ( opt.button[i].onclick ) {  
         include_buttons += ' onclick="' + opt.button[i].onclick + '"';  
       }  
       if ( opt.button[i].close_button ) {  
         include_buttons += ' data-dismiss="modal"';  
       }  
       include_buttons += '>' + opt.button[i].text + '</button>';  
     }  
     $this.find(".modal-footer").css("display", "block").html(include_buttons);  
   } else {  
     $this.find(".modal-footer").css("display", "none");  
   }  
   $this.modal();  
 }  

Na sequência, apresento um exemplo de como pode ser o objeto enviado para o build_modal. O modal proposto continua trabalhando com a largura padrão proposta pelo Bootstrap, mas é possível alterar isso setando 'is_small' ou 'is_large' como verdadeiro.

O título desejado vai em title e o corpo do modal vai em body. Nesse caso, o valor pode ser tanto uma string com o HTML quanto um nó da DOM.

O modal pode ter um ou mais botões, como também pode não ter nenhum - fechando com um click fora. Indique o close_button como true para incluir o atributo data-dismiss no botão - necessário para fechar o modal com um clique. Um ponto a ser trabalho é a associação de métodos ao clique de um botão do modal. No meu exemplo, já é necessário ter uma função em algum arquivo para ligar ao atributo onclick, mas seria interessante implementar já a função direto no click, como no dialog do jQuery.

 build_modal({  
   title: 'Teste do modal',  
   is_large: true,  
   body: '<p>O modal está em perfeito estado?</p>', //pode ser também $("#corpo_modal") por exemplo 
   buttons: [  
     {  
       text: "Cancel",  
       type: "btn-default",  
       close_button: true  
     },  
     {  
       text: "Sim",  
       type: "btn-success",  
       onclick: "set_method_as_top()"  
     }  
   ]  
 });  

O resultado é esse:






Aqui vai um fiddler para quem quiser testar na prática.


Então é isso. Comentem apontando críticas ou sugestões.
(Atualizado às 15h17 (horário de Manaus), do dia 28 de agosto, para incluir atributo em botão para fechar o modal e corrigir onclick).

quinta-feira, 13 de agosto de 2015

Trabalhando com Virtualenvwrappers

Virtualenv é um grande aliado do desenvolvedor que trabalha com muitos projetos, que tem bibliotecas diferentes, ou a mesma biblioteca em versões diferente. Entetanto navegar entre os projetos e ativar o virtualenv correto pode se tornar muito trabalhoso. Para facilitar esse processo existe a biblioteca Virtualenvwrapper.

Instalação

 pip install virtualenvwrapper  


Configuração É necessário adicionar três linhas ao arquivo de inicialização do terminal (~/.bashrc)
 export WORKON_HOME=$HOME/<ENV_FOLDER>  
 export PROJECT_HOME=$HOME/<PROJECT_FOLDER>  
 source /usr/bin/virtualenvwrapper.sh  

Onde  <ENV_FOLDER> deve ser substuído pelo nome da pasta onde serão guardados todos os seus Virtualenvs. <PROJECT_FOLDER> é a pasta raiz dos seus projetos.

Depois disso deve ser rodado o comando:

 source ~/.bashrc  

Uso

Agora você pode visualizar todos os seus Virtualenvs com o comando:

 workon  


Para ativar um virtualenv existente, ou para criar um novo Virtualenv, basta digitar
 mkvirtualenv teste   

Este comando ativa o virtualenv teste se ele existir, ou cria um novo caso contrário.

Muito bem, agora ficou fácil ativar e desativar os virtualenvs, porém você ainda vai ter que navegar até o diretório do projeto... Isso não é muito legal.
Mas calma, ainda tem mais um truque legal no virtualenvwrapper:
 setvirtualenvproject WORKON_HOME/<env> PROJECT_HOME<project>   

Através deste comando você liga uma virtualenv com o projeto correspondente. Da próxima vez que você ativar um virtualenv o terminal vai mudar o diretório direto do projeto.

Caso você navegue para outro diretório basta digitar o comando abaixo para voltar ao diretório do projeto
 cdproject <project>   

Referências

Instalação
Comandos

terça-feira, 4 de agosto de 2015

Ranking com Gitstats

Recentemente aqui no setor de Engenharia da Fucapi criamos uma brincadeira saudável de rankear quem são os colaboradores que mais commitam em um determinado projeto em um determinado mês. Para isso, estamos usando a ferramenta Gitstats, que é própria para isso. Como o próprio nome já diz, essa ferramenta só funciona com repositórios Git e no Linux (Ubuntu o Fedora).

Além de trazer quem mais commita, ela também informa a quantidade de linhas do projeto, os tipos de arquivos existentes (extensão do arquivo) e vários gráficos (que são um pouco feios, mas o que vale é a informação). Segue abaixo os passos para a instalação e execução e uns exemplos reais daqui do nosso setor.

Instalação
No teminal do Linux, com permissão de root, execute os seguintes comandos:

 yum install gitstats     // for Fedora  
 apt-get install gitstats // for Ubuntu  


Execução
No terminal do Linux, vá até no diretório raiz onde foi clonado o repositório e execute o seguinte comando:

 gitstats Tecnica/ gitstats-page  

Nesse caso, Tecnica/ é o diretório raiz do projeto e gitstats-page é o diretório onde será criada a estrutura de uma página HTML com as informações compiladas. Dentro dessa estrutura será criado o arquivo index.html e é esse arquivo que vamos abrir com o comando:

 firefox gitstats-page/index.html  

E pronto. Segue uns exemplos de como ficou o nosso ranking:


Gráfico de commits por colaborador

Ranking mensal

Ranking geral

Total de linhas agrupadas por tipo de arquivo

Para mais informações é só acessa o site do Gitstats.

Até.





sexta-feira, 24 de julho de 2015

Tmux: uma opção para trabalhar com o terminal do linux

Para quem tem trabalha com o terminal do Linux e já se deparou com milhares de abas abertas ou precisou dividir a tela com dois terminais separados para acompanhar informações diferentes aí vai uma dica: Tmux!

Tmux vem do Terminal Multiplexer, ou seja vários terminais. Ele ajuda na composição de vários terminais em um só, com várias opções de organização. Veja os exemplos:

Terminal com dois sub-terminais na vertical

Terminal com dois sub-terminais na horizontal

Terminal com 4 sub-terminais
Como podemos ver nas imagens, com o Tmux fica fácil disponibilizar várias informações do terminal em uma tela só.

Para instalar o Tmux, segue os comandos:

 sudo yum install tmux     // Fedora
 sudo apt-get install tmux // Debian e Ubuntu


Após a instalação, eu configurei o Tmux para ficar com os mesmos comandos do Vim. Para isso eu alterei o .tmux.conf que fica no home (~/.tmux.conf) e adicionei as seguintes linhas:

 set -g prefix C-a  
 set -g history-limit 40000  
 setw -g mode-keys vi  
 set-option -g allow-rename off  
 bind-key v split-window -h  
 bind-key s split-window  


Feito isso, para abrir o Tmux, execute o comando tmux no terminal.
Para abrir uma janela na vertical, execute CTRL+A S.
Para abrir uma janela na horizontal, execute CTRL+A V.
Para navegar entre as janelas abertas, execute CTRL+A setas direcionais (cima, baixo, direita e esquerda)

Uma grande vantagem do Tmux é poder pesquisar texto dentro do terminal. Para isso, é preciso entrar no modo pesquisa usando o comando CTRL+PGUP e em seguida o comando / (Semelhante ao Vim). Para sair do modo pesquisa, basta pressionar ENTER.

Para mais informações, use o comando CTRL+A ? para ver outras opções ou ir no Manual do Tmux.

Até.

segunda-feira, 6 de julho de 2015

Trabalhando com Canvas

Para quem trabalha com algum tipo de Canvas (Kanban, Business Model, Feedback, etc) aí vai uma dica: Canvanizer

Nesse site você cria o seu canvas, onde é associado a sua conta de email. Uma vez criado, o site disponibiliza dois links: um para compartilhamento e outro para apenas visualização. Com essa funcionalidade fica fácil trabalhar: com o primeiro link você compartilhar o Canvas para quem for colaborar e com o segundo link você envia apenas para quem for ver o resultado final.

Além disso, o site disponibiliza o histórico das ações realizadas, import e export. Ou seja, uma ferramenta completa e online, vale apena conferir!

Obs: Na escolha do Canvas, para cada modelo eles disponibilizam no rodapé uma descrição de cada campo. Isso ajuda bastante quando vai utilizar pela primeira vez um Canvas ou quando está com dúvidas.