18th mai 2010

Script para baixar arquivos do SVN e gerar .zip automaticamente

Depois de zilhões de meses fazendo isso manualmente aqui na agência, resolvi me aventurar nesse misterioso e nada mágico mundo do shell script. Até que não achei complexo.
Não vou me dar ao trabalho – aliás, não o faço ultimamente nos meus últimos posts… ando sem paciência – de explicar linha a linha. O que o script faz é receber por parâmetro o caminho do SVN para fazer checkout e o caminho da pasta onde deve ser gerado o .zip. Com isso, ele se conecta ao SVN, faz checkout, gera o .zip e apaga a pasta com os arquivos.

Obs.: não esqueçam que isso só funciona em unix e que o arquivo gerado com esse conteúdo deve ter permissão 777 para ser executado.

#! /bin/sh
clear
svnpath=$1
rootfolder=$2
subfolder=$rootfolder”sub/”
svn checkout $svnpath  $subfolder
sudo find $rootfolder -iname “.svn” -exec rm -fr {} \;
cd $subfolder
zip -r package.zip *
mv package.zip $rootfolder
rm -rf $subfolder

Exemplo de chamada (imaginando que foi gerado um arquivo com o nome package.sh):
./package.sh http://myserver/myclient/svn/trunk/ /home/mmc/myfolder/

Posted by Posted by Chris under Filed under linux Comments 2 Comments »

28th abr 2010

Sem som no flash ao atualizar o Firefox 3.6 no Ubuntu

No post passado falei que para testar algumas coisas, era necessário usar o Firefox 3.6
Bem, eu fiz isso por aqui, no Ubuntu 9.10, e parou de funcionar o som no flash player. Claro, coisas bizarras das integrações entre Ubuntu/Firefox e os plugins; toda vez que atualizo a versão do Firefox, dá esse erro.

Se você passou por isso, segue o meu procedimento – simples – para corrigir. Atualizar a versão do flash player direto do site.

Voi-lá!

Posted by Posted by Chris under Filed under linux Comments 2 Comments »

18th abr 2010

Upload de arquivos do file system direto pela interface web

Certa vez, anos atrás, pesquisei como seria possível fazer upload de arquivos do desktop direto para uma aplicação web, arrastando-e-colando. Não era.
A única coisa que achei seria implementando um java applet ou alguma solução proprietária – a Microsoft tem um lance desses no Sharepoint, o CMS deles. Desencanei.

Ai, semana passada saiu uma notícia que era possível fazer isso pelo Gmail. Acredito que a solução a qual eles chegaram não é a mesma que eu encontrei na web, mas acredito que seja algo do gênero. Basicamente, dá pra fazer isso com HTML5 se você estiver usando um browser adequado. Adequado, nesse contexto, é o Chrome 2.0+ ou Firefox 3.6

Não vou me dar ao trabalho de fazer uma explicação muito didática; se você chegou até aqui, acredito que tenha experiência em desenvolvimento de interfaces web e vai entender o que estou falando. Se não, dê alguns passos para trás antes de continuar.

Com o HTML5, muita coisa diferente em javascript foi implementada. Para o usuário poder arrastar-e-colar arquivos do file system para uma interface web, são usadas 2 funcionalidades (desculpem o nome, não achei um mais adequado):

  • File API
  • XMLHttpRequest 2

Com o primeiro (File API), você consegue manipular arquivos que são “arrastados-e-colados” para uma certa área da sua página. Manipular, nesse caso, pode ser muita coisa, mas você consegue saber o nome, file syze, content type, conteúdo do mesmo (em binário, por exemplo), etc…
Com o XMLHttpRequest versão 2 é possível fazer o envio de dados nas suas requisições em formato binário. E bacana é que existem métodos nativos para saber o status e a porcentagem da mesma – ou seja, você consegue criar uma progress bar, por exemplo.

Vou colar logo abaixo o conteúdo da página de teste, que possui comentários. Sei que o post ficou meio superficial, mas ele serve mais como referência para vocês saberem mais uma coisa do que é possível ser feito com HTML5!

Url de teste: http://www.chrisb.com.br/teste.html
*no caso, arraste arquivos do file system para a caixa com bordas pretas.

<html>
<head>
<script>

function dodrop(event) {
//retorna os arquivos que estão sendo transferidos
var dt = event.dataTransfer;
var files = dt.files;
//percorre os arquivos
var count = files.length;
output(“File Count: ” + count + “\n”);
for (var i = 0; i < files.length; i++) {
//escreve infotmações do arquivos
output(” File ” + i + “:\n(” + (typeof files[i]) + “) : <” + files[i] + ” > ” +
files[i].name + ” ” + files[i].size + “\n”);
new FileUpload(files[i]); //instancia objeto dessa classe, passando o arquivo para o construtor

}
}

function output(text) {
document.getElementById(“output”).textContent += text;
dump(text);
}

function FileUpload(file) {

//cria objeto para requisições assíncronas
var xhr = new XMLHttpRequest();

//cria listeners para o upload (que é quando o xmlhttprequest está enviando o arquivo):

//para o durante o processo
xhr.upload.onprogress = function(e) {
if (e.lengthComputable) {
var percentage = Math.round((e.loaded * 100) / e.total);
document.getElementById(“p”).innerHTML = percentage;
}
}

//caso ocorra algum erro
xhr.upload.onerror = function(e){
alert(“Erro”);
}

//quando finalizar o upload
xhr.upload.onload = function(event){
document.getElementById(“p”).innerHTML = 100;
}

//abre a conexão; o segundo parâmetro é da url a ser requisitada, que recebe o arquovo
xhr.open(“POST”, “http://www.chrisb.com.br/up.php”);
xhr.overrideMimeType(‘text/plain; charset=x-user-defined-binary’);

//cria objeto FileReader para ler o arquivo
var reader = new FileReader();
//quando acabar de ler o arquivo…
reader.onload = function(e) {
//pega o retorno da função, que é um dado binário
var bin = e.target.result;
//e faz o xmlhttprequest enviar como binário
xhr.sendAsBinary(bin);
};
reader.readAsBinaryString(file); //lê o arquivo como binário

}

window.onload = function() {
var output = document.getElementById(“output”);
output.ondragenter = function(event) {
document.getElementById(‘output’).textContent = ”; event.stopPropagation(); event.preventDefault();
}
output.ondragover = function(event) {
event.stopPropagation(); event.preventDefault();
}
output.ondrop = function(event) {
event.stopPropagation(); event.preventDefault();
dodrop(event);
}
}

</script>
</head>
<body>

<div id=”output” style=”min-height: 100px; white-space: pre; border: 1px solid black;”></div>
<span id=”p”></span>
</body>
</html>

Posted by Posted by Chris under Filed under javascript Comments 3 Comments »

22nd mar 2010

Links bacanas sobre Progressive Enhancement e Graceful Degradation

Se você trabalha com interfaces web, pode não ter ouvido falar (ainda) desses dois conceitos, mas certamente muito já discutiu sobre eles. Semana passada comecei a ler mais profundamente a respeito; ainda não tenho uma opinião formada sobre ambos, nem se uma é melhor do que a outra ou, ainda, se alguma delas pode ser levada ao pé da letra no ciclo de vida de um projeto web.
Resumidamente, Graceful Degradation é sobre ter sua interface web funcionando em todos os dispositivos que o acessem, mesmo que aqueles com menos recursos tenham uma perda de qualidade e usabilidade (ou seja, a interface vai se degradando; você foca no melhor dispositivo). Já o Progressive Enhancement foca em definir um dispositivo com o mínimo de recursos (no caso, um browser mais antigo) no qual a sua aplicação seja funcional e usável, e para cada dispositivo melhor você terá funcionalidades extras, que usarão recursos do dispositivo que versões mais antigas não possuem (ou seja, sua interface vai melhorando/progredindo).
Seguem abaixo alguns links bem interessantes sobre o assunto:

Posted by Posted by Chris under Filed under Tecnologia Comments 3 Comments »

02nd mar 2010

My Category Order – como ordenar categorias no WP

Antes de mais nada, deixem-me dar um olá. Faz quase 3 meses que não posto – parei antes do Natal e fiquei um bom tempo off. Por diversos motivos, os quais não vem ao caso. Muitos problemas daquela época ainda continuam, mas vou tentar voltar a postar – não sei com qual frequencia – coisas úteis para os demais desenvolvedores web (preferencialmente os voltados à interface).

Como um recomeço, fica a dica desse plugin do WordPress, o My Category Order. Ele permite que você ordene as categorias e sub-categorias criadas de maneira muito fácil: drag’n drop. Conheci esse plugin depois de uma vasculhada no Google quando aoareceu um requisito num projeto: o cliente precisaria ordenar os itens de um menu, que são as categorias.

Depois de instalado, na área de administração é tudo feito de maneira simples. No template, para listar as categorias por essa ordem, use orderby=order.

Por exemplo: wp_list_categories(‘orderby=order’)

url: http://wordpress.org/extend/plugins/my-category-order/

Posted by Posted by Chris under Filed under php, wordpress Comments 2 Comments »

17th dez 2009

Agora, só em 2010

GalerE, vou aproveitar que não tenho atualizado muito o blog (desde o começo da semana, nunca fiquei tanto tempo sem colocar algo por aqui) devido a inúmeros fatores – cansaço, muito trabalho, falta de inspiração, preocupações pessoais que tiram o sono – para finalizar os trabalhos por aqui nesse ano de 2009 – o primeiro ano completo.

Muita coisa continuou acontecendo: conheci gente bacana, troquei idéias, escrevi mais do que nunca, aprendi bastante, fui alvo de stalker… ou seja, o normal na vida de quem desenvolve e expõe conteúdo.

tux-christmas

Então, para aqueles que não são anti-festas de final de ano, desejo um Feliz Natal a todos e que a virada de ano traga coisas boas.

Posted by Posted by Chris under Filed under Pensamentos Comments 2 Comments »