2009
09.04

Cheguei há cerca de 1 hora a casa, depois de mais um dia de trabalho de 12 horas… ( estas últimas 3 semanas têm sido uma constante… )

Entretanto recebi um mail da Net empregos, e decidi ir ver o que havia para aí no mercado.. só mesmo naquela para andar informado..

Houve um anúncio que me chamou à atenção:

Empresa em vias de expansão no mercado internacional procura:

Perfil do candidato:
Boa cultura visual
Experiência em PHP / MySQL / xHTML / CSS / AJAX / XML
Experiência em e-commerce, bases de dados, backoffice, etc…
Disponibilidade imediata para trabalho em full-time durante 2 meses com possibilidade de continuação
Espírito inovador e pró-activo

Preferência aos candidatos:
Zona de Lisboa e arredores

Oferecemos:
Integração em equipa dinâmica
Bom ambiente de trabalho
800-1000 euros líquidos

Local de Trabalho: Home sweet Home

Ou seja, tem de ter experiência, e para saber aquilo tudo não chega só um ano ( porque um gajo não nasce ensinado )….e depois oferecem um excelente ordenado..entre os 800€ e os 1000€ líquidos…é que está aqui um ordenado que é um espectáculo, para além disso, só temos a garantia de 2 meses de trabalho, depois logo se verá.. se eu andasse à procura nem desperdiçava o meu tempo com esta gente..

No entanto há alguns anúncios que são simplesmente lindos, ora vejam este:

Grupo de Webgeeks procura Geek para adoptar, no Porto

És um geek? Não podes viver sem a net? Os teus melhores amigos vivem do outro lado do mundo e só os conheces pelo nick dos fóruns?

PHP é o teu nome do meio? Comes bases de dados com milhões de registos ao pequeno almoço?

Se tens mais de 18 anos e correspondes a este perfil candidata-te. Se não correspondes ao perfil, o melhor é procurares um emprego. Este lugar não é para ti.

Simples, conciso, eficiente… nada daquelas tangas de “Renumeração equivalente com a experiência mostrada”, nem nada do género… só pelo anúncio gostava de ir trabalhar para lá…

O que é giro é que praticamente todos os anúncios que se vêm têm sempre o tradicional: “Capacidade de trabalhar em equipa”, “Excelente capacidade de comunicação” etc etc etc… esta gente não sabe variar..

Um bem haja a todos e bom código…

2009
09.03

A Microsoft lançou uma campanha que dá comida a 8 sem abrigo, quando uma pessoa faz download do IE8…

Isto no mínimo é bastante rebuscado… e porquê 8? Porque não 10? Mas se com esta campanha, eles conseguirem que uns quantos milhões de pessoas façam upgrade para o IE8, já fico super contente..

Podem ver o site aqui: Browser for the better..

Browser for the better

Uma dica, carreguem no lado direito onde diz “Better Browser”, para verem uns vídeos que é só rir..

Ora aí está uma boa campanha…quase que me convenciam a usar apenas o IE8 como browser.. ou não… estou simplesmente fascinado com o Google Chrome.. mas faltam-lhe os plugins que uso no Firefox…só depois de os ter é que me mudo para o Chrome..

E uma coisa interessante, se abrirem o site no Chrome, primeiro vêem logo que o fundo não se adapta ao ecrã totalmente… e começa a tocar uma música que ou será irritante ou de partir o coco a rir…brincadeira da Microsoft em relação ao Chrome?

Edit: Afinal é um bug, ou no código deles ou no Chrome, porque a música é de um vídeo que está no site, que no Firefox só começa a tocar quando se carrega no link apropriado, mas no Chrome arranca logo a tocar.. ups..

Ficam aqui com um dos vídeos que não consegui ver no site deles:

Um bem haja a todos e bom código..

2009
09.03

Para aqueles que não conhecem o Kentico CMS, aconselho a darem uma olhadela à homepage deles, considero-o um bom CMS ( tendo em conta aquilo com que já trabalhei, Joomla e Mambo, que para mim são péssimos… )…

Têm várias versões de licenciamento do software, mas a meu ver são bastante irreais para o mercado português, então para a comunidade freelancer ainda pior, no entanto têm uma versão free, mas que têm uma condição.. da qual eu não gosto nada, para podermos usar a versão free temos de por o “branding” deles em todas as páginas que são geridas pelo CMS, não acredito que seja fácil vender isto a um cliente…

Mas no final, considero que é um excelente CMS, e na última versão que testei ( versão 4.0 ), está mesmo muito bom… já saiu a versão 4.1 ( no mês passado senão estou em erro )…

Mas voltando ao que me fez criar um post..

Ontem e hoje, estive à luta com um CMS:Repeater ( controlo do Kentico, basicamente fizeram um “extend” ao Repeater do .Net ) e com o CMS:TemplateDataPager…

Já tinha usado esta combinação 2 dias antes, e não tive problemas, só que tinha usado através de webpart’s clonadas ( clonei a webpart do Kentico CMS:Repeater ), desliguei o DataBindingByDefault e o EnablePagging do CMS:Repeater e problema resolvido, foi só afectar o TemplateDataPager com o DataSource do CMS:Repeater e problema resolvido…

Vendo o exemplo deles, é bastante fácil de o fazer:

Página:

<table style="border: solid 1px #CCCCCC; margin-left: auto; margin-right: auto;">
    <tr>
        <td style="border-bottom: solid 1px #CCCCCC; padding: 10px; text-align: center;">
            <cc1:cmsrepeater id="CMSRepeater1" runat="server" path="/%" classnames="CMS.Product"
                transformationname="CMS.Product.preview">
            </cc1:cmsrepeater>
        </td>
    </tr>
    <tr>
        <td style="padding: 10px; background-color: #D9D9D9;">
            <cc1:templatedatapager id="TemplateDataPager1" runat="server">
                <NumberTemplate>
                    <a href="?Page=<%# Eval("PageNumber")  %>"><%# Eval("PageNumber")  %></a>
                </NumberTemplate>
                <SelectedNumberTemplate>
                    <b><%# Eval("PageNumber")  %></b>
                </SelectedNumberTemplate>
                <SeparatorTemplate>
                    -
                </SeparatorTemplate>
                <FirstItemTemplate>
                    <a href="?Page=1">First</a>&nbsp;|&nbsp;
                </FirstItemTemplate>
                <LastItemTemplate>
                    &nbsp;|&nbsp;<a href="?Page=<%# pageCount %>">Last</a>
                </LastItemTemplate>
                <PreviousItemTemplate>
                    <a href="?Page=<%# previousPage %>">Previous</a> &nbsp;|&nbsp;
                </PreviousItemTemplate>
                <NextItemTemplate>
                    &nbsp;|&nbsp; <a href="?Page=<%# nextPage %>">Next</a>
                </NextItemTemplate>
            </cc1:templatedatapager>
        </td>
    </tr>
</table>

Code behind:

using CMS.GlobalHelper;
public partial class CMSControlsExamples_TemplatedDataPager : ControlsExamplesPage
{
    public string pageCount = "1";
    public string previousPage = "1";
    public string nextPage = "";

    ///
    /// OnInit override
    ///
    ///
    protected override void OnInit(EventArgs e)
    {
        // Disable repeater pager and databindbydefault
        CMSRepeater1.EnablePaging = false;
        CMSRepeater1.DataBindByDefault = false;
        base.OnInit(e);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Get repeater datasource
        TemplateDataPager1.DataSource = CMSRepeater1.DataSource;
        // Set page size
        TemplateDataPager1.PageSize = 1;
        // Set current page from query string
        TemplateDataPager1.CurrentPage = ValidationHelper.GetInteger(Request.QueryString["Page"], 1);
        // Get page number for last link
        pageCount = ((int)(TemplateDataPager1.PageCount - 1)).ToString();
        // Set default next page link
        nextPage = pageCount;
        // Set previous link
        if ((TemplateDataPager1.CurrentPage - 1) >= 1)
        {
            previousPage = ((int)(TemplateDataPager1.CurrentPage - 1)).ToString();
        }
        // Set next link
        if ((TemplateDataPager1.CurrentPage + 1) <= (TemplateDataPager1.PageCount - 1))
        {
            nextPage = ((int)(TemplateDataPager1.CurrentPage + 1)).ToString();
        }
        // Set paged datasource to the repeater and databind it
        CMSRepeater1.DataSource = TemplateDataPager1.PagedData;
        if (!DataHelper.DataSourceIsEmpty(CMSRepeater1.DataSource))
        {
            CMSRepeater1.DataBind();
        }
    }
}

Até aqui sem problemas, consegui-o usar sem acontecer nada, o problema surgiu foi quando tentei afectar o CMS:Repeater com um DataSource vindo de uma query, tentei de várias maneiras afectar o DataSource do CMS:TemplateDataPager, que o DataSource ficava sempre a vazio, apesar de a query estar a retornar 38000 resultados.

Estava a usar mais ou menos este código ( na realidade tenho as chamadas à base de dados encapsuladas com tratamento de excepções):

protected void Page_Load(object sender, EventArgs e)
{
    GeneralConnection cn = new GeneralConnection();
    DataSet ds = null;
    object[,] parameters = new object[1, 3];
    parameters[0, 0] = "@UserName";
    parameters[0, 1] = "johns";
    CMSRepeater1.DataSource = cn.ExecuteQuery("cms.user.selectbyname", parameters).Tables[0];
    // Get repeater datasource
    TemplateDataPager1.DataSource = CMSRepeater1.DataSource;
    // Set page size
    TemplateDataPager1.PageSize = 1;
    // Set current page from query string
    TemplateDataPager1.CurrentPage = ValidationHelper.GetInteger(Request.QueryString["Page"], 1);
    // Get page number for last link
    pageCount = ((int)(TemplateDataPager1.PageCount - 1)).ToString();
    // Set default next page link
    nextPage = pageCount;
    // Set previous link
    if ((TemplateDataPager1.CurrentPage - 1) >= 1)
    {
        previousPage = ((int)(TemplateDataPager1.CurrentPage - 1)).ToString();
    }
    // Set next link
    if ((TemplateDataPager1.CurrentPage + 1) <= (TemplateDataPager1.PageCount - 1))
    {
        nextPage = ((int)(TemplateDataPager1.CurrentPage + 1)).ToString();
    }
    // Set paged datasource to the repeater and databind it
    CMSRepeater1.DataSource = TemplateDataPager1.PagedData;
    if (!DataHelper.DataSourceIsEmpty(CMSRepeater1.DataSource))
    {
        CMSRepeater1.DataBind();
    }
}

Este código não faz absolutamente nada, ou melhor até faz, a query à base de dados é efectuada correctamente, retorna resultados, só que quando se afecta a DataSource do TemplateDataPager, esta ficava sempre a null…

E qual era o problema, é que pelos vistos quando afectava a DataSource do CMS:Repeater, a DataSource ficava com o tipo DataTable, até aqui tudo bem, se eu comentasse o CMS:TemplateDataPager, o CMS:Repeater era preenchido, o transform efectuado e tudo aparecia às mil maravilhas..

O que acontece é que o DataSource do CMS:TemplateDataPager tem de ser um DataView, em vez do DataTable..coisa simples não é?

Clonando a webpart deles, nunca afectamos directamente o DataSource do CMS:Repeater, este é afectado por eles, e o DataSource fica sempre com DataView, quer seja um CMS:Queryrepeater, quer seja um CMS:Repeater… por isso é que o erro não foi detectado nas webpart’s que tinha clonado anteriormente…

Após ter alterado o código para:

protected void Page_Load(object sender, EventArgs e)
{
    GeneralConnection cn = new GeneralConnection();
    DataSet ds = null;
    object[,] parameters = new object[1, 3];
    parameters[0, 0] = "@UserName";
    parameters[0, 1] = "johns";
    CMSRepeater1.DataSource = cn.ExecuteQuery("cms.user.selectbyname", parameters).Tables[0].DefaultView;
    // Get repeater datasource
    TemplateDataPager1.DataSource = CMSRepeater1.DataSource;
    // Set page size
    TemplateDataPager1.PageSize = 1;
    // Set current page from query string
    TemplateDataPager1.CurrentPage = ValidationHelper.GetInteger(Request.QueryString["Page"], 1);
    // Get page number for last link
    pageCount = ((int)(TemplateDataPager1.PageCount - 1)).ToString();
    // Set default next page link
    nextPage = pageCount;
    // Set previous link
    if ((TemplateDataPager1.CurrentPage - 1) >= 1)
    {
        previousPage = ((int)(TemplateDataPager1.CurrentPage - 1)).ToString();
    }
    // Set next link
    if ((TemplateDataPager1.CurrentPage + 1) <= (TemplateDataPager1.PageCount - 1))
    {
        nextPage = ((int)(TemplateDataPager1.CurrentPage + 1)).ToString();
    }
    // Set paged datasource to the repeater and databind it
    CMSRepeater1.DataSource = TemplateDataPager1.PagedData;
    if (!DataHelper.DataSourceIsEmpty(CMSRepeater1.DataSource))
    {
        CMSRepeater1.DataBind();
    }
}

Ficou tudo a funcionar às mil maravilhas..

Nem imaginam as voltas que dei para encontrar esta solução, estava difícil mas consegui..

Um bem haja a todos e bom código..

2009
09.02

…me parecem bastante mal…

No outro dia no escritório, pediram a uma parte dos colaboradores para dar umas ideias para um folheto que estavam a fazer para fazer promoção da empresa..

Cometeram 2 erros…a meu ver…

Primeiro não convidaram todos os colaboradores, erro crasso este, embora os que faltassem não fossem da área criativa/área web, não interessa, de certeza que tinham ideias bem jeitosas…

Segundo, enviei um email para toda a gente com a minha opinião e com algumas ideias diferentes, nada do que é habitual no meio da publicidade ( mas que já está a ser comum ), basicamente era tudo virado para o “Viral Marketing”…e no entanto só uma pessoa me respondeu, e não foi a pessoa que tinha pedido a opinião dos colaboradores…

Claro que devido a não terem ido todos os colaboradores, ouve alguns que chegaram ao pé de mim, e me perguntaram: “O que raio é aquele email que tu enviaste?”

Ora isto só vem é cair mal, estive para ali eu a perder o meu tempo a escrever um email, à procura de informações para ser algo que fizesse sentido, expondo as minhas ideias e conceitos para que se podesse evoluir, e no entanto nem uma resposta obtive da pessoa que “me” veio pedir ajuda/opinião..

Ora pede-se a opinião das pessoas e depois nem se dá cavaco? Humm… não me parece nada bem…

Mas isto também pode ser problema meu… se calhar é suposto não esperar uma resposta, nem que seja uma do género: “Não, esquece lá isso, nós não estamos minimamente interessados em ir por essa via…”, ao menos ficava a saber que tinham lido o email, assim nem sei…

Um bem haja a todos..

2009
09.02

… é assim:

Embedded video from CNN Video

Como se poder ver, é exactamente igual a milhares de empresas existentes em Portugal… ( para quem não percebeu estou a ser sarcástico )..

Ora se em algumas empresas em Portugal, até ver um vídeo no Youtube é considerado um insulto à produtividade, imaginem as salas recreativas onde existem consolas/instrumentos musicais e afins.. então isto é o descalabro..

Imagino uma empresa em Portugal onde sirvam o pequeno-almoço e almoço de borla, imagino o que iria acontecer… toda a gente ia querer ir trabalhar para lá ( mesmo não recebendo o subsídio de almoço ), ora se toda a gente queria ir trabalhar para lá, o que é que acontecia? Os melhores dos melhores iriam lá parar, sem excepção..

Já tinha falado sobre este tema num post do meu outro blog: “Fazer as coisas bem feitas!“, neste caso falava do exemplo da Fog Creek Software, uma empresa que desenvolve aplicações baseada nos estados unidos, ora estes têm um problema bastante grande, as grandes empresas na América são a Google, Yahoo e Microsoft, e como é lógico, estas levam sempre os melhores programadores para as suas trincheiras, não só pelo nome mas pelas excelentes condições de trabalho…

Mas estes fizeram de tudo, para criar um escritório onde qualquer potencial colaborador que fosse lá a uma entrevista, ficasse completamente babado e deixasse de pensar em ir parar à Microsoft ou Google ou Yahoo…

Quando é que será que os gestores portugueses vão reparar nestes pormenores, quando é que vão perceber que é preciso uma pessoa divertir-se no trabalho para fazer um bom trabalho, e quando digo divertir-se não é divertir-se com o trabalho, é desligar/descontrair, lançar uma piada ou cometer um erro exageradamente estúpido onde toda a gente se fica a rir…

Eu adoro aquilo que faço, mas se não fosse os meus colegas de trabalho e eu a quebrar a monotomia do dia a dia, acho que nunca iria ser feliz a programar…

Aquela história toda dos cúbiculos, para mim não pega de maneira nenhuma, para mim tem de ser “open space”, para poder haver comunicação e discussão de ídeias..

Ouvi uma vez uma proposta de uns chefes em que consistia em criar cúbiculos numa sala que devia ter uns 7 x 5 metros ( mais coisa menos coisa ) onde estavam 6 pessoas a trabalhar… que coisa mais idiota que alguma vez foi proposta.. mas enfim…

As mentalidades em Portugal têm que mudar, e eu acho que isso só vai acontecer quando houver sangue novo nas posições de gestor, será a próxima geração? Será já a minha geração? Não sei, sei que quando os gestores da época Google/Yahoo/Microsoft entrarem a funcionar em pleno, aí sim, teremos uma mudança nas condições de trabalho que serão assustadoras mas no entanto bastante melhores…

Um bem haja a todos…

2009
08.27

Isto é já para por as hostes a ferver..

Sábado, tive que ir trabalhar, temos uma fase de um projecto para entregar em que o prazo era até 5º feira passada ( atraso à grande.. )…mas isto não interessa nada…o que interessa é que sábado tive que ir lá bater com os costados das 10 da manhã até praticamente às 7 da tarde..

Chegou à hora de almoço…vai a malta toda almoçar…e prontamente o chefe saca da carteira, vira-se para o gajo da caixa, e diz: “Deixe estar que isso é comigo…”

Ora não fez mais que a sua obrigação…ponto final parágrafo…

Esta é daquelas coisas que nunca me acontecia quando trabalhava na “CommQuack” ( julgavam que ia por o nome real não era? Depois era eles a ligarem-me outra vez a chatear a cabeça.. )… atenção o que não acontecia era o chefe sacar da carteira quando se ia trabalhar ao sábado!! O trabalhar ao sábado, não era comum, mas de vez em quando acontecia…lá era mais estender as noites que outra coisa…

Mas não pensem que se chegavam à frente para pagar o jantar… era só o que faltava… ( ok..aqui estou a ser injusto… eram 2 chefes, e um deles até se chegava à frente.. só é pena é ele não estar na minha área )

Há aqui um ponto importante a referir..que eu ainda não disse..que é…fui trabalhar no sábado, mas não vou receber horas extraordinárias…se fosse receber.. aí sim até faria algum sentido não pagarem o almoço…mas mesmo assim não lhes ficava nada mal…

Naquelas noitadas que fazia na “CommQuack” só houve para aí 3 ou 4 que foram pagas com horas extraordinárias…as outras tá quieto…

E onde é que eu quero chegar… há chefes, que sabem o que fazem… ( mas atenção todos eles têm os seus defeitos…ora bolas até eu tenho..  não há chefe que seja perfeito..), e outros que não sabem..e que agem como autênticos ditadores.. ( ok esta é capaz ter sido forte demais…mas eu estou cansado portanto dêem-me o desconto.. )

Um bem haja a todos…e bom código…

2009
08.26

Aviso já que vou começar com os posts geek’s…

Enquanto não arranjar tempo e pachorra para criar um blog só dedicado à minha profissão, vão ter que aturar estes posts aqui…

Já tinha ouvido falar há algum tempo do CakePHP..

E como tenho que fazer aquela pequena aplicação do euromilhões que falei no post anterior, lá decidi experimentar hoje ( depois de ter chegado a casa às 21, vendo bem estive 12 horas fora de casa…no qual uma delas foi para almoço… ).

Lá andei à guerra para o conseguir por a correr.. mas até foi relativamente fácil…só uma “martelada” aqui e acolá no httpd.conf do apache e siga para bingo…

Depois decidi seguir o tutorial deles para criar um blog..coisa muito simples e rápida de fazer..

Lá criei o modelo, o controlador e as várias views, para isto começar a mostrar alguma coisa…

Depois de finalizar a criação de todas as views e actions para o gajo trabalhar noto que o gajo a mostrar a lista de posts é extremamente lento…mas lento mesmo…eu se fizesse isto em PHP puro e duro sem framework’s nenhumas à mistura, se calhar demorava umas 3 ou 4 horas ( se calhar ), aqui demorei cerca de 1 hora e meia…mas no entanto a página abria instantâneamente…

Podem testar aqui: http://euromilhoes.no-ip.org

Que isto me parece uma maneira bem rápida de produzir qualquer coisa, lá isso me parece..mas a questão da velocidade está-me a preocupar…ainda dei uma olhadela ao sistema de cache, e pus no código alguns parâmetros, mas não faço a mínima ideia se está a trabalhar ou não.. e a esta hora já não tenho pachorra para estar a ver mais coisas disto…

Se amanhã conseguir, faço aqui um pequeno update, para dizer como estão a correr as experiências com esta framework..

Ainda tenho montes de dúvidas, por exemplo, os gajos têm uma classe “helper” para fazer validações aos formulários, agora imaginando que eu quando estou a criar quero fazer uma validação, e quando estou a editar quero fazer outra? Como o controlador é o mesmo e a validação dos campos é partilhada por todas as views, não sei como é..

Falta saber se a perda de flexibilidade é bem menor que o tempo que se ganha a desenvolver aplicações com esta framework…

Um bem haja a todos…e bom código…