quinta-feira, fevereiro 17, 2011

Licenciados desempregados

Este post surge da sequência do que li neste blog e do que vi na reportagem "Geração à rasca" que deu ontem no jornal da noite da SIC. Felizmente para mim não me revejo nos jovem que foram apresentados na reportagem, tenho um emprego estável, comecei a trabalhar antes de acabar o curso, foi-me concedido crédito habitação e todos os meses recebo pelo menos um contacto com propostas de trabalho.

A única coisa naquela reportagem ao qual me consegui colar foi o discurso do presidente do IST em que dizia que todos os alunos do IST tinham empregabilidade garantida, e que se formassem mais o mercado absorvia porque há muitas necessidades na área da engenharia tecnológica. Apesar de me ter formado no ISEL este discurso assenta-me que nem uma luva, todos os meus colegas que terminaram o curso tiveram entrada fácil do mercado de trabalho e não sofrem dos problemas da "Geração à rasca".

Mas nada acontece por acaso, na altura em que estudava entravam todos os anos 150 novos alunos e por ano terminavam o curso 20-25 alunos. O que acontecia aos restantes? Uma pequena parte fazia só o bacharelato, mas a esmagadora maioria desistia do curso menos de 1 ano depois de começar, acabando por ir para cursos mais fáceis de concluir.

Numa sociedade cada vez mais competitiva ter curso superior de "armas medievais" ou "comunicação por sinais de fumo", nos quais se consegue entra com médias negativas, é normal que não dê garantias nenhumas de emprego, porque licenciados hoje em dia há centenas de milhar.

terça-feira, fevereiro 15, 2011

E a saga continua...

Depois do meu último post, e como em alguns casos até sou um bom samaritano, sugeri à minha gestora a utilização de um issue tracker para lhe facilitar a vida. A resposta foi algo do género:

- Já andei a analisar algumas mas não sei bem o que utilizar, mas eu costumo utilizar uma folha de excel partilhada na rede, acho que é uma boa solução,dá para por lá as tarefas e vocês irem actualizando.


Folha de excel...ai a minha vida...voltei ao jurássico e estou a ser gerido por um dinossauro.

sexta-feira, fevereiro 11, 2011

O meu caderno de anotações

Uma das coisas que não dispenso de todo quando estou a trabalhar é ter um caderno ou pelo menos umas folhas onde eu possa ir rabiscando e escrevendo coisas que não me quero esquecer. No fundo o meu caderno é o meu "diário de bordo". E tal como um diário eu considero-o como algo privado, que não quero que seja cuscado por pessoas que são puramente colegas de trabalho e para mim não têm o estatuto de amigas mas apenas de conhecidas.

Um dia desta semana quando a gestora do projecto onde estou, me passou uma série de tarefas, conforme ela estava a passar as tarefas eu estava a aponta-las, juntamente com algumas notas que me pareciam relevantes para depois as executar. Depois conforme estava a executar as tarefas punha um certo para eu próprio saber que já estava e ir controlando tudo o que precisava de fazer.

Houve uma altura que a gestora veio à minha mesa, pegou no caderno e começou a ver, para ver o que já tinha feito. Fiquei logo a olhar de lado porque considero um abuso mas pronto não vou entrar em conflito. Passado um bocado saí da minha mesa e quando voltei lá estava ela outra vez especada a olhar para o meu caderno. Chego à mesa como é óbvio todo lixado, fecho o caderno e pergunto-lhe se ela queria alguma coisa. E penso para mim, bolas se queres controlar o estado das coisas usa um issue tracker como qualquer gestor de projecto digno desse nome, mas não andes a invadir a minha privacidade.

Solução que arranjei, vou começar a escrever as coisas em folhas aleatórias, quando estou na mesa deixo o caderno entre mim e a parede, quando não estou na mesa deixo o caderno fechado.

quinta-feira, fevereiro 10, 2011

DataGrid WPF forçar Refresh

A minha tortura com as DataGrid do WPF continua. Agora o meu problema é que eu queria depois de adicionar uma linha, trabalhar os dados que estão binded com base nos valores que preenchi quando estava a adicionar a linha.

Primeiro raciocínio, devo ter um evento que me indique que a row foi adicionada, é só agarrar-me a ele e fazer o meu processamento. Aí vou eu agarrar-me ao evento RowEditEnding e faço o código que queria para alterar a row adicionada , fazendo o Refresh dos Items no fim. Executo o código e pimba estou a levar com uma excepção: " 'Refresh' não é permitido durante uma transacção AddNew ou EditItem ".

Depois de pesquisar um bocado, a solução mirabolante é desregistar o evento, fazer Commit da DataGrid, fazer o processamento que quero, forçar o Refresh e finalmente voltar a registar o evento.
private void MyRowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
   dGrid.RowEditEnding -= MyRowEditEnding;
   dGrid.CommitEdit();

   //O meu processamento à lista que está binded
          
   dGrid.Items.Refresh();
   dGrid.RowEditEnding += MyRowEditEnding;
}

terça-feira, fevereiro 01, 2011

Personalizar uma Row numa DataGrid WPF

Uma das coisas que mais me irrita fazer é a Graphical User Interface (GUI), perde-se imenso tempo com detalhes da treta e acabamos por não aprender nada de novo. Isto alcança o seu auge quando falamos de DataGrid, vendido como sendo a melhor coisa do mundo, a verdade é que é muito bom sim para demos rápidas, agora quando se quer começar a personalizar começa a dar mais trabalho que benefícios.

Estava aqui a trabalhar numa DataGrid em WPF quando me foi pedido que a cor de cada row fosse condicionada a uma propriedade do objecto que estava a ser bind. Parece simples...pois não é nada trivial e perdi à volta de 3h em pesquisas na internet e a implementar vários exemplos até que cheguei a uma solução que me agradou minimamente e era funcional.

Para o exemplo vamos considerar os seguintes pontos:
  • A nossa DataGrid tem o nome de dGrid;
  • O tipo do objecto que é bind a cada row é Register;
  • A propriedade do objecto que vai ser usada para condicionar a cor da row é a propriedade LK;
Os 2 principais contratempos que tive foram a altura em que podia afectar a cor da row e o facto de não poder afectar a cor da row, mas sim das células pois a cor das células sobrepõe-se à cor da row. Em relação à altura em que podia afectar a cor das células, em WPF só temos garantia que todos os filhos da janela estão prontos no evento Loaded da janela, logo tenho de ter um listener neste evento que no meu caso é o método WindowLoaded. Seguindo todos estes pressupostos o código seguinte exemplifica a solução a que cheguei.

private void WindowLoaded(object sender, RoutedEventArgs e){
    UpdateRowColor();
}

private void UpdateRowColor(){
    for (int i = 0; i < dGrid.Items.Count; ++i){
        DataGridRow row = GetRow(dGrid, i);

        if (row.Item is Register){
            Register registry = (Register)row.Item;

            for (int j = 0; j < dGrid.Columns.Count; ++j){
                if (registry.LK == "O")
                    GetCell(dGrid, row, j).Background = Brushes.Green;
                else
                    GetCell(dGrid, row, j).Background = Brushes.Red;
            }
        }
    }
}

private DataGridRow GetRow(DataGrid dataGrid, int index){
    DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index);
    if (row == null){
        dataGrid.ScrollIntoView(dataGrid.Items[index]);
        dataGrid.UpdateLayout();
        row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index);
    }
    return row;
}

private DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
{
    if (rowContainer != null){
        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

        // try to get the cell but it may possibly be virtualized
        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
        if (cell == null){
            // now try to bring into view and retreive the cell
            dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
            cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
        }
        return cell;
    }
    return null;
}

private T GetVisualChild<T>(Visual parent) where T : Visual{
    T child = default(T);
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); ++i){
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
            child = GetVisualChild<T>(v);
        if (child != null)
            break;
    }
    return child;
}

segunda-feira, janeiro 31, 2011

Fim de semana da empresa

Todos os anos a empresa onde trabalho faz um retiro durante 3 dias com o objectivo de comunicar aos colaboradores o estado das coisas e para que haja interacção entre pessoas, que nem se conhecem porque apesar de trabalharmos todos na mesma empresa trabalhamos em sítios diferentes.

O ponto alto dos 3 dias é sempre o dia em que temos provas e a coisa se torna mais competitiva. Depois da frustração do ano passado ter ficado em 4º lugar na prova de karts, mesmo à beirinha do pódio, este ano consegui estar na equipa vencedora e acabámos por terminar a prova com 2 voltas de avanço para o 2º lugar. Já se sabe seguiu-se o banho de champanhe...mas para os derrotados, abrir a garrafa e desatar a correr atrás dos outros para partilhar o champanhe com eles, apesar de terem perdido também tinham direito!

Depois das actividades ainda tivemos direito ao conforto e prazer do jacuzzi e da sauna, mente e corpo revigorados, onde assino para ter isto todos os fins de semana!

quinta-feira, janeiro 27, 2011

Aqui está o 5º aniversário

Este dia é especial para este blog, pois como assinalo todos os anos o dia 27 de Janeiro marca o dia da criação deste blog. À 5 anos atrás estava a nascer, e desde ai muitas memórias quase perdidas consigo encontrar nele, saber o que andava a fazer de relevante numa dada altura da minha vida. Tem sido um percurso interessante e numa altura que se fala da morte dos blogs este está aqui de pedra e cal para continuar, é uma boa forma de não deixar coisas importantes para mim caírem em esquecimento.

Preprompt - Aspectos internos e idiomas de programação em C#

Ontem fui assistir à 1ª sessão do Preprompt e o que posso dizer é que não me sentia mentalmente tão estimulado à muito tempo. Falaram-se em aspectos da linguagem que normalmente não se utilizam todos os dias, por isso não estão ainda bem entranhados o que dificultou o seguimento do raciocínio.

Contudo estes mecanismos são extremamente úteis facilitando imenso a vida ao programador quando bem utilizados, o facto é que nunca os vi aplicados por outras pessoas numa situação real e não numa situação puramente académica.

Para grande contentamento meu, eu e o Nuno conseguimos resolver todos os exercícios práticos, queimando alguns neurónio é verdade, mas sem a ajuda mutua teria teria sido uma tarefa bem difícil, e quanto a mim humildemente digo que teria sido quase impossível ter resolver aqueles quebra-cabeça sozinho.

segunda-feira, janeiro 10, 2011

O novo projecto

Normalmente costuma-se dizer - Ano novo, vida nova - no meu caso aplicou-se perfeitamente, desde o início do ano mudei de projecto e voltei a trabalhar fora de casa, tal como tinha acontecido no início do ano passado.

Até agora estou a gostar bastante, estava farto e saturado do projecto que estava a fazer. Este projecto apesar de não ser novo, já tem alguns meses, está feito com tecnologia recente o que já me deu hipótese de aprender algo novo. As pessoas são agradáveis assim como o espaço de trabalho, tenho uma mesa grande, 2 monitores e o mais importante sossego.

Mas nem tudo é um mar de rosas, pela minha experiência já me apercebi que o projecto está a ser mal gerido, já todos percebemos que os prazos de entrega não irão ser cumpridos, contudo ainda se ouve: "Se isto correr assim, aquilo assim e ainda de a outra coisa correr assado então talvez se consiga entregar a horas.". Às vezes nem prespectivando os piores cenários as coisas são entregues a horas porque há sempre imponderáveis, quanto mais fazendo conta que tudo irá correr pelo melhor, mas pronto quem sou eu para discordar?

domingo, janeiro 02, 2011

Resultados da S. Silvestre da Amadora

Acabou por ser uma prova que me correu muito melhor do que estava à espera, pois consegui bater o tempo que fiz na Corrida do Tejo. Como ponto principal devo dizer que esta corrida sem dúvida é especial, devido a ser urbana e as pessoas nas ruas serem extremamente aficionada, apoiando os corredores do início ao fim.

A prova é complicada devido à altimetría muito acidentada, provocando um desgaste extra, vá lá que durante a prova e apesar de haver bastante humidade não chegou a chover o que não complicou tanto. Os resultados da prova podem ser vistos aqui.

Alguns dados da minha prova:
  • Tempo de prova: 46m07s;
  • Média por cada quilómetro 4m37s;
  • Velocidade média 13km/hora;
  • Média de 165 batimentos cardíacos por minuto.
  • Máximo de 176 batimentos cardíacos por minuto.