Configurando múltiplas chaves SSH para o github/bitbucket.

Decidi implementar alguns projetos para o trabalho e decidi criar um repositório no Bitbucket para armazenar o código, porém como meu notebook já estava configurado para acessar o Github, deu treta na hora de fazer o commit no Bitbucket.

Criando um arquivo de configuração

Se você está usando GNU/Linux, crie um arquivo de configuração no diretório ~/.ssh caso não exista.
Nele você pode adicionar as seguintes linhas:

Host trabalho
 HostName bitbucket.org
 IdentityFile ~/.ssh/trabalho.pub
Host pessoal
 HostName github.com
 IdentityFile ~/.ssh/id_rsa.pub

No arquivo você pode adicionar quantos hosts quiser.

Por fim, ao invés de usar @git.com / @bitbucket.org quando for clonar ou adicionar a origem, basta trocar pelo alias que você criou. Por exemplo:

git@pessoal/conta/repositorio.git

É só! 😀

Referência: https://confluence.atlassian.com/pages/viewpage.action?pageId=271943168

Anúncios

Comparando bancos MySQL com o Toad for MySQL

Muitas vezes você já deve ter gasto algum tempo comparando bases de desenvolvimento com a de produção na hora de liberar uma nova versão do seu aplicativo, não é?

Dependendo da quantidade de tabelas que existem no seu banco este trabalho pode ser muito maçante. Para isto existem diversas ferramentas (em sua grande maioria, pagas) para fazer a comparação entre dois bancos (ou schemas se preferir).

Neste tutorial vou mostrar como utilizar o Toad for MySQL para comparar dois schemas MySQL.

Continuar lendo

Synapse Indicator – um “spotlight” para o Elementary OS / Ubuntu

O Synapse indicator é um app semelhante ao unity dash (bem mais rápido por sinal) que ao ser instalado fica no wingpanel do Elementary.

synapse-indicator-elementary-os

Quem está acostumado com o Mac OS vai o achar muito semelhante ao Spotlight, a diferença é que ele (por enquanto) não faz busca dentro dos arquivos. Além de exibir resultados sobre aplicações e arquivos, é possível fazer buscas no google, google maps e até processar expressões no WolframAlpha!

Além de ser compatível com o Elementary OS, o mesmo pode ser usado no Unity, GNOME fallback-session (GNOME classic) e até mesmo no Cairo Dock.

Dica: é possível acessá-lo de forma rápida através do atalho ALT+SUPER+ESPAÇO.

synapse-indicator-elementary-os-2

Instalação

A instalação do Synapse-Indicator é bem simples via ppa.
Se você utiliza o Ubuntu, deve antes adicionar a ppa do Elementary OS:

sudo add-apt-repository ppa:elementary-os/daily
sudo apt-get update

Se você usa o Elementary pode pular direto para cá.

sudo add-apt-repository ppa:elementary-os/unstable-upstream
sudo apt-get update
sudo apt-get install indicator-synapse

Assim que instalado, você precisa reiniciar o wingpanel (apenas para o Elementary OS):

killall wingpanel

Fonte: Webupd8 [ http://www.webupd8.org/2013/06/synapse-indicator-new-search.html ]

Rotas personalizadas no Devise

Dica rápida: se você quiser utilizar uma rota diferente do padrão no Devise (gem para autenticação no Rails), no seu arquivo routes.rb basta trocar a linha:

devise_for :user

por:

devise_for :user, :path => '', :path_names => { :sign_in => "login", :sign_out => "logout", :sign_up => "cadastro" }

É isso!

Implementação do algoritmo “vizinho mais próximo” (nearest neighbor)

Este algoritmo é uma das heurísticas utilizadas no problema do caixeiro viajante para se descobrir o melhor caminho em um grafo.

A classe abaixo utilizei no trabalho final da disciplina (implementação em Java :P)

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package grafo2.dominio;

/**
* Classe que implementa a heurística do vizinho mais próximo (nearest neighbor)
* @author simasware
*/
public class NearestNeighbor {

private int[] path; //array do melhor caminho

public NearestNeighbor(final int[][] distanceMatrix, final int startCity) {

path = new int[distanceMatrix[0].length]; //inicia o caminho

//preencho o caminho inicialmente com o infinito
//pois dava problema com valor 0 ao iniciar com uma cidade diferente de A
for (int i = 0; i < path.length; i ++){
path[i] = Integer.MAX_VALUE;
}

//a cidade inicial é a escolhida pelo usuário.
path[0] = startCity;
int currentCity = startCity;

// enquanto não houver cidades a serem visitadas
int i = 1;
while (i < path.length) {
// encontro a próxima cidade
int nextCity = findMin(distanceMatrix[currentCity]);
// se a cidade for diferente de - 1 (significa que a mesma não foi visitada)
if (nextCity != -1) {
// adiciono a cidade ao caminho
path[i] = nextCity;
// atualizo a cidade atual e o contador
currentCity = nextCity;
i++;
}
}
}

private int findMin(int[] row) {
//encontro o menor custo
//na linha passada por parametro (int[] row)
int proximaCidade = -1;
int i = 0;
int min = Integer.MAX_VALUE;

while (i < row.length) {
//se a cidade não está no caminho e o custo dela for menor que min
//min passa a ser o custo de row[i] e a proxima cidade passa a ser i
if (!isCityInPath(path, i) && row[i] < min) {
min = row[i];
proximaCidade = i;
}
i++;
}
return proximaCidade;
}

//retorna o array com o caminho
public int[] getPath() {
return path;
}

//verifica se a cidade está no caminho (int[] path)
public boolean isCityInPath(int[] path, int city) {
for (int i = 0; i < path.length; i++) {
if (path[i] == city) {
return true;
}
}
return false;
}
}