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.
quarta-feira, dezembro 19, 2007
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!
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.
Regra inline: <h1 style="font-size:12px;">Texto de Teste</h1>
Regra CSS: h1{ font-size: 50px !important; }
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:
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.
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!
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:
- 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.
- É 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!
"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)
Jack Nicholson (1937)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
- One flew over the cuckoo's nest
- The shining
- The witches of Eastwick
- Batman
- Wolf
- Anger management
- The departed
- 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).
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:
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?
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.
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...
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]:
- 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.
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:
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.
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:
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, 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;
}
Group[] groups = 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:
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;
}
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.
"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
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.
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.
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.
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.
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
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:
- Ir a Tools -> Internet Options -> Advanced e tirar o check da opção Disable script debugging.
- Colocar no código javascript debugger;. Esta instrução é equivalente a um breakpoint.
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
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.
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.
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.
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?
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...
[Nome do emissor]([mail do emissor]),enviou uma Mensagem para você !!!
Para visualiza-la,clique no link abaixo
http://chamadomar.superihost
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
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á...?
Que conveniente eu sou um C#, porque será...?
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" />.
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>
<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.
"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".
<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:
<
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...
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:
< div >
< asp:contentplaceholder id="place1" runat="server" / >
< asp:contentplaceholder id="place2" runat="server" / >
< /div >
...
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" %>
< asp:content contentplaceholderid="place1" runat="server" id="p1" / >
< asp:content contentplaceholderid="place2" runat="server" id="p2"/ >
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:
< asp:content contentplaceholderid="place1" runat="server" id="p1" >
< asp:placeholder runat="server" id="este_e_visto" / >
< /asp:Content >
E pode-se agora aceder ao objecto "este_e_visto", para chegar ao simples objectivo de colocar conteúdo dentro do objecto asp:Content.
< div >
< asp:contentplaceholder id="place1" runat="server" / >
< asp:contentplaceholder id="place2" runat="server" / >
< /div >
...
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" %>
< asp:content contentplaceholderid="place1" runat="server" id="p1" / >
< asp:content contentplaceholderid="place2" runat="server" id="p2"/ >
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:
< asp:content contentplaceholderid="place1" runat="server" id="p1" >
< asp:placeholder runat="server" id="este_e_visto" / >
< /asp:Content >
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
Já tinha este vídeo em queue à uma data de tempo mas só 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);
[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.
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
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.
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 jogadorRB -> 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?
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
SELECT TOP 1 @IDMax = [ID]
FROM [dbo].[TABELA_MILHARES_DE_TUPLOS]
ORDER BY [ID] DESC
IF @IDMax is null
RETURN;
RETURN;
DELETE FROM [dbo].[TABELA_MILHARES_DE_TUPLOS]
WHERE ID <= @IDMax
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
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;
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
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
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.
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á!
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...
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.
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
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.
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.