humor: engenharia de software, clássico

Sei que essa imagem é clássica, mas eu queria ela a alguns dias e não achava, então vou usar esse post pra fazer um backup dela e compartilhar.

E.. quem aqui amigo, nunca viveu isso na prática.. hehehe..

Setando valor em atributo privado de um objeto

Estava eu, em um belo dia, implementando um belo framework :) quando me deparei com um não tão belo problema.
Usando reflection, precisava setar um valor para um campo/atributo privado de um objeto (assim como o hibernate também faz), mas ao tentar fazer isso, estourava a exception (java.lang.IllegalAccessException).
Após bater a cabeça um pouco (ok, mais que um pouco) encontrei o dito método setAccessible da classe Field, o qual resolveu o problema :D
Segue um exemplo:

Class<?> c = Pessoa.class;
Object obj = c.getConstructor(new Class[]{}).newInstance();
Field field = c.getDeclaredField("nome");
field.setAccessible(true);
field.set(obj, "fulano");
System.out.println( ((Pessoa)obj).getNome() );

Outro detalhe importante, se usar c.getField(“nome”) para um atributo privado, gera a exception java.lang.NoSuchFieldException. Deve-se usar getDeclaredField.

Diferença entre os padrões Adapter e Proxy

Quando se fala da utilização dos padröes Adapter e Proxy do GoF, vejo algumas confusões sobre suas aplicações. São padrões que ajudam a resolver vários problemas, oferecem a flexibilidade de mudar a composição em tempo de execução.
Os dois padrões possuem principios semelhantes, de encapsular a utilização de um serviço. Mas os objetivos de cada um são diferentes.
O Adapter é um padrão estrutural utilizado quando a classe/interface de um serviço não possui a interface da maneira que o cliente espera e que não pode ser alterada. Sendo assim, é criado uma classe que converte uma existente para nova interface. É um padrão normalmente aplicado em sistemas legados, ou pra desacoplar algum framework.

Nesse exemplo, ao invés do cliente utilizar a classe GeradorLegado, ele utiliza a interface Gerador e a classe GeradorAdapter. Futuramente, quando o GeradorLegado for descartado, basta a nova classe implementar a interface Gerador.

O Proxy é uma classe que funciona como interface de um serviço para a classe cliente. Tem a característica e o objetivo de alterar o comportamento da classe de serviço implementada. Pode ser utilizada em vários casos como conexões de redes, tratamento de arquivos e inclusive em conjunto com o padrão DAO pra logs de auditoria.

No exemplo, o cliente faz uso da interface Gerador, que pode ser uma instância do GeradorProxy, o qual vai utilizar o método do GeradorImpl que é a classe de serviço, mas vai alterar o comportamento (com rotinas antes ou/e depois da utilização do metodo gerarAlgo() do serviço).
A principal diferença entre os padrões é que proposta do proxy é de alterar o comportamento do serviço mas preservar a interface, enquanto o Adapter muda a interface do serviço e preserva seu comportamento.
O cliente pode usar o Proxy ou diretamente o serviço (principalmente usando injeção de dependências), pois ambos implementam a mesma interface e, já com o Adapter o cliente vai sempre usar o Adaptador.
No uso do Adapter, geralmente é quando um serviço já esta definido e implementado e deve ser utilizado. No caso do Proxy, tanto o serviço quanto a interface pode já estar definida e sendo utilizada, mas é necessário alterar o comportamento do serviço, sem alterar sua implementação.

Casos de uso: diferenças entre include, extend e generalização

Vejo muitas situações onde alguns confundem muito o uso de relacionamentos em casos de uso, principalmente com include e extend.

Diagramas de casos de uso servem para descrever cenários de uma solução a ser desenvolvida, e interações dos usuários (atores) com funcionalidades (casos de uso, conhecidos também como UC) no sistema.  Pode-se relacionar o conceito de casos de uso com o conceito de estórias de usuários em scrum/XP.

O ator, na minha opinião é uma definição incorreta, pois o termo ator representa um indivíduo, e em UC o ator seria mais uma função, um papel, ou uma responsabilidade, que pode ser exercida por mais de uma pessoa (Ex. Cliente ao invés de Zezinho). Bom, mas isso é uma outra conversa.

Os UC, geralmente se relacionam com os atores, mas podem se relacionar também com outros UC. Até o UML 1.2, existia 2 relacionamentos entre UC: <<uses>> e <<extends>>. A partir do UML 1.3, existe 3 formas de relacionamento: inclusão (esteriótipo <<include>>), extenção (esteriótipo <<extend>>) e generalização.

O uso de <<include>> veio para substituir o <<uses>> da versão 1.1, e é usado quando casos compartilham comportamento comum com outros UC. Por isso até pode, mas não faz muito sentido um UC incluir somente um UC, pois não haverá compartilhamento e o conceito de “reutilização”, pois o UC incluído terá obrigatoriamente tal comportamento incluído.

O uso de <<extend>> é a utilização inversa da inclusão, e pode (não necessariamente) alterar o comportamento do UC que foi estendido. E nesse caso não tem problema conceitual em um UC estender somente um UC.

Segue um exemplo de extend e include. No caso seria um cenário onde o Vendedor tira um pedido para um cliente e ao tirar o pedido, ele pode ou não, dependendo do valor do pedido ou forma de pagamento, consultar o SPC e ao tirar o pedido, será feito a verificação de pagamentos em atrasos do cliente. No caso o Entregador fará a entrega do pedido, mas também será feito a verificação de pagamentos em atrasos, reutilizando a especificação dessa funcionalidade.

Quanto a generalização, foi introduzida a partir do UML 1.3, que é representada pela setinha fechada, é semelhante e muito facilmente confundido com o <<extend>>, acredito eu que pelo conceito de herança das linguagens de programação. Mas a generalização indica uma variação de outro UC. Uma alternativa ao uso de generalização é descrever um outro diagrama com o novo cenário. No exemplo de generalização abaixo, retrata dois cenários de pagamentos, em um só diagrama.

É muito importante lembrar que o grande valor dos casos de usos não estão no diagrama, e sim, na especificação (conteúdo/descrição) de cada UC, e existe uma metodologia para descrever os casos de uso, mas outra hora eu falo sobre isso.

Apache 2 e Tomcat 6 com AJP

Bom, sei que vou precisar novamente disso futuramente então…

Uma das maneiras de integrar o apache com o tomcat é usando o proxy protocolo AJP, onde permite que o apache receba a requisição e a repasse para o tomcat, o qual pode inclusive ficar em uma rede interna, atrás de um firewall.. etc..

bom.. então, no apache, cria-se um novo arquivo em /etc/apache2/sites-available/ com um nome qualquer (ex. ajp_tomcat), com o seguinte conteudo:


Listen 9000
NameVirtualHost *:9000
<VirtualHost *:9000>
ServerName localhost
ErrorLog /var/log/apache2/ajp.error.log
CustomLog /var/log/apache2/ajp.log combined
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>

Onde:

  • 9000 é a porta que o apache vai atender as requisições a ser passadas para o tomcat.
  • ajp://localhost:8009/ é o servidor onde está o tomcat rodando (no caso na mesma máquina do apache) e porta do AJP que é configurada em server.xml (padrão é 8009)

Agora precisa carregar o modulo de proxy do ajp do apache.
# a2enmod proxy_ajp

E agora habilitar a configuração do arquivo criado.
# a2ensite ajp_tomcat

Pronto, agora só reiniciar o apache.
# /etc/init.d/apache2 force-reload

E acessar http://localhost:9000/

Pode-se usar desse recurso para, por exemplo, fazer o tomcat escutar na porta 80, configurando por domínio especifico.. etc..

Firefox Addons/Extenções – minhas favoritas

Firefox Addons

A grande vantagem do firefox em relação ao Internet Explorer (alem de ser + rápido,
mais seguro, de melhor usabilidade, melhor flexibilidade, segue padrões da W3C,
personalizavel, etc etc etc… e + 13 motivos)
é a possibilidade de instalar extenções que o deixa ainda melhor…
Segue as minhas extenções preferidas que uso no meu firefox.

DIA A DIA

Add Bookmark Here ² – adicionar aos favoritos no próprio menu

https://addons.mozilla.org/pt-BR/firefox/addon/3880

CheckBoxMate – marca várias caixinhas (mensagens de email pro exemplo) selecionando com o mouse

https://addons.mozilla.org/pt-BR/firefox/addon/9740

Fast Dial – exibe 9 possibilidades de favoritos quando abre uma nova aba ao invés de exibir a pagina em branco

https://addons.mozilla.org/pt-BR/firefox/addon/5721

Showcase – organizador das abas que estão em aberto (muito show mesmo :D )

https://addons.mozilla.org/pt-BR/firefox/addon/1810

FireGestures – comandos (nova aba, fechar aba, voltar, etc) com gestos do mouse

https://addons.mozilla.org/pt-BR/firefox/addon/6366

Fission – efeito na barra de endereço parecido com o Opera

https://addons.mozilla.org/pt-BR/firefox/addon/1951

Session Manager – gerenciador de sessões (status atual das paginas que estão abertas)

https://addons.mozilla.org/pt-BR/firefox/addon/2324

Xmarks – esse é um dos meus preferidos. Com ele eu tenho sincronizado meus favoritos em várias máquinas (trabalho, casa, notebook)

https://addons.mozilla.org/pt-BR/firefox/addon/2410

DESENVOLVIMENTO WEB

Flagfox – indica em que país o site está hospedado realmente

https://addons.mozilla.org/pt-BR/firefox/addon/5791

Quick Locale Switcher – troca o localizador de idiomas do navegador pra testar internacionalização

https://addons.mozilla.org/pt-BR/firefox/addon/1333

Web developer – canivete suiço de ferramentas pra desenvolvimento web

https://addons.mozilla.org/pt-BR/firefox/addon/60

wmlbrowser – simula um navegador WAP de celular

https://addons.mozilla.org/pt-BR/firefox/addon/62

se alguem tiver + alguma sugestão boa que ficou faltando fique a vontade em comentar…

ER: substituir . (ponto) por , (virgula) apenas para numeros num texto

Hoje o problema foi diferente, tenho uma planilha gerada do resultado de um SQL. Salvei o resultado num CSV mas quando eu abro ele numa planilha (Calc do OO por exemplo) as colunas com números decimais abrem com o tipo data, pois no formato brasileiro se usa virgula pra separar decimais. Bom, preciso substituir todas as ocorrências de . por , no meu CSV. O problema é que a substituição tem que ser somente para números, por ex “Sr. Fábio” o ponto teria que ser mantido.

Pra resolver isso, usa-se a expressão regular com retrovisores. Eu testei no Kate (do KDE) e no Eclipse mas acredito que funcione na maioria dos editores que suportem expressão regular. Bom, então abri o texto no editor, fui em Editar -> Substituir, e marquei a opção de expressão regular.

No campo de busca coloquei:

([0-9])(\.)([0-9])

E no de substituição:

\1,\3

Ou seja, o \1 e o \3 são os retrovisores que tem que ser mantidos na substituição.

Claro, poderia fazer a substituição no próprio SQL, no meu caso, no PostgreSQL, poderia usar a função:

replace(valor::text, '.', ',')

onde valor é o nome do meu campo do tipo float.

VirtualBox: HD adicional no WinXP

Criei um Windows XP virtual pra mim fazer alguns testes. Mas criei um HD virtual muito pequeno (4Gb) então resolvi criar no virtualbox um HD adicional de 16Gb. O problema é que não aparecia a unidade do HD novo em “Meu Computador”.

A algum tempo atrás tive o mesmo problema no VMware. Fucei fucei e acabei desistindo.

O que acontece é que o Windows detecta o HD novo mas não mostra pois não está formatado. Então descobri como formatar o HD novo no windows… segue os passos.

- Adicione o Disco Rigido Virtual pelo gerenciador de discos virtuais do virtualbox

- Vincule a maquina virtual que se deseja adicionar.

- Inicie o windows (no virtualbox)

Agora o pulo do gato. No XP…

- Abra o painel de controle -> Ferramentas administrativas -> Gerenciamento do computador -> Armazenamento -> Gerenciamento de disco

- Agora no Disco 1 (disco zero é o C:) crie a nova partição e a formate.

Pronto! Vai aparecer a nova partição no “Meu Computador” do novo HD, pronta pra ser usada.

Não cheguei a testar, mas acredito q essa dica vale pro VMware tb.

Openoffice Calc: abrir documento com diretorio relativo usando Hyperlink

Ok.. sei que eu esqueci esse blog… mas enfim.. essa eu não podia esquecer..

Em resumo, eu precisava gerar uma planilha e ao clicar num campo, abrisse outra planilha (em outro arquivo)  que estivesse no mesmo diretório.

Usei a função do Calc =HYPERLINK(‘file:///home/eu/planilha2.ods’)

O problema é que se eu enviar esses arquivos pra outra pessoa, quando abrir, o link não vai funcionar.

Depois de pesquisar bastante e quebrar bastante a cabeça eis a solução:

Adicione as seguintes variaveis na planilha1.ods, no menu Inserir -> Nomes -> Definir… em Nome, coloque o nome da variavel, e em Atribuido a, coloque a formula.

camCompleto   ->   CÉL("FILENAME")
dirAtual ->  MEIO(camCompleto;2;PESQUISAR("/[^/]+'#";camCompleto)-1)

e na celula que se quer colocar o link para o outro arquivo, coloque:

=HYPERLINK(dirAtual&"planilha2.ods";"abrir")

Outra forma também, poderia resumir tudo em um comando sem usar variaveis do OO, ficaria:

=HYPERLINK(MEIO(CÉL("FILENAME");2;PESQUISAR("/[^/]+'#";CÉL("FILENAME"))-1)&"planilha2.ods";"abrir")

Essa dica funciona no Openoffice tanto no Linux quanto no windows.

PostgreSQL: migrando de LATIN1 pra UTF-8

Pra padronizar meus sistemas, resolvi migrar as bases de LATIN1 pra UTF8. Sei que alguns não vão concordar com minha escolha mas enfim. Segue os passos que eu fiz em um servidor RedHat5 (testei com Debian e funcionou também) com a versão 8.1 do PostgreSQL. Fiz com uma base de em torno de 800Mb.
Recomendo que teste em um ambiente separado antes de aplicar na produção. Use por conta e risco.

Primeiro pare todos os serviços que utilizam o banco (ex. stop no apache, tomcat, jboss) para ninguém (usuários) alterar o banco durante o processo.
Nos comandos abaixo, substitua:
usuario_banco = usuário dono do banco, com permissões de apagar e criar bancos
meu_banco = o banco que vc quer fazer a migração

fazer um backup em texto plano

/usr/bin/pg_dump -i -h localhost -U usuario_banco -F p -D -v -f bancoL.sql meu_banco

aqui está o segredo. Use o software iconv para conversão

iconv -f iso-8859-1 -t utf-8 bancoL.sql > bancoU.sql

abra o arquivo bancoU.sql (de preferencia use o vim pra editar)
e no inicio aí pela linha 7, onde tem “SET client_encoding = ‘LATIN1′;” troque LATIN1 por UTF8

Com banco fazer:

faça um backup é claro
pg_dump -U usuario_banco -i -F c -b -f banco.backup meu_banco

agora apague o banco inteiro
dropdb -h localhost -U usuario_banco meu_banco

crie-o com UTF8
createdb -h localhost -E UTF8 -U usuario_banco meu_banco

e agora restaure o banco “uteéfeoitoado” :)
psql -h localhost -U usuario_banco -d meu_banco < bancoU.sql

caso use em seus SQL a função TO_ASCII, com UTF-8 ela não irã funcionar. Veja aqui a alternativa em um post passado que eu fiz.

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.