PHP, escovando bits

– "&" – Porta Lógica AND

Tabela da Verdade: 

A B A & B
0 0 0
0 1 0
1 0 0
1 1 1

 

Código: 

$a = 1;

$b = 0;

if($a & $b){

echo "Teste AND: true";

}else{

echo "Teste AND: false";

}

?>

Obs: Só será true se os valores de A e B forem 1

 

– "|" – Porta lógica OR

Tabela da Verdade: 

A B A | B
0 0 0
0 1 1
1 0 1
1 1 1

 

Código: 

$a = 1;

$b = 0;

if($a | $b){

echo "Teste OR: true";

}else{

echo "Teste OR: false";

}

?>

Obs: Só será true se os valores de A ou B ou ambos for(em) 1

 

– "^" – Porta lógica XOR

Tabela da verdade:

 
A B A ^ B
0 0 0
0 1 1
1 0 1
1 1 0

 

 

Código: 

$a = 1;

$b = 0;

if($a ^ $b){

echo "Teste XOR: true";

}else{

echo "Teste XOR: false";

}

?>

Obs: Só será true se o valor de A for o contrário de B e vice e versa.

 

– "~" – Porta lógica NOT

Tabela da verdade:

A ~A
0 1
1 0

Obs: O negado é o inverso do valor de A.

 

– ">>" – Move os bits para a direita

$num = 8; //Em binario, 1000

$num = $num >> 2; 

echo $num; //Aparecerá 2 que em binário = 0010

?>

 

 

– "<<" – Move os bits para a esquerda

$num = 2; //Em binario, 0010

$num = $num << 2; 

echo $num; //Aparecerá 8 que em binário = 1000

?>

Ponteiros, as variáveis de referência

Primeiramente precisamos entender o que é uma variável, então o que é? 

Variável é um nome amigável que damos para um espaço reservado na memória que receberá alguma informação que desejamos. Exemplo: 
 
$nome = "Andafter.org";
?>
 
Este trecho de código diz ao compilador do php o seguinte: Memória, reserve pra mim um espaço em sua memória e guarde dentro dele a string "Andafter.org". Quando pedimos isso, o computador executa essas ações e retorna um endereço que este espaço ficou alocado, o endereço de memória.
 
Sabendo agora o que é um endereço de memória, vejamos o código abaixo: 
 
$nome = "google.com"; 
$linkNome = &$nome;
$linkNome = "andafter.org";
 
echo $nome; //aparecerá andafter.org
?>
 
Na 1a linha de código temos uma associação normal, conforme vimos anteriormente.
na 2a linha de código falamos que $linkNome receberá o endereço de memória da variável $nome, ou seja, $linkNome será um ponteiro para a var $nome.
Na 3a linha modificamos a var $linkNome que na verdade é uma referência a variável $nome alterando assim o conteúdo da variável que está apontando.

Onde usar ponteiros? 

Ponteiros são usados juntos com funções, sendo estes em forma de parâmetros ou em retornos.
Exemplo:
 
$frutas = ["maça","pera","abacate"];
 
sort($frutas);
 
var_dump($frutas);
?>
 
A função sort, que ordena um array, recebe uma referência de variável e faz a modificação a partir da referência informada.
Veja a assinatura do método sort: 
 
bool sort ( array &$array [, int $sort_flags ] ) 

Porque usar ponteiros?

Os ponteiros evitam cópias desnecessárias para os escopos locais das funções. Toda vez que uma função recebe um parâmetro, ela mesma cria uma cópia da variável em memória para trabalhar dentro de si mesma, veja nos exemplos abaixo:
 
Exemplo 1: variáveis duplicadas em memória: 
 
 
function dobraValor($valor){
        return $valor * 2;
}
 
$valor = 2;
 
$valor = dobraValor($valor);
?>
 
Explicação: Neste exemplo teremos 2 variáveis $valor; uma de escopo global e uma de escopo local dentro da função ambas contendo o mesmo conteúdo.
 
Exemplo 2: uma variável e trabalhando com referência
 
 
function dobraValor(&$valor){
        $valor = $valor * 2;
}
 
$valor = 2;
 
dobraValor($valor);
?> 
 
Explicação: Neste caso, temos apenas 1 variável $valor, a de escopo global. A função dobraValor recebe apenas uma referência à variável de escopo global não criando portanto uma cópia da $valor para acesso local.

Conclusão

Deixamos mais performáticos nossos sitemas trabalhando com ponteiros mas também devemos tomar cuidado ao modificar essas variáveis por referência pois qualquer atribuição de valor a ela, modificaremos a variável de fora também o que pode gerar muita dor de cabeça na hora identificar o porque a variável está dobrando o valor sem vc. mandar. 

XAMP e MySQL no Mac – XAMPPErrorDomain error

Como tenho pouca experiência com Mac OS, quem configurou meu ambiente de desenvolvimento foi meu colega Well, que optoiu pelo XAMPP para a configuração do Apache e MySQL.

Hoje percebi que o MySQL não estava iniciando, e retornava o erro "XAMPPErrorDomain error 1", que pelo que pesquisei é um erro de permissão apenas.

 

XAMPPErrorDomain error 1

Não sei se esta mensagem de erro dá para outros casos, mas no meu caso ela representava um problema de permissão de execução nos arquivos do MySQL.

A solução foi dar um chmod -R 777 na pasta do MySQL do XAMPP:

sudo chmod -R 777 /Applications/XAMPP/xamppfiles/var/mysql

Pronto, agora é só iniciar o MySQL através do XAMPP Controle e ele deve funcionar corretamente.

 

phpMyAdmin

Vi que o MySQL estava com o processo rodando corretamente mas quando tentei acessar o phpMyAdmin recebi o seguinte erro: 

#1 - Can't create/write to file '/Applications/XAMPP/xamppfiles/temp/#sql274_1_2.MYI' (Errcode: 13)

Novamente problema de permissão de escrita na pasta indicada, outro chmod:

sudo chmod -R 777 /Applications/XAMPP/xamppfiles/temp

Problema resolvido, MySQL rodando e phpMyAdmin funcionando corretamente. Resolveu este problema de outra forma? Compartilha nos comentários para eu manter o post atualizado. 🙂

O que é Page Visibility – Palestra do SampaJS

Pelo segundo ano consecutivo o SampaJS aconteceu quando eu estava viajando e não pude participar. O Daniel Filho falou sobre Page Visibility, uma API bacana que permite melhorar ainda mais a interação com o usuário verificando se sua página está ativa no navegador do usuário.

Page Visibility

 

E se você quer saber mais sobre Page Visibility vale a pena ver a documentação na W3C.

Javascript – o método call() e apply()

Todas as funções do javascript possuem alguns métodos como toString(), call() e apply(). Antes de explicar o método function.call() vou exemplificar o funcionamento das funções e escopos, que acredito que isso facilite o entendimento.

Exemplo de código:

var url = 'andafter.org';
function f(){
    console.log(this);
    console.log(this.url);
}
f();

Nesse código eu seto uma variável global url, e quando chamo a função f dou um log em "this" (é a window), então quando chamo this.url o retorno é a variável instanciada fora da função.

O método call()

O método function.call() permite você dizer em qual escopo (essa é a nomenclatura certa? comentem suas opiniões) uma função deve ser executada.

Voltando ao exemplo de código anterior:

var url = 'andafter.org';
var site = { url : 'odesenvolvedor.com.br' };
function f(){
    console.log(this.url);
}
f.call(site);

O function.call() define o que será o "this" dentro da função, e este deve ser passado como parâmetro para o método call.

 

Método call com parâmetros

No exemplo anterior não fizemos uso de parâmetros, apenas do "this". Mas o método call pode receber a partir do segundo parâmeto (o primeiro sempre será o escopo que será atribuído ao this) os parâmetros que serão passados para a função.

var url = 'andafter.org';
var site = { url : 'odesenvolvedor.com.br' };
function f(p1, p2){
    console.log(this.url + ' - ' + p1 + ' - ' + p2);
}
f('aprendendo javascript', 'no andafter!');
f.call(site, 'estudando códigos', 'no desenvolvedor');

O método function.apply()

O método function.apply() tem o mesmo funcionamento do function.call() com uma diferença na forma dos parâmetros, o segundo parâmetro sempre deverá ser um array, contendo todos os parâmetros que serão enviados para a função.

O primeiro parâmetro continua sendo o escopo onde sua função será executada.

var url = 'andafter.org';
var site = { url : 'odesenvolvedor.com.br' };
function f(p1, p2){
    console.log(this.url + ' - ' + p1 + ' ' + p2);
}
f('aprendendo javascript', 'no andafter!');
f.apply(site, ['estudando códigos', 'no desenvolvedor']);

Agora você já sabe como definir em qual escopo uma função será executada, e também tem um facilitador para funções que chamam funções.

Este é um post introdutório para alguns códigos mais complexos que virão, quase todos resultados das minhas pesquisas de performance de javascript e desenvolvimento de bibliotecas como o jQuery Lazy Load.