Consegui hoje recuperar dados que estavam cadastrados no meu antigo blog, que saiu do ar sem deixar notícias por quase um ano, por conta de algumas redefinições do provedor de hospedagem gratuita. Por isso, não se impressionem pela quantidade de publicações que apareceram de uma vez só. Movi todas elas aqui para este novo provedor que está muito melhor que o anterior em termos de velocidade.
FreeBSD 8.0 como workstation (notebook/desktop)
Esta semana finalmente foi lançada a tão esperada versão 8.0 do FreeBSD (após 3 release candidates).
Como eu já vinha algum tempo brincando com os RCs, resolvi baixar logo o release (mesmo antes do anúncio oficial) e repreparar meu notebook para uso como minha estação de trabalho. Algumas das coisas que fiz, valem para todos os usuários que querem utilizar o FreeBSD através de alguma interface gráfica, no nosso caso o Gnome 2.26. O KDE 4 também está presente, mas minhas experiências com ele não foram das mais agradáveis, muitos crashs inexperados, o que me desestimulou a utilizá-lo como ambiente X.
O mini tutorial a seguir tem como objetivo deixar o FreeBSD com a cara mais desktop possível. Para isso utilizei e criei vários temas e papéis de parede a fim de deixar o ambiente o mais agradável possível, além de colocar aplicações básicas. O resultado final é:
1 – FreeBSD com splash
2 – Placa de som configurada
3 – Placa de wireless configurada
4 – GDM e Gnome 2.26 carregando automaticamente
5 – Login de root habilitado no X
6 – Java
7 – Firefox 3.5 com plugins de flash e java
8 – OpenOffice 3.1.1
Meu hardware especificamente me deixou um pouco decepcionado, mas é uma decepção que ocorre também com os Linux e o Windows 7 – por algum motivo, o driver de video de nenhum deles funciona do jeito que deveria. Com o FreeBSD, minha opção foi usar o driver vesa com resolução de 1280×768. Não é o ideal, já que minha resolução vertical é na verdade de 800, o que me dá uma leve deformidade, mas nada que impeça o uso, e bem melhor que usar 1024×768 (aí sim, se tem muita deformidade).
1 – Primeiro passo: obter o FreeBSD
Vá ao endereço http://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/8.0/ e selecione a versão que quiser. Eu utilizei a memstick, para boot via pen-drive, a fim de economizar mídias. Lembre-se: seu note tem que suportar boot via usb para usar esta imagem. Você pode baixar a bootonly se quiser e fazer a instalação via ftp (é meio lento, mas funciona!)
2 – Instale o FreeBSD
Eu sempre faço a instalação mínima, e depois vou instalando as coisas conforme necessidade. Isso me livra de um monte de pacotes que não uso. Há muuuuitos anos atrás, escrevi um tutorial sobre o básico da instalação, que pode ser encontrado aqui. A parte boa, é que FreeBSD muda muito pouco, e para fazer a instalação mínima você não encontrará muitas dificuldades.
http://wiki.softwarelivre.org/pub/PSLGO/RoteiroFreeBSD/how-to-freebsd.pdf
3 – FreeBSD com splash
Só funciona com a instalação para i386, as de 64 bits ainda não tiveram o módulo do kernel portado. Se você tem menos de 4Gb de ram, pode instalar a 32 bits e então configurar o splash forma explicada em
http://www.dicas-l.com.br/print/20060818.html
Existe um monte de artigos sobre como fazer isso na net, na verdade. Lembre-se apenas que a imagem deve ser 640×480 ou 800×600 ou 1024×768 com 256 cores. Se seu monitor for widescreen você pode criar uma imagem no formato wide, e então redefinir seu tamanho de forma assimétrica para 1024×768. O resultado fica muito bom.
4 – Placa de som configurada
A placa de som é a coisa mais simples do mundo de ser configurada, só que por não ser algo “automático” como nos Linux, muita gente acha que FreeBSD não tem suporte para som (em que mundo vivemos?!). Abra um terminal (você provavelmente ainda está no modo texto, então, só faça login como root) e edite o arquivo /boot/loader.conf acrescentando as linhas:
snd_driver_load=”YES”
snd_emu10k1_load=”YES”
Isto carregará todos os drivers disponíveis, permitindo que você descubra qual o driver correto da sua placa. Para descobrir o driver correto e carregar apenas ele, execute o seguinte comando:
# cat /dev/sndstat
Você receberá uma saída como a abaixo, onde o driver é o texto que destaquei em negrito, no meu caso, snd_hda.
FreeBSD Audio Driver (newpcm: 64bit 2009061500/amd64)
Installed devices:
pcm0: <HDA Realtek ALC268 PCM #0 Analog> at cad 0 nid 1 on hdac0 kld snd_hda [MPSAFE] (1p:3v/1r:3v channels duplex default)
pcm1: <HDA Realtek ALC268 PCM #1 Analog> at cad 0 nid 1 on hdac0 kld snd_hda [MPSAFE] (1p:1v/0r:0v channels simplex)
Agora, editamos novamente o /boot/loader.conf e trocamos a linha snd_driver_load=”YES” pela linha snd_hda_load=”YES”
5 – Rede wireless configurada
A configuração da rede wireless é um pouco mais “manual” que em outros sistemas. Basicamente é a edição de alguns arquivos de configuração, nada demais, não dói e nem morde.
Primeiro, precisamos saber qual sua placa de rede. Para isso, execute pciconf -l -v e veja se sua placa está listada. Descubra qual o nome do driver com um ifconfig (as interfaces que foram identificadas devem aparecer listadas). No meu caso, tenho uma Atheros e aparece listada como ath0.
Edite seu /boot/loader.conf e adicione o seguinte:
wlan_scan_ap_load=”YES”
wlan_scan_sta_load=”YES”
wlan_wep_load=”YES”
wlan_tkip_load=”YES”
wlan_ccmp_load=”YES”
wlan_xauth_load=”YES”
wlan_acl_load=”YES”
Isso fará com que os drivers necessários para o funcionamento de wireless no kernel sejam carregados.
Agora, edite o /rc.conf e adicione o seguinte:
wlans_ath0=”wlan0″
Após isto feito, você deve saber se sua rede wireless utiliza algum mecanismo de autenticação, e seguir as instruções em http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/network-wireless.html com uma pequena correção…
Depois de definir sua linha do ifconfig, ela não pode ser ifconfig_ath0 (meu caso no qual o NIC é ath), mas deve ser ifconfig_wlan0. O problema é que a documentação do site está desatualizada ainda, e por isso aquele pequeno detalhe do wlans_nic#=”wlan#” não está devidamente documentado.
No meu caso ficou assim meu rc.conf:
wlans_ath0=”wlan0″
ifconfig_wlan0=”WPA DHCP”
E tive que criar o arquivo /etc/wpa_supplicant.conf que ficou:
network={
ssid=”meussid”
psk=”minhasenha”
key_mgmt=WPA-PSK
}
6 – GDM e Gnome 2.26 carregando automaticamente
É tão simples… Apenas instale os pacotes (pkg_add -r gnome2 ou então do seu CD/DVD de instalação), e edite o ex.conf acrescentando
gnome_enable=”YES”
7 – Login de root habilitado no X
Eu não sei vocês, mas eu sempre me loguei como root no meu note. Porque? Porque sinceramente, eu sou o dono da minha máquina, e não uma política de segurança pré-estabelecida pelos desenvolvedores de uma GUI qualquer. Se eu posso logar como root no terminal (e espero que sempre possa!), então eu quero poder logar como root no meu X também. Só que quase todas as GUIs hoje em dia xaropam e te impedem de fazer isso. O que fazer então? Passar por cima! Por padrão, o login de root não é permitido, mas isso é possível através de uma simples configuração.
Como falamos do Gnome até o momento, a confguração será para ele.
Novamente, editando na mão, execute o seguinte comando (tem que ser como root):
# vi /usr/local/etc/gdm/custom.conf
Sob o item [security] coloque o seguinte (se não houver o item, crie!)
[security]
AllowRoot=true
PRONTO!!! Chega de sistemas que não te deixam ser root! Eu sei que há uma indicação de “nunca se logar como root”, mas sinceramente, essa indicação atende muito bem aos “distraídos” ou aos que não tem domínio sobre o que fazem. Um comportamento correto perante a máquina garante que não ocorram problemas.
8 – Java
Ah, o Java… Finalmente a Sun autoriza uma versão 100% FreeBSD! O pacote é conhecido como diablo, e pode ser obtido em http://www.freebsdfoundation.org/downloads/java.shtml.
A versão 7.0 funciona sem problemas no 8.0, então, divirta-se. Baixe o pacote e instale-o com o pkg_add.
9 – Firefox 3.5 com plugins de flash e java
Tudo é feito a partir do ports mesmo, então, vamos lá.
# cd /usr/ports/www/firefox35
# make install
Ou simplesmente
# pkg_add -r firefox35
Agora o java
# cd /usr/ports/java/diablo-jdk16 (pode ser o jre, mas eu precisava do jdk)
# make install
Alguns pacotes terão que ser baixados na mão mesmo, por isso, siga as instruções passadas e coloque os pacotes baixados manualmente no /usr/ports/distfiles. Um detalhe: eu deixei todas as opções desmarcadas para não ter que corrigir o port manualmente.
Você também pode baixar o pacote pré-compilado, mas com o Free 8 o pré-compilado do 7 não deu muito certo para mim…
Agora o Flash:
O Flash para Linux não está funcionando, não sei nem quero saber o porque (na verdade, eu suspeito que seja porque o plugin não funciona nem no Linux! Só temos o do Fedora 10 como mais atualizado, e lá parece que ele não funciona com o Firefox 3.5…, incompatibilidade de API, parece). Como resolver a questão então? Instale o Gnash! O Gnash é uma versão GNU para o Flash Player, e funciona a contento. Alguns sites podem não funcionar, mas a grande maioria funciona sem problemas.
# cd /usr/ports/graphics/gnash
# make install
Ou então
# pkg_add -r gnash
E pronto. A configuração do plugin é automática, não precisa se preocupar em configurar manualmente.
Ao final, para que os plugins sejam localizados, será necessário que os links simbólicos para eles sejam colocados manualmente. Isso porque o nspluginwrapper não está funcionando corretamente, informando que o plugin seria incompaível e tal. Ele cria o link simbólico em um local no qual o firefox não está localizando o plugin. Assim, é preciso fazer o seguinte:
# ln -s /usr/local/diablo-jdk1.6.0/jre/plugin/amd64/ns7/libjavaplugin_oji.so /usr/local/lib/firefox3/plugins/
10 – OpenOffice 3.1.1
Devido ao tamanho, complexidade, e quantidade de requisitos para a compilação, optei por instalar o pacote pronto. Para tanto, simplesmente vá ao site http://porting.openoffice.org/freebsd/, e baixe o pacote pronto. No meu caso, peguei o para a 8.0RC1, pois não há pacote pré-compilado para a versão 8.0 release ainda. Funcionou sem problemas (ok, encrencou com o Perl, porque o que vem é o 5.8 e ele pede o 5.10, mas um pkg_add –force permite a instalação sem ter que atualizar o Perl – embora eu recomende a atualização para evitar qualquer surpresa).
Conclusão
Configurar o FreeBSD para desktop não é algo tão automático quanto é com um Ubuntu da vida, mas não é nada que alguém com um pouco mais de dedicação não consiga fazer sem problemas.
Publicação original do artigo em: http://sanchez.sqweebs.org/site/?p=54
Navalha de Occam
A “navalha de ocam” (Occam’s Razor, em Inglês) é um principio filosófico que estabelece que se temos que escolher uma dentre muitas teorias, e não temos evidências que privilegiem alguma em relação a outras, então deveremos ficar com a teoria que requeira menos hipóteses, considerada assim, a mais simples.
A “navalha de ocam” também é conhecida como”Principio da Parcimônia” ou ainda como “Principio da Economia” (na gíria científica inglesa, jocosamente, costumam usar para isso a expressão “K.I.S.S.” (keep it simple, stupid) . A “navalha de ocam” pode ser resumida na seguinte versão:
“Para explicar algo, as entidades não devem ser estendidas além do que é necessário.”
Albert Einstein diz que que “tudo deve ser feito da forma mais simples possível, mas não mais simples que isso“, o que também é expresso por Antoine de Saint-Exupéry como: “a perfeição não é alcançada quando já não há mais nada para adicionar, mas quando já não há mais nada que se possa retirar”.
Com isso, o que se quer dizer é que devemos nos manter o mais simples o possível sempre. Mas manter-se o mais simples o possível não é necessariamente pegar a solução mais fácil ou o caminho mais curto. Atingir o grau de simplicidade que beire a perfeição pode tomar muito tempo. Mais tempo do que pensamos…
Alguns trechos deste texto foram retirados da Wikipedia
Tags: Filosofia
Publicação original do artigo em: http://sanchez.sqweebs.org/site/?p=42
Compatibilidade reversa: porque as pessoas não seguem?
Algo que me impressiona nas pessoas que desenvolvem bibliotecas por aí, é a falta de preocupação com a compatibilidade reversa… É triste não poder atualizar para uma versão mais atualizada de uma lib porque os métodos simplesmente foram substituídos, desmembrados ou simplesmente rebatizados.
Não é nada difícil em qualquer um desses casos, manter o método original fazendo as devidas chamadas para os novos métodos desmembrados ou algo assim, mas é inconcebível situações como a que passo hoje no trabalho: a seleção por uma biblioteca de ORM (não é a minha, e não vou citar qual por questões éticas) em uma determinada versão simplesmente estagnou todo o desenvolvimento. É impossível agora atualizar sem ter que reescrever quase todas os controles das 15 aplicações utilizadas na instituição! O volume de retrabalho é inaceitável em termos de produtividade.
Mesmo o PHP, antes de eliminar ou rebatizar, deixa durante várias versões as funções ainda lá, com o aviso de que não devem ser utilizadas, que devem ser migradas para as novas, etc e tal, mas elas ainda estão lá! Você tem todo o tempo do mundo para se atualizar. Já neste caso não!
Porque os desenvolvedores não podem seguir o exemplo e criar suas libs com a compatibilidade reversa em mente? Manter a vida de todos simples ajuda a expandir o uso da linguagem. Agora, se eu for usar uma linguagem ou lib que muda o tempo todo de idéia sobre o que quer, então é melhor eu não usá-la e buscar outra solução…
Publicação original do artigo em: http://sanchez.sqweebs.org/site/?p=41
Dica simples: mensagens a full!
Dica simples: mensagens a full!
Sempre que programar em PHP, configure o ambiente para mostrar absolutamente TODAS as mensagens de erro existentes e possíveis no seu php.ini.
Porque? Porque notices estão lá não para ser um inconveniente, mas para te avisar que pode-se fazer melhor! Um exemplo bem simples: a cada variável não inicializada, o PHP precisa primeiro verificar se há registro dessa variável, se não houver, registrá-la, e então inicializá-la com valor nulo. Se você inicializa a variável você reduz 2 itens desse passo a passo. O ganho de performance pode parecer insignificante, na casa dos nano-segundos, mas depois de algumas centenas de variáveis não inicializadas em um ambiente com alguns milhares de usuários simultâneos, cada nano-segundo perdido faz toda a diferença…
Esse é só um pequeno exemplo.
Um código deve ser 100% livre de quaisquer mensagens emitidas pela engine do PHP. Não devem ocorrer nenhum Notice, Warning, ou qualquer coisa do gênero.
Dica simples, mas que quase nunca é seguida…
Publicação original do artigo em: http://sanchez.sqweebs.org/site/?p=37
Registry Pattern – Livrando-se de variáveis globais no estilo OO
Um dos maiores problemas de vários códigos de PHP que encontramos por aí (inclusive em libs famosas) está no uso de variáveis globais. Variáveis globais podem ser acessadas e alteradas em qualquer ponto do código. Embora o acesso seja algo importante, a alteração é que representa o perigo maior. E o que representa ainda um perigo maior é a falta de originalidade na escolha de nomes para variáveis globais dos programadores. Exemplos perigosos: $flag, $db, $test, etc. Já me deparei com 2 libs que entraram em colisão por utilizarem uma global com o mesmo nome. Uma sobrepunha o controle de flag da outra.
A questão é que muitas vezes precisamos registrar uma variável em algum ponto, que deve ser compartilhada e acessada por diversos outros pontos de nossas libs ou sistemas. Como resolver então este problema (sem usar a sessão!).
A solução é simples: criando uma classe abstrata para registro de variáveis. Simples, não?
Esta solução foi implantada em primeiro momento na POP – Persistent Objects for PHP, e não me lembro de ter me deparado com ela ainda em outro código PHP. Com certeza, alguém já o fez, ou faz, ou algo assim, e de repente já até existe um nome melhor para a implantação desse padrão, para essas pessoas que já conhecem ou já usam tal técnica eu não estou contando nenhuma novidade, mas para muitos outros isso ajudará bastante.
No caso da POP, foram criados diversos registros diferentes, para fins distintos. O primeiro dele foi a POPDB, registro de conexões de bancos de dados. Originalmente, a POP buscava uma única conexão definida em uma variável global. Isso era horrível! Assim, foi criada uma classe para criar e registrar as conexões, que podem ser obtidas a qualquer momento, mas de maneira clara, e com menor risco de sobreposição. Claro, se alguém registrar uma nova conexão com um nome pré-existente, a conexão será sobrescrita, mas fica mais difícil alguém fazer isso agora, pois a chamada para sobrescrita é muito explícita (POPDB::setConnection). Outro registro criado na POP é o POPDriverRegistry, utilizado para (adivinha?) registrar os drivers de conexão utilizados pela POP.
Ok, muito bonito na teoria. Mas e na prática? Como criar uma classe desse tipo?
Uma classe abstrata de uso geral é simples, mas cai no mesmo problema da variável global: nomenclatura.
A primeira coisa a fazer então é pensar em um nome, um nome único, que garanta que não será acidentalmente redefinido em outra lib (nesse caso você teria um Fatal Error, o que gritaria a você que não foi um bom nome).
Nomes ruins são nomes muito genéricos como Registro, Registry, Reg, etc. Tente colocar o nome da sua lib junto. Ou sigla dela, ou prefixo utilizado, enfim, algo que a torne única no contexto de seu sistema.
Depois disso, a criação é simples, você precisa apenas de 2 métodos inicialmente: os clássicos set e get, e sua classe terá apenas um atributo privado, que será o registro em si.
Vide abaixo o exemplo para melhor compreensão.
<?php
abstract class MyLibRegistry
{
static private $registry = array();
public function set($name, $value)
{
self::$registry[$name] = $value;
}
public function get($name)
{
return self::$registry[$name];
}
}
?>
O uso é tão simples quanto parece:
<?php
MyLibRegistry::set(”variavel”, “valor”);
MyLibRegistry::set(”objeto”, $objeto);
?>
E por aí vai…
Publicação original do artigo em: http://sanchez.sqweebs.org/site/?p=116
HIPER – Uma proposta de revisão da MVC
O MVC é um do padrões de design mais utilizados em TI atualmente, porém uma revisão e redefinição do mesmo se faz importantíssima. Porque? Porque é um conceito com muita margem a interpretações errôneas e dispersas, causando um zilhão de discussões ao redor do mundo que não deveriam ocorrer com um padrão bem definido. A idéia de divisão em camadas, obviamente, é ótima! Mas a conceitualização feita pelo MVC é que é a bomba que já explodiu faz é tempo.
Minha proposta não é o fim do padrão de desenvolvimento em camadas, mas uma melhor definição do mesmo. É o seccionamento mais diferenciado do que vai em cada camada para evitar a confusão eterna que causa tantas más implementações do MVC. Muitos dos que usam não sabem, mas estão trabalhando com um conceito de 1979 quando trabalham com MVC. Isso mesmo, são 29 anos, e nenhuma revisão sobre o padrão.
O problema principal do MVC é a conceitualização do que é Model, e do que é Control. Muitas pessoas acham que o fluxo da aplicação não é parte do processo do negócio, e jogam tudo na Model, e muitos entendem que a Control é quem deve controlar as regras de negócio, e não a Model, e é aí que começa um bate boca interminável. DAO é Model? É Control? é o que? E por aí vai a briga… pois se pegarmos o conceito de que Control é o que cuida das requisições, eventos e tal, então as requisições de banco também são parte da Control, mas muita gente afirma que DAO é Model, inclusive com libs que são DAO ao mesmo tempo que são Model, e o domínio se perde, e a aplicação não se resolve, e as regras só se espalham como vírus, atingindo até a camada View…
Veja o diagrama abaixo, a pequena surubinha que ocorre entre as camadas no MVC (diagrama linkado diretamente da Wikipedia). View com acesso direto a Model? Bonito demais…
![]()
O MVC previsa ser revisto, e sua revisão requer sua morte. Isso mesmo, o MVC morreu! Após perceber que a definição de MVC é dúbia em certos pontos, decidi que era hora de tentar melhorar a definição das camadas de uma aplicação, ou seja, a sigla MVC apenas não se sustenta mais, mas a idéia das camadas sim. Podemos pensar nisso como um amadurecimento da definição, a fim de reduzir um pouco as confusões.
E agora? Quem entra no lugar? Entra um agrupamento e uma definição melhor das camadas. É hora do HIPER – Handling, Interface, Process, Entities and Repository. A idéia é tentar dar uma melhor homogenidade à nomenclatura e aproximar a análise de sistemas e a codificação dos conceitos de BPM – Business Process Management – do qual faz parte o BPM – Business Process Modeling. Sim, eu sei, eles dançaram na nomenclatura também (uma está contida na outra, mas é dose… De toda a forma, para Análise de Sistemas, o que interessa é o Business Process Modeling).
O conceito é simples, e resolve de vez o gap deixado pelo MVC para interpretações errôneas.
Camada Handling – responsável por manipular as requisições feitas à aplicação, sejam elas, requisições de interface para obtenção ou submissão de dados, ou então para acesso ao repositório de dados. Ou seja, é a camada de infraestrutura da aplicação, manifesta-se de forma espalhada pelo sistema, sendo uma camada transversal. É onde colocamos praticamente todas as nossas bibliotecas, e muito conhecida como “framework“, pois cuida de todas as questões de integração entre as diversas camadas, auxiliando a manter o baixo acoplamento e alta coersão das mesmas. É possível ter um único componente lidando com todas as requisições, por exemplo, embora na verdade, o ideal é que a camada Handling seja muito bem planejada e bastante seccionada/segmentada. Podemos dizer ainda, sem medo de errar, que a definição da camada Handling é a definição da arquitetura dos sistemas de uma instituição, seu conjunto de bibliotecas, e padrões de trabalho.
Camada Interface – é a interface do usuário (user interface, não necessariamente gráfica), onde estão as telas do sistema que interagem com o usuário, exibindo os dados fornecidos pela camada handling para manipulação e submissão, ou mera exibição (relatórios, telas, entre outros). Uma lib utilizada para a construção da Interface está na camada Handling, pois cuida da manipulação dos dados pelo usuário, já a tela e o relatório em si encontram-se na Interface.
Camada Process – é a camada onde estão os processos de negócio, ou seja, cuida basicamente de fazer o negócio andar, e as entidades tramitarem com seus estados pelos processos, indo de um a outro. Poderia ser chamada também de camada de workflow, já que cuida do fluxo das entidades dentro dos processos determinados. Os dados são enviados e recebidos pela camada Process através da camada Handling, ou seja, se sua camada Handling for um webservice, você tem uma lib que trabalhará como proxy para o acesso da camada Interface à camada Process. Isso significa que há duas partes da Handling em ação, uma na Interface e outra na Process. Como dito anteriormente, a camada Handling é uma camada transversal que atravessa todas as outras 3 camadas, cuidando da comunicação entre elas.
Camada Entities – É a camada que contém as entidades do negócio, também conhecida como domínio da aplicação. Ela não é responsável por cuidar da persistência dos dados na camada Repository, isso é feito novamente pela camada transversal Handling. As libs de ORM devem ficar aqui interagindo com a camada Entities, mas o modelo das entidades deve ser abstraído a fim de manter o baixo acoplamento com as outras camadas.
Camada Repository – Acessada exclusivamente pela camada Handling, é onde ficam os dados que requerem persistência, ou seja, a camada, normalmente, mas não sempre, do banco de dados. Pode ser um arquivo de configuração, por exemplo, no qual a manipulação (handling) dos dados é feito por uma lib incluída na arquitetura do sistema.
O diagrama abaixo apresenta de maneira simpificada como as camadas se separam e interagem. Note que o repositório dos dados não é considerado como uma camada do padrão, mas um elemento externo à aplicação, uma vez que toda a interação entre entidades e repositório é feito pela Handling. Neste caso, como é possível utilizar o banco como parte do sistema, e não mero repositório de dados, através do uso de views, stored procedures, etc, e como esse uso torna-se específico de um banco de dados, fazendo mais parte da infraestrutura do que da aplicação em si, é considerado parte da camada Repository. Porém, dentro deste conceito, a colocação de parte dos processos e validações dentro do banco de dados cria uma distribuição errônea dentro do padrão, além da imobilidade do sistema preso eternamente a um componente específico da infraestrutura, neste caso o banco. Mas isso é uma decisão de cada um, com base nas necessidades de otimização de uma aplicação em face de seu repositório. Infelizmente, este ponto, nenhum padrão trará uma solução simples sem causar muita polêmica.

Conclusão
A idéia de dividir um sistema em camadas é algo extremamente válido e nobre, uma boa prática a ser seguida sem dúvidas. Mas a falta de determinação e abertura de interpretação subjetiva de qualquer elemento torna um padrão algo sem padrão, justamente porque padrões devem ser bem estabelecidos, sem margem a erros.
Certa vez tive que ouvir uma pessoa dizer “mas esse padrão está muito fechado”. É justamente por isso, é um padrão! Quando um padrão não é bem determinado o que se tem é uma explosão de interpretações errôneas e a impossibilidade de padrão do mesmo. É como dizer “não pode beber e dirigir” e alguém interpretar que ir a 20 km/h não é dirigir. Infelizmente, são pessoas como essas que estragam o padrão.
Publicação original do artigo em: http://sanchez.sqweebs.org/site/?p=75
FreeARC – http://www.freearc.org/
Para quem não conhece, é um compactador/expansor de arquivos, como o WinZip ou o WinRAR, mas com algumas diferenças:
1 – É livre e gratuito! Nada de ficar reclamando com você que tem que registrar!
2 – É mais rápido!
3 – Tem uma taxa de compressão muito melhor! Para ter uma idéia, enquanto o WinRAR e WinZIP compactaram um diretório na casa dos 28MBs, o FreeARC compactou em 13MBs!
4 – Gera arquivos para auto-extração.
Aconselho e todos que precisem compactar arquivos, o uso do FreeARC no lugar das outras soluções que normalmente nos impõem por aí.
IBM Lotus Symphony
Que o OpenOffice.org (BrOffice) é uma das poucas alternativas à suíte da Microsoft, isso praticamente o mundo inteiro sabe. O que poucas pessoas sabem é quais são as outras alteranativas gratuitas disponíveis na internet.
Uma delas é o Lotus Symphonyda gigante IBM. Completamente construído sobre a plataforma Eclipse, permite que você visualize e edite os principais formatos do mercado, além de utilizar padrões abertos como o ODT como formato nativo. Esta ferramenta inclui um Processador de Textos, Editor de Planilhas, e Editor de Apresentações.



Mais informações em http://symphony.lotus.com/
BOUML – Modelagem UML para equipes PHP
Hoje falaremos sobre uma ferramenta a qual eu mal conheci, já gostei muito. É a BOUML. Com a BOUML é possível gerar todos os diagramas UML de seu sistema a partir de código já criado, bem como gerar o código a partir da modelagem. Sim, o BOUML faz o que se chama de engenharia reversa e geração de código, e não apenas com PHP, mas com diversas outras linguagens também, tornando mais fácil serviços relacionados à migração de tecnologia.
Porque eu gostei tanto da ferramenta? Não é apenas por esses dois recursos, mas pela possibilidade que ela dá de ter múltiplas pessoas trabalhando nos diagramas de um único projeto simultaneamente. Poucas são as ferramentas livres que tem suporte a esta possibilidade. Além disso tudo, ela faz uma coisa que eu considero essencial: salva cada diagrama como um arquivo texto independente, permitindo que se façam diffs om servidores de repositório de arquivos como SVN, CVS, Git, entre outros. Com isso, toda a documentação é mantida junto com o código, sendo de fácil acesso por toda a equipe e consultável a qualquer momento estando sempre em sua última versão.
Além disso, o modelador permite a geração de documentação HTML a partir da modelagem. Em termos de desenvolvimento, isto é excelente para sistemas legados com documentação desatualizada. Pode-se facilmente gerar uma reversa do código e então gerar uma documentação, há muito desatualizada por falta de “tempo” e recursos para tal fim.
BOUML não é uma ferramenta nova, mas realmente, impressionou-me o fato de falarem tão pouco sobre ela.

Para conhecer mais sobre a ferramenta, visite http://bouml.free.fr/