quinta-feira, 31 de dezembro de 2015

Cantareira, ainda não saímos do volume morto

  Diante de tantas comemorações acerca da tão esperada recuperação do cantareira, resolvi expor minha opinião sobre esse fato, contrariando a maioria, minha opinião é que ainda não saímos do volume morto.
  Antes da gritaria geral, deixe-me explicar: o cantareira não é uma represa, é um conjunto de represas, nesse sentido, um sistema entra no volume morto quando a primeira represa desse sistema começa a usar a reserva apelando para as bombas, e sairá quando a última represa deixar de necessitar delas (as bombas) para fornecer água ao sistema. Vejam que a represa Jaguari/Jacareí ainda está  em -7,7%, faltando pouco mais de 60 bilhões de litros para sair do volume morto (dados de 31/12/2015).
  Então uma pergunta a se fazer é por quê tanta gente acha que saímos do volume morto? A resposta é que nenhum dos três índices divulgados pela Sabesp serve para informar se o sistema cantareira esteja operando fora do volume morto. Todos eles são índices consolidados do sistema, para sabermos sobre a saída do volume morto devemos consultar os índices de cada represa do sistema.
  Outra pergunta a ser respondida: por quê esse assunto num blog de programação? Essa é mais fácil de responder: é um exemplo sobre a diferença entre dados e informações e, claro, interpretação dos dados.

  Abraços.
 
  PS: Feliz ano novo!

sábado, 5 de dezembro de 2015

sábado, 24 de outubro de 2015

Android básico: testando Fragments, transactions e backStack

  O principal objetivo desse exemplo é testar o uso de transações com fragments, incluindo o backStack e aproveitando a oportunidade, mostrar o comportamento da activity (com fragment) quando ela for destruída e recriada.
  Esse app tem apenas uma activity e um fragment e funciona assim: tem um botão (Next Frag) que ao ser tocado vai solicitar à activity um novo fragment.
  Apesar da simplicidade, podemos fazer diversos experimentos:
  Primeiro, ao fazer o teste, notamos que a contagem vai de um em um (1, 2, 3, ...). Se virarmos o celular, a activity vai ser destruída e recriada, mas a tela é reconstruída como estava na última posição.
  Segundo, ao retirar a linha que está comentada com a letra A (o return), o que acontece ao realizar o teste? Isso se deve ao fato de que estamos criando uma nova instância do fragment (com o novo count) e substituindo a anterior. Não é esse o comportamento esperado, então vamos deixar o return no seu devido lugar.
  Terceiro, ao retirar o comentário da linha com a letra B, vamos testar o funcionamento da pilha de fragments, para isso basta teclar diversas vezes no botão "Next Frag" e em seguida no "Voltar", os framents são salvos e recuperados com o "Voltar".

  Seguem os códigos.

MainActivity.java




Fragment1.java




activity_main.xml




fragment1.xml




  Uma observação final, a forma como chamei o método da activity não é o recomendado, o ideal é via uma interface, mas como, nesse caso, só temos uma activity é aceitável.

Abraços!

terça-feira, 13 de outubro de 2015

TIOBE index, outubro

  Pouca novidade no índice de outubro. Apenas a saída da linguagem Objective-C do top10, sendo substituída pela linguagem Ruby.
  Parece uma distorção do método para capturar como estão reportando sobre as linguagens de programação da Apple, afinal Objective-C + Swift com menos de 3% soa meio estranho, não é? Lembro que há um ano Objective-C ocupava a terceira posição e como a Apple continua muito bem, deve ter um erro aí.
  Vamos acompanhar os próximos índices.

  Abraços.

terça-feira, 22 de setembro de 2015

TIOBE Index, em setembro Java na frente

  A linguagem Java aparece em primeiro no Índice TIOBE de setembro, com 19,565%, quase 4 pontos acima da segunda linguagem, C.

  O que chama atenção, é o crescimento brutal da linguagem Java, +5,43%, e da queda da Objetive-C, essa já esperada após o lançamento da Swift pela Apple. Outra, que chama atenção, é a linguagem Python logo após as quatro "grandes" (Java, C, C++ e C#).

  O algoritmo de cálculo do índice foi alterado, a partir desse índice de setembro, para eliminar picos.  

Abraços.


terça-feira, 18 de agosto de 2015

Android básico: a classe Handler

  A classe Handler é extensamente utilizada nas aplicações Android, nem precisa lembrar que entender e saber utilizá-la é fundamental.

Segue uma tradução livre da documentação do Android:

"A classe Handler permite que você envie e processe mensagens (Messages) e objetos executáveis (Runnables) associados  com a fila de mensagens (MessageQueue) da thread. Cada instância do Handler está associada a uma única thread e à sua fila de mensagens. Quando você cria um novo Handler, ele é associado à fila de mensagens da thread onde está sendo instanciado  - a partir desse ponto, ele vai enviar mensagens e Runnables para a fila de mensagens e executá-los quando eles forem retirados da fila de mensagens.

  Existem dois principais usos para um Handler: (1) para agendar mensagens e runnables para serem executados em algum momento no futuro; e (2) para enfileirar uma ação a ser executada em uma thread diferente da thread em execução.

  O agendamento de mensagens é realizado com os métodos post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), e sendMessageDelayed(Message, long). As versões "post" permitem que você enfileire objetos executáveis a serem chamados pela fila de mensagens em que eles são recebidos; as versões "sendMessage" permitem que você enfileire um objeto Message contendo um conjunto de dados que serão processados ​​pelo método handleMessage(Message) do Handler (o que exige que você implemente uma subclasse do Handler).

  Ao usar "post" ou "send"  para um Handler, você pode permitir que o item possa ser processado assim que a fila de mensagens esteja pronto para fazê-lo, ou especifique um atraso antes que seja processado ou horário específico para que possa ser processado. As duas últimas opções permitem implementar timeouts, ticks, e outros comportamentos baseados em tempo.

  Quando um processo é criado para a sua aplicação, sua thread principal é dedicada à execução de uma fila de mensagens que cuida da gestão dos objetos de nível superior da aplicação (activities, broadcast receivers, etc.) e quaisquer janelas que criarem. Você pode criar suas próprias threads, e comunicar com a main-thread do aplicativo através de um objeto Handler. Isso é feito chamando o mesmo método "post" ou "sendMessage" como antes, mas a partir de sua nova thread. O Runnable ou Message então será agendado na fila de mensagens do Handler e processados ​​quando apropriado."

quarta-feira, 8 de julho de 2015

Impressões sobre a leitura do livro Jogos Android da Casa do Código

Livro: "Jogos Android: Crie um game do zero usando classes nativas"
Autor: Felipe Torres
Editora: Casa do Código
Número de paginas: 151

  Livro introdutório à programação de jogos para o Android, usando apenas os recursos da API nativa, mostrando como fazer um jogo no estilo "Flappy Bird". Usando recursos como: SurfaceView, main loop, elementos do jogo, background, obstáculos, movimentação, pontuação, colisão, encerramento, imagens e sons.

  Gostei muito da leitura, que se faz em apenas algumas horas.

  Como sugestão: seria interessante disponibilizar os fontes para download.

  Abraços.

quinta-feira, 18 de junho de 2015

Google Apps for Work

  O Google Apps for Work oferece às empresas as ferramentas necessárias para realizar mais tarefas com recursos de e-mail profissional(Gmail), armazenamento on-line(Drive), agendas compartilhadas(Agenda), reuniões por vídeo(Hangouts) e muito mais.

  Vale a pena avaliar.

  Link para testes: https://goo.gl/9SI9TV

terça-feira, 9 de junho de 2015

Android básico: passando parâmetros

  Na maioria das vezes que iniciamos uma outra activity temos que passar algum dado, para isso usamos algum método putExtra da classe Intent. No exemplo abaixo, estamos passando um String, mas podemos passar qualquer tipo primitivo, objetos cujas classes implementem Serializable ou Parcelable. Veja outras opções suportadas na documentação.

na MainActivity:



  Recuperamos o dado dessa forma na NextActivity:



  No exemplo estamos usando o getStringExtra, mas também temos os métodos: getBooleanExtra, getIntExtra, getDoubleExtra, getSerializableExtra, getParcelableExtra, etc.
  Notem que podemos passar mais de um parâmetro, basta definir um nome que será usado como chave (key) e o valor (value) associado.

Abraços!

quarta-feira, 3 de junho de 2015

Dica: Materiais para estudar Android

  Segue uma lista bem sintética dos recursos que recomendo para estudar Android, sitei apenas livros em português, de autores que conheço. O livro do Lecheta ainda está para ser lançado, a indicação vai na cota da confiabilidade que alcançou com as edições anteriores.

Livros:

- Dominando o Android - Do Básico ao Avançado, Nelson Glauber, Novatec

- Google Android: crie aplicações para celulares e tablets, João Bosco Monteiro, Casa do Código

- Google Android -  4ª Edição, Ricardo R. Lecheta, Novatec *
            * em vias de ser lançado


  Aqui tem quase tudo sobre o Android:

Site oficial do Android

Abas principais: Training, API Guides e Reference


Sites onde tirar dúvidas:

Guj Perguntas/Respostas

Portal Android

Stack Overflow 


Tem muito material em vídeo.

É isso.

Abraços

PS: o livro do R. Lecheta já está disponível.

quinta-feira, 28 de maio de 2015

Google anuncia o Projeto Brillo, para IoT, um subset do Android

A Google acaba de anunciar o Projeto Brillo, um sistema operacional para a internet das coisas (Internet of Things = IoT) derivado do sistema Android.

Promete.
Vamos esperar!

Abraços

Dica: materiais para estudar Java

  Para os que estão interessados em aprendar Java, para quem sabe posteriormente desenvolver para Android, segue algumas dicas de materiais interessantes:

Livros:

- Use a cabeça!  Java, da Kathy Sierra, uma forma divertida de aprender.

- Java Como Programar - Paul Deitel, Harvey Deitel, bem detalhado, quase 1200 páginas.

- Effective Java , do Joshua Bloch - livro fundamental de dicas e boas práticas.

- Java Concurrency in Practice , do Brian Goetz - conceitos essenciais sobre concorrência.

- Use a cabeça! Padrões de Projeto, Freeman, Elisabeth; Freeman, Eric - Design Patterns.


Apostilas:

- Caelum: Apostila do curso FJ-11 - Java e Orientação a Objetos

- Caelum: Apostila do curso CS-14 - Algoritmos e Estruturas de Dados com Java

- K19:  K11 - Orientação a Objetos em Java

- K19: K51 - Design Patterns em Java


Tutoriais da Oracle: https://docs.oracle.com/javase/tutorial/index.html

Essas trilhas básicas (em Trails Covering the Basics):

- Learning the Java Language — Lições que descrevem os conceitos essenciais e as características da linguagem de programação Java.

- Essential Java Classes —  Lições sobre exceções, Input / Output básico, concorrência, expressões regulares, e o ambiente de plataforma.

- Collections — Lições sobre o uso e a estensão da framework Collections do Java.


Vídeos - tem muito material no YouTube.

Espero que seja útil!

Abraços

PS: Estou preparando outro post para os materiais do Android.



segunda-feira, 25 de maio de 2015

Convertendo o encoding de arquivos

  Às vezes recebemos um arquivo gravado num formato e precisamos converter para outro, por exemplo no Android o default é "UTF-8".
  Abaixo segue um exemplo que converte um arquivo em "Cp1252" para "UTF-8".





Abraço.

quinta-feira, 21 de maio de 2015

Crescimento do Android

  Desta vez não estou me referindo ao número de dispositivos rodando com o sistema Android, mas sobre o aumento do tamanho do android.jar, vejam a tabela abaixo:



  Aumentou mais de 8 vezes da API 3 para a 22!

  Abraços

sábado, 18 de abril de 2015

Dica: vídeos da série Android Performance Patterns

  Traduzindo do canal do YouTube:
"Android Performance Patterns - Padrões de Desempenho Android é uma coleção de vídeos voltados inteiramente para ajudar os desenvolvedores a escrever aplicativos Android mais rápidos, de maior performance. Por um lado, trata-se de retirar as camadas do sistema Android, e expondo como as coisas estão a trabalhar sob a "cobertura". Por outro lado, trata-se de ensinar-lhe como as ferramentas trabalham, e o que  procurar, a fim de extrair a performance certa do seu app.
Mas no final do dia, Padrões de Desempenho Android está dando-lhe os recursos certos, na hora certa para ajudar a fazer o mais rápido, mais suave, mais incrível experiência para os seus usuários. E esse é o ponto, certo?"

  Certo!

  Segue o link: Android Performance Patterns

  Abraços

domingo, 12 de abril de 2015

Dica: copiando o db SQLite do assets, copyDbFromAssets()

 Às vezes temos um db pronto e queremos fazer a distribuição no próprio apk. Uma forma é deixar o db na pasta assets e na primeira execução do app fazer a cópia para a pasta dos bancos.
 Segue um código que tenho usado.




  Segue um trecho de uma AsyncTask para executar a cópia:




  Na Activity, chamamos a asyncTask:




  Um bom lugar para usar essa rotina é na activity de Splash Screen, enquanto faz a cópia em background fica no splash screen.

 Abraços

sábado, 4 de abril de 2015

Curso: Android Fundamentals, Udacity

Dei uma olhada nesse curso da Udacity, UD853, Developing Android Apps, Android Fundamentals.
Ele foi preparado pela Google, e cobre vários tópicos interessantes. É baseado no desenvolvimento de um aplicativo chamado Sunshine, que mostra as condições do tempo buscando os dados num provedor de dados do tempo de diversas localidades.
Um dos instrutores é o engenheiro de software Reto Meier, autor de uma série de livros sobe desenvolvimento Android. Usei um de seus livros no início do meu aprendizado sobre desenvolvimento Android.
A duração prevista é de 10 semanas, mas, depende da disponibilidade e conhecimentos de cada um.
O pré-requisito é programar em alguma linguagem OO por aproximadamente 3 anos e ter conhecimento de Java básico.
É em inglês, mas tem legendas em (quase sempre...) português.
Vale a pena.
PS: Tem opção paga e free.
Abraços



terça-feira, 31 de março de 2015

Testando o CountUpTimer no emulador Android

  Vamos testar a classe CountUpTimer do post anterior.

  Segue a activity do teste:




Vejam como ficaram os testes com 1 segundo e 5 segundos:



Ps: ficou muito ruim, perdeu qualidade no upload.


segunda-feira, 23 de março de 2015

Usando o Handler como Timer 3, CountUpTimer

  No Android, sempre que pensamos em alguma rotina baseada em tempo, a indicação é usar a classe Handler. Mesmo que o primeiro recurso que lembrarmos seja a classe Timer!
  A classe Handler possui esses métodos que são úteis para implementar comportamentos baseados em tempo: postAtTime, postDelayed, sendMessageAtTime e sendMessageDelayed.
  Nesse exemplo uso uma classe abstrata CountUpTimer, que foi inspirada na CountDownTimer, para implementar um jeito de executar tarefas repetitivas após um dado intervalo de tempo. Toda a lógica está no método handleMessage do Handler, o método que se deve implementar ao extender o CountUpTime é o onTick, que recebe o tempo decorrido desde o start em milisegundos.
  Notem que o onTick deve ser implementado com o cuidado de ser breve, e, com uma preocupação adicional, de estar sendo chamado em um bloco sincronizado.

 Como costumam dizer por aí que uma imagem vale por mil palavras, eu acho que um código vale pelo menos por umas tantas quantas... Então seguem os códigos:





Uma observação final, implemente o CountUpTimer na MainThread.

Abraços

terça-feira, 10 de março de 2015

Lançado nova versão do Android, 5.1 SDK (API 22)

  Foi lançado a nova versão do Android 5.1, uma versão atualizada da plataforma Android Lollipop que melhora a estabilidade, com melhor controle das notificações e com melhor desempenho. Já está liberado o Android 5.1 SDK (API 22).
  Um recurso, interessante para nós desenvolvedores brasileiros, é a possibilidade de tratar celulares  multichips.

  Abraços

quarta-feira, 4 de março de 2015

Atenção: OAuth mudanças

  Como já anunciado, o OAuth na versão antiga vai ser descontinuado.

  Para quem usa o OAuthConfig para API da Google (Drive, Calendar, etc) a data de corte será 20/04/2015, para outros (Twitter), 26/06/2015.
  Foram criados duas bibliotecas, uma APIs não-Google e outra para os da Google, respectivamente: OAuth1 e OAuth2 for Apps Script. 

Abraços

quarta-feira, 25 de fevereiro de 2015

Algoritmo de sort com bug, está no Java, Python e Android

  Um algoritmo de sort (TimSort) usado em Java, Python e no Android contém um bug. Foi descoberto por Stijn de Gouw e outros pesquisadores.
  Stijn de Gouw publicou detalhes no link abaixo. Lá contém o erro, as explicações e a correção.
  Eles usaram técnicas avançadas da ciência da computação chamadas como métodos formais.
  Se você já teve um java.lang.ArrayIndexOutOfBoundsException num sort, provavelmente foi esse bug.
  Vale uma leitura detalhada no post.

http://envisage-project.eu/proving-android-java-and-python-sorting-algorithm-is-broken-and-how-to-fix-it/

  Abraços

domingo, 22 de fevereiro de 2015

Cancelando uma AsyncTask

  Logo no início dos meus estudos testei a classe AsyncTask, vejo que é uma classe problemática para os desenvolvedores Android. Problema, no sentido de dificuldade de entendimento do seu funcionamento.
  Inclusive, o pessoal do Android ajudou um pouco nessa confusão. Quando foi disponibilizado, no Android 1.5 - Cupcake (API 3), a tarefa era executada em um única thread em background. Logo em seguida, nas versões 2.x (API 4 a 10) isso foi mudado para um pool de threads, permitindo que várias tarefas rodassem em paralelo. Para, voltar a executar sequencialmente, uma tarefa por vez, no Android 3.0 - Honeycomb (API 11). Isso para evitar erros de aplicativos causados por execução paralela. O problema não estava, evidentemente, na AsyncTask e sim em como as tarefas foram implementadas.
  Mas, isso é história. O objetivo desse post é retornar num exemplo que postei há muito tempo. Link abaixo. O objetivo é incluir uma forma de cancelar uma tarefa quando a activity entrar nos métodos onPause, onStop ou onDestroy. Escolher em qual (ou quais) método colocar o cancelamento vai depender de cada caso, no meu exemplo, coloco em todos.
  Para cancelar basta usar o método da AsyncTask cancel(true), na verdade, não é cancelado automaticamente, é solicitado um cancelamento. A tarefa em execução precisa ser passível de responder ao pedido de cancelamento. Na tarefa, o método isCancelled() é usado para checar se o cancelamento foi solicitado. É recomendado checar sempre antes de executar um processamento demorado.

  Segue o código que usei no post do link abaixo com as alterações:



  Faltou dizer que ao cancelar a AsyncTask, o método onPostExecute não será chamado, em seu lugar, o método onCancelled deve ser executado.

http://agorandroid.blogspot.com.br/2012/02/asynctask-e-progressdialog-ex04.html

 Abraços

sexta-feira, 20 de fevereiro de 2015

Android básico: Usando o onSaveInstanceState

  Em algumas situações o sistema pode encerrar sua activity, seja por falta de recursos ou por mudança de orientação da tela. Nesses casos, o método onSaveInstanceState é chamado para permitir ao programador salvar algum dado da activity. O método é chamado com uma referencia a um bundle, nele é que se deve salvar o(s) dado(s). Quando a activity for recriada esse bundle é passado para o onCreate e onRestoreInstanceState.

  Segue abaixo um esquema básico:

Salva o(s) dados(s):




Recupera o(s) dado(s), aqui:




Ou aqui:



  Os dados da tela são salvos e restaurados automaticamente, por isso é fundamental chamar o método no super.
  Lembrar que esse procedimento só deve ser usado para dados temporários (transitórios), pois são salvos em memória, correndo o risco de serem descartados.
  Em caso de dados importantes, ou na dúvida, salve-os de maneira persistente.

Abraços



Curso Android online

Este curso oferecido pelo Coursera é bem interessante:


Programação de aplicativos para dispositivos móveis com sistema Android: Part 1
Programação de aplicativos para dispositivos móveis com sistema Android: Part 2
O inglês do professor Adam Porter é bem fácil, compreensível.
É bom ter um nível intermediário de conhecimentos de programação Java e, apesar de não ser um pré-requisito, é interessante ter um nível introdutório em Android. Vai aproveitar mais.
Assisti todas as aulas da parte 1 e estou acompanhando a parte 2. 
Gostei, recomendo.
Abraços



terça-feira, 17 de fevereiro de 2015

Android básico: retornando dados de uma activity para outra.

 Um fato que acontece com frequencia é a necessidade de capturar o retorno de uma outra activity. Para isso temos que chamar a activity com um método específico, o startActivityForResult.
 Por exemplo, a ActivityA invoca a ActivityB com startActivityForResult e aguarda o retorno em onActivityResult. Na ActivityB o retorno é passado via uma Intent, posicionado via setResult. 

 Abaixo segue o esquema básico:

 Na activity chamadora, ActivityA:



 Na activity chamada, ActivityB:




 Abraços

segunda-feira, 16 de fevereiro de 2015

Android básico: a classe Bundle

 Classe Bundle:  Um mapa de chave/valor, onde chave é uma String e valor tipos primitivos ou objetos empacotáveis (Parcelable) e/ou serializáveis. Em outras palavras, é uma classe utilitária para armazenar/transportar dados, um container.

 Todo iniciante em programação Android, toma contato com essa classe logo no primeiro app:



 Se você tiver um material mais antigo, pode ser assim:



Além de estar no onCreate, o Bundle também está em outros métodos da activity, como em onSaveInstanceState, onRestoreInstanceState. Está também na classe Intent, como um atributo usado para passar/receber dados. Os métodos com "Extra" no nome.

 O formato geral para acessar é: getXxx.
 O formato geral para incluir é: putXxx.

Onde Xxx é o tipo do dado, getInt, putInt, getFloat, putFloat, getIntArray, putString, etc.


Abraços




sábado, 7 de fevereiro de 2015

Relembrando: As regras sagradas do Android

Postei essas regras faz um bom tempo, como continuam válidas vamos relembrar:

O Android tem duas regras sagradas:
1. Não bloqueie a UI Thread.
2. Não atualize a tela através de uma outra thread.
Ou seja, não faça nada demorado na UI Thread e só atualize a tela pela UI Thread.
Para isso temos os seguintes recursos para implementar um código que cumpra as regras acima:
1. Thread
2. Runnable
3. Handle
4. AsyncTask

Além dos recursos citados, em outro post fiz uma lista mais completa (link abaixo).

As regras sagradas do Android

Recursos para processamento assíncrono no Android

Abraços

segunda-feira, 2 de fevereiro de 2015

Impressões sobre a leitura do Livro Dominando o Android - Do Básico ao Avançado

Livro: "Dominando o Android - Do Básico ao Avançado"
Autor: Nelson Glauber
ISBN: 978-85-7522-412-0
Páginas: 792
Ano: 2015

Estou lendo o livro "Dominando o Android - Do Básico ao Avançado", devo ter lido mais de 300 páginas, então já dá para dar uma opinião.
O livro é bom, muito bem escrito. Recomendo, com uma ressalva: não é indicado para quem está iniciando o aprendizado no desenvolvimento Android com o livro. Ele tem vários tópicos interessantes, mas pela abordagem, creio que um iniciante vai ter alguma dificuldade de entendimento.
O ideal é que o leitor já tenha algum conhecimento básico e alguns projetos desenvolvidos. Aí, o livro vai ser melhor aproveitado.

Outro senão, faltou incluir o indice remissivo. Acho muito útil.

Mas, estou gostando.

Parabéns ao autor Nelson Glauber e para a editora Novatec pelo livro.

Abraços.

quinta-feira, 29 de janeiro de 2015

Leitura: Dominando o Android, do básico ao avançado, Nelson Glauber

  Estou iniciando a leitura do livro recém-lançado do professor Nelson Glauber.
  Quando terminar a parte de conceitos básicos (+- 400 páginas), escrevo algumas considerações sobre a leitura.

  Nos últimos meses programei muito pouco, escrevi muito pouco aqui no blog, este ano pretendo ser mais ativo.

 Abraços

terça-feira, 20 de janeiro de 2015

Roteiro de planejamento, através de perguntas

Você costuma planejar suas atividades? Saiba que o ato de planejar vai ajudar muito no exito de seus projetos. Segue um roteiro simples para ajudar nesse processo.

1. Defina um objetivo
    - O que preciso/quero/desejo fazer?
2. Defina as tarefas
    - O que preciso fazer para alcançar o objetivo?
3. Defina a prioridade
    - O que é prioritário fazer?
4. Defina os recursos/meios
    - Como posso fazer?
5. Defina os requisitos necessários para iniciar
    - Quando tenho possibilidade de fazer?
6. Identifique obstáculos
    - Existe algum impedimento?
7. Defina o prazo
   - Quando posso/preciso concluir?
8. Defina o resultado esperado
   - O que pretendo fazer vai atender as expectativas?
9. Faça revisões/avaliações periódicas
    - Está satisfatório? Preciso melhorar? O material está atendendo?

Espero que ajude. Sucesso a todos.

Abraço