Postagens

Mostrando postagens com o rótulo Truques

GIT - Guardando temporariamente as modificações de um repositório sem commit usando stash

Imagem
Muitas vezes, enquanto estamos trabalhando em um branch, chega um pedido de bugfix ou precisamos executar alguma operação como mudar de um branch para outro. O que fazemos com as modificações que já haviamos feito? Criamos um novo commit só para guardar o trabalho já feito mas não concluído? Isso pode poluir nossa cadeia de commit. Desfazer todo o trabalho já feito está fora de cogitação. Então o que fazer quando precisamos limpar temporariamente nosso branch de trabalho? A resposta é o comando stash ! Abaixo seguem alguns dos comandos básicos: Limpando temporariamente o stage das modificações para poder dar checkout para outro branch sem precisar fazer commit nada. $ git stash Lista o que está no temporário (stash) $ git stash list Para recuperar o último stash e manter todos os stashes anteriores $ git stash apply Para recuperar o último stash e remove-lo da pilha $ git stash pop Para limpar a pilha de stash (no caso em que você esteja utilizando ...

MySQL - Gerando .csv a partir de uma Query pelo Shell

Imagem
Dependendo da complexidade de suas queries será muito difícil exportar dados através de IDEs como o MySQL workbench por exemplo. "Perda de conexão" é um dos erros mais comuns. Conectar via Shell no MySQL pode ser uma opção porém exportar arquivos para uma pasta de trabalho pode resultar em erros de permissão de acesso e etc. Para evitar estes problemas é possível utilizar um truque muito simples: utilizar diretamente o Shell para chamar o MySQL juntamente com um parâmetro -e a querie desejada e na sequência redirecionar o resultado da querie para sua pasta de trabalho. Segue um exemplo simples abaixo: mysql -uuser -p -e "SELECT * FROM database.tabela_1 FIELDS ENCLOSED BY '\"' TERMINATED BY ';' ESCAPED BY '\"' LINES TERMINATED BY '\r\n'" > /home/minha_pasta/tabela_1.csv É possível fazer a querie sem os parâmetros de formatação FIELDS. A saída será um arquivo texto com padrão de separação por TABS. m...

PHP - Modificando métodos através da extensão de classes

Imagem
Extensão de classes é uma ótima maneira de organizar e reaproveitar código, tornando a aplicação mais clara e de manutenção mais simples. Vamos mostrar aqui um exemplo muito simples de extensão de classe utilizando os mesmos nomes de método. Isso pode ser muito útil, por exemplo, quando temos uma chamada de método em várias partes do código e precisamos mudar alguma coisa neste método porém não queremos mexer diretamente nele. Vamos supor que o método statement()  dentro da classe Main é chamado em trinta pontos de sua aplicação e você precisa alterar a saída dele. main.class.php <?php Class Main { public function statement() { return "Classe 'Main'"; } } index.php <?php include "main.class.php"; $new = New Main(); echo $new->statement(); echo "\n"; Uma opção seria alterar o método mas você não quer mexer diretamente nel...

Linux / Shell Script - Repetindo um comando no terminal a cada X intervalos de tempo

Imagem
Muitas vezes precisamos monitorar o funcionamento de aplicações que precisam pegar dados em web services, APIs, gerar arquivos de tempos em tempos, logs e etc. O comportamento das aplicações podem variar muito conforme o tipo de dados que recebemos e processamos, principalmente quando não temos o controle completo do dado que chega. Um bom meio para fazer isso é deixar sua aplicação rodando por algum tempo sozinha, coisa que seria muito chata de fazer manualmente. O Shell do Linux nos permite fazer facilmente um timer para rodar nossa aplicação, por exemplo, a cada 20 minutos. No final do dia podemos ver os logs, arquivos gerados ou as atualizações em um banco de dados de testes para verificar se o comportamento foi o esperado. O comando Shell é o que segue abaixo: while true; do <your_command>; sleep <interval_in_seconds>; done Vamos supor que queremos rodar uma aplicação NodeJs a cada 20 minutos. Para isso vamos na pasta em que se encontra nossa apl...

MySQL - Como fazer múltiplos updates com uma única query

Imagem
Vamos supor que temos uma tabela chamada parameters com os campos param , value , type e description : +-------------+------------------------+------+-------------------------------------+ | param | value | type | description | +-------------+------------------------+------+-------------------------------------+ | EXPERIMENTO | 1504037801122 | int | ID do experimento atual | | CONFIG | {"idPublication":"10"} | str | Configurações de treinamento atuais | +-------------+------------------------+------+-------------------------------------+ Supondo que precisamos atualizar apenas o campo value das duas linhas acima com updates, como seria o processo "sem pensar muito"? Bom, seria simplesmente utilizar duas queries UPDATE, correto? UPDATE parameters SET value = '174305845' WHERE param = 'EXPERIMENTO' UPDATE parameters SET value = ...

Usando o EditorConfig para padronizar a formatação de seu projeto

Imagem
Uma das coisas que mais incomodam desenvolvedores profissionais é a formatação e padronização de código, principalmente em situações que vários membros de um time trabalham em um mesmo código ou aplicação. O EditorConfig ajuda a resolver uma parte deste problema mantendo a consistência na formatação do código, tanto entre diferentes desenvolvedores quanto entre os diversos IDEs. O projeto EditorConfig consiste em um arquivo contendo as definições de formatação que são aplicadas automaticamente na IDE que você está usando . Para que o EditorConfig funcione você precisa criar um arquivo chamado .editorconfig com as definições de formatação apropriadas dentro da pasta de seu projeto (na raiz por exemplo). Ao abrir o projeto através de sua IDE preferida o PlugIn procurará nas pastas pelo arquivo até encontrá-lo. Cada IDE tem um procedimento próprio de instalação do PlugIn. Como exemplo segue o passo a passo para instalar o EditorConfig no Sublime Text. Vá no menu 'Prefere...

MySQL - Clonando tabelas na linha de comando

Clonar tabelas é fácil se você tiver a disposição um ' PHP MyAdmin ' ou uma aplicação gráfica instalada em sua máquina. Porém existem casos em que você só possui acesso a um shell (ou terminal) ou mesmo precisa criar uma aplicação que em algum momento seja necessária a clonagem de uma tabela. Os procedimento é muito simples: 1º Criar um clone da estrutura original (LIKE banco_de_dados.tabela) CREATE TABLE recipes_new LIKE production.recipes; 2º Inserir o conteúdo original dentro do clonado (FROM banco_de_dados.tabela) INSERT recipes_new SELECT * FROM production.recipes; É simples assim! Abraços

PHP - phpinfo diretamente na linha de comando

Imagem
É procedimento mais que conhecido e adotado criar um arquivo (phpinfo.php) para visualizar as propriedades da instalação do PHP em determinada máquina. <?php echo phpinfo(); Mas é posssível obter esta mesma informação diretamente pelo terminal, através do shell $ php -i O problema aqui é que será exibida uma lista corrida na tela com todas as propriedades, funções e etc. Podemos resolver o problema redirecionando a saída para um arquivo, através de um pipe: $ php -i | cat > phpinfo.txt Uma maneira mais prática é consultar diretamente o pacote que se deseja descobrir se está instalado ou não. Para isto podemos usar o comando abaixo: $ php -i | grep -i <pacote_a_ser_verificado> Vamos descobrir se o Curl está instalado: $ php -i | grep -i curl A resposta é: Fácil e rápido!

Linux - Quebrando grandes arquivos texto em blocos menores com SPLIT

Para dividir um arquivo de texto muito grande em pedaços menores basta o seguinte comando: split -b <tamanho_dos_blocos> <nome_do_arquivo_original> Exemplo: split -b 50MB lista_de_telefones.txt Quebrará um arquivo de, por exemplo, 150MB em três de 50MB com nomes padrão (como por exemplo XAA, XAB, XAC)

MySQL - Adicionando zeros em um campo para obter tamanho fixo com LPAD() e RPAD()

Existem casos em que uma consulta no MySQL deve retornar um número fixo de caracteres. O código de cidade do TSE (Tribunal Superior Eleitoral), por exemplo, deve sempre retornar 5 caracteres, mesmo que algumas cidades possuam apenas dois (como Porto Velho - Rondônia) Para estes casos podemos retornar diretamente do MySQL o campo formatado utilizando LPAD() SELECT LPAD(35, 5, '0') AS cod_tse O retorno será: cod_tse 00035 RPAD() faz o mesmo só que colocando os caracteres de preenchimento do lado direito. Podemos usar LPAD() e RPAD() com qualquer caractere de preechimento, como no exemplo abaixo: SELECT RPAD('ATENÇÃO', 13, ' <=') AS Warning Resulta em: Warning ATENÇÃO <= <= Por hoje é isso!

PHP - Corrigindo o erro 'Allowed memory size exhausted'

Um erro que pode ocorrer em scripts que consomem muito recurso de memória é o: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8759191 bytes) Este tipo de erro pode ser remediado colocando a seguinte linha no topo de seu script: Ini_set( “memory_limit”, -1 )

PHP - Criando uma Array de objetos igual ao retorno de uma consulta PDO

Você pode criar uma array de objetos como aquela retornada através do PHP PDO quando realiza uma consulta a um banco de dados. A sintaxe não tem segredos. É como 'tipar' uma variável com (String), (Int), (Float) etc. $object_array = Array( (object) Array( 'codMunicipio' => '09210', 'uf' => 'MA' ), (object) Array( 'codMunicipio' => '12190', 'uf' => 'PI' ), (object) Array( 'codMunicipio' => '71072', 'uf' => 'SP' ) ); Se você printar a array com 'var_dump()' obterá a seguinte...

CSS - Problemas de performance ao montar layouts

Como saber se uma propriedade CSS causará problemas de desempenho? O site  http://csstriggers.com/ dá todas as informações importantes para que você tome a melhor decisão para montar o layout de seu projeto web.

Segurança e gerenciamento de erros no PHP - como melhorar seu código com set_error_handler e error_log

Imagem
Existe uma linha de pensamento na comunidade de desenvolvedores que recomenda que para dar maior segurança a um sistema, e assim evitar ataques, deve-se fornecer a menor quantidade possível de informações sobre o mesmo. Pegando esta ideia como padrão para nossos projetos uma das coisas que podem dar informação valiosa para crackers são as mensagens de erro na execução do sistema.  Mensagens de erro deveriam ser vistas apenas pelos desenvolvedores, não pelos usuários Tais mensagens podem informar, por exemplo, caminhos de arquivos e estrutura de diretórios desprotegidos, senhas de acesso a banco de dados e versões de software que podem ser utilizadas como base para busca de brechas de segurança. Assim não exibir tais erros é fundamental para manter o sistema o mais protegido possível, além de dar uma cara mais profissional ao projeto, afinal é bem feio seu usuário final ver uma mensagem dizendo que o sistema apresentou erro. Porém devemos lembrar também que para os des...

MySQL - Cálculo de período de tempo entre duas datas com TIMESTAMPDIFF

Imagem
Muitas vezes precisamos saber quantos dias se passaram desde que um dado registro entrou no banco de dados ou outros cálculos com datas e horas que precisemos agrupar em dias, meses, horas e etc. Este tipo de informação geralmente é útil nos processos de limpeza e backup de dados mas também em outras situações como a exibição de dados para um usuário. Geralmente este procedimento é delegado ao software que lê o banco de dados e realiza as operações necessárias, seja para backup, limpeza ou exibição de dados. Porém o MySQL possui uma função interessante para efetuar este tipo de procedimento diretamente na query do banco de dados, o que é mais natural já que se trata de um dado. A função TIMESTAMPDIFF() do MySQL calcula o tempo decorrido entre duas datas que pode ser em dias, meses, minutos e etc. A lista completa segue abaixo: FRAC_SECOND (microsegundos), SECOND (segundos), MINUTE (minuto), HOUR (hora), DAY (dia), WEEK (semana), MONTH (mês), QUARTER (trimestre),...

MySQL - Dump de banco de dados sem a estrutura de tabelas

É com certeza uma das práticas mais comuns entre os profissionais que trabalham com banco de dados o backup ou restore de dados. Para isso é muito comum o uso do mysqldump . Em sua configuração padrão o mysqldump , além de copiar os dados da banco também copia toda a estrutura de tabelas e índices. $ mysqldump -uusername -psenha database > /diretorio/backup.sql Porém existem algumas situaçães em que o Dump de uma tabela ou banco não serve apenas para backup. Uma delas, por exemplo, é quando precisamos recriar algum índice novo para a tabela, a fim de melhorar o desempenho. Quem já trabalhou com índices saberá de antemão que lidar com eles em tabelas com milhões de registros, atualizando, trocando, deletando ou criando é um verdadeiro inferno, já que muitas vezes o processo leva horas, quando não dias. Eu mesmo, certa vez, tive que deletar um indice de uma tabela com alguns milhões de registros e me arrependi brutalmente pois levaram 'apenas' 8 horas para o process...

MySQL - Gerando arquivos .csv com cabeçalho e acentuação diretamente de uma query no banco de dados

Já tratamos anteriormente de como gerar um arquivo a partir de uma consulta no MySQL porém não falamos especificamente de arquivos .CSV (aqueles separados por ponto e vírgula e que são reconhecidos diretamente pelos editores de planilha) Além disso não tratamos também de como inserir um cabeçalho com os nomes dos campos e nem como esta saída ser gerada diretamente com acentuação, importante para nós que trabalhamos com o português. Vamos começar com nosso exemplo padrão Para DOS SELECT * INTO OUTFILE 'C:/diretorio/arquivo.txt' FROM tabela Para Linux SELECT * INTO OUTFILE '/diretorio/arquivo.txt' FROM tabela As queries acima geram arquivos com acentuação no padrão UTF8, fora do padrão .csv e sem cabeçalho. Vamos transformar as queries acima para que a saída esteja no padrão .csv SELECT * FROM tabela INTO OUTFILE 'C:/diretorio/arquivo.csv' FIELDS ENCLOSED BY '"' TERMINATED BY ';' ESCAPED BY '"' LIN...

Linux - Utilizando o comando DIFF para comparar diferenças entre arquivos em diferentes pastas

Um comando do Shell Linux muito interessante e útil é o 'diff'. Utilizo ele tanto para verificar as diferenças entre arquivos gerados por um sistema em que fiz alguma atualização quanto para verificar diferenças no código entre versões de arquivos de aplicações. Sua utilização é muito simples: $ diff /diretorio1 /diretorio2 | cat > /diretoriodesaida/diferencas.txt Explicando o comando acima: 'diff' verifica a diferença entre os arquivos nas pastas 'diretorio1' e 'diretorio2', inclusive diferenças dentro dos arquivos. '| cat > /diretoriodesaida/diferencas.txt' direciona a saída padrão da tela para um arquivo, ou seja, os resultados da análise poderão ser checados no arquivo 'diferencas.txt' Dentro do arquivo gerado 'diferencas.txt' estão indicados todos os trechos que foram modificados entre dois arquivos de mesmo nome ou as diferenças entre quantidades de arquivos.

Javascript - Comportamentos diferentes para incremento de valores com ++ antes e depois da variável

Hoje vamos tratar de algo que aparentemente é muito bobo mas que na verdade não o é e costuma trazer grandes problemas quando utilizado de maneira errada: o incremento em variáveis. O incremento está presente em inúmeras linguagens de programação. Os exemplos que apresentarei aqui são baseados em Javascript , porém eles são válidos também para PHP e outros. Acredito que todos sabem que para incrementar ou decrementar (adicionar ou subtrair) uma unidade a uma variável, ao invés de fazer isso: $a = $a + 1 Podemos fazer isso: $a++ ou isso: ++$a Bem, acredito que todos sabem deste truque, mesmo porque é a primeira coisa que aprendemos quando iniciamos na arte de programar, porém você sabe qual a diferença entre ambos? Vamos rodar um javascript bem simples para exemplificar o que acontece: $a = 0; $b = 0; $a++; ++$b; console.log($a); console.log($b); É provável que você obtenha como resultado: 1 1 Bem, até ai parece que não existem diferenças, correto? Inic...

PHP - Pulando linhas do resultado de uma Query com mysql_data_seek()

mysql_data_seek() move o ponteiro interno do resultado de uma Query MySQL para o número da linha especificada. A próxima chamada de uma função, por exemplo mysql_fetch_assoc (), irá retornar esta linha. mysql_data_seek()  é muito útil quando se quer trabalhar com paginações, por exemplo. Vamos a um exemplo simples, sem o uso do  mysql_data_seek() , onde uma tabela simples com ID e nome é consultada. <?php include "db.php"; $result = mysql_query("SELECT * FROM ident"); while ($row = mysql_fetch_array($result))  { echo "ID: {$row['id']}, Nome: {$row['nome']} <br/>"; } O Resultado é: ID: 1, Nome: Daniel ID: 2, Nome: Salete ID: 3, Nome: Veronica ID: 4, Nome: Mona ID: 5, Nome: Zilda ID: 6, Nome: Ofelia ID: 7, Nome: Patricia Agora vamos utilizar  mysql_data_seek() . Vamos pular o resultado da consulta da linha 0 para a linha 5 e repetir o loop: <?php include "db.php"; $result =...