Padrões de Projetos – Prototype

Galera, estou fazendo pós-graduação em Engenharia de Software com o foco em Metodologias Ágeis. O curso é ministrado na universidade UNA em Belo Horizonte – MG. É um curso novo e que ensina processos, métodos e novidade que temos no mercado.
Maiores informações você pode encontrar nos link’s:
http://una.br/curso/pos-graduacao-mba-especializacao/pos-graduacao-em-engenharia-de-software-centrada-em-metodos-ageis
http://edgarddavidson.com/?page_id=415

Fiz um trabalho muito interessante sobre Padrões de Projetos utilizando o padrão Prototype. Padrão simples e que pode ser muito utilizado em suas aplicações. Vamos lá!!!

Ler a continuação desse artigo…

Case – Projeto de mobilidade para gestão de Tickets de manutenção da cidade do Rio de Janeiro

Gostaria de compartilhar um case de sucesso que pude participar num dos projetos aqui na Abacomm. Muito orgulho de ter participado desse projeto.

Seguem alguns links com matérias do projeto:

Globo – Jornal Bom Dia RioServiços de manutenção da área portuária serão feitos por concessionária

Cliente: Concessionária Porto Novo

Matéria na TeletimePorto Novo adota app móvel na revitalização da zona portuária do Rio de Janeiro

Ler a continuação desse artigo…

Guia rápido de iOS SDK – iPhone e iPad

Dicas legais e rápidas de desenvolvimento de iOS.

Pretendo ir colocando nessa página várias dicas rápidas de como implementar tarefas comuns e complexas de iOS.

Links maneiros

iOS Development Videos (da Apple)

Blog com exemplos de código para iOS

Installing Mac OS X Snow Leopard In Windows 7

iCodeBlog – Tutoriais

Mobile Orchard – Tutoriais

Livros maneiros

Na amazon

Gravar e ler arquivos

Obter o caminho completo do arquivo na pasta Documents da app, onde você consegue gravar arquivos

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:@"main.log"];

Gravar e ler um array

//Grava um array
[NSKeyedArchiver archiveRootObject:array toFile:fullPathToFileString];
//Lê um array
array = [[NSKeyedUnarchiver unarchiveObjectWithFile:fullPathToFileString] retain];

Adicionar uma linha de texto a um arquivo

- (void)appendMainFile:(NSString *)line {
const char *fullPathChar = [fullPath UTF8String];
FILE *file = fopen(fullPathChar, "a"); //Abre o arquivo no modo append
const char *charLine = [line UTF8String];
fputs("\n", file);
fputs(charLine, file);
fclose(file);
NSLog(@"LOG: %@", line);
}

Guia rápido de Android SDK

Reconhecimento de voz avançado, sem o popup padrão

private void startVoiceRecognitionActivity() {
        SpeechRecognizer s = SpeechRecognizer.createSpeechRecognizer(this);
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "pt-BR");
        intent.putExtra(RecognizerIntent.EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE, true);
        intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
        intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 15000L);
        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"org.musicenjoy");
 
        intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,20);
        //Define o listener
        s.setRecognitionListener(new RecognitionListener() {
            public void onRmsChanged(float rmsdB) {
            }
            public void onResults(Bundle results) {
                L.log("onResults bundles: ");
                if (results != null) {
                    for (String key : results.keySet()) {
                        Object val = results.get(key);
                        if (val == null)
                            L.log("    " + key + ": null");
                        else if (val instanceof List) {
                            List l = (List)val;
                            for (Object object : l) {
                                L.log("            " + object);
                            }
                        } else
                            L.log("    " + key + ": " + val.getClass().getName());
                    }
                }
            }
            public void onReadyForSpeech(Bundle params) {
                L.log("onReadyForSpeech bundles: ");
                if (params != null)
                    for (String key : params.keySet())
                        L.log("    " + key + ": " + params.get(key));
            }
            public void onPartialResults(Bundle partialResults) {
                L.log("onPartialResults partialResults:");
                if (partialResults != null) {
                    for (String key : partialResults.keySet()) {
                        Object val = partialResults.get(key);
                        if (val == null)
                            L.log("    " + key + ": null");
                        else if (val instanceof List) {
                            List l = (List)val;
                            for (Object object : l) {
                                L.log("            " + object);
                            }
                        } else
                            L.log("    " + key + ": " + val.getClass().getName());
                    }
                }
            }
            public void onEvent(int eventType, Bundle params) {
                L.log("onEvent eventType: " + eventType + " bundles:");
                if (params != null)
                    for (String key : params.keySet())
                        L.log("    " + key + ": " + params.get(key));
            }
            public void onError(int error) {
                L.log("onError error: " + error);
            }
            public void onEndOfSpeech() {
                L.log("onEndOfSpeech");
            }
            public void onBufferReceived(byte[] buffer) {
            }
            public void onBeginningOfSpeech() {
                L.log("onBeginningOfSpeech");
            }
        });
        s.startListening(intent);
}

Delete files recursively / Apagar arquivos recursivamente

public static void recursiveDelete(File fileOrDirectory) {
if (fileOrDirectory.isDirectory())
for (File child : fileOrDirectory.listFiles())
recursiveDelete(child);
fileOrDirectory.delete();
}

Android applications icons sizes / Tamanhos dos ícones nas aplicações Android

http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#screens-table

Hide title bar / Ocultar barra de título

No arquivo manifest da app adicione:

<pre>android:theme=”@android:style/Theme.NoTitleBar”</pre>

No onCreate da Activity adicione:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
requestWindowFeature(Window.FEATURE_NO_TITLE);
//...
}

Idéias para artigos!

Idéias

Bom dia galera!!!

Estou postando hoje sobre idéias para artigos com intuito de postar necessidades dos desenvolvedores que seguem o DevMobile.
Enviem por esse post comentários, idéias para podermos postar no blog.

Conto com sua idéia!

BlackBerry Developer Day 2010

BlackBerry Developer Day 2010 - BlackBerry Torch

Estou participando do BlackBerry Developer Day 2010.

O evento está ótimo. Bastante desenvolvedores participando.

De acordo como mostrado nas apresentações de negócio, há grande chance de sucesso com aplicativos BlackBerry no Brasil.

Também grande oportunidade aos desenvolvedores, que poderão contar com maior apoio da RIM no Brasil. Um grupo de desenvolvedores BlackBerry foi criado pela RIM especialmente para os desenvolvedores brasileiros. http://www.bbdevbr.com.

Logo estarei lançando uma série de artigos ensinando a desenvolver aplicações para o SO 6.0.

Datagrid com DataGridTableStyle

Nesse artigo irei mostrar como criar um datagrid na plataforma Windows Mobile com DataGridTableStyle.

Link sobre a classe DataGridTableStyle:

http://msdn.microsoft.com/pt-br/library/system.windows.forms.datagridtablestyle%28VS.90%29.aspx

Iremos popular o DataGrid com os nomes e siglas dos estados do Brasil.

Ler a continuação desse artigo…

Quer levar seu software mobile ao mundo todo? Confira os maiores idiomas.

Já pensou em ter seu software mobile disponível para o mundo inteiro? Veja a lista dos idiomas com sua popularidade. Isso ajuda a decidir por quais idiomas você disponibilizará.

Número de Falantes

Fonte: Ethnologue em 21/10/1997

Idioma            Idioma Principal    Primeiro e Segundo Idioma
----------        -----------------   -------------------------
Mandarin             885 milhão
English              322 milhão        470 milhão
Spanish              266 milhão        362 milhão
Bengali              189 milhão        196 milhão
Hindi                182 milhão        418 milhão
Russian              170 milhão        288 milhão
Portuguese           170 milhão        182 milhão
Japanese             125 milhão
German                98 milhão        121 milhão
 Ler a continuação desse artigo...

Componentes Canvas – Um botão tocável em JME usando Canvas

nokia_touch.jpgEnsinarei como criar um componente reutilizável em Canvas. Criaremos um botão tocável, que você poderá usar em qualquer tela Canvas em JME. Esse botão só deve ser usado em devices Touch Screen.

O funcionamento se dará da seguinte forma. Criaremos uma classe chamada ImageButtom que representará o botão em si. Ele será eficiente de tal forma que será capaz de se pintar na tela Canvas em que ele estiver, e de disparar eventos quando ele for tocado.

Ele pintará uma imagem de fundo, com o design de um botão. Essa imagem poderá ser carregada por ele mesmo, ou poderá ser passada como parâmetro para ele usar. No construtor do botão poderemos informar então o caminho da imagem que ele deve carregar, ou passaremos a imagem diretamente, já carregada, para ele usar. Qual a diferença? Bem, se temos 2 ou mais botões em uma mesma tela, devemos carregar a imagem apenas uma vez em memória e passá-la aos 2 botões. Assim teremos 2 botões usando a mesma imagem em memória. Se passássemos o caminho da imagem para os 2 botões, cada um carregaria a imagem uma vez na memória, desperdiçando memória. Devemos passar o caminho da imagem para o botão apenas quando teremos apenas 1 botão na tela.

Além da imagem, o construtor deverá pedir pela posição X e Y em que o botão deve ser pintado na tela, bem como o label ou texto que deve ser escrito no centro do botão.

Evento de Toque

Como o botão saberá que ele foi tocado? Bem, quando uma tela Canvas é tocada, é chamado o método pointerReleased(x,y) que tem como parâmetros a posição do toque. Isso acontece em toda tela Canvas naturalmente. Precisaremos apenas sobrescrever esse método da tela Canvas e verificar em qual botão da tela o toque aconteceu. Exemplo:

    protected void pointerReleased(int x, int y) {
        //Verifica se o primeiro botão Alerta foi tocado
        if (botaoAlerta.isTouched(x, y))
            return;

        //Verifica se o primeiro botão Sair foi tocado
        if (botaoSair.isTouched(x, y))
            return;
    }

Ler a continuação desse artigo…

Criando uma base de dados para sistemas móveis


Salve leitores do Devmobile, nesse tutorial iremos falar um pouco sobre como criar uma base de dados para seu sistema móvel.

 

Antes de irmos para a prática, vamos saber sobre o SSCE – SQL Server Compact Edition.

Alguns pontos importantes:

   - Pode-se perceber que o próprio nome diz ser uma versão compacta do SQL Server;

   - O SSCE pode atingir um tamanho máximo de 4 GB de dados, possuindo total compatibilidade com ADO.NET, Transact SQL, oferece grandes facilidades de sincronização entre cliente e servidor;

   - Total integridade com suporte a DELETE’s e UPDATE’s;

   - Arquivos de dados protegidos com senha e criptografia de 128 bits;

   - Suporte a transações, permitindo Rollback e Commit;

   - Grande número de funções, como: SUM, AVG, COUNT, INNER JOIN, RIGTH JOIN E INNER JOIN, SUBSELECT, GROUP BY, HANVING;

   - Cursores de dados.

 

Com isso temos uma importante forma de guardar os dados de nossas aplicações no próprio aparelho móvel.

Podendo inserir, alterar, excluir informações no sistema móvel e no fim do trabalho podendo sincronizar os dados para o servidor web.

  Ler a continuação desse artigo…

Executando Thread – Windows Mobile

Nesse tutorial vou ensinar como criar, executar e parar uma Thread para que você utilize em sua aplicação, abaixo um simples entendimento sobre Thread.

Thread é utilizada para criar uma ou várias operações concorrentemente ou simultaneamente através das chamadas “Linhas de execução”.

Quando sua aplicação está sendo feita uma conexão onde ela está recebendo dados e você decide ao mesmo tempo fazer algum processo ou tarefa (como mensagens ao usuário, fazer uma nova conexão ou outro processo que deseja fazer) utilizamos o conceito de Thread.

Vamos fazer uma aplicação onde teremos um menu com 2 opções, sair da aplicação e ativar a thread. Depois de ativar a thread teremos um campo Text para digitarmos algo enquanto a Thread é executada.

Ler a continuação desse artigo…

Arquivo .CAB para aplicações Windows Mobile

Neste tutorial ensinarei como criar o arquivo de instalação de uma aplicação Windows Mobile. Bastante simples…

  Ler a continuação desse artigo…

System.Drawing – O Canvas do Windows Mobile


Neste artigo vamos aprender algumas funcionalidades de System.Drawing, sendo que vamos ver mais a parte de como programar utilizando as classes desse namespace, que podemos utilizar para fazer gráficos, escrever textos, imagens e muitas outras funcionalidades.

Para os desenvolvedores Java (J2ME), o System.Drawing é o Canvas para o Windows Mobile.

  Ler a continuação desse artigo…

Sua aplicação BlackBerry iniciando automaticamente no boot

Em algumas situações é necessário que sua aplicação seja iniciada automaticamente durante o boot. Para fazer isso é muito simples, basta adicionar ao seu JAD um parâmetro de flags que o BlackBerry usa, com valor 1.

Manifest-Version: 1.0
RIM-COD-Module-Name: xxxxxxxxx
RIM-COD-Module-Dependencies: net_rim_cldc,net_rim_os
...
MIDlet-Permissions: xxxxxxxxx
MicroEdition-Profile: MIDP-2.0
RIM-MIDlet-Flags-1: 1

Feito isso, sua aplicação será iniciada automaticamente quando for instalada, e também quando der um boot no aparelho. Ela será iniciada em background, ou seja, embora você instancie telas, elas não serão mostradas. Quando o usuário entrar na aplicação ela será colocada em foreground, e aí sim ele verá as telas. Se ao iniciar a aplicação, no boot, você já quiser que o usuário veja a tela, se quiser que a aplicação já inicie em foreground, basta chamar o método requestForeground() do seu objeto UiApplication.

Você ainda pode definir outros valores para a flag, veja a baixo:

RIM-MIDlet-Flags-1: 0 //Normal application
RIM-MIDlet-Flags-1: 1 //Auto-Startup
RIM-MIDlet-Flags-1: 2 //System Module
RIM-MIDlet-Flags-1: 3 //System Module & Auto-Startup

Framework para gerar aplicações multiplataforma JME e nativas BlackBerry sem saber JME nem BlackBerry

Julien - Framework para gerar aplicações multiplataforma JME e BlackBerry em saber JME nem BlackBerryAqui na empresa, todas as aplicações são feitas em Canvas para melhor qualidade visual. A maioria de nossas aplicações devem rodar em JME e nativamente em BlackBerry. Aplicações BlackBerry usam APIs da própria RIM, embora as aplicações nativas BlackBerry suportem a maioria das APIs JME. Quando se desenvolve aplicações BlackBerry, as telas e uso de classes para controle de interface gráfica são bem diferentes da API do JME. Normalmente, se quiser ter a mesma aplicação JME rodando nativamente em BlackBerry deve-se criar um novo projeto, refazendo cerca de 80% da aplicação.

Visto que aqui na empresa, normalmente, as mesmas aplicações JME devem também rodar nativamente em BlackBerry, iniciei há um ano o desenvolvimento do Julien, um framework para desenvolvimento de aplicações multiplataforma. Implementei no Julien classes específicas para interface gráfica, imagens, fontes, controles gráficos, requisições HTTP, persistência, etc. Toda a interface gráfica do Julien é feita em Canvas puro, cada controle gráfico como listas, combobox, caixas de texto, checklist, botões, menus, caixas de diálogos, etc, foi desenhado na mão, e está pronto e disponível para o desenvolvedor simplesmente usar em suas telas.

Ler a continuação desse artigo…

Exemplo Completo e Simples de Conexão HTTP em JME

Já havia feito um post, há alguns meses, mostrando como fazer conexões HTTP em JME de forma bastante completa. Mas em muitos casos as pessoas só querem aprender o conceito, como fazer de forma simples. Abaixo segue 2 classes, a classe do MIDlet e a classe do Form. O Form mostra um comando para iniciar a conexão e a conexão é feita, mostrando um log da conexão na tela, e a resposta do servidor na tela.

Ler a continuação desse artigo…

Como fazer sua aplicação agendar um compromisso abrindo o Calendário BlackBerry

blackberry_agenda.jpgCitei nos posts passados como integrar sua aplicação com o SO BlackBerry, fazendo com que sua aplicação inicie chamadas, envie e-mails e SMS. Agora vou mostrar como é fácil fazer com que sua aplicação marque um compromisso para o usuário, na agenda/calendário do BlackBerry.

Isso pode ser muito útil em aplicações comerciais. Por exemplo, imagine que sua aplicação tenha uma tela com o cadastro do cliente, com nome, telefone, endereço, informações sobre a conta, etc. Se o usuário quisesse agendar um compromisso, ele deveria sair da sua aplicação, iniciar o calendário, criar um novo compromisso, digitar demoradamente cada ítem do compromisso. Isso é até desanimador, e acaba desestimulando o uso da agenda. Com este recurso você adiciona um ítem de menu na tela de cliente de sua aplicação chamado “Agendar Compromisso”. Quando o usuário clica nesse ítem, abre a agenda do BlackBerry com o novo ítem já criado, com as informações já preenchidas do Nome do Cliente, Local, Anotações sobre o cliente, título do compromisso, e tudo maisque você julgar necessário.

Exemplo:

Colocar na sessão de IMPORTS:

import javax.microedition.pim.Event;
import javax.microedition.pim.EventList;
import javax.microedition.pim.PIM;
import net.rim.blackberry.api.invoke.CalendarArguments;
import net.rim.blackberry.api.invoke.Invoke;

Método de Exemplo:

public void marcarCompromisso(String titulo, String local, String notas) {
    try {
        Event e = null;
        EventList el = (EventList)PIM.getInstance().openPIMList(PIM.EVENT_LIST, PIM.READ_WRITE);
        e = el.createEvent();
        e.addString(Event.SUMMARY, 0, titulo);
        e.addString(Event.LOCATION, 0, local);
        e.addString(Event.NOTE, 0, notas);
        long start = System.currentTimeMillis() + 86400000;
        e.addDate(Event.START, 0, start);
        e.addDate(Event.END, 0, start + 3600000);
        Invoke.invokeApplication(Invoke.APP_TYPE_CALENDAR, new CalendarArguments(CalendarArguments.ARG_NEW, e));
    } catch (Exception e) {
        Invoke.invokeApplication(Invoke.APP_TYPE_CALENDAR, new CalendarArguments(CalendarArguments.ARG_NEW));
    }
} 

Bons códigos!

Python for S60 no Nokia Code Camp – Rio

nokia-e71-grey-steel.jpgParticipei do Nokia Code Camp aqui no Rio, hoje, na sessão de Python for S60.

Foi muito proveitoso. Os participantes conseguiram desenvolver aplicações muito legais em apenas 5 horas! Mesmo sem nunca terem mexido com Python, em sua maioria. Vou citar as aplicações que foram desenvolvidas:

1- Messenger via bluetooth, com recurso de envio de fotos tiradas na hora, e envio de mensagens de voz.

2- Reconhecimento de placa de automóveis por meio de fotos tiradas da câmera.

3- Reconhecimento geométrico à partir de imagens. Enquanto se mirava a câmera do celular numa caneta, o Python fazia o reconhecimento da imagem e identificava a localização da ponta da caneta em tempo real.

4- Facilitadores de uso de telefone para idosos e crianças. Foi desenvolvida uma aplicação integrada à API de telefonia, de forma que o usuário podia iniciar e controlar ligações apenas com movimentos, sem ter que ficar olhando pra tela.

5- Software alarme anti-furto de celular. Se você tocasse num celular com o alarme ativo, ele disparava som de alarme, e a tela/teclado de todo o aparelho ficavam travados. Só tirando a bateria ou jogando na água que o bicho parava! O dono do celular para desligar o alarme simplesmente fazia um movimento previamente programado com o celular e o alarme parava.

6- Vizualizador de fotos grandes com recurso de controlar o scroll da foto virando levemente o celular.

7- Controlador de perfil do aparelho (silencioso, externo, reunião, etc) de acordo com a identificação da antena de telefonia. Por exemplo, quando o usuário está em casa, usando uma determinada antena, ele automaticamente configura o perfil para Normal. Quando está na igreja, silencioso, etc.

Interessante que todas essas aplicações foram feitas em poucas horas. Claro que não foram aplicações plenamente prontas, mas todas estavam funcionais. Claro que com um bug ou outro, normal por se tratar de tão pouco tempo.

O Daniel Rocha mandou muito bem ajudando o pessoal e coordenando o campeonato de Python.

Abraço,

Como usar a API do Acelerômetro no BlackBerry Storm?

bbstorm1.jpgO uso de acelerômetro abre muitas possibilidades legais de desenvolvimento, e agora que o novíssimo BlackBerry Storm possui esse recurso, vale a pena explorá-lo.

Para usar o acelerômetro no BlackBerry Storm você precisa desenvolver usando API nativa, 4.7 ou superior.

É muito simples de usar. Basta que você leia as posições XYZ do acelerômetro, indicando um vetor short para que a API escreva nesse vetor as três posições.

Veja como é fácil:

public short[] leAcelerometro() {
    short[] xyz = new short[3];
    canal.getLastAccelerationData(xyz);
    return xyz;
}

O método acima retorna um vetor com as posições XYZ do acelerômetro.

No entanto, antes de ler o acelerômetro, é necessário abrir um canal com o hardware dele, e fechá-lo quando não for mais necessário fazer leitura do acelerômetro. Você só deve abrir o canal quando realmente for iniciar o uso do acelerômetro, fazendo várias leituras seguidas.

Ler a continuação desse artigo…

Ferramentas de desenvolvimento para BlackBerry Storm, Bold e Pearl Flip

bbstorm.jpgPara os que desejam desenvolver para BlackBerry aproveitando os novos recursos dos novíssimos modelos BlackBerry Storm, Bold e Pearl Flip, a Rim já disponibilizou para download free a nova JDE v4.7 (beta) e novos emuladores para os modelos.

A nova JDE já inclui o emulador para o BlackBerry Storm. É só baixar, integrar ao Netbeans, e desenvolver!

Entre os novos recursos e APIs, pode-se citar:

- Suporte a Touch-Screen em suas aplicações.
- Suporte a orientação (bússola) e rotacionamento automático da tela.
- Suporte a acelerômetro.
- API para controle do teclado virtual.
- Permite que sua aplicação defina o papel de parede do Blackberry.
- Vários novos recursos para controle multimídia.

Ler a continuação desse artigo…

blogarama.com Globe of Blogs EatonWeb Blog Directory