quarta-feira, julho 23, 2008

Previsão para o final do Tour 2008

Após a última etapa de alta montanha (Alpe d'Huez) e apesar de pessoal gostar mais dos ciclistas ditos trepadores, acho que este ano nenhum deles merece ganhar o Tour porque nunca foram audazes o suficiente para deixar os contra-relogistas para trás. Assim sendo a minha previsão, e vamos ver o quanto vou errar, o pódio do Tour será:

1º Cadel Evans
2º Carlos Sastre
3º Denis Menchov

terça-feira, julho 22, 2008

Delete Cascade

Já sofri por várias vezes o problema de querer apagar um tuplo e não o conseguir porque este tem uma relação com outra tabela, a qual tem um tuplo que o referencia e por isso é necessário apagar primeiro o tuplo que tem a foreign key e só depois o tuplo principal.

Vamos imaginar o seguinte cenário, tenho 3 tabelas: Form, Section e Question; estas tabelas representam formulários onde um formulário tem secções e cada secção tem questões. Para apagar um dado formulário é necessário primeiro apagar as suas secções, mas para apagar uma secção é necessário primeiro apagar as suas questões. O código seguinte possibilita-nos apagar todos os formulários cujo nome é 'xpto':

delete FROM question WHERE sectionid IN
(SELECT sectionid FROM section WHERE formid in
(SELECT formid FROM form WHERE name='xpto'));
GO

delete FROM section WHERE formid in
(SELECT formid FROM form WHERE name='xpto');
GO

delete FROM form WHERE name='xpto';
GO

Este código não é feito com objectivos de desempenho mas sim só com o único objectivo de se atingir o fim proposto que é a remoção de tuplos.

segunda-feira, julho 07, 2008

IPCTN - Última fase

Finalmente o projecto IPCTN (Inquérito ao Potencial Científico e Tecnológico Nacional 2007) está a chegar ao fim, só falta esta última fase de tratamentos de dados e o projecto fica concluído. Apesar de ser um projecto que me diz muito, porque foi o primeiro grande projecto no qual tive um papel também de gestão e foi feito na sua integra com base no Midgard (o meu projecto final de curso), está a chegar a uma fase que gostaria de estar totalmente disponível para outros projectos, outros desafios.

Neste momento a minha motivação é o Orion's Belt 2.0 que está ainda numa versão alpha mas que espero estar pronto até ao final do ano, com muitas novidades e melhorias em relação ao anterior.

sexta-feira, julho 04, 2008

Tatuagens e discriminação

Apesar de se dizer que as tatuagens estão na moda ainda continua a haver muita discriminação com as pessoas que têm tatuagens. Eu falo no que acontece comigo, e esta reflexão surge também pelo que vi ontem no metro quando um rapaz com os braços todos tatuados entrou na carruagem e toda a gente ficou a olhar para ele.

Se ainda consigo admitir comentários de pessoas da idade da minha mãe que dizem - "Se te tivesse conhecido depois de teres as tatuagens não iria olhar-te com os mesmos olhos, ou pelo menos iria demorar mais tempo" - custa-me mais a perceber comentários de pessoas da minha idade. Tenho um amigo na natação, da minha idade, que há uns tempos me revelou o que pensou da primeira vez que me viu - "Ena aquele gajo com tatuagens, que 'granda manfias' que deve ser, a ver se não sou ainda roubado!".

É pá eu sou a mesma pessoa com ou sem tatuagens, é só uma forma de arte que por acaso está desenhada no meu corpo, será difícil perceber que uma tatuagem não muda a personalidade de uma pessoa?

quarta-feira, julho 02, 2008

Derivação de interfaces e o Resharper

Parece que isto são duas coisas que não se dão lá muito bem. Fiz algo do género:
public interface IBase
{
void BaseMethod();
}

public interface IDerivation: IBase
{
void DerivationMethod();
}

public class Implementation: IDerivation
{
...
}
A seguir crio um objecto:
IDerivation obj = new Implementation();

E fico espantado quando faço obj. e o Intellisense não me é mostrado o BaseMethod destacado a negrito (numa primeira fase nem reparei que ele lá estava). Ao princípio ainda pensei que fosse problema meu - "será que estou a ver mal o filme e tenho de fazer um cast explicito para IBase" - mas ao mesmo tempo não me fazia sentido porque isto ia contra as regras de herança. Bem, o problema é do resharper que não mostra os métodos de uma interface derivada em destaque na listagem do Intellisense.

terça-feira, julho 01, 2008

Obter a parte decimal em c#

Por acaso nunca tinha necessitado mas pensava que existiria algo de framework que nos possibilitasse obter a parte decimal de um double. Bem aparentemente não existe nada, e o que encontrei na net achei um pouco complexo demais para a simplicidade do problema em si, logo fiz eu o seguinte código que acho não ser nada complicado e funciona em todas as situações (pelo menos as que testei).

public static int GetDecimalPart(double value)
{
  int number = (int) value;
  string numbString = number.ToString();
  int stringLength = numbString.Length;
  return Int32.Parse(value.ToString().Substring(stringLength+1));
}

segunda-feira, junho 30, 2008

Elegância Vs Desempenho

Na maior parte das vezes fazer código elegante (que seja extensível, de fácil manutenção, etc) e com bom desempenho é a mesma coisa que por duas pessoas em extremos opostos de uma corda a puxarem para seu lado.

A minha filosofia em relação a este assunto é que os problemas de desempenho podem ser numa primeira fase postos um pouco de lado, a não ser que se saiba à partida que estamos a fazer um pedaço de software que necessita de ter um desempenho optimizado ao máximo. Geralmente os maiores problemas surgem quando o que está feito não é exactamente o pretendido pelo cliente, logo o melhor é ter um código que facilmente se modifique e se adapte a novas necessidades.

Logo a fórmula que uso será 80% para elegância e 20% para desempenho, isto traduzindo na prática é o mesmo que dizer que dou privilégio a um código de fácil extensibilidade e manutenção, mas quando vejo que isso me vai claramente custar no desempenho procuro uma solução alternativa/intermédia.

quinta-feira, junho 19, 2008

SQL - Update com IN

Há vezes que tenho o mau hábito de complicar o que é fácil e este foi um desses casos. O contexto do problema é o seguinte, tenho as tabelas Principal e Secundary que se relacionam através do campo principalId existente nas duas, e quero alterar um outro campo da tabela Secundary condicionando esse update com base na tabela Principal.

O SQL seguinte dá-me as linhas da tabela Secundary que quero afectar:

select * from Secundary as sec1
where sec1.principalId in
(select p.principalId from Principal as pr1
inner join Secundary as sec2 on sec2.principalId = pr1.principalId
where pr1.owner >= 10 and sec2.conditionId = 5)

O select interior estabelesse a relação e condiciona o resultado com base na tabela Principal (pr1.owner >= 10) e na tabela Secundary (sec2.conditionId = 5). Agora (pensava eu) basta passar o select de fora para update e tenho o resultado que quero:

update Secundary as sec1
set sec1.conditionId = 1
where sec1.principalId in
(select p.principalid from Principal as pr1
inner join Secundary as sec2 on sec2.principalId = pr1.principalId
where pr1.owner >= 10 and sec2.conditionId = 5)

Acontece um erro porque não posso usar a tabela Secundary no select, o que se formos a ver faz todo o sentido porque estaria a usar um conjunto mutável para condicionar o seu próprio update o que não faz de todo sentido. Simplificando a coisa obtive o seguinte select cujo resultado é igual ao do primeiro:

select * from Secundary as sec1
where sec1.principalId in
(select p.principalid from Principal as pr1
where pr1.owner >= 10 ) and sec1.conditionId = 5

Passar isto para um update é agora directo:

update Secundary as sec1
set sec1.conditionId = 1
where sec1.principalId in
(select p.principalid from Principal as pr1
where pr1.owner >= 10 ) and sec1.conditionId = 5

quarta-feira, junho 11, 2008

Trabalhar em casa

Há 6 meses atrás comecei a trabalhar em casa e posso dizer que até agora tem sido algo que me agrada bastante, enganem-se aquelas pessoas que dizem que se trabalha menos porque é totalmente mentira, trabalha-se mais mas também temos outras vantagens.

Existem algumas regras que cumpro religiosamente, como a hora que começo a trabalhar, nunca depois das 9h, acho que a principal caracteristica para o sucesso de trabalhos desenvolvidos em casa é mesmo a disciplina que a pessoa tem em cumprir regras que normalmente tem no local de trabalho, onde está a ser "vigiado".

Quanto a vantagens as principais são tempo e dinheiro. Dinheiro, porque não gasto combustível ou passes de transportes, apesar de ir regularmente ao escritório compro bilhetes só para essas alturas o que não é assim um grande gasto. Tempo, porque não perco diariamente 2h30m desnessárias a andar de um lado para o outro e posso aproveitar esse tempo para coisas mais produtivas ou lúdicas.

sexta-feira, junho 06, 2008

tops.zi-yu.com

O Tops é o último site criado pela equipa zi-yu. Este site é um agregador onde se podem registar outros sites fazendo assim parte de uma tabela (top). Existem diferentes categorias já disponíveis mas se for necessário criar alguma nova é só contactarem-nos.