quarta-feira, 9 de dezembro de 2009
Thunderbird 3.0, primeiras impressões.
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.
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
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?
GO
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS 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_name, table_name;
quarta-feira, 4 de novembro de 2009
Criação de interfaces gráficas em Java usando Cardlayout
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é
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?
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.
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
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
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
terça-feira, 6 de outubro de 2009
Mensagem de reply no topo (Thunderbird)
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=66quarta-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#
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!

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!
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
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.
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!
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!
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.
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
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
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 ...
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!
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
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
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)


