Todos os posts de Mike Lopes

SWX Labs 08 – Equipes de Alto Desempenho

capa02

No SWX Labs 08 Mike e Vinicius  conversam com Alércio Bressano sobre Equipes de Alto Desempenho.

Alércio nos mostra o caminho das pedras para criar uma equipe de alto desempenho usando metodologias ágeis, notadamente o Scrum. Dos fracassos iniciais à construção de um time de alto desempenho, passando pela conquista da confiança de sua equipe Alércio mostra que inovar em metodologias de trabalho é um caminho possível e real.

Ouça o podcast clicando no play, se preferir faça o download

Assine o feed do nosso podcast e não perca nenhum episódio: http://feeds.feedburner.com/SWXLabs

Se preferir, também estamos no Itunes Store

Gostou? Não gostou? Erramos algo? Sua opinião é muito importante para nós, por isso deixe seu comentário ou envie email para mike@swx.com.br

Imagem: O termo Scrum se origina de uma jogada de Rugby, por isso homenageamos a competente e divertida seleção neozelandeza de rugby.

SWX Labs 07 – Eventos e networking

capa01

No SWX Labs 07 Mike, Vinicius e Benhur  conversam com Roberto Brandini sobre Eventos e Networking.

Nesta papo debatemos sobre os diferentes tipos de eventos, suas características e importância. Como evento e networking andam juntos aproveitamos para debater sobre e dar dicas de networking nestes eventos.

Ouça o podcast clicando no play, se preferir faça o download:

Links

Assine o feed do nosso podcast e não perca nenhum episódio: http://feeds.feedburner.com/SWXLabs

Se preferir, também estamos no Itunes Store

Gostou? Não gostou? Erramos algo? Sua opinião é muito importante para nós, por isso deixe seu comentário ou envie email para mike@swx.com.br

Imagem da capa: GDC Europa

SWX Labs 06 – Python

capa01

No SWX Labs 06 Mike, Vinicius e Tássio conversam com Rodrigo Amaral sobre Python.

Como surgiu a linguagem, qual sua evolução, diferenciais, onde ela é aplicada e como funciona a comunidade que divulga e dá suporte a uma das linguagens de programação que mais cresce e se credencia a ser o Java do futuro.

Ouça o podcast clicando no play, se preferir faça o download

Temas abordados

  • História do Python
  • Particularidades da Sintaxe
  • Ferramentas e aplicações
  • Mercado de trabalho
  • Comunidade e eventos sobre Python

Links

2º GDG Aracaju: Aplicações web com Python e Google App Engine

gdg-aju-python

Assine o feed do nosso podcast e não perca nenhum episódio: http://feeds.feedburner.com/SWXLabs

Se preferir, também estamos no Itunes Store

Gostou? Não gostou? Erramos algo? Sua opinião é muito importante para nós, por isso deixe seu comentário ou envie email para mike@swx.com.br

SWX Direto das trincheiras 03 – Campus Party, Podcasts e Forum de Inovação tecnológica

Neste SWX Direto das trincheiras trazemos as novidades que rolaram na SWX, se perdeu alguma coisa confira:

  • SWX Labs 03 – Editais de Inovação: http://bit.ly/SWXLabs03
    • Bate papo com Marcelo Dósea, sobre Editais de Inovação, sua importância e como se preparar para participar.
  •  SWX Labs 04 – Planejamento: http://bit.ly/SWXLabs04
    • Neste podcast Benhun, gerente de projetos de SWX, fala sobre planejamento. São debatidos conceitos e dicas de como preparar um bom planejamento.
  • 5 formas de utilizar o google alerts para alavancar seu negócio ou carreira: http://bit.ly/GoogleAlerts5Dicas
    • No blog do CIO Market tem dicas interessantes de como aproveitar uma grande ferramenta do google, o Alerts.
  • Model em Ruby on Rails – Parte 02: http://bit.ly/NGczin
    • Segunda parte do artigo explicando um aspecto da aplicação da arquitetura MVC com Ruby on Rails.
  • Uma introdução ao gulp: http://bit.ly/1cCsR4S
    • Saiba mais sobre esse automatizador de tarefas baseado no node.js
  • Desvendando os “Custom Post Types”: http://bit.ly/1iMneoz
    • Para iniciantes e intermediários em wordpress entenderem melhor como personalizar o back end de posts no wordpress.
  • SWX na Startup and Makers da Campus Party 2014: http://bit.ly/1bPGgmy
    • Confira como foi a participação da SWX na Campus Party 2014.
  •  1º Fórum de Inovação, Propriedade Intelectual e Transferência de Tecnologia do IFS (FIPITT) – http://bit.ly/1nwdZqf
    • A SWX participa deste fórum como case de sucesso. Se vc estiver em Aracaju no dia 18/02 apareça no IFS e veja a palestra de Vinicius.

SWX Labs 05 – Projeto 14 Bis

BisOn

No SWX Labs 05 Mike, Ighor, Tássio e principalmente Vinicius , falam sobre o principal projeto em curso na SWX, o 14 BIS.

Saiba a proposta do projeto, como ele surgiu, conseguiu financiamento e está sendo desenvolvido. Além disso, conheça uma história que fala sobre empreendedorismo e dedicação, e o saiba um pouco mais do dia a dia de uma Startup e de como executar um projeto de software.

Ouça o podcast clicando no play, se preferir faça o download

Links

Assine o feed do nosso podcast e não perca nenhum episódio: http://feeds.feedburner.com/SWXLabs

Se preferir, também estamos no Itunes Store

Gostou? Não gostou? Erramos algo? Sua opinião é muito importante para nós, por isso deixe seu comentário ou envie email para mike@swx.com.br

Temas abordados:

  • O que é o 14 BIS

    • Definição

    • CIO Market

    • Vantagens

  • Histórico

    • Surgimento da SWX

    • Insight: Problemas de instalação e manutenção de software para pequenas e médias empresas

    • Inspiração: Loja de aplicativos (Google Play e Apple Store)

    • Solução: Loja de aplicativos que automatiza a instalação de softwares

    • Histórico do desenvolvimento do 14 BIS

  • Processo de desenvolvimento do 14 BIS

    • Seleção de desenvolvedores

    • Andamento do desenvolvimento dos módulos

    • Importância da parceria com a Universidade Federal de Sergipe

  • 14 BIS na prática

    • Como funciona para comprador e fornecedor de software

    • Diferenciais competitivos

  • O futuro do 14 BIS

    • Consolidação dos grupos de projeto

    • Aumento das opções de infraestrutura de nuvem

    • Transformação do CIO Market em plataforma (plataforma como serviço)

 

 

 

SWX na Startup and Makers da Campus Party 2014

Apresentação(Pitch) da SWX na Campus Party

234 Startups, infinitos sonhos, milhares de horas de trabalho e estudo, muita inovação. Foi assim a primeira edição do Startup and Makers da Campus Party Brasil e a SWX estava lá.

O evento aconteceu entre os dias 27 de janeiro e 2 de fevereiro de 2014 na cidade de São Paulo e juntou as empresas mais inovadoras do país em um grande espaço de troca de ideias e experiências. As Startups puderam apresentar seus negócios a investidores e clientes em potencial. Além disso, ganharam um espaço para continuar trabalhando durante o evento.

Vinicius Castro, Diretor da SWX, fala de sua experiência na Campus Party:

“Participar da Campus Party foi  uma ótima oportunidade para fazer contatos e expor as vantagens do negócio para um publico seleto que inclui desde investidores, profissionais altamente qualificados e jornalista, até celebridades do mundo da tecnologia. Também é uma ótima oportunidade de aprendizado, pois são centenas de palestras, encontros e workshop sobre os mais variados assuntos do mundo da tecnologia e dos negócios“.

As Startups foram as estrelas da Campus Party 2014, conforme mostra matéria do site G1, que destaca:

Com a guinada do evento rumo ao desenvolvimento de novos negócios, as startups ganharão o status de estrela da festa. Cerca de 10% do espaço da feira será destinado a 300 empresas iniciantes que começam a ser selecionadas nesta segunda-feira por meio do site da Campus Party. “Vai ser para o empreendedor como estar na Disneyland”, disse Ragageles.

Abaixo veja algumas fotos da nossa participação na Startup and Makers:

Confira Infográfico com o perfil das empresa participantes:

infografico_sm_v1

SWX Labs 04 – Planejamento

capa01

No SWX Labs 04, Mike, Vinicius e Tássio conversam com Benhur, nosso gerente de projetos sobre planejamento.

Esse podcast está sendo publicado no início de 2014 e todo início de ano é época de planejamentos, seja individuais, seja nas empresas. Mas para além de uma passagem temporal, o planejamento é uma tarefa fundamental para a condução do seu negócio e/ carreira. Por isso ouça nosso podcast e saiba melhor o que é planejamento e receba dicas de como executa-lo com suceso.

Temas abordados

  • Conceitos
  • Planejamento aplicado a empresas tradicionais e inovadoras
  • Aplicação de técnicas de planejamento
  • Planejamento como motor da inovação
  • Planejamento na prática

Link

Assine o feed do nosso podcast e não perca nenhum episódio: http://feeds.feedburner.com/SWXLabs

Se preferir, também estamos no Itunes Store

Gostou? Não gostou? Erramos algo? Sua opinião é muito importante para nós, por isso deixe seu comentário ou envie email para mike@swx.com.br

Ouça o podcast clicando no play, se preferir faça o download

* Imagem da capa: StockMonkeys.com

Uma introdução ao gulp

a84cbe09a6fc383b43833c60b3f2aa29

* Por João Paulo

Introdução:

Muitas tarefas são feitas manualmente de forma repetitiva, por exemplo, ao alterar certos arquivos de um site, é necessário fazer o upload para que possam ser acessados pela web; porém, para isso, é necessário abrir o cliente ftp, preencher os dados e conectar, depois selecionar os arquivos e enviar. Além de perder tempo, essas são tarefas chatas a serem feitas, então para isso existem “automátizadores” como o grunt e o gulp.

O gulp é um automatizador de tarefas desenvolvido em cima do nodejs, seu funcionamento será estudado nesse artigo.

Instalando:

Para instalar o gulp é necessário instalar o nodejs (no ubuntu, é só executar o comando #apt-get install nodejs).

Também, obviamente, é necessário instalar o gulp. O gulp é dividido em duas partes, o “gulp CLI” que é o aplicativo para ser executado na linha de comando e o gulp, a biblioteca pro nodejs.

  • Para instalar o CLI, execute: “npm -g install gulp” (npm é o gerenciador de pacotes do nodejs).

  • Para instalar a biblioteca:  “npm install –save-dev gulp”.

Estrutura básica:

O gulp foi desenvolvido sobre o nodejs, logo é necessário ter conhecimento de javascript para poder utilizá-lo.

A primeira coisa a ser feita é criar o arquivo “package.json”, é nesse arquivo que ficam as informações sobre o projeto, como nome, versão e quais bibliotecas estão sendo utilizadas. Outro arquivo importante é o “gulpfile.js”, é esse arquivo que será lido ao executar o gulp no console para executar as automatizações, logo é nele que ficarão nossos scripts.

O “package.json” pode ser criado na mão, porém o npm pode criá-lo pra você, para isso execute “npm init” e seguir as instruções (é possível deixar tudo em branco).

O “gulpfile.js” deverá ser criado a partir de algum editor de textos.

Para instalar um plugin usa-se: “npm install –save-dev <nome-do-plugin>”, por exemplo, o uglify “npm install –save-dev gulp-ufligy”.

Como o gulp foi escrito por cima do nodejs, um plugin do gulp é uma dependência do nodejs, logo o campo com a relação dos plugins instalados no “package.json” é o “dependencies”, assim outra forma de instalar as dependências (caso o “package.json” tenha sido criado manualmente) é colocá-las no campo “dependencies” e executar no console “npm install”. Para a relação dos plugins oficiais do gulp acesse: “http://gratimax.github.io/search-gulp-plugins/”

Ao instalar um plugin, é necessário definir ele no script também, para isso usa-se “require(‘plugin’)”, por exemplo, “var gulp = require(‘gulp’);” e nesse caso, para acessar os métodos do gulp “gulp.nome_do_método();”

O gulp possui poucos métodos, abaixo segue uma DESCRIÇÃO PRÁTICA do uso deles (as informações completas sobre o uso deles são encontradas na documentação):

  • gulp.src(globs): Define o arquivo ou a pasta que terá seus arquivos lidos. O parâmetro “globs” pode ser uma string ou um array, por exemplo, “./arquivos/*.js” ou “[./arquivos/arquivo1.js, ./arquivos/arquivo2.js, …]”
  • gulp.dest(path): Define a pasta de saída do processamento.  ex.: gulp.dest(“./pasta_de_saída”)
  • gulp.task(‘Nome_da_tarefa’, function(){ /* aqui fica seu código */ }): As tarefas são blocos de códigos que serão executados. ex.: gulp.task(‘enviar_por_ftp’, function{ /* aqui ficam as instruções de como enviar */ });
  • gulp.run(‘task1’, ‘task2′, … ,’taskN’): Esse método serve pra chamar outras tarefas do mesmo projeto.
  • gulp.watch(glob, tasks): Equivalente ao “run”, ele executa outras tarefas definidas no task, porém ele executa quando há alterações nos arquivos definidos no glob, ex.: gulp.watch(‘./teste/*’, [‘enviar_por_ftp’, ‘outra_tarefa’]); nesse exemplo se qualquer arquivo na pasta “teste” for alterado, ele executará as tarefas ‘enviar_por_ftp’ e ‘outra_tarefa’.

Para executar uma tarefa basta executar: “gulp <tarefa>”, por exemplo, “gulp enviar_por_ftp”. Caso exista a tarefa “default”, ela será executada simplemente com “gulp”, mas “gulp default” também funciona.

Exemplo:

No exemplo abaixo serão juntados todos os arquivos da pasta “entrada” e será criado um arquivo chamado “concatenados.txt” na pasta “saida”. Para isso será usado o plugin “gulp-concat”.

Primeiramente, é necessário instalar o nodejs (#apt-get install nodejs) e o gulp CLI (#npm -g install gulp).

Depois é necessário criar o projeto ($npm init), observe que o “package.json” foi criado; agora vamos instalar as bibliotecas do gulp e os plugins (npm install –save-dev gulp gulp-concat), observe que o “package.json” agora possui nas dependências “gulp” e “gulp-concat”.

O próximo passo é criar o script, para isso crie o arquivo “gulpfile.js” na pasta raiz do projeto com o script abaixo.

//Criada a variável 'gulp' que é a "instância" da biblioteca 'gulp'

var gulp = require('gulp');

//Criada a variável 'concat' que é a "instância" da biblioteca 'gulp-concat'

var concat = require('gulp-concat');

//Criada a tarefa 'default'

gulp.task('default', function(){

//São lidos todos os arquivos da pasta 'entrada'

gulp.src('./entrada/*')

//Os arquivos lidos são concatenados num arquivo chamado 'concatenados.txt'

.pipe(concat('concatenados.txt'))

//A saída gerada pelo concat é salva na pasta chamada 'saída'

.pipe(gulp.dest('./saida'));

});

 Para executar o script acima basta executar “gulp” (ou “gulp default”) no terminal.

Para informações sobre o gulp acesse: https://github.com/gulpjs/gulp/blob/master/docs/README.md

* João Paulo é estudante de Computação e estagiário da SWX

Desvendando os “Custom Post Type” – Parte 01

Por Eloi Morais de Matos

O que é?

Os Tipos Personalizados de Posts (Custom Post Type) são tipos de post que são criados, além dos fornecidos por padrão WordPress. Quando ativamos um tema ou um plugin às vezes encontramos novos tipos de post que foi colocado para suprir as necessecidades do desenvolvedor.

Onde usar?

São usados ​​em uma grande variedade de maneiras em todo o ecossistema WordPress. Sempre que você precisar de um tipo de conteúdo que é diferente dos tipos padrão, tenha em mente que é a hora de usar os tipos personalizados de post. Alguns exemplos de como eles são usados ​​são:

  • Produtos para um site de comércio eletrônico;

  • Depoimentos em portfolio;

  • Listagem para um site imobiliário;

  • Avaliações para um site de jogos

  • Eventos para um calendário de eventos;

  • Veículos para um site automotivo;

  • Filmes para uma locadora;

  • Livros para uma biblioteca.

Você pode criar um tipo de post para cada uma delas, Cada uma com seus próprios dados e taxonomias adicionais e, em seguida, registra-las utilizando o seu tema. Isso aumenta a flexibilidade do WordPress já que você não estará limitado aos tipos de conteúdo que vem por padrão nele.

Como criar?

Se você quiser escrever novos tipos de posts personalizados, você pode registra-lo no arquivo functions.php do seu tema, ou em um plugin. Neste você pode definir as propriedades do tipo de post e como ele age dentro do WordPress. O WordPress Codex tem um guia para os tipos personalizados de post com informações sobre codificação deles, mas deixarei aqui um código simples retirado do GenerateWP onde você pode personalizar mais ainda os novos tipos de posts. Veja abaixo:

// Register Custom Post Type
function custom_post_type() {

	$labels = array(
		'name'                => _x( 'Post Types', 'Post Type General Name', 'text_domain' ),
		'singular_name'       => _x( 'Post Type', 'Post Type Singular Name', 'text_domain' ),
		'menu_name'           => __( 'Post Type', 'text_domain' ),
		'parent_item_colon'   => __( 'Parent Item:', 'text_domain' ),
		'all_items'           => __( 'All Items', 'text_domain' ),
		'view_item'           => __( 'View Item', 'text_domain' ),
		'add_new_item'        => __( 'Add New Item', 'text_domain' ),
		'add_new'             => __( 'Add New', 'text_domain' ),
		'edit_item'           => __( 'Edit Item', 'text_domain' ),
		'update_item'         => __( 'Update Item', 'text_domain' ),
		'search_items'        => __( 'Search Item', 'text_domain' ),
		'not_found'           => __( 'Not found', 'text_domain' ),
		'not_found_in_trash'  => __( 'Not found in Trash', 'text_domain' ),
	);
	$args = array(
		'label'               => __( 'post_type', 'text_domain' ),
		'description'         => __( 'Post Type Description', 'text_domain' ),
		'labels'              => $labels,
		'supports'            => array( ),
		'taxonomies'          => array( 'category', 'post_tag' ),
		'hierarchical'        => false,
		'public'              => true,
		'show_ui'             => true,
		'show_in_menu'        => true,
		'show_in_nav_menus'   => true,
		'show_in_admin_bar'   => true,
		'menu_position'       => 5,
		'menu_icon'           => '',
		'can_export'          => true,
		'has_archive'         => true,
		'exclude_from_search' => false,
		'publicly_queryable'  => true,
		'capability_type'     => 'page',
	);
	register_post_type( 'post_type', $args );

}

// Hook into the 'init' action
add_action( 'init', 'custom_post_type', 0 );

Nos próximos artigos irei fazer um passo a passo completo para criação dos tipos personalizados de post comentando para que que serve cada uma das opções. Até a próxima!

*Eloi é desenvolvedor de Software na SWX

Imagem: Christopher Ross

SWX Labs 03 – Editais de Inovação

capa01

No SWX Labs 03, Mike, Vinicius e Benhur, conversam com Marcelo Dósea sobre editais de inovação.

Marcelo Dósea é Gestor de inovação do SergipeTec e tem mais de dez anos de experiência em consultorias nesta área e por conta do Tecnova, edital de inovação lançando este ano em Sergipe, bate um papo com a gente sobre inovação e editais .

Temas abordados no programa

  • O que é inovação
  • O que são editais de inovação
  • Editais de Inovação em Sergipe
  • Preparação e Submissão de proje

Links

Assine o feed do nosso podcast e não perca nenhum episódio: http://feeds.feedburner.com/SWXLabs

Se preferir, também estamos no Itunes Store

Gostou? Não gostou? Erramos algo? Sua opinião é muito importante para nós, por isso deixe seu comentário ou envie email para mike@swx.com.br

Curta nossa Fan-Page

Ouça o podcast clicando no play, se preferir faça o download
 
 

Model em Ruby on Rails – Parte 02

* Por João Paulo

Veja a parte 01

ruby-on-rails

Um model é uma classe que herda da classe ActiveRecord::Base e está associada a uma tabela.

O arquivo do model possui o nome da tabela em minúsculo no singular (“nomedatabela.rb”) e a classe o nome em CamelCase (“class NomeDaTabela”).

É possível criar o model manualmente, porém o Rails possui um generate que cria o model, o migration e a tabela dinamicamente. Funciona no seguinte formato:

rails g model <Model> <Campo1>:tipo <Campo2>:tipo <Campon>:tipo

 ex.: A tabela “produtos”, gerada anteriormente, poderia ser gerada da seguinte forma: será gerada a tabela, o model e a migration pra ela.

rails g model Produto name:string

 Nota: Caso a tabela já tenha sido criada, é necessário adicionar o parâmetro “–force” no generate para reexecutar a migration.

 _mvc

Para acessar um campo pelo controller é necessário criar os métodos que irão ler e escrever o campo, por exemplo, para um campo “nome” ser lido, tem que ser criado o método “nome” e para gravar deverá ser criado o método “nome=”.

class table1 < ActiveRecord::Base

def nome

self[:nome]

end

def nome=(novoNome)

self[:nome] = novoNome

end

end

 

 Nota: É possível usar attr_accessor, attr_reader e attr_writer.

 Para definir um relacionamento no model é necessário chamar o método com o nome do relacionamento (belongs_to, has_one, has_many, …) e o nome na tabela. Esse relacionamento será feito a partir do id. Ex.:

class table1 < ActiveRecord::Base

belongs_to :table2

end

 

relacionará o campo “table2_id” da “table1” com o campo “id” da “table2”.

 Relacionamentos:

  • belongs_to (pertence à): Define que um registro de um model está ligado a um registro de outro model e pertence a ele numa relação “um pra um”, por exemplo, em  uma tabela com reitores e outra com universidades, “um reitor pertence a uma universidade”, assim a tabela “universidade” deverá ter um campo “reitor_id”.
  • has_one (“contém”): Define que um registro model contém outro de outro model numa relação “um pra um” (o contrário de belongs_to), no exemplo do belongs_to, temos que uma “universidade contém um reitor”.
  • has_many (“contém muitos”): Define que um registro de um model contém muitos registros de outro model. Por exemplo, um cliente pode ir a uma loja comprar vários produtos, assim à relação será “cliente contém muitos produtos”, logo a tabela “produtos_vendidos” terá um campo “cliente_id”.
  • has_and_belongs_to_many (“contém e pertence a vários”): Define que vários registros de um model está associado a vários de outro model. Por exemplo, em um sistema de vendas, existe uma tabela “pedidos” que associa vários registros da tabela “produtos” a um da tabela “cliente”, pois um cliente compra vários produtos; porém, também associa vários da tabela “clientes” a um da tabela “produtos”, pois um produto é comprado por vários clientes.

 

Validações:

 Em um model é necessário validar se os dados são válidos antes de salvar no banco de dados, para validar é necessário definir o método no formato:

“validates :<campo>, <validação>”.

 ex.: O campo “nome” da tabela “table1” será obrigatório.

class table1 < ActiveRecord::Base

validates :nome, presence: true

end

Existem vários helpers para validação, como, por exemplo, garantir que apenas números são esperados:

class table1 < ActiveRecord::Base

validates :value, numerically: true

end

Para mais helpers acesse: http://edgeguides.rubyonrails.org/active_record_validations.html#validation-helpers

É possível definir mensagens para caso ocorra um erro na validação, ou seja, para quando um valor passado não estiver de acordo com a validação:

class table1 < ActiveRecord::Base

validates :nome, presence: true, :message => “O nome é obrigatório.”

end

É possível definir a validação para uma determinada ação (create, update, …):

class table1 < ActiveRecord::Base

validates :nome, presence: true, on: :update

end

 

Validações por métodos customizados:

class table1 < ActiveRecord::Base

validate :método, on: :create

 

def metodo

if (campo1 > 10)

erros.add(:value_error, “O número tem que ser maior que 10”)

end

end

 

Informações sobre validações: http://edgeguides.rubyonrails.org/active_record_validations.html#validation-helpers

Documentação completa: http://api.rubyonrails.org/

* João Paulo é estudante de Computação e estagiário da SWX

SWX Direto da Trincheira 02 – Framework Chef, Ecommerce, Ruby on Rails e Campus Party

No SWX Direto da trincheira 02, trazemos mais novidades do que rola na SWX Softwares. Se você ainda não viu, clique e confira:

Podcast explicando como funciona o framework chef e exemplificado a partir da nossa experiência na SWX.

Neste texto debatemos estratégia de ecommerce a partir da ferramenta adotada, se ela será sua ou alugada a terceiros.

Como utilizar o componente Model da arquitetura MVC? Comece a conhecer um pouco mais de Ruby on Rails na primeira parte deste tutorial.

A SWX foi convidada para a área Startup & Makers da Campus Party, um dos maiores eventos de tecnologia do mundo que tem sua versão brasileira acontecendo em São Paulo de 27 de janeiro a 2 de fevereiro.