Como encontrar o PHP.ini?

Já tive problemas para encontrar o PHP.ini no MacOS, eu alterava as configurações do meu arquivo php.ini, reiniciava o meu apache e as mudanças não eram aplicadas.

Já imaginava que era isso, então descobri que eu estava alterando um php.ini que não estava sendo carregado pelo PHP na minha máquina.

Como descobrir onde está o PHP.ini?

Você pode criar uma página que exiba toda a configuração do PHP e exiba em seu navegador, para isso crie um arquivo com o seguinte:

<?
phpinfo();
?>

Coloque o arquivo em uma pasta acessível pelo seu Apache e abra ela no navegador, esta página exibe todas as configurações do seu PHP.

Procure por “configuration file” e lá estará o caminho (path) do arquivo de configuração carregado pelo PHP.

Descobrindo o php.ini no terminal

Se você tem acesso a um terminal pode exibir todas as informações do php.ini direto no terminal, para isso digite:

php -i

E para facilitar a identificação do caminho completo do seu arquivo de configuração do PHP (php.ini) execute o seguinte comando no terminal:

php -i | grep 'Configuration File'<br>

Espero ter te ajudado a encontrar o caminho do php.ini.


Graças ao google os artigos mais acessados do O Desenvolvedor são os que responsem dúvidas simples com respostas rápidas, quer saber mais sobre PHP? Leia também:

O que marcenaria me ensinou de front-end

Fazia tempo que eu queria aprender e praticar algumas coisas a fim de mudar um pouco meu modo de pensar, escolhi meditação, marcenaria e bonsai. Arrumei tempo para estudar e praticar os três. Tentar aprender um pouco mais sobre marcenaria/construção foi um dos fatores que me levou a voluntariar no TETO.

Acho que foi no ZOFE sobre carreira em front-end que o Zeno e o Daniel (recomendo que você ouça todos os podcasts destes caras) fizeram uma comparação entre o trabalho de artesãos e dos desenvolvedores front-end: desenvolver um trabalho único e dedicar-se a entregar o melhor de si em uma “peça”, ou no nosso caso, a uma interface. 

Eu e a marcenaria

Apesar de ainda não saber praticamente nada de marcenaria ela já me ensinou bastante. Sei pregar, sei serrar, sei lixar. Tudo isso mais ou menos, e bem mais para menos.

Comecei a praticar faz pouco tempo e para começar resolvi reciclar, restaurar e pintar um caixote de feira para a Bia transformar em um criado mudo ou em um caixote para guardar coisas. Ela (ou o pai dela) já haviam arrumado o caixote e em um final de semana comprei lixas e resolvi começar.

Caixote de madeira

Quem sabe um dia?

Lixei uma vez e o caixote ficou bem mais bonito do que estava antes. Foi uma hora de calma, café e o cheiro de madeira. E neste ponto comecei a refletir sobre minha ansiedade (este era um dos motivos de eu procurar atividades offline) e fazer comparação com o desenvolvimento web e a marcenaria.

Depois de pouco mais de quase três horas de trabalho e muita lixa gasta, eu poderia considerar o caixote pronto. As partes internas lisas como nunca estiveram, os cantos arredondados (não é piada com front-end) e minhas mãos secas da lixa e pó. O resultado depois disso foi que o caixote ganhou outra cor, quase sem nenhuma “sujeira” externa visível e pronto para receber uma camada de verniz e se tornar parte da decoração de casa.

Já estava tarde, eu estava cansado, fui dormir e retomei o trabalho no dia seguinte.

Não comecei pela pintura, peguei novamente a lixa e vi detalhes que passaram despercebidos no dia anterior. Não hesitei em recomeçar a lixar, a melhorar o acabamento de algumas pontas e deixar tudo mais simétrico. Mais lixa, mais pó e o resultado melhor do que o anterior, repeti o ciclo algumas vezes, desta vez de forma mais rápida. 

Pintura e ferramentas

Satisfeito com o estado do caixote, fui verificar o que precisava para fazer a pintura. Desisti de passar apenas verniz e resolvi pintar a caixa.

Como eu não tinha a base correta para madeira usei uma outra base que, em teoria, deveria funcionar pois era bem parecida com a base para madeira (dizem…). 

Ficou horrível. Estraguei o caixote. 

A madeira “chupou” toda a tinta que eu passava, a cada passada o rolo secava e a madeira adquiria um esbranquiçado apático, bem pior do que quando estava apenas lixada.

O caixote esta lá, esperando para receber a finalização.

O que marcenaria me ensinou sobre front-end

Desde que comecei a trabalhar com o caixote fiquei pensando em escrever este texto e pensando em como paciência é uma virtude importante para um desenvolvedor, seja front-end ou back-end. 

Eu sei que posso entregar um projeto em cinco horas ou este mesmo projeto em quinze horas, e apesar dos resultados aparentarem ser “bem parecidos”, não é bem assim. 

Em meus projetos eu costumo sofrer de uma síndrome chamada “ansiedade de colocar no ar”, principalmente se tratando do And After. Por razões de negócio sou muito mais cuidadoso com o Eu Compraria, mas mesmo assim a ansiedade é uma complicada de lidar e acaba atrapalhando na qualidade e produtividade enquanto estou programando.

Se algo está “quase pronto” era comum três coisas acontecerem por aqui:

  1. Trabalhar mais que 10 horas diárias
  2. Não conseguir focar em outra coisa senão o projeto que quero lançar
  3. Preciso lançar hoje

Identificar o problema é o primeiro passo para lidar com ele, e lixar, lixar e lixar me ajudou a controlar um pouco a ansiedade (provavelmente meditação e estar cultivando bonsais também ajudaram).

Aprendi a ser um desenvolvedor com uma qualidade de entrega melhor do que a que eu estava acostumado, controlo um pouco melhor a ansiedade que sinto em publicar um projeto (text, código, etc.).

Em uma construção de moradia emergencial no TETO
A construção é de um final de semana. 

Que tal participar do TETO?

Quando o objetivo é fazer bem feito não devemos ter pressa, hoje eu foco em fazer o melhor possível no tempo que eu acho necessário, e não no tempo que eu acho mínimo para uma entrega. 

No TETO o primeiro dia é basicamente dedicado a fundação da casa, e temos apenas 2 dias para construir. Antes de começar a codar seu projeto pense em cada detalhe, estruture ele na sua cabeça ou no papel. Trabalhar em um projeto com uma estrutura sólida é muito mais tranquilo e rápido.

Buscar atividades fora do digital podem ajudar bastante a melhorar nossa qualidade de vida e qualidade de trabalho quando tentamos fazer uma relação e aprender sobre a vida, não sobre uma profissão ou atividade específica.

E você, tem alguma experiência parecida com atividades que refletiram na melhora do seu trabalho? Compartilhe nos comentários ou me escreva. 🙂

Como estender os Controllers do Code Igniter

Estender um controller do Code Igniter é uma boa forma de carregar um controller com algumas pré-definições, como validação de usuário, carregamento de bibliotecas ou definições de idioma.

Como estender um controller?

Para estender um controller (ou qualquer outra parte do Code Igniter) o primeiro passo é criar um arquivo que será carregado automaticamente e terá a classe que iremos utilizar.

No meu caso, para estender um controller vou criar um arquivo chamado MY_Controller.php no diretório:

application/core/MY_Controller.php

Dentro este arquivo crio uma classe para estender meu controller, por exemplo:

class MY_AdminController extends CI_Controller {}

E dentro desta classe eu adiciono o que for necessário para o meu controller extendido.

class MY_AdminController extends CI_Controller {
	function __construct(){
		parent::__construct();
		header('Content-type: text/html; charset=utf-8');
		$user = new User();
		if(!$user->getLogged()){
			die('There is only one god and his name is Death, and there is only one thing we say to Death: "Not today"');
		}
	}
}

E no arquivo do seu controller, ao invés de estender o controller você extende o MY_AdminController ou qualquer outro nome que você tenha utilizado.

Você pode ter mais do que uma extensão de controller, no mesmo arquivo de extensão (MY_Controller.php) é só criar uma outra classe e estender o mesmo Controller.

class MY_AdminController extends CI_Controller {}
class MY_App extends CI_Controller {}

Uma outra forma de estender é utilizar os hooks, que permitem um controle mais sensível de onde e o que carregar.

E você, como faz isso nas suas aplicações?

Usando CasperJS para testar a navegação em um site

CasperJS é uma ferramenta poderosa para gerar scripts de navegação e testes com o PhantomJS. Quer saber mais sobre ele? Veja o site, é a melhor referência.
Vou me ater a mostrar um script que testa uma navegação simples aqui do And After: carregar a home, testar o título, clicar no primeiro link do menu, verificar se a url está correta e checar se um certo nó do DOM existe.

O grande barato do CasperJS é poder programar (fazer o script) de teste funcional, simulando carregamento de páginas, clique em elementos, preenchimento de formulários, etc… (relativamente todo tipo de interação possível do usuário) e com isso automatizar testes.

Bem, vamos ao código (comentado linha-a-linha), que é efetivamente simples e direto:

//carrega o casperjs
var casper = require('casper').create();

//define a página inicial
casper.start("https://andafter.org");

//testa, usando a API de testes, se o título da página é And After
casper.then(function() {
    this.test.assertEquals(this.getTitle(), "And After", "Título da página é And After");
});

//então clica no primeiro link dentro da ul#level-2
casper.then(function() {
    this.click("ul#level-2 li a:first-child");
});

//testa se o endereço aberto tem a url da categoria Carreira
casper.then(function() {
    this.test.assertEquals(this.getCurrentUrl(), "https://andafter.org/categoria/carreira", "Navega para primeiro item do menu, que é de categoria Carreira");
    //e testa se existe um elemento ul.posts
    this.test.assertExists("ul.posts", "Deve existir ul.posts, que lista os posts");
});

//roda o script
casper.run(function() {
    this.test.renderResults(true);
});

 

Tendo esse script salvo em um arquivo chamado teste.js é só rodar na linha de comando:
casperjs test teste.js

O output será algo como:

CasperJS - outpu

Usando resolve e reject da Deferred() da jQuery

O objeto Deferred da jQuery é extremamente poderoso e ainda não muito utilizado. Uma coisa interessante nele é registrar cadeias de chamadas (callbacks) e poder associá-las a estados de sucesso (resolve) ou erro (reject) de funções, sejam elas síncronas ou assíncronas.

Para o exemplo, preferi usar chamadas síncronas, visando a simplicidade. A idéia é que o usuário clique na área verde (uma div de id green) de uma página (o que vamos tratar como sucesso). Se clicar na vermelha (uma div de id red), trataremos como erro.

No javascript, vamos então criar um objeto Deferred:

var def = $.Deferred();

Vamos então a esse objeto associar alguns handlers:

– quando ele for resolvido:

def.done(function() {
   alert("Você clicou na área verde :-)");
});

– quando for rejeitado:

def.fail(function() {
   alert("Você clicou na área vermelha :-(");
});

– quando for tanto rejeitado como resolvido

def.always(function() {
   alert("Obrigado por testar!");
});

Com isso, temos 2 cadeias definidas já. Em caso do objeto ser resolvido, será dado um alert que indica que usuário clicou na área verde e depois um outro agradecendo o teste. Em caso de ser rejeitado, um alert falando que clicou na área vermelha e aí a mesma mensagem de agradecimento é invocada.

Para resolver ou rejeitar, é simples:

$("div#green").on("click", def.resolve);
$("div#red").on("click", def.reject);

Vejam no jsFiddle esse exemplo: http://jsfiddle.net/3J5zA/2/

Existem usos mais complexos e interessantes para o objeto Deferred, o exemplo feito é para mostrar como criar cadeias de resolve e reject de forma simples e invocá-las. Na documentação oficial pode-se encontrar mais explicações sobre os métodos usados, bem como de outros.