quarta-feira, dezembro 19, 2007

Aves.zi-yu.com

Este é o mais recente site produzido pela equipa zi-yu. Este site ainda estará em construção durante algum tempo, pois considero que ainda é possível a adição de muitos conteúdos relevantes assim como a conclusão dos conteúdos em inglês, contudo o tempo é escasso e não dá para mais. Esta é uma primeira versão do http://aves.zi-yu.com/ que já se encontra funcional, fico à espera de sugestões e comentários para saber o que gostariam de ter num site deste género.

segunda-feira, dezembro 17, 2007

Fim-de-semana empresarial

Este fim-de-semana fui para Portimão com o pessoal da minha empresa, code name do evento, Retreat 2007. O objectivo foi conhecer as pessoas, o que andam a fazer e as metas a alcançar para o próximo ano. Neste contexto eu o Nuno e o Pedro fizemos uma apresentação sobre o Orion's Belt 2.0 que começará a ser desenvolvido no início do próximo ano, estando prevista a disponibilização ao público para o final do Verão.

Avançando para a parte interessante, o dia das actividades radicais (quer dizer semi-radicais), começamos por ver os nossos colegas a irem tomar uma "banhoca" ao rio depois construirmos umas canoas cujo melhor adjectivo para as caracterizar seria...instável!!! Vá lá eu escapei só com um pezito molhado...


Depois de um curto passeio de bicicleta e de um almoço reconfortante fomos ao que interessava o paintball, ou melhor, o que interessava realmente era encher os chefitos de tinta, escusado será dizer que em certas alturas aquilo se tornou numa caça ao homem!




quarta-feira, dezembro 12, 2007

Die Hard 4.0

Foi um filme que me espantou pela positiva e não sou um fã de Die Hard, estava à espera de mais uma sequela da treta (Terminator 3, Alien 4, Matrix Revolutions, American Pie 3 e todas aquelas sequelas que quiseram "puxar a corda" e fazer só mais uma), quando até passei duas boas horas de entretenimento. A filosofia mantem-se, um herói humano que tem de salvar a situação porque um vilão chateado com o Mundo decide aterrorizar alguém e ganhar uma "pipa de massa" no processo. O que achei interessante foi o argumento que não tem nada a ver com os filmes anteriores, conseguiram exploraram uma área totalmente diferente e creio que com sucesso.

terça-feira, dezembro 11, 2007

Alterar a prioridade dos estilos do HTML

Existem 4 modos de definir o estilo num elemento HTML:

1) Os browsers já têm estilos por omissão;
2) Ficheiros CSS externos;
3) Dentro da tag de head definir uma região de estilo;
4) Inline no próprio elemento.

No caso de haver sobreposição de regras, a que tem mais prioridade é a 4), seguindo até à 1) que é a que tem menor prioritária. Mas pode-se querer alterar a prioridade por algum motivo, imagine-se que se quer que a regra aplicada ao nível da CSS se sobreponha à regra definida inline.

Regra inline: <h1 style="font-size:12px;">Texto de Teste</h1>

Regra CSS: h1{ font-size: 50px !important; }

O facto de colocar !important faz com que a regra ao nível do CSS se torne mais prioritária. Como última nota há a referir que este mecanismo não é suportado pelo antiga versão CSS1.

segunda-feira, dezembro 10, 2007

Importar dados do Excel com C#

Após muito procurar pela internet como fazer uma simples leitura dos dados num ficheiro excel, cheguei a uma solução que considero fácil de perceber. As soluções que encontrei passavam sempre por abrir uma conecção OleDb que eu queria evitar por achar que não deveria ser preciso tanto, achava (e bem) que conseguia através de objectos/métodos recolher a informação de determinadas células.

O primeiro coisa a fazer é adicional uma referência para a dll de COM com o nome "Microsoft Excel 11.0 Object Library". Depois, e ainda não percebi porquê, é necessário que os regional settings da máquina estejam iguais aos do Excel, se não levamos com a excepção "Old format or invalid type library".

O código é tão simples como o seguinte:
private static void ReadExcelInfo(string fullFilePath)
{
    //Get Excel interop object
    Application objExcel = new Application();

    //Validate object allocation
    if (objExcel == null)
    {
           return;
    }

    //Don't show Excel windows
    objExcel.Visible = false;

    //Open a connection to the excel file
    Workbook objWorkbook = objExcel.Workbooks.Open(fullFilePath, 0, true, 5,"", "",
                                             true, XlPlatform.xlWindows, "\t",
                                             false, false, 0, true,null,null);

    //Get sheets collection
    Sheets sheets = objWorkbook.Worksheets;

    //Get first sheet (like others interop objects the start index is 1)
    Worksheet objWorkSheet = (Worksheet) sheets.get_Item(1);

    //Get cell value from A1 to A3
      for (int i = 1; i <= 3; ++i)      
     {      
          string data = (string) objWorkSheet.get_Range("A"+i.ToString(), Missing.Value ).Text;
     }
    //Close the connection
    objWorkbook.Close(false,null,null);
}

quarta-feira, dezembro 05, 2007

Efeito fato e gravata

Nas últimas semanas fui obrigado a tirar o mofo e as traças dos fatos para os voltar a usar ao fim de 6 meses de descanso. Esta altura coincide com a época natalícia onde vou mais frequentemente às compras e é aqui que noto o que chamo "efeito fato e gravata".

A nossa sociedade é mesmo hipócrita e padronizada, se for às compras vestido como quando vou trabalhar as pessoas são simpáticas, ajudam de todas as maneiras que podem, no fundo tratamento VIP; se for vestido como gosto de andar normalmente (calças de fato de treino, t-shirt, ténis, etc) sou simplesmente mais um puto às compras e acabaram-se as simpatias. Eu sou a mesma pessoa estando vestido da maneira que estiver, continuo a ter o mesmo dinheiro para gastar, continuo a dirigir-me aos funcionários das lojas da mesma maneira.


terça-feira, dezembro 04, 2007

Creches para homens

O termo é algo infeliz e até depreciativo, mas o conceito é excelente. Os "inventores" deste conceito foram os nuestros hermanos e só espero que devido à proximidade geográfica e até cultural, este conceito se expanda rapidamente para o nosso país.

Quando um homem vai às compras o que acontece? Sabe o que quer comprar e dirige-se directamente à secção ou loja em causa, aqueles estratagemas de colocar os produtos alimentares no final da loja para passarmos por todos os artigos e mais algum antes de chegarmos ao que queremos, e assim ainda comprarmos algo que não queríamos inicialmente, não funciona com os homens. As mulheres ao contrário dos homens vêm um produto, vão a outra loja comparar, voltam à inicial e por vezes não levam nada do que inicialmente queriam mas vão cheias de compras que não estavam planeadas...e os maridos...andam o tempo todo a "reboque" das mulheres enquanto estas fazem as suas compras.

O conceito de creches para homens é ter um lugar nas lojas, tipo sala de entretenimento, onde os homens são "deixados" pelas mulheres enquanto estas fazem compras. Nessa sala os homens têm: sofás, revistas masculinas, televisões com canais desportivos, jornais e até vídeo consolas, ou seja, o paraíso dentro do inferno que é o centro comercial!

segunda-feira, dezembro 03, 2007

Beowulf

Se há filmes que têm de ser vistos no cinema este é um deles. Na minha opinião este filme vai ser considerado um marco no cinema, por dois motivos:
  1. A nível de animações foi claramente uns passos mais à frente, a caracterização das personagens é soberba, em certas alturas até nos perguntamos - "Será que aquele não é mesmo o Anthony Hopkins ou aquela não é a Angelina Jolie e aquele o John Malkovich?". Até detalhes como tiques físicos, reflexos na água ou movimentos dos cabelos estão espectacularmente realistas. Só não gostei muito do galopar dos cavalos, demasiado artificial, mas se calhar por o resto do filme estar a um nível tão bom esses pequenos "defeitos" fiquem mais realçados.
  2. É o primeiro filme com um 3D a sério que vejo, a noção de profundidade, aproximação da imagem transporta-nos para dentro do filme, uma sensação que creio só ser reproduzível num cinema.

Oh meu...vai-te catar

Mais irritante que comentários anónimos de pessoas com falta de coragem para se assumirem são comentários/SPAM como este:

"NADA A VER SEU COMENTARIO A RESPEITO DA GOTA Q CAI COMO SE ESTIVESSE PRESA A LENTE...

SUPERFICIAL SEU COMENTARIO...
SE QUISER SABER O PQ...ME MANDA UM E MAILL

FRED_SUPERIA@HOTMAIL.COM"

What the hell...Como alguém é tão estúpido ao ponto de escrever comentários destes, totalmente descontextualizados com o post em questão e esperar que eu os aceite ou que mande um mail de volta?Ai, ai, ai, há por aí muita gente sem nada de produtivo para fazer!

terça-feira, novembro 27, 2007

Custo do acesso à base de dados

Costumo dizer que aceder à base de dados é como ir às compras, mais vale ir uma vez e trazer o carrinho cheio do que ir 2 vezes e voltar a casa 2 vezes para trazer 2 produtos. Com isto quero dizer que mais vale fazer um acesso à base de dados e trazer um tuplo tamanho familiar, do que ir nem que sejam só duas vezes à base de dados para trazer 2 valores.

sexta-feira, novembro 23, 2007

5 Filmes e 3 Actores

Entrando na onda dos muitos bloggers que andam a apresentar os 5 filmes que mais gostaram aqui vai um post com os meus 5 filmes preferidos, mais o bónus dos meus 3 actores preferidos. Engraçado do meio disto é que os 5 filmes não têm a participação de nenhum dos 3 actores. Como vão poder reparar gosto imenso de filmes épicos. Não consigo colocar por uma ordem de preferência nem filmes nem actores por isso vou por por ordem cronológica. Em relação aos actores sem dúvida que estes 3 se destacam dos restantes, quanto aos filmes infelizmente tive de deixar muitos de fora.

Forrest Gump (1994)

Uma história uma pouco irreal em que a bondade infantil e inocente é recompensada com uma vida cheia de surpresas. Gosto do modo como o realizador transmite os sentimentos da personagem principal, as flutuações de infelicidade/felicidade e a maneira de encarar uma situação negativa sempre de um ponto de vista positivo. (8,4/10 pontuação IMDB).

Braveheart (1995)

O "nascimento" do país Escócia, assente numa coragem heróica de um homem que preferiu quebrar a vergar-se. (8,3/10 pontuação IMDB).

Saving Private Ryan (1998)

Um dos poucos filmes de guerra moderna que gosto. A história da vida de um homem que por uma série de circunstâncias passou a valer mais que a vida de um grupo de homens. Gosto especialmente do pedido que é feito ao Ryan no final da guerra - "Aproveita bem a tua vida de modo a que valha o mesmo que todas as vidas que foram perdidas para te salvar" - no fundo um pouco a minha filosofia de vida - "Aproveita ao máxima a vida pois ela é curta". (8,4/10 pontuação IMDB).

Gladiator (2000)

A honra de um homem que consegue mudar o destino de um império em decadência. O general que se tornou gladiador, o gladiador que desafiou o imperador, o imperador que caiu aos pés da justiça. (8,2/10 pontuação IMDB).

Troy (2004)

A história do lendário Aquiles e da queda da cidade de Tróia. Este é o filme em que pequenos actos mudam o rumo da história e desta vez o final não é feliz. (6,9/10 pontuação IMDB).

Sean Connery (1930)
  • 007 (vários)
  • Hilander
  • Indiana Jones and the last crusade
  • The hunte of Red October
  • Robin Hood: prince of thieves
  • Dragonhearth
  • The Rock
Jack Nicholson (1937)
  • One flew over the cuckoo's nest
  • The shining
  • The witches of Eastwick
  • Batman
  • Wolf
  • Anger management
  • The departed
Anthony Hopkins (1937)
  • The good father
  • The silence of the lambs
  • Dracula
  • Nixon
  • Meet Joe Black
  • Instinct
  • Hannibal
  • Bad Company
  • Alexander

O excepcional

O que é ser excepcional? É ser uma excepção à regra algo inesperado ou que foge a um padrão. Vou atribuir o título de Excepcional ao autor da pérola que vou mostrar em seguida e que deveria ser intitulada “Como NÃO utilizar as excepções”.
public void Caller()
{
...
AuthenticateApplication_(appName, appPasswd, out BoolAuthenticated);
if(!BoolAuthenticated)
{
 throw new Exception("Application Authentication is invalid!");
}
...
}

public int AuthenticateApplication_(string StrAppName, string StrAppPass, out bool BoolAuthenticated)
{
BoolAuthenticated = false;
...
try{
  ...
  if(result!= StrAppPass)
  {
    throw new Exception("Invalid Application Authentication! : " + result );
  }
  else
  {
    BoolAuthenticated = true;
  }
  ...
}
catch(Exception e){ 
}
}

quinta-feira, novembro 22, 2007

Evento Microsoft

Aqui fica a minha retrospectiva ao evento Microsoft de ontem.

Visual Studio 2008 e .NET Framework v3.5 o que há de novo?Podia ter sido melhorzinho, perdeu-se demasiado tempo a contextualizar com a Framework 2.0 e a fazer aqueles exemplos típicos de guiões MS. No fundo acabei por perceber que o 3.5 era uma simples união do 2.0 e o 3.0 numa única instalação.

O que há de novo no SQL Server 2008
Esta apresentação superou as minhas expectativas, se calhar por não estar tão a par dos desenvolvimentos do SQL 2008. Mas coisas novas e interessantes vão aparecer nesta versão, merge de tabelas (com algumas limitações a nível do merge entre estruturas diferentes, colunas a NULL ou com a existência de primary keys, mas de qualquer forma está dado o mote para novos desenvolvimentos), passagem de estruturas aos SP, novos tipos DateTime, etc.

O que é o LINQ?
Grande apresentação sem dúvida, mais uma ver o Luis Falcão esteve ao nível que já nos habituou. O LINQ é uma grande revolução no modo de encarar os dados e o seu tratamento, agora também não acredito que isto dentro de um ano esteja a ser utilizado em todo o lado e mais algum como foi dito, na minha opinião as empresas não gostam de mudanças (por isso algumas ainda andam a fazer desenvolvimentos em framework 1.1) por isso acho que isto vai pegar só quando sair o VS 2012 ou algo parecido.

Desenvolvimento de aplicações em utilizando Silverlight
Um bom orador que viu a sua apresentação ser constantemente "sabotada" por problemas técnicos. Contudo acho que a apresentação foi demasiado focado no resultado final e não como chegar a esse resultado final, deu para ver o potencial do Silverlight.

Serviços Live. Como criar aplicações utilizando os serviços Live
Quanto a esta apresentação não me posso pronunciar, não consegui assistir até ao fim pois valores mais altos se levantaram (PORTUGAL).

terça-feira, novembro 20, 2007

Será que contei bem?

Neste momento estou responsável por analisar um sistema/arquitectura e descobrir uma forma de melhorar o seu desempenho. No meio da minha análise perguntei em que tabelas da base de dados estavam os dados que eu pretendia, deram-me 3 tabelas para averigua até aqui tudo bem. Quando abro a primeira tabela vejo uma enormidade de colunas...bem deixa cá contar só por curiosidade...102 colunas. Bem deve ser só esta - pensei eu - abro a 2 tabela e não estava melhor...106 colunas. Na terceira já estava à espera de tudo e bingo, ganhei o jackpot 224 colunas. Já tenho trabalhado em projectos muito grandes e nada se compara a isto, acho um total exagero e é impossível que esta seja uma solução viável.

Como adquirir aves

Normalmente as pessoas vão a uma loja comprar a sua ave...erro crasso! Para adquirir boas aves e a preços inclusive mais baixos que em algumas lojas conceituadas, o sítio ideal para comprar aves são nas exposições que se realizam por todo o país entre Outubro e Dezembro, ou então, directamente com um criador.
Eu como criador nunca vendo uma má ave a alguém que me compre directamente, as más aves (doentes, velhas, com problemas genéticos, quistos, más reprodutoras, etc) vendo-as para as lojas que só querem comprar aves a muito baixo preço (10-12€), para depois as revenderem a 30-40€, e são estas as aves que as pessoas que vão às lojas compram. Só mais uma dica, as anilhas de criação que só podem ser colocadas quando a ave tem poucos dias de vida, identificam o ano em que a ave nasceu evitando assim a compra de aves velhas.
Ficam aqui duas fotos das minhas aves:

domingo, novembro 18, 2007

Gravações do Gato Fedorento

Para alguém tão crítico com a sociedade eles deveriam ter um bocadinho mais cuidado com os seus actos, passo a explicar, as gravações tinham sido marcada para as 22:30 começaram às 01:00. Ao que nos foi dito este era o atraso habitual que acontecia todas as semanas...ora bolas se assim é das duas, uma: ou diziam às pessoas para só estarem no estúdio às 01:00 ou então começavam a trabalhar 2h30m mais cedo de forma a estar tudo pronto as 22:30. Engraçado foi o Ricardo Pereira a perguntar quem é que já estava arrependido de ter ido devido ao atraso, e ainda uma quantidade interessante de pessoas a meterem o braço no ar, eu incluído. Seguindo para o programa em si tenho de reconhecer que como sempre, eles estiveram em grande e que foi um espetáculo muito bom.

sexta-feira, novembro 16, 2007

Fim da participação no site Optimus

Hoje foi o meu último dia de participação no desenvolvimento no novo site Optimus, que infelizmente ainda não sei quando estará no ar, tudo depende dos gestores do projecto. O meu trabalho neste projecto poderá ser visto nas seguintes páginas:
  • Toda a área relacionada com equipamentos/telemóveis;
  • Gestão de contactos e grupos de contactos;
  • Pontos de assistência;
  • Roaming;
  • Criação de conta de mail.

quarta-feira, novembro 14, 2007

Tamanho do gmail

Até acho piada ver na página o contador a andar a indicar o espaço que posso utilizar no mail, mas achava estranho o google estar a gastar espaço na sua base de dados para indicar por cada utilizador o espaço que este tinha. Afinal isto não tem nada a ver com a base de dados só tem a ver com o calendário da máquina na qual estamos a aceder ao gmail. Vejamos actualmente quanto espaço tenho:



E agora mudando o tempo da máquina acabei de ganhar instantaneamente cerca 25GB no gmail. Será que é validado do lado do servidor o espaço, se tentar inserir mais do que seria suposto?

terça-feira, novembro 13, 2007

Artista gráfico procura-se

O Orion's Belt vai no início do próximo ano evoluir para uma nova versão. Neste momento andamos à procura de um artista gráfico para criar os grafismos do site. Quem estiver interessado em receber os nossos requisitos para um orçamento é favor contactar-me.

sexta-feira, novembro 09, 2007

O que fazer em caso de ataque cardíaco?

Repentinamente sente-se uma forte dor no peito, que se difunde até ao braço e, até mais acima junto à mandíbula. Mesmo que se tenha sido treinado em RCP (Ressuscitação Cardio-Pulmonar), provavelmente o instrutor do curso nunca ensinou a auto aplicar a técnica. Sem ajuda, uma pessoa na qual o coração bata incorrectamente e se comece a sentir a desmaiar, só tem 10 segundos antes de perder a consciência. Tendo em conta que a maior parte dos ataques cardíacos acontecem quando uma pessoa se encontra sozinha e não consegue pedir ajuda, o que fazer então?

Não entrar em pânico começar a tossir repetida e vigorosamente. Deve-se respirar profundamente entre cada tosse, esta deve ser profunda e prolongada, como quando se produz um forte ataque de tosse, proveniente do diafragma. Cada inalação e cada tosse devem ser repetidas de dois em dois segundos, repetidamente e sem parar, até que se consiga ajuda ou até que o coração esteja de novo a bater correctamente. As inspirações profundas levam oxigénio aos pulmões e os movimentos de contracção da tosse comprimem o coração e mantêm o sangue a circular. A pressão sobre o coração também ajuda a recuperar o ritmo cardíaco normal. Desta maneiras as vítimas de ataque cardíaco podem chegar a um hospital e sobreviver.

Hoje em dia, devido à mudança de estilo de vida, os ataques cardíacos atingem pessoas de todas as idades, mesmo as pessoas com menos de 25 ou 30 anos que não estão incluídas em grupos de risco.

terça-feira, novembro 06, 2007

JSLint

Hoje descobri o JSLint que para quem não conhece, é uma ferramenta muito interessante para verificar a correcção de um javascript de acordo com as convenções de código. Às vezes este verificador pode parecer "picuinhas" mas é para o nosso próprio bem.

Traveler

Conheci o Traveler através de um amigo que me disse algo do género: "É pá vê esta série que é muito boa, tem trama e intriga como gostas e são só 8 episódios vê-se rapidamente". Quando chego ao fim do 8º episódio fiquei com a sensação - "Mas que raio de final foi este ainda existem uma data de pontas soltas...".

Virei-me para o meu amigo e disse-lhe que não tinha gostado do final apesar da série em si ser muito boa. Foi quando ele me disse que a série deveria ser de 15 episódios e não de 8, e que tinham parado de fazer a série devido à pouca audiência que a mesma tinha. Naquela altura apeteceu-me apertar o pescoço a alguém: ao meu amigo porque me aconselha uma série que ficou a meio e a todos os "bananas" que conseguiram que uma série relativamente boa não tivesse sucesso. Está bem que tem um tema já muito utilizado, conspiração governamental e vingança contra as pessoas do sistema por terem acusado algum inocente, mas não deixa de ser uma série que nos "prende" ao ecrã e nos faz desejar saber como tudo vai terminar. Vejam lá mas é se produzem os restantes 7 episódios que faltam...

sexta-feira, novembro 02, 2007

Formatar em FAT32

Precisei de formatar um disco em FAT32 com 500GB, quando descobri que o Windows XP não suporta a formatação de discos com mais de 32GB sem ser em NTFS. Solução:

- Start -> Run e escrever diskmgmt.msc;
-
Botão direito do rato no disco que se quer formatar e seleccionar "Criar nova partição";
- Seleccionar "Partição Primária";
- Escolher a dimensão máxima possível para o disco;
- Escolher uma letra para a partição;
- Escolher "Não formatar a partição";
- Fazer download do executável fat32format ou fat32formatsrc (para quem tiver curiosidade ou medo e queira perceber o que está por trás do executável);
- Finalmente ir à linha de comandos e no path onde tiver o executável escrever, fat32format [letra do disco]:

quinta-feira, outubro 18, 2007

Qualidade de vida

Aí está uma coisa que eu acho que a maioria das pessoas actualmente abdica, cada vez mais não se aproveitam as coisas simples mas boas da vida, cada vez mais as pessoas vivem para trabalhar em vez de trabalharem para viver.

Ontem à noite estava a fazer um zapping habitual pelos canais quando apanhei o início de um filme no canal Hollywood, claro que são filmes antigos mas porque não ver pelo menos que filme era? O filme era "Despertares" (Awakenings), já há uns anos atrás o tinha visto, mas como já não me lembrava bem decidi ficar a assistir. Este filme transmite exactamente a mensagem que a vida é efémera, cada momento que dispomos deve ser aproveitado como se fosse o último, cada momento deve ser aproveitado para realizarmos coisas que nos dão prazer e nos fazem felizes.

segunda-feira, outubro 15, 2007

Nobel da paz

Não quero que este post se confunda com um post político, porque efectivamente não o é apesar de poder parecer. Al Gore prémio Nobel da paz... para mim é insultuoso, ele é simplesmente mais um frustrado que ainda não conseguiu ser presidente dos EUA e faz tudo para parecer o "menino bonito" à opinião pública. Será que ele se preocupa tanto com o ambiente como diz? Quanto a mim não, é pura estratégia de marketing. Será que a nível mundial ninguém contribuiu mais para a paz do que ele? Não me parece...

quinta-feira, outubro 11, 2007

Chamada a métodos

Com o aproximar do fim do desenvolvimento do projecto Novo Site Optimus tenho tido muito pouco tempo para fazer posts. Contudo ontem deparei com uma situação que me deixou a pensar, e que acho que à primeira vista é difícil responder correctamente, imagine-se o seguinte código:
static void Main(string[] args)
{
  SetError("A");
  SetError("X", "Y");
  SetError("M", "N", "O");
  SetError("G", null);
  SetError("R", null, "S");
  Console.ReadLine();
}

static void SetError(string message, params object[] data)
{
  Console.WriteLine("Message=" + message);
}

static void SetError(string code, string message, params object[] data)
{
  Console.WriteLine("Code=" + code + "; Message=" + message);
}
Qual dos métodos será chamado em cada invocação?

Só a primeira chamada invoca o primeiro método, a segunda, terceira e quinta invocam o 2 método e a quarta dá erro de compilação porque a chamada é ambígua. Isto leva-me a dizer que a assinatura do primeiro método foi mal pensada, não devendo ter o segundo parâmetro, visto que uma chamada com dois ou mais parâmetros, vai invocar o segundo método ou no caso da quarta chamada ainda é pior provocando um erro de compilação.

terça-feira, outubro 02, 2007

Método genérico

O meu problema passava por ter de criar métodos com implementações iguais, só diferindo no tipo dos parâmetros recebidos, pois os objectos que eu queria passar como parâmetro eram em tudo distintos à excepção das propriedades acedidas nesses métodos. Exemplo:

Group[] groups = null;
Tone[] tones = null;

GetName(contact.GroupId, groups);
GetName(contact.ToneId, tones);

private string GetName(int Id, Group[] data)
{
foreach (Group info in data)
{
if(info.Id == Id) return info.Name;
}
return null;
}

private string GetName(int Id, Tone[] data)
{
foreach (Tone info in data)
{
if(info.Id == Id) return info.Name;
}
return null;
}
Solução 1: Criar uma interface que será implementada pelos dois objectos, e a interface terá os campos e/ou métodos que se desejem ter em comum:

Group[] groups = null;
Tone[] tones = null;

GetName(contact.GroupId, groups);
GetName(contact.ToneId, tones);

private string GetName(int Id, ShareInterface[] data)
{
foreach (ShareInterface info in data)
{
if(info.Id == Id) return info.Name;
}
return null;
}

Solução 2: Esta solução foi a que utilizei para o meu caso pois a Solução 1 tem um problema, no caso dos objectos serem obtidos através de uma black box é impossível criar uma interface para ambos os objectos implementarem. A solução é a seguinte:


Group[] groups = null;
Tone[] tones = null;

GetName(contact.GroupId, groups);
GetName(contact.ToneId, tones);

private string GetName(int Id, object[] data)
{
foreach (object info in data)
{
System.Reflection.PropertyInfo prop = info.GetType().GetProperty("Id");
int tester = (int)prop.GetValue(info, null);
if (tester == Id)
return info.GetType().GetProperty("Name").ToString();
}
return null;
}

sexta-feira, setembro 21, 2007

.Net 3.X

Encontrei este link que considero interessante sobre as novas funcionalidades do .NET 3.0 e 3.5. Apesar de achar que vamos ter grande evoluções (LINQ, Lambda expressions, etc), existe um sintatic sugar que não me "passa no goto" porque vai dar origem a mais "lixo" no meio do código, que pode ser facilmente evitado. Veja-se um exemplo simples:
Club club = new club();
club.name = "xpto";
A nova funcionalidade a que me refiro permite o seguinte:
Club club = new club(name = "xpto");
Aparentemente é uma boa evolução, menos linhas de código, menos chamadas ao objecto, agora porquê estou contra esta funcionalidade? Porque na minha perspectiva o que fica realmente elegante é o seguinte:
Club club = new club("xpto");
Têm é de existir construtores que possibilitem afectar os campos que se julguem necessários quando se cria o objecto.

segunda-feira, setembro 17, 2007

Standards para quê?

Estava a ler alguma documentação sobre Ajax quando reparei no seguinte parágrafo, proferido por Todd Anglin da Telerik:

"At the heart of Ajax is the ability to communicate with a web server asynchronously without taking away the user’s ability to interact with the page. The XMLHttpRequest is what makes this possible. This technology was created by Microsoft as an IE ActiveX control to support their (then) groundbreaking Outlook Web Access, but it has since been built-in natively to all modern web browsers (including IE7). In fact, if Mozilla had not had a rare “Microsoft moment” and decided not to add support for the nonstandard XMLHttpRequest to their Firefox browser, it is doubtful that Ajax would be nearly as popular as it is today."

Conclusão: há sempre alguém que se julga acima do que já está feito e tenta fazer sempre as coisas à sua maneira, não são assim estabelecidos standards e os programadores que querem utilizar a tecnologia são obrigados a fazer código horrivelmente feio, para assim suportarem as diferentes implementações.

terça-feira, setembro 11, 2007

Encriptar com o DES em C#

Já algum tempo que não mexia com bibliotecas criptográficas e como até sou um bocado esquecido, tive de pesquisar um bocado até chegar a uma solução que me fizesse encriptação com o DES. O código resultante foi o seguinte:
//DES Provider
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(ConfigurationManager.AppSettings["DESKey"]);
DES.IV = ASCIIEncoding.ASCII.GetBytes(ConfigurationManager.AppSettings["DESIV"]);
//DES encriptor
MemoryStream memoryStream = new MemoryStream();
ICryptoTransform desencrypt = DES.CreateEncryptor();
CryptoStream cryptoStream = new CryptoStream(memoryStream, desencrypt, CryptoStreamMode.Write);
 //Data to encript
StreamWriter writer = new StreamWriter(cryptoStream);
writer.Write("UmaQualquerPassword");
writer.Flush();
cryptoStream.FlushFinalBlock();
writer.Flush();
//encriptor return
string password = Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length)
Depois de fazer isto a solução não me agradou, acho que é código demais para fazer uma simples encriptação de uma string. 1) Porquê são necessários dois streams, um de entrada e um de saída? 2) Porquê é necessário um terceiro stream para escrever para o cripto CryptoStream?
1) Em conversa com um amigo a explicação que ele arranjou foi: O objectivo é tornar as bibliotecas genéricas. Eu até aceito esta explicação, mas não concordo muito que se complique a usabilidade das bibliotecas só para as tornar genéricas.
2) É necessário um terceiro stream porque o CryptoStream não tem um método de Write que seja simples de utilizar ao contrário do método de Write do StreamWriter.
Para mim a encriptação deveria ser algo tão simples como algo do género:
//DES Provider
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(ConfigurationManager.AppSettings["DESKey"]);
DES.IV = ASCIIEncoding.ASCII.GetBytes(ConfigurationManager.AppSettings["DESIV"]);
//DES encriptor
MemoryStream memoryStream = new MemoryStream();
ICryptoTransform desencrypt = DES.CreateEncryptor();
string password = desencrypt.Transform("UmaQualquerPassword");
Continuava a ser genérico, bastando que a interface ICryptoTransform tivesse um método Transform de jeito, útil para estas situações simples onde só se quer encriptar uma string.

sexta-feira, setembro 07, 2007

A nova tatuagem

De vez enquando passam-me algumas ideias insanas pela cabeça, foi assim à dois meses atrás quando decidi fazer a minha segunda tatuagem. Eis os resultados:

























Espectacular, não?

quinta-feira, setembro 06, 2007

Um passo mais perto

Esta noite já vou dormir mais descansado, já tenho o contrato promessa compra e venda da minha possível futura casa, já sinto que agora só uma coisa do outro Mundo me vai impedir de ficar com a casa que eu tanto gostei e que se destacou claramente de todas as casas que visitei. Como referi num post anterior vou deixar algumas fotos para ficarem para a posterioridade.

A entrada "ajardinada"


A sala com lareira


A cozinha não muito grande mas relativamente bem equipada (por do sol na janela)


Um dos três quartos


A vista para a Serra de Sintra


A vista para o mar (lá ao fundo)





quarta-feira, setembro 05, 2007

Infertilidade

Apenas vou deixar a referência para um post do blog de um amigo que tem a experiência pessoal nesta matéria, e como tal é a pessoa ideal para falar sobre este assunto. Apesar de não conhecer nada sobre o assunto achei interessantíssimo o modo como foi exposto e a quantidade de informação contida em tão poucas linhas.

segunda-feira, setembro 03, 2007

Human Trafficking

Uma das minhas paixões sem dúvida que é o cinema, este fim-de-semana como já é habitual tive a descontrair a ver um filme, o seleccionado foi Human Trafficking (Tráfigo Humano). Não conhecia nada do filme: traillers, elenco, história, etc; o que é bom porque não estou à espera de nada nem tenho uma ideia pré-formada, ou seja, estou de mente aberta para o que vou ver, quando isto acontece às vezes há o risco de desligar o filme 15 minutos depois de o começar a ver, mas também há o risco de saborear com muito mais intensidade um filme como este.

Passando ao filme em si, é "pesado", perturbador, intenso, poderoso...qualquer um destes adjectivos é bom para descrever o que senti em relação ao filme. Não cheguei a perceber se o filme é baseado em alguma história verídica em particular, mas de certeza que a sua história se assemelha a muitas histórias reais, mostrando até que ponto a antítese que um ser humano é desumano pode ser verdadeira.

segunda-feira, agosto 27, 2007

A minha nova casa

Quando vim de férias à 11 dias atrás virei-me para um amigo e disse: "Olha vou começar a procurar casa, daqui a um mês vais ver que já tenho casa". Claro que ele respondeu: "Tás louco não consegues escolher uma casa em menos de um mês".

Afinal eu tinha razão, ao fim de uma semana de buscas na internet e três dias intensos de visitas a apartamentos ontem escolhi a casa que se não acontecer nenhum imprevisto irá ser a minha nova casa. Agora é tratar das coisas chatas...burocracias e papeladas!!! Dentro em breve irei colocar aqui algumas fotos da casa para ficarem como registo para a posteridade.

quarta-feira, agosto 22, 2007

Operações matemáticas em XSLT

Ontem dei com este site quando procurava exemplos de como se faziam algumas operações matemáticas em XSLT. Além de ter exemplos muitos simples ainda explicam como se consegue obter o valor de PI em XSLT, o que se pensarmos e não olharmos a solução não parece uma coisa simples, mas até é.

Outro detalhe relevante na implementação descrita, e para quem está familiarizado com XSLT sabe que esta é uma linguagem não iterativa mas sim recursiva e que uma variável só pode ser afectada uma vez, é a maneira inteligente como é conseguida a iteração tirando partido de uma recursividade em que a variável iterativa é passada como parâmetro na recursividade.

terça-feira, agosto 21, 2007

Frases de geek

Hoje enviaram-me o seguinte link com frases típicas de geek...simplesmente delicioso e hilariante. Gostei especialmente da seguinte frase:

1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

sexta-feira, agosto 17, 2007

Wikipedia Scanner

O conceito de wiki é algo bastante interessante, uma pessoa com poucos conheciamentos informáticos pode com alguma facilidade editar conteúdos e ver de imediato o seu resultado. Mas tudo o que tem vantagens também tem desvantagens, isto também significa que uma pessoa ou entidade mal intencionada pode editar um conteúdo colocando informação errónea. O Wikipedia Scanner é uma ferramenta criada por Virgil Griffith com o objectivo de detectar o computador de onde são feitas alterações na Wikipedia. Alguns resultados da sua utilização já foram tornados públicos, sendo descoberto que entidades com algum nome a nível mundial já foram responsáveis por algumas alterações de conteúdos.

quinta-feira, agosto 16, 2007

Debug no IE

Como sou um fã incondicional do Firefox tenho por habito utilizar o Firebug para fazer debug do javascript, e diga-se de passagem que é uma excelente ferramenta. Hoje estava a testar uma alteração ao código javascript quando me apercebi que o Firefox não dava nenhum problema mas que o IE dava erro. Depois de uns minutos a embirrar com o IE, ou melhor, ele a embirrar comigo a única solução era mesmo fazer debug. Como se faz debug no IE? Bem, a solução é simples:
  1. Ir a Tools -> Internet Options -> Advanced e tirar o check da opção Disable script debugging.
  2. Colocar no código javascript debugger;. Esta instrução é equivalente a um breakpoint.
Agora é simples, basta executar o javascript que quando é apanhada a instrução debugger; abre-se uma janela com os possiveis debuggers que se podem utilizar e é só escolher um deles.

terça-feira, agosto 14, 2007

As férias

Tenho estado algo ausente no blog porque finalmente fui de férias. Este ano trocámos as habituais férias à beira mar por uma férias na Serra do Gerês. Bem não sei se podem ser consideradas férias, é que foram só 3 diazinhos mas deram para relaxar e conhecer novos sítios. No primeiro dia fomos às termas romanas, uma água maravilhosamente quente num local ainda pouco conhecido onde só se juntam só uma meia dúzia de pessoas. Aproveitámos ainda para uma visita histórica a algumas ruinas romanas e aos antigos caminho daquela época que iam dar a Santigo de Compostela.


No segundo dia fomos a um poço, e o que é um poço? É um lago natural criado pela passagem de um rio, numa zona onde existe um pouco mais de profundidade. Um local incrivelmente paradisíaco em que se pensa - "Bolas pensava que isto só existia em filmes!".


Por fim, e porque nem tudo são férias, deixo uma foto da equipa Zi-Yu num notório esforço criativo a pensar nos novos projectos e jogos a desenvolver. :D

quinta-feira, agosto 09, 2007

Doar sangue

Apesar de ser um assunto já recorrente no meu blog acho que é importante voltar a frisar o quão importante é doar sangue. Hoje de manhã fui fazer mais uma doação quando a médica se virou para mim no fim da consulta e me perguntou - "Por acaso não conhece ninguém que esteja disposto a fazer doações? Estamos num período muito mau, ainda por cima acentuado por estarmos no Verão.".

Indo ao site do Instituto Português do Sangue é bastante fácil obter os horários e locais onde são efectuadas colheitas, assim como toda a informação relevante. O dador para além de estar a ajudar outras pessoas ainda tem a vantagem de ficar isento das taxas moderadoras.

quinta-feira, agosto 02, 2007

Remover carateres duma string em C#

Normalmente o que faço quando quero remover caracteres de uma string é algo do género: string.Replace("[caracter a remover]", string.Empty). Hoje para formatar uma string que me chegava via um serviço precisava de remover vários caracters diferentes, andei à procura e aparentemente a framework não disponibiliza um método tão básico como retorna-me uma string, retirando esta lista de caracteres à string original. O código do método resultante é o seguinte:
public static string RemoveChars(string toNormalize, List<char> charsToRemove)
{
    StringBuilder toReturn = new StringBuilder(toNormalize.Length);
    CharEnumerator enumerator = toNormalize.GetEnumerator();
            
    while(enumerator.MoveNext())
    {
        if (!charsToRemove.Contains(enumerator.Current))
            toReturn.Append(enumerator.Current);
    }

    return toReturn.ToString();
}

quarta-feira, agosto 01, 2007

Olá PrintScreen

Há uns tempos atrás conheci o prt.sc através do meu amigo Pedro Santos que é um dos membros deste portal, que tem como objectivo agregar a informação de alguns blogs escritos por portugueses. Como considero o projecto bastante interessante resolvi também dar a minha contribuição e a partir deste momento o meu blog também vai contribuir para a informação divulgada pelo prt.sc. Espero conseguir acrescentar alguma mais valia, o que é complicado dada a qualidade que o portal já apresenta.

Portugal verga-se para a Microsoft

Ao ler alguns blogs hoje de manhã apercebi-me que o formato OOXML tinha sido aprovado por Portugal, para quem não sabe o OOXML pretende ser um standard, criado pela Microsoft que não é interoperável com outras plataformas.

Ao ver as entidades que votaram a favor do OOXML três despertaram a minha atenção: Câmara Municipal de Cascais, por ser o sítio onde moro (mas que raio percebe uma câmara de informática? Pensava que a sua especialidade era sugar dinheiro dos contribuíntes...); Safira, os meus antigos patrões, ok que são Microsoft partners mas eu pensava que tinham uma visão mais informática e menos política; finalmente ViaTecla, que é a empresa onde estou a trabalhar agora em parceria com a empresa que represento.

Acho que o problema base das pessoas que votaram a favor é não terem coragem para "bater de frente" com a Microsoft porque pode ser mau para o negócio, ou então não percebem mesmo nada de informática como as câmaras e assim pode ser que a Microsoft dê mais umas licenças gratuitas de software.

terça-feira, julho 31, 2007

Jogos online e a sua componente social

Para a maior parte das pessoas alguém que jogue um jogo online é apelidado de viciado em jogos. Quanto a mim isto é falso em muitos casos, pessoalmente jogo 2 jogos online: orionsbelt e worl of warcraft, e não me considero um viciado nem que os jogos me sejam prejudiciais de alguma maneira, bem pelo contrário a quantidade de amigos que já fiz devido ao facto de jogar estes jogos é bastante agradável.

Já me aconteceu por exemplo estar numa terrinha na serra da Estrela e no meio de uma festa com uma centena de pessoas encontrar um rapaz que tinha conhecido exactamente num almoço de convívio de um jogo. Acho que a componente social é mesmo algo bastante interessante e diria que muitos dos jogadores online se interrogados sobre este assunto diriam que um dos grandes motivos que os levam a jogar, além do tempo de diversão e relaxamento que passam, é exactamente o facto de conhecerem outras pessoas. Sem dúvida que uma das preocupações de um game developer / game designer terá de ser fumentar a componente social do jogo que idealiza para que este tenha sucesso.

quinta-feira, julho 26, 2007

Doping e mais doping

Como amante do ciclismo e mais propriamente da volta a França, fico extremamente triste e com pouca vontade de assistir ao que considero ser um dos maiores eventos anuais. Depois de Alexandre Vinokourov foi agora a vez de Michael Rasmussen, pelo que dizem as notícias, abandonar a volta a França, dois dos corredores mais espetaculares estão de fora da volta. Rasmussen sem dúvida que até agora tinha sido o ciclista mais espetacular desta volta a França, lembrando o já falecido Marco Pantani no modo impressionante como escalava montanha acima como se fosse a coisa mais fácil do Mundo.

Estes acontecimentos fazem-me levantar algumas questões. Será que os grandes campeões do antigamente não utilizavam doping? Será que os controlos estão mais apertados actualmente? E por fim a questão: Será que os organizadores não percebem que é inumano e um incentivo ao doping, numa prova de 3 semanas percorrer mais de 3500Km a médias superiores a 40Km/h?

terça-feira, julho 17, 2007

Mail suspeito

No domingo à noite recebi um mail pouco comum de uma pessoa amiga. Acabei agora de falar com essa pessoa ao que ela me disse que não tinha sido ela a enviar-me o mail. No mail existe um link para o qual é pedido que se clique, como é óbvio não o fiz porque achei o mail susteito, no mínimo isto é mais um tipo de spam mas eventualmente até poderá redireccionar-nos para uma página que contenha um vírus ou algum tipo de quebra de segurança. O mail que recebi é o seguinte:

Olá, [meu mail]
[Nome do emissor]([mail do emissor]),enviou uma Mensagem para você !!!

Para visualiza-la,clique no link abaixo
http://chamadomar.superihost.com/?name=fmg_morais@hotmail.com&Rname=tsousa@zi-yu.com

Aproveite!.Envie Voce para um amigo.
Esse Email é Válido por 15 dias.
estefanasjudson

EDIT: Como sou curioso tentei descobrir mais sobre o link, acabei por ir ao link mas tirando a query string (o link fica só
http://chamadomar.superihost.com) a primeira coisa que é pedido é para abrir ou gravar um ficheiro para visualizar o cartão...agora tenho a certeza que isto não é um simples spam. Cuidado com este tipo de mails...

segunda-feira, julho 16, 2007

Feira do livro

Na 6ª feira a noite fui até Cascais para ver o fogo de artifício de encerramento do campeonato do mundo de vela. Entretanto, e para minha alegria, descobri que era o primeiro dia da feira do livro, claro que aproveito sempre para dar uma volta pelas barraquinhas à procura de algo interessante. Para quem quiser fazer uma visita a feira está aberta até ao final do mês, a hora de abertura não sei ao certo mas fecha só as 24h o que é ideal para o pessoal que trabalha até tarde e só pode ir lá a seguir ao jantar.

quinta-feira, julho 05, 2007

Os Turistas

Quando me convidaram para ver o filme "Os Turistas" eu nem sequer tinha ouvido falar do filme apesar de ser um filme já do final do ano passado. Como era do género terror que até gosto comecei a ver com alguma motivação. Posso dizer que adorei a história do filme, apesar de ser violento e muitas pessoas dizerem "ah isto é um filme nunca aconteceria na realidade", sinto inclinado a discordar totalmente, isto é um filme sim mas poderia acontecer na realidade. Ao ir ao IMDB verifico que a pontuação do filme até é mediana mas não deixo de achar que o filme vale muito mais que aquela pontuação, essencialmente pela história e aliado à história ainda podemos por outras coisas como, cenários magnificos ou o facto de até ser um filme de terror razoável.

segunda-feira, julho 02, 2007

Torneio de polo aquático

Um dos deportos que gosto mais de fazer sem dúvida que é polo aquático, infelizmente em Portugal os torneios escasseiam. Este sábado a piscina da ABVE na Alapraia realizou um mini torneio de polono qual participei com mais uns amigos.

Which Programming Language Are You?

Encontrei este site onde basicamente é feito um teste para avaliar que tipo de linguagem de programação representa uma pessoa: http://www.bbspot.com/News/2006/08/language_quiz.php
Que conveniente eu sou um C#, porque será...?

No matter how hard you try, you can't convince people that you are unique. You're composed of other's traits

sexta-feira, junho 29, 2007

Mau CSS

No projecto em que estou actualmente, que é um projecto em ASPX, o design das páginas é feito por uma empresa especializada em design como faz todo o sentido porque a grande parte dos programadores (eu incluído) tem um sentido estético simplesmente brilhante (sarcástico...).
Depois de 6 horas a "partir pedra", a tentar perceber porque o código HTML que eu estava a gerar, apesar de ser idêntico a um exemplo que utilizava a CSS não apresentava um design igual ao do exemplo, cheguei à seguinte conclusão, para o CSS ter:

<div class="clear" /> é diferente de <div class="clear" ></div>

Isto é totalmente ridiculo porque analisado do ponto de vista do XML as duas coisas são exactamente iguais, além disso ainda poupava uns bytes na transferência se pudesse por <div class="clear" />.

quinta-feira, junho 28, 2007

Sensibilidade no rato

Num dos meus raids matinais pelos blogs que costumo ler encontrei uma referência para este jogo http://dagobah.biz/flash/Cursor_Invisible.swf. Acho que é um jogo engraçado que testa a sensibilidade que cada um tem em relação aos movimentos que faz com o rato. Divirtam-se...

segunda-feira, junho 18, 2007

Built-in templates

Tome-se como exemplo o seguinte XML:

<elem>Valor_1
<data>
Data_2
</data>
<data>
Data_3
</data>
</elem>

Agora vou definir uma template em que só quero ter como output os valores dentro das tags <data>:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

<xsl:template match ="/elem/data">
<xsl:value-of select ="."/>
</xsl:template>
</xsl:stylesheet>

Como output tenho:

Valor_1
Data_2
Data_3

Porque raio aparece o "Valor_1" se só defini template para mostrar os valores dentro da tag <data>? O motivo é um dos buil-in templates. O que são buil-in templates? São templates definidas por omissão, que estão presentes mesmo que não sejam definidas explicitamente, a solução é fazer o override ao template. Neste caso o template é algo do género:

<xsl:template match ="text()|@*">
<xsl:value-of select ="."/>
</xsl:template>

Logo para obtermos o resultado desejado inicialmente o nosso ficheiro XSLT será algo do género:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

<xsl:template match ="/elem/data">
<xsl:value-of select ="."/>
</xsl:template>

<!-- override Built-in template rule para texto e atributos dos nós -->
<xsl:template match="text()|@*"/>

</xsl:stylesheet>

terça-feira, junho 12, 2007

Bom conceito mal interpretado

Após duas semanas a trabalhar num novo projecto no qual tenho o uso intensivo de XSLT comecei a ler o livro "XSLT" da editora O'REILLY. Uma frase com a qual concordo inteiramente despertou-me a atenção:

"The separation of content and presentation is a long-established tenet of the publishing industry; unfortunately, most HTML pages aren't even close to approaching this ideal. An XML document should contain information, marked up with tags that describe what pieces of information are, as well as the relationship between those items."

No projecto em que estou esta efectivamente é a ideia que está a ser utilizada, então surgiram-me umas dúvidas - Porquê muitas vezes tenho de andar a refazer XSLTs? Qual o facto que torna todo o trabalho que tenho feito tão volátil? Porquê que às vezes a representação dos dados em XML para gerar uma apresentação me parece forçada?

A conclusão à qual cheguei é a instabilidade e complexidade desnecessária do XML que representa os dados, ou seja, o facto do XML estar em constante mudança provoca que os XSLTs também estejam em constante mudança. E porquê o XML está em constante mudança? Porque o modelo de dado está mal definido, dando origem a falhas que provocam remodelações ao XML.

segunda-feira, junho 11, 2007

Obter um máximo com XSLT

Algo tão simples como obter o máximo valor de um dos filhos de um nó acabou por dar-me um enorme trabalho a descobrir como se fazia. Apesar de ter feito imensas pesquisas por essa internet fora, consegui chegar a uma implementação que não me agrada muito porque acho que em XSLT deve de haver uma forma muito mais optimizada de o fazer, contudo não deixa de ser uma implementação simples de se perceber. Imagine-se o seguinte XML:

<parent>
<value>20</value>
<value>50</value>
<value>10</value>
<value>30</value>
</parent>

Para obter o valor mais alto a implementação a que cheguei foi a seguinte:

<xsl:for-each select="parent/value" >
<xsl:sort data-type="number" order="descending" />
<xsl:if test="position() = 1">
<xsl:value-of select="number(.)" />
</xsl:if>
</xsl:for-each>

Um dos problemas desta implementação é o facto de se fazerem tantos ciclos quanto o número de filhos existentes, para não falar que o XSLT não é uma linguagem pensada para ser iterativa, logo os ciclos devem de ser evitados. Já agora só por curiosidade se o objectivo for obter o mínimo basta mudar o order="descending" para order="ascending".

O curso

Este domingo fui tirar um curso, e agora qual terá sido o curso que eu como programador terei feito? Quem disse curso de sushi acertou, acho que a resposta até é um pouco óbvia demais. Posso até não ter muito jeito para cortar o peixe visto que ainda acabei por cortar-me a mim próprio, mas pronto isso são detalhes, contudo a fazer bolinhas de arroz é pá estava imbatível. Ficam aqui umas fotos só para verem o manjar que eu e os meus colegas de curso preparámos.


segunda-feira, junho 04, 2007

Canoagem

Este sábado fui experimentar pela primeira vez canoagem em rio e foi uma experiência bastante agradável, um dia esplendoroso de calor, os passarinhos a cantarem e as rãs a coaxarem um hambiente de descontração total.

Estou mesmo a pensar em comprar uma canoazinha para poder desfrutar mais vezes deste belo prazer sem estar dependente de outras pessoas. A seguir à canoagem ainda tive um almoção daqueles, grelhados e porco no espeto a sair directamente do espeto para o prato, ai ai que dia...

quinta-feira, maio 31, 2007

Identificar o ContentPlaceHolder

Hoje dei por algo que considero uma falha no asp .NET 2.0. Imagine-se que se tem uma master page muito simples parecida com o seguinte:

&lt div &gt
&lt asp:contentplaceholder id="place1" runat="server" / &gt
&lt asp:contentplaceholder id="place2" runat="server" / &gt
&lt /div &gt
...

E agora tem-se uma página que usa esta master page também muito simples:

<%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="~/MasterPage.master" CodeFile="Default.aspx.cs" Inherits="_Default" %>

&lt asp:content contentplaceholderid="place1" runat="server" id="p1" / &gt
&lt asp:content contentplaceholderid="place2" runat="server" id="p2"/ &gt

A falha é a seguinte todos os controlos em aspx desde que sejam runat="server" podem ser acedidos no code behind através do seu ID, porque raio os controlos do tipo asp:Content são diferentes de todos os outros e não podem ser acedidos? É necessário fazer algo do género:

&lt asp:content contentplaceholderid="place1" runat="server" id="p1" &gt
&lt asp:placeholder runat="server" id="este_e_visto" / &gt
&lt /asp:Content &gt

E pode-se agora aceder ao objecto "este_e_visto", para chegar ao simples objectivo de colocar conteúdo dentro do objecto asp:Content.

quarta-feira, maio 30, 2007

How To Design A Good API and Why it Matters

tinha este vídeo em queue à uma data de tempo mas este fim-de-semana tive tempo para o ver http://video.google.com/videoplay?docid=-3733345136856180693. Apesar dos assuntos abordados devessem estar entranhado na pele de todos os programadores, aconselho vivamente todos a verem o vídeo, pois por um motivo ou outro acabamos por não seguir algumas destas regras, que a meu ver são bem úteis.

quinta-feira, maio 24, 2007

Drama na rotunda

Comecei esta semana a trabalhar num projecto novo que está a ser desenvolvido em Almada. Além do imenso trânsito que apanho e da distância que tenho de percorrer, mesmo à chegada do trabalho ainda tenho de enfrentar a pior rotunda que já vi. A dita cuja, uma rotunda com não mais de 2 metros de raio, bastante pequena, tem a porcaria de semáforos em todas as entradas e saídas. Bolas como é possível que algum visionário tenha visto utilidade em semáforos numa rotunda tão pequena e ainda por cima em todas as entradas e saídas, fechando os semáforos constantemente e todos ao mesmo tempo, qual a utilidade...criar ainda mais trânsito?

terça-feira, maio 15, 2007

Outputs dos web methods

Imaginemos que se tem um web method com a seguinte assinatura:

[WebMethod]
public void TestWS(out int va1, out double va2);

Ao criar uma web reference para esta classe (o nome da classe poderá ser ClassWS) como acham que é feita a chamada ao método apresentado? Provavelmente algo do género:

ClassWS ws = new ClassWS();
int var1;
double var2;
ws.TestWS(out var1, out var 2);

Pois é quem apostou nesta versão sinto muito mas não é um dos vencedores. Ao gerar a classe que faz wrapping, ao web service o método que é gerado para acesso a este método tem a seguinte assinatura:

public int TestWS(out double va2);

Desconhecia esta optimização, mas como é facil de verificar faz todo o sentido. Logo a chamada será algo do género:

ClassWS ws = new ClassWS();
int var1;
double var2;
var1 = ws.TestWS(out var 2);

sexta-feira, maio 04, 2007

A prisão

Parece que a vai haver uma nova temporada de Prison Break, só que desta vez o Michael Scofield vai ser substituído por mim e a prisão vai ser a sede da caixa geral de depósitos.

Comecemos pela estrutura da prisão, um edifício em forma de cubo em que todos os andares são iguais e com todos os corredores iguais, independentemente do lado do cubo em que se esteja, ou seja, torna a fuga complicada. Passemos à cela, vulgo "local de trabalho", uma secretária com as dimensões aproximadas de 80cm x 100cm com caixa do computador, monitor, teclado, rato e ainda tem de sobrar um espacinho para as minhas folhas. Ao lado da minha cela está outra igualzinha à minha em que o monitor está separado do meu uns 4 dedos.

A minha pena era de 15 dias, aparentemente tão contentes com o meu comportamento logo...não não vou sair mais cedo como era espectável...vou ter ainda que fazer mais umas coisas o que leva a que tenha de estar cá mais tempo que espero que não seja muito mais porque a fuga está em preparação se assim for. Contudo hoje depois de andar aqui a amotinar as hostes parece que para a semana estão a pensar em mudar-nos para uma cela com melhores condições, assim espero.

sábado, abril 28, 2007

Um novo desafio

Após 7 meses na Safira apareceu uma nova oportunidade, um novo desafio noutra empresa. Apesar de estar bastante contente com as pessoas com quem trabalhava na Safira já estava um pouco farto do projecto em que estava. Foi quando surgiu a hipótese de ir trababalhar para a PDM&FC uma empresa com uma filosofia diferente da Safira. O aliciante principal será trabalhar em projectos propostos e direccionados para a área de dos vídeo-jogos.

segunda-feira, abril 23, 2007

Algoritmo ELO

Para quem não sabe o algoritmo ELO foi criado pelo húngaro Árpád Élő e tem como objectivo calcular a perícia relativa de jogadores num ranking de um qualquer jogo. Apesar do algoritmo estar bem definido, tem algumas variáveis que possibilitam ajustes à formula dependendo do jogo em questão, por exemplo e possível ajustar o peso do número de jogos já efectuado pelo utilizador, o peso da diferença de ranking dos dois jogadores, etc.

Além destes ajustes ainda encontrei pequenas variações ao algoritmo, dependendo se o jogo é de equipa ou sigular, ou ainda se o resultado do confronto entre dois jogadores é mensurável em pontos ou se é simplesmente uma vitória ou uma derrota.

A fórmula começa com a seguinte equação:

RN = R + ( K x (S - EA) )

RN -> Novo valor de ranking que se quer calcular
R -> Valor de ranking actual do jogador
K -> Variável que traduz o peso do númeor de jogos já efectuados pelo jogador
S -> Variável que traduz o peso dos pontos envolvidos no confronto
SE -> Variável que traduz o peso da diferença de ranking entre os dois jogadores

K = 1 + (90 /(10 + NJ))

NJ -> Número de jogos já efectuado pelo jogador

E_A = \frac 1 {1 + 10^{(R_B - R_A)/400}}.

RB -> Ranking actual do adversário
RA -> Ranking actual do jogador (RA = R)









PA -> Pontos ganhos pelo jogador
PB -> Pontos ganhos pelo adversário

Todas as constantes das diferentes formulas podem ser modificadas de modo a adaptar o algoritmo ao jogo em questão, apesar de isto desvirtualizar o algoritmo de ELO.

sábado, abril 21, 2007

Karting

Pela primeira vez experimentei karting e posso dizer que é uma adrenalina "brutal". Apesar de ter ficado só em 11º de 19 pilotos considero que para primeira vez foi bastante positivo. Os pneus do kart é que não gostaram muito, a cada curva guinchavam e ginchavam como se fossem a desfazer-se. Depois ainda houve a parte "carrinhos de choque", aquela que eu dei cabo do joelho no suporte do volante depois de levar uma panada lateral em plena curva, mas pronto a malta entusiasma-se e são coisas e acontecem naturalmente.

quarta-feira, abril 18, 2007

Um dia a roçar a perfeição

Hoje sem dúvida foi uma grande dia, para começar e importantíssimo, estou de férias (as tão desejadas férias). Acordei de manhã e para despertar nada melhor que boa volta de bicicleta, desfrutar da beleza da serra de Sintra e do Guincho. Chego a casa, e para os que me chamam sovina, faço a minha declaração de IRS e que bom, ainda vou receber algum dinheiro. Passo a tarde a a ver uns filmes, uma das minhas actividades preferidas, e ainda a jogar um pouco de computador. Ao fim da tarde, e como já tinha descansado do passeio matinal de bicicleta, fui para a natação para acabar com as energias que ainda me restavam. Depois disto tudo uma bela refeição para acabar o dia em perfeição.

domingo, abril 15, 2007

Dia do azar - Sábado 14

Porquê 6ª feira 13 é o dia do azar? Quanto a mim sábado 14 é que é o dia do azar e tenho a prova vivida disso.

6ª feira a noite fui ver um concerto de Tragic Comic, apesar de todos os incidentes técnicos aos quais a banda é alheia, o espetáculo foi do melhor que já ouvi. Não percebo como uma banda com a qualidade que eles têm ainda não chegou mais longe. Para quem gosta de bandas como Within Temptation, Nightwish ou Sonata Artica aqui fica um dos site onde podem dar uma olhadela a informação sobre os Tragic Comic http://www.myspace.com/tragicomic.

Saio do concerto 0:15, ou seja, tinhamos acabado de entrar no sábado e dirigi-me à bomba de gasolina mais concorrida que conheço devido aos preços muito mais baixos. Costuma estar muita gente a por gasolina mas desta vez parecia que os carros demoravam mais tempo a andar, quando cheguei ao fim de 45 minutos ao pé da bomba reparei que estava com pouca pressão, a deitar muito devagar. Bem finalmente é a minha vez pensei eu, ponho a agulheta no depósito e começo a abastecer quando olho para o visor estava parado nos 1,25 litros...que se passa??? Não pode...acabou o gasóleo. Agora digam-me se não é azar, 50 minutos para por gasóleo e depois acontece o quase impossível?

quinta-feira, abril 05, 2007

Concorrência na inserção e remoção em SQL

Imagine-se que se tem uma tabela que contem umas centenas de milhares de tuplos. Diariamente existe um job que se encarrega de apagar todos os tuplos, mas durante o período de remoção faz lock à tabela o que impossibilita inserções. O código típico para esta situação é o seguinte:

DECLARE @IDMax dbo.UDT_ID;
SELECT TOP 1 @IDMax = [ID]
FROM [dbo].[TABELA_MILHARES_DE_TUPLOS]
ORDER BY [ID] DESC
IF @IDMax is null
RETURN;
DELETE FROM [dbo].[TABELA_MILHARES_DE_TUPLOS]
WHERE ID <= @IDMax
Neste cenário a inserção também tem de ser rápida pois o timeout definido é de curta duração. O objectivo é continuar a existir a remoção, mas tem de se conseguir fazer inserções mesmo quando a remoção está a ser efectuada. O código seguinte mostra uma possível solução:
DECLARE @IDMax dbo.UDT_ID;
DECLARE @Counter dbo.UDT_ID;

SELECT TOP 1 @IDMax = [ID]
FROM [dbo].[TABELA_MILHARES_DE_TUPLOS]
ORDER BY [ID] DESC
IF @IDMax is null
RETURN;
SET @Counter = 1;
WHILE (@Counter > 0)
BEGIN
DELETE FROM [dbo].[TABELA_MILHARES_DE_TUPLOS]
WITH (ROWLOCK)
WHERE ID =
(
SELECT TOP 1 [ID]
FROM [dbo].[TABELA_MILHARES_DE_TUPLOS]
WITH (NOLOCK)
WHERE [ID] <= @IDMax ORDER BY [ID] DESC
)
SET @Counter = @@ROWCOUNT;
END
Esta solução possibilita que o lock seja feito linha a linha e não à tabela, logo é possível inserir enquanto a remoção está a ser feita. Agora temos de ter a noção que esta solução não é perfeita apesar de servir para esta situação. O tempo de remoção de todas as linhas posso dizer que aumentou 8 vezes, mas como neste caso este é um job que vai ser executado 1 vez por dia, o tempo não é assim tão problemático e chegamos ao objectivo de haver inserções enquanto estão a ser executadas as remoções.

terça-feira, abril 03, 2007

Só em Portugal

Depois da bela placa que deixei num dos meus últimos posts, deixo aqui outra foto digna do melhor que se consegue fazer em Portugal. Esta é uma ideia revolucionária totalmente made in Portugal - "Rotundas só para motas".

A mariscada

Ao fim de 2 meses de constantes adiamentos finalmente conseguimos arranjar todos disponibilidade para a nossa mariscada em Ribamar (foi preciso esperar dia 1 de Abril, é caso para dizer - até parece mentira).

Neste almoço consegui juntar os meus colegas/amigos que me foram mais importantes para conseguir concluír o curso, foi muito graças a eles que aprendi o que aprendi e que ultrapassei as barreiras que se colocaram pelo caminho. A eles o meu obrigado por tudo e que estes almoços se repitam durante muitos anos.



segunda-feira, março 26, 2007

1/4 de século

Realmente o tempo não pára, parece que ainda ontem estava a entrar para a 1ª classe e hoje já tenho 25 anos. Ainda no outro dia estava a comentar com um amigo: "Não é que durante o esforço físico me sinta com menos força ou resistência, mas a recuperação pós esforço cada vez demora mais tempo.". Ontem estava a jantar quando o meu pai se vira para mim: "Amanhã fazes 25 anos...com essa idade já eu era teu pai", e realmente já tenho alguns amigos meus que já são pais...

O relógio não pára mas o mais importante é aproveitar ao máximo o tempo que ele me dá!

quinta-feira, março 22, 2007

Reflexão aquática

Estava eu na minha aula de natação quando o meu monitor se lembra de uma daquelas tarefas demoradas e que não dão tempo para grandes descansos - "Vamos agora fazer 10 vezes 100 metros ao 1m50s".

Quando dei por mim já a tarefa tinha acabado, passei todo o tempo a pensar noutras coisas: o que me aconteceu no passado, o que foi feito de alguns amigos, os novos amigos que tenho agora, enfim um pouco de tudo. Isto deixou-me um bocado espantado porque foi como se eu me tivesse desligado do meu corpo, ele lá continuou a nadar, e eu como que andei a "passear" pelo meu passado. É incrível tudo o que me passou pela cabeça...realmente o Mundo dá grandes voltas...

domingo, março 18, 2007

Um dia em Gaia

Já há uns tempos que eu o Pre e o Pyro queríamos ir ao Porto para rever alguns amigos. "Matando vários coelhos de uma cajadada", aproveitando o almoço do Orion's Belt para o reencontro com esses amigos. Começámos por ir almoçar a um restaurante espetacular à beira mar, intitulado "Mar à vista", sem dúvida uma escolha acertadíssima. O almoço também serviu para rever o Paulo e o Jorge, aqueles 2 malucos super divertidos que conhecemos em Portalegre durante Games 2006.

Depois de uma refeição de reis e de estarmos com a barriguinha cheia que fomos fazer...jogar um paint ball. Foi a altura do payback, toda a gente tinha alguém em que queria mandar um balázio para se vingar de alguma derrota no Orion's Belt. No final, depois de estamos todos arranhados e termos descarregado em cima dos amigos (acabámos com o stock de balas, só à conta do Diogo foram 900), a vontade era mesmo voltar a repetir estes convívios porque foi um dia divertidíssimo como se pode comprovar...

Mas o dia ainda não tinha acabado para mim, Pre e Pyro. Não podiamos ir ao Porto sem ver as nossas amigas portuenses que conhecemos em Punta Cana, logo ainda fomos até ao Arrábida Shopping para jantar com elas e relembrar algumas situações que passámos.

Com uma viagem de Gaia escusado será dizer que chegámos a casa já "às tantas da manhã". Quando me deitei parecia que tinha andado a jogar rugby todo o dia, até me custou a adormecer doiam todos os musculos mesmo aqueles que eu não sabia que tinha.

sexta-feira, março 16, 2007

Converter C# para VB

Para quem odeia escrever código VB como eu aqui ficam dois links onde podem escrever código C# e converter para VB. Apesar de tudo o Mundo não é perfeito e algumas coisas dão erros de conversão, como por exemplo listas tipadas, contudo não deixam de dar imenso jeito.

http://www.developerfusion.co.uk/utilities/convertvbtocsharp.aspx

http://www.kamalpatel.net/ConvertCSharp2VB.aspx

terça-feira, março 13, 2007

const VS static readonly

Qual será a diferença entre uma variável constante e uma variável só de leitura...aparentemente não há diferença? Pois é mas há diferença, uma variável const fica com o seu valor definido em compile time e uma variável static readonly fica com o seu valor definido em run time. O que isto provoca? As variáveis const são mais optimizadas enquanto que as variáveis static readonly são mais flexíveis. Imagine-se o cenário da figura seguinte:


No caso de se ter de alterar a variável 'a' é necessário recompilar tanto o Assembly 1 como o Assembly 2, no caso de se alterar a variável 'b' apenas é necessário recompilar o Assembly 1 e não o Assembly 2 que referência o Assembly 1.