<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;DEQGQ3s_fCp7ImA9WhRbEE8.&quot;"><id>tag:blogger.com,1999:blog-35841277</id><updated>2012-01-31T11:12:02.544-05:00</updated><category term="Microsoft" /><category term="wiki" /><category term="Powershell" /><category term="AJAX" /><category term="change" /><category term="WebDAV" /><category term="Russian" /><category term="Spotify" /><category term="Competence" /><category term="Java" /><category term="Prolog" /><category term="SOA" /><category term="Requirements" /><category term="time" /><category term="commitment" /><category term="Agile" /><category term="Ruby" /><category term="Language" /><category term="PDC" /><category term="Travel" /><category term="search" /><category term="XML/XSLT" /><category term="JavaScript" /><category term="J2EE" /><category term="Colorer" /><category term="Automation" /><category term="Excel" /><title>Pavel Veller's blog</title><subtitle type="html">The world needs a hero</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>48</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/pveller" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="pveller" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CE4AQX44eSp7ImA9WhRUFUg.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-1172103870157692986</id><published>2012-01-25T23:37:00.001-05:00</published><updated>2012-01-25T23:42:20.031-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T23:42:20.031-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><title>Neat JavaScript syntax shortcuts</title><content type="html">Every language has a few nice features that are natural result of the syntax rules. It's just many really neat ones are not part of the mainstream code that is being written. Some examples:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Java's double brace initialization&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java;toolbar:false"&gt;final List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;() {{ 
    add(&amp;quot;a&amp;quot;);
    add(&amp;quot;b&amp;quot;);
    add(&amp;quot;c&amp;quot;);
}};
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Ruby's idiomatic default assignment&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:ruby;toolbar:false"&gt;my_data ||= ""
&lt;/pre&gt;&lt;br /&gt;
I came acorss a few nice JavaScript syntax "shortcuts" today that I haven't seen before. Maybe I just didn't pay attention?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Anonymous function call&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
If you write &lt;a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript"&gt;unobtrusive javascript&lt;/a&gt; or just unconsciously use a lot of jQuery then you do a lot of this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js;toolbar:false"&gt;(function($) {
...
})(jQuery);
&lt;/pre&gt;&lt;br /&gt;
well, if you're tired from wrapping all your anonymous functions into extra ( ) here's a shortcut for you:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js;toolbar:false"&gt;!function($) {
...
}(jQuery);
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Getting boolean out of virtually anything&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Say you have something passed to your function or there's something you receive from another function and all you need to know is that it's "there". You basically need "true" if it exists or "false" otherwise. Here's a neat shortcut to do so:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js;toolbar:false"&gt;myFlag = !!varToVerify;
&lt;/pre&gt;&lt;br /&gt;
The double negate will yield true for anything but a boolean false, NaN, or undefined (which will throw an error). Infinity will yield true. You can test it on &lt;a hred="http://jsconsole.com"&gt;jconsole&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:js;toolbar:false"&gt;!!parseInt('a'); // prints false
    a = !!1/0; // prints Infinity
    a ? 1 : 2; // prints 1
    !!b; // errors out with 'b' is not defined
    !!Object.prototype.toString; // prints true
    !!{}; // prints true
&lt;/pre&gt;&lt;br /&gt;
What else? what other neat JavaScript syntax "shortcuts" you can share?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-1172103870157692986?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/1172103870157692986/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=1172103870157692986" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1172103870157692986?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1172103870157692986?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2012/01/neat-javascript-syntax-shortcuts.html" title="Neat JavaScript syntax shortcuts" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;Dk8CRHkzeip7ImA9WhRUFEk.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-7552432204709565132</id><published>2012-01-24T17:36:00.002-05:00</published><updated>2012-01-24T17:41:05.782-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-24T17:41:05.782-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Prolog" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Spotify" /><title>Spotify Puzzle in Java, Ruby, Prolog and ... Common Sense</title><content type="html">I like music and rarely work without a nice track playing in the background. Pandora and MOG are always with me, on my laptop, on my iPhone, on my Kindle. I believe my TV has a Pandora app and I saw one running on my neighbor's fridge (fancy that). Last week I figured I would check out Spotify just to make sure I wasn't missing out on something even better. Facebooking is not something I do so that's how I missed all the buzz I guess. Anyway, long story short, I didn't chose Spotify over MOG but I did find myself a puzzle to spare a few night hours with. &lt;br /&gt;
&lt;br /&gt;
These guys posted &lt;a href="http://www.spotify.com/us/jobs/tech"&gt;a few puzzles&lt;/a&gt; for their candidates to try before one would consider applying for an engineering job at Spotify. As of time of this writing there are three, each labeled with a music genre - reggae, funk, and heavy metal. I would almost always prefer heavy metal over reggae and funk given no other choice so I knew which one I would tickle my brain with.&lt;br /&gt;
&lt;br /&gt;
The &lt;b&gt;&lt;a href="http://www.spotify.com/us/jobs/tech/bilateral-projects"&gt;Bilateral Projects&lt;/a&gt;&lt;/b&gt; is about finding an optimal solution to what sounds like an easy problem. You have project teams of exactly two individuals each from one of two different offices and you need to invite the smallest amount of people to a company conference to save on expenses while having all projects represented. Same people can work on more than one project hence a potential for savings. Should the problem have more than one optimal solution you would pick one that would invite your friend  otherwise you wouldn't really care. Oh, and a very important detail as we will soon learn. The input may ask you to optimize for as many as 10,000 project teams.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Java&lt;/h3&gt;&lt;br /&gt;
First, let's do a careful, defensive-style object oriented brute force solution in Java. We would find all possible solutions, reduce the list to only optimal ones, and finally pick one that ideally has our friend in it. Clearly not a solution for large data sets but a good way to test the waters and see what we've got here. &lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Note: if you're here for a &lt;u&gt;solution&lt;/u&gt; then you should scroll down to the Dominating Set chapter, the Java part won't be of much interest to you. O(2^n) isn't really a solution for anything larger than a handful of teams.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
The full code is &lt;a href="https://github.com/pveller/Spotify-Heavy-Metal-Puzzle/tree/master/Java"&gt;on github&lt;/a&gt; and here's the important pieces. Input data is parsed into a collection of &lt;a href="https://github.com/pveller/Spotify-Heavy-Metal-Puzzle/blob/master/Java/src/main/java/home/spotify/bilateral/Team.java"&gt;Team&lt;/a&gt; objects each referencing two &lt;a href="https://github.com/pveller/Spotify-Heavy-Metal-Puzzle/blob/master/Java/src/main/java/home/spotify/bilateral/Employee.java"&gt;Employee&lt;/a&gt; objects (we could clearly work with primitive arrays but that's something I left for Ruby). It's now time to build a list of all possible solutions to the puzzle. There are algorithms to build all &lt;a href="http://www.merriampark.com/comb.htm"&gt;combinations&lt;/a&gt; and &lt;a href="http://www.merriampark.com/perm.htm"&gt;permutations&lt;/a&gt; but we need a slightly different thing that can be expressed in a much simpler way. We only need one of the two team members from each team which means 2^n choices that we can visualize as a binary tree. A tree as deep as many teams we have branching out and doubling the nodes on each level to have 2^n on the bottom leaf level. Take a look.&lt;br /&gt;
&lt;br /&gt;
Each line in the dataset on the left represents a team of two employees referenced by their IDs. Full solutions tree would look like the one to the right:&lt;br /&gt;
&lt;br /&gt;
&lt;table&gt;&lt;tr&gt; &lt;td width="100px"&gt;&lt;br /&gt;
&lt;pre&gt;1009 2002
1009 2021
1002 2002
1003 2038
1003 2002
1021 2021
1022 2024
1088 2031
&lt;/pre&gt;&lt;/td&gt; &lt;td&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-daRT97slGN8/TxnxQ_EV8LI/AAAAAAAAASE/Shm4ZGPyq8Q/s1600/bilateral-b-tree.png" imageanchor="1" style=""&gt;&lt;img border="0" height="155" width="320" src="http://4.bp.blogspot.com/-daRT97slGN8/TxnxQ_EV8LI/AAAAAAAAASE/Shm4ZGPyq8Q/s320/bilateral-b-tree.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
And the code does exactly that. It loops through all teams, accumulates a List&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt; (a path from the root down to the end leaf node is a set of nodes you need to walk through, and outer list as a collection of all possible ways down), creates a new solution branch on each step adding employees from the team as leaf "nodes":&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java;toolbar:false;"&gt;private List&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt; generateAllSolutionsList() {
    final List&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt; accummulatedSolutions = new ArrayList&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt;();
    accummulatedSolutions.add(new HashSet&amp;lt;Employee&amp;gt;()); // root of the solutions tree
    
    for (final Team team : projects) {
        final List&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt; newBranch = new ArrayList&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt;();
                
        for (Set&amp;lt;Employee&amp;gt; solution : accummulatedSolutions){
            final Set&amp;lt;Employee&amp;gt; solutionSibling = new HashSet&amp;lt;Employee&amp;gt;(solution);

            solution.add(team.getLondonEmployee());  // &amp;quot;left&amp;quot; leaf node (existing branch)
            solutionSibling.add(team.getStockholmEmployee()); // &amp;quot;right&amp;quot; leaf node (new branch)
            
            newBranch.add(solutionSibling);
        }
        
        accummulatedSolutions.addAll(newBranch);
    }
    
    return accummulatedSolutions;
}
&lt;/pre&gt;&lt;br /&gt;
Having a superset of all solutions we now just need to reduce it a few times to get to the bottom of it. First, let's sort them all and get that minimum size we were looking for:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java;toolbar:false;"&gt;final List&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt; allPossibleSolutions = generateAllSolutionsList();
Collections.sort(allPossibleSolutions, 
        new Comparator&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt;() {
            @Override
            public int compare(Set&amp;lt;Employee&amp;gt; set1, Set&amp;lt;Employee&amp;gt; set2) {
                return set1.size() - set2.size();
            }
        });

final int smallest = allPossibleSolutions.get(0).size();
&lt;/pre&gt;&lt;br /&gt;
Now reduce it to only optimal solutions:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java;toolbar:false;"&gt;// reduce to only optimal solutions
final List&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt; optimalSolutions = new ArrayList&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt;();
for (Set&amp;lt;Employee&amp;gt; s : allPossibleSolutions) {
    if (s.size() &amp;gt; smallest) {
        break; // sorted list so we know all others are even larger in size
    } else {
        optimalSolutions.add(s);
    }
}
&lt;/pre&gt;&lt;br /&gt;
Finally, try to find that best solution that has our friend in it:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java;toolbar:false;"&gt;// SPEC: If possible (subject to the set of people being smallest possible), 
//       the list of invitees should include your friend
final Employee myFriend = new Employee(MY_FRIEND_ID);

// reduce to those having our &amp;quot;friend&amp;quot;
final List&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt; bestSolutions = new ArrayList&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt;();
for (Set&amp;lt;Employee&amp;gt; s : optimalSolutions) {
    if (s.contains(myFriend)) {
        bestSolutions.add(s);
    }
}

final List&amp;lt;Set&amp;lt;Employee&amp;gt;&amp;gt; solutions = !bestSolutions.isEmpty() ? bestSolutions : optimalSolutions; 
final Set&amp;lt;Employee&amp;gt; solution = solutions.get(0);
&lt;/pre&gt;&lt;br /&gt;
Given the data set we used to illustrate the solutions tree the code would find a 5 people solution: 2002, 2021, 2038, 2024, 2031.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Dominating Set&lt;/h3&gt;&lt;br /&gt;
Before we move on to other languages and potentially better ways to solve the heavy metal puzzle let's see what we're dealing with. If we plot employees on a chart and cross-link people who work together we'll end up with a graph (or a set of graphs) with employees as vertexes and projects and edges. Here's one for the dataset we've already looked at:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-pOSAbDy64v8/Txmp95BngWI/AAAAAAAAAR4/1tbjFmzS4mE/s1600/bilateral-graph.png" imageanchor="1"&gt;&lt;img border="0" height="228" src="http://2.bp.blogspot.com/-pOSAbDy64v8/Txmp95BngWI/AAAAAAAAAR4/1tbjFmzS4mE/s320/bilateral-graph.png" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
I used orange coloring for the employee nodes that represent the optimal solution. You see how all other nodes not colored are connected to at least one colored node by an edge? It make sense, right? We want to pick employees to represent all projects so we should have all edges "covered" by the highlighted set. In graph theory a set like this is said to be &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Dominating_set"&gt;a dominating set&lt;/a&gt;&lt;/b&gt;. And there's apparently a &lt;b&gt;dominating number&lt;/b&gt; that represents the number of vertices in a smallest dominating set... As wikipedia says, the dominating set problem [..] is a classical NP-complete decision problem [..] therefore it is believed that there is no efficient algorithm that finds a smallest dominating set for a given graph.&lt;br /&gt;
&lt;br /&gt;
Right. Why would otherwise folks over at Spotify have called this one a "heavy metal" puzzle? :)&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Ruby&lt;/h3&gt;&lt;br /&gt;
My original idea was to illustrate that one would use much less words to express same thing in Ruby but rewriting a brute force solution in Ruby is no fun so let's optimize it a bit. Instead of building a list of all potential solutions let's just try to get straight to that optimal one. &lt;br /&gt;
&lt;br /&gt;
The idea is to:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Try to figure out who is more likely to make it to the final list of attendees&lt;/li&gt;
&lt;li&gt;Add that likely candidate to the attendees list and reduce the list of projects removing all that the selected candidate works on.&lt;/li&gt;
&lt;li&gt;As we reduce the projects list we will keep notes of other people who participate in those being removed. This way we will know we don't need them unless they represent other projects&lt;/li&gt;
&lt;li&gt;For the teams that don't have a clean "winner" we would take either one giving a preference to our friend (if he or she is one of the two) otherwise we'll try to balance between the two offices&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Our Solver will keep track of projects, employees, and selected attendees (oh, and full listing is of course available over &lt;a href="https://github.com/pveller/Spotify-Heavy-Metal-Puzzle/blob/master/Ruby/src/solver.rb"&gt;on github&lt;/a&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:ruby;toolbar:false;"&gt;class Solver
 attr_accessor :projects, :employees, :attendees

end
&lt;/pre&gt;&lt;br /&gt;
When solver initializes itself from the input data it builds a list of projects (a project is a simple two elements array and a list of projects is an array of project arrays), and also calculates how many projects each employee participates in. The latter we would keep in a hash with employee ID as a key and a number of projects as a value:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:ruby;toolbar:false;"&gt;def initialize(fileName)
    # a project is a team of two. collect all projects into an array
    @projects = File.readlines(fileName).grep(/^\d+\s\d+$/).collect {|line| line.split(/\s/)}

    # employee ID as a key and project participation index as a value, default to 0
    @employees = Hash.new(0)

    # calculate participation index
    @projects.flatten.each {|e| @employees[e] += 1 }
    @attendees = []
end
&lt;/pre&gt;&lt;br /&gt;
well, it's time to optimize it:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:ruby;toolbar:false;"&gt;def optimize()
    # project with the most "active" employees and ideally a project with a clean winnder
    project = @projects.sort_by! {|p| (@employees[p.first] - @employees[p.last]).abs}.last
    
    @attendees &amp;lt;&amp;lt;
        if (@employees[project.first] != @employees[project.last])
            # clean win
            (@employees[project.first] &amp;gt; @employees[project.last]) ? project.first : project.last
        else
            # a tie with a prefernece to "a friend"
            project.include?("1099") ? "1099" : project[rand(2)]
        end
    
    # discard projects that the attendee participates in 
    # and reduce  participation index of the individuals on those teams
    @projects.reject! {|p| p.include?(@attendees.last) &amp;amp;&amp;amp; p.each {|e| @employees[e] -= 1}} 
    
    optimize() if @projects.length &amp;gt; 0
end
&lt;/pre&gt;&lt;br /&gt;
That's it. A bit of "side effect" programming and we're done. It generates a slightly different though still optimal solution: 2002, 2021, 2024, 1003, 2031.&lt;br /&gt;
&lt;br /&gt;
Note: project list is sorted in place using the ! version of the sort_by to keep subsequent sorting close to a best case O(n). There's still room for improvement though: we could stop recursing and re-sorting once we know the rest of the list are teams that don't have "shared" resources on them. We could also do a more intelligent sorting to push project teams where people are equally shared across more than one projects first when there's no more "unbalanced" teams. I am jumping ahead of myself a little bit but my tests didn't show any noticeable difference from those improvements so I voted for smaller and cleaner code, not the code that pretends to be "smarter" when it's not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Prolog&lt;/h3&gt;&lt;br /&gt;
I have to admit I spent a few evenings "learning" it before I could express a solution to the puzzle in a declarative way. I thought the experience I had with inference systems in a comfortable environment of imperative languages (JBoss Drolls, for example) will be enough to just "get" it and boy, was I wrong. It's predicates, not functions; it's unification, not assignments; it's terms and atoms, not variables; and on and on it goes. If you never programmed the &lt;i&gt;logical&lt;/i&gt; way I dare you to try! Like Bruce Tate wrote about Prolog in his &lt;a href="http://pragprog.com/book/btlang/seven-languages-in-seven-weeks"&gt;Seven Languages in Seven Weeks&lt;/a&gt;: "if this is your first exposure, I guarantee either you will change the way you think or you'll fail". A good &lt;a href="http://www.csd.uwo.ca/~lila/logic14.pdf"&gt;prime on predicate calculus&lt;/a&gt; might also help.&lt;br /&gt;
&lt;br /&gt;
Prolog's approach to solving any kind of problem you would throw at it is all about permutations. It's optimized to &lt;i&gt;proof search&lt;/i&gt; and &lt;i&gt;backtrack&lt;/i&gt; the decision tree so we know the puzzle will be solved with the "brute force"'s O(2^n) "complexity". Let's see:&lt;br /&gt;
&lt;br /&gt;
Firs, we define the &lt;i&gt;attendees&lt;/i&gt; rule. It starts with a terminate empty goal to make sure the recursion has where to stop. Then we say that either one of the two employees is a good solution for a one team puzzle, and then we recursively solve it for a list of teams. &lt;i&gt;attendees&lt;/i&gt; works on a list of tuples and in this form would report the entire solutions tree (just like that one we build in Java). The sort predicate at the end will make sure the solution set is free of duplicate employees (those shared across more than one project teams thus listed more than once).&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:gnuprolog;toolbar:false;"&gt;attendees([], []).
attendees((E1, _), [E1]).
attendees((_, E2), [E2]).
attendees([H|T], Solution) :- 
    attendees(H, AttendeeFromFirstTeam), 
    attendees(T, AttendeesFromOtherTeams), 
    append(AttendeeFromFirstTeam, AttendeesFromOtherTeams, Accumulator), 
    sort(Accumulator, Solution).
&lt;/pre&gt;&lt;br /&gt;
It's now time to find that optimal solution that ideally has our best friend in it. Let's collect the list of all solutions, sort it by length (assuming lists are free of duplicates), push lists with our friend to the front among same length lists, and then just pick the first one. We are going to need a custom sorting predicate:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:gnuprolog;toolbar:false;"&gt;optimize(Result, ListA, ListB) :- 
    length(ListA, X), 
    length(ListB, Y),
    (\=(X,Y) -&amp;gt; compare(Result, X, Y) ; (member(1099,ListA) -&amp;gt; Result = (&amp;lt;) ; Result = (&amp;gt;))).
&lt;/pre&gt;&lt;br /&gt;
&lt;i&gt;optimize&lt;/i&gt; compares by length when two lists are different in size and, when two lists represent an equally optimal solution, returns the one with our friend in it (if found) or the first one. Here's the &lt;i&gt;solve&lt;/i&gt; goal:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:gnuprolog;toolbar:false;"&gt;solve(AllTeams, OptimalSolution) :- 
    setof(Solution, attendees(AllTeams, Solution), UniqueSolutions),
    predsort(optimize, UniqueSolutions, [OptimalSolution|_]),
    length(OptimalSolution, L),
    print(L).
&lt;/pre&gt;&lt;br /&gt;
It collects all permutations as delivered by the &lt;i&gt;attendees&lt;/i&gt; goal, sorts them with the &lt;i&gt;optimize&lt;/i&gt;, picks the head of that list and prints its length. When solver.pl is loaded you can ask Prolog a question like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;solve([(1009,2002),(1009,2021),(1002,2002),(1003,2038),(1003,2002),(1021,2021),(1022,2024),(1088,2031)], Solution).
&lt;/pre&gt;&lt;br /&gt;
and it will gladly respond:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;5
Solution = [2002, 2021, 2024, 2031, 2038].
&lt;/pre&gt;&lt;br /&gt;
You can find projects.pl &lt;a href="https://github.com/pveller/Spotify-Heavy-Metal-Puzzle/blob/master/Prolog/projects.pl"&gt;on github&lt;/a&gt;. Note: Prolog dialects vary. I used SWI-Prolog and then tried to run it in GNU Prolog and it didn't work. GNU version didn't like the predsort/3 which I believe is SWI-Prolog "extension".&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Let's Rock!&lt;/h3&gt;&lt;br /&gt;
There's not much examples on the Spotify website so I had to generate a few data sets to see how well we can cope with the puzzle, at what point each solution breaks, and whether it finds that optimal solution. The generator that I quickly put together is capable of building various setups based on a few parameters: number of teams/projects, how many employees from each office to consider (a density factor basically and a way to do balanced and unbalanced participation), and finally whether to "pad" it with our friend a few extra times. It produces data files with the names like this - dataset_A_B_C_D - where A is how many teams we asked it to generate, B and C stand for how many Stockholm and London employees it randomized project participation across, and D is for up to how many times it tried to squeeze our friend into the project teams. You can find the generator &lt;a href="https://github.com/pveller/Spotify-Heavy-Metal-Puzzle/blob/master/Ruby/src/generator.rb"&gt;on github&lt;/a&gt; as well.&lt;br /&gt;
&lt;br /&gt;
Let's start with a few simple tests. 20_7_4_0 is a slightly unbalanced setup but it's a good test. We know right of the bat that the optimial solution can't require more than four employees. It can be less if rand(4) didn't spit out all the options though it's unlikely for 20 runs. So let's see: Java solution said it's 4 very quickly, so did Ruby version, so did Prolog. &lt;br /&gt;
&lt;br /&gt;
30_10_10_2 is already large enough to keep Java spinning and eventually run out of heap space. I gave it some more and it ate it all up and was still not satisfied. That was to be expected with exponential complexity and all those Set objects. Prolog ran out of local stack recursing into the solutions tree. Poor guy. Ruby version was very fast telling me it needed only 9 employees. I would expect it at max to be 10 so 9 is believable. 100_30_20_0 reports back it needs 20. 100_80_60_0 says 51. (your experience may vary as data sets are essentially randomized). 100_500_500_0 says 85. Again, I would expect the number to be less than 100. So far so good.&lt;br /&gt;
&lt;br /&gt;
500_50_50_0 reports... 53. 5,000_500_500_0 reports ... 563. And the edge case of 40,000_999_999_0 took a few seconds to generate and about 20 seconds to solve. It reported... 1014. &lt;b&gt;Well, now we know we didn't crack it completely&lt;/b&gt;... We'll get back to this one in a minute. &lt;br /&gt;
&lt;br /&gt;
To wrap it up on the algorithmic part, Java and Prolog solutions have at least O(2^n) complexity to collect the solution tree plus n*log(n) sorting (they all do variations of merge sort) and some more overhead. The Ruby version in the worst case would loop n times and each time do n*log(n) of sorting and another n iterations to "reject" the processed project(s). That gives us O(n^2*log(n)) if I am not mistaken. No surprise it can get to the bottom of a 40,000 set. Windows calculator in a scientific view reported "overflow" when I tried to look at 2^40,000. And n^2*log(n) for 40,000 is a little shy of 10 billions which isn't really a big deal to iterate through, especially with the tail recursion keeping it all "flat". I have to admit though that I liked the way Prolog solution "sounded". &lt;br /&gt;
&lt;br /&gt;
So what's up with those large sets producing suboptimal results? Well, I wouldn't expect I could find a fast algorithm to what folks with PhD in computer science believe to be a classical NP-complete problem :) Here comes the last optimization. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Common Sense&lt;/h3&gt;&lt;br /&gt;
If the "optimized" answer after 20 seconds of crunching the numbers is larger than the number of employees from one of the two offices participating in all projects then do the following. If you're still up for some savings and can afford having one of the two offices miss the Barbados "thing" and still be there when you come back then just take the smallest office with you. If you don't think your talent will stick around when you dump them like that then I see another option. Understand that people is the most important asset in your business and if you truly can't take everybody to Barbados then take them all to either London or Stockholm and have some real fun together :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-7552432204709565132?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/7552432204709565132/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=7552432204709565132" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/7552432204709565132?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/7552432204709565132?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2012/01/spotify-puzzle-in-java-ruby-prolog-and.html" title="Spotify Puzzle in Java, Ruby, Prolog and ... Common Sense" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-daRT97slGN8/TxnxQ_EV8LI/AAAAAAAAASE/Shm4ZGPyq8Q/s72-c/bilateral-b-tree.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkYCRn49fyp7ImA9WhdWFEg.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-1634504855379410093</id><published>2011-09-07T22:49:00.000-04:00</published><updated>2011-09-07T22:49:27.067-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-07T22:49:27.067-04:00</app:edited><title>Very simple Java puzzle</title><content type="html">I spent a good minute figuring out what was going on. See if you like solving this one:&lt;br /&gt;
&lt;br /&gt;
The piece of code I will be showing in a second receives a String that might have a single digit at the end. I need to extract that digit and increment by one. If you wondered, the code is actually a content automation tool that runs inside the Apache Jackrabbit (it's actually Adobe Day CQ/CRX) and it's messing with the content nodes and their attributes. Sibling nodes have unique names and CQ simply adds the _x, where x increments with every new node of the same original name. My script needs to do the same and so I am looking at an existing node and trying to parse out it's "x" to further increment it. It goes like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;if (Character.isDigit(nodeName.charAt(nodeName.length() - 1))) {
    colNumber = Math.max(colNumber , Integer.valueOf(nodeName.charAt(nodeName.length() - 1)) + 1);
} else {
    colNumber++;
}
&lt;/pre&gt;&lt;br /&gt;
and for a nodeName of colctrl_1 is says the next number is ... 50.&lt;br /&gt;
&lt;br /&gt;
if I do like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;if (Character.isDigit(nodeName.charAt(nodeName.length() - 1))) {
    colNumber = Math.max(colNumber , Integer.parseInt(nodeName.charAt(nodeName.length() - 1)) + 1);
} else {
    colNumber++;
}
&lt;/pre&gt;&lt;br /&gt;
I will get a compilation error because there's not parseInt(char). so I change it to look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;if (Character.isDigit(nodeName.charAt(nodeName.length() - 1))) {
    colNumber = Math.max(colNumber , Integer.parseInt("" + nodeName.charAt(nodeName.length() - 1)) + 1);
} else {
    colNumber++;
}
&lt;/pre&gt;&lt;br /&gt;
now it reports the next number is 2. &lt;br /&gt;
&lt;br /&gt;
I am sure you know why, I now do too. Still, will you tell me? &lt;br /&gt;
&lt;br /&gt;
p.s. Here's a nice read from Alex Miller on the Integer.valueOf(): &lt;a href="http://tech.puredanger.com/2007/02/01/valueof/"&gt;http://tech.puredanger.com/2007/02/01/valueof&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-1634504855379410093?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/1634504855379410093/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=1634504855379410093" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1634504855379410093?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1634504855379410093?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2011/09/very-simple-java-puzzle.html" title="Very simple Java puzzle" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CEIHQn49fyp7ImA9WhdXEUw.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-7173721392374757390</id><published>2011-08-23T10:39:00.003-04:00</published><updated>2011-08-23T11:15:33.067-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-23T11:15:33.067-04:00</app:edited><title>Just a day in life: "In and Out"</title><content type="html">&lt;style&gt;
  #inandout td:first-child {
    width: 70px;
    vertical-align: top;
  }
&lt;/style&gt;&lt;br /&gt;
&lt;table style="border:0" id="inandout"&gt;&lt;tr&gt;&lt;td&gt;4:00am - &lt;/td&gt;&lt;td&gt;alarm goes off on my iPhone.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4:10am - &lt;/td&gt;&lt;td&gt;my cab is already upfront. first time on time&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4:20am - &lt;/td&gt;&lt;td&gt;in the cab. I am sure Frank is the only white driver in Atlanta, really nice guy, works all nigths. He moved here from Arizona more than 10 years ago. He tells me it's a paradize there. I know it's not, I've been there three times when I had a project with a client down there. It was 110 early in June! That's above 40 in centigrades! It's very dry down there so you don't have that humid air like you do in south east, but the heat still kills you. The brain starts melting afer a short five minutes walk. You basically spend your summer (and it's not a three months summer, believe me) indoors to enjoy the rest of the year outside. I guess some people just tend to like their home places most of all...&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4:55am - &lt;/td&gt;&lt;td&gt;at the airpot. I-75 goes straight through thre downtown. nice ride in the morning&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5:15am - &lt;/td&gt;&lt;td&gt;past the security gate (ATL is a way better than PHL on Monday mornings. I would spend good 40 minutes back there)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5:30am - &lt;/td&gt;&lt;td&gt;Quiznoss, as a business, was once reported to do much worse than Subway but their subs are much better still. breakfest time.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5:40am - &lt;/td&gt;&lt;td&gt;one thing I like about morning flights is that the pllane is always at the gate&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5:55am - &lt;/td&gt;&lt;td&gt;no one is about to start boarding us yet&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6:00am - &lt;/td&gt;&lt;td&gt;here they come&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6:30am - &lt;/td&gt;&lt;td&gt;taxing out of the gate. on time.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7:50am - &lt;/td&gt;&lt;td&gt;wow, a good one hour of sleep. It rarely happens to me on the plane and I always wish it did&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8:20am - &lt;/td&gt;&lt;td&gt;landed. we're 20 minutes earlier so now need to wait for the gate to become available. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8:50am - &lt;/td&gt;&lt;td&gt;immigration control. flying to Canada feels much like flying domestic US except immigration. here you remember you actually are about to cross the border.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9:10am - &lt;/td&gt;&lt;td&gt;in the cab on my way to the office. flying without luggage with same day return is the fastest. No need to wait at the carousel at a baggage claim and then again at the rental car counter... it also feels better in the back seat of a limo than in the front seat driving a Hynday Accent "compact"&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9:40am - &lt;/td&gt;&lt;td&gt;Morning cofee and I am back online (mentally too). Flying short distances feels a lot like riding a bus or a train. Just a lot more expensive :) One guy once told me why it should be so. He said (rising his hand up above his head with the palm flat facing down illustrating a flying airplane) - "magic", then he lowered the hand below his waist with  the palm this time illustrating driving on the surface of the earth - "no magic", back up again - expensive, back down again - cheap. Magic, no magic, expensive, cheep.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10:00am - &lt;/td&gt;&lt;td&gt;meeting, more like a working session, nothing special&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;12:00pm - &lt;/td&gt;&lt;td&gt;done with the meeting. btw, don't you think the "pm" after 12 is a little weird? 11pm is almost midnight, then it's 0:00am the next day. 11am is almost noon and then comes the 12... pm followed by 1pm and all the way up to 11pm. weird...&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;12:40pm - &lt;/td&gt;&lt;td&gt;over with the lunch and back to work. follow-up emails, skype calls, full recursive check-out of the SVN HEAD revision...&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2:00pm - &lt;/td&gt;&lt;td&gt;meeting. it started more like a working session but then slightly transitioned into a fight. I am currently right in the middle of a rather large content-centric project that I am delivering with the team of about fourty. That's only on our end. There are other partners and vendors and things balance on the edge: from very tough to extremely challenging. The whole thing is very fragile and as things heat up so does the temperature int he room. What was scheduled to last for two hours lasted for about three and a half and we only have gone through half the agenda. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5:30pm - &lt;/td&gt;&lt;td&gt;in a cab. on my way back to the airport. it doesn't look like these guys accept credit cards so I will have to pay cash. You can pay US dollars but you should only expect canadians as a change. Will spend it here next timme, no big deal. My Mondays will likely all become like this one for a few months to come. &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5:50pm - &lt;/td&gt;&lt;td&gt;dragging through traffic on 401 West. I should be fine, my flight will only start boarding at about 7:50pm. Hope to grab a bite at the aitport and do some followup emails. Unlike Atlanata, Toronto offers free wi-fi in the airport. I first time encountered free wi-fi in Ireland's Shanon back in 2004. It's 2011 and not all major airports do that. You can pay $9.99 a month and have it with Bingo, they have hotspots everywhere and ten bucks a month is nothing... still, wi-fi at the airport should be free. They charge us, passenmgers, enough through the fees they charge airlines which we end up paying anyway.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6:05pm - &lt;/td&gt;&lt;td&gt;through with the traffic. should be at the gate in five&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6:50pm - &lt;/td&gt;&lt;td&gt;done with the immigration and security control. It would indeed feel like a bus ride if not these two things on the way in and out.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6:55pm - &lt;/td&gt;&lt;td&gt;there's a nice pub two gates away. will grab a bite, get some beer, do some emails. I have a good hour before my flight starts boarding. I wish they had chargers under every dining table.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8:10pm - &lt;/td&gt;&lt;td&gt;boarding&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10:20pm - &lt;/td&gt;&lt;td&gt;landed in Atlanta&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;11:30pm - &lt;/td&gt;&lt;td&gt;made it home. it's when I opened the door I actually felt how much I missed my family. Everybody is asleep by now. Will see them tomorrow in the morning. Dennis started his 4th school year on Aug 15th and his bus is picking him up at 7:08am. We will be up by 6:20 tomorrow. Have a good night you all. &lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-7173721392374757390?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/7173721392374757390/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=7173721392374757390" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/7173721392374757390?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/7173721392374757390?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2011/08/just-day-in-life-in-and-out.html" title="Just a day in life: &quot;In and Out&quot;" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUAMSH06eSp7ImA9WhZTFko.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-3457754048911040012</id><published>2011-03-20T23:23:00.000-04:00</published><updated>2011-03-20T23:23:09.311-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-20T23:23:09.311-04:00</app:edited><title>A train set and a two story bed</title><content type="html">What would you name if I asked you to recall a few things you had badly wanted as a kid but had never had? &lt;br /&gt;
&lt;br /&gt;
Mine are a train set toy and a two story bed. &lt;br /&gt;
&lt;br /&gt;
Train set. A metal one, from the &lt;a href="http://en.wikipedia.org/wiki/East_Germany"&gt;East Germany&lt;/a&gt;, the ultimate gift I, a six year old boy in the USSR, could have wished for. It was expensive, would likely cost a good part of what my dad was making a month, if you could find it. No store had it. Your family should have had &lt;i&gt;connections&lt;/i&gt; to get it delivered from the place of origin.&lt;br /&gt;
&lt;br /&gt;
Two story bed. I was growing up with my younger brother and we were sharing the room for as long as I remember myself, up to the point when I left to start my own family. As a kid I saw a two story bed once or twice and it must have penetrated my memories so deep I still cannot get it out.&lt;br /&gt;
&lt;br /&gt;
My son is eight and a half. He had number of different train sets made of metal and wood and plastic and stopped playing them all a while ago. His younger sister is two and a half and they rarely share a bedroom but he enjoys the second story of his two story bed. I told him how much I once wanted to have one when I was a kid so he offered me the second story on the night it was brought in and assembled. I let him enjoy it and kept my memories :)&lt;br /&gt;
&lt;br /&gt;
Last winter I took my whole family skiing up north in New Hampshire. We shared a nice big house right on the mountain with two other friend families, our rooms where on the first floor and one had a two story bed in it. The bed was higher than usual, my son found it uncomfortable to be too close to the ceiling so I took it. Next night I sprained my ankle getting down at night, must have missed a rung or something. Did not enjoy much climbing it back and forth in the upcoming few days but still love my memories of not having it as a kid :)&lt;br /&gt;
&lt;br /&gt;
Care to share your story?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-3457754048911040012?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/3457754048911040012/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=3457754048911040012" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/3457754048911040012?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/3457754048911040012?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2011/03/train-set-and-two-story-bed.html" title="A train set and a two story bed" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUcEQHo6cSp7ImA9Wx9SEE0.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-4383959188520531591</id><published>2010-11-29T00:03:00.000-05:00</published><updated>2010-11-29T00:03:21.419-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-29T00:03:21.419-05:00</app:edited><title>My Phusion  Passenger Checklist</title><content type="html">I spent some considerable time trying to get the "hello world" rails app (the one you get when you run &lt;i&gt;rails new myapp&lt;/i&gt;) to run under Apache + Passenger the same way it does under &lt;i&gt;rails server&lt;/i&gt;. &lt;br /&gt;
&lt;br /&gt;
I tried both &lt;a href="http://www.modrails.com/documentation/Users%20guide%20Apache.html#_deploying_a_ruby_on_rails_application"&gt;root and sub URI setup&lt;/a&gt; and was basically struggling with variations of the following three errors:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Apache would serve static content out of the document root and then send 404 for the default /rails/info/properties route (Apache&lt;br /&gt;
s 404, not RoR's 404)&lt;/li&gt;
&lt;li&gt;The Passenger would engage but then fail to start the rails app&lt;/li&gt;
&lt;li&gt;The Passenger engages and rails app starts but the default /rails/info/properties would report a "No route" error even for local request (telnet from within the SSH)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Without going into very much details (drop me a line if you're interested and I will elaborate) here are the things that you should check:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;  &lt;li&gt;Permissions for the folder the document root is pointing out. It has got to be accessible and executable by the Apache's user&lt;/li&gt;
  &lt;li&gt;Have the mod_rewrite loaded. The default Apache installation that you get with "sudo apt-get install apache2" doesn't have it and the Passenger's doc (at least the pieces I skimmed through) doesn't explicitly tells you to have it on. &lt;/li&gt;
  &lt;li&gt;The default &lt;i&gt;/rails/info/properties&lt;/i&gt; controller works for local requests only and only in the development environment. Passenger runs your rails app in production environment by default. So make sure to have the &lt;i&gt;config.consider_all_requests_local&lt;/i&gt; set to true and also use the &lt;i&gt;RailsEnv development&lt;/i&gt; directive in the Virtual Host configuration&lt;br /&gt;
  &lt;/li&gt;
 &lt;li&gt;You don't need the &lt;i&gt;config.ru&lt;/i&gt; in your application root. Passenger might treat your app as a Rack app and it's not. Not sure if this one helped me but I googled it up before I figured I was missing the rewrite mode so I followed the advise&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Right now both built-in &lt;i&gt;rails server&lt;/i&gt; and the kosher Apache show exactly the same result and render the well known "You're riding Ruby on Rails" including the little environment details AJAX piece.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
I would have been proud if I figured it all in "no time" as the documentation suggested :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-4383959188520531591?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/4383959188520531591/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=4383959188520531591" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/4383959188520531591?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/4383959188520531591?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/11/my-phusion-passenger-checklist.html" title="My Phusion  Passenger Checklist" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MFRXk-fSp7ImA9Wx9SEE0.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-2132564118982136482</id><published>2010-11-28T23:36:00.001-05:00</published><updated>2010-11-28T23:36:54.755-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-28T23:36:54.755-05:00</app:edited><title>Continuations</title><content type="html">Today in the morning I made potato pancakes for breakfast. My family loves it and I usually make more than we together can eat so we have some leftovers as snack. &lt;br /&gt;
&lt;br /&gt;
I must have made a little more than usual today and there was something left when in the afternoon we went out to finish our holiday shopping. Great, we packed it to-go so that kids have something to eat on the way.&lt;br /&gt;
&lt;br /&gt;
My little daughter took one out of the bag and... fall asleep halfway through it. It actually was her time to take a nap anyway. She slept for good forty minutes as we drove around making our scheduled stops. All this time she kept the pancake safe in her hand.  &lt;br /&gt;
&lt;br /&gt;
We got back home and she woke up the very minute I turned off the engine. Looked at me. Smiled. Looked down to her hand. Saw the pancake. And she just resumed eating it as if nothing happened.&lt;br /&gt;
&lt;br /&gt;
I couldn't help it and smiled with a very clear thought - &lt;i&gt;continuation&lt;/i&gt;. A great example of one in our real life :)&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
Just about fifteen minutes before, at our last stop, I was catching up on my RSS subscriptions watching Alice asleep while another half of my family was finishing the grocery gshopping list. It's what I was reading that fifteen minutes later made me think &lt;i&gt;continuation&lt;/i&gt; and not "how cute". &lt;br /&gt;
&lt;br /&gt;
The latest installment from Eric Lippert about &lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2010/10/28/asynchrony-in-c-5-part-one.aspx"&gt;async in the upcoming C#5.0&lt;/a&gt;. Even if you don't program in C# or work on .NET platform (I do neither) it's absolutely worth it.&lt;br /&gt;
&lt;br /&gt;
Read it and tell me if you still think I should have first noticed how cute that move was :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-2132564118982136482?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/2132564118982136482/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=2132564118982136482" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/2132564118982136482?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/2132564118982136482?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/11/continuations.html" title="Continuations" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkIARX85eyp7ImA9Wx5aGUw.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-4980658926109030007</id><published>2010-11-16T09:42:00.000-05:00</published><updated>2010-11-16T09:42:24.123-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-16T09:42:24.123-05:00</app:edited><title>Nice weather up here</title><content type="html">Online at 30,000 feet is nothing special these days though I still find it amazing. For some $10 you can get a cross country flight long WiFi access. If only the coach cabin had a little more leg room for a full size laptop experience to be a pleasure and not a struggle. Diverting to iPad might be great for reading and movies and emails but if you need to &lt;i&gt;work&lt;/i&gt; you're still stuck with a laptop. My usual in-flight setup includes a laptop to catch up on emails and do some work, a Kindle to read a book, an iPhone to listen to music and catch up on pre-cached RSS feeds, and some printouts to read during takeoff and landing (apparently, they let you use WiFi past 3,000 feet but require no electronic device on during take off and landing).&lt;br /&gt;
&lt;br /&gt;
It's a nice weather up here:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_lI891k8ca1g/TOKXyBXpoOI/AAAAAAAAAMU/sHadKMTHEiI/s1600/IMG_0307.JPG" imageanchor="1" linkindex="19" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_lI891k8ca1g/TOKXyBXpoOI/AAAAAAAAAMU/sHadKMTHEiI/s320/IMG_0307.JPG" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-4980658926109030007?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/4980658926109030007/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=4980658926109030007" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/4980658926109030007?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/4980658926109030007?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/11/nice-weather-up-here.html" title="Nice weather up here" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_lI891k8ca1g/TOKXyBXpoOI/AAAAAAAAAMU/sHadKMTHEiI/s72-c/IMG_0307.JPG" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CUUNQXg-eSp7ImA9Wx5UFEs.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-2002604458922639210</id><published>2010-10-19T00:41:00.000-04:00</published><updated>2010-10-19T00:41:30.651-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-19T00:41:30.651-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>My first question on stackoverflow</title><content type="html">Here it is:&lt;br /&gt;
&lt;a href="http://stackoverflow.com/questions/3965331/weird-behavior-around-same-erasure-compilation-error"&gt;http://stackoverflow.com/questions/3965331/weird-behavior-around-same-erasure-compilation-error&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Playing with the code on the edge of compile and runtime  errors is fascinating. Compilers are software components and may have defects and deficiencies. Language specs may have wholes and ambiguities too. But these are thoroughly tested in labs and then applied daily by hundreds of thousands (if not millions) of programmers so they must be almost perfectly clean. &lt;i&gt;Almost&lt;/i&gt;. But still not perfect. &lt;br /&gt;
&lt;br /&gt;
How far from this "still not perfect" is the software you write?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-2002604458922639210?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/2002604458922639210/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=2002604458922639210" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/2002604458922639210?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/2002604458922639210?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/10/my-first-question-on-stackoverflow.html" title="My first question on stackoverflow" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEIDR3k8cCp7ImA9Wx5WGEw.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-26060897360338</id><published>2010-09-29T23:15:00.001-04:00</published><updated>2010-09-29T23:16:16.778-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-29T23:16:16.778-04:00</app:edited><title>VirtualBox vs. Virtual PC as a host for Ubuntu</title><content type="html">Having worked with &lt;a href="http://pveller.blogspot.com/2010/09/ubuntu-in-vpc-talks-tcpip-with-host.html"&gt;Ubuntu on Virtual PC&lt;/a&gt; for a little while I gave it a test inside a &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;. A waaaaaaay better. Squeezing a Linux to run in a Windows virtualization host designed to only accept Windows guests might have been fun in and of itself, but &lt;i&gt;using&lt;/i&gt; it there is not necessarily the experience you would enjoy.&lt;br /&gt;
&lt;br /&gt;
VirtualBox over Virtual PC as a host for Ubuntu:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;No hassle installation. Just point the CD drive to the Ubuntu installation ISO and enjoy the ride. No tweaking with the VGA loading modes and GRUB.&lt;/li&gt;
&lt;li&gt;Out of the box networking with the host. No need to manually install loopback adapters as it comes with a network "device" to support it&lt;/li&gt;
&lt;li&gt;No-capture mouse integration. Virtual PC has a hot key to release a mouse pointer to the host but it conflicts with my Intel video. When I do Ctrl+Alt+Left my screen turns 90 degree. Not fun. VirtualBox with guest additions captures your mouse when it's inside a guest OS window and releases it once you past the window's border. Natural. The only thing that I liked better about VirtualPC here is that it seems to propagate Alt+Tab to the host. So basically when you're in a guest Ubuntu window pressing Alt+Tab brings up the familiar "where to" selector. In VirtualBox you have to start with the "host" key.&lt;/li&gt;
&lt;li&gt;Visually VirtualBox has a nicer response from the Ubuntu guest GUI compared to Virtual PC. At least no hiccups. Ubuntu in Virtual PC ran ok until I hooked it up with the host over a loopback adapter. That was when it became noticeably slow.&lt;/li&gt;
&lt;li&gt;Audio support. I don't need it in a guest system. I actually don't need a &lt;i&gt;desktop&lt;/i&gt; Ubuntu but it was nice to hear what Ubuntu plays when it boots up :) &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
There's got to be more. Unlike Virtual PC VirtualBox &lt;i&gt;officially&lt;/i&gt; supports Ubuntu and many other guest OSes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-26060897360338?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/26060897360338/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=26060897360338" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/26060897360338?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/26060897360338?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/09/virtualbox-vs-virtual-pc-as-host-for.html" title="VirtualBox vs. Virtual PC as a host for Ubuntu" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkMDR3cyeCp7ImA9Wx5WE0k.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-7420153189762765494</id><published>2010-09-24T11:01:00.000-04:00</published><updated>2010-09-24T11:01:16.990-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-24T11:01:16.990-04:00</app:edited><title>Face of the web</title><content type="html">Yesterday I was servicing my car at a dealership nearby. It's a place with a nice and roomy waiting area that has a few large wall mounted plasma TV, coffee, free Wi-Fi, and even a few desktops for those who forgot their laptops home or don't carry them around whenever they go.&lt;br /&gt;
&lt;br /&gt;
I got my coffee and on my way back to my laptop I looked at what was up on a screen of the two guest monitors. Nobody was there doing anything as most people either have their internet with them or don't bother and just watch big screen TV. &lt;br /&gt;
&lt;br /&gt;
What do you think was up on two screens? &lt;br /&gt;
&lt;br /&gt;
It was not a Windows desktop. Not a browser with a dealership web page. &lt;br /&gt;
&lt;br /&gt;
It was Facebook login page. A new face of the web, I believe. A thing that a regular person would most likely do online if they're stuck waiting for their car serviced.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-7420153189762765494?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/7420153189762765494/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=7420153189762765494" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/7420153189762765494?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/7420153189762765494?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/09/face-of-web.html" title="Face of the web" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0MHQncyeCp7ImA9Wx5WE00.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-1284249349642098270</id><published>2010-09-24T00:10:00.000-04:00</published><updated>2010-09-24T00:10:33.990-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-24T00:10:33.990-04:00</app:edited><title>Ubuntu in VPC talks TCP/IP with the host</title><content type="html">As of now Ubuntu not only &lt;a href="http://pveller.blogspot.com/2010/09/ubuntu-10041-on-virtual-pc.html"&gt;runs as a guest OS in Windows Virtual PC&lt;/a&gt; but also has a TCP/IP with the host. &lt;br /&gt;
&lt;br /&gt;
Keyword: loopback adapter. Apparently you can install a piece of "hardware" (that is, of course, a software) that would look like an ethernet device with an active connection on it. Once installed, the host OS will give it an IP that you can look up in ipconfig. Use this new "hardware" as a network adapter for your VPC, boot Ubuntu, assign its network device the IP address from the same network mask and use the host's IP as a gateway, reboot Ubuntu. &lt;br /&gt;
&lt;br /&gt;
I got help from &lt;a href="http://ixbtlabs.com/articles2/cm/virtualization-vpc-vserv-page1.html"&gt;here&lt;/a&gt;, &lt;a href="http://blogs.technet.com/b/windows_vpc/archive/2009/12/07/networking-in-windows-virtual-pc.aspx"&gt;here&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/virtual_pc_guy/archive/2005/10/04/477195.aspx"&gt;here&lt;/a&gt;, and &lt;a href="http://www.andornot.com/blog/post/Connect-to-SQL-Server-Instance-on-Virtual-Machine-from-Host-Machine-Running-Vista.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
The only thing I noticed so far is that Ubuntu-in-a-VPC-window is slow. It may be the GUI rendering (so far I am playing with the desktop version), it may be the host laptop (oops), it may be the VPC environment itself. We'll see. There's always an option to only run terminal, try &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;, or try another host machine :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-1284249349642098270?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/1284249349642098270/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=1284249349642098270" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1284249349642098270?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1284249349642098270?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/09/ubuntu-in-vpc-talks-tcpip-with-host.html" title="Ubuntu in VPC talks TCP/IP with the host" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUUHQnk_eCp7ImA9Wx5WE04.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-4908227179054690637</id><published>2010-09-23T15:59:00.013-04:00</published><updated>2010-09-24T10:07:13.740-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-24T10:07:13.740-04:00</app:edited><title>Ubuntu 10.04.1 on Virtual PC</title><content type="html">I am writing this post from my regular Windows 7 while watching Ubuntu running in a separate window as a guest OS inside a &lt;a href="http://www.microsoft.com/windows/virtual-pc/"&gt;Windows Virtual PC&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Microsoft does not officially support anything but Windows XP+ as a guest OS but some of its well known employees tell the world &lt;a href="http://www.hanselman.com/blog/InstallingUbuntu104LTSOnWindowsVirtualPCOnWindows7.aspx"&gt;how to work around it&lt;/a&gt;. My first attempt was not successful and fresh installed Ubuntu would not start. I scaled back to the original &lt;a href="http://www.markwilson.co.uk/blog/2010/06/installing-ubuntu-10-4-on-windows-virtual-pc.htm"&gt;instruction on Installing Ubuntu on Windows Virtual PC&lt;/a&gt; that Scott referred to in his post and it worked. Either I did not do something right the first time, or it's not exactly predictable for Ubuntu to install correctly on Virtual PC, or it was the network device that I first time mapped to a physical card (as was suggested by Scott) and the second time left in a default "Internal Network" state, or maybe it was the memory (I only let the VM see 1GB of RAM first time and then sacrificed one more just in case Ubuntu doesn't like greedy users).&lt;br /&gt;
&lt;br /&gt;
I powered it down and brought back up two times in a row just to make sure it was not a random accident. Looks like it wasn't. It's running now.&lt;br /&gt;
&lt;br /&gt;
Update [09/24 00:15]: it does not only &lt;i&gt;work&lt;/i&gt;, it now &lt;a href="http://pveller.blogspot.com/2010/09/ubuntu-in-vpc-talks-tcpip-with-host.html"&gt;&lt;i&gt;talks&lt;/i&gt; TCP/IP with the host&lt;/a&gt;. Tomorrow it should &lt;i&gt;sing&lt;/i&gt; "Hello, World!".&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
If reading this you wonder why I needed it in the first place I can try to elaborate just a little bit. For the last few months I felt like missing something. That itchy feeling was with me all the time, but as much as it was irritating and annoying it was distant and vague. Only recently I figured what it was and the discovery surprised me quite a little. Apparently, all this time I missed working with the code, working with the code &lt;i&gt;hands on&lt;/i&gt;, doing something &lt;i&gt;very real&lt;/i&gt; myself, doing something not only &lt;i&gt;real&lt;/i&gt; but also &lt;i&gt;meaningful&lt;/i&gt;, something worth my energy put into it. Something I haven't done before.&lt;br /&gt;
&lt;br /&gt;
You know how they say in sales commercials: "There has never been a better time".&lt;br /&gt;
&lt;br /&gt;
Over the last few years I collected a few ideas and I finally felt like giving one of them a try. And to spice it up I want it done on Linux, &lt;a href="http://couchdb.apache.org"&gt;CouchDB&lt;/a&gt;, JavaScript, and no backend per se. And if I end up needing backend it will be &lt;a href="http://rubyonrails.org/"&gt;RoR &lt;/a&gt;or &lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt; (meaning &lt;a href="http://geddyjs.org/"&gt;Geddy&lt;/a&gt;or &lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt;) or &lt;a href="http://www.something.com/"&gt;whatever&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I needed Ubuntu to start hacking. I should not have waited. Whatever it is you would rather be doing instead or on top of what you do you &lt;a href="http://pveller.blogspot.com/2010/01/dont-wait.html"&gt;should not wait&lt;/a&gt; either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-4908227179054690637?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/4908227179054690637/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=4908227179054690637" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/4908227179054690637?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/4908227179054690637?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/09/ubuntu-10041-on-virtual-pc.html" title="Ubuntu 10.04.1 on Virtual PC" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0YBQnc6fyp7ImA9Wx5XFkg.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-2127866915347781234</id><published>2010-09-09T21:44:00.006-04:00</published><updated>2010-09-16T12:39:13.917-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-16T12:39:13.917-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Type erasure does not erase all of it</title><content type="html">Last week I was reading &lt;a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/"&gt;the most recent installment of Spring framework reference documentation&lt;/a&gt; and one particular thing surprised me, if not to say more. Here it is with my annotations:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier; border: 1px solid gray; padding: 10px;"&gt;&lt;br /&gt;In Java 5 and later, you can use strongly typed collections &lt;span style="font-family: Arial;"&gt;{ sure }&lt;/span&gt; [...] If you are using Spring to dependency-inject a strongly-typed Collection into a bean, you can take advantage of Spring's type-conversion support such that the elements of your strongly-typed Collection  instances are converted to the appropriate type &lt;span style="font-family: Arial;"&gt;{ something rings a bell but I am not sure... }&lt;/span&gt; prior to being added to the Collection.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class Foo {&lt;br /&gt;&lt;br /&gt;  private Map&amp;lt;String, Float&amp;gt; accounts;&lt;br /&gt;&lt;br /&gt;  public void setAccounts(Map&amp;lt;String, Float&amp;gt; accounts) {&lt;br /&gt;      this.accounts = accounts;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&amp;lt;beans&amp;gt;&lt;br /&gt;  &amp;lt;bean id="foo" class="x.y.Foo"&amp;gt;&lt;br /&gt;      &amp;lt;property name="accounts"&amp;gt;&lt;br /&gt;          &amp;lt;map&amp;gt;&lt;br /&gt;              &amp;lt;entry key="one" value="9.99"/&amp;gt;&lt;br /&gt;              &amp;lt;entry key="two" value="2.75"/&amp;gt;&lt;br /&gt;              &amp;lt;entry key="six" value="3.99"/&amp;gt;&lt;br /&gt;          &amp;lt;/map&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When the &lt;i&gt;accounts&lt;/i&gt; property of the &lt;i&gt;foo&lt;/i&gt; bean is prepared for injection, the generics information about the element type of the strongly-typed &lt;i&gt;Map&lt;String, Float&gt;&lt;/i&gt; is available by reflection &lt;span style="font-family: Arial;"&gt;{ really? I thought no generic info is available at run time. That's what &lt;a href="http://download.oracle.com/javase/tutorial/java/generics/erasure.html"&gt;type erasure&lt;/a&gt; is about, isn't it? }&lt;/span&gt;. Thus Spring's type conversion infrastructure recognizes the various value elements as being of type Float, and the string values [...] are converted into an actual Float type &lt;span style="font-family: Arial;"&gt;{ something is not right. Guys from springsource are not likely to make false statements of &lt;i&gt;this&lt;/i&gt; magnitude, or are they?  }&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I never really looked into all new stuff that Generics brought along with them into the language. And I missed a small but apparently important portion of what has been added to the Java reflection classes. &lt;br /&gt;&lt;br /&gt;Here's a &lt;a href="http://stackoverflow.com/questions/1509896/getting-around-type-erasure-in-java"&gt;short summary at stackoverflow&lt;/a&gt; that basically sums up what you can get via reflection. It's not like you can get &lt;i&gt;anything&lt;/i&gt;, the exact type of the object at hand has still been &lt;i&gt;erased&lt;/i&gt; and instance of ArrayList&lt;String&gt; is still just an instance of an ArrayList. But something is still there :)&lt;br /&gt;&lt;br /&gt;Two more good readings on the subject:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Neel Gafter&lt;/b&gt; on &lt;a href="http://gafter.blogspot.com/2006/11/reified-generics-for-java.html"&gt;reified generics for Java&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Bruce Eckel&lt;/b&gt; about how &lt;a href="http://web.archive.org/web/20080508065226/http://www.mindview.net/WebLog/log-0050"&gt;Generics Aren't&lt;/a&gt; (had to dig it up from the web archive)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-2127866915347781234?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/2127866915347781234/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=2127866915347781234" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/2127866915347781234?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/2127866915347781234?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/09/type-erasure-does-not-erase-all-of-it.html" title="Type erasure does not erase all of it" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0YDQH09eSp7ImA9Wx5XFkg.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-1812392908379364732</id><published>2010-08-30T21:44:00.004-04:00</published><updated>2010-09-16T12:39:31.361-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-16T12:39:31.361-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Java concurrency is unsafe</title><content type="html">Have you ever wondered how stuff in java.util.concurrent works? &lt;br /&gt;&lt;br /&gt;I know I am late. It was in early 2000 (if not before that) when Doug Lea had published his &lt;a href="http://gee.cs.oswego.edu/dl/cpj/index.html"&gt;Concurrent Programming in Java&lt;/a&gt; and had described what later became JSR 166 and then finally part of JDK 1.5 in 2004. Still better late than never.&lt;br /&gt;&lt;br /&gt;I actually wanted to find out just a few things. I wondered how they provided the full semantic of &lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/memory.html"&gt;happens-before&lt;/a&gt; as it works in &lt;i&gt;volatile&lt;/i&gt; and &lt;i&gt;synchronized&lt;/i&gt; but on the API level. I wondered if I would still find the &lt;i&gt;volatile&lt;/i&gt; and &lt;i&gt;synchronized&lt;/i&gt; and &lt;i&gt;wait&lt;/i&gt;/&lt;i&gt;notify&lt;/i&gt; buried down in the implementation details or would there be something else.&lt;br /&gt;&lt;br /&gt;I did not look into the original Doug Lea's source code but I what I found in the latest JDK implementation made me smile. &lt;br /&gt;&lt;br /&gt;They're using &lt;i&gt;&lt;a href="http://www.docjar.com/docs/api/sun/misc/Unsafe.html"&gt;sun.misc.Unsafe&lt;/a&gt;&lt;/i&gt; to do the atomic changes and suspend enqueued threads (it's called &lt;i&gt;parking&lt;/i&gt;). The &lt;i&gt;sun.misc.Unsafe&lt;/i&gt; is native all over the place and, as you can tell from its name, is considered &lt;i&gt;unsafe&lt;/i&gt;. It's not really Java per se.&lt;br /&gt;&lt;br /&gt;Do you still think Java concurrency is &lt;i&gt;safe&lt;/i&gt;? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-1812392908379364732?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/1812392908379364732/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=1812392908379364732" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1812392908379364732?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1812392908379364732?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/08/java-concurrency-is-unsafe.html" title="Java concurrency is unsafe" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUMDQ30_eCp7ImA9Wx5RGUw.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-440689853545849721</id><published>2010-08-27T06:07:00.004-04:00</published><updated>2010-08-27T08:51:12.340-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-27T08:51:12.340-04:00</app:edited><title>Done. It's Mitchell.</title><content type="html">It feels like I have waited for years and now I don't know why it took me so long. &lt;br /&gt;&lt;br /&gt;I used to play guitar when I was in high school and I liked it a lot. I would spend all my free time months in a row just learning how to play and then practicing. I recall taking a series of lessons from a professional teacher when I was fourteen. And then we would gather together with my friends and play, and play, and play. &lt;br /&gt;&lt;br /&gt;It then faded away. Job, family, kids - all that changed priorities and I don't remember at what point I left my guitar behind. I have to admit: I never had a good quality instrument that I would really feel connected to so that must have added to the equation too.&lt;br /&gt;&lt;br /&gt;All in all, I didn't own a guitar for what feels like ten years. Though every time an acoustic track would play on a radio I would play along in my head if I knew how to or would try to imagine how I would do it. &lt;br /&gt;&lt;br /&gt;It came down on me while I was on the road traveling for business. Last month I got to visit 12 different cities, spent 5 nights on a train, another 13 in different hotels, flew 10 segments, delivered close to 80 hours of training and seminar content. It was one kind of a trip... I can't tell at what point I decided that the first thing I will do when I am back will be buying a guitar - but I do remember having that thought so deep down I knew I will &lt;i&gt;just&lt;/i&gt; do it.&lt;br /&gt;&lt;br /&gt;And I did. First I spent some time online and just read about what's available. I knew  there would be tons of choices so I wanted to lock down a price range. And then I went to a local guitar store to try out some and buy one.&lt;br /&gt;&lt;br /&gt;When I explained what I was looking for they guy immediately gave me &lt;a href="http://www.guitarcenter.com/Mitchell-MD100S-Dreadnought-Acoustic-Guitar-100261031-i1166438.gc"&gt;Mitchel MD100S&lt;/a&gt; as it was the only one with a solid top in my price range. I liked it a lot but I knew I had to compare it with others.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.guitarcenter.com/Fender-DG-60-Acoustic-Guitar-104990809-i1466541.gc"&gt;Fender DG 60&lt;/a&gt; sounded a little deeper, seemed to have had better strings installed by default, but played noticeably harder.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.guitarcenter.com/Jasmine-by-Takamine-S35-Acoustic-Guitar-101114072-i1148991.gc"&gt;Jasmine by Takamine&lt;/a&gt; was almost twice as cheap as the Mitchel but sounded very comparable (at least for my absolutely not professional ear). I might have considered buying this one if I haven't seen enough negative reviews on Amazon before. It played well, it sounded good, didn't feel as nice in hands but I would not really care if only I did not have an opinion about this particular one upfront. &lt;br /&gt;&lt;br /&gt;And then I also played to Yamaha. The &lt;a href="http://www.guitarcenter.com/Yamaha-FG700S-Dreadnought-Acoustic-Guitar-103114252-i1149962.gc"&gt;FG700S&lt;/a&gt; and a black color version of &lt;a href="http://www.guitarcenter.com/Yamaha-F335-Acoustic-Guitar-102919487-i1166364.gc"&gt;F335&lt;/a&gt;. 15 years ago I would die for a black color guitar :) But not this time. Both Yamaha sounded good and played well but were not as good looking as Mitchel.&lt;br /&gt;&lt;br /&gt;First impression is hard to beat. Especially when it's a good one.&lt;br /&gt;&lt;br /&gt;Done. It's Mitchel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-440689853545849721?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/440689853545849721/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=440689853545849721" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/440689853545849721?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/440689853545849721?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/08/done-its-mitchell.html" title="Done. It's Mitchell." /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DEQESXg7fip7ImA9WxFbGEs.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-8610533593686986882</id><published>2010-07-11T07:19:00.008-04:00</published><updated>2010-07-11T12:38:28.606-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-11T12:38:28.606-04:00</app:edited><title>5 a.m. in the wild</title><content type="html">I never knew I would be glad I had jet lag. If not jetlagged, it's very unlikely I would have woken up early enough to build up the energy for a 5 a.m. photo session in the wild. I would have just not known it was worth it. &lt;br /&gt;&lt;br /&gt;Last night I woke up around half past one (yea, that &lt;i&gt;is&lt;/i&gt; early enough), spent next three hours reading, and when it was finally morning I just went for a walk:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lI891k8ca1g/TDmzltfi-gI/AAAAAAAAALM/ayGbiVr8068/s1600/5am.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://4.bp.blogspot.com/_lI891k8ca1g/TDmzltfi-gI/AAAAAAAAALM/ayGbiVr8068/s400/5am.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5492618681003473410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And much more here: &lt;a href="http://pveller.jalbum.net/5%20a.m.%20in%20the%20wild/"&gt;5 a.m. in the wild&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-8610533593686986882?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/8610533593686986882/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=8610533593686986882" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/8610533593686986882?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/8610533593686986882?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/07/5-am-in-wild.html" title="5 a.m. in the wild" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_lI891k8ca1g/TDmzltfi-gI/AAAAAAAAALM/ayGbiVr8068/s72-c/5am.JPG" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DEQERX88eSp7ImA9WxFbEks.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-5950869536961709453</id><published>2010-07-03T15:17:00.004-04:00</published><updated>2010-07-04T13:58:24.171-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-04T13:58:24.171-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Travel" /><title>All set and good to go</title><content type="html">I am all set and good to go. &lt;br /&gt;&lt;br /&gt;Early next week I fly overseas and will spend the entire month traveling the Eastern Europe. &lt;br /&gt;&lt;br /&gt;I've got lots of places to stop by: Kiev, Minsk, Moscow, Saratov, Ryazan, Lviv, Kharkiv, St. Pete, Samara, Grodno, Brest, Gomel, Mogilev, Vitebsk.&lt;br /&gt;&lt;br /&gt;Can't promise a travel journal but you sure can follow me &lt;a href="http://twitter.com/pveller"&gt;on twitter&lt;/a&gt;, here on this blog, or &lt;a href="http://pveller.wordpress.com/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-5950869536961709453?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/5950869536961709453/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=5950869536961709453" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/5950869536961709453?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/5950869536961709453?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/07/all-set-and-good-to-go.html" title="All set and good to go" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEAHQns4cSp7ImA9WxFWGUs.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-1674366755846275304</id><published>2010-06-07T22:56:00.003-04:00</published><updated>2010-06-07T23:12:13.539-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-07T23:12:13.539-04:00</app:edited><title>666</title><content type="html">Do you run antivirus on each download you make off the internet? I sometimes do even though 99% I download from the sources I trust. &lt;br /&gt;&lt;br /&gt;This one made me think twice :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lI891k8ca1g/TA20IGGthxI/AAAAAAAAALA/1Dux2IAbPKs/s1600/seesmic.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 78px;" src="http://1.bp.blogspot.com/_lI891k8ca1g/TA20IGGthxI/AAAAAAAAALA/1Dux2IAbPKs/s400/seesmic.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5480234372750477074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I remembered how once I was reviewing the invoice for one of the accounts I had been responsible for at the time. It was a portfolio of four projects with two quite sizable and two rather small, satellite work. Hours reported by the team of one of the smaller one totaled to 666 for the period. I even sent them an email about their "devil" work :) &lt;br /&gt;&lt;br /&gt;And guess what, the guy in charge of the relationship with the client asked us to reduce it by one hour. "Just in case", he said. &lt;br /&gt;&lt;br /&gt;It's good people don't hesitate to say "happy birthday" to me, it's on the 13th.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-1674366755846275304?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/1674366755846275304/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=1674366755846275304" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1674366755846275304?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/1674366755846275304?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/06/666.html" title="666" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_lI891k8ca1g/TA20IGGthxI/AAAAAAAAALA/1Dux2IAbPKs/s72-c/seesmic.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkIMSXk8eyp7ImA9WxFWGEk.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-2063119600963981164</id><published>2010-06-06T12:08:00.003-04:00</published><updated>2010-06-06T12:09:48.773-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-06T12:09:48.773-04:00</app:edited><title>Moscow, Warsaw, Bethlehem</title><content type="html">...all three in less than seven hours:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pveller.wordpress.com/2010/06/06/moscow-warsaw-bethlehem"&gt;http://pveller.wordpress.com/2010/06/06/moscow-warsaw-bethlehem&lt;/a&gt; (in Russian)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-2063119600963981164?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/2063119600963981164/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=2063119600963981164" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/2063119600963981164?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/2063119600963981164?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/06/moscow-warsaw-bethlehem.html" title="Moscow, Warsaw, Bethlehem" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0EBRng4fSp7ImA9WxFWFEg.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-3821403125869159115</id><published>2010-06-02T00:02:00.003-04:00</published><updated>2010-06-02T01:14:17.635-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-02T01:14:17.635-04:00</app:edited><title>Speaking in public (and what kids do better than many adults)</title><content type="html">Speaking in public is not easy. Even when you have done it for many times it still takes time and energy to prepare and a courage to walk on stage.&lt;br /&gt;&lt;br /&gt;I have recently learned that writing for public can be as challenging. In some way it has proven to be even more challenging as the &lt;i&gt;effect&lt;/i&gt; lasts longer. &lt;br /&gt;&lt;br /&gt;We (a very small team and I) have recently published an online newspaper in the company I work for. It all started with an idea to do a news&lt;i&gt;letter&lt;/i&gt;. We wanted to start a regular process of news sharing in multiple angles (categories if you will) of our company's life and have it all in one place. Very soon we figured we lacked &lt;i&gt;context&lt;/i&gt;, a solid information foundation to lay the newsletter onto. Many people would just skip it and don't pay attention as nothing would resonate well enough. So we needed to build a foundation first and that's how we came up with the idea of a larger Information Portal. "That's big", we thought and we knew we would not go "live" with it any time soon (and it's not because of technology challenge, the content challenge would be the killer). So that's how we ended up doing a step in between - bigger than a newsletter but much smaller than the yet-to-be Information Portal. The most important - it's out there. I hope we managed to lay down that foundation. &lt;br /&gt;&lt;br /&gt;How &lt;span style="text-decoration: line-through;"&gt;was&lt;/span&gt; is it like speaking in public? It was our own personal project from start to finish. From the time the idea sparked to the time we signaled our CEO we are ready. We had to do many different things on our own(including &lt;a href="http://pveller.blogspot.com/2010/05/how-much-to-get-message-across.html"&gt;engaging company management&lt;/a&gt;, and, of course, writing, coding, carefully selecting and then listening to critics of small preview groups, writing again). Letting it go public felt almost like exposing yourself in a way very similar to going on stage to deliver a speech. Almost. With a few small caveats. &lt;br /&gt;&lt;br /&gt;Our company is 5,000+ and while not all will follow a link our CEO invited them to visit, a good half will. And it's there to stay for others to catch up. Quite an audience. &lt;br /&gt;&lt;br /&gt;And it's there for people to comment on and provide their feedback so we can do a next round better. The speech delivered and is now in a way &lt;i&gt;alive&lt;/i&gt;, there for the public to listen to and react, there for them to come back to and react again, there for them to notice all small defects and inconsistencies, there for them to be &lt;i&gt;tough&lt;/i&gt; about it. I know &lt;a href="http://sethgodin.typepad.com/seths_blog/2009/11/the-people-you-should-listen-to.html"&gt;who to listen to&lt;/a&gt; and I know that &lt;a href="http://sethgodin.typepad.com/seths_blog/2010/03/im-mad-at-everyone.html"&gt;everyone is almost always wrong&lt;/a&gt; though none of this makes the number "5,000" small enough to leave the equation. It's for them we did it so the pressure and preparation and energy and courage - all is there. &lt;br /&gt;&lt;br /&gt;still there. &lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;This Friday I will have a completely different experience. I am sure I will like it as much as I like the aftermath of the newspaper though it will be a whole new setting. I am going to speak at my child's school, in his class, actually. In the 2d grade this year they run a "mystery visitor" project where a parent may chose to come visit the class room on Friday and talk about their profession, do something with the kids, tell them stories, read books, - do anything that would engage kids and teach them something. Not many do and my son really asked me to come. He does not yet know and I won't tell him to catch him by surprise. You wonder what I am going to talk about? I am sure kids will like to learn about computers, software,  and everything behind their smartboard (the thing that looks and works like regular white board but also attaches to a computer and works as a display and a touch screen). I may also tell them about the country we came from as this is something kids like. I exchanged emails with the teacher and she assured me it will do.&lt;br /&gt;&lt;br /&gt;They won't care if I speak a fluent no-accent English, they won't care if all I say is bullet proof, they won't care if I make mistakes, they won't care if they will need to ask me to repeat a few times, they won't care if I ask them to repeat a few times. The value for them is in what I will say, in the thrill of getting to know things they did not know, in the fact of my appearance to entertain them - in making their day a little better than it would have been without the "mystery visitor". &lt;br /&gt;&lt;br /&gt;An audience that is totally rewarding without knowing what the word "&lt;i&gt;rewarding&lt;/i&gt;" means exactly. The audience that will at some time forget, will need to have to learn what they had known so well at some point - how to appreciate and see the value in what's not exactly perfect from all angles. Apparently, ability to &lt;i&gt;truly&lt;/i&gt; appreciate is a natural skill for kids and a mental exercise for adults, and not all believe it's worth their time and energy. Funny. It feels surprisingly  good to truly appreciate somebody else's work so by not making that effort many grownups deprive themselves from enjoying it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-3821403125869159115?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/3821403125869159115/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=3821403125869159115" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/3821403125869159115?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/3821403125869159115?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/06/speaking-in-public-and-what-kids-do.html" title="Speaking in public (and what kids do better than many adults)" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08FRnY-fip7ImA9WxFQEE8.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-6640110952236945180</id><published>2010-05-03T22:02:00.028-04:00</published><updated>2010-05-04T22:16:57.856-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-04T22:16:57.856-04:00</app:edited><title>How much to get a message across?</title><content type="html">How much is it worth to get a message across?&lt;br /&gt;&lt;br /&gt;Of course it depends on what kind of message and who to get it to. You spend your time writing emails and it sometimes works. You spend your time on the phone and it works better. It works best if you deliver your message face to face. Ok, that's classic, you don't need me to tell you this.&lt;br /&gt;&lt;br /&gt;How often do you end up with the "&lt;i&gt;I know that you believe you understand what you think I said, but I'm not sure you realize that what you heard is not what I meant&lt;/i&gt;"? reality check. I am just saying...&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;Getting a message across means more than having it delivered, more than having it heard, more than having it understood. It means making it acted upon, acted upon in a way you thought it would be acted upon, or better. If it's not - you failed. Try again.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;About 2 months ago my team and I started working on a small initiative with a big ego - a global online intranet newspaper for our company. You would think big and successful companies "have all that figured out". Yea, I wish they had. I wish &lt;i&gt;we&lt;/i&gt; had. But we don't. "So let's do something about it", we thought, and off we went.&lt;br /&gt;&lt;br /&gt;It just so happens that I know my company quite well. I've been with it for more than 7 years by now, I watched it grow from 250 to 5000, I worked in multiple geographies and in different roles, I am in active contact with people from almost all the places we're in, and I still get to travel. I'm in the loop. More than most of the people around me but not on the level needed to confidently write for the newspaper, not at all to confidently write about &lt;i&gt;everything&lt;/i&gt; and &lt;i&gt;everyone&lt;/i&gt; I would want to. My response? Get some help. To do so? Get the message across. "Simple", I thought, and sent an email.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pveller.blogspot.com/2010/03/two-sentences.html"&gt;I am trying to be careful with my emails&lt;/a&gt;. That time I felt absolutely confident my message would get across. How hard could it be? you write to the right people who you know well and who know you well, you keep it short and specific, you explain, you show respect, you ask for simple doable things. Even more. I knew the people I wrote to were busy, really busy, no-kidding-busy - so I had a plan. Do not ask to &lt;i&gt;wrtie&lt;/i&gt;, only ask to give soundbites: get the soundbites, get the contacts, do the legwork. I was ready to. I was committed to. Just needed the right soundbites from the right people. So how hard could it be?&lt;br /&gt;&lt;br /&gt;I failed. I got one response. A great one, that "better" one you always hope for, but that was it! I expected and I needed ten. One "better" did not outweigh ten "regular", not that time. My message did not get across.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;Today I needed to get somewhat similar message on the same subject to the same audience.&lt;br /&gt;&lt;br /&gt;During the last 2 months we've made good progress. We figured we knew enough for the first issue of the newspaper so we scaled back on scope, figured the soundbites we needed might not have been all that important after all, and plunged ahead. We had it written, designed, put together, looked at by the CEO, reviewed by some random (and not only) people in the company.&lt;br /&gt;&lt;br /&gt;While finishing with the tune-ups I figured I still needed that participation I failed to secure originally. Soundbites would be a way too late, but validation and acknowledgment and comments are still essential. We can't publicly write about stuff other people own and bear responsibility for without confirming factual data, making sure no contractual terms violated, ensuring we won't create more damage than good. This is given. We're not yellow press.&lt;br /&gt;&lt;br /&gt;What's the plan this time? The same thing I did last time is likely to fail again. I can't get on the phone with everybody - orchestrating schedules will be a more complex endeavor than building that whole newspaper. Video conference - same issue with the schedule and availability and the timezones. Record a video? maybe next time. I told you - big companies don't have it all figured out. We have a video broadcasting platform but it's still making its baby steps and so is likely to screw the user experience. Maybe not, but I can't risk it. After an email not acted upon, I can't expect a slow video download to work better for me. I know there are other options but for the content like this "behind the firewall" is better, and sometimes is the only option.&lt;br /&gt;&lt;br /&gt;I figured I'd do this: write an email, a pitch-email, almost a blog post, and take it from there. Done. Now what? After having read it a few times I knew I would not send it (plus I knew an email would not work anyway). This is when I decided to wrap the message into something more catchy, something more entertaining, something the audience would be likely to look into and have good experience with. If it ends up not acted upon, I at least wanted that it be worth the time spent.&lt;br /&gt;&lt;br /&gt;I decided to do a presentation. It just had to be a good one. &lt;a href="http://www.slideshare.net/thecroaker/death-by-powerpoint"&gt;Death by Powerpoint&lt;/a&gt; is not what I wanted. I can't say I'm great at presentations. No. To be &lt;i&gt;really great&lt;/i&gt; at presentations (as well as pretty much anything else) you've got do it regularly for couple years. Then do it some more. And then do it some more. And then just a little more. I haven't done it this much so no, I  am no expert. But I think I can tell good slide materials from bad ones.&lt;br /&gt;&lt;br /&gt;My message was 2 paragraphs long. About 8 sentences or so. I kept it intact, cut in pieces, split into about 20 slides in a simple one-thought-per-slide mode. If I would speak to the slides I would click it through in no time. Click pet thought. I would only delete the text completely if I was to deliver it live. So what would there be without a text? Images. I knew I needed images to fill in the blanks. Not &lt;span style="font-style: italic;"&gt;just&lt;/span&gt; images, I needed to-the-point images, I needed images that would resonate with the text, I needed images that would fit in naturally. I needed same-style-images-that-would-resonate-with-each-of-the-20-slides. Easy, huh? But where do I get it?&lt;br /&gt;&lt;br /&gt;It took me a while to stumble upon the &lt;a href="http://www.fotolia.com"&gt;www.fotolia.com&lt;/a&gt; and a little more to find all I needed there (or so I think). The only caveat - it's not free.  So here's the question. How much is it worth to get the message across?&lt;br /&gt;&lt;br /&gt;This time it took me about 4 hours and $30 for the images*. And it was not to get it across, it was to &lt;i&gt;try&lt;/i&gt; to get it across. I still don't know if it yields the result I need but at least I feel good about the effort. Isn't it what matters after all?&lt;br /&gt;&lt;br /&gt;Here's the message (a little abbreviated to pass the "behind the firewall" rule, sorry). And of course I needed to put the text back alongside images as I was not about to deliver it live:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_3956627"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/pveller/newspaper-needs-your-help" title="Newspaper needs your help"&gt;Newspaper needs your help&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse3956627" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=newspaperneedsyourhelp-100503230916-phpapp02&amp;stripped_title=newspaper-needs-your-help" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse3956627" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=newspaperneedsyourhelp-100503230916-phpapp02&amp;stripped_title=newspaper-needs-your-help" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/pveller"&gt;pveller&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;* the "we can do it" and "yes we can" I did not have to pay for. These famous ones I downloaded from the web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-6640110952236945180?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/6640110952236945180/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=6640110952236945180" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/6640110952236945180?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/6640110952236945180?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/05/how-much-to-get-message-across.html" title="How much to get a message across?" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;AkIHRHs8fip7ImA9WxFRGU4.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-5905558246881261322</id><published>2010-04-28T23:15:00.004-04:00</published><updated>2010-05-03T22:02:15.576-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-03T22:02:15.576-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Russian" /><title>And now in Russian</title><content type="html">I had a blog mirror on wordpress for some time and wanted to write there in Russian. &lt;br /&gt;&lt;br /&gt;Today I did. &lt;br /&gt;&lt;br /&gt;If Russian is your 1st of 2d language you're more than welcome to check it out: &lt;a href="http://pveller.wordpress.com/2010/04/28/court/"&gt;my first article on wordpress&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-5905558246881261322?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/5905558246881261322/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=5905558246881261322" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/5905558246881261322?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/5905558246881261322?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/04/and-now-in-russian.html" title="And now in Russian" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkIHRX4_fCp7ImA9WxBaGU8.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-8920234001152499948</id><published>2010-03-29T23:03:00.004-04:00</published><updated>2010-03-29T23:42:14.044-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-29T23:42:14.044-04:00</app:edited><title>Slow it down on contact</title><content type="html">- I don't have time! my world moves fast! &lt;br /&gt;- I got to act! we got to do at least something!&lt;br /&gt;&lt;br /&gt;heard it? seen it? believed it? did it? lived it?&lt;br /&gt;&lt;br /&gt;Smart individuals often confuse &lt;b&gt;sense of urgency&lt;/b&gt; with &lt;b&gt;anxiety&lt;/b&gt;. Sense of urgency is not about an itchy feeling to do &lt;i&gt;something&lt;/i&gt;, not about doing &lt;i&gt;something&lt;/i&gt; because somebody has got to do &lt;i&gt;something&lt;/i&gt;, not about demanding that others do &lt;i&gt;something&lt;/i&gt;, not about holding others responsible for not doing &lt;i&gt;something&lt;/i&gt;. It is about recognizing the issue, making sense of it, knowing it needs to be fixed, understanding if it needs to be fixed ASAP, learning how to fix it, figuring out action plan, involving the stakeholders, getting on the same page, and then, only then, it's about doing &lt;i&gt;something &lt;b&gt;meaningful&lt;/b&gt;&lt;/i&gt; about it. Something meaningful may sometimes be no thing at all.&lt;br /&gt;&lt;br /&gt;If your world moves much faster than those of others around you you'll inevitably end up striking them as it spins, especially so if you don't slow it down on contact. &lt;br /&gt;&lt;br /&gt;Hit the brakes, slow it down, allow a gentle touch and a little longer engagement with the worlds of others and open a whole new world of zero damage accomplishments. And then spin it fast, as fast as you can so you can do more and ship more and deliver more and earn more and enjoy more. You rule your world. Don't think you rule those of others.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-8920234001152499948?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/8920234001152499948/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=8920234001152499948" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/8920234001152499948?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/8920234001152499948?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/03/slow-it-down-on-contact.html" title="Slow it down on contact" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08HSHs7eip7ImA9WxBUF0s.&quot;"><id>tag:blogger.com,1999:blog-35841277.post-334712409326764809</id><published>2010-03-04T23:20:00.001-05:00</published><updated>2010-03-05T00:10:39.502-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-05T00:10:39.502-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="change" /><title>Two sentences</title><content type="html">How likely are you to try to follow &lt;a href="http://two.sentenc.es"&gt;this advice&lt;/a&gt;? How likely are you to stick to it?&lt;br /&gt;&lt;br /&gt;These guys also have three, four, and five sentences to make it a gradual transition from the cluttered way you're emailing today. If you have hard time, try changing your habit in a &lt;a href="http://zenhabits.net/2010/02/deadly-sin"&gt;Zend way&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;I don't think following a 2 sentence rule all the time every time makes sense, but uncluttering your emails sure does. And it starts not with how long you let your emails grow, not with the way you &lt;a href="http://inboxzero.com"&gt;organize and manage your inbox&lt;/a&gt;. It starts with how often you decide to &lt;i&gt;write&lt;/i&gt; and &lt;i&gt;send&lt;/i&gt; an email (actually, it all starts with &lt;a href="http://sethgodin.typepad.com/seths_blog/2010/02/modern-procrastination.html"&gt;how often you decide to &lt;i&gt;read&lt;/i&gt; your email&lt;/a&gt; but that's a different story).&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;With more exposure comes more visibility, more involvement, more open doors, more communication. Your common sense is awake at least as much as you are, an urge to jump in on all ridiculous stuff that's flowing through your inbox is irresistible. Your opinion matters. Your input is essential. Or so it feels. Oh, and everybody around you is an idiot. Ok. Rewind the last one.&lt;br /&gt;&lt;br /&gt;Your opinion matters when you were asked to express it - it's a lot more likely to generate a meaningful &lt;i&gt;action&lt;/i&gt; as somebody is tuned in listening. &lt;br /&gt;&lt;br /&gt;Your input is essential when it brings in something valuable, something new, something undiscovered, something unique. It's even more essential when it brings fuel to the decision process. And it's even more essential when it connects people, makes two idle substances diffuse and react. &lt;br /&gt;&lt;br /&gt;But what matters the most is your &lt;i&gt;action&lt;/i&gt;, your &lt;i&gt;contribution&lt;/i&gt;. Sending an email is not an action, it's a mere illusion of acting. So don't. Do not send it until it brings value. &lt;i&gt;Do&lt;/i&gt; something instead and delete the email you just wrote unless you can prove to yourself it &lt;i&gt;matters&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;-- &lt;br /&gt;&lt;br /&gt;Try the "two sentences" and learn with me to unlove the Send button, then move on to unlove the Reply All. &lt;br /&gt;&lt;br /&gt;p.s. true jedis know how to unlove starting their mornings with reading emails from their iPhone. I am not a true jedi yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35841277-334712409326764809?l=pveller.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://pveller.blogspot.com/feeds/334712409326764809/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=35841277&amp;postID=334712409326764809" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/334712409326764809?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/35841277/posts/default/334712409326764809?v=2" /><link rel="alternate" type="text/html" href="http://pveller.blogspot.com/2010/03/two-sentences.html" title="Two sentences" /><author><name>Pavel Veller</name><uri>http://www.blogger.com/profile/11955809016226023639</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry></feed>

