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
quinta-feira, julho 10, 2008
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
sexta-feira, junho 20, 2008
BeFunk
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>
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.
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:
Fonte/referencias:
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:
| Requisito | Questões | Impacto | Respostas |
|---|---|---|---|
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
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:
FURPS + sistema de classificação de requisitos
Para auxiliar a categorização utilizamos o modelo FURPS+ [GRA92] que descreve as principais categorias de requisitos:
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:
Fonte/referencias:
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.
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
- 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
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
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
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
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.
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>
<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>
Assinar:
Comentários (Atom)
