Categorias
PHP

Codility – OddOccurrencesInArray

I scored 66% in #php on @Codility!
https://codility.com/demo/take-sample-test/odd_occurrences_in_array/

I don't know how to do better yet.

Training ticket

Session
ID: training8BGA3Q-8PA
Time limit: 120 min.

Status: closed
Created on: 2016-01-17 03:06 UTC
Started on: 2016-01-17 03:06 UTC
Finished on: 2016-01-17 03:07 UTC

Categorias
PHP

Codility – FrogJmp

I scored 100% in #php on @Codility!
https://codility.com/demo/take-sample-test/frog_jmp/

Training ticket

Session
ID: trainingXKJK2U-3C6
Time limit: 120 min.

Status: closed
Created on: 2016-01-17 02:47 UTC
Started on: 2016-01-17 02:47 UTC
Finished on: 2016-01-17 02:56 UTC

Categorias
PHP

Codility – BinaryGap

I scored 100% in #php on @Codility!
https://codility.com/demo/take-sample-test/binary_gap/

Categorias
PHP

Codility – CyclicRotation

I scored 100% in #php on @Codility!
https://codility.com/demo/take-sample-test/cyclic_rotation/

100% de aproveitamento!

Categorias
Banco de dados

Precisamos de apoio das ferramentas para a paginação por conjunto de chaves

(Traduzido de We need tool support for keyset pagination)

Você sabia que a paginação via offset é muito problemática, mas fácil de evitar?

offset instrui os bancos de dados a pular os primeiros N resultados N de uma consulta. No entanto, o banco de dados ainda deve buscar essas linhas a partir do disco e trazê-los em ordem antes de ele pode enviar os seguintes.

Isto não é um problema de implementação, é a maneira na qual offset foi desenhado:

... As linhas são primeiro classificadas de acordo com a <cláusula order by> e, em seguida, limitada retirando-se o número de linhas especificadas na <cláusula offset> desde o início ...

— SQL:2011, Part 2, §4.15.3 Derived tables

Em outras palavras, grandes offsets impõe um grande trabalho para o banco de dados, não importa se SQL ou NoSQL.

Mas o problema com offset não pára aqui: já pensou sobre o que acontece se uma nova linha é inserida entre duas páginas buscadas?

offset-drifting

Quando offset➌ é usado para ignorar as entradas❶ anteriores, você terá duplicações no caso de existirem novas linhas inseridas entre as duas páginas➋. Há outras anomalias possíveis também, este é apenas o caso mais comum.

Este nem é um problema de banco de dados, é a maneira como os frameworks implementam paginação: eles apenas dizem qual é o número da página a ser recuperada ou quantas linhas devem ser ignoradas. Com estas informações apenas, nenhum banco de dados pode fazer melhor.

Vida sem OFFSET

Agora imagine um mundo sem estes problemas. Como se constata, viver sem offset é bem simples: apenas utilize uma cláusula where que selecione apenas os dados que você ainda não viu.

Para isso, exploraremos o fato de que trabalhamos com um conjunto ordenado - você tem uma cláusula order by, não é? Uma vez que há uma ordenação definida, podemos usar um filtro simples para somente selecionar o que é posterior a entrada que vimos anteriormente.

SELECT ...
FROM ...
WHERE ...
AND id < ?last_seen_id
ORDER BY id DESC
FETCH FIRST 10 ROWS ONLY

Esta é a receita básica. Ele fica mais interessante quando a classificação é por várias colunas, mas a idéia é a mesma. Esta receita também é aplicável a muitos sistemas NoSQL.

Esta abordagem - chamada seek method ou keyset pagination - resolve o problema de derivação de resultados como ilustrado acima e é ainda mais rápido do que offset. Se você quer saber o que acontece dentro do banco de dados ao usar offset ou keyset pagination, dê uma olhada nestes slides (benchmarks, benchmarks!):

No slide 43 você também pode ver que keyset pagination tem algumas limitações: mais notavelmente que você não pode navegar diretamente para páginas arbitrariamente. No entanto, isto não é um problema quando se utiliza rolagem infinita. Mostrar o número de páginas para serem clicadas é uma interface de navegação pobre, na minha humilde opinião.

Se você quiser ler mais sobre como implementar corretamente keyset pagination em SQL, por favor fetch-next-page. Mesmo que você não esteja envolvido com o SQL, vale a pena ler fetch-next-page antes de começar a implementar qualquer coisa.

No entando, os frameworks

A principal razão para preferir offset a paginação por conjunto de chaves (keyset pagination) é a falta de suporte. A maioria das ferramentas de paginação são baseadas em offset, mas não oferecem nenhuma maneira conveniente para a utilização de paginação por conjunto de chaves.

Por favor, note que a paginação por conjunto de chaves afeta toda a tecnologia envolvida na execução de JavaScript do navegador que esteja fazendo a requisição AJAX para rolagem infinita: ao invés de simplesmente passar um número de página para o servidor, você deve passar o conjunto de chaves completo (geralmente múltiplas colunas) para o servidor.

O hall da fama de frameworks que suportam paginação por conjunto de chaves é ainda pequeno:

É por isto que preciso da sua ajuda. Se você estiver mantendo um framework que tem algum envolvimento com paginação, eu peço, eu imploro, que você construa um suporte nativo para navegação por conjunto de chaves também. Se você tiver quaisquer perguntas sobre detalhes, ficarei feliz em ajudar (forum, contact form, Twitter)!

Mesmo que você esteja apenas utilizando um software que deveria suportar paginação por conjunto de chaves, como um gerenciador de conteúdos ou uma loja virtual, faça os mantenedores saberem sobre isso. Você poderia fazer uma requisitação da funcionalidade (link a esta página) ou, se possível, desenvolva um patch. Novamente, ficarei feliz em ajudar a ter todos os devidos detalhes.

Tome WordPress como um exemplo.

Espalhe a palavra

O problema com a paginação de conjunto de chaves não é técnico. O problema é que é pouquíssimo conhecido no meio e não há suporte das ferramentas. Se você gosta da idéia de evitar o uso de paginação por offset, por favor, ajude a espalhar a palavra. Use o Twitter, compartilhe, envie por e-mail, você pode até reproduzir este post (CC-BY-NC-ND). Traduções são também bem-vindas, apenas faça um contato prévio - eu também incluirei o link da tradução a esta página.

Ah, e se você estiver em um blog, você também pode acrescentar um banner para que seus leitores fiquem alertas a isto. Eu preparei uma a galeria de banner NoOffset com alguns formatos comuns. Escolha o que ficar melhor.

Categorias
Linux

Consertar um terminal problemático

Dificuldade: Fácil
Aplicação: bash

Nós todos fizemos isso - acidentalmente usar less ou cat para para listar um arquivo, e acabou vendo binário. Isso geralmente envolve todos os tipos de comandos que podem facilmente estragar seu terminal. Um apito se iniciará. Haverá caracteres engraçados. Haverá combinações de cores ímpares. No final, a sua fonte será substituída por hieróglifos e você não sabe o que fazer. Bem, o bash está, obviamente, ainda trabalhando, mas você simplesmente não consegue ler o que está realmente acontecendo! Envie, então, um comando de inicialização ao terminal

reset

e tudo ficará bem novamente.

De Dicas de Linux que todo geek deve saber

Categorias
PHP

Force errors to raise an exception in PHP

<?php

function exception_error_handler($severity, $message, $filename, $lineno) {
    if (error_reporting() == 0) {
        return;
    }
    if (error_reporting() & $severity) {
        throw new ErrorException($message, 0, $severity, $filename, $lineno);
    }
}

set_error_handler("exception_error_handler");
Categorias
Linux

Substituindo o mesmo texto em arquivos diferentes

Dificuldade: Intermediário
Aplicação: find / Perl

Se você tem um texto que deseja substituir em vários locais, há várias maneiras de fazer isso. Para substituir o texto Windows por Linux em todos os arquivos no diretório atual chamado teste[alguma coisa] você pode executar o seguinte:

perl -i -pe 's/Windows/Linux/;' test*

Para substituir o texto Windows por Linux em todos os arquivos de texto no diretório atual e para baixo você pode executar este:

find . -name '*.txt' -print | xargs perl -pi -e's/Windows/Linux/ig' *.txt

Ou se você preferir isso também vai funcionar, mas apenas em arquivos regulares:

find -type f -name '*.txt' -print0 | xargs --null perl -pi -e 's/Windows/Linux/'

Economiza muito tempo e tem uma classificação de guru alta!

De Dicas de Linux que todo geek deve saber

Categorias
Linux

Verifique os processos que estão rodando e que não são os seus

Dificuldade: Especialista
Aplicação: Bash

Imagine a cena - você está pronto para uma partida rápida de Crack Attack contra um colega no escritório, mas para encontrar o jogo se arrasta um impasse, assim como você está prestes a bater o seu subordinado arrogante - o que poderia estar acontecendo para fazer a sua máquina estar tão lenta? Deve ser algum desses outros usuários, roubando o seu precioso tempo de CPU com seus experimentos científicos, servidores web ou outras coisas estranhas de geek!

OK, vamos listar todos os processos que não estão sendo executados por você!

ps aux | grep -v `whoami`

Ou, para ser um pouco mais inteligente, porque não listar apenas os dez maiores desperdiçadores de tempo:

ps aux --sort=-%cpu | grep -m 11 -v `whoami`

É provavelmente melhor executar isto como root, pois isso irá filtrar a maior parte dos processos vitais do plano de fundo. Agora que você tem a informação, você pode simplesmente matar seus processos, mas muito mais covarde é correr xeyes em seu desktop. Repetidamente!

De Dicas de Linux que todo geek deve saber

Categorias
Linux

Dicas de Linux que todo geek deve saber

Fonte: Linux tips every geek should know

O que separa os usuários normais dos super-geeks? Simples: anos gastos aprendendo maneiras de desmantelar códigos, truques, dicas e técnicas que transformam grandes esforço num trabalho de um momento. Se você quer ganhar agilidade para colocar as mãos á obra, separamos 50 dicas fáceis de aprender para lhe ajudar a trabalhar com mais eficiência e obter o máximo do seu computador. Aproveite!

  1. Verifique os processos que estão rodando e que não são os seus
  2. Substituindo o mesmo texto em arquivos diferentes
  3. Consertar um terminal problemático