terça-feira, abril 20, 2010

Techdays - Dia 1

Começou hoje o Techdays, a maior feira nacional de tecnologia Microsoft. Algumas novidades tecnológicas estão a ser abordadas como:
  • Cloud (a nova moda);
  • Redefinição do sistema de cache (derivando de OutputCacheProvide);
  • Possibilidade de redefinir os clientId;
  • Variáveis de ambiente no web.config;
  • Disable do viewstate ao nível da página;
  • etc.
Mas não posso deixar de destacar a apresentação brutal sobre "Optimização da performance de um web site", feita pelo César Silva e baseada num livro do Steve Souders. A apresentação focou 14 pontos / boas práticas, para optimizar uma aplicação web:
  1. Reduzir número de pedidos HTTP (número de recursos)
  2. Utilizar CDN (Content Distribution Network)
  3. Expires no header o mais longo possível
  4. Pedidos utilizando GZIP
  5. Colocar CSS no topo
  6. Colocar JS no final
  7. Evitar CSS expressions
  8. JS e CSS externos
  9. Evitar DNS lookups
  10. Comprimir os JS
  11. Evitar redirects
  12. Remover scripts duplicados
  13. Remover ou configurar as ETags
  14. Utilizar cache em chamadas AJAX
Já agora ficam também aqui ferramentas para nos ajudarem nesta tarefa: YSlow, Http Watch e a Web Page Test.

segunda-feira, abril 19, 2010

Confronto de Titãs

Este fim-de-semana fui ver o Confronto de Titãs, e ao contrário da maior parte das pessoas com quem tenho falado até foi um filme que me agradou, apesar de não ser um filme de antologia, mas não deixa de ser um bom filme. Mais uma vez fiquei foi desiludido com a fraca qualidade do 3D, e isto é o que dou de nota mais fraca ao filme

Já sabia que este filme era um remake de um filme de 1981, não sabia é que já tinha visto o filme umas quantas vezes no canal Hollywood. Só me apercebi que era o mesmo filme quando vi a coruja mecânica que no antigo filme aparece umas quantas vezes, e está igualzinha neste remake. Depois os Escorpiões, as bruxas, a Medusa e o Kraken, tudo começa a bater mais ou menos com o filme original.

quarta-feira, abril 14, 2010

Música online

Ontem conheci um site muito interessante o http://listen.grooveshark.com. A ideia é simples ter playlists online, sem ter de comprar as música. Este site tem milhares e milhares de músicas, basta fazer um search e procurar o que se quer, criar playlists e aí estamos nós a ouvir música, sem ter de a comprar e sem a ter de armazenar em disco. O desempenho do site é excelente, a procura é rapidíssima e o streaming da música é tão bom que nem se sabe que se está a trazer a música conforme a estamos a ouvir.

sexta-feira, abril 09, 2010

Table sort com JQuery

Recebi no meu mail uma referência para este site. Dele pode ser encontrada uma biblioteca assente sobre JQuery que possibilita ordenação de tabelas recorrendo só a javascript, html e css. Visualmente muito agradável, sem requests server side, simples de utilizar e com um bom desempenho.

segunda-feira, abril 05, 2010

De volta à Berlenga

Isto hoje está a ser um dia produtivo a nível de posts, já não me lembro o dia em que escrevi 2 posts. Bem, este fim de semana fui mergulhar à Berlenga, aos destroços do Primavera e à gruta Azul, ficam aqui algumas das fotos.




Estas fotos são da autoria do meu buddy de mergulho o Rui Martins, se quiserem ver todas fica aqui o link.

Primeira vinda para o trabalho de mota

Depois de andar a treinar na mota ao pé de casa em voltinha relativamente curtas, hoje decidi aventurar-me e vir de mota para o trabalho pela primeira vez. É verdade que hoje está um dia em que o transito é quase inexistente, só apanhei resistência da saída da A5 até o Saldanha, mas de qualquer forma demorei 40 minutos a fazer o percurso que normalmente demoro 1h15m a fazer de transportes. Para não falar que como não tenho passe, porque não me compensa, a viagem de ida e volta fica-me em cerca de 2,5€, enquanto se for de transportes é à volta de 4,5€.

sexta-feira, março 26, 2010

Bicicleta a motor

Heis o meu novo meio de transporte, apresento a minha Daelim Roadwin 125 FI





terça-feira, março 16, 2010

Novas regras ao subsídio de desemprego

Bem sei que esta é uma matéria sensível que mexe com a vida de muitas famílias, mas até estou de acordo que se reveja algo porque há por aí muitos abusos. Se na maioria dos casos o subsídio de desemprego é uma ajuda fundamental para a dignidade de vida de uma pessoa, existem outros que é um incentivo ao 'não fazer nada'.

Tenho um amigo que há pouco tempo se virou para mim e disse algo como: "Para que vou aceitar as ofertas de emprego? Recebo mais estando em casa sentado no sofá!". A minha resposta foi: "Para não estares a 'chular' o pessoal que como eu desconta!".

Mas também tenho noção que existem pessoas que por exemplo têm prestações de casa para pagar que são elevadas, e se normalmente receberiam 1000€ por mês, passar a receber o ordenado mínimo não é de alguma forma uma solução. Mas então porque nestes casos não se obriga essa pessoa a trabalhar e o subsídio de desemprego seria a diferença entre os 1000€ e o ordenado mínimo? Acho que é uma excelente solução, caso a pessoa não quisesse mesmo ir trabalhar passaria só a receber essa diferença ou então até lhe seria retirado o subsídio. Isto sim era uma medida de incentivo ao trabalho e à produtividade, só assim um país se pode tornar próspero.

sexta-feira, março 12, 2010

Jogos - uma nova era

Devo dizer que a Nintendo Wii me atrai especialmente devido à sua interactividade que não é possível com outras consolas. Contudo veja-se bem o coelho que a Playstation está a preparar para tirar da cartola...estamos quase quase a chegar ao ponto em que nós estamos dentro do jogo no corpo da personagem...


quinta-feira, março 11, 2010

Ler dados do Excel através de C#

Há cerca de de 2 anos tive de trabalhar pela primeira vez com a leitura de dados a partir de um ficheiro excel, e nessa altura até cheguei a escrever um post sobre o assunto. Mas o solução que tinha estava longe de optima, apesar de funcionar num ambiente controlado que tinha.

Num projecto que estou actualmente foi-me pedido que um utilizador pudesse fazer upload de um ficheiro excel, e que os dados fossem lidos para dentro da base de dados. Como já se tinha passado algum tempo desde do meu código original, fui investigar e tentar resolver alguns problemas que tinha, nomeadamente o problema da cultura, o que provocava que não conseguisse utilizar a minha aplicação anterior em todos os ambientes. Outra preocupação que tive desta vez foi o desempenho, a leitura é algo 'pesado' logo devemos ler o máximo de células de uma só chamada (à semelhança do que acontece quando se lêem dados de uma BD), e ter cuidado com a memória que estou a utilizar e liberta-la sempre que já não for necessário.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Threading;
using System.Reflection;
using System.IO;
using System.Xml;
using System.Web.Security;
using Excel = Microsoft.Office.Interop.Excel; 
  
    public class ExcelUtils
    {
        public static void GetDataFromExcel()
        {

            Application xlApp;
            Workbook xlWorkBook;
            Worksheet objWorkSheet;
            object misValue = Missing.Value;

            using (new LanguageHelper())
            {
                string file = "example.xls";
                xlApp = new Excel.ApplicationClass();
                xlWorkBook =
                    xlApp.Workbooks.Open(file, 0, true, 5, "", "", true, 
                  XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                objWorkSheet = (Worksheet) xlWorkBook.Worksheets.get_Item(1);


                Array cod = (Array)objWorkSheet.get_Range("A4", "Z4").Value2;
                string name = cod.GetValue(1, 1).ToString();

                Console.WriteLine("cod={0}", name);
                
                xlWorkBook.Close(true, misValue, misValue);
                xlApp.Quit();

                releaseObject(objWorkSheet);
                releaseObject(xlWorkBook);
                releaseObject(xlApp);
            }

            Console.WriteLine("Ended!");
        }

        private static void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                Console.WriteLine("Unable to release the Object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        } 
    }
    
    public class LanguageHelper : IDisposable
    {
        private CultureInfo mCurrentCulture;

        public LanguageHelper()
        {
            // save current culture and set culture to en-US
            mCurrentCulture = Thread.CurrentThread.CurrentCulture;
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
        }

        #region IDisposable Members

        public void Dispose()
        {
            // return to normal culture
            Thread.CurrentThread.CurrentCulture = mCurrentCulture;
        }

        #endregion
    }