How to integrate Ruby on Rails and Google Firebase to send offline notifications to your users!

First, firebase is not the only solution for this, but I like their approach, it is simple and multi platform, and really easy to integrate in a rails application.

Of course Firebase has a lot more features, but to keep this post short, we’ll focus only on this feature today.

Remember that to use it in production your application needs to be acessed through SSL, the ServiceWorker API only works through SSL.

And before we start coding, you’ll need to go to the Firebase Console and create a new application for you there.

But lets start with the Rails application, create a new rails app with the ” rails new app_name”  command.

Now create a file named manifest.json in the public directory, this file is simple and will be your Portable Web Application manifest.

{
  "name": "My  First PWA On Rails",
  "short_name": "PWAOnRails",
  "start_url": "/",
  "icons": [
    {
      "src": "/my_icon.png",
      "sizes": "256",
      "type": "image/png"
    }
  ],
  "theme_color": "#000000",
  "background_color": "#FFFFFF",
  "display": "standalone",
  "orientation": "portrait",
  "gcm_sender_id": "103953800507"

}

The sender ID 103953800507 is a fixed number Firebase uses, do not put your project firebase id there.

Then we need to create also in the public directory a file named “firebase-messaging-sw.js” to host the Firebase javascript initialization code, the content of this file is provided by the firebase web framework.

importScripts('https://www.gstatic.com/firebasejs/4.8.1/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/4.8.1/firebase-messaging.js');
importScripts('/firebase/init.js');

firebase.messaging();

The only missing piece is the firebase/init.js file that will hold your firebase application configuration, the values for this file will come from the application you’ve created previously in the console.

// Initialize Firebase
var config = {
    apiKey: "YOUR_API_KEY",
    authDomain: "YOUR_APP.firebaseapp.com",
    databaseURL: "https://YOUR_APP.firebaseio.com",
    projectId: "YOUR_PROJECT_ID",
    storageBucket: "",
    messagingSenderId: "THIS_IS_YOUR_REAL_SENDER_ID"
};
firebase.initializeApp(config);

We are almost done with the application initialization, now we need to tell the browsers that we want the service worker loaded, to do that, lets use the firebase javascript code, we’ll just add a similar piece of code to the main application layout.

    <script src="https://www.gstatic.com/firebasejs/4.8.1/firebase.js"></script>
    <script>
        // Initialize Firebase
        var config = {
            apiKey: "YOUR_API_KEY",
            authDomain: "YOUR_APP.firebaseapp.com",
            databaseURL: "https://YOUR_APP.firebaseio.com",
            projectId: "YOUR_PROJECT_ID",
            storageBucket: "",
            messagingSenderId: "THIS_IS_YOUR_REAL_SENDER_ID"
        };
        firebase.initializeApp(config);
    </script>

With that done, we need to start integrating the Firebase API with our rails application (yes, I know, we didn’t do anything in rails yet…), and to start we’ll create another javascript file, now in our application assets file, I’ll call it “first_pwa.js”.

function FirstApp() {
    this.saveMessagingDeviceToken = function () {
        firebase.messaging().getToken().then(function (currentToken) {
            if (currentToken) {
                console.log('Got FCM device token:', currentToken);
                $.post("/push_registrations", {subscription: currentToken});
            } else {
                // Need to request permissions to show notifications.
                this.requestNotificationsPermissions();
            }
        }.bind(this)).catch(function (error) {
            console.error('Unable to get messaging token.', error);
        });
    }
    this.requestNotificationsPermissions = function() {
        console.log('Requesting notifications permission...');
        firebase.messaging().requestPermission().then(function() {
            // Notification permission granted.
            this.saveMessagingDeviceToken();
        }.bind(this)).catch(function(error) {
            console.error('Unable to get permission to notify.', error);
        });
    };
}
var firstApp = new FirstApp();
firstApp.saveMessagingDeviceToken();

This code will ask the user for permissions to show notifications, these notifications work online or offline, and more importantly will send the firebase messaging token to the “push_registrations”  controller, now we just need to create this controller, use the approach you prefer, I just create the file using a text editor, the content for now is really simple, just to show how to use it…

class PushRegistrationsController < ApplicationController
  def create
    puts  params[:subscription]
    User.find_or_create_by push_sub: params[:subscription]
  end
end

We are saving the user subscription ID in a User model, for this sample, I just created the model with the command:

rails g model user push_sub:string

And we can create another controller to broadcast messages to everyone that has already opened the application, but to do that we’ll need a REST client, the easier to use for this sample is the ‘rest-client’ gem, please add the following entry to the Gemfile and run “bundle install”

gem 'rest-client'

You’ll need to get a server application key for your Firebase Messaging app from their web site.

And the broadcast controller will look similar to this:

class BroadcastsController < ApplicationController
	def index
		headers = {"Content-Type": "application/json",
			"Authorization": "key=YOUR_SERVER_KEY"}
		url = "https://fcm.googleapis.com/fcm/send"
		User.find_each do |user|
			payload = {
				"notification": {
					"title": "We have a message for you!",
					"body": "Answer please, we are cool!",
					"icon": "/app_icon.png",
					"click_action": "https://oursecureurl.domain.com/chats"
					},
				"to": user.push_sub
			}
			RestClient.post(url, payload, headers)
     	end
	end
end

If the application is not running in the moment you send the message, a notification will be displayed for the user automatically, but if the application is running, meaning, if the user is in your web site, you need to handle the message in your code, the code is still simple, just a little more javascript.

Lets open the “firebase-messaging-sw.js” and change the last line and add a few more:

importScripts('https://www.gstatic.com/firebasejs/4.8.1/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/4.8.1/firebase-messaging.js');
importScripts('/firebase/init.js');

const messaging = firebase.messaging();

messaging.onMessage(function(payload) {
  console.log("Message received. ", payload);
  // ...
});

Of course you can use the firebase API to create topics and device groups to make it easy to send message to many devices of one user, or to notify everyone that a specific product is on sale.

But this is the basics for the first PWA on Rails with offline notifications.

 

 

 

8 things that will save your time working with Xamarin and Rails (Or the summary of my presentation about mobile development with Xamarin at TDC Porto Alegre 2017)

In the last “The Developers Conference Porto Alegre 2017” I presented a talk about common pitfals found while creating a mobile application using the Xamarin.Forms mobile platform.

If you want to check the slides they are in my slideshare, just Click Here.

But right to the point, the idea of this post is to summarize the 8 main points in my presentation that will save your time.

The best REST client for Xamarin mobile is FubarCoder.RestSharp

I’ve tested some other libraries, and there are some good ones, but the best one I’ve found is the FubarCoder.RestSharp.

The library is almost a full port of RestSharp to Xamarin Mobile, of course, if you are writing a .Net Core application use the full blown RestSharp, but for mobile, this port is great and keep the same API

this.client = new RestClient("http://address:port/");
var request = new RestRequest("sessions.json", Method.POST);
request.AddJsonBody(new { session = new { username = Username, password = Password } });
var response = await client.Execute(request);

A REST client will not solve all your problems if you use session

In most Rails applications, you use session to keep track of who is logged in, and if you are creating a front end for one existing application and using the already existing API this can be a problem since Rails use cookies to track the user session and RestClient does not store or send cookies, but that is easy enough to solve, just use this:

var cookieContainer = new System.Net.CookieContainer();
client.CookieContainer = cookieContainer;

Adding a cookie container to the RestClient will teach it to store and send back the cookies, and that will solve all problems with authentication.

Always use async/await

C# has a perfect feature to help handle asynchronous calls, the async and await keywords, the trick here is that await can only be used inside async methods, and to solve that, use this snippet:

Task.Factory.StartNew(async () =>
{
var articles = await clientApi.ListArticles();
})

With the task factory you’ll be able to create async blocks to handle your API calls.

You cannot update the UI from another thread

The problem with async blocks is that they do not run in the main UI thread, and you can only update the UI components from that thread.

To solve that you need to use Device.BeginInvokeOnMainThread, we can update the previous snippet with this new method to update the UI with the article list:

Task.Factory.StartNew(async () =>
{
var articles = await clientApi.ListArticles();

Device.BeginInvokeOnMainThread(() =>
{
this.ArticlesList.ItemsSource = articles;
});
});

Rails tries to prevent simple form submission to prevent form submission attacks and that might be a problem

Rails protect_from_forgery will cause you some trouble, and you have two ways to fix that.

  • simply remove protect_from_forgery, of course that might open your application for attacks. If you are creating one API it is not a problem, but be careful with this solution.
  • add “skip_before_action :verify_authenticity_token” to the APIs you’ll use from your mobile application
  • before sending any “form” do a request and get the authenticity_token from the returned page and send it back on every request (this is the safest)

Show details and navigation

Each mobile platform has it’s own way to display the in app navigation and go back to the previous pages, to help with that, Xamarin.Forms has the NavigationPage class

MainPage = new NavigationPage(new tdc2017poa_xam.MainPage(this.clientApi));
Navigation.PushAsync(new ArticlePage(this.clientApi, (e.SelectedItem as Article).Id));

Saving user preferences in a platform independent way is probably a good idea

In every application you need to save user preferences and similar things, and of course that is platform dependent, but Xamarin.Forms had a Properties helper that will map the calls to each supported platform, the code is really simple, just use these classes:

  • Application.Current.Properties
  • Application.Current.SavePropertiesAsync
  • Application.Current.Properties.ContainsKey

Display notifications for users

Again each platform has it’s own requirements to send async notifications to the users, if you are using Azure to build the backend for your application, just use the Microsoft.Azure.Mobile.Client class/module/library and it will save you loads of times.

Of course you’ll still need to register your application in each platform, but you’ll be able to use only one API for all…

Last but not least

I hope this presentation summary will help you save some time, if you want to check the actual source code for the presentation samples, just go to my github page.

Brain Hack – Trabalho remoto e produtividade

Atualmente eu estou digamos assim, apaixonado por trabalho remoto, estou trabalhando desta forma desde dezembro de 2013, ou seja já deu tempo de aprender algumas coisinhas.

Claro que existem diversos tipos de pessoas, e nada é perfeito, tudo tem vantagens e desvantagens.

A foto do post é de onde estou escrevendo ele hoje, não estou de férias, só resolvi trabalhar uma semana longe de casa.

Na minha opinião esta é uma das vantagens de trabalhar remoto, ou home office, ou chame como quiser, eu não chamo de home office por que não estou sempre em casa.

Existem desvantagens também, uma grande na minha opinião é não ter colegas de trabalho que fazem algo parecido com o que você faz, isto as vezes faz você se sentir sozinho e um pouco perdido.

Eu não trabalho sozinho, tenho um colega desenvolvedor na empresa, mas eu trabalho no Brasil e ele na Europa (muda de pais de vez em quando 😛 ).

Outro ponto negativo é que com menos contato com o seu chefe, ser promovido ou qualquer coisa parecida pode se tornar um pouco mais complicada.

Mas na empresa em que eu trabalho hoje eu não teria muito espaço para promoção mesmo se trabalhasse no escritório, que por acaso fica em New York, e eu nunca fui lá, até estou planejando uma viajem para conhecer meu chefe pessoalmente, mas ainda não fui, só conheço ele via Skype até hoje.

Mas de volta ao assunto do post.

Trabalhando remoto eu consigo ser mais produtivo do que no escritório, tenho menos interrupções, menos pessoas para conversar (sim, mesmo sendo um nerd eu converso com quem estiver por perto 😛 ).

Mas também acontece de as vezes você simplesmente não estar em um bom momento para produzir, um dia que você tem muita coisa para terminar, e não esta conseguindo produzir, neste caso eu uso alguns “brain hacks” para me ajudar.

* uma forma de recuperar o foco é esquecer um pouco do trabalho, eu aproveito que trabalho remoto, cuido os horários de reuniões (sim, eu tenho reuniões), e simplesmente pego meu cachorro e saio pra caminhar em uma praça no meio do dia, relaxo um pouco, e quando volto para o computador com uma xícara de café recém passado, o trabalho flui muito melhor.

* “men sana in corpore sano”, uma variação da técnica acima, que ocupa um pouco mais de tempo, mas é útil em casos mais extremos é fazer um intervalo para exercicios, isto mesmo, no meio do dia, se o trabalho esta estressante demais, ou você não esta conseguindo produzir, troque de roupa e saia para correr, vá na academia, vá nadar, ou qualquer coisa que você goste de fazer, garanto que quando voltar vai conseguir produzir muito melhor. Men Sana in Corpore Sano

* tem aquele dia que tu não consegue produzir, e não esta afim de se mexer muito também, neste caso eu aproveito uma praça que tem atrás do prédio onde eu moro, e faço 10 minutos de meditação. Existem diversos tipos de meditação com propósitos diferentes, e isto fugiria um pouco do foco deste post, mas pode escolher qualquer um, a idéia é parecida com o passeio com o cachorro, só tirar alguns minutos para descansar a cabeça, parecido com ir para o “cafézinho” em um escritório cheio de gente e conversar sobre algo aleatório com qualquer um que estiver lá.

* mude de ambiente, as vezes quando sei que o dia vai ser mais pesado, que tenho muita coisa para fazer, gosto de simplesmente pegar minhas coisas e ir trabalhar fora de casa, em um café, um coworking, etc. Só escolha um lugar que lhe agrade e pronto.

E por último, isto é uma coisa que eu gosto de fazer, mas tem gente que prefere de outra forma, como eu trabalho remoto, eu prefiro não ter horário fixo, eu tenho um contrato para trabalhar um numero fixo de horas por dia, mas não tenho um horário fixo, e mesmo a quantidade de horas é só uma referência, é mais importante eu fazer o que tem que ser feito do que cumprir a quantidade de horas.

Neste caso, eu tiro alguns horários na semana para fazer coisas que me agradam, tipo duas vezes por semana pela manha, eu trabalho por aproximadamente 1h, paro o que estou fazendo, levo meu filho pro Karate, depois volto e continuo trabalhando, mas poderia ser qualquer coisa, fazer uma aula de música, ter um horário alternativo para a academia e pegar todos os equipamentos livres, …

Use sua imaginação e faça com que trabalhar remoto tenha mais vantagens do que desvantagens.

Uma idéia é trabalhar da praia no verão…

Na verdade esta é uma boa idéia, vou procurar um lugar barato pra fazer isto, mando fotos pra quem ta trabalhando todo dia no mesmo escritório 😛

GTD – acho que finalmente entendi :D

Já li bastante sobre o tal do GTD (Getting Things Done), li também o livro sobre ZTD (Zen to Done), e a pouco resolvi finalmente ler o livro do David Allen sobre GTD, e acho que finalmente entendi a brincadeira, pelo menos de uma forma que esta funcionando para mim.

Uma coisa que percebi é que é uma grande mudança de hábitos, e que eu funciono melhor mudando um hábito de cada vez, e foi o que fiz, adicionando passo a passo, ainda não estou usando todas as praticas mas já melhorou bastante minha organização.

E claro que como qualquer maluco de TI eu preciso de softwares para fazer qualquer coisa, e neste caso estou usando só o Evernote, por que ele torna a primeira prática extremamente simples, vou descrever passo a passo abaixo o que do GTD eu estou usando, e se alguém mais usa GTD e perceber que entendi alguma coisa errado, por favor estejam a vontade para me avisar 😀

Coleta
A coleta é a fase mais importante e mais difícil de começar na minha opinião, a idéia básica é se acostumar a colocar no mesmo lugar todas as possíveis tarefas que chegarem, mesmo antes de ter certeza se é uma tarefa.

Eu criei uma pasta chamada “Caixa de entrada” no Evernote, onde eu coloco todas as tarefas do trabalho, emails que precisam de ação, foto ou scan de contas que chegam, artigos que posso me interessar no futuro, idéias que eu tenho para novos projetos.

Quando for começar a fazer isto, um exercício interessante é sentar em algum lugar em casa e anotar tudo o que tu lembrar que precisa fazer, qualquer pequeno concerto, qualquer coisa que tu acha que precisa comprar, qualquer coisa que passar pela cabeça.

Um ponto importantissimo é que tem que ser um item em casa nota do Evernote, pense que esta escrevendo cada item em um pequeno pedaço de papel, ou se se sentir mais confortável, escreva cada item em um pedaço de papel e coloque tudo na mesma caixa 😀

Processamento Diário
Depois de encher a caixa de entrada, coisa que vai acontecer com frequencia, já que todos os dias recebemos emails, tarefas, e tudo isto deve ir para a caixa de entrada, temos de processar estas informações.

Este processamento tem um passo a passo bem simples e que deve ser seguido, para evitar que comecemos a fazer apenas o que queremos, gostamos e lembramos, e deixemos o resto por lá.

O processamento começa com o primeiro item da caixa de entrada, e termina no último, não devemos pular, olhar o de baixo que eu já sei o que fazer, começar pelo meio, …
Se não estiver usando o Evernote, a indicação é começar de cima para baixo, mas o importante é seguir uma ordem e não pular items.

Para cada um dos items, segue-se este script:

2. Precisa de algum tipo de ação sua neste item?
2. Não precisa
* Se precisar deste item como referencia no futuro, arquive ele
* Se não precisar dele como referencia no futuro, apague
2. Precisa
* Se ele é uma tarefa simples e leva menos de 2 minutos, faça agora
* Se ele é uma tarefa simples e leva mais de 2 minutos, adicione a lista de atividades
2. Se ele precisa de uma ação, mas é maior que uma única tarefa, agora este item é um projeto
1. Quebre o item em tarefas simples e adicione elas a lista de atividades
2. Anote no projeto quais tarefas pertencem aquele projeto
3. Nada por enquanto, mas um dia quem sabe
1. Idéias, coisas que não sabe se vai comprar, … tudo isto vai para uma lista chamada “Um dia quem sabe”

Sobre adicionar a lista de atividades, na lista acima isto é um conceito simplista demais, na verdade este item é mais complexo, por exemplo um item destes pode ser agendado para algum momento especifico no futuro, para isto você pode usar uma agenda, o calendário do seu celular, eu prefiro utilizar os lembretes do Evernote.

Quanto a listas de atividade, quando eu comecei eu tinha só uma, mas como é mencionado no livro, é muito mais produtivo quando as listas tem contexto, ou seja, hoje eu tenho um caderno no Evernote para todas as tarefas, e uso tags para separar por contexto, os contextos que eu criei por enquanto são:
@Fone
@Compras
@Pessoal
@Trabalho

Alem de eu também criar uma tag por projeto com o nome do projeto, e na hora de arquivar eu tenho várias tags por assunto.

Para facilitar a visualização, eu tenho também tags por dia da semana que uso na hora de organizar as tarefas da semana.

Fazer

Isto não esta explicito no livro, eu acho que todos deveriam sub intender isto, já que este é o objetivo, mas tem um monte de gente reclamando que o GTD não foca no “D”.

Eu acho que foca sim, e todos os dias eu pego a lista de tarefas, por contexto por exemplo, se estou no mercado ou no shopping eu pego a lista @Compras e compro o que esta ali.

Se estou no horário de trabalho pego a lista @Trabalho e começo a fazer os itens da lista.

Se aparecer alguma outra coisa durante o trabalho, o que sempre aparece, se for urgente vai direto para a lista @Trabalho e se não for vai pra caixa de entrada para processar amanha.

Assim que termino uma tarefa, marco ela como pronta e passo para a próxima.

Processamento Semanal

Bem parecido com o processamento diário, mas aqui você deve revisar todos os projetos para ver o progresso de cada, e lembrando que no conceito do GTD um projeto é simplesmente uma coisa que precisa de mais de um passo para ser feita, por exemplo, comprar uma bicicleta não é uma tarefa, e sim um projeto por que inclui escolher um estilo de bicicleta (speed, mountain, hibrida, dobravel, …), escolher uma bicicleta no estilo definido, pesquisar preço, e por último ir até a loja e fechar a compra.

Neste momento gosto de anotar nos cartões de projeto como anda o progresso de cada um.

Também é o momento para revisar a lista “Um dia quem sabe”, dar uma olhada nas idéias de lá, nas coisas que pensou em comprar um dia para ver se já esta na hora ou se não quer mais, apagar alguns itens daquela lista, …

E eu gosto também de re-checar os itens marcados como concluídos durante a semana, isto ajuda na motivação, ver a quantidade de coisas que conseguimos terminar durante a semana passada.

Vantagens que vi no GTD até agora

*Motivacional* – Antes de começar a ter todas as minhas anotadas, eu sempre acreditei ter uma boa memória e fazia tudo de cabeça, claro que as vezes eu esquecia de alguma coisa, mas o pior para a motivação e para o bom humor, é que várias vezes, durante o trabalho, temos uma tarefa principal e daqui a pouco começam a chegar inúmeras outras que precisam ser feitas no mesmo dia, mas a sensação que fica no final do dia é que não fizemos nada de produtivo pois aquela tarefa principal não foi finalizada.
Pois agora não tenho mais isto, posso ver uma lista grade de coisas finalizadas naquele dia, e como uma tarefa grande se torna um projeto, eu com certeza vou ver algum progresso naquela tarefa grande e importante que eu tinha, pois alguns dos itens serão marcados como concluídos.

*Organização* – Não estou mais pagando juros de contas atrasadas, não tenho deixado de fazer coisas que preciso fazer, e quando demoro muito para fazer algo, só o fato de ver todos os dias aquilo na minha lista de tarefas me incomoda o suficiente para fazer o mais rápido possível.

*Produtividade* – É incrível como o nosso cérebro perde tempo nos lembrando de coisas que não podemos fazer agora, e segundo algumas teorias temos uma quantidade limitada de atenção que podemos usar no mesmo dia.

Depois que você confiar no seu sistema, quando colocar uma tarefa na lista, o seu cérebro vai descansar e parar de bater naquela tecla por que ele sabe que a tarefa vai ser finalizada no momento necessário.
Isto poupa bastante energia, e tenho conseguido focar mais nas tarefas que preciso realizar, a quantidade de vezes que estou fazendo uma coisa e o cérebro começa sozinho a lembrar de outra que não posso fazer agora caiu para praticamente zero, e tenho completado muito mais coisas durante o dia.
Ou seja, percebo um aumento de produtividade no meu trabalho, e normalmente termino o dia menos cansado.

—————————-

Bom, acho que é isto, se eu esqueci de alguma coisa, por favor me avisem, e se gostaram da brincadeira, recomendo ler um pouco sobre GTD, gostei bastante do método, mesmo que eu ainda não esteja usando ele todo 😀

Introdução ao Pomodoro

  • Você já sentiu que tinha muita coisa acontecendo ao mesmo tempo e estava com dificuldade de dar atenção para tudo?
  • Já se sentiu cansado, parecendo que não tinha energia para focar na atividade que deveria estar fazendo?

Pois o pomodoro pode ajudar nisto, a técnica foi inventada por _Francesco Cirillo_ no final dos anos 80, e é baseada na idéia de que pausas frequentes podem aumentar a agilidade mental

——————————

Entre os objetivos da técnica, e parte da propaganda apresentada no site http://pomodorotechnique.com/get-started/  que vou traduzir livremente aqui, estão:

Trabalhe com o tempo, e não contra ele

Para muitas pessoas, o tempo é um inimigo. Nós corremos contra o relógio para terminar tarefas, atingir prazos. A Técnica Pomodoro te ensina como trabalhar com o tempo, em vez de viver brigando com ele. Uma técnica revolucionária mas também extremamente simples de se aprender, mas que pode mudar sua vida ao usa-la.

Eliminar o Burnout

É essencial para o Pomodoro a noção de que tirar pequenos intervalos agendados enquanto trabalha, elimina a sensação de se estar correndo contra o tempo. É impossível trabalhar demais se você se ativer ao sistema.

Gerenciar Distrações

Seja uma chamada telefônica, uma mensagem no Facebook ou simplesmente lembrar que tu precisa trocar o óleo do carro, muitas distrações e pensamentos aleatórios aparecem quando você esta trabalhando. A Técnica pomodoro vai te ajudar a anotar as distrações e ordena-las por prioridade, na maior parte das vezes elas podem esperar.

Criar um melhor balanço entre vida e trabalho

A maior parte de nós esta sempre convivendo com a culpa que vem da procrastinação. Se não tivemos um dia produtivo, é fácil acabar sentindo que não temos o direito de aproveitar o tempo livre. Se tornar mestre no Pomodoro inclui criar uma agenda efetiva, te permitindo aproveitar todo seu tempo livre.

A Mágica simples do tomate

O nome da técnica apareceu depois que o Francesco Cirillo começou a implementar a técnica utilizando um relógio de cozinha na forma de um tomate, que em italiano é Pomodoro.

O processo básico é simples:

  1. Escolha uma tarefa que você precisa realizar
  2. Configure um timer para 25 minutos
  3. Trabalhe exclusivamente nesta tarefa por todos os 25 minutos
  4. Quando o timer apitar, faça uma pequena pausa (5 minutos são o tempo indicado), neste pausa tome um café, caminhe um pouco, converse com o colega, olhe o facebook, ou seja, qualquer coisa não relacionada com trabalho.

Seu cerebro vai agradecer.

  1. A cada 4 pomodoros faça uma pausa maior (20 minutos é um bom tempo, ou 30) seu cerebro vai usar o tempo para assimilar novas informações e descansar para o próximo round.

O ideal é no inicio do dia, do período ou seja lá como você prefere chamar, que você faça uma lista das tarefas que pretende realizar naquele dia, uma tarefa pode precisar de mais de um pomodoro para ser concluída, isto não é problema. Mas é importante que você anote em algum lugar o que fez em cada pomodoro, o indicado na técnica é fazer isto quando começou a trabalhar no pomodoro, e ao final do pomodoro marcar que trabalhou um pomodoro naquela tarefa.

Manter esta lista de alguma forma tem diversas vantagens, uma é que você vai saber quanto tem para fazer no dia, mas o mais importante é que você vai ter uma indicação visível de quanto realizou no dia, e isto ajuda bastante a não terminar o dia com aquela sensação de que não fez nada de útil mesmo tendo trabalhado o dia todo (quem nunca passou por isto?).

Depois vou detalhar melhor o Pomodoro, o que fazer quando aparecem interrupções, como utiliza-lo junto com outras técnicas apresentadas no livro, mas este é o conceito básico.

O filtro do tato (por que nerds/geeks tem problemas de relacionamento com outras pessoas)

Bom, eu sou um exemplo vivo, pelo menos eu acho que sim, de que nerds, geeks ou como preferirem ser chamados, tem problemas no trato com outras pessoas.

Sempre acham que eu sou direto demais, ou que sou grosso, ou qualquer coisa do gênero.

Na verdade, eu concordo que sou direto demais, não com a parte de ser grosso.

Eu acredito que se eu penso alguma coisa, eu posso dizer aquilo, e azar é de quem estiver ouvindo, mas isto ja me trouxe muitos problemas.

Mesmo, pelo menos na minha opinião, eu sendo um dos melhores na parte técnica do que eu faço, eu acabo sempre me prejudicando por falar o que eu penso e outras pessoas não gostarem de ouvir isto, o que prejudica inclusive o crescimento profissional …

Eu ja tentei ser gerente de projetos, e tenho a consciência de que pelo menos por enquanto não seria um bom gerente …

Em empresas que eu trabalhei, ja houveram casos em que mesmo sabendo que eu tinha a resposta, colegas de trabalho evitavam perguntar alguma coisa para mim.

Bom, eu ja melhorei muito neste ponto, acho que hoje sou razoavelmente conhecido na “comunidade java” aqui no Brasil, e cheguei a ouvir de um gerente: Bahh, legal, não sabia que tu era “O Urubatan”.
Mas melhorei isto com muito custo, e não foi muito fácil …

Mas voltando ao assunto deste post, eu encontrei um texto excelente que explica muito bem, na minha opinião, por que a maioria dos Nerds tem problemas no relacionamento com outras pessoas “Não Nerd”.
O texto original é este: Tact Filters

A baixo segue uma tradução livre deste excelente texto.

Filtros de tato

Todas as pessoas possuem um “filtro de tato”, que aplica um filtro de “trato social” em uma direção há tudo que passa por ele. A maioria das “pessoas normais” tem este filtro posicionado para filtrar tudo o que elas falam ou fazem. Então toda e qualquer coisa que as “pessoas normais” dizem, tem a quantidade ideal de “filtro para trato social” aplicado, antes de elas realmente falarem. Isto normalmte acontece por que quando eles estavam crescendo, os seus pais continuamente diziam para eles coisas como: “Se você não pode dizer algo de bom, não diga nada!”, ou então “Não diga este tipo de coisa, vai fazer com que eles se sintam mal!

“Nerds”, por outro lado, tem este filtro, aplicado na posição contrária, ou seja, tudo o que eles ouvem é filtrado. Então, qualquer coisa que qualquer um diz para eles, tem a quantidade adequada de “filtro social” aplicado quando eles ouvem. Isto normalmente é por que quando eles estavam crescendo, as outras crianças ficavam incomodando e dizendo coisas desagradáveis, e os seus pais diziam o tempo todo: “Eles estão dizendo estas coisas só por que eles estão com ciúmes”.

Quando “pessoas normais” conversam entre si, elas normalmente aplicam a quantidade apropriada de “tato social” para tudo o que eles dizem, e ninguém sai com os sentimentos feridos. Quando “Nerds” conversam entre si, eles normalmente aplicam a quantidade adequada de “tato social” a tudo o que eles ouvem, e ninguém sai com os sentimentos feridos. Entretanto, quando pessoas normais, falam com “Nerds”, os “Nerds” ficam frustrados com freqüência, por que as “pessoas normais” parecem estar sempre evitando de dizer o que eles realmente querem. E pior ainda, quando “Nerds” falam com “pessoas normais”, estas com freqüência saem com os sentimentos feridos, por que os nerds não aplicam o filtro ao que eles estão falando, esperando que o ouvinte o faça.

Então, os “nerds” precisam entender que as “pessoas normais”, precisam aplicar este filtro para tudo o que eles dizem, eles ficam desconfortáveis se eles não puderem fazer isto. “Pessoas normais” precisam entender que fora o fato de os nerds normalmente não possuirem “tato”, as coisas que eles dizem quase nunca devem ser tomadas como pessoais. Ambos os tipos de pessoas precisam ter uma quantidade extra de paciência quando estiverem lidando com alguém que possua o “filtro de tato” na direção oposta a sua.

——————-

Acho que este texto explica mais ou menos bem, os motivos destes “conflitos” entre os “nerds” e as outras pessoas.

É possível para um nerd amenizar bastante este problema, acho que na maior parte das situações eu ja melhorei muito, mas eu continuo achando irritante quando as pessoas ficam cuidando o que vão falar, ou até mesmo falando claramente algo diferente do que estão pensando apenas para não “ferir os sentimentos” de quem esta ouvindo.

As vezes eu até encaro isto como um pouco de hipocrisia.

Mas quem sou eu para querer mudar o mundo …

Então, o que vocês acham deste texto, não é mais ou menos isto o que acontece? mesmo os motivos originais mudando bastante de uma pessoa para outra …

Eu acho que entender esta “teoria” tem me ajudado bastante, e um exercício de paciência de vez em quando ajuda muito também 😀

O texto original é de autoria de: Jeff Bigler.
Todos os outros comentários e tradução são de minha autoria 😀