18/07/14

Dart no Google Cloud Platform

Atualmente você já pode rodar códigos escritos em Dart no Google Compute Engine e, no Google I/O deste ano foi demonstrado que você pode rodar Dart no Google AppEngine.

Isso é possível quando criamos um runtime personalizado no Google App Engine que roda em um Managed VM que estão disponívels como Limited Preview. Mais sobre eles você pode achar na documentação do Google Cloud Platform Managed VMs.

Caso você queira participar de discussões sobre como rodar Dart em um servidor, se manter informado com notícias e anúncios e muito mais, você pode se inscrever na lista de discussões cloud@dartlang.org, e também acompanhar nosso canal no Google Plus, Desenvolvedores Google.

Veja mais no vídeo abaixo (inglês):


Let's Hack!

02/07/14

Participe do Startup Launch Summit no Google Brasil

Durante o Google I/O a equipe de relações com desenvolvedores do Google anunciou um novo programa orientado para startups de tecnologia, chamado Startup Launch. Estamos trazendo ao Brasil o primeiro evento do programa Startup Launch no mundo! Ele será realizado no escritório do Google em São Paulo.


StartupLaunchLogo.png

Teremos diversos mentores internacionais e nacionais (veja no final do artigo as mini-bios dos palestrantes), do Google e também de diversas startups de Israel, oferecendo palestras sobre empreendedorismo digital, negócios e tecnologias Google aplicadas a startups de tecnologia. Você, empreendedor digital e/ou desenvolvedor terá palestras sobre User Experience, como construir um produto mínimo viável (Minimum Viable Product), desenvolvimento para web, mobile e Cloud, entre outras. Não teremos tradução simultânea, então recomendamos que você se inscreva caso entenda inglês e possa estar presente durante o dia todo.


O evento será de um dia inteiro, no dia 25 de julho. Veja a agenda no final do artigo para maiores detalhes. Para participar do evento, você deve se inscrever entre os dias 3 e 17 de julho por meio do formulário. O inscrito precisa ter perfil técnico e/ou de negócios. Os participantes serão escolhidos por sorteio e serão avisados a partir do dia 21 de julho.


Para obter mais detalhes sobre esse evento e todas as outras atividades relacionadas a comunidades de desenvolvedores e de startups pelo Brasil, acompanhe a página Desenvolvedores Google no Google+. Boa conferência!


Agenda do Google Startup Launch Summit


Horário
Sessão
Palestrante
08:30 - 09:30
Credenciamento

09:30 - 10:00
Boas-vindas e Introdução
José Papo e Amir Shevat
10:00 - 11:00
Building a Minimum Viable Product (MVP)
David Katz
11:00 - 12:00
Understanding users with Analytics & User Research
Amir Shevat
12:00-13:00
Almoço

13:00 - 14:00
Building a product your users will love
Jacob Greenshpan
14:00 - 14:30
Introdução ao Google Cloud Platform
José Papo
14:30 - 15:30
Web Development with Google Technologies
Uri Shaked
15:30 - 16:00
Coffee Break

16:00 - 17:00
Mobile Development with Google Technologies
Omri Baumer
17:00 - 18:00
Google Play Tips and Tricks
Amir Shevat
18:00 - 18:15
Wrap up & feedback

18:15 - 20:30
Coquetel






Mini-bios dos palestrantes


José Papo é Developer Relations Program Manager no Google. Também já trabalhou na Amazon (AWS) e na Microsoft. É desenvolvedor de software, evangelista de novas tecnologias e mestre em engenharia da computação pelo IPT. Também atua como professor de pós-graduação na PUC-SP. Fala sobre tendências tecnológicas, computação em nuvem, agilidade, inovação e desenvolvimento de produtos em seu twitter @josepapo


Amir Shevat is the global Startup Outreach lead in Google Developer Relations and responsible for Google Startup Launch Program. Previously, Amir Led Google Campus Tel Aviv and was the co-founder of several startups, as well as held business-development and tech positions in Microsoft and other big enterprises.


Dr. Jacob Greensphan - For the last 22 years, and after earning his Ph.D. in cognitive psychology and user interface design, building innovative, top-of-the-line UX solutions and applications has been his passion. Before becoming an independent consultant, he co-founded two companies: the largest company in Israel for UX design (UI Ltd.) and Applied Cognitive Engineering, Ltd. (ACE) for cognitive training. Currently, in addition to his work as strategic UX consultant, he coordinates the UX activity for Campus TLV Launchpad, an acceleration program for startups, managed by Google in Tel Aviv and lecture at events across the globe.


David Katz is an experienced startup professional. He held key roles (founder, ceo, cto, lead designer) for roughly two dozen products. Some worked and went on to be used tens of millions of times, others failed miserably. More about David at http://davidkatz.me.


Uri Shaked loves the web. Started developing software at the age of 12, he has since been pursuing his passion for technology, both professionally and through notable side projects and community activities. During his military duty, he served in an elite technological unit, working on large-scale mission-critical projects and developing cutting-edge technologies. Today Uri leads the Tel Aviv’s Google Developer Group, he is an Angular.JS Google Developer Expert and also lectures in an advanced web technologies code lab at the Technion, Israel’s Institute of Technology. Among his interests are reverse engineering, hardware hacking, and mobile development. Uri is also an avid Salsa dancer and a musician; he often likes to bring his passions together in projects such as the SalsaBeatMachine.org.


Omri Baumer is CTO for Startup Nation Central, a non-profit that connects israeli innovation with the world. he is one of the developers for ILVenture.co, one of the leaders of GDG Tel Aviv, Ex CTO of SafeWallet.com, experienced with mobile platforms (Andorid, BlackBerry, Windows phone) as well as cloud architectures (AWS and AppEngine).


Program Manager

Equipe de Developer Relations - Brasil

01/07/14

Aprenda Android, Cloud e desenvolvimento Web com experts do Google na Udacity

Além dos vários lançamentos que foram anúnciados no Google I/O, como o Android Wear, Android TV, Android Auto e outros, na semana passada o Google também anunciou uma grande parceria com a Udacity e o lançamento de 4 novos cursos (além de dois que já estavam disponíveis).



Agora, no hotsite da parceria Google e Udacity, é possível encontrar 6 cursos:


Todos os cursos são grátis, feitos com vídeos e muito código também, tudo preparado pela equipe de Developer Relations do Google nos Estados Unidos e com a experiência da Udacity na preparação desse tipo de conteúdo. Ou seja, garantia de qualidade e didática!

Atenção, a Udacity tem a sua forma de monetização. Caso queira ter o acesso grátis ao conteúdo total do curso, você precisa selecionar a opção COURSEWARE. O Free trial que está disponível é para quem deseja testar o serviço da Udacity por 15 dias. 

E caso  queira um certificado, é possível passar por um processo de avaliação e obter um certificado internacional, emitido pela Udacity. Nesse caso, é necessário consultar os valores e regras da Udacity para a realização do projeto final e obtenção do certificado.

Atenção: Não é um programa de certificação do Google. Como descrito acima, o processo de avaliação e emissão do certificado são responsabilidade da Udacity e podem possuir custo.

Por equanto não há a disponibilidade do curso em outro idioma, somente em inglês. Estamos trabalhando para que em breve haja legendas em português do Brasil, mas até o momento não há previsão de quando vão estar disponíveis.

Se você queria aprender a programar para Android, Cloud, Web e Web mobile ou criar jogos, essa é a sua chance, e ainda por cima de forma gratuita e com os profissionais do Google!

Para saber mais detalhes dessa parceria e de outras novidades relacionadas a tecnologias Google para desenvolvedores brasileiros, não deixe de acompanhar a plus page +Desenvolvedores Google 

Abraços

Developer Advocate
Equipe de Developer Relations - Brasil

16/06/14

Google I/O Extended Brasil - Localidades

Como anunciamos a alguns dias atrás, teremos o Google I/O Extended, além de São Paulo, em várias outras cidades do Brasil! Abaixo estão listadas todas as cidades que confirmaram a realização do evento no Brasil.

Caso sua cidade não esteja listada você pode organizar um na sua cidade através deste link.

Cidades confirmadas:

Aracaju
Belo Horizonte
Brasilia
Goiânia
Jaraguá do Sul
João Pessoa
Porto Alegre
Vale do Paraíba
Recife
São Paulo
Florianópolis

Nos vemos no I/O Extended!

05/06/14

Seu aplicativo na tela grande com Chromecast

Olá desenvolvedores !

Alguma vez já você já teve a idéia de transmitir o conteúdo do seu app para a TV dos seus usuários? Ou então, alguma funcionalidade nova que seria perfeita para a TV da sala da família?

Você como um desenvolvedor ligado em inovações, provavelmente já conhecia o Chromecast, que desde julho de 2013 está disponível nos Estados Unidos e foi um grande sucesso de vendas. E desde  ontem, 2 de junho de 2014, já está disponível em redes de varejo no Brasil. 

Para mais detalhes sobre preço do dispositivo, onde encontrar e também um vídeo sobre o seu funcionamento, o blog oficial do Google Brasil fez o post "Chromecast chega ao Brasil: leve à TV seus conteúdos online favoritos"

E para motivar o desenvolvedor brasileiro em criar soluções para o mercado brasileiro, 5 vídeos da série DevBytes sobre Chromecast ganharam legendas em português. Agora, você desenvolvedor Web, Android e iOS pode aprender como criar ou adaptar seus aplicativos para transmitir conteúdo para a TV.

Veja quais vídeos ganharam legendas em português:

  • Google Cast SDK Overview: Vídeo com uma introdução sobre o que é o Cast SDK, seus principais elementos e como você pode tirar proveito dessa ferramenta.
  • Overview for Google Cast Receivers: Saiba o que são os receivers do Google Cast SDK, como utilizá-los e também como customizá-los.
  • Google Cast SDK for Android: Crie e adapte aplicativos Android para que se comuniquem com Chromecast.
  • Google Cast SDK for iOS: iPhone, iPad e iPod também podem transmitir para dispositivos Chromecast. Entenda como utilizar o Google Cast SDK em dispositivos iOS.
  • Google Cast for Chrome: Além dos aplicativos móveis, também adicione o suporte ao Google Cast SDK a partir do navegador do Google, o Chrome.
Não perca essa chance, vá até os vídeos, ative as legendas e aproveite para pensar em funcionalidades inovadoras com o Chromecast e Google Cast SDK !

Abraços
Neto Marin - Developer Advocate
+DesenvolvedoresGoogle - Developer Relations - Brasil

30/04/14

Hackathon GDG Floripa - Evento inaugural!

O Hackathon GDG Floripa é o evento inaugural do Grupo de Desenvolvedores Google de Florianópolis. Vai ser uma maratona de dois dias intensos de programação com foco em aplicativos nativos para Android, Chrome Extensions, Chrome Apps e/ou Web.

O evento terá inicio na sexta feira, dia 16 de maio, as 09:00h da manhã e ficará até as 20:00h do mesmo dia, retornando no dia seguinte, sábado, dia 17 de maio também das 09:00h às 20:00h e acontecerá dentro da edição 2014 do TDC Florianópolis, no Oceania Convention Center.

Em um ambiente muito descontraido, desenvolvedores de várias tecnologias, sejam de back end ou front end, junto com designs, projetistas e tudo mais, se juntaram para colocar suas ideias em prática e criar aplicativos/sistemas dos mais variados tipos e dos mais variados usos. Os ganhadores ganharão uma viagem para o TDC SP com passagem e hospedagem para o dia da trilha de Android, além disso, vão ter a oportunidade de conhecer  a nossa sede em São Paulo e almoçar com os nossos Googlers!

Os participantes terão que passar por um processo seletivo simples, preenchendo um pequeno formulário explicando qual é a sua especialidade e o motivo da sua participação neste hackathon. As inscrições no formulário serão aceitas até o dia 04 de maio e são individuais.

Para mais informações: http://goo.gl/AAejBS

Se você é de Florianópolis ou região, não perca! Esse será o primeiro de muitos eventos do GDG Floripa!

Let’s Hack The Planet!

23/04/14

Carregando listas de maneira eficiente em apps Android

Um tipo de tela muito comum em qualquer app Android são as listas, que podem ser utilizadas em diversas situações, como para apresentar opções de lugares a sua volta, as opções de um NavigationDrawer e até para fazer uma timeline (ou stream) de um app, apresentando o conteúdo com imagens e cards.
E assim como diversos tipos de listas, as formas de carregá-las também podem variar, contendo imagens, dados dinâmicos ou poucos dados. Essa variação toda pode confundir um pouco na hora de implementar, já que uma má escolha pode acabar "punindo" o seu usuário que deixaria de usar seu aplicativo, por algum problema de performance ou até falta de memória.
Para ajudar um pouco nessa tarefa, temos disponível um guia sobre ListView e também documentos sobre design de Listas, Grid Lists e Scrolling.

Mas se ainda assim restarem alguma dúvida, preparamos uma pequena aplicação de exemplo chamada ListLoadingSamples, que está diponível no repositório codigo-google no GitHub, e que vamos utilizar abaixo para demonstrar 4 formas distintas de carregar uma lista.

O mais simples: ArrayAdapter


Imagine que você queira apresentar de forma simples e rápida uma lista com alguns itens, como por exemplo os países da América do Sul para o usuário escolher um como destino das próximas férias. Ou seja, número de opções limitada e com um layout simples, apenas com uma linha de texto.

Nesse caso (como a imagem ao lado), o mais indicado é que seja utilizado o ArrayAdapter na criação da lista, com o layout android.R.simple_list_item_1, que é fornecido pelo framework do Android para itens de lista.

Você também pode fornecer um layout específico, basta que ele tenha um TextView com o id label.

Veja o código para criação e definição do adapter:

private String[] listValues = new String[]{"Brasil", "Argentina", 
        "Bolívia", "Chile", "Colômbia", "Equador", "Ilhas Malvinas", 
        "Guiana Francesa", "Guiana", "Paraguai", "Peru", "Suriname", 
        "Uruguai", "Venezuela"};

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    ArrayAdapter adapter = new ArrayAdapter(getActivity(), 
            android.R.layout.simple_list_item_1, listValues);
    setListAdapter(adapter);
}

Customizando o layout do item


Mas as vezes, talvez até na maioria delas, é necessário customizar mais os itens de uma lista. Nesse caso, será necessário ir um pouco mais a fundo na programação da lista, mais precisamente, criar o seu próprio adapter.

No exemplo do post, foi criada a classe TitleDescriptionListAdapter, que estende de BaseAdapter e é responsável por criar e gerenciar os itens que são mostrados na lista. Para economizar memória, foi utilizado o padrão View Holder, onde os elementos são reaproveitados, mudando apenas os textos (no caso, título e descrição) que são exibidos.

Para isso, é criada dentro do adapter uma classe estática ViewHolder, que tem como atributo os elementos de UI que são apresentados na tela:

  static class ViewHolder  {
      public TextView titleTextView;
      public TextView descTextView;
  }

Depois, no método getView, que é responsável for retornar a view a ser exibida pela lista em uma certa posição, é verificado se o item (a view) já foi criado. Caso já tenha sido, ela então é reaproveitada, mudando apenas os elementos que são exibidos:

@Override
public View getView(int position, View convertView, 
        ViewGroup viewGroup) {
    View listItemView = convertView;

    if(convertView == null) {
        LayoutInflater inflater = context.getLayoutInflater();
        listItemView = inflater.inflate(R.layout.list_item_title_desc, 
                null);

        ViewHolder viewHolder = new ViewHolder();
        viewHolder.titleTextView = (TextView) listItemView.findViewById(
                R.id.listItemTitle);
        viewHolder.descTextView = (TextView) listItemView.findViewById(
                R.id.listItemDescription);
        listItemView.setTag(viewHolder);
    }

    ViewHolder holder = (ViewHolder) listItemView.getTag();
    Map titleDesc = (Map) getItem(position);
    holder.titleTextView.setText(titleDesc.get("title"));
    holder.descTextView.setText(titleDesc.get("description"));

    return listItemView;
}

Dessa forma, o tempo com a criação de uma nova view (inflar o layout, executar find nas views e etc) só é gasto na primeira vez. E nas exibições seguintes, apenas os conteúdos dos elementos são atualizados. Então, além da economia de tempo, há também a economia de memória.

Quando os dados "nunca acabam"


Um padrão muito comum em aplicativos móveis são os scrolls infinitos, ao invés da antiga paginação. Esse tipo de técnica está presente principalmente quando se está implementando um feed de notícias, ou algo similar a uma rede social.

Pois nesse caso, seria impossível carregar todos os dados disponíveis ao usuário, por motivos óbvios. Para essa situação, o mais sensato é fazer o carregamento de um número determinado de itens, e conforme o usuário for realizando o scroll, o aplicativo detecta esse movimento e faz uma nova consulta a API.

Para o exemplo desse post, foi utilizado um ArrayAdapter simples, pois a informação a ser exibida seria apenas um texto. Mas o que de fato faz o scroll infinito, está na classe EndlessScrollListener, que implementa a interface AbsListView.OnScrollListener.

Esse listener é acionado sempre que há uma ação de scroll na lista em alguma direção, através do método onScroll. Nesse método, de acordo com o número de itens visíveis na lista e no número de itens antes do final da lista, é chamado o método onLoadMore, da interface OnLoadMoreListener.

Essa interface foi definida no EndlessScrollListener e deve ser implementada pela classe que irá receber a notificação do scroll, para buscar mais itens. Depois, o adapter é atualizado com mais itens e assim o ciclo continua.

Veja a implementação do método onScroll:

@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, 
        int visibleItemCount, int totalItemCount) {

    if (totalItemCount < currentTotalItems) {
        currentPage = firstItemPageIndex;
        currentTotalItems = totalItemCount;
        if (totalItemCount == 0) { loading = true; }
    }

    if (loading && (totalItemCount > currentTotalItems)) {
        loading = false;
        currentTotalItems = totalItemCount;
        currentPage++;
    }

    if (!loading && (totalItemCount - visibleItemCount) <=
            (firstVisibleItem + visibleThreshold)) {
        loadMoreListener.onLoadMore(currentPage + 1, totalItemCount);
        loading = true;
    }
}

Definição da interface:
public interface OnLoadMoreListener {
    public void onLoadMore(int page, int totalItemsCount);
}

Nesse exemplo, a interface OnLoadMoreListener está implementada na classe EndlessScrollListFragment, que ao receber os dados atualiza o adapter com os novos dados. Assim, a lista é atualizada com os novos itens e funcionando como scroll infinito.

Exibindo imagens em uma lista


E por fim, mas não menos importante, vamos falar como exibir imagens da Internet (ou local) em uma lista. E nesse tipo de lista, mora um grande desafio: evitar o OutOfMemory !

Cada aplicativo tem um limite de memória que pode consumir do dispositivo, assim, caso muitas imagens sejam carregadas em uma lista, o aplicativo pode ficar rapidamente sem memória e acabar fechado pelo sistema operacional.

A primeira coisa que se deve fazer é redimensionar a imagem para o tamanho adequado, dessa forma você evita que muita memória seja alocada desnecessariamente. O Android oferece ferramentas para que o aplicativo faça a decodificação da imagem somente do tamanho que é desejado.

No código desse post, as implementações para manipulação de imagem estão na classe ImageCommons. Nessa classe você irá encontrar, por exemplo, o método decodeSampledBitmapFromInputStream(...) que recebe o InputStream de uma imagem (que pode ter vindo pela Internet) e faz a decodificação para um BitMap.

O código que faz renderização da lista está no adapter ImageLoaderListAdapter, que além dos métodos já conhecidos para tratar a lista, tem a criação de um LruCache. Dessa forma, os BitMaps são armazenados nesse cache, conforme vão sendo criados. Para esse aplicativo, o cache utilizado foi a memória máxima do aplicativo / 8 (o que seria aproximadamente 12,5%). Veja abaixo a criação do cache:

final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache(cacheSize) {
    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
    @Override
    protected int sizeOf(String key, Bitmap bitmap) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB_MR1) {
            return bitmap.getByteCount() / 1024;
        } else {
            return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
        }
    }
};

No método getView(), é feita a chamada que será responsável por fazer o download da imagem a ser exibida. Enquanto a imagem é recebida pelo aplicativo, um place holder é exibido em seu lugar, não deixando assim um espaço não preenchido na interface.

@Override
public View getView(int position, View convertView, ViewGroup container) {
    if (convertView == null) {
        convertView = LayoutInflater.from(context)
                .inflate(R.layout.list_item_img_title_desc, 
                        container, false);
    }

    Map item = (Map) getItem(position);
    ((TextView) convertView.findViewById(R.id.listItemTitle))
            .setText(item.get("title"));
    ((TextView) convertView.findViewById(R.id.listItemDescription))
            .setText(item.get("description"));
    final ImageView thumbnail = (ImageView) convertView
            .findViewById(R.id.listItemImage);
    loadBitmap(item.get("flag"), thumbnail);
    return convertView;
}

Quando a imagem é recebida e decodificada, é inserida no cache e depois, caso o item ainda esteja visível na lista, é colocada no lugar do place holder. Caso o item da lista para aquela imagem não esteja mais visível, ela não é atribuída ao ImageView da lista.

E como a imagem é armazenada no cache, na próxima vez que a mesma imagem precisar ser exibida, o download não será necessário, fazendo a velocidade do aplicativo ser melhor e economizar bateria. Além disso, a lista não ficará travando ao sofrer scrolls, mesmo que de forma contínua.

Para entender melhor o fluxo de decodificação, cacheamento e como as tasks de download das imagens são gerenciadas, veja a classe a ImageLoaderListAdapter e também os guias Processing Bitmaps Off the UI Thread, Caching Bitmaps e Displaying Bitmaps in Your UI disponíveis na documentação oficial do Android, e que serviram de base para a criação desse exemplo.

Projeto completo


Todo o código demonstrado no post, assim como métodos auxiliares e detalhes menos importantes que foram suprimidos para não deixar o texto muito extenso, podem ser encontrados no projeto ListLoadingSamples no GitHub.

Para testar no seu dispositivo Android, é só clonar o projeto, importar para o Android Studio e executar no emulador ou no seu dispositivo preferido.

+Neto Marin
Developer Advocate