segunda-feira, 19 de setembro de 2016

Dica Rápida - Virtual Host - Apache

Quando for configurar um virtual host no Apache atente-se para o seguinte detalhe:

# Apache 2.2
Order Deny,Allow
Allow from all

# Apache 2.4
Require all granted

Caso utilize a configuração errada, você terá uma bela tela de acesso proibido (403 Forbidden).

terça-feira, 5 de abril de 2016

Dica Rápida - PHP

Não é necessário utilizar a constante "DIRECTORY_SEPARATOR" para escrever um código portável Windows/Linux, basta utilizar esta barra /! Isso mesmo, simples e sem enrolação, as funções que dependerão deste path irão se virar nos trinta e entregar o resultado esperado!

Exemplo:

De:
$path = 'meu' . DIRECTORY SEPARATOR . 'diretorio' . DIRECTORY_SEPARATOR . 'anexos' . DIRECTORY_SEPARATOR;

Para:
$path = 'meu/diretorio/anexos/';

Referência:
Dá uma lida no primeiro comentário (9 anos):
http://us2.php.net/manual/en/ref.filesystem.php

quarta-feira, 24 de fevereiro de 2016

Dojo - Nuvem de Cinzas

Há bastante tempo tentei resolver um DOJO que encontrei no site DojoPuzzles, confira a seguir o resultado deste código mofado:

O Problema

"Nuvem de Cinzas"

Um vulcão acaba de entrar em erupção, provocando uma nuvem de cinzas que se alastra impedindo a circulação aérea. O governo está muito preocupado e deseja saber quando que a nuvem de cinzas irá atingir todos os aeroportos do país.

Está disponível um mapa detalhando a situação atual. O mapa é retangular, dividido em pequenos quadrados. Neste mapa existem três tipos de quadrados: nuvem (indicando que esta região do mapa já está coberto por nuvens), aeroportos (indicando a localização de um aeroporto) e todas as outras (indicando locais onde a nuvem ainda não chegou).

A cada dia, a nuvem expande-se um quadrado na horizontal e um quadrado na vertical. Ou seja, ao fim de cada dia, todos os quadrados adjacentes (vertical ou horizontalmente) a uma nuvem, também passam a conter nuvens. Por exemplo:
. . * . . . * *      . * * * . * * *     * * * * * * * *
. * * . . . . .      * * * * . . * *     * * * * * * * *
* * * . A . . A      * * * * A . . A     * * * * * . * *
. * . . . . . .      * * * . . . . .     * * * * . . . .
. * . . . . A .      * * * . . . A .     * * * * . . A .
. . . A . . . .      . * . A . . . .     * * * A . . . .
. . . . . . . .      . . . . . . . .     . * . . . . . .
     Dia 1                Dia 2               Dia 3
Para preparar os planos de contingência, o governo necessita saber: quantos dias demorará para ao menos um aeroporto ficar coberto pelas nuvens e daqui quantos dias todos os aeroportos estarão cobertos pelas nuvens.

Dados um quadriculado com L linhas e C colunas, além da indicação inicial das nuvens e dos aeroportos, desenvolva uma programa que informe o número de dias até um primeiro aeroporto ficar debaixo da nuvem de cinzas e o número de dias até que todos os aeroportos ficarem cobertos pelas cinzas.

*( Fonte 1 / Fonte 2 )

A Solução

Classe Main


Classe Simulator


Classe Base


Classe Point


Enum PointType


Resultado

O primeiro aeroporto fecha no terceiro dia e todos fecham no quinto dia!

O projeto encontra-se no Github:
https://github.com/devbrunocorrea/dojo-ash-cloud 

Mas e aí? A solução é válida? O código fede? Tem outra melhor? Manda aí!

sexta-feira, 5 de fevereiro de 2016

Design Pattern - Strategy

O conceito de estratégia, em grego strateegia, em latim strategi, em francês stratégie... Os senhores estão anotando? Vou pedir isso na prova. ...em inglês strategy, Em alemão strategie, em italiano strategia, em espanhol estrategia...

Segundo o GoF, a intenção do padrão Strategy é definir uma família de algoritmos, encapsular cada uma delas e torná-las intercambiáveis, permitindo assim que o algoritmo varie independentemente dos clientes que o utilizam.

Características:
- Define vários algoritmos;
- Encapsula cada um deles;
- Permite a troca de algoritmo independente do cliente.

O que eu ganho com isso?
Consigo criar novas estratégias a hora que eu quiser, sem ter que reescrever tudo ou  inserir mais um "if".

Onde eu aplico?
- Quando possuir diversas classes relacionadas que diferem somente no seu comportamento;
- Precisar variar um algoritmo;
- Um algoritmo usa dados que o cliente não precisa conhecer.
- Uma classe com muitos comportamentos e condicionais.

Benefícios:

- Evita o uso excessivo de condicionais.
- Permite expansão de maneira amigável.
- Desfruta dos prazeres da OO.

Prejuízos:
- Muitos objetos!
- Pode "sobrar" informações da interface.

 Mão na Massa

Strategy Pattern in UML (Wikipedia)

Conforme ilustra o diagrama de classe acima, o padrão de projeto Strategy funciona da seguinte maneira:

Dentro de um determinado contexto, você irá trabalhar com uma interface, desconhecendo a implementação, de maneira que diversas implementações possam ser realizadas. Como assim?

Elaborei a seguinte situação para tentar aplicar e exemplificar o Strategy:

Há uma banda, onde cada músico toca um instrumento, cada instrumento possui a sua maneira de emitir som, por este motivo, o "algoritmo de como emitir som" estará encapsulado em cada instrumento, e o músico necessitará apenas "tocar" este instrumento.

Para concretizar esta implementação necessitaremos dos seguintes ingredientes:

1 Interface:
N Classes que implementem a Interface em questão;
1 Contexto utilizando métodos da Interface;
Misture tudo e leve ao fogo alto!
Beleza, mas e agora?
Agora nós podemos adicionar novos instrumentos sem grandes dificuldades, basta que cada instrumento implemente a interface "Instrumento Musical", com isso a classe "Músico" se mantém intacta e consegue tocar qualquer instrumento que implemente a interface em questão.

Fechou o caneco? Estou aprendendo, portanto se houver algo de errado, mande brasa e vamos corrigir juntos esta bagaça!

terça-feira, 26 de janeiro de 2016

Orientação a Objetos e SOLID para Ninjas - Projetando classes flexíveis

Excelente livro, com conteúdo relevante destinado a aprimorar conhecimentos ligados ao paradigma de Programação Orientação a Objetos, com foco nos cinco princípios conhecidos pela sigla SOLID, complementado pela introdução a respeito de code smells e métricas de códigos.
Orientação a Objetos e SOLID para Ninjas - Maurício Aniche

Guia do Mestre Programador - Pensando como pirata, evoluindo como Jedi

Trata-se de um ótimo livro, leitura rápida e amigável, com conteúdo bastante relevante a todos os profissionais que almejam evoluir em sua carreira como desenvolvedor de software. Não é um livro técnico, apesar de possuir pequenas dicas técnicas, na verdade como o próprio título diz é um guia, e neste guia há uma lista de conhecimentos e direções que um programador deve seguir para alcançar um alto nível de profissionalismo e assim se tornar um Mestre Programador. Recomendo a leitura.

Guia do Mestre Programador
Pensando como pirata, evoluindo como Jedi
Carlos Bueno
Guia do Mestre Programador - Carlos Bueno

Hello World

Hello World