MySQL Show e Describe para inspecionar informações de tabelas

# present very basic information, but not custom indexes
DESCRIBE payments;

# basically the same as describe
SHOW COLUMNS FROM payments;
SHOW COLUMNS FROM production.payments;
SHOW COLUMNS FROM payments IN production;

# a more detailed information
SHOW FULL COLUMNS FROM payments;

# wanna see custom indexes?
SHOW INDEX FROM payments;
SHOW INDEX FROM payments FROM production;
SHOW INDEX FROM production.payments;

Sempre que eu quero inspecionar os detalhes de informações de uma tabela no MySQL eu somente consigo me lembrar do comando DESCRIBE, ou nem isso!

O Fato é que o MySQL fornece alguns recursos básicos mas muito eficientes para obter estas informações de forma simples e rápida.

Se você é developer certamente vai precisar de alguns destes recursos listados aí…

Os Databases Scientists e Database Administrators podem querer recorrer a recursos mais avançados como SELECT sobre as tabelas de SCHEMAS, mas isso é assunto para outro artigo.

Happy SQL!

GIT Configurando sua Identidade

git config --global user.email "myemail@gmail.com"
git config --global user.name "My Full Name"

Logo depois que instalamos o GIT no sistema operacional a primeira coisa que queremos fazer é o primeiro commit e push, não é mesmo?!

Pois é, só que tem este detalhe de que antes precisamos configurar nossa identidade no ambiente, para que o mínimo de segurança e organização necessária seja alcançada.

É claro que o GIT vai te fornecer um comentário indicando que esta configuração é necessária! Se for tentar o commit sem esta config ele vai berrar.

Na dúvida fica aí mais esta dica.

Linux Type e Which Para Localizar Path de Comandos e Executáveis

type -a bash
type -a zsh
type -a git
type -a asdf

which bash
which zsh
which git

Olha só que legal! Em algumas situações precisamos descobri o PATH de alguns comandos, pacotes ou programas instalados no seu sistema operacional.

Antigamente eu costumava fazer isso com o locate ou find, mas o resultado nem sempre era fácil de obter com estes dois recursos.

Recentemente eu estava configurando vários pacotes no meu Arch Linux Desktop e tive que encontrar o path de um aplicativo para poder configurar corretamente. Foi aí que me deparei com estes dois recursos mais modernos e mais fáceis de usar.

O type funcionou perfeitamente com os vários pacotes incluindo o asdf. Já o which falhou com o asdf não sei exatamente o porquê.

Na dúvida, vai de type… mas o which também manda bem pra caramba!

PHP array_filter Verificando se Conteúdo Possui Suporte ao array_flip

static function hasArrayFlipSupport(array $array): bool {
   return empty(
      array_filter(
         $array,
         static function ($value, $key) {
            return (!is_string($value) && !is_int($value)) || (!is_string($key) && !is_int($key));
         },
         ARRAY_FILTER_USE_BOTH
      )
   );
}

Recentemente estive trabalhando (e ainda estou) num projeto de importação de arquivos de dados, uma rotina bastante comum ainda nos dias de hoje apesar de toda a evolução tecnológica que temos vivido.

Pois bem, com a elaboração de classes mais genéricas que devem processar uma variedade quase infinita de possibilidades as coisas se complicam um pouco e precisam de mais rotinas de garantia de funcionalidade.

No meu caso, em um dado momento o uso do array_flip se mostrou ideal, só precisava inverter o array tornando as valores como chaves e as chaves como valores… simples né? Só que não.

O array_flip somente suporta a operação utilizando dados do tipo STRING e INT, e essa regra vale para a dupla chave/valor do array. Lembrando que NULL também não é suportado para a operação.

Então eu elaborei este método para verificar se o conteúdo do array suportaria o array_flip. Basicamente verifica-se o conteúdo de todo o array, ambos chave e valor, se eles possuem os tipos de dados suportados.

E foi neste momento que o array_filter se mostrou parrudo e eficiente. Por padrão o array_filter avalia apenas o valor do elemento.

array_filter($array, static function($value) { return true; });

Mas você consegue facilmente mudar este comportamento para avaliar a chave simplesmente adicionando o terceiro parâmetro ARRAY_FILTER_USE_KEY.

array_filter($array, static function($key) { return true; }, ARRAY_FILTER_USE_KEY);

Mas no meu caso eu precisei mesmo avaliar ambos simultaneamente, assim o trunfo final foi informar o terceiro parâmetro ARRY_FILTER_USE_BOTH.

array_filter($array, static function($value, $key) { return true; }, ARRAY_FILTER_USE_BOTH);

Observe que, ao acionarmos o uso de ambos chave e valor, a sequência de de entrada da dupla chave/valor ocorre na ordem inversa valor/chave. Eu não tenho detalhes para explicar este comportamento, mas acredito que seja para manter uma certa compatibilidade com o uso padrão do array_filter, o qual filtra o valor por padrão.

Alguns irão dizer que estas características são sinais de ausência de padronização e arquitetura no PHP, mas para mim esse é o tremendo charme da linguagem!

World Class Technology S2 PHP!

ASDF Atualizando versões específicas do Elixir e ERLang

# install asdf plugins for desired packages
asdf plugin-add erlang
asdf plugin-add elixir

# see plugins installed
asdf list

# see current versions already set
asdf current

# install desired versions for each pack
asdf install erlang 24.0.2
asdf install elixir 1.12.1

# now you see installed versions
asdf list

# set desired version as global setting
asdf global erlang 24.0.2
asdf global elixir 1.12.1

# check again the versions installed
asdf list
asdf current

# in my case I needed to run a more specific command, but this was also suggested by asdf when listing
asdf install elixir 1.12.1-otp-24

# done! checking final installation
asdf list
asdf current

Aqui um passo a passo de atualização dos pacotes Elixir e ERLang para versões específicas desejadas. no meu caso eu estava trabalhando num app onde as versões de cada pacote eram requerimentos para o projeto.

Como eu tinha realizado uma instalação inicial com brew, eu preferi fazer a remoção das versões mais recentes, utilizei os seguintes comandos.

brew cleanup -n
brew uninstall elixir --force
brew uninstall erlang --force

Lembrando que o Elixir depende do ERLang, então remova eles na sequência correta, caso contrário o sistema vai berrar por conflito de dependências.

No final bastou carregar as dependências do projeto e pronto…

# starts elixir console 
iex -S mix 
CTRL + C 

# needed to load dependencies 
iex -S mix get.deps 
CTRL + C 

# finally loading the app environment 
ies -S mix 

Uma dica! Observe sempre os comentários deixados no terminal durante a instalação do packs ou plugins, as vezes algo não funciona de primeira por que não observamos os detalhes nas entrelinhas!

ASDF O Gerenciador de Pacotes com Controle de Versões

# make sure your brew is fully updated
brew update
brew upgrade

# install asdf pack manager using brew of course
brew install asdf

# see lastest comments after installation, asdf path will be shown over there
# asdf path may vary depending on your environment

# add asdf path to your shell environment, this is for .zsh
echo -e '\n. /usr/local/opt/asdf/libexec/asdf.sh' >> ~/.zshrc
echo -e '\n. /usr/local/share/zsh/site-functions/_asdf' >> ~/.zshrc

# add path to your shell environment, this is for .bash
echo -e '\n. /usr/local/opt/asdf/libexec/asdf.sh' >> ~/.bash_profile
echo -e '\n. /usr/local/share/zsh/site-functions/_asdf' >> ~/.bash_profile

# reload your shell environment or open a new terminal, your shell will be loaded correctly
source ~/.zshrc
source ~/.bash_profile

# that's it, now check asdf version installed
asdf --version

# check plugins installed, this command will show data after plugins installation
asdf list

# check current packages installed, this command will show data after setting a pack version
asdf current

Esta semana eu precisei atualizar alguns pacotes no meu MacBook, mas desta vez houve um requisito de utilizar uma versão específica do Elixir e ERLang. Foi aí que descobri que o amplamente difundido “brew” não suportava um gerenciamento de versões eficiente, praticamente o brew instala a “latest version” dos pacotes e pronto.

Percorri muitos artigos na web onde a maioria deles indicava o uso do “asdf” para um gerenciamento efetivo de versões. ASDF? What the hack is that?

Para quem, assim como eu, não era familiar a este gerenciador de pacotes, apenas pense nele como sendo um outro brew da vida, mas que tem as opções de escolher a versão que você deseja instalar.

Mais que isso, múltiplas versões dos pacotes podem ser baixadas e você pode fazer a troca de uma versão para outra sob demanda. Isso é muito comum para quem trabalha com múltiplos projetos onde versões específicas são requeridas em cada projeto.

No final das contas foi muito fácil instalar o gerenciador de pacotes asdf, basta seguir a receita do bolo.