5 WHYs

Problem solving is a whole science. To solve the problem, you need to understand the root cause. It's not always simple to figure out the real root cause, so you'd need to speculate, search, suggest and fail till you get more information to define the root cause. Just re-trying the same thing again and again till it's fixed won't help.
There are different techniques to find the root cause. One of them is "5 WHYs".

Onion Routing

I've being interested in how Tor is working for a long time already. So just recently got to the reading more about it and especially about the technique that is a heart of Tor. This technique is called Onion Routing and this random-random-note (RRN) is about it.

Before, I quite couldn't understand how anonymity could be reached in the modern networks. However, onion routing is actually quite simple but powerful way to do that. All genius is simple!

Psychology of Everyday Things

This is the final notes after my readings the "Design of Everyday Things" by Donald Norman, which is really awesome book. Notes are kind of unstructured and, maybe, not even worth publishing here. But I'll give it a try.

Conceptual Model

Conceptual model is our way to see how the thing might work and how to operate over it. For example, when we see a bike, we can understand how it works in general be modeling it in our mind. Conceptual model is actually defined by 3 parts - affordance, constraints and mappings.
Affordance helps to understand how basically approach the thing. Constraints help to see how the best operate over the thing.

Affordance and Contraints helps to make the conceptual model obvious. For example, scissors. There are 2 holes in it. So we can understand that they are to put something inside, like fingers. While constrains help to understand what fingers we need to put inside.
Affordance and constraints helps to build visibility, which is required to understand how the thing works and what it is for. For example, scissors have clear visibility, while handwatches with multiple are not as clear. Obvious conceptual model is required for product, if you want its design to be transparent to customers.
Design model is how the product seen by its designer. User model is how the product seen by its user.

Gossip Protocol

Gossip protocol is a style of inter-process communication in the network, inspired by gossips that happen in a human social groups. Basically, nodes (peers) exchange some information. This information may contain the knowladge that node gain by itself (eg some events), received from user (eg search queries) or received from other nodes during conversation with them.

Peers are connecting to each other in a random manner to ensure that information is shared pretty quickly. This could be like 10 times per second that one peer connects to another and exchanges the information.

It's also possible to organize the groups of hosts where each node share the information only with nodes within this group. This simplifies finding next random node to communicate, and limits the number of random useless connections between nodes. Some nodes are shared between multiple groups, to ensure that information is spread over the whole network. As an alternative, nodes could communicate only with it's near neighbors. Another alternative is to define the hierarchical levels, thus minimize the need to send message to everyone, but instead only some hosts in the specified level.

Gossip protocol unfortunately does not not guarantee that knowledge would be shared between all nodes. Another issue is that the received information might be not correct or valid anymore (well, that's in the nature of gossips, right?). Also it is said that gossip protocol maintains relaxed consistency.

Another good usage of gossips is to multicast information over the network without known structure. For example, it's not always possible to multicast information using multicast IP, because hosts might be organized into different restricted networks.

Gossip protocols are in the core of the internet.

When using gossip protocols it's better to share information about the fact than the fact itself, ie configuration was changed instead of new value for property A is B. This is also true in many distributed systems.


There are multiple usages for gossip protocol, some of them are:

  • propagate events between multiple hosts, so each node could react if need
  • could be used to route data using different paths (get the data, split on packages, deliver to the target using different routes)
  • could be used to aggregate values among different hosts (each node receive the data, check if it was seen, if not - aggregate with own data and send forward to next hosts)
  • search among large amount of nodes (used in unstructured P2P networks)
  • finding the list of nodes or just counting nodes in the network of unknown size and structure
  • electing leaders
  • sorting nodes in the network, detecting failures and errors, recovering the network structure
  • used for monitoring and gathering data, for example for load balancing
  • can help with detecting network partitions and dynamic insertions of new services
  • heartbeat implementation
  • implementing epidemic algorithms in the network
  • gather information about other nodes to make local decision, like load balancing, accessing data located in specific nodes etc.; do this in scalable way
  • detecting new nodes and additing them to the cluster or load balancer, updating DNS records etc.

But usually gossip protocols are not the most efficient one. It's pretty often possible to find some specific protocol that does the job better. However, some other protocols may not work for large networks (ie paxos), while others are centralized thus might have failure issues (ie based on centralized db).

Another downside of gossip protocols are:
same information can be delivered same host twice
message latency is usually high especially for large networks

My Setup

A few weeks a go I found for my self again a nice website usethis.com with interviews of different people who describes their setup. I found a lot of intersting there, and decided to share my own setup. Although I believe it is pretty standard these days.

So, I have a desktop and 2 laptops. My desktop is based on Mac Mini late 2012 where I replaced 4g with 16g ram. I'm using OS X 10.8 in order to support the hack that allows me using my Seiki 4k TV as monitor. I have also Dell 24 monitor, but not using it anymore. My personal laptop is MacBook Pro w/ Retina '13. The other is my work laptop Lenovo ThinkPad T420 with Ubuntu on it. I have 6g ram and 120g SSD drive there, so its pretty ok.

I have Nexus 4 as my phone and Nexus 7 as my tablet.

I also use BitTorrent Sync to sync projects and personal files (including books, videos and photos) between my desktop, laptop and mobile devices. Very handy, as I always have my files available everywhere. Highly recommended!

I use Kindle 3 and Paperwhite as my readers. Actually, I prefer to use Kindle App to read ebooks on my mobile devices. I'm actively using Pocket for reading articles both on mobile gadges and on desktop/laptop. I found it very helpful to keep reading more and more. For sharing links between devices and browsers, I'm using SyncTab. With a new plugin for FF it works for me even better.

I recently switched from Chrome back to the Firefox. In FF I'm fan of plugins like Tree Style Tab, Evernote Clearly, SyncTab and GreaseMonkey.

IntellijIDEA and PyCharm is what I'm usign for developing on Java and Python. I also use SublimeText as text editor for scripts, html and notes. Next plugins for Sublime as invaluable for me nowadays: MarkdownEditing, Markdown Preview, Git and GitGutter. I'm actively using Markdown for my notes. And keep notes, private and public projects on GitHub.

I have also operational notes and todos, which I keep in Evernote. Again, Evernote apps are installed just everywhere - desktop/laptop and mobile devices. However, for my bookmarks, I got back to Delicious. They are not in the best times of thei life, but works good so far for me. As for RSS reader, I finally got used to Feedly, althought still missing Google Reader a lot!

As for the music, I use Spotify to listent to music on my devices, but also have ipod shuffle, which is always with me.

On OSX I'm also using iterm2 with zsh and brew.

My preferred games on mobile devices are Andoku and 2048.

For backing up data and sharing, except BTSync and Evernote, I also use Google Drive and Dropbox. I also upload my photos to Flickr.

I think, I'm done now...

And yeah, some picture: