Rocu.de

Love, caffeine and omlette

Author: rocu (page 2 of 6)

The awesomeness tool-chain

I have an awesomeness tool-chain — command line tools, that increase my productivity dramatically. In this blog post I want to introduce you to these powerful tools.

Cowsay

$>  echo "I love strawberries" | cowsay
  _____________________
 < I love strawberries >
  ---------------------
             ^__^
             (oo)_______
              (__)       )/
                  ||----w |
                  ||     ||

Ponysay

If you like ponies and colors more - I understand. Depends on the use case really. I found ponies way more effective if you want to communicate something that could trigger bad feelings.

sl - The ls for pros

I often mistype ls. Gone are the days were this was boring. I just lean back and enjoy the show. Steam Locomotives are a big part of being awesome.

Fortune

If you are as new to programming as me you need help, when someone asks you for you're opinion.

Fortune produces profound answers to all kind of questions you did not even ask.

$ fortune
I am the mother of all things, and all things should wear a sweater.

$ fortune
Any sufficiently advanced technology is indistinguishable from a rigged demo.
    -- Andy Finkel, computer guy

Conclusion

Being awesome requires a special tool-chain. Having ponies and quotes at your disposal is essential. I think you should give this a try.

My personal dashboard

I am collecting quite a lot of data on a continual basis:

  • Blood pressure
  • Steps
  • Weight
  • Tracked habits
  • GitHub commits
  • Follower counts
  • RSVP's for the events we host at Gutefrage.net

That's why I decided to visualize it on a personal dashboard. This weekend, I invested a few hours and came up with this:

I created a GeckoBoard, because that's what we use at the Helpster Team at Gutefrage.

All the widgets including Meetup.com, Twitter and FitBit are available on GeckoBoard already. The only widget that I had to populate myself was the Lift.do indicator.

Conclusion

Is the GeckoBoard worth 19$'s a month? I don't know.

Probably I will switch to something like Panic's Statusboard - but this requires a little more effort — I am not sure to invest this time until I know that a personal dashboard makes a difference.

Did you guy's try something similar? Then please tell me in the comments below.

Fighting bad habits with technology

I keep a list of stuff to improve. Whenever I catch something stupid it lands in there.

I try to get rid of these bad habits.

Often I find myself unable to solve the problem with willpower alone. Then I search for a solution that assists me. Maybe a little "barrier" or some kind of reminder. Let me show you, what I mean with this..

Looking at the keys all the time

When I started to program 5 years ago I looked onto my keyboard all the time. Sure - typing faster does not make you a better programmer - but typing with 2 fingers is not ergonomic.

I found a nice solution for my problem.

I bought a keyboard without letters. I was so bad to hit the proper keys, that nudged me towards learning it right. I have to admit though that I still have problems with some special keys 😉

Not moving enough during work

Like most people I had the problem that I did not take enough breaks. This was hard to change.

I started to work in Pomodoros (25 minutes of work and 5 minutes of break). Unfortunately I still did not leave my working space often enough.

So I took another iteration and added added a little AppleScript to my Pomodoro App..

After each Pomodoro my Pomodoro timer executes a little script that locks my Mac 😉

Surfing the web all the time

Unfortunately I am addicted to the internet. I am pretty OK with it most of the time — but not, when I want to be productive.

That's why i wrote a little script that blocks my internet access.

#!/bin/bash
echo "Enough of this filthy internet" | cowsay -s
sudo route -n delete default &> /dev/null

If I need to be more specific with the site I need to block, I use a program called SelfControl.

This works great! Of course as a computer guy I could circumvent this — but I do not want to.

Force pushing to master

It happened frequently that I forced pushed to master. This was really annoying for me.


Image Source: Flickr / Pascal (CC BY 2.0)

My colleague Nikolay proposed to fix it with a script. That's just what I did.

I have not force pushed to master since. This script is now also in use at some of my colleagues.

Checking working email at home

I checked working email at home. I love my work to much to let my fingers from it - but I realize that I need time of it in order to rest.


Image Source: Flickr / Tama Leaver (CC BY 2.0)

There's a simple remedy for not reading work related emails at home: Delete the freaking email account on your computers at home. It's baffling how often you will look into your empty email-client thereafter..

Checking Twitter really often

There's so much chatter at Twitter. I checked Twitter hourly. Here's what I did:

  • Remove people that write to much
  • Add a URL block-filter
  • Delete Twitter from my iPhone

    This works really well for me.

Not using arrow keys in VIM

Another stupid habit of mine was, that I used the arrow keys in order to move in VIM.

This was pretty simple to fix: I disabled them!

 not use the arrow keys any more
 nnoremap <up>    <nop>
 nnoremap <down>  <nop>
 nnoremap <left>  <nop>
 nnoremap <right> <nop>
 inoremap <up>    <nop>
 inoremap <down>  <nop>
 inoremap <left>  <nop>
 inoremap <right> <nop>

It took only a week until I was not trying to hit them any more 😉

Being to digital

Another problem of me is, that I use all my electronic devices to much. Here is what I build to prevent this: Productivity Protector 2000.

It works.

Conclusion

What is my point to show you this little collection of personal hacks?

Do not be a victim of you're bad habits.

As Nerd we have superpowers: We analyze problems. We solve them. All day long. Start applying these skills to the rest of your life!

Save a file as root in vim

I often edit files without having the right permissions in VIM.

VIM can not safe a file

I changed the file and when VIM told me that I did not have the proper permissions to save it, I quit VIM and entered sudo !! to try it again.

This was of course stupid of me. Currently I try to be more mindful about this kind of problems and to fix them.

Here's the lines that I just added to my .vimrc

" Use :w!! to save as root!
cmap w!! w !sudo tee % >/dev/null

When I enter :w!! now VIM saves the file as root.

I hope I will not encounter this problem again.

How to not use the arrow keys any more in vim

I try to wrap my head around the VIM editor since a few months. Unfortunately I do not have enough discipline to use h-j-k-l as my movement keys. But there is a solution that will teach me..

I found it deep inside the .vimrc of my colleague Fabian.

nnoremap <up>    <nop>  
nnoremap <down>  <nop>  
nnoremap <left>  <nop>  
nnoremap <right> <nop>  
inoremap <up>    <nop>  
inoremap <down>  <nop>  
inoremap <left>  <nop>  
inoremap <right> <nop>  

This turns off the arrow keys. A really obvious way of doing it 😉

I will add this to my .vimrc right away!

Wish me luck!

What my dream tech job should offer

Today I received the question from a recruiter, what he would have to offer me to leave my job.

I found his approach really interesting - so I compiled a (very personal) list of minimal requirements for working anywhere.

Enviroment of learning

  • There are people smarter than me in my team that are willing to teach.
  • I want to teach programmers that are not as experienced as me
  • Managers support personal development
  • The company to learn from it's mistakes
  • The company takes experiments

Environment of collaboration

  • People really talk to each other
  • Collaboration between departments
  • People accept help and ask for help
  • Ego plays no role

Good culture

  • Colleagues that love what they do
  • Colleagues that reflect about theire work
  • Real diversity with different interests and skill levels
  • Mutual respect
  • Colleagues that I can trust
  • If the manager is on vacation it just works 😉

Good engineering

  • Excellence
  • Straight forward solutions
  • Not reinventing wheels
  • Continous incremental improvments

Organisational

  • Pay has to be fair - slightly over industry average
  • The company should earn money
  • Ability to switch teams within the organisation
  • Environment work-life-balance is key to top performance
  • Really flexible working times
  • Possibility to work from home sometimes
  • Environment where the people do much more than there job description
  • Enough vacations
  • No questions asked for buying books, going to conferences or taking a course
  • I want to be able to talk to the CEO the CTO and it feels relaxed

Conclusion

Most of this points can not be paid for with money. It really needs work from an Organisation to get there and it takes continous work to maintain such kind of company.

I see that Gutefrage.net is already fullfilling most points on my list. I am really happy there and love the culture.

So what would a recruiter have to offer me to leave? I don't know! But why should I?

Manage your Mac Apps with homebrew-cask

A while ago I became interested in automating the setup of my Macs. I started my journey with chef-solo, however this wasn't really practical for me, so I switched to homesick to manage my dotfiles.

Unfortunately that left me without a solution to install my apps automatically.

Not any more. homebrew-cask to the rescue!

Take a walk

Image Source: Flickr/megoizzy (CC BY-SA 2.0)

What is homebrew-cask

homebrew-cask is a Homebrew extension that allows you to install your apps like this:

brew cask install evernote

How to install homebrew-cask

If you already use homebrew, installing homebrew-cask is really simple:

brew tap phinze/homebrew-cask
brew install brew-cask

If you have Alfred installed you should also configure it, so that it recognizes apps managed by homebrew-cask.

brew cask alfred link

Using homebrew-cask

Using homebrew-cask is simple. You install apps using the brew cask install command. Evernote for example, you would install like this:

brew cask install evernote

Create a little script to install your Apps

I store all my apps in a file called ~/.brew. In order to install the apps I just have to run it.

This is how you create your own:

touch ~/.brew
chmod +x ~/.brew

Now fill it with the Apps you want to install across all your Mac's.

For me this looks like:

#!/bin/bash
brew cask install google-chrome  
…
brew cask install rubymine  
brew cask install charles  
brew cask install mou  
brew cask install bit-torrent-sync  

I have this file on GitHub and symlink it with homesick. When I am on a new Mac I just have to run

~/.brew

That installs all my common apps.

Create own casks

There are over 300 casks available already. You can view a list with

brew cask search

If your favorite app is missing it is really simple to add it.

In the example below I create a Cask for Soulver.

brew cask create soulver

An editor opens with the newly generated cask.

class Soulver < Cask  
   url ''
   homepage ''
   version ''
   sha1 ''
   link ''
end  

You just have to fill in the download URL of the app, the apps name, the version, the sha1 checksum of the download and it's homepage.

class Soulver < Cask  
  url 'http://www.acqualia.com/files/download.php?product=soulver'
  homepage 'http://www.acqualia.com/soulver/'
  version 'latest'
  no_checksum
  link 'Soulver.app'
end  

In Soulver's case the download URL does always refer to the latest version. So in this case I used no_checksum, so that this Cask will not break in the future.

Now audit your cask:

$ brew cask audit soulver
audit for soulver: passed

Now you can install Soulver. And don't forget to open a pull request 😉

Before you do — check the latest contribution guidelines.

Conclusion

I am really happy that homebrew-cask exists now. It closed a gap in my configuration management. I can set up a new Mac in no time. I hope you enjoy it as much as I do.

How to secure your Apache2 webserver with a free SSL certificate

Protecting your website with TLS (SSL) is generaly a good idea, as soon as you have a admin backend or an internal statistik tool installed.

One way to do it is to sign your own SSL certificate. This offers encryption but unfortunately no verification that you really talk to the right server. Additionally all your guests will receive warnings and have to click through warnings.

Thats why a Ceritficate Authority (CA) needs to sign your cerificate. StartSSL does this for free.

In this article I show you how you can get a SSL certificate and how you configure your Apache 2 webserver to use it.

Prerequisites

In order for you to obtain a certificate you need a domain under your control. Which means you need one of the following email adresses and you need to be able to read these mails.

  • postmaster@example.com
  • hostmaster@example.com
  • webmaster@example.com

You can install the certificate on any modern webserver. However in this article I describe how you install it with Apache2 and ModSSL.

Obtaining the certificate

Register with StartSSL

Visit StartSSL.com and click on the Sign-Up button.

Fill in your personal details. Provide true informations here. StartSSL will check your data.

After having supplied your details, you will receive a verification code via email, that you have to fill in.

Now you will get a client certificate, that you can use to verify your identity to StartSSL in the future.

Validate your domain name

Log into the Controll Panel and click onto the Validations Wizard tab.

Choose Domain Name Validation.

Enter the name of your domain.

Now you have to select one of the email adresses I mentioned. StartSSL uses this adress to verify, that you own the domain.

Now you will remove a confirmation code via email, that you have to enter into the next form.

Creating a Certificate Signin Request (CSR)

Now you have established, that the domain belongs to you and StartSSL is ready to sign a Cerificate Signing Request for you. So let's create a CSR!

Log into your webserver and do the following:

$ openssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr

Enter the name of your domain, when you are asked for the common name. Here is a how the dialoge looks like:

$ openssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr

Generating a 2048 bit RSA private key  
................+++
...................+++
writing new private key to 'example.com.key'  
-----
You are about to be asked to enter information that will be incorporated  
into your certificate request.  
What you are about to enter is what is called a Distinguished Name or a DN.  
There are quite a few fields but you can leave some blank  
For some fields there will be a default value,  
If you enter '.', the field will be left blank.  
-----
Country Name (2 letter code) [AU]:DE  
State or Province Name (full name) [Some-State]:Bavaria  
Locality Name (eg, city) []:Munich  
Organization Name (eg, company) [Internet Widgits Pty Ltd]:  
Organizational Unit Name (eg, section) []:  
Common Name (eg, YOUR name) []:example.com  
Email Address []:robert@example.com

Please enter the following 'extra' attributes  
to be sent with your certificate request  
A challenge password []:  
An optional company name []:  

Now copy the content of the CSR into your clipboard

cat example.com.csr

Let StartSSL sign your CSR

Visit the "Certificates Wizard" tab and choose Webserver SSL/TLS Certificate and click on continue.

Click on skip and paste the contents of the csr file you just created into the text field.

On the next step add www. as the subdomain (or another subdomain if you do not have www).

Now save your certificate. If your domain is example.com I would save it as example.com.crt

Configure Apache2 to use the certificate

Become root or execute the following stuff with sudo

First we have to activate ModSSL

a2enmod ssl

Create a directory for your certificates

mkdir /etc/apache2/ssl

Move the .crt and the .key into the new folder

mv example.com.* /etc/apache2/ssl

We also need a ca.pem file. This file contains both the intermediate and the root certificate. You can download a finished one.

curl -L http://www.rocu.de/x/5s > ca.pem

Now configure the Virtual Host for SSL

vim /etc/apache2/sites-enabled/example.com.ssl
<VirtualHost *:443>  
DocumentRoot /var/www/vhosts/example.com/  
ServerName example.com  
ServerAlias www.example.com

SSLEngine on  
SSLCertificateFile /etc/apache2/ssl/example.com.crt  
SSLCertificateKeyFile /etc/apache2/ssl/example.com.key  
SSLCertificateChainFile /etc/apache2/ssl/ca.pem  
</VirtualHost>  

Test your Apache config before restarting

apachectl configtest

Now restart your webserver

sudo /etc/init.d/apache2 restart

You're website can be viewed with SSL now.

Final words

The process at StartSSL is anti-intuitive. I hope you were able to follow this tutorial and that your website is SSL secured now.

Depending on your use case, there are more steps that you have to take. For example you should load all assets from HTTPS or your users will get mixed content warnings.

Another good idea is to redirect your visitors to HTTPS and to activate Strict Transport Security.

If you have user other then yourself at the website, you should also follow SSL best pratices. Here is a tool that you can use to find out, what you can improve.

I leave all this as an excercise for the reader. Please leave me a comment if you have any questions or corrections.

How to become a better programmer by not programming

When I was a little bit younger I programmed all the time and did never stop. I thought that in order to get better at programming you have to programm.

This is of course true. But today I would have one advise for me: "Stop fucking programming all the time, thats just ONE way to get better."

The mind is a complicated beast and by doing unrelated activities, you can hugly increase your performance while programming.

Here are some things that I tried out - of course there are other benefitial activities, I just want to give you some ideas what you could try out.

Walking around

Take a walk
Image source: "racorn/Shutterstock""

3 years ago, I started to take extended walks around a lake nearby. They take about 90 minutes. I had some of my best ideas there. My mind is so underwhelmed that I process all the stuff that happened during the day.

If you do not have 90 minutes, you could also buy yourself a FitBit and deliberatly start to walk 10.000 or more steps every day.

It is easy to reach this goal. I walk circles during wating for the train or I take the stairs instead of the escalator.

Walking does help me to fall asleep and to maintain a relaxed and focused mind the next day, please try it!

Play with Lego

Playing with lego

I highly recommend playing with Lego. There are nerd compatible sets like Minecraft Lego, Lego Mindstorms or sophisticated Lego Technic Unimocs.

Playing lego is similar to programming: You have endless possibilities of combining the basic elements.

"Pragmatic Thinking and Learning" mentions building blocks as a tool to think about your designs. So you might even want to buy some for the office.

Take long vacations

Take a vacation at the end of the world

I think to not programm for extended periods of time (weeks / months) is really benefitial. You have time to slow down and think about what you are doing on a higher level.

When I was cruising along the Antartic Peninsula and saw the mases of ice for instance - I feelt insignifant. Work is not the most important thing on the world any more. This can be only benefitial.

If, at the end of my trips, my fingers are itching and I want to programm again - maybe I am doing something right. If not - I try to find out why I am so reluctant.

Excercise

Excercise
Image Source: " maxpro/Shutterstock"

Currently I am doing one strength exercise each day. I am not sure if these things have any mental effects - but I guess it can only be benefitial if your body is in a good shape ,if you try to sit in front of a desk all day long.

Play / Learn an instrument

Play the guitar
Image Source: "igor.stevanovic/Shutterstock"

I play the guitar. I am not good at it - but that is not the point.

I love listening to it, it relaxes me and I also think it bosts my creativity.

Also improvisation feels a lot like being in the flow during programming. Playing good requires playing economical and mastering the technique. It's a long way to mastery. Sounds familiar?

Write

Improve your communication skills with writing
Image Source: "S.Dashkevych/Shutterstock"

I write 30 minutes each day. Mainly about work related stuff.
It help's me sort out all my experiences and ideas. It helps me to reflect and share my knowledge. Last but not least it helps me to improve an important skill, that every good developer needs: To communicate clearly.

If you do not feel comfortable to write for other people - try a tech diary first.

Meditate

Mediate
Image Source: "ollyy/Shutterstock"

I am practicing mindfull meditation for some time now. You concentrate on your breath. Whenever a thought or feeling comes up during this you acknowledge it and concentrate on your breathing again.

Mediation helps me to realize ,when I get angry or exhausted at work and helps me maintain a relaxed attitude.

It also helps me to relax me after a hectic day. Unfortunately it is not easy to practice because during mediation I often realize, that my mind is everything else but calm.

But nontheless - I highly recommend giving it a shot.

Learn a new language

Learn foreign languages
Image Source: "Alfredo Ragazzoni/Shutterstock"

As with programming languages: Learning a new language is a benefitial undertaking. Recently I read that brains of programmers are bilingual. This might be true. Learning foreign languages seems more enjoyable to me, than it was in school.

Here are language learning sites that I tried out. All of them are great! And all of them have IPad-Apps 😉

Of course it helps you during your voyages if you choose to go on vacation. I speak German, English, some French, a bit of Russian and I also tried to learn german sign language (which failed - but hey maybe later)

Read random stuff

Read random stuff
Image Source: "violetkaipa/Shutterstock"

If you only read computer books until now, I recommend that you start to read books that are only slightly related to programming. Here are some books that I found great:

These books helped me to think about programming from new angles.

Change the way you eat

Change the way you eat
Image Source: "Bottaci/Shutterstock"

For a while now I try to eat a high fat, no carbs diet. I can not even begin to describe how great I feel with the new diet. This is something that you have to try for yourself in order to believe me.

No low after lunch, consistent, relaxed energie during the day and some of my health problems are far better now.

What is also nice - I learn how to cook. It still tastes dubious but at least I do something about it 😉

Train your brain

Change the way you eat
Image Source: "Eanpictures/Shutterstock"

The effects of these trainers on programmers is not really proven. For me they seem to work at least a little bit - and I like the challenge 😉

It also gives me feedback about my lifestyle, especially how rested I am. After a night with not enough sleep I suck at these games, when I play them at the breakfast table. I also suck at programming of course - but at least I know in advance.

Do stuff that you do not like

Often I deliberatly do stuff I do not like. I give talks. I listen for an hour to music I absolutely hate. I go somewhere that seems boring. I finish reading a book that seems stupid. I ride on icelandic horses.

Often at the end of the activity I am not so sure what was the reason for me hating the activity. I might still not love it, but I have pushed myself and grown a little bit.

Conclusion

So after you have read this random list of what I do - you might ask yourself what my point is.

My point is: do not microoptimize! The stuff that I do, might not be what you might want to try out. But you should really try to improve yourself in some other means than only be focusing on programming.

As a side effect you can also improve your health, your mood, your communication skills and might learn something interesting on the way, that feeds back into your programming.

I am really interested in more stuff that I could try out. What non-programming activities do you do, that feed back into programming?

How to handle errors like a professional

As a good programmer you try to get as much feedback as possible. You use automated unit tests, code reviews and metrics. For me bugs and failures fall into the same category.


"Olivier Le Moal/Shutterstock.com"

By embracing errors and working hard on avoiding them in the future, you can create a very resilient environment.

In this article I want to explain how you can get the most out of your errors.

Properties of a great error

Let's start with some properties, of a great error.

  • You notice it as soon as possible
  • You can minimize the impact
  • You find out what exactly is wrong
  • You learn from it and find a way to avoid it in the future
  • You incorporate your learning into your routine

Noticing problems as soons as possible

Sometimes errors are really obvious. The website doesn't work at all. There is a typo in the imprint. You force pushed to master or you deleted a table in the database.

But often errors are much more subtle. It's worth to consciously look out for problems. The more feedback from your application you can get the better.

That's one reason, why you want good metrics of your applications. You could also monitor your logs and notify the team if something unusual is in there. Or you have a staging environment or/and a canary server. These are all ways to discover problems really fast.

Whenever you notice that a problem went unnoticed for a really long time, this can indicate, that you could improve on that front.

For example I have often seen programs that gulp all exceptions and do nothing with them. Oftentimes it is better to be notified and act on an individual basis, then just ignore the fact that something can go wrong.

Keeping the impact of errors minimal

After you have discovered a problem - don't panic. Take a few deep breaths. Maybe even leave your desk for a minute. Get calm. Grab a coffee.

Then get help. Tell your colleagues about the problem. Either one of them already exactly knows what is happening or they are a great help at finding the problem.

Even more important: Do not waste your energy to find out who has caused the bug. The person probably already knows 😉

And hey: This is an opportunity to learn what happend and to fix the problem together.

In case it's your own error admit it. Admiting errors is not only very professional, it also generates trust and reduces damage. It's also very likelly that you are the one person, who knows exactly where to look. So speak up!

I trust colleagues, who admit errors and accept help - and so should you. They care and take responsibility. They know when to ask for help. No need for blaming.

If you have the possibility to buy time - like rolling back to the last release or toggle a feature switch, you should do this first. The less stress you feel the faster you usually find the problem and the better is the quality of your fix.

Additionally you avoid stupid mistakes if you are really relaxed. Often the situation is caotic and you need to maintain a relaxed oversight as long as you can.

You can find out why the error happened

If the cause isn't obvious you have to look for it. There are tons of ressources about troubleshooting out there.

Some good ones include:

Do not stop to early. Really try to find what happens. Even if the error is not that important or disappeared after a few hours - it is worth to understand what happened.

For example once we noticed unusally high IO after a Rails update. It was not obvious that this was an error. We didn't understand what happened and the system worked ok enough - but still something changed and we didn't get why.

We looked into the issue and found that Rack was caching all our pages on disk. It was worth looking into it. This could have brought down our whole site during a traffic spike.

Not every problem is worth fixing

Not every problem is even worth fixing. But in order to do this assessment ,you need to understand what is going on.

Sometimes a seemingly simple errors, upon further investigation, turn out to be much bigger than anticipated.

There is something to learn and you learn it

Think about what you can learn from the error. This might be one thing for some problems, but more often you can learn multiple things from one error.

For example take a syntax error that slipped onto production. The lessons could be:

  • Why the fuck did not test catch it? We should write more tests..
  • Why the hell did no one see this in the code review? Do we need to be more thourough? Or should we automatically run syntax checks?
  • Why the hell did I check this in at Sunday at 03:00 am - maybe I should sleep more

Try to come up with many reasons. No single one of them might be

Avoid it in the future

Now that you have identified, what you could improve - think about if you want to improve it. Try to act on it and avoid the same kind of problems in the future. Also share your insights and a nice description of the problem with other programmers online - or even better keep a little engineers diary and write this stuff down for yourself.

If you use something like a team Wiki and you think you discovered a lesson - put it in there. The next colleague having a similar problem might thank you.

A recent example for such a measure in our team is the following:
I accidently force pushed to master. First I tried to stop myself soon enough but after being on a cruise I did it again. So I wrote a little git hook that prevents me from doing it. In the future. No force pushing to master from me since.

Some of my colleagues also have installed this hook as a safe guard now.

Conclusion

An error is no reason for blame - but an opportunity for improvment. Treat it as whar it is - just another kind of feedback that something in your process is not perfect yet.

Incorporate this feedback wisely to avoid the same problems from occuring again. Share your lessons.

How do you handle problems in your environment?

Older posts Newer posts

© 2017 Rocu.de

Theme by Anders NorenUp ↑