Datas recursivas com PHP

Em um dos projetos que estou trabalhando eu precisei trabalhar com datas recursivas a partir de uma data inicial e de uma periodicidade. 

Datas no PHP

Não vou abordar a fundo como trabalhar com datas no PHP, apenas como adicionar determinado número de dias em uma data. Se você não tem ideia de como trabalhar com datas no PHP, recomendo começar pelo manual do PHP date() date(). 

Mas o conceito de recursividade é simples e vou explicar abaixo o funcionamento de cada passo para gerar datas repetidas com PHP.

Formatando a data de hoje

Primeiro, o básico de formatação de datas com PHP. Estou trabalhando com MySQL (date), portanto trabalho com a seguinte formatação.

date('Y-m-d');

O código acima vai retornar a data de hoje no formato ano-mes-dia.

Adicionar dias em uma data

Para dar início a recursividade a lógica é: tenho uma data e preciso saber qual será a data daqui X dias, e assim sucessivamente. Para adicionar dias a uma data usamos a função strtotime (veja o manual) do PHP junto com date. 

No exemplo abaixo o resultado deve ser a data formatada para exatamente daqui a 7 dias.

date('Y-m-d', strtotime(date('Y-m-d') . '+7 days'));

Recursividade de datas

Com estes 2 conceitos básicos sobre datas no PHP e um pouco de criatividade você consegue gerar datas recursivas no PHP

No exemplo abaixo, vou pegar as próximas 10 datas a partir de hoje, com uma periodicidade de 15 dias e colocar no array $myDates;

$lastDate = date('Y-m-d');
$myDates = array();
for ($x=0; $x<=10; $x++){
  $myDates[] = $lastDate;
  $lastDate = date('Y-m-d', strtotime($lastDate . ' +15 days'));
}

Recursividade de datas por período

Indo um pouco mais longe, você pode fazer seleções de datas dentro de janela de tempo usando quase a mesma lógica – mas deve tomar cuidado para não gerar loop infinito no seu código.

No exemplo abaixo, quero retornar todas as datas a partir de hoje, contando de 15 em 15 dias, até a data limite de 4 de Dezembro.

$lastDate = date('Y-m-d');
$endDate = '2014-12-04';
$myDates = array();
$finished = false;
while(!$finished){
  $lastDate = date('Y-m-d', strtotime($lastDate . ' +15 days'));
  if(strtotime($lastDate) > strtotime($endDate)){ $finished = true; break; }
  $myDates[] = $lastDate;
}

Usando a mesma verificação do $endDate você pode configurar uma data inicial e uma final, selecionando apenas as datas dentro deste período.

Talvez existe algum método mais eficiente de fazer isso. Quando pesquisei sobre o assunto encontrei a biblioteca When, mas ela não era exatamente o que eu queria. 

Se você precisa saber quando serão as próximas Quarta-Feiras que irão cair em um dia 2 de Fevereiro, é a biblioteca para você, vale conferir. Se você optar pela When tome cuidado com os loops infinitos que ela pode gerar.

App nativa ou web app?

Uma das primeiras decisões que um time tem que passar no desenvolvimento de aplicativos mobile é se irão desenvolver um aplicativo nativo ou se irão desenvolver um aplicativo web para manter apenas uma versão para diversos dispositivos.

É uma decisão que pode ser bem complexa e a resposta mais correta depende muito das necessidades do seu aplicativo, do seu público e do time disponível. A apresentação abaixo mostra alguns pontos interessantes que podem influenciar na decisão.

[slideshare id=16148972&doc=appceleratorhtml5prezfinal-130123232125-phpapp02]

E como sempre, vale lembrar que não existe “bala de prata”.

Palestra sobre responsive design

Este ano graças a indicação do Daniel Filho (uma das personalidades mais influentes no mercado de front-end nacional que odeia este título que o acompanha) tive a oportunidade de palestrar no Campus Party (e tinha esquecido de compartilhar isso no blog!).

Falei um pouco sobre responsive design sem mimimi, se vocês conseguirem me acompanhar correndo pelo palco perceberão que tentei abordar alguns temas que considero importante no assunto:

  • Vantagens e desvantagens do responsive design
  • Qual o impacto do responsive design para os usuários?
  • Qual o objetivo do responsive design?
  • Qual o custo do responsive design
  • Qual a melhor forma de pensar em design responsivo?

Vídeo da palestra sobre responsive design

Aqui tem o vídeo e mais abaixo os slides da apresentação.

[http://www.youtube.com/watch?v=piXlBkzrSeM]

Correções:

  • em 5:20 falei em aplicar folha de estilos para dispositivos e isso é tudo que o design responsivo não é, eu queria dizer resoluções   

Encontrou mais alguma canelada? Comenta aí para eu atualizar o post.

Slide sobre responsive design

[slideshare id=16342889&doc=responsivedesign-130204092612-phpapp01]

Gostou? Compartilhe!

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?