quinta-feira, 24 de junho de 2010

Transmissão do Profissão Java via internet

Informamos que a Globalcode estará transmitindo via internet,
em tempo real, as palestras programadas na grade do evento
Profissão Java. Todavia, tendo em vista tratar-se de uma
operação beta, não recomendamos que se proceda ao cancelamento
da inscrição presencial; os testes finais serão realizados às
vésperas do evento e não há garantia de que o processo
transcorrerá com o êxito almejado.

Além disso, o Profissão Java proporcionará outros atrativos
importantes para o público presente, tais como, área de
expositores, oportunidade de interagir pessoalmente com os
palestrantes, bem como, travar novos relacionamentos e obter
contatos profissionais.

O objetivo principal desta iniciativa é atender, o quanto
possível, ao público que não poderá comparecer ao evento, por
estarem situados em localidades muito distantes, ou então, por
motivos outros, alheios ao desejo de estarem presentes.

Para fazer sua inscrição para o evento presencial em lista de espera
ou para a opção via internet, acesse o site do evento:
www.profissaojava.com.br

Agradecemos o interesse de todos e desejamos um bom evento!

Equipe Globalcode
www.globalcode.com.br
twitter.com/globalcode
twitter.com/open4education

Ação Solidária no Profissão Java

Meu último post sobre o Profissão Java falei sobre como colaborar com o evento, divulgação e algumas oportunidades corporativas.  Desde então tivemos muitos resultados de sucesso e gostaria de compartilhar com vocês, pois, provavelmente você tem alguma coisa a ver com isto. (Risos).

Finalização da grade
Uma lista de palestrantes incrível, e extremamente multidisciplinar representando várias empresas e tecnologias que irão compartilhar o que tem de mais precioso:  a experiência e visão do mercado e das oportunidades.
A grade ficou extremamente dinâmica e enriquecedora.
Mais informações

Divulgação
Muito apoio na divulgação no twitter, blogs e sites, além da recentemente publicação no site da Info.
Nossos sinceros agradecimentos a todos que foram Open4Education e colaboraram com a divulgação deste evento.
No twitter: #ProfissaoJava

Participação Corporativa
A segunda edição do Profissão Java conta com o apoio de diversas empresas. Então, colabore com elas também, clique e saiba mais sobre elas.


Sucesso de Inscrições
Eventos gratuitos tem uma complexidade muito grande principalmente devido ao no-show, pessoas que fazem a inscrição e não comparecem. Este ano recebemos mais de 900 inscrições. Um verdadeiro sucesso!

Ação Solidária

Mesmo com tantos motivos para comemorar em relação a organização do evento Profissão Java, vendo a tragédia da pequena cidade de Branquinha no Alagoas, senti que faltava alguma coisa importante.
Não faz sentido reunir mais de 500 profissionais para discutir o sucesso dos profissionais de TI sem realizarmos uma ação solidária para um estado que está sofrendo catástrofes naturais desta grandeza. O Alagoas precisa do nosso apoio.

É uma emergência, solidariedade é fundamental para o progresso do nosso país.

Seria um desperdício não aproveitar este evento para arrecadação de itens de higiene a  alimentos não perecíveis para minimizar os impactos causados pela destruição da cidade pelas chuvas.

Desta forma, solicitamos a todos os participantes do evento gratuito ProfissãoJava que colaborem com a Ação Solidária em favor da cidade de Branquinha / Alagoas destruída pela chuva.

Arrecadação durante o evento #ProfissãoJava dia 26/junho das 8:30 as 19:00 na Universidade Anhembi Morumbi - Campus Vila Olympia.


Itens de Higiene (alguns exemplos):
  • Sabonete, shampoo
  • Pasta de dente, escova de dente
  • Papel Higiênico

Alimentos não perecíveis (exemplos):
  • Leite em pó e outros enlatados
  • Macarrão
  • Arroz, Feijão
    Outras formas de colaboração?
    O envio das doações para o Alagoas é um dos maiores desafios e estamos em busca de apoio para levar os itens arrecadados até a Defesa Civil, se você pode colaborar levando os itens para um dos pontos de doação, sua colaboração também será bem vinda.

    Agradecemos especialmente aos professores da Anhembi Morumbi Campus Vila Olympia :Luciano Freire e Fabiano Marques pelo constante apoio, especialmente nesta nova iniciativa de arrecadação.

    Um abraço,

    Yara
    http://twitter.com/yarasenger
    http://blog.globalcode.com.br/search/label/Yara
    http://www.globalcode.com.br/instrutores/YaraSenger

    quarta-feira, 16 de junho de 2010

    Appengine e os períodos de manutenção

    Uma das funcionalidades do Google AppEngine(GAE) que eu acho mais fantásticas -principalmente para nós desenvolvedores-, é a possibilidade de deixar sua aplicação preparada para momentos em que haverá alguma manutenção nos servidores do GAE ou mesmo uma 'queda' inesperada de um serviço. Isso fizemos também no site da YaW.

    Qualquer serviço web, por mais que esteja disponível 24/7/365 em algum momento deverá sofrer uma paralisação seja por uma manutenção, atualização ou qualquer problema imprevisto.

    Com o GAE não é diferente, a grande vantagem é que o próprio ambiente lhe avisa destes momentos, sendo que você pode deixar sua aplicação já pronta para continuar funcionando(mesmo que não 100%) durante estes períodos.

    A camada de persistência(Datastore) por exemplo, em períodos de manutenção, entra em um estado especial em que somente é possível realizar leituras na base(read-only), nenhuma modificação ou alteração na base é permitida. Nestes períodos, se a aplicação realizar alguma escrita ou modificação, o próprio servidor do GAE lhe lançará uma exception informando da impossibilidade de escritas e modificação, lhe dando a possibilidade de ao invés de ficar com toda a sua aplicação fora do ar, você pode capturar esta exceção e informar ao usuário que determinada operação não foi possível no momento e que tente novamente mais tarde(ou qualquer coisa do tipo...).
    Caso você esteja utilizando JPA, este seria algo parecido com o seu código de tratamento:
    EntityManager em = EntityManagerFactory.createEntityManager();
    try {
    em
    .persist(entidade);
    em
    .close();
    } catch (com.google.apphosting.api.ApiProxy.CapabilityDisabledException e) {
    // Esta exceção informa que o Datastore está em modo read-only.
    // Tente novamente mais tarde.
    }

    Simples e indolor, não?

    Outra API que possibilita tratar períodos críticos do GAE é a API de cache. Durante períodos de manutenção ela também é desabilitada e entra em um estado de 'somente leitura'. Porém a principal diferença para o Datastore nestes períodos, é que isso acontece de forma transparente para sua aplicação, impactando talvez somente na performance, pois toda vez que você tentar gravar uma informação em cache neste período, a escrita é ignorada, e toda leitura lhe retorna uma referência nula, como se o cache não encontrasse nenhuma entrada para sua busca.
    De qualquer forma, se você quiser saber mesmo assim quando o cache está fora de serviço, é possível com o seguinte código:
    MemcacheService ms = MemcacheServiceFactory.getMemcacheService();
    ms
    .setErrorHandler(new StrictErrorHandler());

    try {
    ms
    .put(key, value);
    } catch (com.google.appengine.api.memcache.MemcacheServiceException e) {
    // Caso capturou esta exception, é sinal que o Memcache está fora
    }

    Um detalhe muito importante sobre estes períodos é também sobre a sessão web. Internamente as sessões no GAE são gerenciadas pelo Memcache e pelo Datastore, logo, as sessões também estão em modo read-only durante estes períodos. Ou seja, mais um detalhe a se levar em consideração durante o design de sua aplicação no GAE.

    http://twitter.com/rafanunes
    http://twitter.om/youandwe
    http://www.yaw.com.br

    terça-feira, 15 de junho de 2010

    Divulgação Bate Papo Sobre ANDROID

    Pessoal,

    Teremos um novo bate papo do SP-GTUG, aberto e gratuito, acerca de mais uma tecnologia do Google: o Android. Este será o quinto bate papo do SP-GTUG.

    Local e data

    O bate papo acontecerá no dia 30/06/10, das 19:00 às 22:00 na Globalcode. Para fazer sua inscrição e participar acesse a home da Globalcode e vá até a parte de "Minicursos Gratuitos da Semana" (ou acesse esse link para ir direto a página de inscrição).

    Conteúdo da apresentação

    O tema abordado será o Android, primeiramente o Ricardo Martinelli(@rimolive) falando sobre o Android e após isso Éder Magalhães (@edermag) mostrando como configurar o ambiente do ZERO e mostrará alguns exemplos.

    Portanto...

    Se você participou (ou não) dos Bate Papos anteriores, não perca tempo e faça sua inscrição agora!
    Apareça para dar idéias, opiniões, conhecer gente nova e fazer networking na quarta-feira.

    Até lá!

    Paulo Fernandes
    paulofernandesjr@gmail.com
    @paulofernandesj
    @sp_gtug

    sexta-feira, 11 de junho de 2010

    Um pouco sobre a arquitetura do ScrumToys


    O ScrumToys é um projeto que nasceu com o propósito de demonstrar o maior número possível de funcionalidades do JSF 2.0. Contudo, o ScrumToys vai alem e realiza alguns desafios que foram encontrados durante o seu refactoring para ser incorporado à versão final do NetBeans 6.8.

    A primeira versão!


    A primeira versão do ScrumToys foi desenvolvida aplicando efetivamente o padrão de projeto MVC. Através deste padrão, a camada view foi implementada com os componentes visuais do JSF, a camada controller foi implementada através de Managed Beans configurados via anotações e a camada model se distribuía em classes JavaBeans para realizar alguns componentes de negócios, entidades persistentes (JPA) e persistência através de Data Access Objects (DAOs). Estas várias camadas realizavam o ScrumToys para rodar no JBossAS 4.2.3 com banco de dados baseado no MySQL Database Server 5.0. Além disso, o projeto foi criado inicialmente através do Eclipse.

    O refactoring!


    Para simplificar ao máximo esta aplicação de demonstração, esta passou por um refactoring completo na camada model, além de uma revisão detalhada da camada de apresentação (view e controller). Neste refactoring, foi necessário tomar algumas decisões em prol da simplicidade que deixariam qualquer desenvolvedor purista de cabelos em pé. Algumas destas decisões envolveram:
    • Migrar o projeto do Eclipse para o NetBeans (inicialmente o NetBeans 6.7.1);
    • Alterar e eliminar possíveis configurações da aplicação Web para rodar no Glassfish sem a necessidade de configurações extras (tornando-o plug'n play);
    • Usar o banco de dados JavaDB (antigo Derby) que já vem integrado numa instalação padrão do NetBeans e do Glassfish. Isso eliminaria a necessidade de instalar um MySQL, criar um usuário e um esquema no banco;
    • Simplificar a configuração do JPA para usar o TopLink ou Eclipse Essentials, além de criar o banco de dados automaticamente no esquema padrão que já existe no JavaDB do NetBeans. Notamos que o Glassfish v2 (ainda Java EE 5) usa o TopLink como implementação de JPA 1.0 e o Glassfish v3 (que já é Java EE 6 e está embutido no NetBeans 6.8) usa o Eclipse Essentials, como implementação de JPA 2.0 (código aberto e doado do TopLink pela Oracle para o Eclipse.org, considerada a implementação de referência do JPA).
    • E agora a decisão de projeto mais radical e ofensiva para alguns desenvolvedores: simplificar a camada model ao eliminar componentes de negócios e todos os Data Access Object. Assim, a lógica necessária para persistência e manipulação das entidades de negócios seriam implementadas na camada controller (dentro dos Managed Beans).
    A última decisão de projeto, levou a uma arquitetura muito mais simples em detrimento da organização comumente recomendada para as camadas de uma aplicação web robusta e escalonável. Mas, esta arquitetura permitiu evitar o uso de Enterprise JavaBeans para o gerenciamento do contexto de persistência e demarcação de transação com recursos do EJB Container. Aspecto que fugiria do escopo do projeto e do propósito inicial da demonstração implementada. Contudo, mesmo ao eliminar os DAOs, a aplicação ainda precisaria ter acesso ao contexto de persistência (JPA) e realizar a demarcação da transação (neste caso, demarcação programática) dentro dos Managed Beans.

    Uma nova arquitetura!


    A segunda versão da aplicação, após o refactoring, passou a oferecer uma arquitetura simples através de classes que realizam simplesmente o propósito de demonstrar o maior número possível de funcionalidades do JSF 2.0, sem desviar a atenção para outras tecnologias que constituem o Java EE 6.

    Como parte do processo de simplificação da arquitetura e para atender a necessidade de gerenciar um contexto de persistência e demarcação dentro dos Managed Beans da camada controller, a seguinte classe abstrata foi implementada para servir de base para todos os Managed Beans implemenatados.
    package jsf2.demo.scrum.web.controller;

    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.PersistenceUnit;
    import javax.persistence.EntityManagerFactory;
    import javax.transaction.UserTransaction;
    // Outros imports foram omitidos ...

    /**
    * @author Dr. Spock (spock at dev.java.net)
    */
    public abstract class AbstractManager {

    @PersistenceUnit
    private EntityManagerFactory emf;
    @Resource
    private UserTransaction userTransaction;

    protected final <T> T doInTransaction(PersistenceAction<T> action)
    throws ManagerException {
    EntityManager em = emf.createEntityManager();
    try {
    userTransaction.begin();
    T result = action.execute(em);
    userTransaction.commit();
    return result;
    } catch (Exception e) {
    try {
    userTransaction.rollback();
    } catch (Exception ex) {
    Logger.getLogger(AbstractManager.class.getName()).log(Level.SEVERE,
    null, ex);
    }
    throw new ManagerException(e);
    } finally {
    em.close();
    }
    }

    protected final void doInTransaction(PersistenceActionWithoutResult action)
    throws ManagerException {
    EntityManager em = emf.createEntityManager();
    try {
    userTransaction.begin();
    action.execute(em);
    userTransaction.commit();
    } catch (Exception e) {
    try {
    userTransaction.rollback();
    } catch (Exception ex) {
    Logger.getLogger(AbstractManager.class.getName()).log(Level.SEVERE,
    null, ex);
    }
    throw new ManagerException(e);
    } finally {
    em.close();
    }
    }

    protected static interface PersistenceAction<T> {
    T execute(EntityManager em);
    }

    protected static interface PersistenceActionWithoutResult {
    void execute(EntityManager em);
    }

    // Alguns outros métodos foram omitidos

    }
    Esta classe aplica os padrões de projeto Template Method e Strategy ao disponibilizar o método doInTransaction() que demarca a transação via JTA e permite receber o algoritmo de persistência através de uma implementação de callback ao realizar a "inner" interface PersistenceAction ou PersistenceActionWithoutResult. Esta implementação foi inspirada em classes presentes na arquitetura do Spring Framework chamadas de Template que encapsulam códigos padrões.

    Como os Managed Beans são componentes gerenciados e deverão herdar o código base apresentado acima, o Web Container Java EE 6 realizará a injeção de dependência ao fornecer referências válidas de objetos aos atributos dos tipos EntityManagerFactory e UserTransaction.

    O diagrama a seguir ilustra a estrutura básica dos Managed Beans implementados no ScrumToys usando a classe abstrata acima como base.


    O Managed Bean ProjectManager herdará a capacidade de persistência e já terá uma demarcação simples de transação através dos métodos Template doInTransaction(). A seguir está um fragmento de código deste controller.
    package jsf2.demo.scrum.web.controller;

    import jsf2.demo.scrum.model.entities.Project;

    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    // Outros imports foram omitidos

    /**
    * @author Dr. Spock (spock at dev.java.net)
    */
    @ManagedBean(name = "projectManager")
    @SessionScoped
    public class ProjectManager extends AbstractManager
    implements Serializable {

    private static final long serialVersionUID = 1L;
    private Project currentProject;
    private DataModel<Project> projects;
    private List<SelectItem> projectItems;
    private List<Project> projectList;

    @PostConstruct
    public void construct() {
    this.currentProject = new Project();
    init();
    }

    // ...

    public void init() {
    try {
    setProjectList(doInTransaction(new PersistenceAction<List<Project>>() {
    public List<Project> execute(EntityManager em) {
    Query query = em.createNamedQuery("project.getAll");
    return (List<Project>) query.getResultList();
    }
    }));
    } catch (ManagerException ex) {
    Logger.getLogger(ProjectManager.class.getName()).log(Level.SEVERE,null,ex);
    }
    projectItems = new LinkedList<SelectItem>();
    projectItems.add(new SelectItem(new Project(), "-- Select one project --"));
    if (getProjectList() != null) {
    projects = new ListDataModel<Project>(getProjectList());
    for (Project p : getProjectList()) {
    projectItems.add(new SelectItem(p, p.getName()));
    }
    }
    }

    // ...

    public String remove() {
    final Project project = projects.getRowData();
    if (project != null) {
    try {
    doInTransaction(new PersistenceActionWithoutResult() {
    public void execute(EntityManager em) {
    if (em.contains(project)) {
    em.remove(project);
    } else {
    em.remove(em.merge(project));
    }
    }
    });
    getProjectList().remove(project);
    } catch (Exception e) {
    Logger.getLogger(getClass()).log(Level.SEVERE,
    "Error on try to remove Project: " + getCurrentProject(), e);
    addMessage("Error on try to remove Project", FacesMessage.SEVERITY_ERROR);
    return null;
    }
    }
    init();
    // Using implicity navigation, this request come from /projects/show.xhtml
    // and directs to /project/show.xhtml could be null instead
    return "show";
    }

    // Alguns métodos foram omitidos.

    }
    Veja, no código acima, as linhas 33 a 38 que aplica o uso do Template Method doInTransaction() e do callback do tipo PersistenceAction para recuperar da base de dados todas as instancias persistidas de projetos. Este trecho de código herda o gerenciamento do EntityManager (abri e fechar) e a demarcação de transação (begin/commit/rollback). Outro exemplo se encontra entre as linhas 58 e 66, ao usar o callback do tipo PersistenceActionWithoutResult.

    A simplicidade tornando-se referência!


    A arquitetura proposta no ScrumToys influenciou a implementação de alguns códigos dos exemplos contidos no livro JavaServer Faces 2.0, The Complete Reference escrito pelo Ed Burns, líder da especificação do JSF 2.0 no JCP, e pelo Chris Schalk, Developer Advocate no Google. Algumas páginas deste livro estão disponívels no Google Books:

    JavaServer Faces 2.0, The Complete Reference


    Segue abaixo uma página deste livro citando a arquitetura de persistência e gerenciamento de transação implementada na aplicação Virtual Trainer.


    Luz, câmera, AÇÃO!


    O vídeo a seguir ilustra a criação de um projeto no NetBeans 6.8 para ter acesso aos códigos do ScrumToys e avaliar a implementação da arquitetura proposta em ação.


    Para mais informações sobre este projeto:
    By Spock
    http://blog.spock.com.br/
    http://twitter.spock.com.br/
    http://www.springbrasil.com.br/
    Outros posts: http://blog.globalcode.com.br/search/label/Spock

    Especial dia dos namorados na Globalcode

    Esta semana está cheia de motivos para festejar: início da copa + dia dos namorados.

    Você provavelmente já viu a Promoção da Copa na Globalcode, onde todos os alunos que fizerem a matrícula nos Hands-on, Cursos e Carreiras Globalcode* entre 2 e 15 de junho ganham uma camiseta linda da Copa África do Sul 2010.

    Mas, uma data tão especial como Dia dos Namorados não poderia ser esquecida... então, fazendo sua matrícula* no final de semana dos namorados, além da camiseta da Copa você ganha também um presente especial Kopenhagen.
    * Válido para as Unidades São Paulo e Campinas

    Não sabe o que fazer no dia dos namorados ? Está sem ideias para presente ?
    Vem pra Globalcode, faça sua matrícula e ganhe uma camiseta da copa + presente Kopenhagen!

    Detalhe: não está namorando ? Então você vai ganhar dois presentes no dia dos namorados!

    É isso ai, feliz 12 de junho para os solteiros(as), para os namorados(as) e também para os casados(as)... e boa sorte para o Brasil na Copa!

    Yara
    http://twitter.com/yarasenger

    quarta-feira, 9 de junho de 2010

    Café da manhã com as empresas e universidades conveniadas

    A estratégia de crescimento da Globalcode sempre foi coletiva, colaborativa e participativa. Quanto mais os parceiros, instrutores e alunos crescerem mais nós cresceremos.
    Todos Juntos - Os Saltimbancos
    Todos juntos somos fortes
    Somos flecha e somos arco
    Todos nós no mesmo barco
    Não há nada pra temer
    Ao meu lado há um amigo
    Que é preciso proteger
    Todos juntos somos fortes
    Não há nada pra temer
    Atualmente são 12 unidades Globalcode em diversas regiões do Brasil, e queremos ampliar ainda mais em 2010. Com o crescimento, a profissionalização e formalização de diversas ações e parcerias têm sido fundamentais.

    A Globalcode manteve um convênio informal com quase uma centena de empresas por um longo período, e recentemente iniciamos um processo de formalização do convênio com empresas e universidades.

    Conheça mais detalhes e benefícios dos convênios educacionais oferecidos :
    Nesta sexta-feira será oferecido para todas as empresas e universidades conveniadas um café da manhã onde serão apresentadas informações relevantes para os parceiros, como o calendário de eventos da Globalcode, oportunidades de descontos exclusivos para colaboradores das instituições, novos treinamentos e muitas mais.

    Estarão presentes neste encontro:
    • Waldir Hadad, diretor comercial
    • Leandro Viu, gerente de alianças
    • Vinicius Senger, diretor técnico
    Quer saber mais sobre o convênio ? Entre em contato e participe deste encontro.

    Atenciosamente,

    Yara M. H. Senger
    Diretora Educacional
    http://twitter.com/yarasenger
    http://blog.globalcode.com.br/search/label/Yara

    sábado, 5 de junho de 2010

    Ruby, Ruby on Rails e Python: a Globalcode cada dia mais Open4Education

    No último Boletim Globalcode foram lançados dois novos minicursos da iniciativa Open4Education criados em parceria com os instrutores e empreendedores Felipe Rodrigues da Fratech e Rafael Nunes da You and We (YAW).


    Transmissão via Web

    Os minicursos serão realizados na Globalcode Unidade São Paulo e transmitidos via webcast para todo Brasil. Assim como todos os outros minicursos da iniciativa Open4Education o objetivo é compartilhar conhecimento e experiência, que os autores tem de sobra.

    Este minicurso é interessante tanto para as pessoas que estão inciando no desenvolvimento Web tanto quanto para as pessoas que já tem um certo nível de conforto no desenvolvimento na plataforma Java, e estão prontos para novos desafios.

    Durante o minicurso de Ruby on Rails o empreendedor Felipe Rodrigues vai compartilhar a sua experiência com Agile e Ruby on Rails em diversos projetos internacionais já concluídos.

    O minicurso de Python e Django irá abordar o desenvolvimento e implantação nas núvens (Cloud Computing), mais especificamente no Google App Engine (GAE) aproveitando a experiência do Rafael Nunes que foi o autor do minicurso Introdução a Google App Engine e do curso Hands-on de Google App Engine.

    A iniciativa Open4Education possui mais de 70 temas diferentes de minicursos que já foram ministrados mais de 500 vezes para mais de 26.000 pessoas.

    Participe, colabore, divulgue. Seja Open4Education você também!

    Yara
    http://twitter.com/yarasenger
    http://www.globalcode.com.br/instrutores/YaraSenger

    quarta-feira, 2 de junho de 2010

    Globalcode na SESTINFO 2010 - Universidade Metodista

    Nos dias 25, 26 e 27 de Maio aconteceu a SESTINFO 2010, a Semana de Estudos em Tecnologia da Informação organizado pela Universidade Metodista em SBC. O Ojbetivo do evento é aproximar os alunos, que participam de cursos de Tecnologia, com o que esta acontecendo no mercado.

    Eu e Rafael Nunes estivemos por lá, representando a Globacode / YaW, em todos os dias apresentando palestras e minicursos. A nossa proposta foi demostrar algumas tecnologias com o qual estamos envolvido em pesquisa e consultoria na YaW, e motivar a galera a pesquisar e estudar um pouco mais sobre esses assuntos.

    No início da palestra JavaFX e Blu-ray um overview, comentei sobre o objetivo do Java na sua concepção, a mais de 15 anos, e demonstrei alguns números e meu ponto de vista sobre o investimento em aprender Java. Partindo para JavaFX comentei um pouco sobre a Plataforma e a Linguagem, demonstrei 2 exemplos de aplicativo com efeitos visuais interessantes (inspirado em exemplos no ótimo site fxexperience), sites e blogs com exemplos, e encerrei o bate-papo apresentando a praticidade do NetBeans 6.9 (Beta) com o JavaFX Composer.



    O smartphone antes e depois do iPhone. "Redes sociais, games, trabalho, diversão, ..." são vários os motivos e as necessidades que fazem com que as pessoas, dia após dia, fiquem mais conectadas tanto faz o lugar como a hora. Pensar nesse cenário com a chegada do Android, foi o foco da palestra: Android, um novo nicho de mercado. Além disso, apresentei um pouco da plataforma Android e como desenvolver aplicativos, terminei a implementação de um app para o sorteio de brindes na palestra.



    Encerrei minha participação na SESTINFO 2010 com a palestra JSF2 ScrumToys. "Existem vários frameworks para desenvolvimento Java na Web, todos com prós e contras..." minha proposta foi apresentar em quais situações o JSF, versão 2.0, é uma ótima alternativa. Além disso contei para os alunos sobre a iniciativa open source do projeto ScrumToys, criado e manido pela comunidade #Globalcoders, para demonstração do JSF no Netbeans e Glassfish. Demonstrie como baixar o Netbeans 6.8, criar o projeto ScrumToys, com 10 funcionalidades do JSF dentro do projeto.



    O Rafael apresentou dois minicursos, no primeiro falou sobre empreendedorismo com Java e Google AppEngine. A proposta foi apresentar as possibilidades que temos com o crescimento do AppEngine e também do Google Market place, principalmente pela possibilidade de usar  a plataforma Java para desenvolvimento. Pois ao mesmo tempo que
    podem se preparar par o mercado aprendendo Java e ter um sem número de campos de trabalho, ainda podem utilizar o mesmo conhecimento para criar suas próprias aplicações hospedando-as no AppEngine.  Os alunos se empolgaram bastante com a idéia e já planejavam quais tipos de aplicações iriam criar.

    O segundo minicurso foi sobre desenvolvimento web com Python e Django. Com o enorme crescimento de aplicações SaaS(Software as a Service) e precisando cada vez mais simplicidade, ou em alguns casos podendo-se abrir mão de infra-estruturas mais robustas, foi apresentado aos alunos uma forma de desenvolvimento rápida, simples e ao mesmo tempo poderosa com a linguagem Python(e toda sua flexibilidade) em conjunto com o framework de desenvolvimento web Django. E levavam com o pacote, a possibilidade de rodar esta mesma estrutura utilizando o Google AppEngine.



    Nosso feedback foi muito positivo, vários alunos demonstraram interesse pelos assuntos abordados, realmente muito interessante!
    Apoiamos esse tipo de iniciativa, se sua Faculdade/Universidade tem algum movimento parecido com esse entre em contato será um prazer participar.


    []'s
    Eder Magalhães
    www.yaw.com.br
    twitter.com/youandwe
    twitter.com/edermag

    terça-feira, 1 de junho de 2010

    Coloque um widget para Twitter no seu site

    A semana passada eu coloquei numa página do site da Globalcode uma daquelas janelinhas que mostram updates do Twitter.

    Procurei no Google e encontrei vários, porém descobri no próprio Twitter uma solução bem simples: Twitter Widgets

    Tem 4 tipos diferentes:
    • Profile Widget - mostra os últimos tweets de um usuário
    • Search Widget - mostra os tweets que contenham um determinado termo (palavra, hashtag, etc)
    • Faves Widget - mostra os tweets favoritos de um usuário
    • List Widget - mostra os últimos tweets das pessoas de uma lista de um usuário
    Todos estes widgets permitem customização de cores, fonte e tamanho da janela, além de podermos optar também se vai aparecer data e hora do tweet e o nome e avatar do usuário. Outra coisa que também é configurável é se vai ficar rolando os tweets em um intervalo de tempo e se vai ter barra de rolagem vertical.

    Como a página que eu ia incluir o widget é a da Open4Education e eu queria mostrar tweets que tivessem a hashtag #open4education, então eu usei o Search Widget.











    Depois de escolher e configurar o seu widget é só clicar no botão "Test settings" para ver como ficou lá mesmo na página do widget.

    E quando estiver satisfeito com o resultado é só clicar no botão "Finish & Grab code" que vai aparecer uma tela com uma área de texto com o código que você deve copiar e colar na sua página ou blog.











    Eis o código do script gerado:



    E é só isso, bem simples mesmo, não acha?

    Veja também outros posts relacionados a Twitter:
    Twitter : Porque, Como, Quem ?
    Postar no Twitter com programa escrito em Java

    []s

    Ana Abrantes
    twitter.com/anabrant
    www.globalcode.com.br

    Aprendendo a programar: procedimentos e funções

    Retomando aquela introdução ao desenvolvimento de programas de computador (veja os dois posts listados a seguir), hoje vou falar um pouquinho sobre a criação de procedimentos e funções, que são recursos muito importantes para a modularização do código dos programas.

    Para quem não leu os posts anteriores, vale a pena dar uma olhada antes de seguir na leitura deste post:

    Resumindo o que foi falado nos posts anteriores, podemos dizer que um programa de computador nada mais é do que um conjunto de instruções, logicamente organizadas e escritas usando a sintaxe de uma linguagem de programação em particular, cujo propósito é ser executado sobre o sistema operacional com o objetivo de resolver problemas de forma automatizada pelo computador.

    Dentre as instruções utilizadas na lógica do programa, podemos fazer desde a simples declaração de variáveis e atribuições de valores, até a resolução de expressões matemáticas, entrada e saída de dados e a definição de estruturas mais complexas, por exemplo usando recursos de condições e laços e, também, recursos específicos da linguagem de programação utilizada.

    Independente das instruções utilizadas, a forma como organizamos o código do nosso programa é importante para aumentarmos as possibilidades de reuso e reduzirmos as complexidades de manutenção. Para isso podemos usar a técnica de modularização.

    Modularizar significa quebrar em módulos, o que em termos mais técnicos , quer dizer criar procedimentos e funções.

    Procedimentos e funções

    Um aspecto muito comum nos programas é que frequentemente escrevemos trechos de código (várias instruções) que se repetem ao longo da lógica que estabelecemos.

    Por exemplo, se quisermos calcular a média aritmética das provas de um aluno, temos que somar a nota da primeira prova com a nota da segunda prova e dividir por 2. Se tivermos mais de um aluno, temos que repetir esse cálculo para cada aluno. Logicamente, a forma mais simples de fazer isso é fazendo o famoso "copy and paste": para cada aluno, colocamos a regra para fazer o cálculo e impressão da média das notas.

    Com o "copy and paste" conseguimos resolver o problema da repetição, mas será que foi a melhor escolha? E se tivermos 100 alunos? E se após termos escrito o programa todo, alguém nos disser que eram 3 provas? Em ambos os casos teremos um bom trabalho para ajustar o o código do programa.

    Diante disso, podemos afirmar que a repetição de trechos de código dentro de um programa é considerada uma prática muito ruim. Mas será que é possível fazer diferente? A resposta é a criação de procedimentos e funções.

    As instruções que precisam ser repetidas em vários locais do código devem ser isoladas em um bloco de código do programa que recebe um nome (cada linguagem estabelece a forma para delimitar esse bloco). Quando precisarmos executar aquelas instruções repetidas vezes, basta invocar o nome do bloco de código que as contém. A esse bloco de código é que chamamos de procedimentos ou funções (diferenciaremos os dois termos mais adiante).

    Um programa pode ser constituído de vários procedimentos e funções e um bloco de código principal, chamado geralmente de programa principal ou bloco principal.

    Ao isolarmos a regra que será repetida, escrevemos-a uma única vez dentro do procedimento ou função. E podemos chamá-la quantas vezes for necessário, tanto dentro do programa principal, quanto dentro de outros procedimentos e funções. Se errarmos na regra, ou se ela mudar com o tempo, basta fazer o ajuste no único local do código onde ela existe: dentro do procedimento ou função.

    Veja o exemplo a seguir para visualizar como seria um procedimento em algoritmo estruturado.


    Passagem de parâmetros


    Um procedimento ou função pode receber parâmetros que carregam os dados que devem ser manipulados pelas suas instruções internas. Um parâmetro é uma variável definida no corpo do procedimento ou função que recebe um valor apenas quando o bloco é chamado.

    Para tornar o exemplo da figura anterior mais interessante, podemos declarar variáveis no corpo do programa principal e passar o valor dessas variáveis para dentro do procedimento por meio de parâmetros. Veja a figura a seguir.



    Repare que agora, o procedimento define 2 parâmetros: n1 e n2. Tais parâmetros recebem valores quando são chamados no programa principal. As variáveis nota1 e nota2 são usadas nas duas primeiras chamadas ao procedimento: o valor de nota1 é copiado para n1 e o valor de nota2 é copiado para n2. A regra programada dentro do procedimento é então executada com base nos valores dos parâmetros n1 e n2. A terceira chamada ao procedimento ilustra que também podemos passar valores para os parâmetros diretamente.

    Procedimentos x funções

    A diferença entre procedimentos e funções é unicamente no retorno do bloco de código: funções retornam valores após a execução da sua lista de instruções, procedimentos não.

    Para facilitar o entendimento, vamos ver o exemplo a seguir.


    Agora criamos uma função que calcula a média das notas com base nos parâmetros recebidos, e devolve o valor da média ao invés de fazer a impressão. A função deve ser definida usando o tipo de retorno que ela irá fornecer (no caso do exemplo, valor de tipo real) além dos parâmetros que são opcionais. Dentro do bloco da função, devemos usar uma instrução que indique o valor que será retornado (nas linguagens geralmente a palavra é return para retornar um valor). No algoritmo, a representação usada é de que o nome da função recebe um valor... isso quer dizer que quando chamarmos essa função podemos atribuí-la a uma variável de tipo real, pois ela irá conter um valor de resposta.

    Linguagens orientadas a objetos

    Nas linguagens que seguem o paradigma da orientação a objetos, não há diferenciação entre procedimentos e funções. Todos os blocos de código são chamados de métodos, inclusive o programa principal, que é o método principal (geralmente nomeado com a palavra main).

    Conclusões

    Considerando minha experiência de alguns anos ministrando treinamentos da Globalcode, e em especial a Academia Java, eu posso dizer que o pré-requisito fundamental para uma pessoa ingressar no desenvolvimento com uma linguagem de programação orientada a objetos, como é o caso de Java, é ter todos os conceitos que citei nesses três posts sobre programação muito bem fundamentados.

    É necessário entender perfeitamente como funcionam os programas: código-fonte, linguagem de programação, compilação e execução. É preciso saber usar os vários tipos de instruções que um programa pode conter, incluindo principalmente instruções de uso de variáveis, condições e laços. E para organizar e facilitar a escrita de código, é preciso entender como funcionam os procedimentos, funções, passagens de parâmetros e retornos de função. Obviamente que isso não é tudo, mas para quem pensa em começar a estudar Java, por exemplo, é necessário começar por essa parte mais básica de lógica de programação.

    Deixo novamente a dica de que esses e vários outros assuntos fundamentais para o iniciante em programação podem ser encontrados no treinamento Academia do Programador de forma bem mais aprofundada. Se tiver interesse, entre em contato com a Globalcode para tirar suas dúvidas.

    Além disso, a Globalcode também tem minicursos gratuitos voltados para iniciantes como o MC59 - Aprendendo a programar de forma divertida e eficiente além de vários outros minicursos que variam de assuntos básicos a avançados. Vale a pena conferir a grade disponível.


    Até a próxima.

    Elaine Quintino Silva
    http://www.globalcode.com.br/instrutores/ElaineSilva
    http://twitter.com/elaineqsilva