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..
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 ![]()
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.
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.
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.
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:
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
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
)
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…
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.
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.
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.
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.