Quem não precisou ainda certamente um dia vai precisar... Apagar linhas repetidas SQL Server usando CTE (Commom Table Expressions) é um jeito rápido e muito simples! Vamos lá:
-- Cria uma tabela que terá as linhas
duplicadas
CreateTable Funcionarios(Id Int, Nome Varchar(100), Departmento Varchar(50))
Por padrão não é possível extrair num mesmo relatório de conteúdo do Google Analytics a página e o título da página. Eu precisava muito disso e consegui então resolvi compartilhar! Vamos lá, com a história triste primeiro e depois o resultado... No Google Analytics somente é possível extrair relatório por página ou título da página, um por vez, sem a chance de habilitar um dos dois como dimensão secundária. Ou você tem por Página:
Ou por Título
da página:
Não há, na
lista de dimensões secundárias, uma opção para página ou título da página:
Mas
se você precisa muito juntar estas duas informações num relatório, siga as
seguintes instruções usando o navegador Google Chrome (único que testei) e terá
sucesso:
1. Classifique o relatório por caminho da página, como se houvesse uma dimensão secundária para o título da página.
2. Como não existe a secunda dimensão que queremos, escolha Conteúdo > Nome do host.
3. Vá até a URL e repare que há dois segmentos nela: O pagePath e o hostname.
4. Agora ficou fácil né? Sim, basta trocar o hostname por pageTitle e mandar um Enter.
5. O resultado é este, caminho da página e o título da página no mesmo relatório de conteúdo.
A dica da vez é sobre como converter várias linhas de um resultado de select por exemplo em uma linha só, separado por exemplo do ponto e virgula ";", no SQL Server.
O script é bem simples e pode ser transformado numa função que retorne string (varchar) para ser usada em outras queries.
No exemplo abaixo criei uma tabela de pessoas, com Id, Nome e Idade. No cenário quero recuperar numa única coluna e linha quais as pessoas com idade > 20, separadas por ponto e virgula.
Vamos lá?
--// Cria tabela de exemplo num banco de dados do SQL Server
Create table Pessoas (Id Int Identity(1,1), Nome Varchar(100), Idade int)
--// Insere alguns valores na tabela para teste
Insert into Pessoas Values ('Andre', 20)
Insert into Pessoas Values ('Beatriz', 22)
Insert into Pessoas Values ('Carlos', 23)
--// Declara variável que receberá a lista (pode ser maior)
Declare @Result Varchar(200)
--// Inicia variável vazia por que varchar não concatena com null
Set @Result = ''
--// Seleciona cada registro que atende o select e concatena com a variável
Select @Result = @Result + Nome + '; '
From Pessoas
Where Idade > 20
--// Se houve resultado, retira o último caractere (;)
If @Result <> ''
Begin
--// Retira o último caractere ";"
Set @Result = SUBSTRING(@Result, 1, len(@Result)-1)
End
--// Retorna
Select @Result as Pessoas
No exemplo implementei ainda uma regra para tirar o ponto e virgula do final da variável. O resultado é o seguinte:
Coisa simples, mas evita alguns loops, seja com cursor ou tabela temporária, que é a primeira coisa que pensamos diante de uma necessidade como essa.
No SQL Server, algumas vezes é preciso alterar dados de tabelas relacionadas e com a existência de foreigns keys se torna uma tarefa impossível, porque quando você tenta fazer update na tabela 1 recebe erro por existirem dados relacionados na tabela 2 e vice e versa.
Para quem precisa, assim como eu eventualmente preciso, fica a dica para desabilitar foreign key temporariamente. (E tem que ser mesmo temporária hein!)
Nota: É possível desabilitar todas as foreign keys de uma vez ou alguma específica, conforme os exemplos:
Todas as foreigns keys
-- 1º) Desabilita TODAS as foreign key de uma tabela SQL Server
ALTER TABLE [NomeDaTabele] NOCHECK CONSTRAINT ALL
-- 2º) Habilita TODAS as foreign key de uma tabela SQL Server novamente
ALTER TABLE [NomeDaTabela] CHECK CONSTRAINT ALL
Uma foreign key específica
-- 1º) Desabilita uma foreign key específica de uma tabela SQL Server
ALTER TABLE [NomeDaTabela] NOCHECK CONSTRAINT [NomeDaConstraint]
-- 2º) Habilita uma foreign key específica de uma tabela SQL Server
ALTER TABLE [NomeDaTabela] CHECK CONSTRAINT [NomeDaConstraint]
Mais uma vez atento para não esquecer de habilitar a foreign key depois.
É isso aí, simples e objetivo! Espero que também seja útil!
O HTML 5 traz bastante simplicidade: Geolocalização (Geolocation), LocalStorage (Armazenamento local), EditableConteúdo editável, PlaceHolders, Expressões regulares e etc.
Neste post vou escrever sobre a Geolocation. A propósito, se não autorizou o acesso à sua localização, volte e autorize para vê-la no mapa.
<< Sua geolocalização vai aparecer aqui >>
A Geolocation do HTML 5 recupera a localização do usuário, especificamente a longitude e a latitude do ponto de acesso à internet. Isso pode variar de rede à rede e das configurações que cada uma pode ter. Mas em situações normais, a localização do acesso será identifica.
Juntando a Geolocation com a API de mapas do Google, temos o resultado acima, que é a exibição da localização no mapa.
Vamos lá, aos códigos! Primeiros exemplos e comentários e depois todo código disponível para download.
Como vamos monta um mapa, é preciso fazer referência à API de Mapa do Google, linha 8. O parâmetro sensor=false indica que não estou usando a API a partir de aplicação com sensor, como um GPS de um Smartphone por exemplo:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
É preciso criar as funções javascript para ordenar os acontecimentos, que são 3: Recuperação da localização, Montagem do mapa e tratamento de erros.
Primeiro criamos a que recupera a localização. Ela verifica se o Navegador suporta Geolocalização e em caso positivo segue para a montagem do mapa:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Depois, criamos a função que monta o mapa. Ela recebe os parâmetros de latitude e longitude do resultado da função que recupera a Geolocalização.
O objeto retornado, o position, tem as propriedades latitude e longitude, dentro de coords. Para a API de mapa do Google, precisamos apenas dessas duas informações:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
No uso da API, podemos configurar opções, como altura (height), largura (width), tipo de mapa (MapTypeId) e etc. Para conhecer mais sobre esta API, o ideal é acessar a documentação completa on-line em https://developers.google.com/maps/documentation/javascript/.
Acima foi a função de sucesso. Abaixo a função de erro (quando não o navegador não suporta Geolocation):
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mensagens.innerHTML = "A permissão para buscar Geolocalização foi negada pelo navegador.<br /><br />Tente gerenciar as configurações de compartilhar local."
break;
case error.POSITION_UNAVAILABLE:
mensagens.innerHTML = "Sua localização está indisponível."
break;
case error.TIMEOUT:
mensagens.innerHTML = "A busca pela sua localização excedeu o tempo limite."
break;
case error.UNKNOWN_ERROR:
mensagens.innerHTML = "Ocorreu um erro desconhecido."
É preciso também preparar os elementos que receberão as mensagens de sucesso ou erro e uma <div> que receberá o mapa da API do google. Veja o exemplo das mensagens:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Concluídos estes passos, basta chamar a função que recupera a Geolocalização, no caso a recuperaGeolocalizacao(). Pode ser no onclick de um botão ou no onload da página dentro da tag <body> , como no exemplo a seguir. A própria função se encarregará de montar o mapa ou mostrar o erro, a depender do resultado.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
É muito comum precisar recortar imagens no photoshop. É muito comum também para os que não são especialista - como no meu caso - saber qual o melhor método para conseguir a melhor qualidade.
Vou deixar hoje uma dica de usar demarcadores no photoshop, ao invés de ferramentas de seleção.
Temos a imagem abaixo e queremos tirar dela o fundo branco para, por exemplo, fazer um .png com fundo transparente:
Umas das estratégias seria usar a ferramenta varinha mágica e clicar no espaço branco, conforme as imagens abaixo:
Com controle de tolerância, suavização de serrilhado e ajustes manuais com as ferramentas laços, podemos até ter bons resultados, mas tem outro jeito: utilizar a ferramenta caneta para marcar as áreas de corte do fundo da imagem:
Com a ferramenta caneta escolhida, clicamos ponto a ponto e marcamos as áreas de corte do fundo da imagem.
Note que a própria ferramenta tenta ajudar na criação das marcações, a partir do segundo clique, já traçando curvas automaticamente, o que muitas vezes acaba atrapalhando. Neste caso é preciso (no primeiro clique) cortar a ação automática dele, clicando em cima do segundo ponto com a tecla ALT pressionada:
Após terminar a marcação conforme desejado, termos o seguinte:
O marcador fica na aba Demarcadores e para utilizá-lo como seleção e recortar a imagem basta: 1º Selecionar camada da imagem; 2º Clicar no demarcardor segurando a tecla Control; 3º Inverter a seleção Ctrl + Shit + I e deletar.
Os resultados são as possibilidades de sobrepor imagens com recortes mais bem apurados: