sexta-feira, 28 de novembro de 2008

enviar e trazer arquivos com scp

Acho que muito gente está cansado de saber trabalhar com ssh, mas como aprendi faz pouco tempo e acho que é mais do que útil, eis ...

A) traz um arquivo /home/username/arq da máquina remota X para máquinaLocal: (DIRETÓRIO É SÓ usar -r depois de scp)
scp umusuariodamaquinaremota@ipdamaquinaremota /umdiretoriodamaquinalocal

B) agora pra enviar um arquivo:
scp /umdiretoriodamaquinalocal/arquivoqueeuqueroenviar.seila umusuariodamaquinaremota@ipdamaquinaremota

C) se vc tiver mais de um servidor, pode, da sua maquina local, tirar um arquivo do serv1 e enviar para o serv2
scp usuariodoserv1@ipdoserv1:/umdirdoserv1/umarqdoserv1 usuariodoserv2@ipdoserv2:/umdirdoserv2

Obs.1:
eu tenho o openssh-server em todas as máquinas, creio que isso é necessário
no caso C, eu levei um uma
"Host key verification failed.
lost connection"
Por falta de tempo contorneio problema logando ssh na máquina que recebe o arquivo e ela fica como se fosse local, eis o comando.
ssh -l usuariodoserv2 ipdoserv2

t+

quinta-feira, 27 de novembro de 2008

javacript com Dojo, algumas utilidades

======== BASICÃO DE DOJO ========
(perceba que é de dojo, não de javascript. Então tem que manjar um pouquinho pra entender o post).
obs1: os códigos estão sem a tag javascript

Eu percebi que tem muito pouca coisa em português sobre dojo, eu eu acho que é uma biblioteca mais completa que jquery, por isso gosto dela e uso.

A) INSTALANDO O DOJO
fazer o donwload em www.dojotoolkit.com, descompacter em uma pasta "js", por exemplo, dentro do diretório web do seu projeto e já está instalado, mas não pronto pra usar nas páginas.

B) HABILITANDO O DOJO PRA USAR EM SUA PÁGINA
<-- ---------- dojo settings and loads ---------- -->
< type="text/javascript">
var djConfig = {
isDebug:true, parseOnLoad:true
};
< /script >
< type="text/javascript" src="">/js/dojo-release-1.2.2/dojo/dojo.js " >< /script >
obs1:
Use sempre a expressão el para relativizar o caminho do dojo porque, os engines de templates como o tiles e o FACELETS, sem isso, acabam por desabitilar o dojo. O mesmo acontece com qualquer qualquer outra biblioteca ou css.

obs2:
em produção faça "isDebug:false";

C) USANDO O DOJO
um exemplo de uso muito comum, em formulários web, é quando queremos que nossos SELECTS ( sei que INPUT é mais comum ainda, mas o select vai ser mais interessante daqui a pouco) respondam a eventos dom como onclik. No caso dos selects o onchange é bem comum.

Pelo caminho mais longo e ultrapassado, iríamos nas tags html, ou jsf, dos elementos, colocaríamos lá um onclik isso ou aquilo. Conceitualmente isso é intrusivo. Quando entrar alguma outra tag select, que em jsf seria < !-- ---------- dojo addOnLoad ---------- -- >
< type="text/javascript">
// conecta evento onchange em todos os selects para rodar calculaResultado a cada change
var init = function(){
//conecta evento onchage em todos os selectes
dojo.forEach(dojo.query("select",document),
function(item){
dojo.connect(item, "onchange",calculaResultado);
}
);
};

dojo.addOnLoad(init);
< /script >

obs1: dojo.addOnLoad()
o addOnLoad funciona igual ao $(document).ready (pode nao estar escrito certinho)do jquery. Ela só roda depois que o seu browser conhece toda a árvore dom de sua página (ou seja, as tags e tudo que tem na página que você editou). Então entendemos o seguinte: depois que carreou a página, addOnLoad roda pra gente a função init

obs2: dojo.forEach
na função init tem lá um dojo.forEach(); do inglês a gente já tira que é para cada, mas para cada o quê? bom vamos entender primeiro o dojo.query da obs3. Um array de selects. Bom, forEach significa "para cada", e obviamente, vamos iterar em cada um desses selects e fazer o alguma coisa com cada um deles, mas o quê? Bom aí entra o segundo argumento da expressão forEach que é, no caso acima, a função : function(item){dojo.connect(item, "onchange",calculaResultado);}. Eu acho dojo super inteligente porque fazer alguma coisa sugere mesmo uma função e se essa função vai fazer alguma coisa com cada elemento do array que estamos iterando nada melhor do que ela receber esse elemento pra trabalhar com ele. Por isso "item" representa exatamente o elemento da vez da iteração. No nosso caso ele é um select já que temos ele na mão, vamos colocar nele programticamente o nosso onchange. Para entender esse passo leia obs4, que explica dojo.connect.


obs3: dojo.query()
dojo.query também dá pra entender do inglês, uma pesquisa nas tags da página, afinal a gente tem que encontrar os selects pra definir programaticamente os onchange.
Então já dá pra perceber que "select" me dá os selects da página, ou seja, do document, que neste caso é o contexto da query. O que o dojo.query devolve é um array de dom nodes. (que agora vc pode terminar de ler a obs2).

obs4: dojo.connect()
dojo.connect(item, "onchange",calculaResultado), faz o que o nome sugere, conecta no item, que é o nosso select, a função calculaResultado, que será rodada como resposta ao evento onchange. Quando o código chega a esse ponto ele coloca um evento on change nas nossas tags select. Se você tiver eventos pernsonalizados dependendo de qual select, então você pode analisar aqui o select que você pegou, ver quem ele é e com alguns ifs você conecta a função certa.


D) USANDO DOJO : trabalhando com os atributos do DOM node
No caso em que precisei aqui no meu serviço, pra cada mudança no select, teria que ser calculado o um resultado que traduzindo é: contar qtos "sim" estão selectionados entre os selects e colocar a essa quantidade num inputText que em html é < type="text">
< type="text/javascript">

function calculaResultado(){
var resultado = 0;
console.log("resultado, primeiro he zero : "+resultado);
dojo.forEach(
dojo.query("select",document),
function(index){
var idDoIndexQueHeUmSelect = dojo.attr(index, "Id");
console.log("----------------------------");
dojo.query("option",index).forEach(function(option){//Lets work with the options...
var isSelected = dojo.attr(option, "selected");
var optionValue = dojo.attr(option, "value");

//SE ALGUM OPTION TIVER SELECIONADO OPTION ...
//E FOR SIM...
if((isSelected == true) && (optionValue == "s")){
console.log("optionValue:"+optionValue);
++resultado;
}});
}
);

console.log("Resultado Final : "+resultado);
var txtResultado = dojo.byId("j_id_id26:resultado",document);
dojo.attr(txtResultado, "value", resultado);
//alert("fim");
}
< /script >


obs1: não tá muito bonito, é só pra ver algumas coisas sobre dojo

obs2: console.log()
Ele funciona igual ao System.out.println() só que precisa do firebug pra ver.

obs3: dojo.query("option",index).forEach(...
Um outro for each, só que esse agora pode ser chamado sempre que você tiver um node dom nas mãos. Bom, com o dojo.query a gente vai pegando os dom nodes que são filhos do index. Ou seja, index é o contexto da pesquisa. Os filhos do seletc, são os options que ele tem. Com os options aí sim eu posso ver qual deles tem o atribute select como true, o que quer dizer que ele é o que está selecionado no tag select. Se estiver selecionado um option com atrituto valor "s", que pra mim é "sim", então eu quero adicionar o resultado do teste em 1. Como fazer isso?

obs3: dojo.attr(txtResultado, "value", resultado);
var isSelected = dojo.attr(option, "selected");
Essa linha recebe o valor dp atributo "selected" do option da vez (lembre que a gente está dentro de um forEach).
Agora é muito importante perceber o seguinte: se a gente quezesse setar o attributo selected, aí a gente faria o seguinte:
var isSelected = dojo.attr(option, "selected", vlrQueQueremosSetarParaOAtributoSelected);
Perceba que a sintaxe é bem parecida. A linha :
dojo.attr(txtResultado, "value", resultado); usa essa alternativa pra setar o atributo value do inputText pra mostrar o somatório das respostas sim.


Uso Dojo há pouco tempo e acho essa biblioteca muito legal. Cada exemplo desse é um uso basicão de cada uma das sintazes, esses comandos tem muitas variações.