WebPack on Rails! – the easiest way to use the new Javascript syntax on your rails apps with the newest frameworks

I had some rails projects that needed a better UI or a different feature in the UI, and there was the perfect javascript library, the problem was that it needed “require.js” and it is not really easy to integrate require.js in asset pipeline.

The good news is that there is a webpack gem that will do all the work for us…

And after rails 5.1 you can just

rails new myapp --webpacker

but lets assume you have an existing app, the changes are a little bigger, but we can use both the old asset pipeline and the new webpacker.

Lets start adding the webpacker gem to the Gemfile

gem 'webpacker'

Then just run:

bundle install
rails webpacker:install

After this, you have a new file, called app/javascript/packs/application.js where you can use

var mylib = require('myjslibrary');

You’ll be able to require there any javacript you create in the app/javascript directory (instead of app/assets/javascript), and any library you add to the application using the yarn executable.

To add a library requirement use:

yarn add myjslibraryname

And do no forget to run in your deploy server:

yarn install

After commiting the yarn.lock file of course, that file will make sure you have the same library versions in all the machines your project is running.

And last, but not least, do not forget to add the the script tag to call that file to your layout using the code:

<%= javascript_pack_tag 'application' %>

And of course you do not need to remove the old javascript_tag file, allowing you to keep using both asset pipeline version and the new webpacker version.

In this new file, you can use the all new requirejs syntax, and of course that is not all, you can add css to the app/javascript directory and insert in the layout with the <%= stylesheet_pack_tag ‘application’ %>, and the gem has shortcuts to use all the new and fancy javascript APIs, for example:

rails webpacker:install:angular          # Install everything needed for Angular
rails webpacker:install:coffee           # Install everything needed for Coffee
rails webpacker:install:elm              # Install everything needed for Elm
rails webpacker:install:erb              # Install everything needed for Erb
rails webpacker:install:react            # Install everything needed for React
rails webpacker:install:stimulus         # Install everything needed for Stimulus
rails webpacker:install:typescript       # Install everything needed for Typescript
rails webpacker:install:vue              # Install everything needed for Vue

Any of these shortcuts will install the required files to use the specified library in your existing rails app.

This is it for now, it is a good start I think.

Please comment any questions you have and I’ll answer it the fastest I can!

Git deploy – how to implement git deploy in a project

Lately I’m becoming a lazy developer, and this reflects in my work.

I tend to choose the easiest solution that will work for any project, and sometimes a simple project, is still in it’s early stages and it does not pay to configure a capistrano deploy or anything fancy, so I’m just using git to do the deployment, and it almost feels like heroku for me.

And the setup is pretty simple, might help you your projects too.

To setup that, we’ll use git hooks, and a bare git repository.

I’ll use a simplified version of my scripts in this post, to create a simple step by step.

In the server, create a directory for the bare git repo and initialize the  repository:

mkdir myproj.git
cd myproj.git
git init --bare
cd ..
git clone myproj.git

After that, we’ll setup the post-receive hook in the bare repository, to do that, create a file called post-receive in the myproj.git/hooks directory with this content:

#!/bin/bash
/bin/bash --login <<_EOF_
export GIT_DIR=/home/urubatan/myproj/.git
rvm use 2.4.0
cd /home/urubatan/myproj
git pull
npm install
bundle install
RAILS_ENV=production bundle exec rake db:migrate
bundle exec rake assets:precompile
touch tmp/restart.txt
_EOF_

Since we want this hook to execute every time we push something to that repository, do not forget o make the script executable:

chmod 755 myproj.git/hooks/post-receive

now back to your machine, just create your rails project as usual:

rails new myproj_client

add the bare repository as “deploy” remote

git remote add deploy user@server:~/myproj.git

and when you are done, push your changes to the server:

git add .
git commit -m "sample commit for the blog"
git push deploy master

Of course, you still need to configure the server, using for example, nginx + passenger, or puma, or any other thing, but that is subject to another post.

Please add any question to the comments of this post, I’ll answer everything as soon as possible.

Git + Lazyness = happy Rails developer

I had some problems that you probably have too, if you are a ruby developer that works in a team…

Check if you have at least one of these problems:

  • Someone commits something that does not passes the test suit
  • Someone have deployed a version of the rails application without precompiling assets
  • Similar to the above but forgot to bundle install or npm install

The list can go on and on…

This short post will just give some tips of cool uses for the .git/hooks scripts to help solve some of these problems…

I have a small web application running, and the deploy of that application is just a git pull in the server (ok, blame on me, I’m not using docker for all my apps…)

And to prevent some of the above problems in this application, I created a .git/hooks/post-merge file with the bellow code:

bundle install
bundle exec rake db:migrate
bundle exec rake assets:precompile
touch tmp/restart.txt

just do not forget to “chmod u+x .git/hooks/post-merge”

With this small script, every time you run “git pull” the hook will fire and do all the dirty work for you.

The problem is that sometimes you are just updating a controller and does not need to run all that, and that is fine.

Of course you can make a more complex script to run only the commands you need, but this is good enough for simple scenarios, and at least in my case, I do no do that many deploys a day (most days there aren’t any deploys)

Another problem I had was some developers in the team, not running the tests before pushing changes to the central repository, and for this, a pre-push hook was just perfect, but I wanted to harden the things a little, and used a pre-commit hook, so to commit any small change, the developer should run the app tests.

To do that I created a .git/hooks/pre-commit (again, do not forget to make it executable) with this code:

#!/bin/bash
STAGED_FILES=$(git diff --cached --name-only)
if [[ "$STAGED_FILES" = "" ]]; then
    exit 0
fi
grep migrations $STAGED_FILES
if [[ $? == 0 ]]; then
  bundle exec rake db:migrate
fi
TESTS=""
CUCUMBER=0
grep models $STAGED_FILES
if [[ $? == 0 ]]; then
  TESTS="tests/models"
  CUCUMBER=1
fi
grep controllers $STAGED_FILES
if [[ $? == 0 ]]; then
  TESTS="$TESTS tests/controllers"
  CUCUMBER=1
fi
grep features $STAGED_FILES
if [[ $? == 0 ]]; then
  CUCUMBER=1
fi
if [[ "$TESTS" != "" ]]; then
  bundle exec rake test $TESTS
  if [[ $? == 1 ]]; then
    exit 1
  fi
fi
if [[ $CUCUMBER == 1 ]]; then
 bundle exec cucumber
 if [[ $? == 1 ]]; then
   exit 1
  fi
fi
exit 0;

we have some more verifications in the real file, but this is the idea, if you changed a file, we’ll run the tests before allowing you to commit.

We have some more ideas about how to make git help us, and some of them is building a “heroku like” experience, but we do not really need it but the “trick” that makes it possible, and makes the github web hooks possible too, is the “post-receive” hook.

Since we use github, we have not implemented a post-receive patch, but we have a webhook calling a “cgi script” that was written in ruby (just for fun) that fires a deploy, the script is stupidly simple, only the following:

#!/bin/env ruby
 Dir.chdir('applicationdir')
`git pull`
puts "<html></html>"

with this script, protected by authentication of course, and the hooks we mentioned before, I have github firing a deploy in my development/test environment every time a pull-request is merged to the master branch.

Of course we do not do anything that simple and unsecure to production, but this helps a lot our test environment 😀

 

I hope these git/rails tips help you to improve your project, probably not with the exactly same scripts, but the ideas can be adjusted to your environment.

If you need more ideas or have questions about anything that I wrote here, please leave a comment.

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.

 

 

 

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 😀