MySQL Restaurar um Arquivo de Backup exportado pelo MySQLDump

mysql -u <my-user> -p <dbname-wanted-to-restore> < file-data-dump.sql
(password will be asked later)

Esse aqui parece simples, só que é muito fácil de esquecer quando não se usa com frequência.

Acontece que o comando para realizar a exportação de dados do MySQL é bem intuitivo, se chama mysqldump.

Só que para restaurar não tem um mysqlrestore não, o que se usa é o mesmo comando local mysql client. E é um saco ter que lembrar disso ou então ter que pesquisar nos longos sites tutoriais ou manuais técnicos.

Agora taí… mysqldump para exportar e mysql para restaurar.

PHP strtok Recortando Strings Delimitadas por Caracter

$email = 'user.name@mocked.mail';
$user = strtok($email,'@');
var_dump($user); //user.name

$domain = strtok('');
var_dump($domain); //mocked.mail

Há algum tempo atrás trabalhei em um projeto que lidava com importação de dados e a sanitização era um processo imprescindível. Então me deparei com um comando muito curioso que eu não conhecia até então, o strtok.

Na sanitização de email é bastante factível subdividir a string principal em usuário e domínio, então ao invés de recorrer ao tradicional explode eu parti em busca de um novo recurso, algo mais prático.

Apliquei este comando especialmente em testes unitários combinados com o recurso DataProvider.

Veja como é simples conseguir o primeiro nome e sobrenome em dois hits apenas.

$email = 'first-name.last-name@mocked.mail';
$first = strtok(strtok($email,'@'),'.');
var_dump($first); //first-name

$last = strtok('');
var_dump($last); //last-name

Entenda como strtok realmente funciona. Ao informar o caracter delimitador a tokenização é buferizada e o primeiro elemento é disponibilizado e o restante da string permanece no buffer, mas sem ter sido particionada.

$csv = 'column1;column2;column3;column4;column5';
$first = strtok($csv, ';');
var_dump($first); //column1

$remainder = strtok('');
var_dump($remainder); //column2;column3;column4;column5

Para alcançar todos os elementos na cadeia é necessário ir particionando o conteúdo restante que se encontra no buffer, para isto basta informar apenas o delimitador na tokenização. Observe o código abaixo que demonstra um loop até que o retorno seja (bool)FALSE indicando que não existem mais elementos no buffer;

$csv = 'column1;column2;column3;column4;column5';
$token = strtok($csv, ';');

while ($token !== false) {
  echo $token."\n";
  $token = strtok(';');
}

Observe também que você pode utilizar múltiplos delimitadores no processamento e não há uma ordem que precise ser respeitada. A cada ciclo, ao encontrar qualquer um dos caracteres delimitadores o primeiro elemento é imediatamente retornado e o restante permanece no buffer até que ocorra o exaurimento completo do buffer.

$csv = 'column1;column2-column3|column4/column5';
$token = strtok($csv, '|-/;');

while ($token !== false) {
  echo $token."\n";
  $token = strtok('-|;/');
}

Agora você já sabe, precisou quebrar uma string?

Vai de strtok!

SHELL wget Download de Arquivo via Linha de Comando

# baixar com o nome padrão phpunit-9.phar
wget https://phar.phpunit.de/phpunit-9.phar

# baixar e renomear para o nome phpunit
wget -O phpunit https://phar.phpunit.de/phpunit-9.phar

# qualquer endereço http pode ser o alvo para download
wget -O my-project https://mega.nz/file/<mega-nz-download-hash-with-password-embedded>

Parece básico, mas fazer o download de arquivos da internet sem usar um navegador pode ser uma tarefa árdua e desconhecida para a maioria dos usuários da internet.

Porém para desenvolvedores web, engenheiros de software e profissionais de tecnologia da informação dominar essa habilidade deve ser primordial.

O pacote wget é extremamente simples e versátil, pelo menos o seu uso básico não apresenta nenhuma dificuldade como podemos evidenciar acima. Para ambientes Linux ele já vem previamente instalado, ou se necessário pode ser facilmente instalado pelos gerenciadores de pacote.

sudo apt install wget -y      [On Debian, Ubuntu and Mint]
sudo yum install wget -y      [On RHEL/CentOS/Fedora]
sudo emerge -a net-misc/wget  [On Gentoo Linux]
sudo pacman -Sy wget          [On Arch Linux]
sudo zypper install wget      [On OpenSUSE] 

Para usuários MacOS o recurso pode ser instalado pelo gerenciador de pacotes brew.

brew install wget

Ou então, se o seu caso de uso é realmente básico você pode optar pelo uso do CURL, que vai funcionar mesmo no OSX nativamente.

# baixar com o nome padrão phpunit-9.phar
curl -O https://phar.phpunit.de/phpunit-9.phar

# baixar e renomear para o nome phpunit
curl https://phar.phpunit.de/phpunit-9.phar -o phpunit

O wget possui muitas outras funcionalidades mais avançadas, mas a ideia aqui é demonstrar o caso de uso simples mesmo.

Agora você já sabe, baixaki nunca mais!

SHELL Copiando e Colando no Terminal com pbcopy e pbpaste

# copiar conteúdo do arquivo para a memória clipboard
cat linefeed.sql | pbcopy

# colar conteúdo da memória clipboard no terminal
pbpaste

Para quem usa a interface SHELL é bastante corriqueiro tratar e sanitizar dados utilizando uma sequência de comandos e no final ecoar o resultado no próprio terminal.

Mas e daí? Como fazer para transferir estes dados para outro aplicativo?

O mais usual é selecionar os dados como próprio mouse no terminal caracter e pressionar Ctrl+C e posteriormente Ctrl+V no aplicativo destino.

Mas essa operação pode ser cansativa ou mesmo inviável quando estamos falando de um grande volume de dados.

Mas so seus problemas acabaram, agora com pbcopy e pbpaste você não vai mais cometer erros.

Só que estes comandos são originários do mundo OSX. Quem usa ambiente Linux precisa usar o comando xsel ou então simular os comandos Mac via alias.

alias pbcopy=’xsel — clipboard — input’
alias pbpaste=’xsel — clipboard — output’

Pronto, agora você pode usar os mesmos comandos do Mac no seu ambiente Linux.

A propósito, depois de muito pesquisar entendi que o prefixo pb remete a Pasteboard Buffer. É o mesmo que conhecemos no mundo Windows por Clipboard.

Fez sentido agora? Pra mim também…

Trello Atalho para Localizar Cards Rapidamente via Navegador Chrome

CHROME > Settings > Search Engine > Manage search engines and site search > Site search > Add > Add search engine

O Trello é amplamente conhecido pela sua versatilidade tanto na forma liberal de utilização dos cartões quanto na formação de URI dos painéis e cartões do KANBAN.

Com um simples HASH e uma URL específica é possível localizar um cartão ou um painel simplesmente digitando na barra de endereço do navegador, porém esta tarefa repetitiva de digitar a URL pode se tornar rapidamente cansativa.

É aí que entra este recurso do Google Chrome onde usar a barra de endereço do navegador como Search Engine pode ser customizada.

Depois da configuração acima ser efetivada, vá para o navegador Chrome e na barra de endereço basta digitar t <espaço> e em seguida o HASH do seu cartão <enter>

Para quem precisa de orientação mais detalhada segue abaixo a sequência de images para encontrar o caminho da configuração.

Agora é só curtir!

Stream Editor sed Substituir texto \n por Quebra de Linha via Linha de Comando

#linux
sed -i 's/\\n/\n/g' linefeed.sql

#macOS
sed -i '' 's/\\n/\n/g' linefeed.sql

Hoje novamente me deparei com um bloco de texto de linha única, ou seja as quebras de linha foram geradas como string texto \n e não como o caracter linefeed ou carriage return como eu esperava.

Bom, não importa, isso acontece eventualmente então fazer a substituição manual via comando sed é a forma mais rápida de alcançar este objetivo.

Explicando rapidamente o comandos acima…

sed é o acrônimo para Stream Editor

-i significa in place, ou seja, vai alterar o próprio arquivo de entrada

's/\\n/\n/g' é um regex pattern, s para substituir, \\n conteúdo a ser substituído, \n conteúdo a ser aplicado, g troca global ou múltiplas ocorrências.

As barras / funcionam apenas como delimitadores do regex pattern.

linefeed.txt é o nome do arquivo de entrada, ou seja o nosso arquivo alvo 

Observe que no ambiente MacOS temos uma ligeira diferença onde um parâmetro adicional surge antes do regex pattern. Deu muiiiiiiito trabalho pra descobrir isso!

Criando o arquivo com o conteúdo necessário para simular o problema.

echo 'CREATE TABLE usuario (\\n id BIGINT(20) NOT NULL AUTO_INCREMENT,\\n nome VARCHAR(255) NOT NULL,\\n login VARCHAR(50) NOT NULL,\\n email VARCHAR(255) NOT NULL,\\n senha VARCHAR(50) NOT NULL,\\n telefone_fixo VARCHAR(50) DEFAULT NULL,\\n telefone_celular VARCHAR(50) DEFAULT NULL,\\n timezone VARCHAR(100) DEFAULT NULL,\\n ativo TINYINT(3) UNSIGNED NOT NULL,\\n created_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6),\\n updated_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),\\n PRIMARY KEY (id),\\n UNIQUE KEY ixu_login (login),\\n KEY idx_usuario_created_at (created_at),\\n KEY idx_usuario_updated_at (updated_at)\\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;' > linefeed.sql

Listando e conferindo que temos apenas uma única linha no arquivo.

cat linefeed.sql

Para os amantes do editor vi podemos fazer essa mesma substituição com a seguinte sequência de comandos.

vi linefeed.sql
:1,$ s/\\n/\r/g <enter>
:wq

Observe que neste comando o conteúdo a ser aplicado deve ser \r e não \n

É claro que você poderia se livrar de toda essa parafernália de comandos e simplesmente utilizar um editor de textos que tenha um suporte esperto, como Notepad++ ou VsCode, e simplesmente Localizar e Substituir strings por LF CR.

Mas fica aqui a minha pergunta. Por que você iria querer isto?

Thanks for watching!!!

MySQL Montar Script SQL CREATE TABLE a partir de uma Tabela Existente

SHOW CREATE TABLE usuario;

Eu sempre costumo escrever meus scripts SQL para criação de tabelas a partir do zero, normalmente utilizando alguma ferramenta de diagramação como DBDesigner por exemplo.

Mas trabalhando em um projeto recente minha tarefa era transferir algumas tabelas de um determinado banco de dados para outro, assim o SCHEMA a ser criado deveria ser exatamente o mesmo incluíndo os índices para evitar qualquer tipo de impacto na aplicação.

Ai que medo de digitar errado!!!

Pesquisando rapidamente encontrei artigos orientando o uso de um comando específico pra isso. Em um só comando o script para criação do SCHEMA sem dados incluíndo chaves primárias, chaves estrangeiras, chaves únicas e índices, e ainda atributos de CHARTSET e outros penduricalhos.

É claro que você consegue chegar ao mesmo resultado por outros meios como utilizando o MYSQLDUMP sem dados de uma única tabela, mas este comando aqui já faz tudo isso sem maiores complicações.

Enjoy Your Day!