quarta-feira, 15 de outubro de 2014

sábado, 13 de setembro de 2014

Projeto Euler

Depois de um longo tempo sem visitar o Projeto Euler, retomei recentemente minhas tentativas de resolver os problemas propostos.
Já tinha resolvido alguns, nessa retomada, cheguei aos primeiros 50 resolvidos.
O objetivo é dar uma "desenferrujada" na lógica.
Até hoje, já resolvi 53 problemas e ocupo a posição 60 entre os participantes do Brasil.



quarta-feira, 3 de setembro de 2014

#dicaJava - BigDecimal, cálculo de prestações

 Muitas vezes precisamos calcular uma série de valores, como os valores de uma venda parcelada, a partir de um valor total e o número de parcelas. Ocorre que esse cálculo nem sempre é preciso, muitas vezes vai ocorrer arredondamentos.

 O programa abaixo mostra isso:



Executando:



 Normalmente, quando a diferença é negativa (diminui o valor da parcela), é costumeiro aplicar a diferença nos valores iniciais, caso contrário, nos valores finais. Também, aplica-se as diferenças centavo a centavo.

 Fazendo umas alterações no programa:



Resultado:



Abraço!

#dicaJava - BigDecimal, arredondamento

 Um dos posts mais acessados é no qual tratei sobre os problemas de precisão dos tipos float e double e o uso da classe BigDecimal. http://agorandroid.blogspot.com.br/2012/04/java-valores-monetarios-float-double-e.html
 Segue um programa que uso para selecionar o tipo de arredondamento entre as diversas opções existentes na classe BigDecimal.




Abaixo o resultado da execução:



 Interessante a opção HALF_EVEN, indicada para tratar grande volume de dados, principalmente estatísticos. O arredondamento, quando o valor a ser desprezado é igual a 5, depende do valor do dígito a ser arredondado ser par ou ímpar. Se for par o comportamento é igual à opção HALF_DOWN, se ímpar igual a HALF_UP .

 Vejam o teste abaixo:



 É isso.

 Abraços!

quinta-feira, 21 de agosto de 2014

Promoção da Casa do Código

Promoção da Casa do Código: use o código de desconto abaixo e ganhe 10% de desconto na compra de qualquer livro.
Código de desconto: PARCEIRO-ad9858f4

Link: Casa do Código

Boas compras!

PS: Quem usar o código acima em alguma compra estará ajudando esse blogueiro a ganhar um brinde (se passar de um limite)!
Desde já agradeço!

sexta-feira, 8 de agosto de 2014

Concurso INOVApps

 O Ministério das Comunicações organiza um interessante concurso de apps e games, o INOVApps.
 Segundo o edital: "O Concurso INOVApps é uma das ações da Política Nacional para Conteúdos Digitais Criativos e tem como objetivo apoiar, por meio da concessão de recursos na modalidade premiação, o desenvolvimento de aplicativos e jogos sérios de interesse público para dispositivos móveis e TVs digitais conectadas.".
Os prêmios são de R$80.000,00 para os apps e de R$100.000,00 para os games.

Vale a pena conferir: http://www.comunicacoes.gov.br/concurso-inovapps

Abraços


segunda-feira, 14 de julho de 2014

Aniversário do Blog

O blog está completando 3 anos hoje.
Meus agredecimentos a todos os visitantes.
Aos novos leitores a recepção continua:
Seja muito bem vindo ao “Agorandroid”!

terça-feira, 1 de julho de 2014

Android Auto

Mais novidades Android, agora o Android Auto.
Sistema operacional para automóveis.

Não tenho muitas informações ainda, mas estou esperando que seja útil para controlar dados dos sensores dos autos. Tipo computador de bordo. E a facilidade para trocar esses dados com tablets/smartphones.

Android L, lollipop?

Estava dando uma verificada nas novidades do novo release do Android, codinome L, provavelmente "lollipop".
Novo visual com o "material design".
Novo VM, o ART (Android RunTime) passa a ser o default, antes era opcional.
Controle das Notificações avançadas e controle de energia e recursos (Projeto Volta).

Vamos ver.

sábado, 28 de junho de 2014

Android: acesso SqLite multi-thread

 Estava acompanhando um colega com problemas com acesso concorrente ao banco de dados SqLite, ele conseguiu resolver os problemas com as informações de um artigo que encontrara no blog de um desenvolvedor Android de nome Dmytro Danylyk.
 Como, quem me lê, sabem, sou particularmente interessado em processamento concorrente, então fiz algumas pequenas adaptações na solução do Dmytro para fazer alguns testes.
 Para fazer acesso concorrente no Android é necessário que se faça com uma única conexão ao db, para isso deve-se usar apenas um objeto SQLiteOpenHelper, fiz a classe DatabaseController, um singleton (olha o padrão aqui novamente!), para controlar o acesso ao banco de dados.
 Como é para ser compartilhado por diversas threads todos os métodos são sincronizados. O controle do número de acessos é controlado pelo atributo mOpenCounter, para somente fechar o banco quando for a última solicitação de close, para evitar fechar o banco enquanto uma outra thread ainda esteja em processamento.

 Para os meus testes, fiz um pequeno banco de mensagens, os objetos salvos no banco estão no RowTab.java e fiz um TesteDbAdapter.java para usar o DatabaseController. Para obter uma referência ao controlador usa-se: "DatabaseController.getInstance();". E para inicialização do SQLiteOpenHelper coloquei o método "setDatabaseHelper(contexto);". Para ter uma referência ao SQLiteDatabase usa-se o método open().
 Notem que a abertura do db somente vai ocorrer no primeiro open, e quando o db for criado, esta operação pode ser demorada, por isso, sempre é recomendado executar o primeiro open (caso seja o caso) numa thread diferente da main thread do Android.
 A activity é bem simples e direta, no onCreate chamo o método ativaThread() e nela inicio quatro threads para usar o banco concorrentemente.

Seguem os códigos:

DatabaseController.java


RowTab.java



TesteDbAdapter.java



MainActivity.java


 Para checar, após o fim das threads, aguarde os Toasts terminarem, aperte o back e no onDestroy loga o número de linhas da tabela.

 Testem aí, funciona!

 Abraços.

PS: segue o link do Dmytro https://github.com/dmytrodanylyk/dmytrodanylyk/blob/gh-pages/articles/Concurrent%20Database%20Access.md

domingo, 2 de março de 2014

Teste vocacional para programador

Mãe: Vai ao mercado prá mim?
Você: Claro, mãe. O que a senhora quer?
Mãe: Compre um litro de leite. Se tiver ovos, compre 6.

Voltando das compras:
1- Se não tiver vocação para programação, você entregará para sua mãe:
    a. Se não tinha ovos: 1 litro de leite;
    b. Se tinha ovos: 1 litro de leite e 6 ovos.

2 Se tiver vocação para programação, você terá comprado:
   a. Se não tinha ovos: 1 litro de leite;
   b. Se tinha ovos: 6 litros de leite!



terça-feira, 25 de fevereiro de 2014

Regras para codificação Java no estilo Google

  Foi liberado recentemente pela Google o documento que define as regras para os programadores Java da empresa seguirem na codificação dos programas em Java: Google Java Style

  Interessante, vale uma leitura.

domingo, 23 de fevereiro de 2014

Compartilhar dados entre componentes Android

  Para compartilhar dados entre componentes de uma aplicação Android você deve primeiro decidir entre duas opções: persistir ou deixá-los na memória.
  Se optar pela persistência dos dados, tem as seguintes opções: preferences, files, SQLite DB e Content Provider.
  Se for deixá-los na memória, as opções são: através da dupla Intent/Bundle com os métodos putExtra/getXxxExtra, Uri (intent.setData/intent.getData), Singleton, variáveis/métodos públicos de classe (estáticos) e variáveis/métodos públicos de instância.
Observações:
1. Quando salvar - se for compartilhar os dados entre activities, lembre-se de que devem estar salvos no máximo até o método onPause, devido ao ciclo de vida das activities.
2. Se os dados forem compartilhados entre threads (ou outros recursos que usem threads, como AsyncTasks) e forem mutáveis, lembre-se de torná-los thread-safe.
3. Para enviar objetos por Intent/Bundle eles devem implementar Serializable ou Parcelable, para recuperar com getSerializableExtra ou getParcelableExtra, respectivamente.
4. Uma variação do Singleton é extender a classe Application, mas eu não aprecio muito essa opção.
5. Estude e entenda bem as diferenças entre as opções, as diferenças são às vezes sutis, mas com resultados nem tanto.
Essas são apenas algumas das opções, as mais básicas, mas devem ser úteis na maioria das necessidades do dia-a-dia.
Abraços

terça-feira, 18 de fevereiro de 2014

Dica: aprender uma nova linguagem de programação

A receita é simples: estude os recursos básicos da linguagem, estude os recursos específicos, aprenda com os melhores exemplos de uso avançado, e tente captar o "espírito" filosófico da linguagem.
Não dá para programar bem numa linguagem sem estudar profundamente os seus recursos.
Observe alguém tentando falar uma nova língua com um vocabulário restrito; imagine fazer um programa com algumas poucas instruções.

sábado, 15 de fevereiro de 2014

Mais sobre Singletons, ObjectManager

 Estive fazendo uns testes com Singletons, isso mesmo no plural! Mas não se alarmem, é Singleton mesmo, com unicidade de instância. O plural é devido às diversas técnicas disponíveis.
 Um dos testes que achei interessante publicar é o código que segue abaixo.



 Dei o nome de ObjectManager para a classe, que tem como objetivo guardar referências para objetos a serem utilizadas em mais de um componente do Android. Os objetos são guardados em pares chave e valor, a chave sendo um Long e o valor a referência à uma instância de algum objeto.
 A implementação é thread-safe, uso um HashMap envolto com Collections.synchronizedMap() e um AtomicLong para controlar a geração das chaves.

 Para incluir um objeto usamos o método put(objeto) que retorna um Long que é a chave para recuperar a referência para o objeto, para isso usamos o método get(key).
 Uma vez colocado um objeto no ObjectManager, podemos passar a chave para um componente por um intent.putLong("meuObjeto", chave), e recuperar o objeto recuperando a chave por meio do intent.getLong("meuObjeto").

 Para testar, vamos incluir uma String no ObjectManager e passar a chave para uma intent.

Para recuperar no outro componente, usamos o intent.getLong para recuperar a chave e em seguida acessar o objeto salvo no componente anterior.

Notem que temos dois métodos para eliminar referências desnecessárias, remove e clear. Isso é necessário para evitar gasto de memória e também para evitar dados da sessão anterior mantidos pelo Android. O Android pode manter um processo para o aplicativo, mesmo não tendo nenhum componente ativo ou em background.

Por hoje, é isso.
Abraços.

Projetos

Depois de um longo tempo sem programar, estou retomando.
Nos últimos meses praticamente escrevi uma ou outra linha de código, ou seja, quase nada.
Por outro lado, li muito. Assuntos diversos.
Muita teoria.
Agora o objetivo é ganhar ritmo em programação.
Vamos ver.

terça-feira, 14 de janeiro de 2014

Índice TIOBE de janeiro de 2014

 Estava dando uma olhada no índice TIOBE e duas linguagens me chamaram a atenção: Java e Objective-C.
 Creio que os critérios adotados para coletar os dados não estão conseguindo refletir o crescimento dos desenvolvedores Android. O Objective-C teve um crescimento significativo a partir de meados de 2009, saindo de menos de 0.5% para mais de 11%; o Java está numa curva descendente desde meados de 2002, mas deveria ter um comportamento diferente com a entrada do Android.
 Pelo gráfico, dá a impressão de que a maioria dos desenvolvedores Android já conheciam Java, o que não é totalmente verdade, um grande número aprendeu Java (como eu) para programar Android.
 Então, na minha opinião, se o Objective-C deu um salto de mais de 10%, o Java com o Android também deveria ter tido algum crescimento, pelo menos nos últimos três anos. Não acham?

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html