Otimizando o Linux com Swapiness

A partir das últimas versões do kernel 2.6.x, o kernel do linux passou a permitir que o usuário controle a partir de qual percentual de uso da memória RAM que será utilizado o swap.

Entretanto não se preocupe com essa questão de versão do kernel, pois atualmente o mesmo está na versão 4.x, então a não ser que você use um linux do tempo das cavernas sua distro terá suporte a esta configuração.

Existem duas maneiras de ver como seu swapiness está configurado:

sudo cat /proc/sys/vm/swappiness
60

ou

sysctl -a|grep swappiness
vm.swappiness = 60

no caso acima, ele irá utilizar swap a partir de 40% de uso da memória RAM (a configuração se baseia em memória disponível, então use sempre “100 – valor” para aplicar esta definição).

Primeiramente, poemos definir este valor em tempo de execução de forma testar qual valor melhor se adéqua a sua máquina

sysctl -w vm.swappiness=5

Acima configuramos para só usar o swap quando a memória RAM estiver 95% cheia (lembre do cálculo mencionado anteriormente).

O único problema é que essa configuração se perde ao reiniciar a máquina, então, para torná-la permanente, basta editar o arquivo /etc/sysctl.conf e adicionar/editar a seguinte linha:

vm.swappiness = 5

Certo, e qual número eu devo configurar?

A configuração vai depender da quantidade de RAM a máquina, mas por via e regra, quanto mais memória RAM, menor deverá ser o swapiness. 

Em um note com 4GB de RAM que uso pra desenvolvimento, consegui o melhor desempenho setando o número em 5, porém é interessante testar com outros valores antes e tornar a configuração definitiva 😉

Entendendo as certificações para dispoditivos a prova d’agua

“Nos dias atuais contemporâneos de hoje em dia” (não resisti a piada) muito se fala em dispositivos a prova d’agua com certificações ip67, ip68, etc.

Porém uma dúvida comum é o que significam estas siglas.

Este sistema de proteção IP é definido pela norma internacional IEC 60529 que classifica o grau de proteção fornecido por um compartimento de equipamento elétrico/eletrônico contra objetos sólidos (como poeira) e líquidos (água, óleo, etc.).

Seu grau de proteção é definido pela sigla ip, seguido de um número de dois dígitos, aonde o primeiro é o grau de proteção contra sólidos e o segundo contra líquidos.

O primeiro número indica o grau de proteção contra objetos sólidos

O segundo número indica o grau de proteção contra líquidos

X: Não mensurado

X: Não mensurado

0: Sem proteção

0: Sem proteção

1 = protegido contra a entrada de objetos sólidos externos de diâmetro ? 50 mm

1 = Protegido contra gotejamento vertical

2 = protegido contra a entrada de objetos sólidos externos de diâmetro ? 12,5 mm

2 = Protegido contra gotejamento (inclinação de 15%)

3 = protegido contra a entrada de objetos sólidos externos de diâmetro ? 2,5 mm

3 = Protegido contra pulverização (inclinação de 60%)

4 = protegido contra a entrada de objetos sólidos externos de diâmetro ? 1 mm

4 = Protegido contra respingo

5 = protegido contra poeira (entrada limitada, sem depósitos prejudiciais)

5 = Protegido contra jato

6 = à prova de poeira

6 = Protegido contra jato potente
7 = Protegido contra imersão temporária (até 1 metro por 30 minutos)
8 = Protegido contra imersão contínua (acima de 1 metro de profundidade pelo período de tempo especificado pelo fabricante)

OBS: Em alguns casos, no lugar dos algarismos numéricos, podem ser substituídos pela letra X, referenciando que aquela situação não foi testada.

Exemplo: ipX6 significa que, apesar de aguentar jatos potentes de água, não possui qualquer garantia de resistência contra objetos sólidos.

criando proxy através do ssh

Eu uso muito esta técnica para efetuar testes em sistemas simulando acesso vindo de redes externas.

Esta dica funciona com qualquer servidor ssh que não possua bloqueios na porta 80 e 443. Logo também é possível o uso em servidores compartilhados!

Pra quem usa linux, é muit fácil, basta executar o comando abaixo no terminal e configurar o navegador para acesso a internet via proxy socks na porta determinada no comando

syntaxe:

ssh -Nn -D PORTA USUARIO@SERVIDOR

exemplo:

ssh -Nn -D 4050 [email protected]

No exemplo acima, basta configurar o navegador para acesso via proxy socks5 na porta 4050

Criar entities baseado no banco

Pra quem, assim como eu, prefere modelar o banco da forma tradicional ao invés de criar através das entities.

Considerando que:
– O namespace aonde vão ser gravadas as entities é Application\\Entity\
– As entities vão ser gravadas em module/Application/src/Application/Entity/

./vendor/doctrine/doctrine-module/bin/doctrine-module orm:convert-mapping --force --namespace="Application\\Entity\\" --from-database annotation ./module/Application/src/Application/Entity/

./vendor/doctrine/doctrine-module/bin/doctrine-module orm:generate-entities ./module/Application/src/Application/Entity/ --generate-annotations=true

 

InnoDB: Fatal : Cannot initialize AIO sub-system

La estava eu configurando um servidor ubuntu e o mysql teimava em não subir.

No log de erro tínhamos o seguinte:

InnoDB: Fatal : Cannot initialize AIO sub-system

Bem, parece que a vps que estou utilizando neste projeto não “gosta” muito do Asynchronous Input Output do kernel sendo necessário forçar o mysql a utilizar lib de terceiros (no meu caso a libaio)

Para isto, basta adicionar ao my.cnf

innodb_use_native_aio = 0

 

 

Instalar PHP5.3 no ubuntu 14.04

Esta dica teoricamente funciona também nas versões mais recentes do ubuntu.

Estes dias um antigo cliente meu entrou em contato solicitando a árdua tarefa de instalar o PHP  5.3 na última versão LTS do ubuntu (no momento em que escrevo é a 14.04).

Meu primeiro pensamento, foi baixar o tarball e compilar no servidor. Depois de mais de uma hora resolvendo dependências de bibliotecas, me deparo com erro na hora do make que eram basicamente questões relativas a versão de compilador, sendo praticamente impossível resolver (e olha que tentei).

Logo surgiu a ideia de buscar algum PPA que contenha esta versão, que também foi em vão, pois descobri que mesmo os repositórios que, em alguns artigos na internet diziam que continham esta versão do PHP, já haviam atualizado para as mais novas.

Quando tudo estava perdido, eis que surge uma ideia muito maluca. E se eu adicionasse os repositórios do ubuntu 12.04, deveria haver algum jeito de forçar o apt a utilizar pacotes de um determinado repositório.

Então, sem mais delongas, segue a receita de bolo:

Primeiro vamos criar um arquivo contendo os repositórios do ubuntu precise (12.04)

/etc/apt/sources.list.d/precise.list

deb http://mirror.rackspace.com/ubuntu/ precise main restricted
deb-src http://mirror.rackspace.com/ubuntu/ precise main restricted
deb http://mirror.rackspace.com/ubuntu/ precise-updates main restricted
deb-src http://mirror.rackspace.com/ubuntu/ precise-updates main restricted
deb http://mirror.rackspace.com/ubuntu/ precise universe
deb-src http://mirror.rackspace.com/ubuntu/ precise universe
deb http://mirror.rackspace.com/ubuntu/ precise-updates universe
deb-src http://mirror.rackspace.com/ubuntu/ precise-updates universe

Agora o “pulo do gato”, fazer com que os pacotes do PHP e do Apache utilizem este repositório

/etc/apt/preferences.d/php_precise

Package: php5
Pin: release a=precise
Pin-Priority: 1001

Package: php*
Pin: release a=precise
Pin-Priority: 1001

Package: php-*
Pin: release a=precise
Pin-Priority: 1001

Package: libapache2-mod-php5
Pin: release a=precise
Pin-Priority: 1001

Package: php5
Pin: release a=precise-updates
Pin-Priority: 1001

Package: php*
Pin: release a=precise-updates
Pin-Priority: 1001

Package: php-*
Pin: release a=precise-updates
Pin-Priority: 1001

Package: libapache2-mod-php5
Pin: release a=precise-updates
Pin-Priority: 1001

Package: apache2-*
Pin: release a=precise
Pin-Priority: 1001

Package: apache2-*
Pin: release a=precise-updates
Pin-Priority: 1002

Package: apache2*
Pin: release a=precise
Pin-Priority: 1001

Package: apache2*
Pin: release a=precise-updates
Pin-Priority: 1002

OBS: Os pacotes do apache são necessários caso você vá utilizar mod_php, se for utilizar php-fpm ou php-cgi, basta retirar os grupos referentes ao apache no arquivo acima.

Agora basta instalar os software e “voilà”

apt-get update
apt-get install apache2 php5 libapache2-mod-php5

Todo esses procedimentos que citei (compilação, procura de ppa, testes), levaram horas do meu tempo livre, então se você estiver lendo isso e lhe for útil, um belo agradecimento seria um compartilhamento no facebook! 😉

Função para validar cartões de crédito com detecção automática da bandeira

Função para validar cartões de crédito, com suporte a validação de CVC.

O primeiro parâmetro é o número do cartão e o segundo o CVC (opcional), os dados serão sanitizados, sendo filtrado somente os números.

A saida é um array de três posições, a primeira retorna false (em caso de erro) ou a bandeira, a segunda se o número do cartão é válido e a terceira se o CVC é válido.

 

/**
 * @author Felipe Braz
 * @website https://braz.dev/blog
 * @param int $cartao
 * @param int $cvc
 * @return array
 */
function valida_cartao($cartao, $cvc=false){
	$cartao = preg_replace("/[^0-9]/", "", $cartao);
	if($cvc) $cvc = preg_replace("/[^0-9]/", "", $cvc);

	$cartoes = array(
			'visa'		 => array('len' => array(13,16),    'cvc' => 3),
			'mastercard' => array('len' => array(16),       'cvc' => 3),
			'diners'	 => array('len' => array(14,16),    'cvc' => 3),
			'elo'		 => array('len' => array(16),       'cvc' => 3),
			'amex'	 	 => array('len' => array(15),       'cvc' => 4),
			'discover'	 => array('len' => array(16),       'cvc' => 4),
			'aura'		 => array('len' => array(16),       'cvc' => 3),
			'jcb'		 => array('len' => array(16),       'cvc' => 3),
			'hipercard'  => array('len' => array(13,16,19), 'cvc' => 3),
	);

	
	switch($cartao){
		case (bool) preg_match('/^(636368|438935|504175|451416|636297)/', $cartao) :
			$bandeira = 'elo';			
		break;

		case (bool) preg_match('/^(606282)/', $cartao) :
			$bandeira = 'hipercard';			
		break;

		case (bool) preg_match('/^(5067|4576|4011)/', $cartao) :
			$bandeira = 'elo';			
		break;

		case (bool) preg_match('/^(3841)/', $cartao) :
			$bandeira = 'hipercard';			
		break;

		case (bool) preg_match('/^(6011)/', $cartao) :
			$bandeira = 'discover';			
		break;

		case (bool) preg_match('/^(622)/', $cartao) :
			$bandeira = 'discover';			
		break;

		case (bool) preg_match('/^(301|305)/', $cartao) :
			$bandeira = 'diners';			
		break;

		case (bool) preg_match('/^(34|37)/', $cartao) :
			$bandeira = 'amex';			
		break;

		case (bool) preg_match('/^(36,38)/', $cartao) :
			$bandeira = 'diners';			
		break;

		case (bool) preg_match('/^(64,65)/', $cartao) :
			$bandeira = 'discover';			
		break;

		case (bool) preg_match('/^(50)/', $cartao) :
			$bandeira = 'aura';			
		break;

		case (bool) preg_match('/^(35)/', $cartao) :
			$bandeira = 'jcb';			
		break;

		case (bool) preg_match('/^(60)/', $cartao) :
			$bandeira = 'hipercard';			
		break;

		case (bool) preg_match('/^(4)/', $cartao) :
			$bandeira = 'visa';			
		break;

		case (bool) preg_match('/^(5)/', $cartao) :
			$bandeira = 'mastercard';			
		break;
	}

	$dados_cartao = $cartoes[$bandeira];
	if(!is_array($dados_cartao)) return array(false, false, false);

	$valid     = true;
	$valid_cvc = false;

	if(!in_array(strlen($cartao), $dados_cartao['len'])) $valid = false;
	if($cvc AND strlen($cvc) <= $dados_cartao['cvc'] AND strlen($cvc) !=0) $valid_cvc = true;
	return array($bandeira, $valid, $valid_cvc);
}

Ah, a minha esposa queria que eu botasse nesse post uma foto de gatinho, então lá vai:

Picture-86

Fonte: https://gist.github.com/erikhenrique/5931368