quinta-feira, julho 10, 2008

Campanha contra o aquecimento global

Recebi por e-mail do amigo Luiz Algarra o anúncio para uma campanha contra o aquecimento global. O objetivo do anúncio é envergonhar os líderes do Canadá, Japão e EUA por eles estarem barrando o progresso nas negociações sobre mudanças climáticas no encontro do G8.

Eu participei, é rápido e fácil, clique no link abaixo:
http://www.avaaz.org/po/g8_2020_targets/97.php?cl_tf_sign=1

sexta-feira, julho 04, 2008

Firefox 3 integrado ao Gmail






Entre tantas coisas novas no Firefox 3, acredito que essa é uma dica muito útil, principalmente para quem usa Gmail, segue o roteiro conforme a fonte.

Sabe quando você clica em um endereço de e-mail na web e imediatamente seu Outlook abre uma tela criando uma nova mensagem para aquele endereço? Com o Firefox você pode fazer o mesmo com o seu webmail.


O navegador já traz integração nativa ao Yahoo Mail - se você souber procurar. Também funciona com o Gmail, extra-oficialmente. Siga os passos:

1. Selecionar Ferramentas, depois Opções e clicar no ícone Programas

2. Clicar em “mailto” e selecionar Usar o Yahoo! Mail

3. Clicar em OK.


O Gmail não aparece na lista do “mailto”, mas você pode usar um truque para configurá-lo. Siga os passos:

1. Na barra de endereço, digite “about:config” e aperte Enter e ignore o alerta de garantia;

2. Na caixa de filtro, digite “gecko.handlerservice”

3. Entre as opções da lista, selecione:

gecko.handlerServiceAllowRegisterFromDifferentHost

Altere o valor de falso para verdadeiro.

4. Volte à barra de endereços, copie e cole o código abaixo e aperte Enter:

javascript:window.navigator.registerProtocolHandler("mailto",
"https://mail.google.com/mail/?extsrc=mailto&url=%s","GMail")

5. Abaixo da barra de endereço aparecerá uma mensagem perguntando se você quer adicionar o Gmail como aplicação para o “mailto”. Clique em Adicionar Programa

6. Repita o procedimento do item anterior (em vermelho), e agora escolha Gmail.


Fonte: Conheça 12 truques para o Firefox 3
Preston Gralla, editor do Computerworld, de Framingham

quarta-feira, julho 02, 2008

Wordle

Wordle é uma divertida e interessante ferramenta (applet java) que converte um texto em imagem e o torna esteticamente agradável numa disposição de nuvem.
É possivel colar seu texto e depois configurar como vai ser a disposição, coloração e outras coisas mais..
Segue um exemplo que eu fiz:

sexta-feira, junho 20, 2008

BeFunk

Descobri o site beFunk e já virei fã, veja abaixo o carton que fiz através da minha foto.
A propósito, esse é meu cachorro Thor, de raça Pastor Belga, estou procurando deseperadamente uma cadela para acasalar com ele...

sexta-feira, maio 30, 2008

Snipet que adapta o componente gateway para trabalhar com tabelas de relacionamento

Para quem usa a Extensão Coldfusion para eclipse da Adobe, dentro de RDS Dataview quando clicamos com o botão direito do mouse numa tabela temos a opção: Coldfusion Wizards > Create CFC. Abre então uma janela "Coldfusion CFC Value Object Wizard" com 3 opções, entre elas uma pode gerar automaticamente os arquivos CFC para acesso a dados que prefiro chamar de grupo DAO, que é constituído de 3 arquivos com suas respectivas funções: DAO, TO e Gateway.

Esta plugin para o eclipse pode ser obtido gratuítamente na Adobe
ColdFusion 8 Extensions for Eclipse, também vem junto com o Flex Builder.

O arquivo gateway do grupo DAO, não concebe tratamento para tabelas de relacionamento no banco de dados, então criei esse snipet no Cfeclipse que pode ser usado no arquivo Gateway.cfc sobrescrevendo os métodos gerados, assim permitindo um melhor controle para tabelas de relacionamento. A princípio escrevi para tratar relacionamentos entre duas tabelas, mas é bem fácil adaptá-lo para mais tabelas.



<cffunction name="getById" output="false"
access="remote">
<cfargument name="$${idt1}" required="true" />
<cfargument name="$${idt2}" required="true" />
<cfreturn createObject("component",
"$${DAO}").read(arguments.$${idt1},arguments.$${idt2})>
</cffunction>

<cffunction name="getByIdAndSave" output="false" access="remote"
hint="Insere relacionamento - salva se for novo (insert)">
<cfargument name="$${idt1}" required="true" />
<cfargument name="$${idt2}" required="true" />

<cfscript>
var Obj = getById(arguments.$${idt1},arguments.$${idt2});
if(Obj.get$${idt1}() eq 0 AND Obj.get$${idt2}() eq 0){
Obj.set$${idt1}(arguments.$${idt1});
Obj.set$${idt2}(arguments.$${idt2}); save(obj); }
</cfscript>
</cffunction>

<cffunction name="save" output="false" access="remote">
<cfargument name="obj" required="true" />
<cfscript>
return createObject("component", "$${DAO}").create(arguments.obj);
</cfscript>
</cffunction>

<cffunction name="deleteById" output="false"
access="remote">
<cfargument name="$${idt1}" required="true" />
<cfargument name="$${idt2}" required="true" />

<cfset var obj =
getById(arguments.$${idt1},arguments.$${idt2})>
<cfset createObject("component", "$${DAO}").delete(obj)>
</cffunction>

domingo, abril 27, 2008

Como obter requisitos arquiteturais - parte 2

Mecanismos arquiteturais

Em termos simples, um mecanismo arquitetural representa uma solução comum para um problema encontrado com freqüência. Mecanismos arquiteturais são utilizados com freqüência para perceber requisitos arquiteturais.

A tabela abaixo mostra três categorias de mecanismos arquiteturais e mostra como esse mecanismos são expressos em cada uma dessas categorias.




Mecanismo de Análise Mecanismo de Design Mecanismo de implementação
Persistência RDBMS Oracle
Ingres
OODBMS ObjectStore
Comunicação Object request broker Objeto pedido corretor Orbix
VisiBroker
Message queue Mensagem fila MSMQ
MQSeries




Um mecanismo de análise representa uma implementação independente de solução.
Um mecanismo de design(projeto) é um refinamento de um mecanismo de análise.
E um mecanismo de implementação é um refinamento de um mecanismo de design, e especifica a exata aplicação do mecanismo.

A figura abaixo resume a relação entre os requisitos e mecanismos, mostrando refinamentos do FURPS.






A abordagem proposta para obter requisitos arquiteturais com FURPS é a seguinte:


1. “Mantenha uma lista completa de requisitos arquiteturais, sem levar em
consideração se os itens listados são relevantes ou não para um projeto
particular”;
2. “Para cada requisito arquitetural, formule uma ou mais questões que
possam ajudar no processo de especificação. Tenha certeza de que todos os
envolvidos no projeto possam entender essas questões”;
3. “Ajude os envolvidos no projeto mostrando a eles o impacto potencial
de responder uma questão de uma forma ou de outra”;
4. “Capture as respostas dadas a cada uma das questões”;
5. “Ajude o arquiteto assegurando que os envolvidos no projeto (em adição
às respostas das questões) atribuam uma prioridade ou um peso a cada requisito
arquitetural. Esse peso atribuído ajudará o arquiteto a fazer escolhas entre os
requisitos”.


A tabela abaixo exemplifica um questionário desse tipo, que inclui também exemplos de respostas:


























RequisitoQuestõesImpactoRespostas

Licenças (prioridade: Média)
O sistema, ou parte dele será licenciado? Existem muitas
restrições no
mecanismo
utilizado para
prover
capacidade de
licenciamento?
Quanto maior a
sofisticação do
mecanismo de
licenciamento,
maior o tempo para
realização da
comercialização e
maior o custo de
manutenção.
O módulo de
controle de
estoque será
comercializado
como um
componente
separado do
sistema e irá
requerer licença.
A ferramenta
FlexLM é
utilizada por
toda nossa
organização para
prover
capacidade de
licenciamento.
Disponibilidade (prioridade: alta)Existe algum
requisito a
respeito do tempo
médio entre
falhas do sistema
(MTBF)?
Quanto maior a
disponibilidade,
maior o grau de
comercialização do
sistema.
Disponibilidade
é uma
característica
chave do
produto. O
produto deve ter
um MTBF de 60
dias
Suporte a plataformas (prioridade: alta)Que plataformas o sistema deve suportar?O desenvolvimento para uma única
plataforma pode
reduzir o potencial
de comercialização
do produto.Também
pode permitir uma
integração com as
características das
plataformas.
O produto deve ser
implementado
para rodar nas
seguintes
plataformas
UNIX:
Sun Solaris
IBM AIX
HPUX



Fonte/referencias:

Peter Eeles, Senior TI arquitecto, IBM

[GRA92] Robert Grady 1992. Practical Software Metrics for Project Management and Process Improvement. Prentice-Hall.

quinta-feira, março 20, 2008

Como obter requisitos arquiteturais - parte 1

O que é um requisito arquitetural?

Trata-se de qualquer requisito que é arquiteturalmente significante, onde o nível de significância pode estar implícito ou explícito. Requisitos arquiteturais implícitos são aqueles
que possuem atributos particulares. Por exemplo, qualquer requisito de alto risco,
alta prioridade ou baixa estabilidade pode ser considerado arquiteturalmente significante.
Entretanto o artigo foca primeiramente nos requisitos explícitos, segue alguns exemplos de requisitos arquiteturais explícitos:
  • O sistema deve ter apoio a múltiplas linguagens humana;
  • A persistência será feita através de um banco de dados relacional;
  • A base de dados será Oracle 8i;
  • O sistema irá correr sete dias por semana, vinte e quatro horas por dia;
  • Um sistema de ajuda on-line é necessário;
  • Toda apresentação lógica será feita em Flex.
Como você pode perceber, estes requisitos são muito diferentes e estão misturados. Alguns são funcionais, outros não-funcionais; alguns são independentes dos mecanismos técnicos, e outros não. O que nós precisamos é de uma abordagem sistemática que proveja um framework para classificação das exigências arquiteturais, garantindo que essas valiosas declarações como as que estão listadas acima não sejam esquecidas.

FURPS + sistema de classificação de requisitos

Para auxiliar a categorização utilizamos o modelo FURPS+ [GRA92] que descreve as principais categorias de requisitos:
  • Funcionalidade
  • Usabilidade
  • Confiabilidade (Reliability)
  • Desempenho (Performance)
  • Suportabilidade
O "+" na FURPS + também nos ajuda a lembrar preocupações como:
  • Requisitos de design
  • Requisitos de implementação
  • Requisitos de interface
  • Exigências físicas

Vamos analisar em pormenor cada categoria.


Requisitos funcionais

Requisitos funcionais geralmente representam as principais funcionalidades do produto. Em um armazém pedido, talvez tivéssemos requisitos relativos à ordem processamento ou estoque controle. No entanto, requisitos funcionais nem sempre são específicos do domínio. Proporcionar impressão capacidade funcional é um requisito de particular importância para arquitetura.

Requisitos não-funcionais

Os restantes "URPS" categorias descrever requisitos não-funcionais que são geralmente arquiteturalmente significativos.

  • Usabilidade: interesse em características como estética e coerência na interface do utilizador.

  • Confiabilidade (Reliability): interesse em características como a disponibilidade, a exatidão do sistema de cálculos, bem como a capacidade do sistema de recuperação de falhas.

  • Desempenho (Performance): interesse em características como a velocidade do tempo de resposta, o tempo de recuperação, tempo do start-up , e tempo do shutdown .

  • Suportabilidade (Supportability): interesse em características como testabilidade, adaptabilidade, durabilidade, a compatibilidade, configurabilidade, instalabilidade, escalabilidade e localizabilidade.

O "+" no FURPS + sigla é usada para identificar outras categorias que geralmente representam restrições.
  • Um requisito de design, muitas vezes chamado de restrição de design, especifica ou restringe as opções para projetar um sistema. Por exemplo, se você especificar que uma base relacional é necessária, isto é uma restrição de design.

  • Um requisito de implementação especifica ou restringe a codificação ou a construção de um sistema. Exemplos podem incluir normas exigidas, as liguagens de execução, dos recursos e limites.

  • Um requisito de interface especifica um meio externo com o qual um sistema deve interagir, ou restringe algum formato ou outros fatores utilizados dentro dessa interação.

  • A exigência física especifica uma limitação física imposta ao hardware utilizado para abrigar o sistema - forma, tamanho ou peso, por exemplo.

Identificando os requisitos


A partir da descrição acima, podemos ver facilmente que algumas exigências funcionais, e mais exigências no FURPS+ de outras categorias, são arquiteturalmente significativas. Agora vamos analisar como poderíamos classificar os requisitos arquiteturais que aparentemente não estão relacionados enumerados anteriormente. Usando o FURPS + na classificação podemos ver:
  • “O sistema deve ter apoio a múltiplas linguagens humana” é um requisito de suportabilidade.

  • “A persistência será feita através de um banco de dados relacional" é um requisito de design.

  • " A base de dados será Oracle 8i" é um requisito de implementação.

  • “O sistema irá correr sete dias por semana, vinte e quatro horas por dia" é um requisito confiabilidade.

  • "Um sistema de ajuda on-line é necessária" é um requisito funcional.

  • " Toda apresentação lógica será feita em Flex" é um requisito de implementação.




Fonte/referencias:

Peter Eeles, Senior TI arquitecto, IBM

[GRA92] Robert Grady 1992. Practical Software Metrics for Project Management and Process Improvement. Prentice-Hall.

terça-feira, fevereiro 26, 2008

Mangiare, che fa bene... Lazarella

Pra quem ainda não conhece a Cantina Lazarella, no bexiga, tem uma ótima lazanha. Na foto meus colegas de trabalho da direita para esquerda, Eu, Laion Camargo (Desenvolvedor Web) e Anselmo Krauter (especialista em redes).

terça-feira, fevereiro 19, 2008

Aptana Jaxer Server

O famoso IDE conhecido por todos Aptana, apresenta agora a mais nova criação totalmente free opensource, o Jaxer Server, como anunciado por eles mesmos "o primeiro servidor Ajax do mundo". O pouco que vi me parece muito interessante, por exemplo algumas consultas direto em banco de dados através do Jaxer entre outras coisas do gênero.



Mais informações no site Aptana

Scribble Pad no Cfeclipse, como instalar...

Para quem não sabe o que é esse Scribble Pad e como utilizá-lo. Trata-se de uma maneira limpa e fácil de realizar pequenos testes sem ter que criar algo como teste.cfm.. O Scribble Pad faz justamente isso, disponibiliza uma página .cfm para você realizar qualquer tipo testes sem ter que misturar com sua aplicação em produção.

Para instalar:

1. Crie um novo projeto CFML chamado Scribble;

2. Dentro do projeto, crie um arquivo chamado Scribble.cfm;

3. Clique no menu Window --> Preferences, entre em: Cfeclipse -->Scribble Pad

3.1) Na caixa "File name to use as scribble pad" entre Scribble.cfm

3.2) Na caixa "Project to use for scribble pad." entre Scribble

3.3) E em "URL to scribble file." coloque o endereço (http://...) completo para o arquivo


Pronto, agora quando você clica no ícone Load Scribble Pad (F8) é aberto automaticamente a página ScribblePad.cfm e abaixo, no Browser View do eclipse ela é carregada.

Fonte: How to setup the CFEclipse Scribble Pad

quarta-feira, janeiro 23, 2008

Remover registros duplicados utilizando tabela temporária

Tive um probleminha com uma tabela no banco de dados (SQLServer 2000) onde trabalho, que estava sem chave primária (não fui eu quem criei), e após algumas importações e exportações muitos registros ficaram duplicados. Foi necessário então criar uma query para remover as entradas duplicadas, sendo que algumas estavam com 5 registros duplicados, outras com 4, outras com 3, assim sucessivamente...

Então, para cada quantidade de registros duplicados é necessário ajustar o valor do count conforme descrito abaixo:

--- a) Cria tabela temporária
CREATE TABLE #tb_temp
(cid_cod int,
cid_nome varchar(50),
uf char(2),
data datetime
)

--- Observação geral: *atualizar o valor do count p/ qtdade de registros duplicados que você deseja consultar.

--- b) Consulta registros duplicados
[*atualizar count]
SELECT cid_cod, cid_nome FROM tb_cidades WHERE cid_cod IS NOT NULL GROUP BY cid_cod, cid_nome HAVING Count(*)=2

--- c) Insere 1 registro do campo repetido na tabela temporária [*atualizar count]
INSERT INTO #tb_temp
SELECT cid_cod, cid_nome, uf, data
FROM [tb_cidades] As Tmp GROUP BY cid_cod, cid_nome, uf, data HAVING Count(*)=2

--- d) Deleta todos os registros do campo repetido na tabela original [*atualizar count]
DELETE FROM tb_cidades
WHERE cid_cod IN
(SELECT cid_cod FROM tb_cidades WHERE cid_cod IS NOT NULL GROUP BY cid_cod HAVING Count(*)=2)

--- e) Insere 1 registro da temporária na tabela original
INSERT INTO tb_cidades SELECT * FROM #tb_temp

--- f) Consulta o registro pelo nome (verifica se a duplicidade foi corrigida) [*atualizar o cid_nome]
SELECT * FROM tb_cidades WHERE cid_nome like 'BELEM'

--- g) Deleta tabela temporária
DROP TABLE #tb_temp


Uma observação importante é:
- Não tente fazer JOIN (INNER, LEFT, RIGHT etc) utilizando tabela temporária, não vai funcionar. Se realmente precisar fazer isso crie uma View talvez isso resolva seu problema.

terça-feira, janeiro 15, 2008

UDF Coldfusion para converter quebra de linha

Hoje eu tive que desenvolver uma UDF em Coldfusion para resolver esse pequeno problema. A UDF por sua vez faz o seguinte converte o código ASC que representa quebra de linha para o formato de exibição em HTML, no caso <br />.


<cffunction name="converteQuebraDeLinha" returntype="string"
output="false" hint="Converte código ASC de quebra de linha

para <br />">

<cfargument name="s_texto" type="string">

<cfscript>

result = reReplace(arguments.s_texto, chr(13) & chr(10), "<br/>", "ALL");

result = reReplace(result, chr(13), "<br />","ALL");

result = reReplace(result, chr(10), "<br />","ALL");

</cfscript>
<cfreturn result>
</cffunction>