2007-10-22

MAX Barcelona

João Fernandes está disponibilizando quase 500Mb de vídeo das gravações de duas palestras na MAX Europa.

Flex Roadmap presented by Ely Greenfield - Videos

Using Eclipse for ColdFusion Development - Videos


Obrigado João!!

2007-08-09

Tulsa CFUG

No dia 31/07/07 Ray Camden gravou uma apresentação para o UG falando sobre codificação segura.

ColdFusion Security Checklist 2

fonte:Steve Bryant

2007-07-17

Desafio Flex

O Desafio Nacional Flex-Brasil teve seu início na sexta-feira dia 13/07/2007, e tem término previsto para 02/10/2007, bastante tempo para tentar ganhar um dos prêmios oferecidos.

logo

2007-07-13

Um 12 anos, vai?

Esta semana o CFML e o cfserver completaram 12 anos, e para matar a saudade do começo, uma imagem para vocês.

2007-07-11

AUG-DF

No dia 19/07/2007 o grupo realizará reunião na Faculdade Michelangelo, onde abordarão os itens dos pacotes Adobe Creative Suite 3.

logo

Flex com CF

João Fernandes (pt) acaba de lançar seu blog, em inglês (por enquanto? não sei.), mas fiquem de olho...
João on Flex with CF

2007-07-06

CF8 + AJAX == CFAJAXPROXY

O engenheiro de software da Adobe ColdFusion Ashwin J Mathew publicou mais um artigo da série CF8 AJAX JSON, vale conferir.

2007-07-04

Ben Forta no Rio de Janeiro?!

No dia 12/07/07 em apresentação EM TEMPO REAL (via connect) para platéia carioca no Hotel Glória das 14:00 Hs às 16:30 Hs, Ben Forta demonstrará a integração CF+Flex.

inscrições


Fonte:cfgigolo
fonte

2007-06-25

CFFORM - Tree - DragDrop

Já escrevi algumas matérias sobre tree, com códigos meus:
Ações e eventos
Tree.dataProvider com XML complexo
mx:Tree addNode/removeNode 2
mx:Tree addNode/removeNode

Ou lembretes sobre outras matérias:
mx:Tree

Mas percebi que nenhuma demonstra o uso de DragDrop, então implementei um pequeno script de exemplo para vocês, e o resultado pode ser observado no filme a seguir.

youtube



<cfform format="flash" name="form" onload="initDragDrop();">
<cfformitem type="script">
function initDragDrop(){
tree.dragEnabled = true;
lista.dragEnabled = true;
tree.multipleSelection = true;
lista.multipleSelection = true;
tree.addEventListener('dragEnter' , dragEnterEvent );
lixeira.addEventListener('dragEnter' , dragEnterEvent );
tree.addEventListener('dragDrop', dragCompleteEvent);
lixeira.addEventListener('dragDrop', dragCompleteEvent);

}
function dragEnterEvent(event){
var source = event.dragSource._data.source;
event.handled = source.__id == 'tree' ? true : ( event.target._name == 'tree' ? true : false );
}
function dragCompleteEvent(event){
var source = event.dragSource._data.source;
if(event.target._name == 'lixeira' && source.__id == 'tree'){
for(var i = _root.tree.selectedNodes.length-1; i>=0; i--){
_root.tree.selectedNodes[i].removeTreeNode();
}
}else if(event.target._name == 'tree' && source.__id == 'lista'){
if(event.target.selectedNode == null){
for(var i = 0; i < source.selectedItems.length; i++){
event.target.addTreeNode(source.selectedItems[i].label,source.selectedItems[i].data);
}
}else{
for(var i = 0; i < source.selectedItems.length; i++){
event.target.selectedNode.addTreeNode(source.selectedItems[i].label,source.selectedItems[i].data);
}
}
}
}
</cfformitem>
<cfformgroup type="horizontal" width="480">
<cftree name = "tree" height="400" width = "250" >
<cftreeitem value="Departamentos" parent="Departamentos" expand="yes">
<cftreeitem value="DPR" parent="Departamentos" expand="yes">
<cftreeitem value="DOP" parent="Departamentos" expand="yes">
<cftreeitem value="DDP" parent="Departamentos" expand="yes">
<cftreeitem value="Empregados" parent="Empregados" expand="yes">
<cftreeitem value="Pedro" parent="Empregados" expand="yes">
<cftreeitem value="Claudio" parent="Empregados" expand="yes">
<cftreeitem value="pcsilva" parent="Empregados" expand="yes">
</cftree>
<cfformitem type="spacer" />
<cfselect name="lixeira" size="4" width="50" />
<cfformitem type="spacer" />
<cfselect name="lista" width="100" size="4" >
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</cfselect>
</cfformgroup>

</cfform>

2007-06-24

Duplicate CFC tem funcionalidade?

Com a nova funcionalidade da função Duplicate agora podemos armazenar o contexto completo da sessão, incluindo variáveis do tipo componente.
Antes para que uma variável do tipo componente criada durante uma sessão, que tem tempo de vida predefinido, não fosse perdida em sessões futuras, o desenvolvedor precisava de alguma POG, utilizando WDDX, ou algum código extenso, copiando as variáveis contidas no objeto componente. Esta nova funcionalidade do Duplicate será uma 'mão na roda'.
Tenho visto alguns criando componentes e copiando-o sem se quer iniciar o componente. Não aconselho. Aconselho o uso do createobject (component).

Para um exemplo simples, imagine uma aplicação onde uma montadora de veículos possui o Carro.cfc, e tudo mais acima dele, e a cada sessão (web) de um gerente de qualquer setor, encarregado de uma parte específica do projeto, ele precise ter armazenado o histórico do que seu setor (sua sessão web) implementou, a dias ou semanas atrás, em um carro em particular, ou mesmo em todos os carros.

Sabendo que todas as propriedades do Carro estarão no objeto Carro, fica mais simples armazenar este objeto em um escopo mais persistente (aqui chamo atenção dos desenvolvedores que dispõem de servidores compartilhados - este procedimento NÃO é apropriado, CASO a jvm seja a mesma para todo o servidor).

Com Duplicate(CFC) isto se resume a um script de no mínimo 23 linhas no Application.cfc, bastando usar o escopo session para criar novos Carro.cfcs com o createobject.

<cfcomponent>

<cfset this.name = "Montadora">
<cfset this.sessionmanagement = true>

<cffunction name="onApplicationStart">
<!--- Atenção com servidores compartilhados --->
<!--- cria variável que conterá todos os contextos de todas as sessões --->
<cfset Application.contextsaved = {} >
<cfreturn true>
</cffunction>

<cffunction name="onSessionEnd">
<cfargument name="SessionScope">
<cfargument name="ApplicationScope">
<!--- Cria variável expired com horario corrente no escopo this do componente --->
<cfset SessionScope.carro.expired = now() >
<!--- com o fim da sessão, armazeno o contexto do carro corrente no escopo application --->
<cfset ArrayAppend(ApplicationScope.contextsaved[CGI.REMOTE_ADDR],Duplicate(SessionScope.carro))>
</cffunction>

<cffunction name="onSessionStart">
<cfif StructKeyExists(Application.contextsaved,CGI.REMOTE_ADDR) and ArrayLen(Application.contextsaved[CGI.REMOTE_ADDR])>
<!--- sessão corrente possui histórico, que é restiduido --->
<cfset Session.carros = Application.contextsaved[CGI.REMOTE_ADDR] >
<cfelse>
<!--- sessão corrente NÃO possui histórico --->
<cfset Application.contextsaved[CGI.REMOTE_ADDR] = [] >
<cfset Session.carros = [] >
</cfif>
<!--- Cria a variável carro --->
<cfset Session.carro = {} >
</cffunction>

</cfcomponent>



Isto tornará cada item do array session.carros um objeto com as propriedades e métodos intactos, após o término da manipulação de carro em especial.
E o desenvolvedor pode atribuir manualmente um novo carro no histórico (<cfset ArrayAppend(Application.contextsaved[CGI.REMOTE_ADDR],Duplicate(Session.carro))>), antes mesmo da sessão expirar.

2007-06-22

Randomize letras

Continuando meu pensamento sobre asc, quando fui interrompido...
Vi uma pergunta sobre randomizar letras, já deve existir em algum lugar, mas desenvolvi a minha.


<cffunction name="randChar">
<cfscript>
var qchar = QueryNew("") ;
var qchar2 = '' ;
var char1 = 65 ;
var char2 = 122 ;
var char3 = 0 ;
if(StructKeyExists(ARGUMENTS,"1")) char1 = Asc(ARGUMENTS['1']);
if(StructKeyExists(ARGUMENTS,"2")) char2 = Asc(ARGUMENTS['2']);
QueryAddColumn(qchar,"c",ListToArray("65,66,67,68,69,70,71,72,73,
74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,
101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,
117,118,119,120,121,122"));
if(char1 gt char2){
char3 = char1;
char1 = char2;
char2 = char3;
}
</cfscript>
<cfquery name="qchar2" dbtype="query">
select c from qchar
where c >= #char1# and c <= #char2#
</cfquery>
<cfif NOT qchar2.recordcount>
<cfreturn Chr(qchar.c[RandRange(1,qchar.recordcount)])>
</cfif>
<cfreturn Chr(qchar2.c[RandRange(1,qchar2.recordcount)])>
</cffunction>
<cfoutput>#randChar("c","P")#</cfoutput>