Twitter Bootstrap, layout responsivo e User Experience (UX)

twitter-bootstrapA salvação dos desenvolvedores Back-End, quem nunca sofreu quando chegou à etapa de fazer o Front-End de uma aplicação Web?

Ainda mais hoje em dia que se tornou imprescindível pensar na experiência do usuário (UX). Seu site deve ter padrões de navegação, e ainda renderizar em diversos dispositivos como Tablet, Smartphone, SmartTV, Display Digital e quem sabe até mesmo no display de uma geladeira, além disso deve funcionar em todos os browsers de mercado como Internet Explorer, Chrome e Firefox. Pensando nisso a equipe de desenvolvimento do Twitter criou e compartilhou uma solução open-source chamada Twitter Bootstrap, que conta com padrões de elementos (botões, formulários, tabelas, etc), e também plugins de JQuery, além de estrutura responsiva, fontes web e ícones. Isso permite que suas páginas sejam criadas com facilidade e padronização, tornando o trabalho mais produtivo e com ótima navegação para o usuário.

Apesar de o Twitter Bootstrap ser uma ótima solução, até mesmo para quem quer criar um padrão de interface apenas com base nessa arquitetura, o trabalho de um profissional ou equipe de UX ainda é imprescindível, e com certeza terá uma solução mais adequada ao usuário de cada produto desenvolvido.

Aqui vai o link do projeto: http://getbootstrap.com/

Em breve complementarei com exemplos práticos e dicas sobre belos templates que podem ser comprados e customizados.

Marcado com: , , , , , , ,
Publicado em API, CSS, HTML, Informática, javascript, jquery, plugin

Dica para quem curte podcast, chegou o WeCast Podcasts (Aplicativo)

wecast-logoJá faz um certo tempo que eu ouço meus podcasts pelo aplicativo MegabogaCasts (para iOS), que agora ficou ainda mais interessante na nova versão chamada WeCast, que conta com uma nova identidade visual e traz diversas novidades e melhorias!

O grande diferencial do aplicativo é que, além da tocar o áudio, o WeCast é também uma plataforma onde os usuários compartilham imagens e textos relacionados os assuntos temas dos episódios.

Imagine a seguinte situação: você está ouvindo um podcast quando um participante cita algum tópico que você desconhece ou não lembra bem. Pode ser o nome de um ator não tão famoso, um título de filme, um personagem, um game ou um acontecimento histórico, por exemplo. Não seria interessante poder olhar para a tela do seu iPhone/iPod/iPad e nesse momento poder ver uma foto ou texto informativo a respeito do assunto em questão? No WeCast isto é possível, e o mais incrível é que são os próprios usuários que adicionam este conteúdo extra. O aplicativo se assemelha a uma Wikipedia visual dos podcasts.

O WeCast já está disponível na Apple App Store, no link: https://itunes.apple.com/br/app/wecast-podcasts-antigo-megaboga/id521335484?mt=8

Visão geral:

  • Usabilidade: Não encontrei problemas na navegação, e tudo é bem intuitivo e segue um bom padrão para quem está acostumado com Podcasts.
  • Áudio: Faz uso de todos os recursos do iOS, como pausar um podcast durante um evento de ligação, ouvir em segundo-plano, ou utilizar recursos de áudio como play e pause pelo fone de ouvido (ótimo para caminhadas).
  • Interface: O visual é clean, padronizado e organizado
  • Diferencial: Ouvir podcasts e acompanhar conteúdos como textos, imagens e links, isso é muito interessante, pois antigamente eu perdia um tempo para anotar e depois acessar links e imagens que eram comentados nos podcasts.
  • Social: O aplicativo conta com o famoso Connect Facebook, isso é ótimo, pois está integrado com a rede social mundialmente usada para login.
  • Nota final: cinco-estrelas

Veja algumas telas do App:

wecast-05 wecast-01 wecast-02 wecast-03 wecast-04

recomendado

Marcado com: , , , , , , , , , , , ,
Publicado em Informática, Review

Connect Facebook em Java utilizando Google Gson e Apache Http Client

Como estou utilizando o meu Connect Facebook em um projeto Web utilizando o VRaptor como MVC, você encontrará a anotação @Component do VRaptor, mas nada impede que você utilize a mesma lógica em outros projetos Web ou Mobile.

Se você chegou nesse passo, é bem provável que você já tenha se cadastrado como desenvolvedor do Facebook pelo site: http://developers.facebook.com/

E também que já tenha inserido esse link do connect Facebook no HTML do seu site:

<a class="button facebook x18 center" href="https://www.facebook.com/login.php?api_key=1231545...

Caso você tenha alguma duvida nos passos de cadastro e na geração do link do Connect, é só postar a sua dúvida que responderei, e posso criar um POST sobre isso.

Vamos ao Java:

O callback do Facebook após o usuário digitar seus dados de acesso envia o code do Facebook por Query string para esse serviço do meu site: /auth/facebook/callback. No VRaptor tenho esse metodo Get no meu Controller:

@Get
@Path("/auth/facebook/callback")
public void facebookOauth(String code, String state) {
	UserFacebook userFacebook = userFacebookFactory.get(code);
	...
}

Vamos lá, a classe FacebookAuthUrl.java serve para gerar a url de solicitação de accessToken do Facebook. Essa URL é formada com seus dados de desenvolvedor do Facebook, no caso os dados da sua aplicação que são apiKey e secret, além disso precisaremos do code que você recebeu por Query string na sua url de callback do connect Facebook conforme falei no passo anterior. Essa URL serve para gerar um token de acesso que servirá para você solicitar os dados do usuário do Facebook, essa URL poderá ser consumida apenas uma vez, caso você tente acessá-la mais de uma vez o Facebook retornará uma exceção de autorização.

package br.com.denissys.social.facebook;

import br.com.caelum.vraptor.ioc.Component;

/**
 * @author Denis Santos
 */
@Component
public class FacebookAuthUrl {

	private static final String API_KEY = "100000"; // get this info on your developer facebook account

	private static final String SECRET = "xptoCode0123456"; // get info key on your developer facebook account

	private static final String URL_CALLBACK = "http%3A%2F%2Fwww.DOMINIO_DO_SEU_SITE.com.br%2Fauth%2Ffacebook%2Fcallback";

	private static final String REDIRECT_URI = "https://graph.facebook.com/oauth/access_token?"
			+ "client_id=" + API_KEY
			+ "&redirect_uri=https://graph.facebook.com/oauth/access_token?"
			+ "client_id=" + API_KEY
			+ "&redirect_uri=" + URL_CALLBACK
			+ "&client_secret=" + SECRET + "&code=";

	public String getUrl(final String authCode) {
		return REDIRECT_URI + authCode;
	}
	
}

Agora vamos para o próximo passo, que será fazer a chamada dessa url pelo framework Apache HTTP Client na classe FacebookAccessTokenFactory.java.

package br.com.denissys.social.facebook;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import br.com.caelum.vraptor.ioc.Component;

/**
 * @author Denis Santos
 */
@Component
public class FacebookAccessTokenFactory {

	private FacebookAuthUrl facebookAuthUrl;

	public FacebookAccessTokenFactory(FacebookAuthUrl facebookAuthUrl) {
		this.facebookAuthUrl = facebookAuthUrl;
	}

	private static final int FB_ACCESS_TOKEN_PARAM = 2;

	public String get(final String code) throws ClientProtocolException, IOException {

		HttpGet getRequest = new HttpGet(facebookAuthUrl.getUrl(code));
		HttpResponse response = new DefaultHttpClient().execute(getRequest);
		BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

		Pattern pt = Pattern.compile("[\\?@begin@]([^&=]+)=([^&=]+)");
		Matcher params = pt.matcher("@begin@" + reader.readLine());

		String accessToken = "";
		if (params.find()) {
			accessToken = params.group(FB_ACCESS_TOKEN_PARAM).toString();
		}
		return accessToken;
	}

}

Como você pode ter percebido, até agora foi apenas um fluxo de autorizações do Facebook, é uma forma de controlar o acesso aos dados. O próximo passo será utilizar a classe UserFacebookFactory.java que retornará um usuário do Facebook representado pelo Bean UserFacebook.java. A nossa fábrica de usuários fará uso da API Rest oAuth do Facebook, faremos o uso do serviço “/me” para obter dados como nome, sobrenome, idade, localidade e sexo.

Veja esse trecho de código:

UserFacebook userFacebook = new Gson().fromJson(userFacebookJson, UserFacebook.class);


Aqui estou utilizando o framework Gson do Google, logo abaixo você encontrará o Bean UserFacebook.java, o que eu faço é mapear no Bean as propriedades do Json retornadas pelo Facebook, e o Gson faz a conversão do Json do Facebook para o nosso Bean.

Ou seja, um Json com o atributo user{“firstName”: “Denis”} será serializado para o objeto pela annotation @SerializedName(“firstName”).

package br.com.denissys.social.facebook;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import br.com.caelum.vraptor.ioc.Component;

import com.google.gson.Gson;

/**
 * @author Denis Santos
 */
@Component
public class UserFacebookFactory {

	private static final String URL_USER_DATA = "https://graph.facebook.com/me?access_token=";

	private FacebookAccessTokenFactory facebookAccessTokenFactory;

	public UserFacebookFactory(
			FacebookAccessTokenFactory facebookAccessTokenFactory) {
		this.facebookAccessTokenFactory = facebookAccessTokenFactory;
	}

	public UserFacebook get(final String code) {

		final String accessToken = getAccessToken(code);

		Reader userFacebookJson = new InputStreamReader(getFacebookJson(URL_USER_DATA + facebookAccessTokenFactory.get(code)));
		UserFacebook userFacebook = new Gson().fromJson(userFacebookJson, UserFacebook.class);

		return userFacebook;
	}

	private InputStream getFacebookJson(final String url) {

		HttpGet getRequest = new HttpGet(url);

		try {
			HttpResponse getResponse = new DefaultHttpClient().execute(getRequest);

			if (getResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
				return null;
			}
			return getResponse.getEntity().getContent();
		} catch (IOException e) {
			getRequest.abort();
		}
		return null;
	}

}

E aqui vai o nosso Bean que representa um usuário do Facebook

package br.com.denissys.social.facebook;

import java.io.Serializable;
import lombok.Getter;
import com.google.gson.annotations.SerializedName;

/**
 * @author Denis Santos
 */
public class UserFacebook implements Serializable {

	private static final long serialVersionUID = 1L;

	@Getter
	@SerializedName("id")
	private Long id;

	@Getter
	@SerializedName("name")
	private String name;

	@Getter
	@SerializedName("first_name")
	private String firstName;

	@Getter
	@SerializedName("last_name")
	private String lastName;

	@Getter
	@SerializedName("link")
	private String link;

	@Getter
	@SerializedName("username")
	private String username;

	// MM/DD/YYYY
	@Getter
	@SerializedName("birthday")
	private String birthday;

	@Getter
	@SerializedName("gender")
	private String gender;

	@Getter
	@SerializedName("email")
	private String email;

	@Getter
	@SerializedName("timezone")
	private Integer timezone;

	@Getter
	@SerializedName("locale")
	private String locale;

	@Getter
	@SerializedName("verified")
	private Boolean verified;

	// 2013-03-22T02:14:27+0000
	@Getter
	@SerializedName("updated_time")
	private String updatedTime;

}

Repare que não estou escrevendo os Getters (getIdI() … etc), estou usando um framework bem produtivo chamado Lombok, ele torna o seu código menos verboso, recomendo que você leia esse post da Caelum http://blog.caelum.com.br/java-menos-verboso-com-lombok/ para aprender a implementá-lo (é muito fácil e produtivo).

Marcado com: , , , , , , , , , , , ,
Publicado em API, Java

Combos Estado e Cidade em javascript

Sempre que vou desenvolver um sistema que envolve cadastro, me lembro que tem os populares combos Estado e Cidade. Em uma googlada rápida encontrei esse projeto cidades-estados-js no Google Code, o que facilita a vida.

Veja como é simples, você importa esse javascript:

<script type="text/javascript" src="http://cidades-estados-js.googlecode.com/files/cidades-estados-1.0.js"></script>

Crie seus combos de Estado e Cidade no HTML:

<select id="estado" ></select>
<select id="cidade" ></select>

E para finalizar, você inicia o Objeto dgCidadesEstados que carregará o combo estado e adiciona os eventos de combos aninhados

<script type="text/javascript">
window.onload = function() {
   new dgCidadesEstados({
      estado: document.getElementById('estado'),
      cidade: document.getElementById('cidade')
   });
}
</script>

Para tirar mais dúvidas, acesse: https://code.google.com/p/cidades-estados-js/

Marcado com: , , , , , ,
Publicado em javascript, plugin

Manual de sobrevivência para trabalhar com git controle de versão

Resolvi fazer um tutorial de comandos básicos de git, um guia de sobrevivência.

Primeiro baixe e instale o git

Mac OSX: https://code.google.com/p/git-osx-installer/downloads/list?can=3

Windows: https://code.google.com/p/msysgit/downloads/list?can=3

Linux: http://git-scm.com/book/en/Getting-Started-Installing-Git

 

Crie um repositório novo

Escolha um diretório do seu computador, crie uma nova pasta, abra a pasta e execute o comando:

git init

Para criar uma cópia de trabalho em um repositório local, execute o comando

git clone /caminho/repositório

Para repositórios remotos, o comando será
git clone usuário@servidor:/caminho/para/o/repositório

 

Fluxo de trabalho
Seus repositórios locais consistem em três “árvores”
1a – Working Directory: contém os arquivos vigentes.
2a – Index: funciona como uma área temporária
3a – HEAD: aponta para o último commit feito

 

Adicionar e confirmar
Você pode realizar mudanças (adicioná-las ao Index) usando o comando:
git add <arquivo>
ou
git add *

 

Commit

Pronto, agora você já está sabendo o básico, esse foi o primeiro passo no fluxo de trabalho básico do git. Mas para efetivar as mudanças no repositório, ou seja, fazer um commit, use:

git commit -m “comentário da alteração ou das alterações”

Isso faz com que os arquivos sejam enviados para o HEAD do repositório local (mas ainda não para o repositório remoto).

Enviando alterações para o repositório remoto
Suas alterações agora estão no HEAD da sua cópia de trabalho local. Para enviar estas alterações ao seu repositório remoto, execute o comando:
git push origin master

Altere master para a branch desejada, enviando suas alterações para ela.

Caso você não tenha um repositório local clonado, execute esse comando:
git remote add origin <servidor>

Assim você pode enviar suas alterações para o servidor remoto.

Marcado com: , , , , , , , , ,
Publicado em Dicas

Começando uma startup

image

Já faz algum tempo que eu e a minha esposa queremos empreender juntos, fazer um site, algum tipo de E-commerce.

Bom, o principal já conseguimos, a ideia, o publico alvo, e até bolamos um logotipo. Mas nada de criar um escopo grande que leve meses, pois ambos trabalhamos, então essa atividade secundária precisa ser bem focada em funcionalidades que ajudem a validar o nosso negócio rápidamente. Para quem já está familiarizado com o conceito de MVP, já sabe do que estou falando, para quem não conhece, é simples: Nós criamos hipoteses, pequenas hipoteses que possam ser validadas rápidamente, assim não gastamos muito tempo para descobrir a aderência dos usuários em cada passo dado. Isso facilita para conseguir testar o produto em tempo real de desenvolvimento, além de possibilitar outras frentes, como construção de público alvo, redes sociais, frequentar eventos de startup e até aproximações com concorrentes e futuros investidores. O mais importante, é que permite mudar a estratégia rápidamente, descobrir impeditivos, e encontrar soluções.

Em nossa primeira semana de projeto (primeiro Sprint), fizemos o seguinte:

1 – Ideia definida;

2 – Como o nosso produto é um site, foi necessário criar um nome e registrar um domínio (tarefa difícil, rs);

3 – Logotipo criado (bem papel de pão, nada de gastar com ilustrador ainda);

4 – Landing page no ar (uma página inicial para divulgar o site e capturar usuários);

5 – Criação de Fanpage e Twtitter;

6 – Projeto Web iniciado, escolhi um framework MVC agil que facilite a criação de CRUD de cadastro, ferramenta de upload de imagem, integração com plugins sociais, facilidade de deploy na nuvem com baixo custo, ótima compatibilidade com diversos tipo de Banco de Dados incluindo os NoSQL.

7 – O front-end da aplicação é algo que também deve ser bem pensado, nós compramos um template baseado no Twtitter Bootstrap que permite responsividade, em outras palavras, ele se ajusta tanto em um celular, tablet como em um Desktop.

Então, enquanto o site é desenvolvido com o CRUD básico, a minha esposa já pode iniciar campanhas divertidas no Facebook e Twitter, fazendo com que em paralelo nós tenhamos um bom número de usuários aguardando pela inauguração do site.

Marcado com: , , , , ,
Publicado em Empreendedorismo

Utilizando Amazon RDS MySQL e Hibernate

Essa semana eu precisei ativar um novo serviço da Amazon Web Services (AWS), que foi o RDS MySQL.

A minha necessidade de utilizar o RDS para MySQL foi para uma aplicação Web utilizando Java com os frameworks VRaptor e Hibernate, então descreverei o passo a passo para ajudar futuros desenvolvedores, e caso fique alguma dúvida, sinta-se a vontade para fazer perguntas. Vamos lá!

Passo a passo:

Primeiramente você precisa acessar a sua conta na Amazon Web Services, para isso faça:

Se você não tem uma conta, crie acessando aqui: http://aws.amazon.com/pt/

amazon-aws-cadastro

Se já possui uma conta, acesse: http://aws.amazon.com/pt/console/, e faça o seu login:

amazon-aws-login

Agora que você acessou a sua conta, clique no item RDS do menu de serviços:

amazon-aws-console

Agora você verá a página Amazon RDS Console Dashboard, clique no botão

botao-launch-a-DB-Instance

E veremos um Wizard para a configuração da nova instância de banco de dados, selecione MySQL clicando em Select e vamos lá:

amazon-aws-rds-mysql-wizard

Aqui não tem segredo, é um Wizard bem simples, recomendo que você leia sobre a precificação http://aws.amazon.com/pt/rds/mysql/#pricing, e escolha o que for melhor para a necessidade do seu projeto e/ou empresa. Eu comecei com a instância micro, que é a mais adequada para a fase de testes.

amazon-aws-rds-mysql-wizard-step2

Os próximos passos são simples, nome de Schema, decidir se vai ativar backup, podemos fazer um post futuro sobre essas configurações extras. Clique em continuar, preencha os campos conforme instruções da Amazon (passe o mouse sobre o label e verá uma explicação com um exemplo do que deve ser preenchido na caixa de texto ao lado).

Agora que finalizamos o Wizard, clique no menu Dashboard e em seguida no menu DB Instances

amazon-aws-rds-dbInstance

Selecione a sua instância, e logo abaixo verá algumas informações importantes, que são Endpoint e Port, será com esses dados que você poderá acessar o seu banco de dados remotamente, ou seja, por um Client de MySQL ou pela sua aplicação em ambiente localhost

amazon-aws-dbInstance-config

Mas calma, antes de acessar, você precisa criar uma regra de segurança, onde liberaremos o acesso do seu computador ao ambiente da Amazon RDS. Vamos precisar do seu IP, para descobrir o seu IP use esse serviço da Amazon http://checkip.amazonaws.com/, copie o IP que apareceu. Agora voltando para a página de DB Security Group, selecione a regra default e adicione o IP que você copiou, ficando algo assim 1.1.1.1/32, clique em adicionar e pronto. Veja:

amazon-aws-dbInstance-security

Volte para o menu DB Instances, selecione a sua instância e copie o valor do Endpoint, ele é o endereço que usaremos para acessar o banco de dados, também copie o valor da porta, recomendo deixar o valor default, que é 3306.

Abra o terminal ou msdos, e de um ping no Endpoint:

endpont-to-hostname
Veja que ao lado esquerdo do IP [23.22.138.43] você terá o HOSTNAME da sua máquina na Amazon, copie esse HOSTNAME, precisaremos dele para configurar o hibernate. O seu arquivo hibernate.cfg.xml deve ficar parecido com este:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
		<property name="hibernate.connection.charSet">utf8</property>
		<property name="hibernate.connection.characterEncoding">utf8</property>

		<!-- Amazon AWS RDS -->
		<property name="hibernate.connection.url">jdbc:mysql://ec2-XX-22-138-43.compute-1.amazonaws.com:3306/nome_do_SCHEMA</property>
		<property name="hibernate.connection.username">usuario</property>
		<property name="hibernate.connection.password">senha</property>

		<property name="default_schema">Veja o nome do Schema no DB Instances</property>

		<property name="hibernate.c3p0.min_size">1</property>
		<property name="hibernate.c3p0.minPoolSize">1</property>
	</session-factory>
</hibernate-configuration>

Espero ter ajudado, e como disse no começo do post, fique a vontade para tirar suas dúvidas aqui no blog.

Marcado com: , , , , , , , , , , ,
Publicado em Pensamentos

How to use jquery lazy load

Lets’s go, show me the code

The full version of JQuery LazyLoad is available on GitHub github.com/denissys/jquery-lazyload-example. Here I will show only the basic steps, on GitHub you can have look in each version and its own achievement.

FIRST:

You need include two JavaScript files

<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery.lazyload/1.8.4/jquery.lazyload.min.js"></script>

SECOND:

Insert this code to activate the LAZY LOAD (the parameter [effect] is optional)

$(function() {
   $("img").lazyload({
       effect : "fadeIn"
   });
});

LAST:

In the image tag, add the attribute [src] with the small image, because it will be first loaded. And on attribute [data-original] insert the large image, it will be uploaded latter.

<img data-original="assets/img/ferrai-large.jpeg" src="assets/img/github-small.png" height="500px" />

Click here to see the DEMO (example)

http://www.denissantos.com.br/assets/examples/jquery/jquery-lazyload/index.html

Marcado com: , , , , , , , , , ,
Publicado em javascript, jquery, performance, plugin, scalability

Uma maneira simples de encontrar um delivery, conheça o Deliveria

Quem nunca precisou procurar por restaurantes de delivery no Google? Então com certeza você precisou acessar dezenas de sites, cada um com o seu padrão, fonte, cor… e o pior, nunca encontramos o que realmente queremos, e quando encontramos, a localidade não atende no seu CEP.

O Deliveria promete solucionar esse tipo de pesquisa, isso mesmo, o Deliveria é um agregador de sites de delivery, se isso não fez sentido para você, imagine que o Deliveria é um Google especializado em restaurantes de delivery, o site faz pesquisas inteligentes por restaurantes próximos do seu CEP. São poucos segundos de pesquisa, e o Deliveria encontra os melhores restaurantes, permitindo filtrar por tipo de culinária.

Acesse e veja como é simples www.deliveria.net

Matérias recentes sobre o Deliveria Dica da semana: Conheça o mais novo portal agregador de serviços delivery de restaurantes

Publicado em agregador de delivery, agregador de sites de delivery, Deliveria, Delivery, Gastronomia, Matérias

Você tem uma boa idéia? Então tenha um bom planejamento!

É muito comum as pessoas terem seu momento especial, aquela verdadeira idéia que parece que AGORA VAI! Então você coloca ela em prática, tenta daqui, tenta de lá, e parece que a coisa não vai para frente. A grande questão é “você realmente planejou?”, então aqui vão alguns pontos que devem ser questionados:

Quem será o seu cliente?

Qual público será alvo (A, B, C…)?

Como atingir o público?

Como divulgar a minha idéia?

Quanto tenho para investir?

Quando terei retorno?

Quem são os meus concorrentes?

Qual é o principal fator de risco?

São muitas questões que devem ser respondidas, caso você não saiba, a idéia torna-se MEGA SENA, a chance de uma boa idéia dar certo sem planejamento é a mesma de acertar os 6 números da MEGA. Então planeje, busque parcerias, análise a concorrência, defina metas, saiba quem é o seu público, invista no público certo, planeje bem o marketing e as finanças.

Boa sorte!

Marcado com: ,
Publicado em Idéias, Pensamentos