Últimos artigos

dos2unix no osx

Basta executar o comando abaixo com seu respectivo arquivo de origem e destino que essa regex converte o ^M por /r/n

perl -pe ‘s/\r\n|\n|\r/\n/g’ inputfile > outputfile

Como procurar e alterar um texto em diversos arquivos no linux

Com o simples comando ele busca e altera todos os termos para o termo que você precisa.

find /path -type f -exec sed -i ‘s/oldstr/newstr/g’ {} \;

Para adicionar uma string no início de cada linha:

perl -pe ‘s/^/stringnova/g’ t.csv > t.csv

Bolo Formigueiro

Fiz esse bolo semana passada e ficou bom, podia ter ficado melhor se não tivesse colocado o coco ralado que a receita pediu, mas é vivendo e aprendendo

Ingredientes para Massa

4 – colheres de sopa de margarina
1 1/2 – copo de açúcar
4 – ovos (claras em neve)
2 – copos de farinha de trigo
1 – copo de leite
100g – chocolate granulado
100g – coco ralado
1 – colher (sopa) de fermento em pó

Modo de Preparo

1. Bata as claras para fazer as claras em neve
2. Bata a manteiga e o açúcar até fica cremoso, junte as gemas e continue batendo.
3. Acrescente o leite e os demais ingredientes.
4. Por último, acrescente as claras em neve, mexendo delicadamente.
5. Leve para assar em forno quente.
6. Faça uma cobertura de chocolate se preferir.

image

image

image

image

image

image

Bolo Gelado

Pessoal, nesse final de semana inventei fazer um bolo gelado a pedido da Bianca lá do janamesa.

Essa receita é muito simples e fácil de fazer. Basta fazer na ordem que a receita manda. O único ponto de atenção é a temperatura do forno, eu deixei o forno com 150 graus mas o fundo do bolo ficou um pouco queimado. Tirando esse detalhe o bolo ficou bem molhado… não sei se quiseram me incentivar mas todos me elogiaram!!! eheheehehe

Ingredientes para a massa
4 – ovos
2 – xícaras de açúcar
3 – xícaras de farinha de trigo
1 – copo de suco de laranja
1 – colher de sopa de fermento em pó

Ingredientes para a cobertura
1 – garrafa de leite de coco
1 – garrafa de leite (utilize a mesma garrafa do leite de coco como medida)
1 – lata de leite condensado
1 – pacote de coco ralado sem açúcar

Modo de preparo da massa
1. Na batedeira bata as claras em neve
2. Acrescente o açúcar e bata por mais uns 3 minutos
3. Coloque as gemas, o trigo, o suco e continue batendo até formar uma massa homogênea
4. Por último ponha o fermento, bata por mais 40 segundos na menor velocodade da batedeira
5. Despeje a massa numa forma média e untada
6. Asse em forno pré-aquecido em temperatura média por aproximadamente 40 minutos ou até dourar

Modo de preparo da cobertura
1. Misture bem numa tigela o leite de coco, o leite e o leite condensado.
2. Quando o bolo estiver assado e ainda quente, despeje a corbetura sobre ele.

Veja algumas fotos que tirei enquanto eu fiz o bolo!!!
image

image

image

image

Bolo de Limão

Pessoal, segue uma receita de bolo de limão que eu fiz e deu certo, recomendo!!!

Em uma tarde de domingo chuvosa ficar sentindo cheiro da vizinha fazendo bolo não dá né?! Então resolvi fazer um de limão, a Manu disse que nem ela faz melhor! A cobertura esta na metade pra agradar a todos! Heheehehe e não é de caixinha!! Mó orgulho de m

Uma dica é preparar todos os pré-requisitos antes de começar a bater a massa e se for usar açucar light ou dietético coloque menos que a receita recomenda porque esses açucares adoçam mais com menos!!

Me mandem os resultados e as fotos que eu publico aqui!!

Para a massa:
Ingredientes:
3 xícaras (chá) de farinha de trigo
2 colheres (chá) de fermento em pó
1/2 colher (chá) de sal
200g de manteiga em temperatura ambiente
2 xícaras (chá) de açúcar
4 ovos
1 xícara (chá) de leite
Raspas de 2 limões
Manteiga e farinha de trigo para untar e polvilhar

Modo de preparo:
-Preaqueça o forno a 180ºC (temperatura média).
-Unte com manteiga uma fôrma de bolo, com furo no meio. Procure fazer uma camada fina e uniforme, de preferência, usando um pincel. Polvilhe com farinha de trigo e bata bem para retirar o excesso.
-Passando pela peneira, coloque a farinha, o fermento e o sal numa tigela.
-Na batedeira, coloque a manteiga em temperatura ambiente e bata até que fique fofa.
-Adicione o açúcar e bata apenas para misturar.
-Junte os ovos, um a um, batendo bem entre cada adição.
-Se a massa ficar com uma aparência talhada, não se assuste: é assim mesmo.
-Diminua a velocidade da batedeira e adicione os ingredientes peneirados aos poucos, alternando com o leite.
-A cada adição, bata apenas para misturar. Quando a massa estiver bem lisa, desligue a batedeira.
-Adicione as raspas de limão, misture com uma espátula.
-Transfira a massa para a fôrma preparada.
-Para nivelar, o truque é girar a fôrma rapidamente sobre a mesa.
-Leve ao forno preaquecido para assar por cerca de 45 minutos. Espete um palito no bolo para verificar o ponto: se sair sujo de massa, deixe assar mais um pouco; se sair limpo, está no ponto.
-Retire o bolo do forno e deixe esfriar por 10 minutos, antes e virar. Bolo muito quente costuma rachar. Na hora de virar, coloque um pano de prato sob a fôrma; coloque o prato que for usar sobre o bolo; com auxílio do pano (para não se queimar), vire a fôrma de uma vez.

Para o glacê:
Ingredientes:
1 xícara (chá) de açúcar confeiteiro
2 colheres (sopa) de suco de limão peneirado
uModo de preparo:/u
Em uma tigela, coloque o açúcar de confeiteiro, passando por uma peneira para ficar bem soltinho. Misture o suco de limão rapidamente e espalhe sobre o bolo. Depois de um tempo, o glacê endurece.

Para o creme de chantilly:
Ingredientes:
500ml de creme de leite fresco
2 colheres (sopa) de açúcar
Modo de preparo:
O creme de leite fresco bate mais fácil quando está bem gelado. Se quiser, leve ao congelador uns minutos antes de colocar na batedeira. Junte o creme de leite com o açúcar e bata na batedeira, até engrossar.

 

Como proteger seu OSX 10.7 com senha

Procurei em diversos blogs como colocar uma senha para que outras pessoas não fuçassem em meus e-mails e arquivos enquanto saio para o almoço ou reunião. Finalmente encontrei como fazer isso de uma forma bem fácil. Abaixo descrevo passo a passo como fazer:

– Vá a maçazinha do lado esquerdo superior (Apple menu) e clique em “Preferências do Sistema”.
– Com a preferências do sistema aberta clique em “Usuário e grupos”.
– Clique em “Opç. In. de Sessão”, se a opções estiverem desabilitadas clique no cadeado e informe a senha do administrados, sem essa senha você não tem como alterar essa nem as próximas configurações. Mas quando as opções estiverem habilitadas, na opção “Início de sessão automático:” selecione “Desativado”. Isso fará com que o sistema operacional solicite a senha do usuário ao ligar o computador.
– Com a “Preferências do sistemas” ainda aberta, clique em “Mostrar Tudo” para voltar as opções novamente.
– Selecione em “Segurança e Privacidade” e selecione o “Exigir senha para repouso e protetor de tela”. Eu escolhi a opções “após 1 minuto”, pois se por acaso eu estiver em uma apresentação e a proteção de tela iniciar não quero ter o trabalho de ter que digitar a senha.
– Como não quero ficar esperando 1 minuto toda vez que eu for almoçar ou para uma reunião, existe uma forma de colocar um menu na barra superior. Vá em “Aplicativos” -> “Utilitários” -> “Acesso a Chaves”. No aplicativo “Acesso a Chave” vá em preferencias e selecione “Mostrar o estado da chave na barra de menus”. Isso fará aparecer um cadeado na barra de menu, através desse icone você pode bloquear seu computador e sair tranquilo que ao voltar não terá uma surpresa que algum engraçadinho envio e-mail para toda a empresa convidando para uma churrascada!! 🙂

Abraços e até a próxima.

Magento: permiti outros tipos (pdf, txt, js, …) de arquivos em editor WYSIWYG

O editor WYSIWYG integrado ao Magento é bem completo e já vem por padrão em na instalação Magento, mas precisa de uma forma para a configurar. Tive um bom trabalho para descobrir como fazer e principalmente como fazer de forma correta.

Em resumo, para personalizar essa funcionalidade precisamos criar dois arquivos, um config.xml com a configuração que precisamos adicionar e um outro xml que faz com que o Magento carregue a nova configuração.

Arquivos de configuração

Crie o arquivo: app/code/local/Namba/WysiwygFiles/etc/config.xml o código abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <modules>
    <Namba_WysiwygFiles>
      <version>1.0.0</version>
    </Namba_WysiwygFiles>
  </modules>
  <adminhtml>
    <cms>
      <browser>
        <extensions>
          <allowed>
            <jpg>1</jpg>
            <jpeg>1</jpeg>
            <png>1</png>
            <gif>1</gif>
            <pdf>1</pdf>
          </allowed>
        </extensions>
      </browser>
    </cms>
  </adminhtml>
</config>

Essa configuração acima fara com que o Magento permita fazer upload de arquivos PDF. O arquivo original você deve encontrar em app/code/core/Mage/Cms/etc/config.xml

Arquivo de Modulo

Criar o arquivo: app/etc/modules/Namba_WysiwygFiles.xml com o código abaixo:

<?xml version="1.0"?>
<config>
  <modules>
    <Namba_WysiwygFiles>
      <active>true</active>
      <codePool>local</codePool>
    </Namba_WysiwygFiles>
  </modules>
</config>

Isso fará com que o módulo fique habilitado e reconheça o novo arquivo de configuração.

Comando para monitorar arquivos acessados e modificados no filesystem

Pessoal,

Segue uma dica para procurar por arquivos modificados e até acessados no filesystem.

inotifywait -mr –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w %f %e ‘  / | grep -v “/dev/”

Usem o “grep” –v “xxxx” para filtrar o que precisarem.

Padrão de Projetos – Decorator

Alguns amigos meus me disseram que nos artigos relacionados aos Design Patterns venho me estendendo em explicações e modelos. Para não tornar os artigos longos e sonolentos pretendo ser mais breve e pontual.

Nome: Decorator

O Padrão de Projeto Decorador é o mais adequado para aplicar pequenas alterações ou modicar partde de um conteúdo de um objeto ou funcionalidade sem modificar a estrutura original do objeto.

UML

Design Pattern Decorator (Cd)
Code Example

Neste exemplo, a aplicação é para processar compact discs (CDs). Isto deve ter um método para adicionar as faixas de CD e uma maneira mostrar todas as músicas de um CD. O cliente especificou que o a lista de música do CD deve ser mostrada em uma única linha prefixada pelo número da música.

class CD {

public $trackList;

public function __construct() {

$this->trackList = array();

}

public function addTrack ($track) {

$this->trackList[] = $track;

}

public function getTrackList() {

$output = ”;

foreach ($this->trackList as $num=>$track) {

$output .= ($num + 1)  . ” – {$track}.  “;

}

return $output;

}

}

A class CD contém uma variável pública chamada $trackList, que guarda um array das faixas adicionadas no objeto CD. O construtor inicializa esta variável. O método addTrack() simplismente adiciona uma faixa ao array trackList do objeto CD. Finalmente, o método getTrackList() executa um loop em cada faixa do CD e gera a simples “string” contendo as faixas e seus respectivos números conforme a solicitação do cliente.

Para usar este objeto CD, basta executar o código abaixo:

$tracksDeUmaFonteExterna = array (‘What It Means’, ‘Brr’, ‘Goodbye’);

$myCD = new CD();

foreach ($tracksDeUmaFonteExterna as $track) {

$myCD->addTrack ($track);

}

echo $myCD->getTrackList();

Isto funciona perfeitamente para este exemplo. No entando, os requisitos tiveram uma pequena modificação. Agora, as faixas que são retornadas do objeto precisam estar em caixa alta só no retorno de algumas instancias. Modificar o objeto original não é a melhor prática nem criar um nova classe com relacionamento de herança para cada pequena alteração do objeto original CD. Para isso o Design Pattern Decorator será criado.

class CDTrackListDecoratorCaps {

private $__cd;

public function __construct (CD $cd) {

$this->__cd = $cd;

}

public function makeCaps () {

foreach ($this->__cd->trackList as &$track) {

$track = strtoupper($track);

}

}

}

A classe CDTrackListDecoratorCaps é muito simples. O método __construct() simplismente adiciona a instancia da class CD em um atributo interno private chamado $__cd. Em primeiro momento você pode achar que não é possível modificar o conteúdo do objeto CD por um verdadeiro objeto Decorator, mas o PHP manipula objetos por referencia o que torna isso possível. Embora a instância seja guardada em um atributo interno e privado, qualquer alteração dele imediatamente está disponível no código.

Veja o exemplo da utilização do Decorator na classe CD.

$myCD = new CD();

foreach ($tracksDeUmaFonteExterna as $track) {

$myCD->addTrack($track);

}

$myCDCaps = new CDTrackListDecoratorCaps($myCD);

$myCDCaps->makeCaps();

echo $myCD->getTrackList();

Somente duas linhas no código principal foram necessárias para aplicar a alteração solicitada. A primeira linha é a criação do objeto passando o Objeto CD como parametro, e a segunda linha a execução do makeCaps() o qual efetua a alteração do objeto CD.

Para fazer pequenas modificações no conteúdo ou em alguma funcionalidade existente sem alterar a estrutura dos objetos originais o Design Pattern Decorator deve sempre ser utilizado.

Padrão de Projeto – Builder

A complexidade de um software é bem interessante. Os requisitos de uma aplicação são complexos como as funcionalidades e equivalentes  ao código que é gerado para construir as funcionalidades. O objetivo do Design Pattern Builder é abordar a criação de modo a favorecer a manutenabilidade, uma arquitetura integra e reduzir a complexidade. Com a quantidade de objetos complexos que compõem a maioria dos repositórios de software, uma solução é o Design Pattern Builder facilita trabalhar com eles.

Name: Builder

O Design Pattern Builder define a arquitetura de um objeto para manipular a criação de objetos complexos.

Problema e Solução

Quando uma classe é instanciada, tecnicamente gera um objeto completo. Alguns objetos tem seu escopo bem definido e podem sem usados e propagados para outros objetos. Mas existem objetos mais “complexos” que necessitam a execução de alguns outros métodos publicos para que seu objeto seja considerado “completo”.

É importante intender que quando me refiro a “complexo”, digo no contexto da quantidade de passos, métodos, que são necessários serem executados para montarmos um objeto com todas as suas caracteristicas.

Quando um objeto “complexo” é escrito, uma arquitetura comum gira em torno do método construtor. Alguns desenvolvedores acreditam que a lógica de toda a criação de um objeto deve estar contida no construtor. Outros reconhecem que faz mais sentido distribuir a lógica em vários métodos adicionais. Nenhuma destas soluções são muito flexíveis. Na verdade, eles são fundamentalmente uma solução errada.

Pode ser que seja necessário o construtor gerar um objeto baseado em uma regra de negócios. Neste caso em particular, as regras de negócios já devem ter sido escritas e testadas. Pois somente parte do objeto será definida. De fato, se todas as partes estiverem completamente definida, pode causar outros resultados imprevisíveis, pois a regra de negócio pode gerar um resultado errado.

UML

O diagrama detalha um Design de Classes utilizando o Design Pattern Builder

Design Patter Builder

Design Patter Builder

 

Exemplo de Código

Este projeto contém uma classe que cria um objeto complexo de produto. Essa classe contém três métodos necessários para tornar o objeto completo. Se um dos métodos não for chamado quando o objeto for criado, a classe não estará completa, faltando atributos a serem definidos o que pode gerar algum tipo de erro durante o processo de execução da aplicação. Os métodos que me refiro são os setTipo(), setCor() e setTamanho(). A versão inicial deste código foi desenhado para que a criação seja seguida da execução deste métodos.

class produto {

protected $_tipo = ”;

protected $_tamanho = ”;

protected $_cor = ”;

public function setTipo ($tipo){

$this->_tipo = $tipo;

}

public function setTamanho ($tamanho){

$this->_tamanho = $tamanho;

}

public function setCor ($cor) {

$this->_cor = $cor;

}

}

Para criar um objeto completo de  Produto é necessário definir toda a configuração individualmente por cada um dos métodos da classe Produto.

// a nós recebemos a nossa configuração do produto por alguma outra funcionalidade;

$produtoConfiguracao = array(‘tipo’=>’shirt’, ‘tamanho’=>’XL’, ‘cor’=>”vermelho”);

$produto = new  Produto();

$produto->setTipo($produtoConfiguracao[‘tipo’]);

$produto->setTamanho($produtoConfiguracao[‘tamanho’]);

$produto->setCor($produtoConfiguracao[‘cor’]);

Neste caso precisamos chamar cada um destes métodos quando o objeto é criado, isso não é uma boa prática. Entretanto um objeto deve ser baseado no Design Pattern Builder para a criação da sua instancia para seguir as boas práticas.

A classe produtoBuilder é arquitetada pra aceitar as opções de configuração necessárias para gerar um objeto completo de Produto. O produtoBuilder armazena todas as opções de configuração e uma instancia da classe de Produto. O método build() é responsável por chamar cada método do objeto Produto e assim gerar um objeto completo. Finalmente o método getProduto() retorna o objeto Produto gerado pelo build().

class produtoBuilder {

protected $_produto = null;

protected $_configuracao = null;

public function __construct ($configuracao){

$this->_produto = new produto();

$this->_configuracao = $configuracao

}

public function build () {

$this->_produto->setTamanho($this->_configuracao[‘tamanho’]);

$this->_produto->setTipo($this->_configuracao[‘tipo’]);

$this->_produto->setCor($this->_configuracao[‘cor’]);

}

public function getProduto(){

return $this->_produto;

}

}

Observe que o método build() executa todas as chamadas necessárias para a criação completa de uma instância do objeto Produto. Se no futuro a classe produto sofrer alguma alteração, somente o método build() da classe produtoBuilder deverá ser alterado. O código abaixo demonstra como é a criação de um objeto Produto usando a classe produtoBuilder.

$builder = new produtoBuilder($produtoConfiguracao);

$builder->build();

$produto = $builder->getProduto();

O Design Pattern Builder eliminou a construção complexa do objeto Produto. O Design Pattern Builder não é a única boa prática para isso, mas ajuda a reduzir as chances que as alterações corriqueiras em objetos complexos necessitem uma avaliação de todos os pontos que deverão ser alterados.