Aproveite o Community Zone ao máximo

O guia a seguir irá ajudar os estreantes de Community Zone a aproveitarem o máximo do evento. O que você irá ler a seguir vem de experiência de 3 CZ’s e tem como único objetivo te ajudar a interagir melhor no evento.

O que é o Community Zone?

É um evento organizado pela Microsoft onde ela reúne os principais influenciadores do Brasil com os objetivos:

  • Colher feedback dos participantes.
  • Aumentar a integração entre os grupos e pessoas.
  • Formentar novas iniciativas e (HCLs, Community Launchs, Copa Microsoft de Talentos).
  • Capacitar os líderes de grupos.

O que a Microsoft espera de você?

  • Que as informações e projetos iniciados no CZ sejam levados aos grupos de usuários.
  • Que você realize mais eventos e da forma correta.
  • Que você faça mais webcasts.
  • Que você participe ainda mais dos fóruns.
  • Que você recupere as energias e gere ainda mais informações online.

É a sua primera vez?

Se sim. Vamos contextualizar algumas coisas. Provalvemente as pessoas te conhecem pelo seu “perfil online”. Isso mesmo, as pessoas conhecem muito bem o seu avatar e os conteúdos que você disponibiliza na internet mas dificilmente de reconheceriam na rua pessoalmente.

Logo, você precisa mostrar a sua cara! Não tenha vergonha, não seja “o tímido” do grupo. O evento foi planejado para termos integração, então faça isso ora-bolas.

É um veterano de CZ’s?

Você já foi uma ou mais vezes ao Community Zone e já conhece várias pessoas, conhece o time da Microsoft, tem idéia do que esperar do evento. Logo você é a pessoa perfeita para mostrar aos estreantes como você é um cara legal. Passe um pouco da sua experiência de comunidades pra frente. É esse o verdadeiro espírito de comunidade.

Evite grupinhos, seja aberto a conhecer outras pessoas

Com toda certeza você tem aqueles amigos mais próximos e que você com certeza gostaria de conversar muito e eles estarão lá no CZ.

Mas fique atento a alguns detalhes: provalmente existem dezenas de pessoas com as quais você poderia iniciar um projeto, trocar experiência e se tornar mais um amigo.

Logo, aumente o seu networking no Community Zone trocando idéias com várias pessoas.

Tenha o seu cartão pessoal a mãos

Você irá conhecer outras pessoas com as quais gostaria de manter contato. Então facilite as coisas, tenha a mãos alguns cartãosinhos com seu nome, MSN e twitter. Dessa forma você simplifica a troca de contatos.

Isso é sério, ao final do evento você irá despedir de várias pessoas e irá querer os contatos dela. Evite o desajeitado e demorado momento em que você pede para a pessoa so-le-trar o e-mail.

Converse com o time da Microsoft

O time da Microsoft no Brasil é muito seleto. São profissionais com uma experiência gigatesca com as quais 5min de conversa equivalem a várias horas de palestras e treinamentos.

Além de serem ótimas pessoas, com as quais é bem divertido tomar um coca-cola e conversar sobre os grupos de usuários, tecnologias, carreira e assuntos diversos. Não perca essa oportunidade que o CZ proporciona.

Fale com esses caras

Ivan Paulovich André Paulovich André Castro

@ivanpaulovich, @andrepaulovich e @alrcastro. Nós trabalhamos juntos aqui em Belo Horizonte e somos pessoas legais ;-)

Divirta-se

O Community Zone é um evento de integração. E certamente a Microsoft irá bolar várias atividades interessantes e também nos dará um tempo livre para aproveitarmos o hotel. Logo, há tempo pra tudo. Tempo para consumir informação e tempo para se divertir com os amigos que você acabou de fazer (ou irá fazer).


Considerações

Todas essas idéias foram tiradas da minha experïência com CZ’s e somente tem o intuito de ajudar a comunidade a interagir. Se você concorda ou discorda de algum ponto fique a vontade nos comentários.

Eu vou ao Tech-Ed Brasil 2010

techedSou o mais novo palestrante do Tech-Ed Brasil 2010. Eu participei da concurso o TechEd Brasil é um Evento de Féras e o meu vídeo foi o escolhido como vencedor.

A idéia do concurso era criar um vídeo de no máximo 2min explicando os motivos que justificariam a comissão do Tech-Ed a me convidarem a ser um dos palestrantes. Você pode conferir o making of aqui mesmo no blog.

Se você não viu a produção final vale a pena a assistir (e quem sabe rir um pouco):

Vejo vocês no Tech-Ed Brasil 2010! (e também no Community Zone)

Atualizações

Recebi algumas perguntinhas sobre o vídeo, e vou tentar esclarescer um pouco mais sobre a composição. Primeiro, eu havia pensado em fazer um vídeo num escritório e me aproveitar de uma lousa onde irião passar algumas imagens (semelhante a videos de previsões do tempo).

Mas depois, conversei com o André Paulovich e ele achou isso bem comum e com poucos diferenciais. E então veio a idéia de gravar um video caminhando por entre alguns objetos e enquanto eu explicava os motivos para ser um palestrante.

Esse modelo também não deu certo. Por que o tempo do video era de 2min, e o caminhar por entre objetos ficava curtissimo e não conseguimos passar essa ideia pra frente. Além de termos problemas com o tremedeira na cãmera. Não estava ficando legal.

Tivemos então a idéia de fazer algo semelhante aos comerciais da Nextel. Vimos que o único jeito de termos um efeito parecido era fazer uma filmagem usando um carro como suporte e falando o texto bem rápido já que o tempo era curto. O resultado disso tudo é o vídeo que vocês viram nesse post.

Além disso, alguns trejeitos de comportamento, as frases corridas e os passos largos foram planejados para dar uma idéia bem direta (nextel style) de ser.

Muito obrigado aos amigos pela ajuda e apoio na divulgação do vídeo. 

Tech-Ed, o evento dos palestrantes feras

Eu estou concorrendo a uma vaga para palestrante do Tech-Ed Brasil 2010. E o vídeo abaixo é uma produção onde eu provo por quê eu devo ser um palestrante do Tech-Ed. Assistam o vídeo:

Nesse vídeo de apenas 2 minutos (tempo curtíssimo) eu mostro algumas características fundamentais de um palestrante. São elas:

  • Ter habilidade para falar em público.
  • Possuir conhecimento teórico e experiência prática.
  • Ser um influenciador Microsoft na sua região.

Na sequência eu defendo por quê eu (Ivan Paulovich) tenho essas características. Vejam o vídeo e entendam.

Making Of

Aposto que vocês devem estar imaginando que criar um vídeo desses é simples e rápido. Mas eu tenho que lhes dizer que não foi tarefa fácil. Como eu optei por fazer um vídeo a céu aberto estávamos sujeitos ao ambiente e em todos os lugares que gravamos haviam dezenas de pessoas.

Com a ajuda dos meus amigos gravei vídeos em várias partes da cidade.

Gravei vídeos na Praça do Papa, depois no Parque das Mangabeiras, fiz alguns takes na orla da Pampulha, na Casa do Baile e no final optei por um vídeo numa rua deserta bem perto da minha casa ;-) 

(A esquerda eu na Praça do Papa)

 

 

Umas das coisas boas dessas filmagens foi passear pela cidade em busca de lugares legais de Belo Horizonte que pudessem compor o vídeo.

(A esquerda eu no Parque das Mangabeiras)

 

Gravamos várias vezes usando passinhos de ninja. Nessa técnica enquanto eu ando em direção a câmera o cinegrafista dá passos para traz. Parece súper tranquilo na teoria más na prática a imagem fica muito tremida.

Tentamos várias vezes até que minha namorada (Contra-Regra) teve a brilhante idéia de colocar o André Paulovich (Cinegrafista) sentado no porta-malas do carro para diminuir as trepidações do vídeo.

Submetemos a idéia ao André Paulovich (Diretor) e ele aprovou os recursos tecnológicos e logo colocamos tudo em prática ;-)

Vejam só a foto que tirei do nosso carrinho de filmagem:

Na foto minha namorada e meu irmão André Paulovich estão preparados para mais uma filmagem. E dessa geringonça saiu o vídeo final.

Agora que temos o vídeo gravado. Passamos o trabalho para o João Paulo (Editor de Áudio e Vídeo) criar uma abertura interessante, colocar legenda, colocar alguns elementos gráficos que pudessem traduzir o que eu defendia e também tratar o áudio.

Nessa foto André Paulovich acompanha os últimos detalhes da produção enquanto o João Paulo sincroniza as legendas e prepara para o “Go Live”!

Temos a obrigação e o prazer de agradecer ao grupo Delirious por mandarem um som tão maneiro. Se você curtiu o som da abertura e de fundo do vídeo assista esse clip:

E você, aprovou a minha candidatura ao Tech-Ed? Então tuíte o seguinte texto e eu te agradeço desde já:

@ivanpaulovich http://www.youtube.com/watch?v=kMoZDlnWQlc #TechEdBR #EventoDeFeras

Muito obrigado João Paulo, André Paulovich e Bárbara!

Alguns Retuítes da Comunidade

Update 24 de Agosto.

image
image
image
image
image
image
image

Paulovich.Data passa os 1500 downloads

Paulovich.Data é um framework de persistência para múltiplos datasources e fácil de usar. Você já deve ter ouvido falar muito dele aqui no blog.

O que você não sabe é que o Paulovich.Data é um framework usado por diversas pessoas no Brasil e também no exterior. Veja o gráfico de downloads ao longo do ciclo de vida do projeto.

image

Passamos dos 1500 downloads e temos aproximadamente 1 download por dia. Não é muito. Mas para um projeto que começou como um estudo de ADO.NET e se transformou em algo útil a tantas empresas e profissionais deixa todos que participam do projeto muito felizes. Obrigado!

Paulovich.Data

O Paulovich.Data é hospedado no Codeplex. A Microsoft mantém esse serviço e permite que seus usuários utilizem as melhores tecnologias para desenvolvimento de software colaborativo. Experimente você também, tenha uma idéia e divida ela com a comunidade.

Community Zone 2010: presença confirmada

CZ

Acabei de receber o convite para participar do Community Zone 2010 (2º Edição!). O Community Zone é um evento onde a Microsoft reúne quem mais atua na comunidade para discussão e integração.

Nessa edição do evento eu irei com alguns estreantes de CZ André Paulovich e André Castro (finalistas da Copa Microsoft de Talentos).

O evento desse ano promete! Estamos curiosos e ansiosos pelas atividades que teremos. E se você vai no evento ou tem curiosidade sobre o que é acompanhe a hashtag #CommunityZone ou siga-nos no twitter.

Atualizado em 19 de agosto

O Fabio Hara postou em seu blog algumas informações importantes sobre o Community Zone 2010. Dê uma lida nas perguntas mais frequêntes e siga-o no twitter.

Parabéns pra mim!

eu

Hoje comemoro 24 anos de vida e já comecei o dia muito bem com algumas excelentes surpresas. Vejam só algumas fotos da festa de aniversário que minha namorada preparou pra mim no trabalho:

100817_083101 

Na foto estão, Fernando, Ricardo Cruz, Wescley, Renato Lima, Alex Alves, Ivan Paulovich (Eu), Danielle Almeida, Giovanni, André Paulovich e João Paulo.

100817_083838

Na foto estão, Ricardo Cruz, João Paulo, Fernando Miranda, Wescley, Renato Lima, André Castro, Giovanni, Danielle, André Paulovich, e Luciano Lima.

Eu ainda vou comemorar meu aniversário nesse sábado. Me manda um e-mail que eu te passo detalhes do lugar e da hora. Ou então me liguem.

100817_083307

Leitor de RSS para ASP.NET mais simples que existe

O código abaixo é um leitor de RSS para ASP.NET e você pode colocar em praticamente todo site ASP.NET que permita acrescentar User Controls.

<%@ Control Language="C#" AutoEventWireup="True" Inherits="System.Web.UI.UserControl" %>
<%@ OutputCache Duration="600" VaryByParam="None" VaryByControl="None" %>

<script runat="server">
    public string Url
    {
        get { return Rss.DataFile; }
        set { Rss.DataFile = value; }
    }
</script>

<asp:Repeater ID="List" runat="server" DataSourceID="Rss">
    <HeaderTemplate>
        <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <li>
            <asp:HyperLink ID="title" runat="server" 
                NavigateUrl='<%# XPath("link") %>' Text='<%# XPath("title") %>'></asp:HyperLink>
        </li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

<asp:XmlDataSource CacheDuration="600" ID="Rss" 
    runat="server" XPath="/rss/channel/item">
</asp:XmlDataSource>

Para instalar no seu site basta que você insira código semelhante a esse:

<%@ Register TagName="RssFeed" TagPrefix="Extra" Src="~/Controls/RssFeed.ascx" %>

E em qualquer parte da sua página você pode usar o controle com um código assim:

Atualizando para ASP.NET 4

Voltei de uma viagem de férias ontem. E voltei animado para atualizar o blog para ASP.NET 4, então se nas próximas horas ocorrem algumas loucuras por aqui não se desesperem.

Como usar Windows Live Writer Beta e SubText

Não há dúvidas que a ferramenta mais confortável para criar posts é o Windows Live Writer. E agora temos uma nova versão cheia de novidades e facilidades disponível para download.

O passao a passo abaixo irá mostrar como é simples configurar o Windows Live Writer para postar seus textos no SubText.

Como configurar

Abrar o Windows Live Writer Beta e clique em Add Blog Account.

Selecione Other blog service.

Digite o endereço do seu blog, no caso do 100loop nós usamos blogs agregados então digito o endereço do autor do blog e clique em Next.

Aguarde o Windows Live Writer baixar as configurações do seu blog como tema, categorias e outras preferências. Em seguida clique em Next.

Digite um nome para o seu blog e clique em Finish.

Pronto. Você tem agora o conforto de um editor de textos totalmente integrado aos posts do seu blog. Você pode editar os seus posts e clicar em Publish que o texto estará no ar.

Como implementar temas no ASP.NET MVC 2?

Imagine um cenário onde seu aplicativo web é acessado por várias empresas e você quer que cada empresa possa personalizar o website com uma skin diferente. ASP.NET MVC 2 permite que você crie temas com pouco esforço.

Vamos lembrar alguns conceitos e aí partimos para o código. MVC é dividido em 3 responsabilidades Model, View e Controller. O ponto chave para conseguirmos usar temas no MVC é atuar em cima das Views.

O código a seguir irá fazer o seguinte:

  1. Identificar pela Url qual tema está sendo requisitado.
  2. Definir o diretório onde as Views deverão ser procuradas para a requisição atual.
  3. Prosseguir normalmente com o ciclo da requisição.

Configurar estrutura de pastas

O template ASP.NET MVC 2 Web Application separa em 3 pastas os modelos, as views e os controladores. Nós precisamos fazer alguns pequenos ajustes na estrutura de pastas para termos os nossos temas separadinhos uns dos outros. Vamos ao passo a passo das mudanças:

  1. Criar uma pasta na raiz chamada Themes.
  2. Criar uma subpasta chamada Default.
  3. Mover as pastas Content, Scripts e Views para dentro de default.
  4. Editar todas as referências ao arquivo Site.Master.
    Use MasterPageFile="../Shared/Site.Master”
  5. Crie dentro da pastas temas, duas pastas uma “Black” e outra “Orange”. Copie todo o conteúdo da pasta Default em cada uma dessas pastas.
  6. Edite o arquivo background do arquivo “\Themes\Black\Content\Site.css” para algo assim: “background-color: black;”
  7. Edite o arquivo background do arquivo “\Themes\Orange\Content\Site.css” para algo assim: “background-color: orange;”

Seus arquivos devem estar parecendo com isto:

image

Identificar o tema requisitado

Precisamos identificar qual tema o usuário quer exibir, nós temos várias formas de fazer isso. Vamos a algumas sugestões:

  1. O usuário autenticado pode definir no seu perfil qual tema quer usar.
  2. Capturamos na URL uma identificação de um tema.

Para o exemplo desse artigo ser o mais simples possível, deixo em aberto a forma como você irá decidir qual tema exibir. Use o seguinte código e alterne manualmente qual tema será usado:

public class WebFormThemeViewEngine : WebFormViewEngine
{

    public WebFormThemeViewEngine()
    {

        //
        // Define os caminhos possíveis as Masterpages
        //
        base.MasterLocationFormats = new string[] {
                "~/Themes/{2}/Views/{1}/{0}.master", 
                "~/Themes/{2}/Views/Shared/{0}.master",
                "~/Themes/Default/Views/{1}/{0}.master", 
                "~/Themes/Default/Views/Shared/{0}.master"
            };


        //
        // Define os caminhos possíveis as Views
        //
        base.ViewLocationFormats = new string[] { 
                "~/Themes/{2}/Views/{1}/{0}.aspx", 
                "~/Themes/{2}/Views/{1}/{0}.ascx", 
                "~/Themes/{2}/Views/Shared/{0}.aspx", 
                "~/Themes/{2}/Views/Shared/{0}.ascx",
                "~/Themes/Default/Views/{1}/{0}.aspx", 
                "~/Themes/Default/Views/{1}/{0}.ascx", 
                "~/Themes/Default/Views/Shared/{0}.aspx", 
                "~/Themes/Default/Views/Shared/{0}.ascx"
            };

        //
        // Define os caminhos possíveis as PartialViews
        //
        base.PartialViewLocationFormats = new string[] {
                "~/Themes/{2}/Views/{1}/{0}.aspx",
                "~/Themes/{2}/Views/{1}/{0}.ascx",
                "~/Themes/{2}/Views/Shared/{0}.aspx",
                "~/Themes/{2}/Views/Shared/{0}.ascx",
                "~/Themes/Default/Views/{1}/{0}.aspx",
                "~/Themes/Default/Views/{1}/{0}.ascx",
                "~/Themes/Default/Views/Shared/{0}.aspx",
                "~/Themes/Default/Views/Shared/{0}.ascx"
            };

    }

    protected override bool FileExists(
        ControllerContext controllerContext, string virtualPath)
    {
        try
        {
            return System.IO.File.Exists(
                controllerContext.HttpContext.Server.MapPath(
                virtualPath));
        }
        catch (HttpException exception)
        {
            if (exception.GetHttpCode() != 0x194)
            {
                throw;
            }
            return false;
        }
        catch
        {
            return false;
        }
    }

    public override ViewEngineResult FindView(
        ControllerContext controllerContext,
        string viewName, string masterName, bool useCache)
    {
        string[] searchedLocationsViewPath;
        string[] searchedLocationsMasterPath;

        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }

        if (string.IsNullOrEmpty(viewName))
        {
            throw new ArgumentException("viewName must be specified.", "viewName");
        }

        string themeName = Application.GetTheme(HttpContext.Current.Request.Url.Host);

        string requiredString = controllerContext.RouteData.GetRequiredString("controller");

        string viewPath = this.GetPath(controllerContext,
            this.ViewLocationFormats, "ViewLocationFormats",
                viewName, themeName, requiredString, "View",
                useCache, out searchedLocationsViewPath);

        string masterPath = this.GetPath(controllerContext,
            this.MasterLocationFormats, "MasterLocationFormats",
                masterName, themeName, requiredString, "Master",
                useCache, out searchedLocationsMasterPath);
        try
        {

            if (!string.IsNullOrEmpty(viewPath) &&
                (!string.IsNullOrEmpty(masterPath) ||
                string.IsNullOrEmpty(masterName)))
            {
                return new ViewEngineResult(this.CreateView(controllerContext, viewPath, masterPath), this);
            }

        }
        catch (Exception)
        {
            throw new Exception(string.Format("There is an error with View '{0}' or MastePage '{1}' or Master '{2}'.",
                viewPath, masterPath, masterName));
        }

        return new ViewEngineResult(searchedLocationsViewPath.Union(searchedLocationsMasterPath));
    }

    public override ViewEngineResult FindPartialView(
        ControllerContext controllerContext,
        string partialViewName, bool useCache)
    {
        string[] searchedLocations;

        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }

        if (string.IsNullOrEmpty(partialViewName))
        {
            throw new ArgumentException("partialViewName must be specified.", "partialViewName");
        }

        string themeName = Application.GetTheme(HttpContext.Current.Request.Url.Host);

        string requiredString = controllerContext.RouteData.GetRequiredString("controller");

        string partialViewPath = this.GetPath(controllerContext,
            this.PartialViewLocationFormats,
                "PartialViewLocationFormats", partialViewName,
                themeName, requiredString, "Partial", useCache,
                out searchedLocations);

        if (string.IsNullOrEmpty(partialViewPath))
        {
            return new ViewEngineResult(searchedLocations);
        }

        return new ViewEngineResult(this.CreatePartialView(controllerContext,
            partialViewPath), this);
    }

    private string GetPath(ControllerContext controllerContext,
        string[] locations, string locationsPropertyName,
        string name, string themeName, string controllerName,
        string cacheKeyPrefix, bool useCache, out string[] searchedLocations)
    {
        searchedLocations = null;

        if (string.IsNullOrEmpty(name))
        {
            return string.Empty;
        }

        if ((locations == null) || (locations.Length == 0))
        {
            throw new InvalidOperationException("locations must not be null or emtpy.");
        }

        bool flag = IsSpecificPath(name);

        string key = this.CreateCacheKey(
            cacheKeyPrefix, name, flag ? string.Empty : controllerName, themeName);

        if (useCache)
        {

            string viewLocation = this.ViewLocationCache.GetViewLocation(controllerContext.HttpContext, key);

            if (viewLocation != null)
            {
                return viewLocation;
            }

        }

        if (!flag)
        {
            return this.GetPathFromGeneralName(controllerContext,
                locations, name, controllerName, themeName,
                key, ref searchedLocations);
        }

        return this.GetPathFromSpecificName(
            controllerContext, name, key, ref searchedLocations);
    }

    private static bool IsSpecificPath(string name)
    {
        char ch = name[0];
        if (ch != '~')
        {
            return (ch == '/');
        }
        return true;
    }

    private string CreateCacheKey(string prefix,
        string name, string controllerName, string themeName)
    {
        return string.Format(CultureInfo.InvariantCulture,
            ":ViewCacheEntry:{0}:{1}:{2}:{3}:{4}",
            new object[] { base.GetType().AssemblyQualifiedName, 
                prefix, name, controllerName, themeName });
    }

    private string GetPathFromGeneralName(ControllerContext controllerContext,
        string[] locations, string name,
        string controllerName, string themeName, string cacheKey,
        ref string[] searchedLocations)
    {
        string virtualPath = string.Empty;
        searchedLocations = new string[locations.Length];
        for (int i = 0; i < locations.Length; i++)
        {
            string str2 = string.Format(CultureInfo.InvariantCulture,
                locations[i], new object[] { name, controllerName, themeName });

            if (this.FileExists(controllerContext, str2))
            {
                searchedLocations = null;
                virtualPath = str2;
                this.ViewLocationCache.InsertViewLocation(
                    controllerContext.HttpContext, cacheKey, virtualPath);
                return virtualPath;
            }
            searchedLocations[i] = str2;
        }
        return virtualPath;
    }

    private string GetPathFromSpecificName(ControllerContext controllerContext,
        string name, string cacheKey, ref string[] searchedLocations)
    {
        string virtualPath = name;

        if (!this.FileExists(controllerContext, name))
        {
            virtualPath = string.Empty;
            searchedLocations = new string[] { name };
        }

        this.ViewLocationCache.InsertViewLocation(
            controllerContext.HttpContext, cacheKey, virtualPath);
        return virtualPath;
    }
}

Agora que temos uma ViewEngine precisamos sobrescrever o funcionamento padrão de busca por views do framework. Você precisa criar o seguinte código no Global.asax.

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    //    
    // Substituímos o ViewEngine padrão pelo nosso ViewEngine personalizado    
    //    
    System.Web.Mvc.ViewEngines.Engines.Clear();    
    System.Web.Mvc.ViewEngines.Engines.Add(new ViewEngines.WebFormThemeViewEngine());
}

Oh! Yes Baby!

image

image

image

Eu base-ei o meu código no artigo do Chris Pietschmann vale a pena dar uma lida no post dele sobre o assunto e entender mais alguns detalhes dessa implementação tão simples de temas em MVC.

Download

Quer ver o aplicativo funcionando? Baixe a solução.

Escrevam suas dúvidas e sugestões nos comentários.