Categorias
Tropeçando

Tropeçando 75

Promise Anti-patterns

Promises are very simple once you get your head around them, but there are a few gotchas that can leave you with your head scratching. Here are a few that got me.

PG Phriday: Why Postgres

Generic HTTP Error Handling in AngularJS

Lately during development at one of our clients, Ravello Systems, we decided we wanted better HTTP error handling.

Basically, our perfect solution would have generic handlers for errors, and most calls in the code will not have to do any special work for handling errors. This means that things like authentication problems, server unavailability issues, etc. will be handled in one place — like adding a generic “something went wrong” modal.

The Fastest Method to Evaluate Tune the Performance of Any PHP Web Application Server using MySQL or PostgreSQL

In the Web development world, we often have the problem of choosing the right server to use in the production environment of a Web application.

Maybe we need to buy a new server to handle the expected load, or maybe the customer wants to deploy in an existing server.

In any case, if after deploying and running the application it will show poor performance, then we need to ask the team what we can do to make the application faster or use a better server.

Therefore we need to determine if the application is performing well. Read this article to learn how to quickly determine the performance of an application on the current server.

Postgres 9.6 Features

PostgreSQL is now on version 16. Check the release notes

The Definitive Guide to DateTime Manipulation

As a software developer, you can’t run away from date manipulation. Almost every app a developer builds will have some component where date/time needs to be obtained from the user, stored in a database, and displayed back to the user.

collect-exec.sh – My personal OS report

The script collects a lot of information about the running system and save the output of each commands in a text file, and saves copies of important files in a directory named files. At the end of the script everything is compressed with tar in the global directory.

Faster PostgreSQL Counting

Everybody counts, but not always quickly. This article is a close look into how PostgreSQL optimizes counting. If you know the tricks there are ways to count rows orders of magnitude faster than you do already.

Categorias
Linux

Linux sux

Na maioria das vezes, as pessoas usam su na linha de comando para se concederem privilégios de administrador de maneira que possam editar um arquivo de configuração importante. Mas também é possível encontrarmos usando su quando se está trabalhando no console e é preciso usar uma aplicação gráfica. Quando você tenta executar uma aplicação gráfica enquanto está autenticado com um usuário diferente, você recebe o seguinte erro:

Xlib: connection to ":0.0" refused by server.

O problema é que as chaves usadas para autenticação em sessões X não são válidas quando se usa um usuário diferente. Esta medida de segurança parece zelosa demais, mas é uma herança do sistema de um tempo em que as sessões X foram desenhadas para ser executadas através da rede. Há duas respostas para este problema.

A primeira é ter certeza de que a nova conta pode ser autenticada no servidor X. Isso utiliza o comando xhost para autenticação de novos usuários na janela da sessão X local. Apenas digite xhost +local:local com o usuário normal antes de trocar para o novo usuário e você verá 'non-network local connections being added to access control list' como saída. Agora é possível que você rode qualquer aplicação gráfica na mesma tela em que trocou de usuário. Se você quer ter este recurso a cada vez que você executa sua sessão X, simplesmente adicione o comando xhost ao seu arquivo .bashrc: ele será executado automaticamente a cada vez que você abre um terminal Bash.

A segunda solução é ainda mais fácil. É a substituição do comando su que transfere suas credenciais X para uma nova sessão automaticamente. O comando é sux, que você precisará instalar manualmente pelo gerenciador de pacotes da sua distribuição. Uma vez instalado, digite sux novousuario para trocar para o usuário com o qual você quer usar a visão X. Você perceberá que pode executar aplicações gráficas pela nova sessão sem nenhuma configuração adicional.

Mais em Truques de linha de comando.

Categorias
Linux

Matando os zumbis

Se você passa algum tempo olhando para a sua lista de processos, cedo ou tarde vai se deparar com um processo chamado 'defunto' (defunct). Antes de explicar o que é um processo defunto e como removê-lo, segue um resumo de como consultar a tabela de processos usando o comando ps.

Digitar ps ux listará todos os processos atribuídos ao usuário atual e é possível especificar outro nome de usuário com ps U username. Um dos usos mais comuns para ps é de listagem de todos os processos que estão sendo executados no sistema através de ps aux. Quebrando o comando por partes, o a lista todos os processos ao invés de somente os de um único usuário, o u é o nível de detalhes retornados por cada processo e x lista os processos executados pelo daemon não executados por um terminal.

Um processo defunto é um processo iniciado por outro processo (o pai), mas que foi finalizado antes que o processo pai tenha sido completado. Isso pode acontecer se o processo pai ficou pendurado ou quebrado.

Os processos defuntos são também conhecidos por zumbis e listados com status 'Z' na saída do ps. Eles não são tão destrutivos quanto os mortos-vivos, já que eles não consomem quase recurso do sistema, mas em um sistema que está sempre ativo, como um servidor, eles podem se tornar distrativos. O segredo para matar um processo defunto é primeiro matar o pai, que estará listado na saída do ps adicionado de -l para grandes retornos. Os processos pais podem ser identificados através da coluna PPID ao invés da coluna PID, a coluna com o ID do processo. Esses são identificadores anexados a cada processo executado no seu sistema. Eles podem ser mortos usando outro comando no shell, kill -9, seguido do PPID. Obviamente, isto irá parar a tarefa pai, então se certifique primeiro de que a tarefa não é essencial. Uma vez que a tarefa pai tenha sido morto, o processo init do sistema deverá enviar o sinal correto aos processos defuntos, que devem terminar automaticamente.

Mais em Truques de linha de comando.

Categorias
Linux

Encontre arquivos perdidos

Alguma vez você salvou um arquivo, talvez um download, e então não conseguiu encontrá-lo? Talvez você o tenha salvo em um diretório diferente ou com um nome incomum.

O comando find é útil aqui:

find ~ -type f -mtime 0

e mostrará todos os arquivos do seu diretório home que forão modificados ou criados hoje. Por padrão, find conta dias a partir da meia-noite, então o valor 0 siginifica hoje.

Você deve ter usado a opção -name com o find antes, mas ele pode fazer muito mais. Estas opções podem ser combinadas, então, se o elusivo download foi um arquivo MP3, você pode reduzir a pesquisa com:

find ~ -type f -mtime 0 -iname '*.mp3'

As aspas simples são necessárias para para evitar que o shell fique tentando expandir o coringa, e -iname torna a combinação insensível ao caso.

Permissões incorretas podem causar erros obscuros algumas vezes. Você pode, por exemplo, ter criado um arquivo no seu diretório pessoal enquanto trabalhava como root. Para encontrar arquivos e diretórios que não peretencem a você, use:

find ~ ! -user ${USER}

O shell define a variável de ambiente USER para o usuário atual, e um ! muda o resultado para o próximo teste, então este comando encontra qualquer coisa no atual diretório do usuário que não pertencem a este usuário. Você pode até usar o find para corrigir permissões

find ~ ! -user $USER -exec sudo chown ${USER}:"{}" \;

A página man do find explica o uso de -exec e muitas outras possibilidades.

Categorias
Linux

Controle remoto do MPlayer

Há dois tipos de pessoas neste mundo: aquelas que pensam que o MPlayer é o melhor tocador de mídia na história da existência, e aqueles que estão errados. Uma das características menos conhecidas é a possibilidades de controlá-lo pelo console, um script shell ou até mesmo através da rede. O segredo para este truque está na opção -slave do MPlayer, que diz ao programa para aceitar comandos do stdin stream ao invés das teclas de teclado. Combinar isso com a opção -input e comandos serão lidos de um arquivo ou um FIFO. por exemplo, teste isto num terminal:

mkfifo ~/mplayer-control
mplayer -slave -input file=/home/user/mplayer-control
filetoplay

Então, em outro terminal ou de um script, entre:

echo "pause" >~/mplayer-control

Este comando irá interromper a execução corrente do MPlayer, e ao soltar o comando novamente irá recomeçar a gravação. Note que você tem que dar o caminho completo do arquivo de controle para o MPlayer, com /home/user e daí em diante, porque ~/mplayer-control apenas não irá funcionar. Há vários outros comandos que você pode enviar para o MPlayer - de fato, qualquer operação de teclado no programa dispara um comando que você pode usar no seu script de controle. Você pode até operar o MPlayer de outro computador através da rede usando SSH ou Netcat. Veja este exemplo:

ssh user@host "echo pause >mplayer-control"

Aqui, nós nos autenticamos numa máquina remota (servidor) com o nome de usuário e executamos um comando para enviar a interrupção para o arquivo de controle do MPlayer da máquina remota. É claro, isto pode ser feito muito mais rápido se você tem a chave de autenticação de SSH habilitada para que você não precisa entrar com a senha a cada vez.

Categorias
Linux

Faça suas próprias Bash wormholes

Até mesmo para o Bash aficionado, o comando mkfifo é provavelmente um dos menos usados em sua coleção. Ele cria um sinal para compartilhamento de dados, conectando dois serviços em execução com um tipo de wormhole de linha de comando. Os dados enviadas no final de uma aparecerá instantaneamente na outra.

Antes de olharmos como usá-lo, é válido lembrar como nós tipicamente vemos canalização (ou pipes). Se você está acostumado a usar o shell para qualquer coisa diferente de assustar seus amigos com cat /dev/random, você estará acostumado com a idéia de canalização. Na maioria das vezes é usado para redirecionar a saída de um programa para a entrada de outro. Um uso comum é quando texto demais na saída de um comando para ler. Canalizando a saída em outro - normalmente também menor ou maior - permite que você interrompa e pagine através da saída em seu próprio tempo:

cat /var/log/messages | less

Nesta intância, a canalização é temporariamente criada para a execução de um único comando, mas usando mkinfo é possível criar canalizações persistentes que você pode usar em tarefas similares.

A parte 'fifo' do comando referencia à natureza da canalização - os dados que é o primeiro a entrar é o primeiro a sair. Criar a própria canalização é uma tão simples quando digitar mkfifo, seguido do nome pelo qual você quer chamá-lo. É igualmente possível definir as permissões para a canalização (usando o parâmetro --mode) para restringir o acesso. Uma vez criada a canalização você precisa apenas direcionar os dados por ela. Aqui está um pequeno exemplo. Primeiro criamos a canalização e usamos tail -f para processar a saída de qualquer dado que é enviado para ela:

mkfifo fifo_pipe
tail -f fifo_pipe

O próximo passo, normalmente por outro terminal ou conta de usuário (caso a permissão tenha sido definida), é enviar dados para a canalização. Digitando echo "Um teste" >> fifo_pipe irá enviar a mensagem de teste, que terá a saída processada pelo comando tail que anexamos à canalização.