quarta-feira, 9 de dezembro de 2009

Thunderbird 3.0, primeiras impressões.

É com alguma amargura que escrevo estas palavras, na verdade nem vou escrever muito porque tenho a nítida sensação que muito brevemente "as coisas vão mudar de figura"!

Já tive a oportunidade de referir o Thunderbird e algumas experiências muito positivas que tive ele aqui e aqui. Confesso que depois de começar a usar o Thunderbird, então na versão 2, nunca mais usei outro cliente de email. Claro que nessa versão fazia-me falta uma ferramenta de calendário, mas consegui resolver bem o assunto instalando o Lightning. Esta semana instalei a recém publicada versão 3.0 do Thunderbird e se as primeiras impressões foram excelentes, pouco tempo depois da instalação estava já com vontade de regredir para a versão 2 novamente. Tenho vindo a acompanhar o "disse que disse" do desenvolvimento do Thunderbird e dizia-se que iria ter suporte nativo a agenda, o que não é verdade. Além disso o Lightning de momento não é compatível com o Thunderbird 3.0, por isso praticamente inviabiliza o meu interesse na ferramenta. Não faz sentido uma ferramenta deste tipo não ter uma agenda! A única coisa que me mantém para já em suspenso é o facto de eu estar a usar o Google Calendar e ter a minha agenda toda online. É um risco é certo, mas na versão anterior do Thunderbird eu conseguia sincronizar facilmente a minha agenda no Lightning com o Google Calendar e tinha o melhor dos 2 mundos, se estivesse fora podia (e posso) recorrer ao calendar, se estivesse a usar o meu portátil sentia-me mais confortável a usar o meu cliente de mail favorito!

Posto isto resta-nos aguardar que a equipa do lightning se chegue à frente com uma actualização da ferramenta para apaziguar as almas de todos os utilizadores do Thunderbird.



Para ser notificado de cada vez que eu publicar um artigo, subscreva a minha RSS (o que são feeds RSS?).

quarta-feira, 18 de novembro de 2009

Playback contínuo no VLC.

O VLC é o leitor multimédia que uso mais regularmente. Eu gosto de usar o VLC, acho-o leve, suficientemente discreto e além de permitir visualizar todos os vídeos com todos os codecs que me consigo lembrar, ainda tem um conjunto de funcionalidades ímpar (streaming, efeitos realtime, etc...). Hoje deparei-me com uma pequena dificuldade, queria colocar um vídeo a correr contínuamente e não estava a conseguir. A solução é simples mas não tão obvia como seria de esperar. É necessário activar a opção de loop contínuo que está na definição das preferencias na playlist.

Estas opções apenas aparecem no menu "Tools/Preferences". Na janela que surge escolher no canto inferior esquerdo a opção "All" de "Show Settings". Depois ainda na coluna da esquerda seleccionar a opção Playlist e em seguida escolher à direita a opção que mais nos convém.



http://www.videolan.org/vlc/

Google Image Swirl

A Google tem mais uma aplicação fantástica online: o Google Image Swirl. Trata-se de uma forma mais interactiva de pesquisar imagens e de navegar posteriormente pelas imagens encontradas de uma forma muito natural e intuitiva. Uma vez encontrada uma imagem do tema que procurarmos, basta ir clicando nas diversas imagens e ir "entrando" nas imagens relacionadas até encontrar "aquela" imagem!

Muito bom!

http://image-swirl.googlelabs.com/

quinta-feira, 12 de novembro de 2009

Como determinar numa base de dados quais as tabelas que contém um determinado campo?

Há dias deparei-me com a necessidade de determinar quais as tabelas que continham um determinado campo. Tratava-se de uma chave estrangeira que eu já tinha visto que estava a ser designada em várias tabelas da mesma forma: FuncionarioID. A solução é muito simples, basta consultar as tabelas sys.tables e sys.columns:

USE MyDB
GO
SELECT t.name AS table_name,
SCHEMA_NAME(schema_idAS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID c.OBJECT_ID
WHERE c.name LIKE '%FuncionarioID%'
ORDER BY schema_nametable_name;



Mais informação sobre este assunto em: http://msdn.microsoft.com/en-us/library/ms345522.aspx

quarta-feira, 4 de novembro de 2009

Criação de interfaces gráficas em Java usando Cardlayout

Vou abrir aqui um precedente e colocar um pequeno vídeo, não editado, com uma ajuda para uns amigos meus. Se o tempo o permitir, fica a promessa de criar uns vídeos mais produzidos e mais temas abordados.

Por vezes surge a necessidade de organizar a interface gráfica de uma aplicação em painéis separados que são apresentados ao utilizador em função de opções que ele faz, por exemplo, num menu.

Utilizando o Netbeans (ferramenta que uso para criação de aplicações em Java), ao criar uma nova aplicação Java desktop, são criados vários ficheiros sendo que, um deles, é a aplicação principal (normalmente uma classe com a designação XPTOView.java). No painel inspector, vemos que este formulário é composto por vários objectos:
  • FrameView – a janela propriamente dita
  • mainPanel – um JPanel onde são colocados os diversos controlos
  • menuBar – um JMenuBar: o menu que é apresentado no topo do ecrã
  • statusPanel – um painel que faz a divisão do painel principal e apresenta uma barra barra de estado no rodapé
A ideia então é usar o mainPanel para ir apresentando os diversos ecrãs ao utilizador. Para tal devemos indicar ao mainPanel que queremos usar o layout cardlayout e acrescentar ao mainPanel o conjunto do panels que são necessários para mostrar as diversas interfaces da aplicação. Imaginem um baralho de cartas onde cada carta é uma interface gráfica com o utilizador, é precisamente disso que se trata.

O Netbeans suporta este conceito de forma muito simples.

1.Crie uma nova aplicação Java Desktop (Basic application).
2.No painel Inspector, clicar com o botão direito do rato no mainPanel e definir o layout como CardLayout.
3.Ainda no Inspector e sobre o mainPanel clicar com o botão direito do rato e fazer "Add from Panel" / "Swing containers" e adicionar quantos painéis os desejados.
4.Cada painel associado vai ter um "cardname" (veja o painel Properties a secção Layout de cada “subpainel”).
5.Ao menu adicione alguns “menu items” por exemplo no menu File.
6.Desenhar os paineis...
7.A cada item do menu que adicionou em 5 ligue os respectivos eventos.
8.Em cada evento o que vamos fazer é indicar qual o painel a mostrar no mainPanel. Para tal temos de criar uma instância do objecto Cardlyout e indicar-lhe qual o card a mostrar:

1.//Obtém a instância do cardlayout associado ao mainPanel
CardLayout cl = (CardLayout)(mainPanel.getLayout());


//Activa o painel cujo card name é card2.
cl.show(mainPanel, "card2");

sábado, 31 de outubro de 2009

O que é o RSS Feed?

RSS é uma sigla para "Really Simple Syndication", que consiste numa maneira fácil de saber se um determinado site ou base de dados tem novas entradas sem ter que aceder ao site em questão constantemente. Ao subscrever RSS feeds, e utilizando um leitor de RSS, poderá consultar conteúdos de várias fontes na web e visualizar estes conteúdos numa única página, de forma integrada. Sempre que o site ou serviço for actualizado, será notificado no seu leitor de feeds dessa actualização.


Como posso utilizar o RSS Feed?
Registe-se num RSS Reader via web ou obtenha mediante download um programa RSS Reader. Uma parte dos programas de email também já têm leitores de RSS.

Na web poderá seleccionar um dos seguintes:

MyYahoo - http://my.yahoo.com/s/nytimes.html

Google Reader - http://www.google.com/reader/view/#overview-page

Bloglines - http://www.bloglines.com/

SharpReader – http://www.sharpreader.net/


Depois de ter um RSS Reader instalado basta subscrever o canal que tenha os dados que deseja receber. As funcionalidades RSS feed são identificadas por icons standard, por isso muito fáceis de identificar. Clique no icon e copie o URL correspondente para o RSS Reader. A própria barra de endereço do seu browser pode indicar a presença de um Feed no site que está a consultar.

Adaptado de:  http://www.doc.ua.pt/PageImage.aspx?id=8146

terça-feira, 27 de outubro de 2009

Keepass


Aqui vai mais uma ferramenta que eu uso regularmente, o Keepass.

Esta pequena aplicação, que uso na versão portable, permite armazenar com segurança todas as passwords que orgulhosamente vamos coleccionando ao longo da vida. Acontece que, tirando honrosas excepções, a maior parte das passwords eu acabo por esquecer. Acreditem que já tentei várias estratégias, desde usar sempre a mesma password para determinados serviços, por exemplo, a usar mnemónicas, mas acabo por me afeiçoar às ditas cujas e às tantas começo a desconfiar se não será melhor ideia criar uma nova password e ... pronto! Nos poucos dias que ocupam uma semana lá eu crio umas 4 ou 5 novas passwords!

Esta ferramenta é interessante porque armazena os dados com encriptação (o que é uma garantia de segurança acrescida). Embora apresente uma interface gráfica um bocadinho... austera, a verdade é que conta com alguns mecanismo de usabilidade muito interessantes. Só um exemplo: depois de inserir um registo, Ctrl+B copia o user name desse registo e Ctrl+C copia a password, um miminho!

A consultar: http://keepass.info/

segunda-feira, 26 de outubro de 2009

III edição em Aveiro do Workshop InDesign


Vai-se realizar já no próximo fim-de-semana de 31 de Outubro e 1 de Novembro 7 e 8 de Novembro o III Workshop de InDesign, pela formadora Dalila Ferreira. Esta é uma edição especial "documentos científicos".

Estes workshops funcionam nas instalações do Clube dos Galitos em Aveiro. Para mais informações contactar dalila.dsf@gmail.com.

sábado, 24 de outubro de 2009

Ninite.com

Acabo de descobrir mais uma pérola no ciberespaço. Costumo usar uma série de pequenas (ou grandes) aplicações especializadas na mais diversas áreas, desde o simples editor de texto notepad++ a ferramentas de produtividade, criatividade, design, edição de som, vídeo, etc. Enfim um vasto leque de aplicações que vão alimentando este meu desvario diário com o computadores.

Acontece que quando se muda o sistema operativo ou se instala uma máquina nova, lá vem a trabalheira de instalar todas as ferramentas e plug-ins e outros quejandos. Ora é aí que entra a minha descoberta! O site ninite.com tem uma grande lista de aplicações open source que podemos escolher juntando-as todas num package único de instalação, tornando assim a nossa vida muito mais simples.

Um forte abraço à malta do nitite porque tiveram uma iniciativa verdadeiramente genial e útil.

A visitar: http://ninite.com/

sexta-feira, 9 de outubro de 2009

Workshop Adobe InDesign

Vai decorrer nos próximos dias 24 e 25 de Outubro uma nova edição de um workshop de InDesign. Estes workshops, de carácter muito prático, decorrem na sede do Clube dos Galitos. Para mais informações contactar dalila.dsf@gmail.com ou o site www.galitos.pt.

terça-feira, 6 de outubro de 2009

Mensagem de reply no topo (Thunderbird)

Por uma razão que desconheço, o Thunderbird (cliente de correio da Mozilla) coloca as respostas a mensagens de correio electrónico no final das mensagens recebidas. É prática corrente responder às mensagens de correio no topo das respostas e não no fim.

Andei de voltas das opções de configuração do Thunderbird e não consegui dar com o gato à primeira, por isso resolvi escrever as minhas últimas descobertas no "mundo encantado do Thunderbird".

Aqui vai o método para alterar o comportamento por omissão do Thunderbird nestes casos:

Primeiro abrir o menu Tools > Options:


Clicar em Config Editor e na caixa de filtragem escrever:

Fazer duplo clique na linha “mail.identity.default.reply_on_top” e alterar o valor para 1:


Para terminar clicar em Ok e fazer restart ao Thunderbird.

Agora quando se responde a uma mensagem o cursor já é colocado no início da mensagem.

Post original: http://init.sh/?p=66

quarta-feira, 30 de setembro de 2009

Zoom de ecrã em apresentações (revisitado)

Num post anterior eu apresentei-vos uma ferramenta que uso com frequência nas minhas apresentações, o ZoomIt. Também já vos falei das minhas aventuras e desventuras com o meu computador nas férias passadas. Quem me conhece sabe que embora eu seja um grande entusiastas destas "coisas dos computadores" a verdade é que demoro algum tempo a aderir aos últimos gritos na área. Enquanto estiver satisfeito com o que tenho dificilmente enveredo por novas andanças.

A última vez que isto me aconteceu, passaram 3 anos e perdi o contacto maravilhoso com o Windows Vista. Quer isto dizer que... sim ;) é verdade estou a usar o Windows 7. Até me sinto mais jovem e tudo! Mas vamos ao que interessa.

O Windows 7 vem de raiz com uma pequena ferramenta que permite fazer zoom do ecrã que é fantástica para fazer apresentações (em especial quando se trata de mostrar código em salas relativamente grandes). Bem sei que os SO concorrentes já o fazem à décadas, mas quando se de copiar, ... há que copiar bem! Bom e já agora ficam os atalhos para a sua utilizar. Para abrir a aplicação "tecla windows" e "tecla +", para ampliar "tecla windows" e "tecla +" e para diminuir: "tecla windows" + "tecla +".


Abraços.

sábado, 26 de setembro de 2009

Passagem de valores entre Forms em aplicações Windows em C#

Colocaram-me a questão de como passar valores entre janelas numa aplicação Windows em C#. Como trabalho substancialmente para a web não soube responder imediatamente, mas uma pesquisa no Google fez-me chegar rapidamente a uma solução. Este é um daquele tipo de coisas que pode ter muitas soluções, é caso para se aplicar o velho ditado "Cada cabeça, sua sentença"!

A solução que apresento é tão válida como outra qualquer, desde que responda à questão/problema inicial: "Como passar valores entre forms?".

Sendo que todos os forms são objectos e observando que o construtor é fundamental para o arranque do form (já que é ele quem invoca o método InitializeComponent() definido na parte Designer.cs dos forms, podemos usar precisamente o construtor para passar valores de um form para o outro.

Vamos "esmiuçar" (Gatos, gatos... o que vocês andam a fazer à sociedade portuguesa!) isto com mais cuidado. Vou criar uma Windows Application em C# com 2 forms com as designações por omissão dadas pelo Visual Studio (Form1 e Form2). Cada um destes Forms correspondem a uma classe que o VS subdivide em 2 partes, uma parte gerida pelo próprio ide (o ficheiro Form1.Designer.cs) e a outra parte que habitualmente usamos para tratar os eventos do form.


O Form1 vai conter uma caixa de texto e um botão que ao ser premido passará o valor escrito na caixa de texto para o Form2. Portanto o Form1 irá conter 2 controlos o textBox1 e o button1, o Form2 conterá apenas um label, o label1.

No Form2 vamos fazer o overload do construtor (uma característica importante da POO, que pode ser traduzido pela propriedade de podermos ter numa mesma classe diversos métodos com o mesmo nome, mas desde que cada uma das versões tenha uma lista de parâmetros diferente), por forma a passar como parâmetro o form1.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

public Form2(Form1 frm): this()
{
label1.Text = frm.txt1.Text;
}
}
}



Desta forma, ao instanciarmos um objecto de Form2 podemos opcionalmente indicar que queremos passar para esse objecto um objecto da class Form1.

Agora podemos através do objecto frm na classe Form2 percorrer os controlos de Form1 ou então podemos tornar o objecto textBox1 do form1 como público! Podemos fazer isso facilmente trocando o acesso no ficheiro Form1.Designer.cs de privado para público Acrescentando uma propriedade pública ao Form1 correspondente ao controlo textBox1 (este método é mais seguro, já que não se alteram partes do código gerados pelo Visual Studio):


Agora no Form2 aceder à textBox1 do form1 é mais simples que descascar uma banana!




public Form2(Form1 frm): this()
{
label1.Text = frm.txt1.Text;
}



Agora já só falta associar ao evento click no form1 a abertura do form2:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(this);
f2.Show();
}
}
}



O espectacular resultado final é este:


Um abraço e boas programações!

sexta-feira, 18 de setembro de 2009

Descobri a API Google Visualizations e quase chorei!

Num dos meus últimos projectos precisei de representar grandes quantidades de dados numa forma gráfica (que aliás é como deve ser!). Depois de muito procurar e de infindáveis tentativas falhadas, ora porque o resultado não presta, ora porque não funcionava no IE, ora porque isto, ora porque aquilo, acabei por me render à livraria de John Glazebrook, a Open Flash Chart, mas confesso que não obstante a livraria ter muita qualidade o resultado não me deixou satisfeito, porque me obrigava a fazer muitas coisas para obter resultados, ainda que bonitos, no mínimo considero-os pouco funcionais.

Foi neste estado de ansiedade e insatisfação que me encontrei de novo à procura de novas soluções e encontrei finalmente a Google Visualization API. Eu sei que por vezes pode parecer que eu exagero na animosidade com que falo das coisas, mas esta API é de facto um verdadeiro colosso! É extraordinária a simplicidade com que se conseguem desenhar gráficos fabulosos e mais excepcional é a forma ridiculamente simples de o conseguir.

Fica mais um link para os exemplos disponibilizados... vejam e babem!

domingo, 6 de setembro de 2009

Thunderbird e Google Calendar os meus novos melhores amigos!

O meu computador morreu nestas férias. Foram 3 anos de boa convivência e, embora tenha reclamado dele desde o primeiro dia, a verdade é que este HP DV4000 é uma máquina de guerra. Vai certamente deixar saudades, ou quiçá encontrar novas funcionalidades... a avaria foi ao nível da mother board, mas é possível que ainda a consiga consertar. Bom, o que é certo é que eu não consigo viver sem um computador devidamente kitado com o software certo, por isso já estou a teclar num novo Toshiba. Trata-se de uma máquina de arquitectura muito recente mas entrada de gama. Optei por este propositadamente para ver o que consigo fazer com uma máquina destas. Até ver... muito! Mas chega de conversa vamos ao que realmente interessa.

Sou dependente. Dependo do meu email e agenda como da água para viver! A passagem dos meus contactos e configurações diversas no Outlook foi um autentico desastre. Reparem, eu tinha backups de toda a informação no formato proprietário (?!) da Microsoft, mas não me serviu de nada porque o novo Live Mail não gostou dos PST do Outlook 2003. Resolvi experimentar o Thunderbird. Confesso que as minhas experiências no passado com ele não foram as melhores, mas desta vez estava determinado. Depois de uns dias a tentar importar dados para o Live Mail sem sucesso, se dúvidas houvessem estavam dissipadas. 

A importação de dados no Thunderbird também não foi pacífica, mas o perfil de utilizador no Thunderbird é ridiculamente simples de partilhar. Basta copiar a informação de uma pasta de uma máquina para outra! Num dia de sorte lá consegui fazer o meu velho HP funcionar por uns minutos, instalei um Thunderbird portable e importei os dados de emails locais, contactos e agenda. Depois já na máquina nova bastou-me copiar os dados do perfil "et voilá"! Só isto já me fez render ao Thunderbird, mas havia mais uns truques na manga. 

Eis que descobri que é possível sincronizar a agenda do Thunderbird com o Google Calendar - ouro sobre azul. Agora posso aceder ao meu calendário na nuvem ou em casa no conforto do meu Thunderbird.

Só mais uma nota, se tivermos vários sistemas operativos, porque o Thunderbird está disponível para vários SO, podemos partilhar o perfil do Thunderbird e usá-lo nos vários SO. Isto é notável! Há no entanto uma ressalva, o Linux não se dá bem com partições NTFS, pelo que o ideal é criar uma partição FAT32 e colocar aí o perfil de utilizador do Thunderbird, para que possamos usá-lo em qualquer SO!


terça-feira, 1 de setembro de 2009

A importância da prototipagem

Em todos os projectos em que nos envolvemos devemos ter o cuidado de os documentar cuidadosamente. O desenvolvimento de sistemas de informação não é excepção. Eu diria até que um projecto de SI é bem sucedido se tiver um bom dossier de documentação.

Há imensas metodologias e tecnologias que ajudam a suportar as necessidades de documentação de projectos de SI. o artigo anexo apresenta algumas soluções interessantes para o desenho de protótipos de interfaces que podem ser muito úteis numa perpectiva mais voltada para o design dos sistemas e não tanto na engenharia dos mesmos.

http://www.onextrapixel.com/2009/07/15/the-importance-of-wireframes-in-web-design-and-9-tools-to-create-wireframes/

terça-feira, 7 de julho de 2009

Warning: JSLint will hurt your feelings.

Se trabalha para a WEB e se não conhece o JSLint (http://www.jslint.com/), então chegou a hora de o conhecer.

O JSLint é um parser online que valida a qualidade do JavaScript que escrevemos. É uma ferramenta de utilidade extrema e que além de nos magoar o ego ainda nos ajuda a escrever melhor código. É incrível como ao longo de tantos a anos a escrever JavaScript, ainda uso esta ferramenta para me ajudar a melhorar o código!

Eu já passei a fase do "will hurt your feelings" e agora uso-a regularmente em especial quando estou com preguiça para pensar e escrever o código com a melhor qualidade. Nada como uma voltinha ao nosso código no JSLint para acordar!

quinta-feira, 2 de julho de 2009

Números mágicos, o web.config e as appSettings!

Esta semana falava tangencialmente a propósito dos números mágicos numa sessão de formação e, por isso,
resolvi escrever um pouco sobre este assunto e uma possível solução global para o caso das ASP.NET.

O termo "magic numbers" no contexto da programação de computadores pode ter várias interpretações (http://en.wikipedia.org/wiki/Magic_number_%28programming%29), mas interessa-me particularmente aquela que diz respeito à utilização de valores numéricos no decorrer do código fonte de um programa.

As boas práticas de programação aconselham a definição e utilização, para este efeito, de constantes. No entanto, vê-se muitas vezes a utilização de valores numéricos directamente no código. A utilização de valores numéricos directamente no código tornam obscura a intenção de escolha do programador e favorecem o aparecimento de erros subtis e dificultam adaptações futuras do programa. A utilização de constantes "magic numbers" facilitam, portanto, a leitura, compreensão e manutenção de um programa.

No caso de um sistema de informação desenvolvido em ASP.NET muitas vezes pretende-se reutilizar uma constante em várias partes do sistema. O ficheiro web.config permite a definição de constantes globais através da secção .

Exemplo de uma variável definida no web.config:

<configuration>
<configSections>
...
<appSettings>
<!--Número de dias durante os quais o registo é
válido -->
<add key="numDiasRegistoValido" value="2" />
</appSettings>
...

No código para aceder a esta variável, basta fazer o seguinte (em C#):



int numDias = default(int);
if(!int.TryParse(System.Configuration.ConfigurationSettings.AppSettings["numDiasRegistoValido"], out numDias)){

//Código que precisa da variável numDias...
//...
}



No exemplo, tenta-se ler o valor da variável, se formos bem sucedidos, numDias assume o valor 2, caso contrário mantém-se o valor default do tipo da variável (no caso int).

quarta-feira, 1 de julho de 2009

Parem as máquinas, ponham o capacete, apertem os cintos de segurança... vamos navegar à velocidade da luz!

O Firefox 3.5 está aí! Que loucura...

Confesso que depois de o instalar ainda passei por um momento de pânico. As minhas extensões não funcionavam praticamente todas e depois da instalação a excitação era tanta que não vi o botão "actualizar extensões"! Vi a vida a andar para trás... não consigo viver sem o Firebug, pixel perfect, o web developer ou o IE Tab.

Respirei fundo, abri o google (em milésimos de segundo, como habitual, mas não sei porquê pareceu mais rápido). Search: "firefox 3.5 extensions not working" ... mais uns milésimos e milhares de respostas. Cliquei na primeira. Versava o seguinte "A primeira coisa a fazer no Firefox é clicar em actualizar extensões" (já não sei o link). Nervoso, fui ao menu Ferramentas/Extensões/actualizar et voila!

Tudo a funcionar.

Ah, já disse que o Firefox 3.5 é muito rápido?

terça-feira, 30 de junho de 2009

O (des)controlo de cache no IE e os pedidos AJAX.

Um problema simples e muitas dores de cabeça!

Recentemente estive a trabalhar num problema no mínimo inquietante. Tratava-se de uma funcionalidade AJAX que permitia adicionar linhas a uma tabela que era refrescada dinamicamente em função dos dados inseridos num post AJAX.

O request tinha este aspecto:

new Ajax.Request('$UrlHelper.For("%{action='addRow'}")',
{
method: 'get',
parameters:Form.serialize('CFNew'),
onSuccess: RefreshTable,
onFailure: showErrorMessage
});

O pedido saía do cliente correctamente e atingia o servidor que efectuava uma operação e devolvia uma tabela HTML que era refrescada na função RefreshTable. E tudo funcionava bem até que cheguei aos testes com o IE. No Firefox, Opera, Chrome e Safari tudo corria às mil e uma maravilhas no IE, o primeiro pedido era correctamente efectuado ños seguintes não acontecia nada (caso enviasse os mesmo dados no request).

Tratava-se de um problema de cache, os pedidos HTTP circulavam correctamente em qualquer browser, mas no IE as coisas estavam completamente paradas. Uma limpeza de cache e o pedido seguia com sucesso, novamente os seguintes ficavam bloqueados. Implementadas todas as técnicas ao nível do servidor ao nível dos cabeçalhos do protocolo HTTP já não me ocorria nada até que … se fez luz!

Para garantir (pelo menos tentar) que cada pedido era distinto do anterior bastou adicionar um campo hidden no formulário e preenchê-lo com um valor dummy, por exemplo a data actual no cliente. No formulário acrescentei então um campo hidden RTP (de RequestTimeStamp) e no script que faz o request preencho-o com a data:

$('RTP').value = new Date().getTime();
new Ajax.Request('$UrlHelper.For("%{action='addRow'}")',
{
method: 'get',
parameters:Form.serialize('CFNew'),
onSuccess: RefreshTable,
onFailure: showErrorMessage
});

Agora mesmo que se façam 2 pedidos com os mesmos dados há sempre um valor que difere e a cache no IE deixa de actuar.

quinta-feira, 25 de junho de 2009

Programa de testes de qualidade de dados em dispositivos de armazenamento ópticos

O armazenamento profissional de dados em dispositivos ópticos deve obedecer a regras e cuidados específicos. O tempo de vida de CDs e DVDs não é infinito, a escolha de tintas para anotar nesses dispositivos também é importante porque os ácidos das tintas podem corroer os discos e até a forma como são manuseados é importante, porque a transpiração também pode corroer a superfície destes discos.

De tempos a tempos os dados devem ser verificados com software específico. O programa MediaChecker (disponível em http://noeld.com/programs.asp?cat=misc#mchecker) dá uma ajuda e pode até ser executado em máquinas antigas.

(Fica prometido para breve um post mais completo sobre este assunto!)

segunda-feira, 22 de junho de 2009

Debugging JavaScript com prettyPrint

“prettyPrint” is an in-browser JavaScript “variable dumper”

Uma das coisas que acho fundamental na caixa de ferramentas de um programador são ferramentas de debugging. Sou um fã do Firefox e para fazer debug de JavaScript não há melhor que o firebug. Mas por vezes também é útil escrever no próprio código instruções que permitam a inspecção rápida de variáveis. É aí que entra o prettyPrint.

A sua utilização é muito simples, basta fazer a referência ao ficheiro prettyprint.js. Depois basta:
var tbl = prettyPrint( myObject );
document.body.insertBefore( tbl, document.body.firstChild );
A função prettyPrint devolve uma tabela que podemos imprimir em qualquer lugar da página, por exemplo no início da mesma como no exemplo.

Consultar: http://github.com/jamespadolsey/prettyPrint.js/tree/master

sexta-feira, 5 de junho de 2009

Porque a vida é feita de pequenas coisas ...

A atenção ao detalhe é muito importante e os icons, são grandes detalhes!

Uma forma simples e eficiente de melhorar a sensação de qualidade num site passa, por exemplo, por criar um bom icon para associar a uma página ou sistema de informação. Não vou aqui falar sobre como devemos construir o dito icon, mas sim de uma dificuldade que tenho visto muita gente sentir, onde raio se editam e gravam os ficheiros ".ICO"?

Confesso que sou fã do Photoshop e o Photoshop não permite gravar ficheiros com o formato ICO (pelo menos até onde eu o conheço!). Para tal são necessários plug-ins. Confesso que tenho tido problemas quando se trata de usar transparência em ficheiros ICO, mas acabei de encontrar um plug-in para o Photoshop muito bom que grava os ditos ICO's sem espinhas e até mesmo com a dita transparência. Consultar: http://www.telegraphics.com.au/sw/

Claro que sou fã do Photoshop, mas e o que dizer do GIMP? É ainda melhor, é barato e dá milhões! Os ICOs no GIMP também funcionam muito bem, com e sem transparências. Ah! E não esquecer que para colocar ICOs na web é preciso respeitar o tamanho correcto da imagem... mas isso fica para outro post!

segunda-feira, 1 de junho de 2009

Typing-meister!

... depois de um longo interregno e sabendo que já tenho uma legião de fãs (um forte abraço Sérgio!) aqui vai ...

Uma das coisas que me deixa mais impressionado com os geeks de filmes e séries de acção é a velocidade incrível com que eles escrevem autênticos doutoramentos em comandos no teclado de um qualquer servidor a piratear! (à parte desta fabulosa capacidade, impressionante mesmo, só a extraordinária capacidade de decifrarem qualquer password de acesso a sistemas de segurança dos mais invioláveis possíveis!). Confesso que já dei por mim várias vezes a tentar melhorar a minha performance de escrita e o que é incrível é que realmente compensa. Acreditem, se derem ao dedo mais rápido ... conseguem escrever, her... mais depressa!

É aqui que entram 2 dos meus programas favoritos (na área), o TyperShark que além de contar com uma versão grátis, nos transforma em exploradores dos mares e entre um cachalote e uma sardinha lá vamos melhorando a nossa velocidade de escrita e o TypingWeb que funciona online. Confesso que o TyperShark é um bocado chato por estar demasiado formatado para o mercado americano e as opções de texto serem pouco interessantes (mas se formos suficientemente doidos até podemos criar os nossos próprios textos para treinar), o TypingWeb é ligeiramente (e é mesmo muito ligeiramente) melhor neste aspecto e - pasmem-se! - até tem uma opção para escolher a língua e teclado, mas a tradução parece ter sido feita por um tradutor digno de um qualquer GPS traduzido a martelo para um pt-br.

quarta-feira, 22 de abril de 2009

Zoom de ecrã em apresentações

Uma das grandes dificuldades em fazer demonstrações em programação prende-se com a apresentação e leitura de código. Nas minhas apresentações costumo usar o ZoomIt - uma ferramenta excelente que permite em windows fazer o zoom de qualquer parte do ecrã e ainda permite fazer anotações com o rato, escrever texto e até marcar um relógio para os intervalos. É possível configurar os atalhos que permitem fazer o zoom, texto, desenho e intervalo. São os 130Kb mais bem empregues das minhas apresentações.

Consultar: http://technet.microsoft.com/en-us/bb897434.aspx

segunda-feira, 20 de abril de 2009

Reseeding de colunas do tipo identity em SQL Server

Quando estamos a fazer testes numa BD, por vezes, somos obrigados a inserir e remover registos vezes sem conta! O ideal seria abraçar os novos padrões de desenvolvimento com testes unitários e metodologias ágeis e nessa altura teríamos uma BD para testes e uma outra para deployment.
Mas mesmo assim por vezes queremos fazer um reset ao contador que faz o incremento das chaves primárias numéricas com incremento automático.

Este procedimento em SQL Server é muito simples, basta executar o seguinte comando:

DBCC CHECKIDENT('A_minha_tabela' , RESEED, 0)