rolisz's site en Fri, 08 Jun 2018 19:43:00 GMT acrylamid 0.7.10 Regular Expressions for Objects <p>For work I recently needed to do something that is very similar to regexes, but with a twist: it should operate on lists of objects, not only on strings. Luckily, Python came to the rescue with <a href="">REfO</a>, a library for doing just this.</p> <p>My usecase was selecting phrases from Part-of-Speech (POS) annotated text. The text was lemmatized and tagged using <a href="">SpaCy</a> and it resulted in lists of the following form:</p> <div class="highlight"><pre><span class="n">s</span> <span class="o">=</span> <span class="p">[[</span><span class="s">&#39;i&#39;</span><span class="p">,</span> <span class="s">&#39;PRON&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;look&#39;</span><span class="p">,</span> <span class="s">&#39;VERB&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;around&#39;</span><span class="p">,</span> <span class="s">&#39;ADP&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;me&#39;</span><span class="p">,</span> <span class="s">&#39;PRON&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;and&#39;</span><span class="p">,</span> <span class="s">&#39;CCONJ&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;see&#39;</span><span class="p">,</span> <span class="s">&#39;VERB&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;that&#39;</span><span class="p">,</span> <span class="s">&#39;ADP&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;everyone&#39;</span><span class="p">,</span> <span class="s">&#39;NOUN&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;be&#39;</span><span class="p">,</span> <span class="s">&#39;VERB&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;run&#39;</span><span class="p">,</span> <span class="s">&#39;VERB&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;around&#39;</span><span class="p">,</span> <span class="s">&#39;ADV&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;in&#39;</span><span class="p">,</span> <span class="s">&#39;ADP&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;a&#39;</span><span class="p">,</span> <span class="s">&#39;DET&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s">&#39;hurry&#39;</span><span class="p">,</span> <span class="s">&#39;NOUN&#39;</span><span class="p">]]</span> </pre></div> <p>From these sentences we want to extract human action phrases and noun phrases, which are defined as follows, using regex-like notation:</p> <div class="highlight"><pre>human_action = (&quot;he&quot;|&quot;she&quot;|&quot;i&quot;|&quot;they&quot;|&quot;we&quot;) ([VERB] [ADP])+ noun_phrase = [DET]? ([ADJ] [NOUN])+ </pre></div> <p>Translated to English this means that human actions are defined as 1st and 3rd person, singular and plural pronouns followed by repeated groups of verbs and adpositions (in, to, during). Noun phrases are composed of an optional determiner (a, an, the) followed by repeated groups of adjectives and nouns.</p> <p>Most standard regex libraries won't help you with this, because they work only on strings. But this problem is still perfectly well described by regular grammars, so after a bit of Googling I found REfO and it's super simple to use, albeit you have to read the source code, because it doesn't really have documentation.</p> <p>REfO is a bit more verbose than normal regular expressions, but at least it tries to stay close to usual regex notions. Lazy repetition (*) is done using the <code>refo.Star</code> operator, while greedy one (+) is <code>refo.Plus</code> . The only new operator is <code>refo.Predicate</code>, which takes a function which takes a parameter and matches if that function returns true when called with the element at that position. Using this we will build the functions we need:</p> <div class="highlight"><pre><span class="k">def</span> <span class="nf">pos</span><span class="p">(</span><span class="n">pos</span><span class="p">):</span> <span class="k">return</span> <span class="n">refo</span><span class="o">.</span><span class="n">Predicate</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">pos</span><span class="p">)</span> <span class="k">def</span> <span class="nf">humanpron</span><span class="p">():</span> <span class="k">return</span> <span class="n">refo</span><span class="o">.</span><span class="n">Predicate</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;PRON&#39;</span> <span class="ow">and</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">{</span><span class="s">&#39;i&#39;</span><span class="p">,</span> <span class="s">&#39;he&#39;</span><span class="p">,</span> <span class="s">&#39;she&#39;</span><span class="p">,</span> <span class="s">&#39;we&#39;</span><span class="p">,</span> <span class="s">&#39;they&#39;</span><span class="p">})</span> </pre></div> <p>For matching POS, we use a helper to create a function that will match the given tag. For matching human pronouns, we also check the words, not just the POS tag.</p> <div class="highlight"><pre><span class="n">np</span> <span class="o">=</span> <span class="n">refo</span><span class="o">.</span><span class="n">Question</span><span class="p">(</span><span class="n">pos</span><span class="p">(</span><span class="s">&#39;DET&#39;</span><span class="p">))</span> <span class="o">+</span> <span class="n">refo</span><span class="o">.</span><span class="n">Plus</span><span class="p">(</span><span class="n">refo</span><span class="o">.</span><span class="n">Question</span><span class="p">(</span><span class="n">pos</span><span class="p">(</span><span class="s">&#39;ADJ&#39;</span><span class="p">))</span> <span class="o">+</span> <span class="n">pos</span><span class="p">(</span><span class="s">&#39;NOUN&#39;</span><span class="p">))</span> <span class="n">humanAction</span> <span class="o">=</span> <span class="n">humanpron</span><span class="p">()</span> <span class="o">+</span> <span class="n">refo</span><span class="o">.</span><span class="n">Plus</span><span class="p">(</span><span class="n">pos</span><span class="p">(</span><span class="s">&#39;VERB&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">pos</span><span class="p">(</span><span class="s">&#39;ADP&#39;</span><span class="p">))</span> </pre></div> <p>Then we just compose our functions and concatenate them and we got what we wanted. Using them is simple. You either call <code></code>, which finds the first match or <code>refo.finditer</code> which returns an iterable over all matches. </p> <div class="highlight"><pre><span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">refo</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">humanAction</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span> <span class="n">start</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">start</span><span class="p">()</span> <span class="n">end</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">end</span><span class="p">()</span> <span class="k">print</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">start</span><span class="p">:</span><span class="n">end</span><span class="p">])</span> </pre></div> <div class="highlight"><pre>[[u&#39;i&#39;, u&#39;PRON&#39;], [u&#39;look&#39;, u&#39;VERB&#39;], [u&#39;around&#39;, u&#39;ADP&#39;]] </pre></div> <p>So, it's always good to Google around for a solution, because my first instict to whip up a parser in Parsec would have lead to a much more complicated solution. This is nice, elegant, short and efficient.</p> Fri, 08 Jun 2018 19:43:00 GMT,2018-06-08:/2018/06/08/regular-expressions-for-objects Real estate cohort analysis <p>After in the last post we looked how to get the data, now we are going to start analyzing it. The first question we are interested in is how quickly do houses sell. We don't have access to actual contracts, so we will use a proxy to measure this: how long is an advertisment for a house still displayed. We are going to estimate that this is roughly the time it takes to sell a house. </p> <p>We will do a cohort analysis, where each cohort will be composed of ads that were shown for the first time on that day and we will track what percentage of those ads is still shown as days pass.</p> <p>To do this, we will need to gather data for some time, running our scraper daily. I did for almost three months now. I forgot to run it on some days (and I have an item on my todo list to automate this for almost three months now), so I have about 75 entry points.</p> <p>Let's start by reading in the data. We are going to use Pandas for this, because it has support for the JSON lines format. </p> <div class="highlight"><pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span> <span class="kn">import</span> <span class="nn">glob</span> <span class="kn">import</span> <span class="nn">seaborn</span> <span class="kn">as</span> <span class="nn">sns</span> <span class="n">sns</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="s">&#39;white&#39;</span><span class="p">)</span> <span class="n">data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">([</span><span class="n">pd</span><span class="o">.</span><span class="n">read_json</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s">&quot;../data/houses*.jl&quot;</span><span class="p">)],</span> <span class="n">ignore_index</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="s">&quot;adaugat_la&quot;</span><span class="p">,</span> <span class="s">&quot;Compartimentare&quot;</span><span class="p">,</span> <span class="s">&quot;text&quot;</span><span class="p">])</span> <span class="n">data</span><span class="p">[</span><span class="s">&quot;nr_anunt&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s">&quot;nr_anunt&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">==</span> <span class="nb">list</span> <span class="k">else</span> <span class="n">x</span><span class="p">)</span> </pre></div> <p>First we do some imports and set some graph plotting settings. Then we read all the data into a big Pandas dataframe and we drop some of the columns we don't need for our analysis right now and we fix some issues with the <code>nr_anunt</code> column (sometimes it's a list).</p> <div class="highlight"><pre><span class="n">data</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s">&#39;nr_anunt&#39;</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;CohortGroup&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="mi">0</span><span class="p">)[</span><span class="s">&#39;date&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">min</span><span class="p">()</span> <span class="n">data</span><span class="o">.</span><span class="n">reset_index</span><span class="p">(</span><span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> </pre></div> <p>We reset the index, to be according to the <code>nr_anunt</code> column, which is the ID of each ad, so it identifies each ad uniquely. Then we create a new column, by grouping by the index and taking the minimum out of each group. When we group by the index, it means that each group will contain each scraping of an ad, taken on different days. By taking the minimum of the date, we get the first time we saw the ad.</p> <div class="highlight"><pre><span class="n">grouped</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">groupby</span><span class="p">([</span><span class="s">&quot;CohortGroup&quot;</span><span class="p">,</span> <span class="s">&quot;date&quot;</span><span class="p">])</span> <span class="n">cohorts</span> <span class="o">=</span> <span class="n">grouped</span><span class="o">.</span><span class="n">agg</span><span class="p">({</span><span class="s">&#39;nr_anunt&#39;</span><span class="p">:</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="o">.</span><span class="n">nunique</span><span class="p">})</span> <span class="n">cohorts</span><span class="o">.</span><span class="n">head</span><span class="p">()</span> </pre></div> <table> <thead> <tr> <th>CohortGroup</th> <th>date</th> <th>count</th> </tr> </thead> <tbody> <tr> <td>2018-02-07</td> <td>2018-02-07</td> <td>2551</td> </tr> <tr> <td></td> <td>2018-02-08</td> <td>2461</td> </tr> <tr> <td></td> <td>2018-02-09</td> <td>2390</td> </tr> <tr> <td></td> <td>2018-02-10</td> <td>2345</td> </tr> <tr> <td></td> <td>2018-02-11</td> <td>2300</td> </tr> </tbody> </table> <p>Then we group the data again, this time by the CohortGroup and by the date we saw the ad. The first grouping means we put in one group all the ads that showed up the first time on a certain day, and then we group again by every subsequent day when we saw them. On these groups, we aggregate by the number of unique IDs we see, which will give us the size of our cohorts on each day.</p> <div class="highlight"><pre><span class="n">exp</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">cohorts</span><span class="o">.</span><span class="n">to_records</span><span class="p">())</span> <span class="n">exp</span><span class="p">[</span><span class="s">&quot;CohortPeriod&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">exp</span><span class="p">[</span><span class="s">&quot;date&quot;</span><span class="p">]</span> <span class="o">-</span> <span class="n">exp</span><span class="p">[</span><span class="s">&quot;CohortGroup&quot;</span><span class="p">]</span> <span class="n">exp</span><span class="o">.</span><span class="n">set_index</span><span class="p">([</span><span class="s">&quot;CohortGroup&quot;</span><span class="p">,</span> <span class="s">&quot;CohortPeriod&quot;</span><span class="p">],</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">exp</span><span class="o">.</span><span class="n">head</span><span class="p">()</span> </pre></div> <table> <thead> <tr> <th>CohortGroup CohortPeriod</th> <th>CohortPeriod</th> <th>date</th> <th>nr_anunt</th> </tr> </thead> <tbody> <tr> <td>2018-02-07</td> <td>0 days</td> <td>2018-02-07</td> <td>2551</td> </tr> <tr> <td></td> <td>1 days</td> <td>2018-02-08</td> <td>2461</td> </tr> <tr> <td></td> <td>2 days</td> <td>2018-02-09</td> <td>2390</td> </tr> <tr> <td></td> <td>3 days</td> <td>2018-02-10</td> <td>2345</td> </tr> <tr> <td></td> <td>4 days</td> <td>2018-02-11</td> <td>2300</td> </tr> </tbody> </table> <p>Until now, we have absolute dates, which we can't compare between cohorts. If one cohort started in March, and the other one in April, of course they will have different behaviours in April (one being right at the beginning and the other one one month in). So we want to convert to relative dates, by substracting the date of the scraping of the ad and the first time we saw the ad. Because my Pandas-fu is not that good, I didn't find another solution to this other than expand the index to columns again. Then I did the substraction and reindexed everything, this time by the CohortGroup (so first day an ad showed up) and CohortPeriod (how many days have passed since then).</p> <div class="highlight"><pre><span class="n">cohort_group_size</span> <span class="o">=</span> <span class="n">exp</span><span class="p">[</span><span class="s">&quot;nr_anunt&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span> <span class="n">retention</span> <span class="o">=</span> <span class="n">exp</span><span class="p">[</span><span class="s">&quot;nr_anunt&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">unstack</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">divide</span><span class="p">(</span><span class="n">cohort_group_size</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="n">retention</span><span class="o">.</span><span class="n">head</span><span class="p">()</span> </pre></div> <table> <thead> <tr> <th>Cohort Group CohortPeriod</th> <th>2018-02-07</th> <th>2018-02-08</th> <th>2018-02-09</th> <th>2018-02-10</th> <th>2018-02-11</th> </tr> </thead> <tbody> <tr> <td>0 days</td> <td>1.000000</td> <td>1.000000</td> <td>1.000000</td> <td>1.00000</td> <td>1.000000</td> </tr> <tr> <td>1 days</td> <td>0.964720</td> <td>0.921569</td> <td>0.941176</td> <td>1.00000</td> <td>0.955882</td> </tr> <tr> <td>2 days</td> <td>0.936887</td> <td>0.901961</td> <td>0.862745</td> <td>0.93750</td> <td>0.852941</td> </tr> <tr> <td>3 days</td> <td>0.919247</td> <td>0.901961</td> <td>0.862745</td> <td>0.90625</td> <td>0.852941</td> </tr> <tr> <td>4 days</td> <td>0.901607</td> <td>0.882353</td> <td>0.862745</td> <td>0.87500</td> <td>0.794118</td> </tr> </tbody> </table> <p>We are now ready to calculate retention. We want percentages, not absolute values, so we first look at the size of each cohort on the first day. Then we pivot the dataframe, so that on the rows we get CohortPeriod and on the columns we get CohortGroups (that's what unstack does) and divide with the size of the cohorts, column-wise.</p> <p>And then we plot what we got. First, we can do a line chart:</p> <div class="highlight"><pre><span class="n">retention</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span> </pre></div> <p><img alt="Line plot of retention" src="" width="100%" style="max-width:600px"/></p> <p>And then a nice heatmap:</p> <div class="highlight"><pre><span class="n">sns</span><span class="o">.</span><span class="n">heatmap</span><span class="p">(</span><span class="n">retention</span><span class="o">.</span><span class="n">T</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s">&#39;.0%&#39;</span><span class="p">,</span> <span class="p">)</span> </pre></div> <p><img alt="Heatmap of retention" src="" width="100%" style="max-width:600px"/></p> <p>From looking at these two charts, we see that after about one month, 60% of the ads are still available, but then, there is a big cliff and it jumps down to below 30%. However, then it climbs back up, to around 40% and then stabilizes around 30%. </p> <p>My hypothesis is that after the first month, the ads are taken offline by an automated system, for inactivity and that's why you have a big drop. Some people reactivate the ads, which leads to the rebounce and then ads organically go away, as the underlying real estate is no longer available. </p> <p>In conclusion, you don't need to hurry too much when buying houses in Oradea: you easily have at least two weeks for 80% of the cases, after an ad shows up, and up to a month in 60% of the cases.</p> Tue, 29 May 2018 19:40:00 GMT,2018-05-29:/2018/05/29/real-estate-cohort-analysis Scraping for houses <p>Having moved back to Romania, I decided I would need a place to live in, ideally to buy. So we started looking online for various places, we went to see a lot of them. Lots of work, especially footwork. But, being the data nerd that I am, I wanted to get smart about it and analyze the market. </p> <p>For that, I needed data. For data, I turned to scraping. For scraping, I turned to Scrapy. While I did write a scraper <a href="">5 years ago</a>, I didn't want to reinvent the wheel yet again, so I turned to Scrapy because it's a well-known, much used scraping framework in Python. And I was super impressed with it. I even started scraping things more often, just because it's so easy to do in Scrapy :D</p> <p>In this post I am going to show you how to use it to scrape the olx website for housing posts in a given city, in 30 lines of Python. Later, we are going to analyze the data too. </p> <p>First, you have to generate a new Scrapy project and a Scrapy spider. Run the following commands in your preferred Python environment (I currently prefer pipenv).</p> <div class="highlight"><pre>pip install scrapy scrapy startproject olx_houses scrapy genspider olx </pre></div> <p>This will generate a file for you inside <code>olx_houses/spiders</code>, with some boilerplate already written, and you just have to extend it a bit.</p> <div class="highlight"><pre><span class="kn">import</span> <span class="nn">scrapy</span> <span class="kn">import</span> <span class="nn">datetime</span> <span class="n">today</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&#39;%Y-%m-</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">)</span> </pre></div> <p>These are just imports and I am precomputing today's date, because I want each entry to contain when it was scraped.</p> <div class="highlight"><pre><span class="k">class</span> <span class="nc">OlxHousesSpider</span><span class="p">(</span><span class="n">scrapy</span><span class="o">.</span><span class="n">Spider</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;olx_houses&#39;</span> <span class="n">allowed_domains</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;;</span><span class="p">]</span> <span class="n">start_urls</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;;</span><span class="p">,</span> <span class="s">&#39;;</span><span class="p">]</span> </pre></div> <p>Then we define our class, with the allowed domains. If we encounter a link that is not from these domains, it is not followed. We are interested only in olx stuff, so we allow only that. The start URLs are the inital pages, from where we should start the scraping. In our case, these are the listing pages for house and flats.</p> <div class="highlight"><pre> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span> <span class="k">for</span> <span class="n">href</span> <span class="ow">in</span> <span class="n">response</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">&#39;a.detailsLink::attr(href)&#39;</span><span class="p">):</span> <span class="k">yield</span> <span class="n">response</span><span class="o">.</span><span class="n">follow</span><span class="p">(</span><span class="n">href</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_details</span><span class="p">)</span> <span class="k">for</span> <span class="n">href</span> <span class="ow">in</span> <span class="n">response</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">&#39;a.pageNextPrev::attr(href)&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">:]:</span> <span class="k">yield</span> <span class="n">response</span><span class="o">.</span><span class="n">follow</span><span class="p">(</span><span class="n">href</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse</span><span class="p">)</span> </pre></div> <p><code>parse</code> is a special function, which is called by default for every URL. So the start URLs will be parsed using this. It is called with a response object, containing the HTML received from the website. This response object contains both all the HTML text, but it also has a DOM parse and it allows direct querying with CSS and XPath selectors. If you return or yield a Request object from this function, Scrapy will add it to the queue of pages to be visited. A convenience method for doing this is to use the <code>follow</code> method on the response object. You pass it the URL to visit and what callback method to use for parsing (by default it's the <code>parse</code> method). </p> <p>We are looking for two things on this page:</p> <p>1) For anchor links that have a <code>detailsLink</code> CSS class. These we want to parse with the <code>parse_details</code> method. 2) Anchor links that have a <code>pageNextPrev</code> CSS class. We look only at the last one of these links (that's what the [-1:] indexing does), because that one always points forward. We could look at all links and it wouldn't cause duplicate requests, because Scrapy is keeping track of what links it already visited and it doesn't visit them again. These links we will parse with the default method. </p> <p>And now comes the fun part, getting the actual data. </p> <div class="highlight"><pre> <span class="k">def</span> <span class="nf">parse_details</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span> <span class="n">attrs</span> <span class="o">=</span> <span class="p">{</span> <span class="s">&#39;url&#39;</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">url</span><span class="p">,</span> <span class="s">&#39;text&#39;</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">&#39;#textContent&gt;p::text&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">extract_first</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="s">&#39;title&#39;</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">&#39;h1::text&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">extract_first</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="s">&#39;price&#39;</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">&#39;.price-label &gt; strong::text&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">extract_first</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">),</span> <span class="s">&#39;date&#39;</span><span class="p">:</span> <span class="n">today</span><span class="p">,</span> <span class="s">&#39;nr_anunt&#39;</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">&#39;.offer-titlebox em small::text&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">re</span><span class="p">(</span><span class="s">&#39;\d+&#39;</span><span class="p">),</span> <span class="s">&#39;adaugat_la&#39;</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">&#39;.offer-titlebox em::text&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">re</span><span class="p">(</span><span class="s">&#39;Adaugat (de pe telefon) +La (.*),&#39;</span><span class="p">)</span> <span class="p">}</span> </pre></div> <p>We extract various attributes from the listing pages. Some things are straightforward, like the URL, or the text and title, which are obtained by taking the text of some elements chosen with CSS selectors. For price the selector is a bit more complicated and we have to prepare the text a bit (by removing spaces). For the ID of the listing and the date added field, we have to apply some regular expressions to obtain only the data that we want, without anything else. </p> <div class="highlight"><pre> <span class="k">for</span> <span class="n">tr</span> <span class="ow">in</span> <span class="n">response</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">&#39;.details&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s">&#39;tr/td//tr&#39;</span><span class="p">):</span> <span class="n">title</span> <span class="o">=</span> <span class="n">tr</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">&#39;th::text&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">extract_first</span><span class="p">()</span> <span class="n">value</span> <span class="o">=</span> <span class="s">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">tr</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="s">&#39;td/strong//text()&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">extract</span><span class="p">()</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">!=</span><span class="s">&quot;&quot;</span><span class="p">)</span> <span class="n">attrs</span><span class="p">[</span><span class="n">title</span><span class="p">]</span><span class="o">=</span><span class="n">value</span> <span class="k">yield</span> <span class="n">attrs</span> </pre></div> <p>There is one last thing: some crucial information is displayed in a "structured" way, but it's marked up in a completely unstructured way. Things like the size of the house or the age. These values are in a table, with rows containing a table header? cell with the name of the attribute, followed by table data cells containg values. We take all the values, join them with a space, and put them in the dictionary we used above, with the key being the value we got from the table header cell. We do this for all the rows in the table. </p> <p>And that's it. Easy peasy. Now all we have to do is run the scraper with the following command:</p> <div class="highlight"><pre>scrapy run olx -o houses.csv </pre></div> <p>We wait a little bit and then in that file we have all the listings. And if we repeat this process (almost) daily for several months, we can get trends and see how long are houses on the market on average. But that's a topic for another post.</p> Mon, 07 May 2018 19:39:00 GMT,2018-05-07:/2018/05/07/scraping-for-houses Synology and Docker <p>After more than a year of using my NAS only to collect dust and the occasional backup, I decided this month to start self hosting various web apps on it. Synology has a visual Docker interface, so I installed that and I started trying to install my first app: <a href="">Monica</a>, which is a personal relationship manager (I love to track things).</p> <p>Unfortunately, modern technology has not yet solved this problem of deploying apps seamlessly. :(</p> <figure> <p><img alt="Installing from the Docker registry" src="" width="100%" style="max-width:600px"/> <figcaption>Installing Monica from the Docker registry</figcaption></p> </figure> <p>Installing the Monica Docker container was fairly simple: you search for it, click download, set the environment variables in the GUI, carefully copy pasting their names from the documentation, and it kinda starts, but spews errors in the logs. Monica provides you with an example .env file, but you can't use it in the UI :(.</p> <figure> <p><img alt="Setting the environment variables" src="" width="100%" style="max-width:600px"/> <figcaption>Setting the environment variables</figcaption></p> </figure> <p>But then you get to the first problem: the database. Monica has a dependency on a MySQL database. It provides a docker compose file, which could bring it up and wire them together, but the Synology Docker UI doesn't have support for Docker Compos, so I had to manually provision the database. </p> <p>Synology has a package for MariaDB. I tried to use that, but I couldn't figure out how to connect the two. Then I tried to install a MySQL Docker container, also from the UI. I struggled a lot to connect them, until I realized that the IP address that I had to pass was the one from the separate network Docker creates.</p> <p>Once I got the database connection set up and initialized, the app started, but it was working from an IP address. I wanted to add HTTPS support for it and I wanted to access it from a pretty url, so I had to add a DNS subdomain entry at my registrar. </p> <p>I thought that I would have to open up a new port on my router to do all this, but it turns out that the Docker image for Monica serves only HTTP, so actually what you have to do is set up a reverse proxy to receive HTTPS requests from the outside world and send them on plain HTTP to your app. Luckily, Synology has a package built in for doing just this, inside Control Panel/Application Portal.</p> <p>The last step was adding an SSL certificate from Let's Encrypt. Synology also has support for this, so it was trivial to do this, from the Control Panel/Security/Certificate.</p> <p>I probably spent around two days figuring this out. Afterwards, the next apps were easier to install, but some still caused issues (like Wallabag). There are rumours of even better packaged solutions, but they don't have too many apps for now (also, why are torrenting/usenet apps so popular??).</p> Thu, 26 Apr 2018 17:39:00 GMT,2018-04-26:/2018/04/26/synology-and-docker Man versus nature <p><img alt="Me hiking" src="" width="100%" style="max-width:600px"/></p> <p>Some friends in Oradea are big hikers. They had plans to go to Curcubăta Mare, the highest peak on a 500 km radius, being at 1849m, but they were always foiled by weather. Finally they decided to go last Saturday, because the temperature had risen slightly and the forecast wasn't too cloudy. They invited me to go along, so I joined the group of 5 people.</p> <p>We went by car to Vârtop, which is a ski resort. On the way there we saw some beautiful winter landscapes. I didn't know that Romania could be so amazing in winter. You definitely don't need to go 1200 kilometers to the Alps to see such things :D</p> <p>At the ski resort we took the ski chair to top of the ski track and from there we started off on foot on a narrow, slippery path among firs. While the snow occasionally gave way under our feet, it was pretty ok, though the climb was a bit steep (at least for a beginning hiker like me).</p> <p>Once we got to the mountain crest, the forest ended and there was only the occassional tree or bush. And the wind. We didn't expect any wind, but at some point it got up to 40 km/h. The visibility got reduced to below 100 meters. While it was only -7 degrees, it felt like -12 at least. </p> <figure> <p><img alt="First checkpoint" src="" width="100%" style="max-width:600px"/> <figcaption>Proof that we got to the mountain ridge</figcaption></p> </figure> <p>Our progress was made difficult by the fact that the snow would occasionally break under us, so we would end up knee deep in snow. I found it very interesting how in some places the snow was frozen solid, to ice, while two meters further it would crumble under you. Snow dunes :D Luckily, we didn't have to climb as steeply as before. </p> <p><img alt="Snow dunes" src="" width="100%" style="max-width:600px"/></p> <p>Because of the lack of speed, we ended up going only halfway to Curcubata Mare. We didn't want to hike in the dark, so we turned back from an intermediate plateau. </p> <p>I realized on the way back that my boots weren't up to snuff. While the rest of my equipment kept me nice and warm, I managed to get snow into my boots and they got really wet :( So that's on my to buy list. </p> <p>Going back was even more difficult. I had already exhausted a large part of my energy reserves. Luckily I had my trusty Thermos, which still kept the tea warm, so it made me very popular in our group :))) But at least the weather cleared up a bit, the wind stopped and the clouds sometimes gave way to views into the valleys around us. </p> <p>All in all, it was a fun challenge for me and I would like to repeat it soon!</p> <figure> <p><img alt="Turning back" src="" width="100%" style="max-width:600px"/> <figcaption>Group picture from where we turned back</figcaption></p> </figure> <p>Pictures were taken by Csabi and Silviu!</p> Sun, 01 Apr 2018 13:36:00 GMT,2018-04-01:/2018/04/01/man-versus-nature N.T. Wright in Cluj <p><img alt="NT Wright and his translator" src="" width="100%" style="max-width:600px"/></p> <p>N.T. Wright, one of the world’s leading New Testament scholars and an expert on Pauline theology, was invited by Edictum Dei to hold a conference in Cluj last week. I found out about it the day before, when there were already no more tickets available. But, I persisted, asked around and managed to find some friends who could lend me some, so I went to the first session, out of three. </p> <p>The first topic was based on his book “The Day the Revolution Began”title case and in it, the professor explained the meaning and the power of the cross and how today, many people misunderstand it. You often hear a platonized version of eschatology, about our souls going to heaven or hell when we die, when Dr. Wright says that in the Bible, the end state is a new creation, with heaven and earth together and God living among his people. He brings back in this way the central message of Jesus Christ in the Gospels: the Kingdom of God as a present reality in the lives of those who believed in Messiah, the Kingdom which will conquer the whole cosmos. Our anthropology is often moralized, with Adam and Eve’s disobedience being just a moral failure, instead of a failure to reflect God into creation. And the third mistake we make is paganizing our soteriology. We believe that the Creator God was very angry with us because we sinned and wanted to kill us all, but then somebody just happened to step in the way. That someone happened to be his only innocent Son, so everything is alright, because the angry creator exhausted his anger on him and everyone else got away free. But, according to Dr. Wright, what’s going on is that God wants to live with his people, but the only way for him to do that is if somebody cleans them from their sins. </p> <p>Another thing that I found memorable was his explanation for part of the reason why Galatians was written. He says that one of the main issues there was Jews and Gentiles eating together. Normally, the Gentiles were ritually unclean, so if the two ate together, the Jews would become unclean as well. However, because Jesus died for the Gentiles as well, he cleansed them, so now it was no problem for the two to eat together. And then Dr. Wright goes back to John 12:20, when some Greeks want to talk to Jesus and ask Phillipp for an audience with him. But Jesus doesn’t answer with a time and place to meet them, but seemingly veers off to talk about his death. The explanation for this is the same: for now, Jesus, as a Jew, could not meet with the Gentiles, but, after he dies, he will have cleaned them, so he is waiting for that. </p> <p>At the end, I went up to N.T. Wright and I got two autographs, one in his translation of the New Testament and one in his book Simply Christian. He noticed that I had a T-Shirt which said δούλος Ἰησοῦ Χριστος (servant of Jesus Christ) and then he told me that one of his grandsons, to whom the book is dedicated, will have his catechism on the 1st of April. He was very nice and friendly :) Unfortunately, I forgot to take a selfie with him :(</p> <p><img alt="NT Wright's autograph in my copy of Simply Christian" src="" width="100%" style="max-width:600px"/></p> Mon, 26 Mar 2018 20:47:00 GMT,2018-03-26:/2018/03/26/n-t-wright-in-cluj Dell XPS 13 review <p>While I worked for Google, I had a work Macbook and that was enough for my personal usage as well when I was travelling. But now, I needed a new laptop, so a month ago I splurged on a shiny new toy. Facebook proved itself useful for once: I asked for recommendations and got a lot from my friends. I wasn’t too impressed by my previous Macbook and Lenovo seemed to have ruined their laptops. But one laptop that caught my eye and quickly convinced me to buy it was the Dell XPS 13. The bigger question was which model to buy: the 2018 one, which has only USB C ports, but a smaller battery, or the late 2017 one (they released two models in 2017!!!!), which has a more usual port setup and a bigger battery. I ended up going for the latter. </p> <p>From the beginning, I experienced some interesting issues: when I first started it up and it was doing it’s initial setup thing, it gave me a BSOD. In the next one week, it would randomly restart. A quick search revealed that the BIOS might be the culprit and after upgrading it to the latest version, I didn’t have this problem. Still, shame on you Dell for releasing such a BIOS.</p> <p>I didn’t want the fancy 4K laptop, because I find it an overkill on a 13” laptop, and it comes with a touchscreen, which I find to be a useless gimmick. But the only configuration that had 16GB of RAM came with that and an i7 processor. It comes at the cost of battery life, but I still manage to get it to last around 8 hours at least, so it’s pretty good. </p> <p>And the display is amazing, I have to admit it. It’s extremely sharp and incredibly bright (I normally use it at less than half the luminosity). The colour range is also very good. It has very small bezels, but that comes at the cost of the camera being placed in the bottom left corner, looking up your nose in video calls. </p> <p>Unfortunately, the BIOS bug I mentioned above was not the only software issue the laptop had. For the first month, it felt like it lagged a bit. Sometimes text would should up with a delay, clicks weren’t responsive. At first I blamed it on Javascript and modern bloated web development. Then it happened in Notepad. Then it occured to me to look at my CPU with some monitoring tools - and lo and behold, it was throttled to 1.3 GHz, even though I was on AC and power settings to the maximum. After some fiddling with settings, I read on the internet that maybe plugging it out and back in would help. And indeed it did. Processor clock speed jumped up to over 3Ghz, fans spun up and everything moved snappily, like they should with an i7 processor. What are you doing Dell?</p> <p>The keyboard is pretty good. I didn’t really enjoy chiclet keyboards, but I guess I got used to them and now I don’t mind them. It doesn’t have dedicated media keys, so you have to use the Fn button to toggle between them and the F keys. The trackpad is good, except sometimes it misinterprets my two finger scroll for a pinch to zoom gesture. </p> <p>It has a charging port, an USB C port (which cannot be used for charging unfortunately), two USB A ports, an audio jack and an SD card reader. </p> <p>When on the road, so when not using it for CPU intensive tasks, it doesn’t heat up and is comfortable to hold in my lap. Also, battery lasts around 8 hours, so enough to get through a working day. </p> <p>Given that Windows now has a Linux Subsystem, I haven’t even bothered yet to install Linux. I might do it in the future, but so far, it worked pretty well for me. You can install fish, tmux and a lot of other command line tools. What else can a simple software engineer want? </p> <figure markdown="1"> <video src="/static/videos/dell.mp4" autoplay loop> </video> <figcaption>Opening my Dell XPS 13 laptop</figcaption> </figure> <p>There is one mildly glaring hardware annoyance: it's pretty hard to open the lid with one hand. As you can see in the above video, I pretty much have to open it with two hands. Oh well, I can live with that. </p> <p>The design is surprisingly pleasant to the eye. There is finally a nice looking Windows laptop! I don’t know exactly what it’s made of. On the outside there is a metallic shell and on the inside there is a very smooth, silky thing, which is very nice to touch. Combined with the fact that the laptop is really light weight, it’s an awesome choice. If the software bugs don’t happen again, I think I’ll really enjoy working on this little thing.</p> Sat, 10 Mar 2018 14:21:00 GMT,2018-03-10:/2018/03/10/dell-xps-13-review Goals for 2018 <p>Because of my move to Romania, I decided to postpone any big goal setting until I’m finally here. Packing, driving 3000 kilometers, unpacking, deregistering from Switzerland and registering in Romania all take unpredictable amounts of time, so I just thought about what goals I want and they will be my Martisor’ resolutions.</p> <p>Most of the things will stay similar. For example, my get to 82 kg goal is still there, for a third year in a row. This time it will stick, I promise! But, now that I’m no longer at Google and I no longer have the “all your intellectual property belong to us” clause in my contract, I would like to start being more active in the open source community so I’ll add a goal about that. </p> <h4>Physical</h4> <dl> <dt>Weight watching</dt> <dd>First off, I have to get back to 82 kilograms. Second, I have to stay there. This thing is getting old, that I keep losing the weight, only to put it back. I want to lose 1 kg per month, so that by the end of the year I will be in the right shape. </dd> <dt>Exercise three times a week</dt> <dd>The same amount as before (I found that it worked fairly well for me), but I will extend the activities that count: given that I live in a house now, any house work that gets me sweating and I do it for more than 30 minutes counts. Of course, going to the gym, running, swimming and other traditional sporting activities are still valid.</dd> <dt>Juggle for 5 minutes every day</dt> <dd>I want to learn how to juggle, so I will start practicing for 5 minutes every day. Goal is to be able to juggle 4 balls for 1 minute. </dd> </dl> <h4>Mental</h4> <dl> <dt>Read 20 books this year</dt> <dd>Self-explanatory</dd> <dt>Write three blog posts a month</dt> <dd>Self-explanatory</dd> <dt>Spend 2 hours per week studying German</dt> <dd>Given that I have learned German for three years and I got to an okay level, it would be nice to get a diploma to prove. I’ve finished A2 courses, so I would like to get to B1 level this year and take an exam in that. </dd> <dt>Two open source contributions per month</dt> <dd>There are a lot of cool open source projects, so I would try to contribute to them. Ideally, the contributions would be measured when they are accepted, but because things can get complicated quickly, I’ll accept writing 100 lines of code towards fixing an issue as well. </dd> </dl> <h4>Spiritual</h4> <dl> <dt>Read 3 chapters from the Bible every day</dt> <dd>Self-explanatory</dd> <dt>Memorize 1 Bible verse every week</dt> <dd>Sigh. Here we go again. However, this time I will apply a twist: I’ll try to get a group of friends from church to do this with me. Hopefully, learning in a group setting will help me with this goal.</dd> </dl> Fri, 23 Feb 2018 09:25:00 GMT,2018-02-23:/2018/02/23/goals-for-2018 An update on rolisz <p><img alt="My Google Guest Badge" src="" width="100%" style="max-width:600px"/></p> <p>After 3 years and 5 months at Google, time has come for me to move on to my next adventure. Yesterday was my last day at Google. I will be moving back to Romania, where my wife still has one year of university left. </p> <p>On one hand, I'm super excited about the changes the future will bring. I have a super interesting job lined up. It will be nice to be able to understand again everything that is spoken around me. Having friends and family close by will also be a huge plus. </p> <p>On the other hand, I can't say I'm not a bit sad. I had a good life here in Switzerland, Google is a really good employer and I had some amazing colleagues here in Zurich, whom I will miss.</p> <p>I hope I won't suffer from too much reverse culture shock as I go back to Romania. But, like until now, I trust that God will continue to lead my steps and that He has a place and role for me in Oradea. All I have to do is obey faithfully.</p> Thu, 01 Feb 2018 09:22:00 GMT,2018-02-01:/2018/02/01/an-update-on-rolisz Mass Effect Andromeda <p><img alt="Mass Effect Andromeda poster" src="" width="100%" style="max-width:600px"/></p> <p>I have been a huge Mass Effect fan. I loved the first game as soon as I played. I found the story fascinating, the science there amazing. I played the games and read the books and got to know the universe pretty well. But then Mass Effect 3 came out and I was fairly dissappointed by it. And now, after a long break, the latest game in the series came out, Andromeda.</p> <p>As you can guess from the name, this game happens in the Andromeda galaxy, so it's a complete break from everything we've seen previously. All new planets, all new starts, all new enemies. In fact, the story sets off right before Mass Effect 2 or 3, and then skips 600 hundred years into the future, but in a complete isolation. </p> <p>Because I'm a grownup with a job now, I didn't have time to play it right away. I actually waited for a while and bought it on a sale two months later. And it took me more than half a year to finish the single player campaign.</p> <figure> <p><img alt="The Nexus" src="" width="100%" style="max-width:600px"/> <figcaption>The Nexus, the central hub for the Milky Way species</figcaption></p> </figure> <p>Mass Effect Andromeda had a pretty botched launch. It had a lot of bugs and people especially liked to make fun of the facial animations. Because of this, BioWare had to release several patches for it in the first two months. Because of this, I actually had fairly low expectations (and also because I really didn't like <a href="">Mass Effect 3</a>).</p> <p>But my low expectations were fully met and even gone over. Too bad sales sucked, so Bioware pretty much shelved Mass Effect for a while. I did find that the science part of the game went away. While in the original one they had several pages explaining how Element Zero works and how FTL flight happens, now they very handwavily skip over how they travelled between galaxies in one sentence and that's it. Also how does SAM, the resident AI, interact with the local ancient technology? Well, it's an AI, of course it can do that. Ugh. </p> <p>Once you arrive in Andromeda, you realize that all the planets that the Andromeda Initiative magically saw, before leaving the Milky Way, are uninhabitable and that there is this weird Scourge that fries all electronics. But luckily, you find some abandoned technology, called Remnant for some reason I can't figure out, on the first planet that you crash on and it start terraforming the planet. Unluckily, you find some aliens, called Kett, which you call the same as everyone else, without agreeing to it before, also interested in that tech and they shoot first, ask questions later. But luckily again, you find some other aliens, the Angara (at least they give you their name), who are more friendly. </p> <figure> <p><img alt="The Remnant Vault" src="" width="100%" style="max-width:600px"/> <figcaption>A Remnant vault, which terraforms planets</figcaption></p> </figure> <p>So you go around various planets, doing the usual Mass Effect side missions and levelling up. The difference is that now you have to unlock the vaults that have the Remnant tech and terraform the planets, transforming them from dreadful and deadly places to cozy homes. In the meantime you fight off the Kett and of course you deal with all the politics people brought from Milky Way.</p> <p>The Kett become a bigger and bigger problem, so the solution is to get rid of them. You go for the Kett head honcho, The Archon, who is an arrogant bastard. You fall for a stupid trap, but of course you manage to escape. In the meantime, you learn that the Jardaan created the Remnant, but they were attacked by somebody with the Scourge. And poof, now they're gone. You defeat the Archon, you find a really cool Dyson sphere and everyone is happy. Yaaaay. </p> <p>The storyline is actually promising, but the problem is that they clearly intended to have some DLCs. There are so many hints dropped only to pique your interest, fragments of really cool information, but which are never fully developed, so you are left hanging. And Bioware confirmed that they won't be releasing any DLCs. Why did you do this to us? Whyyyy?</p> <figure> <p><img alt="Part of the gang" src="" width="100%" style="max-width:600px"/> <figcaption>Ryder with 4 of the team members</figcaption></p> </figure> <p>Your new squad mates are quite interesting. You have the 1000 year old krogan, who's seen it all, except a new galaxy. You've got the human biotic who trained with asari commandos. There's the rebellious and playful asari scientist, who's obsessed with the Remnant. One of the angara joins you and spreads the zen around. The turian is the smuggler/black-market dealer type. And lastly, you've got another human, who used to be some sort of special police back on Earth.</p> <p>The dialogue is pretty good, plenty of jokes to go around. Especially while you are driving, your team mates start talking among themselves, usually annoying each other, so it prevents you from being too bored from driving around. </p> <p>Combat is quite fun. A new addition is that you have a jet pack that you can use to jump (finaaaaally!) and hover while shooting. This means that you can jump on your enemies and rain destruction from above on them. There is also a weird profile system (such as soldier or biotic specialist), where you can switch between them at will. In practice, I found it quite cumbersome, because switching profiles trigger the cool downs for all your powers. So I settled for the profile that gave me the syphoning ability: melee attacks would fix my shields. </p> <figure> <p><img alt="The Tempest" src="" width="100%" style="max-width:600px"/> <figcaption>Your ship, the Tempest</figcaption> </p> </figure> <p>Graphics/physics: I was expecting better from a modern AAA game. While the facial animation glitches didn't bother me so much, I was frustrated by seeing how many times solid objects would move through each other or would move in other impossible ways. I mean, it's 2017, how come collision detection is still so buggy? Also, your vehicle can move in... um... funny ways. </p> <p>The worlds where you play are quite big and varied. You've got everything from desert to tropical to frozen wastelands. You drive around in some all terrain vehicle, which occasionally moves in weird ways. The most annoying part is with mountains, which are tempting to try to go over in the car, but it usually ends up being slower than going around. </p> <p>The soundtrack is pretty decent. It gives you the chills sometimes, but most often it's just not memorable. </p> <p>I think I'll give the game a 7/10. It was fun to play, but it had plenty of quirks that were annoying, especially for a Mass Effect game.</p> Sat, 13 Jan 2018 18:44:00 GMT,2018-01-13:/2018/01/13/mass-effect-andromeda 2017 in Review <p>Blogging got put on the backburner this year, for a good reason though: I got married, so other stuff become more important. While I did still have a blogging goal, it was more reduced, to 1.5 posts a month, which I did actually managed to beat. I wrote 22 blog posts last year, averaging 1.83 per month, which is around 33% less than the year before.</p> <p>Pageviews tracked number of posts in their downward trend, dropping by 29% to 26 thousand. Number of users went down to 10 thousand, but at least session length stayed around the same (1 minute and 5 seconds, compared to 1 minute and 8 seconds the year before).</p> <p>The day with the most page views was on February 23. I don’t know what happened then. It was just after the post about backups, but that was not the most visited thing, only the homepage, totaling 583 page views. The second most visited thing was on April 24, which is the day after I posted about <a href="">my engagement</a>, when my blog was visited 520 times.</p> <p>My most popular page remains the same: the neural networks one. The engagement post was by far my most popular one this year, with 436 views. Closely following it were the <a href="">three year retrospective</a> and the <a href="">how to organize a wedding</a> one, with 248 and 221 views.</p> <p>It’s a bit sad to see most of the numbers going down for the second year in a row, but I wasn't expecting anything else. I didn't have much time this year to work on my blog, so that’s what I get. Hopefully, in 2018 some things will change and I will be able to write more cool stuff (including technical posts)!</p> Mon, 01 Jan 2018 21:26:00 GMT,2018-01-02:/2018/01/02/2017-in-review Let's go to Africa <p><img alt="Arriving in Mauritius" src="" width="100%" style="max-width:600px"/></p> <p>Because of work, I couldn't take a long, proper vacation right after our wedding, so we decided that after some deadlines at the beginning of September, we would do a nice, two week honeymoon. Given that I love flying and I need the frequent flier miles, while my wife was not so thrilled about the idea of spending more than 10 hours in a tin coffin whizzing around the air at 900km/h, we had to find a middle ground. After lots of searching on Pinterest for honeymoon locations, we decided to go to Mauritius. It's fairly far, it got me the miles I needed to keep my Gold status, we got to visit a new continent (well, kinda) and it was less than 10 hours of flight per segment. </p> <figure> <p><img alt="On the highway in Mauritius" src="" width="100%" style="max-width:600px"/> <figcaption> On the highway in Mauritius </figcaption></p> </figure> <p>For those of you who haven't heard of Mauritius, it's an island close to Madagascar, about 2000 km to the east of Africa. It's not to be confused with Mauritania, which is on the west coast of Africa. Mauritius is really small, 2040 km^2, less than the size of a county in Romania and with a population of 1.2 million people. It was uninhabited until 1507, when the Portuguese came and promptly ate all the dodos that were on the island, which went extinct when the Dutch came to the island. The Dutch were replaced by the French and then by the British. The island gained its independence in 1968. It currently is ranked as the most democratic country in Africa and it has a woman as president, Ameenah Gurib.</p> <figure> <p><img alt="Green wall at the airport" src="" width="100%" style="max-width:600px"/> <figcaption> Green wall at the airport </figcaption></p> </figure> <p>The first impression upon arriving in L'ile Maurice was really good. The airport is very clean and well maintained (much nicer than the one in Cluj). The taxi I ordered was waiting for us and the driver was very courteous. And the roads, oh those roads. They were better than in Romania. Maybe I had gotten my knowledge from the wrong movies, but I was certainly expecting a lot more potholes. Well, there were 0 potholes. And there was a highway! With beautiful views along the way! The airport is in the southeastern side of the island, while our hotel was on the northwestern side, so we got to see quite a lot of the island on our way there. It got us super excited for the upcoming two weeks!</p> <p>Opposed to my expectations from movies, Mauritius has a quite developed economy. Its GDP per capita is ever so slightly higher than Romania's. Prices were also quite similar, for things like restaurants or groceries. But once when we went off the "beaten", touristy path, we saw a lot of shanties, so I'm curious how much can people who live there afford.</p> <div class="gallery clearfix" style="max-width:600px"> <img title="Hotel lobby. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="The beach in front of our hotel. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="The hotel pool. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Sunset from our room. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/12/mauritius/hotel/20170916_144834.jpg", "title": "Hotel lobby.\n", "msrc": "/static/images/2017/12/mauritius/hotel/thumbs/20170916_144834.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/hotel/20170916_150403.jpg", "title": "The beach in front of our hotel.\n", "msrc": "/static/images/2017/12/mauritius/hotel/thumbs/20170916_150403.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/hotel/20170923_141514.jpg", "title": "The hotel pool.\n", "msrc": "/static/images/2017/12/mauritius/hotel/thumbs/20170923_141514.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/hotel/IMG_20170923_175127.jpg", "title": "Sunset from our room.\n", "msrc": "/static/images/2017/12/mauritius/hotel/thumbs/IMG_20170923_175127.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/12/mauritius/hotel/20170929_152829.jpg", "title": "Our hotel room. \n", "msrc": "/static/images/2017/12/mauritius/hotel/thumbs/20170929_152829.jpg", "w": 3096, "h": 4128}, {"src": "/static/images/2017/12/mauritius/hotel/IMG_20170923_172822.jpg", "title": "A chinese grocery store close to our hotel.\n", "msrc": "/static/images/2017/12/mauritius/hotel/thumbs/IMG_20170923_172822.jpg", "w": 3036, "h": 4048}]</script> </div> <p>While our hotel room was right next to the ocean, we initially had some problems with the hotel. The WiFi was extremely crappy. I normally have my own WiFi extender, but because I never used it, this was the first time that I didn't pack it with me <em>facepalm</em>. After asking at the reception, they gave us a small router for our own room. Then, the shower drain got clogged. Then the sink got clogged. Then the breakers for some of the outlets got interrupted. That took some time to figure out. And last, but most "fun": we had a fairly large spider in our room. And it ran really faaaaaast. But I managed to hunt it down! So I got extra brownie points with my wife :D </p> <p><img alt="Nearby beach" src="" width="100%" style="max-width:600px"/></p> <p>We spent the first couple of days relaxing, exploring the nearby beaches. The beach right next to us was rocky right, but another nicer one was about 50 metres away and a really nice one, in Pointe aux Biches, about half an hour away. That one had the advantage of being close to a supermarket and several restaurants, so it quickly became our favorite spot to swim around and snorkel (for me) and sunbathe (for my wife). </p> <p><img alt="Miniature ship" src="" width="100%" style="max-width:600px"/></p> <p>On Wednesday we got a taxi tour of the island. The driver came to pick us up at 9 AM. The drive took us through some scenic routes, along the "mountains" of Mauritius, with peaks such as Pieter Both. The first stop was at a handmade miniature ship factory and then at several local silk and cashmere shops, where we got some deals that I'm sure were amazing (I should really improve my negotiation skills :|).</p> <div class="gallery clearfix" style="max-width:600px"> <img title="Monkey kingdom. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Humans feed fish, cats eat fish. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Some Hindu gods. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/12/mauritius/temple/20170920_115312.jpg", "title": "Monkey kingdom.\n", "msrc": "/static/images/2017/12/mauritius/temple/thumbs/20170920_115312.jpg", "w": 3096, "h": 4128}, {"src": "/static/images/2017/12/mauritius/temple/IMG_20170920_115528.jpg", "title": "Humans feed fish, cats eat fish.\n", "msrc": "/static/images/2017/12/mauritius/temple/thumbs/IMG_20170920_115528.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/12/mauritius/temple/IMG_20170920_120006.jpg", "title": "Some Hindu gods.\n", "msrc": "/static/images/2017/12/mauritius/temple/thumbs/IMG_20170920_120006.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/12/mauritius/temple/P1160919.JPG", "title": "The 80 meter tall statue.\n", "msrc": "/static/images/2017/12/mauritius/temple/thumbs/P1160919.JPG", "w": 4272, "h": 2856}]</script> </div> <p>Then we went to the Ganga Talao, the largest Hindu temple in Mauritius, situated in Grand Bassin. The temple has 108 feet tall bronze statue of Shiva. It also has lots of monkeys and cats and there is a fish feeding place. It was my first larger contact with Hindu religion and... most of their gods look ugly and scary :/ </p> <div class="gallery clearfix" style="max-width:600px"> <img title="The red earth. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="The seven coloured earth. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Valley in the middle of Mauritius. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Chamarel Waterfalls. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/12/mauritius/chamarel/20170916_142448.jpg", "title": "The red earth.\n", "msrc": "/static/images/2017/12/mauritius/chamarel/thumbs/20170916_142448.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/chamarel/20170920_142947.jpg", "title": "The seven coloured earth.\n", "msrc": "/static/images/2017/12/mauritius/chamarel/thumbs/20170920_142947.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/chamarel/IMG_20170920_121854.jpg", "title": "Valley in the middle of Mauritius.\n", "msrc": "/static/images/2017/12/mauritius/chamarel/thumbs/IMG_20170920_121854.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/12/mauritius/chamarel/IMG_20170920_140929.jpg", "title": "Chamarel Waterfalls.\n", "msrc": "/static/images/2017/12/mauritius/chamarel/thumbs/IMG_20170920_140929.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/12/mauritius/chamarel/IMG_20170920_143730.jpg", "title": "Turtles visiting from Seychelles.\n", "msrc": "/static/images/2017/12/mauritius/chamarel/thumbs/IMG_20170920_143730.jpg", "w": 4048, "h": 3036}]</script> </div> <p>Then we went to Chamarel, which has some picturesque waterfalls and a seven coloured earth. Mauritians have something with coloured earths: there's a region called Terre Rouge (with red soil), there's this 7 coloured one and then there's another one with 23 colours. Btw, we had to squint really hard to see even the 7 colours, but it was definitely pretty. </p> <p><img alt="Delicious crab soup" src="" width="100%" style="max-width:600px"/></p> <p>For lunch we had some crab soup. Even though she doesn't like seafood, my wife had to admit that the soup was delicious (but she didn't taste the crab meat :))).</p> <p>Taxis work interestingly on Mauritius. You can get a taxi from the airport to anywhere on the island for a flat fee of about 35 euros. In our case, the ride was about one hour. Renting a taxi for a full day of driving around, with the driver explaining things to us, was about 70 euros. But taking a taxi from one of the malls to our hotel, a 15 minute ride, was about 15-20 euros, so disproportionately expensive. </p> <div class="gallery clearfix" style="max-width:600px"> <img title="The Mauritius Aquarium " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="One of the fishies from Nemo! " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Ugly sea bugs. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Large Moray Eel. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/12/mauritius/aquarium/20170923_170011.jpg", "title": "The Mauritius Aquarium\n", "msrc": "/static/images/2017/12/mauritius/aquarium/thumbs/20170923_170011.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/aquarium/20170926_150115.jpg", "title": "One of the fishies from Nemo!\n", "msrc": "/static/images/2017/12/mauritius/aquarium/thumbs/20170926_150115.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/aquarium/20170926_153553.jpg", "title": "Ugly sea bugs.\n", "msrc": "/static/images/2017/12/mauritius/aquarium/thumbs/20170926_153553.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/aquarium/IMG_20170926_153650.jpg", "title": "Large Moray Eel.\n", "msrc": "/static/images/2017/12/mauritius/aquarium/thumbs/IMG_20170926_153650.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/12/mauritius/aquarium/IMG_20170926_153718.jpg", "title": "Sharks. Tam-tam-tam-tam!\n", "msrc": "/static/images/2017/12/mauritius/aquarium/thumbs/IMG_20170926_153718.jpg", "w": 4048, "h": 3036}]</script> </div> <p>Another day we went to the Mauritius Aquarium, which was about 10 minutes from our hotel. We saw some of the fishies from Finding Nemo :D And sharks! And moray eels! And some ugly looking water bugs. We went right around feeding time and we chatted with one of the employees. He was a very friendly guy. He thought I looked Chinese (along with another person :|) and he had a nephew who had studied medicine in Romania and acquired an iPhone via dubious means. True story. </p> <p>There were many street hawkers trying to sell you stuff on the beaches. After I paid more than I want to admit for an ice cream, we mostly refused them, but there was one very friendly guy, Rajesh Jugnarain, who came to us on several days and got us a pretty good deal on a speedboat ride to the Ile aux Benitiers. Thaaaat was fuuuuun. So, if you ever go to Mauritius, make sure you ask Rajesh for some excursions. And check out the reviews we wrote in Romanian in his notebook.</p> <div class="gallery clearfix" style="max-width:600px"> <img title="L" ile aux benitier. ' src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Swimming with the dolphins. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="This rock used to be underwater! Pesky global warming cannot happen soon enough! " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/12/mauritius/speedboat/20170927_110821.jpg", "title": "L'Ile aux Benitier.\n", "msrc": "/static/images/2017/12/mauritius/speedboat/thumbs/20170927_110821.jpg", "w": 3096, "h": 4128}, {"src": "/static/images/2017/12/mauritius/speedboat/20170927_092841.jpg", "title": "Swimming with the dolphins.\n", "msrc": "/static/images/2017/12/mauritius/speedboat/thumbs/20170927_092841.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/speedboat/20170927_104238.jpg", "title": "This rock used to be underwater! Pesky global warming cannot happen soon enough!\n", "msrc": "/static/images/2017/12/mauritius/speedboat/thumbs/20170927_104238.jpg", "w": 4128, "h": 3096}, {"src": "/static/images/2017/12/mauritius/speedboat/20170927_135457.jpg", "title": "Beautiful water.\n", "msrc": "/static/images/2017/12/mauritius/speedboat/thumbs/20170927_135457.jpg", "w": 4128, "h": 3096}]</script> </div> <p>We had two guides, one of whom was piloting the boat. He drove as fast as possible, racing with another boat, which eventually got entangled in some fishing lines. He also wanted to make sure we get as wet as possible, especially my wife xD The other passengers on the boat were a family from South Africa who had a winery. The guy was from France and he had lived in Bora Bora for a while. There was also a family from London. They had a 20 year old daughter, but the mother looked so young that we thought the two were sisters. Even her husband made fun of her for going out to clubs with her daughter and getting smashed together.</p> <p>With the speedboat we first went to a spot where we could swim with the dolphins. I feel kinda guilty, because I think it qualifies as animal abuse :| There were three dolphins, which spent most of their time at the bottom of the sea, but whenever they came up for air, all the pesky humans would jump into the water to get close to them. But of course, the dolphins would vanish again soon.</p> <p>Ile aux Benitiers has a beautiful, fine sand, with clear turquoise water. The guides also cooked an amazing lunch, with barbecue chicken with best sauces in the world. We washed everything down with some Jungle Juice. I don't want to know what it contained, but it was good. </p> <p><img alt="Sunrise picture" src="" width="100%" style="max-width:600px"/></p> <p>On our last day, my wife insisted that we wake up to see the sunrise. I have faith that it would have happened even without me seeing it, but oh well, we woke up a bit before 6. Only to find out.... that we are on the western side of the island and the sun rises in the east, so we couldn't see anything. But at least we got a nice picture out of it!</p> <p><img alt="Sandcastle" src="" width="100%" style="max-width:600px"/></p> <p>Like with going to the circus, I also wanted to fill another important gap from my childhood: building a sandcastle, which I had never done before. So we bought a small plastic shovel and some cooking molds and on the last day we went to build a sandcastle. One more thing crossed off my childhood list! Success! </p> <figure> <p><img alt="View from our fancy room" src="" width="100%" style="max-width:600px"/> <figcaption>View from our fancy room</figcaption></p> </figure> <p>Afterwards, we went to the airport. Because I have Gold Status on Turkish Airlines, we went to the business lounge and had a meal. While checking whether boarding of our flight has started, suddenly something interesting showed up, as if it were for the next day. I check on Google. It had said something about a delay, but now it didn't say that anymore. We go to the gate and we are informed.... that the plane won't arrive that night, so we will fly out more the following morning \:D/ Wooohoo! My first cancelled flight, in more than 100 flights! Soooo exciting! (I'm not kidding, finally something to make flying a bit less monotonic). The good side: Turkish Airlines payed for us a reaaaaally fancy hotel room (more like suite with a jacuzzi). The bad side: they screwed up organizing a transport to the hotel so we waited at the airport for more than two hours and the hotel was an hour away, so we ended up sleeping there for like 4 hours only :/</p> <p><img alt="Us smiling on a beach" src="" width="100%" style="max-width:600px"/></p> <p>Mauritius was a pleasant surprise for me. I had much lower expectations, so it easily surpassed them. It also helped that the temperature was always between 21 and 28 degrees, so it was pretty much always pleasant. That's winter in Mauritius for you!</p> Sat, 30 Dec 2017 20:12:00 GMT,2017-12-30:/2017/12/30/let-s-go-to-africa The Last Jedi <p><img alt="Star Wars The Last Jedi Poster" src="" width="100%" style="max-width:600px"/></p> <p>A new Star Wars movie just came out and another Christmas is around so this year's Christmas party at Google was the screening of The Last Jedi, one day before the public launch.</p> <p>While I really enjoyed <a href="">The Force Awakens</a>, I was pretty disappointed in The Last Jedi. It was a really long movie (2 and a half hours). Seriously, what's up with movies lately? I thought people started having super short attention spans due to Twitter, yet almost every movie I watched in the cinema this year was longer than two hours. The new director takes the movie into some new directions. He reveals that several mysterious plot points from the previous movie were MacGuffins and he makes some bold revelations about the nature of the Force. I’m in the group of people that weren’t satisfied with this. But at least the movie is beautiful, with amazing visuals. Another complaint I have is that I think they had a disturbing lack of <del>faith</del> lightsaber duels. The ones they had were really good, but I think they were fewer than in previous movies. Also, those annoying puffins, I mean porgs, they're everywhere and they make squeaky sounds that make you want to eat them all, just like Chewbacca did.</p> <p><em>From here be spoilers</em> <!--more--></p> <p>The story is somewhat similar to the Empire Strikes Back. The rebel base is under attack and they are evacuating, while Rey is off to train with Luke. Poe pulls off some crazy stunts and manages to destroy a dreadnought so the Rebel ships can escape.</p> <p>But, they are tracked through hyperspace, via some of the worst sciencey mumbo-jumbo I've heard in a movie. The rebel ships are low on fuel, so they start off at full speed, without jumping to Warp, because they know it would be pointless, so they are just trying to buy some time. Poe tries to find out their plan, but he has been demoted to Captain, so he's not told anything.</p> <p><img alt="Rey training" src="" width="100%" style="max-width:600px"/></p> <p>In the meantime, Rey is trying to convince Luke to come out of retirement and train her in the ways of the Jedi. He is quite reluctant and only after much insistence on her side agrees to teach her three lessons, but he ends up only actually teaching her two, before she leaves. She also starts communicating with Kylo Ren through the Force. Even though initially they hate each other, they start bonding and get closer, encouraging each other and keeping each other company.</p> <p>Finn is sent from the Rebel ships to a casino, together with a mechanic, to find a master code breaker. They get into trouble for parking their space shuttle on the beach, are sent to jail and they manage to escape with the help of another code breaker, played by Benicio del Toro, who offers a delightful performance. They set free some circus animals and then they go back to infiltrate the First Order’s ship. </p> <p><img alt="Benicio del Toro playing a code cracker" src="" width="100%" style="max-width:600px"/></p> <p>The rebel ships are getting bombarded in the meantime, some of them get blown up and at some point the bridge, where Leia is, is blown up and she flies out into the cold vacuum of space. Quiet, slow, panning shot of her frozen body floating through space, only for her fingers to start moving and she uses the Force to fly back to the ship.</p> <p>After receiving two lessons from Luke, Rey thinks she can turn Ren so she leaves the remote island. Ren of course takes her captive and brings her in front of Supreme Leader Snoke. Snoke boasts how he planned everything and orders Ren to kill Rey, but instead Ren turns on him, cuts him in half with a lightsaber. The two then fight off his personal guard in a pretty impressive lightsaber fight. Rey wants to leave with Ren, but he actually wants to take Snokes place. Ah, poor, naive Rey. </p> <p>In the meantime, the rebels are abandoning their big ship in little transports, hoping they can get away undetected to an old Rebel base. Unfortunately, they are betrayed and start getting blown up. Admiral Holdo, who was the leader of the rebellion while Leia was in a coma, decides to turn around the big ship, point it toward the bad guys and jump to FTL. The baddies ship is sliced into several pieces and the rebels can make it to their base safely. </p> <p><img alt="Finn and Rose" src="" width="100%" style="max-width:600px"/></p> <p>The Rebel base is on a salty planet, which makes everything to be white on the surface, but just under it there some red stuff. The visuals are amazing here. All the battles look really good, with the red stuff flying around on every impact, on a white background. Kylo Ren arrives soon, armed with some AT-T walkers and they are trying to kill all rebels. The rebels launch a fairly pathetic defense, but they get their butts kicked so they start retreating. And then, Luke shows up. He greets his sister, whom he hasn’t seen in a long time, gives her Han Solo’s lucky charm and then goes out to fight Kylo Ren. But, surprise, it’s not actually Luke, just his projection. He created this as a diversion, to give time for the rebelion to evacuate. But after the mock fight is over, Luke is watching as the sun sets on his planet and then he vanishes into thin air, becoming one with the force. </p> <p>On the Millenium Falcon, the Rebels celebrate, because they are the spark that will light the fire that will destroy the First Order (as they've kept repeating throughout the whole movie).</p> <p>The large story line of the movie was good. The parts with Rey and Ren were really great and it was really nice to learn more about them. But the rest of the movie had so many stupid ideas, that it just leaves me with sour taste in my mouth. </p> <p>First, there is the scientific idiocies. While yes, this is a sci-fi movie with a magical force, it mostly still follows some scientific rules and when they get broken, you can’t do anything except facepalm. For example, the bombers which attack the dreadnaught in the opening sequence release their bombs and they fall towards the dreadnaught. In space. Bombs. Falling. In the absence of gravity. Also, the way they pretended to explain the tracking through hyperspace (mind you, by a former soldier and by a mechanic) made 0 sense. And you would think that if they have robots that can move around on their own, they would also have autopilots that can keep ships on their straight ahead course, so that nobody has to be left behind during evacuation. And lastly, how come nobody ever thought until now to attack by jumping into FTL? It seems like with that you could have easily destroyed even the Death Star. Is Admiral Holdo such an amazing genius? I don’t think so. </p> <p><img alt="Those annoying puffins!!!!" src="" width="100%" style="max-width:600px"/></p> <p>Then there are the jokes. Oh, the stupid jokes. When Rey gives Luke his old lightsaber, he looks at it and then throws it behind his back, off a cliff. Mark Hamill does a really good impression of grumpy old men while playing Luke. Luke at some point milks a weird alien seal-like creature. And Rey somehow always manages to interfere with the caretakers of the Jedi temple, in a slapstick comedy way. This is just not Star Wars, I’m sorry. </p> <p>Then there is the whole subplot with Finn, Poe and Rose, which might as well be a PETA documentary, because they don’t achieve anything except give a moralizing lesson about the cruelty of animal racing and about income inequality. And the whole thing could have been avoided if Holdo had told Poe what’s the plan, like you know, you would it to one of your best pilots. </p> <p>There are two new Force features introduced: flying in hard vacuum. While by itself it’s not very surprising, the annoying thing is that Leia does this, who has previously never been shown to do anything with the Force (except feel when Han dies). How come she can suddenly master this thing? And the other one is Luke’s holographic projection. Where did that one come from? It’s great that we learn about new abilities, but both of these things were complete Deus Ex Machinas. And let’s not forget how the big, powerful Snoke, who manipulated Rey and Ren over cosmic distances, is fooled by Ren while he is manipulating two lightsabers. </p> <p>It could have been such a good movie… Oh well, let’s hope number 9, which is directed by JJ Abrams again (as The Force Awakens), will be better. Unfortunately, we have two more years to wait :(</p> <p>Grade: 6/10</p> Tue, 19 Dec 2017 20:21:00 GMT,2017-12-19:/2017/12/19/the-last-jedi Show-ing off <p><img alt="2 Cellos concert in Zurich" src="" width="100%" style="max-width:600px"/></p> <p>Last weekend was a very “cultured” one for me. On Friday evening I went to a 2Cellos concert. And boy, did that concert rock. For those who don’t know them, 2Cellos is made by two cello players who take modern songs and adapt them for the cello. They play a large variety of songs, from Michael Jackson’s Smooth Criminal (their debut hit), to movie soundtracks (Gladiator or Inception), to rock songs (such as Thunderstruck) to mellow songs such as U2’s With or without you (aka the trailer song from Downton Abbey season 2).</p> <iframe width="560" height="315" src="" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen class="youtube"></iframe> <p>To some extent, they remind me of the Piano Guys, to whose concert I went in June. Both bands do classical takes of modern pop songs and modern takes on classical songs. I think that musically, 2 Cellos plays better and they use (and abuse) the cellos much better than the Piano Guys do. Also, their drummer is amazing. That kid goes to town on the drums. But their interaction with the audience is inferior to that of the Piano Guys. Stjepan made the same stupid joke all evening, while Luka talked only a little.</p> <p>All in all, it was a fairly fun concert. But my culture-ing continued the next day, when I went to a circus. For some reason, I kinda missed out on this experience as a kid, so I decided it’s nigh time to fix this crucial missing element of my childhood.</p> <figure> <p><img alt="Guy standing on ladder at circus" src="" width="100%" style="max-width:600px"/> <figcaption>Don't just stand there!</figcaption></p> </figure> <p>So, there were mostly kids there. But I still had fun, so whatever. And I was actually blown away right from the beginning. A guy comes in with a ladder and a toolbox. After fumbling and stumbling, he takes the ladder, props it up into thin air and climbs on it. And flips around on it. And lets it fall down so that he lands perfectly between two rungs. And jumps through rungs while flicking it around.</p> <figure> <p><img alt="Juggling, while standing on person balancing on ball" src="" width="100%" style="max-width:600px"/> <figcaption>Juggling, while standing on a person, who is balancing on a board, which is moving on a cylinder, which is on a table. Also known as having a deathwish for most of us. </figcaption></p> </figure> <p>While I expected different acrobatic acts, and Circus Monti delivered on those, I did not expect a fairly coherent story, delivered in a completely language agnostic way and which still made a social commentary about greed, power and love.</p> <p>One of the most impressive moments was when one of the gymnasts was doing tricks in the air hanging from a circle, and at some point she was hanging just by her neck. No comment.</p> <figure> <p><img alt="Spinning around in a drum" src="" width="100%" style="max-width:600px"/> <figcaption>Spinning human tops :))) </figcaption></p> </figure> <p>The other very impressive thing for me was the way they could choreograph even “failures” really well: the amount of times some of the acrobats fell, stumbled, hit each other or broke something was impressive, yet they continued without blinking, so it must have been planned. And they didn’t show any signs of pain, even though there were fairly loud thumps accompanying the falls.</p> <p>So, I shall definitely go to see other circuses too! But in two weeks, I shall go to some museums.</p> Sun, 03 Dec 2017 14:09:00 GMT,2017-12-03:/2017/12/03/show-ing-off Blade Runner 2049 <p><img alt="Blade Runner 2049 poster" src="" width="100%" style="max-width:600px"/></p> <p>The original Blade Runner, which came out in 1982, is an iconic movie. It poses difficult questions, has great monologues about the human condition, and had just enough open questions left to have fans debating pretty much until now. Somehow, Hollywood decided to make a sequel to it 35 years later, but unfortunately it has been a box office flop so far :( Bad audiences, bad! That's why we can't have good movies, only endless Transformers movies :(</p> <p><em>I will continue with spoilers</em></p> <p>The original movie introduces the concept of Replicants, which are pretty much artificial human beings, genetically enhanced to be much stronger and more resistant than normal people. They are indistinguishable from humans, except for the Voigt-Kampff test, which measures emotional reactions to different scenarios. Because they don’t have memories from growing up, the replicants tend to be more insensitive and rational than humans. This changes when Tyrell Corporation, which makes them, realizes that if they implant fake memories, they can make the replicants be more stable, so even more useful. In exchange, they limit their lifespans to around 8 years.</p> <p>Replicants who rebel and want to escape are hunted down by so called “Blade Runners”. Deckard is such a blade runner and he is tasked to catch several military models. The ending of Blade Runner poses the question that maybe Deckard, who was always presented as human, might be a replicant, because another person knows his dreams (so they are probably implanted).</p> <p>Blade Runner 2049 happens 30 years later. There are newer replicant models, which are supposed to be perfectly obedient, unlike previous models which sometimes rebelled. Officer K, is one of these newer replicants, and he is tasked with hunting down the remaining old models.</p> <p>The big twist in Blade Runner 2049 is that it asks the question whether Officer K might actually be a human. He finds out that 30 years ago, a replicant woman had a baby. Normally that’s impossible, because they are not fertile, but somehow it happened and K is led to believe that he might be that child.</p> <p>Initially K obeys his commanding officer. At some point when he voices disagreement with orders from her, when asked if he will disobey, he responds “I wasn’t aware that was an option”. But later on in the movie, he starts pushing the boundaries of this. First, when asked to tell a “fake” memory from childhood, he omits a little detail from it. Later on, he says he dealt with a problem (he had to find the replicant child and kill it), when in reality he just came to the realization that he might be the mythical human replicant. Did he lie? Did he disobey? The movie never answers this question. His boss is satisfied with K’s answer and leaves it at that.</p> <p>This then leads to an even bigger problem, when we find out that the baby was actually a girl, so there’s no way K was that baby. If he’s definitely part of these obedient replicants, how can he still rise up against his programming?</p> <p>Another dilemma that comes up in the movie is with Artificial Intelligence and holograms. In the Blade Runner world, by 2049, you can buy off-the-shelf holograms that can perfectly simulate a human being, except you can’t touch them. But they can talk, they can empathize, they can cheer you up, they can do many other things. These holograms are normally connected to the cloud and are available only in your apartment, where you have some fancy projectors. But there are special “emitters”, which can enable you to carry them around.</p> <p>K has such a hologram, called Joi and she often accompanies him on his missions, via the emitter he bought for her. She is very affectionate for him, to the point of giving him a human name, Joe, and encouraging him to dream big. But at some point, when she realizes her cloud connection might put K in danger, because it means others can see what she knows, she asks him to destroy the cloud backups and let her live just on the emitter, even if that means she could easily be destroyed. Eventually, she is destroyed, but she does manage to tell K that she loves him, just before she vanishes. The question is how much of this was real and how much of it was just her programming, that drove her to tell K what he wanted to hear. He bought her to keep him company, because he felt lonely, so that’s what she gave him. The tagline for the line of holograms is "Everything you want to see. Everything you want to hear.” Given that she changed K, she gave him a reason to press on, does it matter if her feelings were real or not, considering that in the end she influenced him?</p> <p>Both of these issues that I mentioned are something that humans struggle with. Are we just cellular automatons, acting on our neural impulses, with no control over it? Or do we have free will and can we make meaningful choices in our lives? Often times we do things that we don’t want to do. And we don’t do things that we want to do. Even the apostle Paul wrote about this experience in <a href=";version=ESV">Romans 7</a>. Christianity offers a unique solution to that: Jesus Christ and his death on the cross. The movie doesn’t have an answer, only questions.</p> <p>Besides the philosophical aspects, I enjoyed the visuals of the movie as well. The movie is fairly dark, both content wise and screen brightness wise, but they play really well with shadows. So many scenes contain complex shadow dances across the screen. The soundtrack of the movie is also really good. It manages to stay close to the original. The actors do a great job. I mean, Harrison Ford (d’ooh) and Ryan Gosling.</p> <p>Overall grade: 10. The only problem is that it’s long. But it’s a good movie, so more is better :D</p> Thu, 09 Nov 2017 21:48:00 GMT,2017-11-10:/2017/11/10/blade-runner-2049 Blogs I follow - part 1 <p>I'm still one of those rare weirdos who use RSS feeds (with Feedly) and over the years I have started following many people and reading many blogs. Unfortunately, many of them have stopped posting, but there are still some people who regularly post really interesting stuff. I am impressed by how some of them can sustain posting daily, even if only a short snippet, others post 2-3 times a week some interesting observations in a wide range of fields, and others keep posting coding optimizations even though they are tenured professors, but they are not afraid to get their hands dirty.</p> <p>I hope I will soon be able to post more often and to post stuff that is more interesting and have a wider audience again. In the mean time, I'll start sharing with you some of the blogs I'm following, with a short description:</p> <dl> <dt><a href="">John D. Cook</a></dt> <dd>This guy is a statistician by training, who does consulting work and he posts on all kinds of stuff, from numerical computation to solving real business needs. One of my favorite posts from him is <a href="">Random is as random does</a>, which I find is a useful reminder whenever you read an article about something that is modeled probabilistically, that just because that model fits, it doesn't mean that the model is the underlying reality. I stumbled upon John on <a href="">StumbleUpon</a> (wow, I feel old now).</dd> <dt><a href="">FastML</a></dt> <dd>This a machine learning blog ran by several people under one pseudonym. They have a funny writing style, like to criticize many novelty papers, but most importantly, they give lots of useful code that can be directly used, such as tricks on how to encode capital/lower letters <a href="">for RNNs</a>. Really cool stuff.</dd> <dt><a href="">Classic Programmer Paintings</a></dt> <dd>Not really a blog (well, it's a Tumblr blog), but I include it for the mandatory laughs. Classical paintings have never been so much fun. <a href="">Some</a> <a href="">favorites</a> <a href="">here</a>.</dd> </dl> Sat, 28 Oct 2017 20:38:00 GMT,2017-10-28:/2017/10/28/blogs-i-follow-part-1 Around Europe with my wifey <figure> <p><img alt="Singing lion" src="" width="100%" style="max-width:600px"/> <figcaption>This reminds me of the <a href="">singing lion</a></figcaption></p> </figure> <p>My wife has never been outside of Romania before this year, so I thought I would use this summer to fix that by traveling around as much as possible. </p> <figure> <iframe width="560" height="315" src="" frameborder="0" allowfullscreen class="youtube"></iframe> <figcaption>Dancing interactive fountain</figcaption> </figure> <p>Right after our wedding, we went for a short, one week, roadtrip honeymoon around three capitals: Budapest, Vienna and Bratislava. Bam, three countries right there.</p> <figure> <p><img alt="Olympic rings in hungarian colors" src="" width="100%" style="max-width:600px"/> <figcaption>Olympic rings in Budapest</figcaption></p> </figure> <p>We stayed only one night in Budapest and we left Romania late, because I had to update my Romanian bank account (which I hadn't used in the last three years) and because my wife had to apply for a new ID card.</p> <div class="gallery clearfix" style="max-width:600px"> <img title="The dog metro " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Birdhouse " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/budapest/fun/P1160645.JPG", "title": "The dog metro\n", "msrc": "/static/images/2017/10/eurotrip/budapest/fun/thumbs/P1160645.JPG", "w": 2856, "h": 4272}, {"src": "/static/images/2017/10/eurotrip/budapest/fun/P1160656.JPG", "title": "Birdhouse\n", "msrc": "/static/images/2017/10/eurotrip/budapest/fun/thumbs/P1160656.JPG", "w": 2856, "h": 4272}]</script> </div> <p>There were two memorials, showing very opposite things, fairly close to each other. I was surprised to see one of them vilifying nazism, but the other one glorifying communism.</p> <div class="gallery clearfix" style="max-width:600px"> <img title="A memorial for victims of the german occupation. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="A memorial for glorifying soviet heroes. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/budapest/memorials/P1160651.JPG", "title": "A memorial for victims of the german occupation.\n", "msrc": "/static/images/2017/10/eurotrip/budapest/memorials/thumbs/P1160651.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/budapest/memorials/P1160647.JPG", "title": "A memorial for glorifying soviet heroes.\n", "msrc": "/static/images/2017/10/eurotrip/budapest/memorials/thumbs/P1160647.JPG", "w": 2856, "h": 4272}]</script> </div> <p>Next stop: Vienna. Here we spent a bit more time so we could actually enjoy the city. We went up the Danube tower, only to have super strong winds greet us there. </p> <div class="gallery clearfix" style="max-width:600px"> <img title="The Danube tower from a distance. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Cool statue. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="The Danube tower from inside. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/vienna/tower/P1160673.JPG", "title": "The Danube tower from a distance.\n", "msrc": "/static/images/2017/10/eurotrip/vienna/tower/thumbs/P1160673.JPG", "w": 2856, "h": 4272}, {"src": "/static/images/2017/10/eurotrip/vienna/tower/P1160667.JPG", "title": "Cool statue.\n", "msrc": "/static/images/2017/10/eurotrip/vienna/tower/thumbs/P1160667.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/vienna/tower/P1160674.JPG", "title": "The Danube tower from inside.\n", "msrc": "/static/images/2017/10/eurotrip/vienna/tower/thumbs/P1160674.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/vienna/tower/P1160676.JPG", "title": "And the Danube tower from the top.\n", "msrc": "/static/images/2017/10/eurotrip/vienna/tower/thumbs/P1160676.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/vienna/tower/P1160682.JPG", "title": "Alas, it was closed when we were there :(\n", "msrc": "/static/images/2017/10/eurotrip/vienna/tower/thumbs/P1160682.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/vienna/tower/P1160685.JPG", "title": "What is this? A bench? A memorial? An art object? All of the above?\n", "msrc": "/static/images/2017/10/eurotrip/vienna/tower/thumbs/P1160685.JPG", "w": 2856, "h": 4272}]</script> </div> <p>We went to an old musical instruments concert in the oldest church in Vienna. I had never even heard of the harpsichord before. Apparently it's the precursor to the piano. The guy was speaking in German. It was nice to be able to put my German knowledge to use and actually understand what was being said around me.</p> <p><img alt="Harpsichord" src="" width="100%" style="max-width:600px"/></p> <p>And we went to the Schönbrunn palace and learned about the fairly sad life of the monarchs from there. The highly idolized Princess Sisi was actually fairly unhappy in her marriage and did her best to avoid her husband. The Monarch woke up at 5AM to do his imperial duties. I admire his dedication, but they said he wasn't good at it, so it didn't help too much. We also tried the famous Apfelstrudel mit Vanillesauce, but to be honest, I've had better at any random bakery. The gardens were beautiful though.</p> <div class="gallery clearfix" style="max-width:600px"> <img title="Horse carriage in front of Schonbrunn " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Front view of the palace " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Garden tunnels " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/vienna/schonbrun/P1160699.JPG", "title": "Horse carriage in front of Schonbrunn\n", "msrc": "/static/images/2017/10/eurotrip/vienna/schonbrun/thumbs/P1160699.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/vienna/schonbrun/P1160700.JPG", "title": "Front view of the palace\n", "msrc": "/static/images/2017/10/eurotrip/vienna/schonbrun/thumbs/P1160700.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/vienna/schonbrun/P1160701.JPG", "title": "Garden tunnels\n", "msrc": "/static/images/2017/10/eurotrip/vienna/schonbrun/thumbs/P1160701.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/vienna/schonbrun/P1160704.JPG", "title": "The gardens of Schonbrunn\n", "msrc": "/static/images/2017/10/eurotrip/vienna/schonbrun/thumbs/P1160704.JPG", "w": 4272, "h": 2856}]</script> </div> <p>On our last day there, the only one that was sunny, we went to the Prater, an amusement park. There we, you know, amused ourselves by doing fun rides such as Dizzy Mouse (they weren't kidding about the dizzy part), Water Ride and only me, Volare, where you lay flat on your belly and go flying like crazy. The last one was hang-on-to-your-pants-and-hope-you-have-nothing-in-them. </p> <div class="gallery clearfix" style="max-width:600px"> <img title="Us on the water ride! " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="The dizzy mouse. Imagine going at 50-60km/h in those turns! " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="The insane &lt;a href=" http: en attractions details a volare-the-flying-coaster "&gt;volare&lt; a&gt;. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/vienna/prater/IMG_20170728_114859.jpg", "title": "Us on the water ride!\n", "msrc": "/static/images/2017/10/eurotrip/vienna/prater/thumbs/IMG_20170728_114859.jpg", "w": 2448, "h": 3264}, {"src": "/static/images/2017/10/eurotrip/vienna/prater/P1160718.JPG", "title": "The dizzy mouse. Imagine going at 50-60km/h in those turns!\n", "msrc": "/static/images/2017/10/eurotrip/vienna/prater/thumbs/P1160718.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/vienna/prater/P1160720.JPG", "title": "The insane <a href=\"\">Volare</a>.\n", "msrc": "/static/images/2017/10/eurotrip/vienna/prater/thumbs/P1160720.JPG", "w": 4272, "h": 2856}]</script> </div> <p>Our last stop on our honeymoon was in Bratislava. We stayed in a really fancy hotel, so we spent quite a lot of time inside, for example at the spa :D</p> <p><img alt="Dinosaur grabbing my wife" src="" width="100%" style="max-width:600px"/></p> <p>But we also went to visit the Bratislava zoo, with it's fake dinosaurs. And we had langos, because that's what I craved at 10 PM in Bratislava. Langos. :D</p> <p><img alt="Cat cafe" src="" width="100%" style="max-width:600px"/></p> <p>The old city was surprisingly active and full of life even late at night and it showed no signs of slowing down. </p> <p>After two or three weeks, the Zurich Street Parade was going on, which is a massive techno parade with about 1 million drunk people invading, so we decided to do a weekend break to London, where Roda's brother lives. </p> <p><img alt="Us drinking bubble tea" src="" width="100%" style="max-width:600px"/></p> <p>First stop, Indian food. Second stop, bubble tea. My wife likes the first one, but unfortunately not the second one :(</p> <p><img alt="Karting with my wife" src="" width="100%" style="max-width:600px"/></p> <p>On the second day, we went karting. Given how much she loved racing on the highway before, I thought she might enjoy being able to put pedal to metal in a controlled environment. She mostly did :D</p> <p><img alt="The view from the Shard" src="" width="100%" style="max-width:600px"/></p> <p>We also visited the Shard, London's highest building. Besides the view, which is pretty much the same as from every other highriser in every other major city of the world, there are several VR experiments you can try out, such as flying or walking across a plank.</p> <div class="gallery clearfix" style="max-width:600px"> <img title="The prime Meridian " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Yury Gagarin " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Ship in a bottle. A really big ship. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/london/greenwhich/IMG_20170813_141546.jpg", "title": "The prime Meridian\n", "msrc": "/static/images/2017/10/eurotrip/london/greenwhich/thumbs/IMG_20170813_141546.jpg", "w": 3036, "h": 4048}, {"src": "/static/images/2017/10/eurotrip/london/greenwhich/IMG_20170813_162836.jpg", "title": "Yury Gagarin\n", "msrc": "/static/images/2017/10/eurotrip/london/greenwhich/thumbs/IMG_20170813_162836.jpg", "w": 3036, "h": 4048}, {"src": "/static/images/2017/10/eurotrip/london/greenwhich/IMG_20170813_170431.jpg", "title": "Ship in a bottle. A really big ship.\n", "msrc": "/static/images/2017/10/eurotrip/london/greenwhich/thumbs/IMG_20170813_170431.jpg", "w": 4048, "h": 3036}]</script> </div> <p>On Sunday, we ended up having a lazy day in Greenwich park. We went to the Prime Meridian, learned about how to calculate latitude and longitude and just spent time chillin' on the grass. </p> <div class="gallery clearfix" style="max-width:600px"> <img title="Old cathedral " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="London at dusk " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/london/misc/IMG_20170812_204512.jpg", "title": "Old cathedral\n", "msrc": "/static/images/2017/10/eurotrip/london/misc/thumbs/IMG_20170812_204512.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/10/eurotrip/london/misc/IMG_20170812_210930.jpg", "title": "London at dusk\n", "msrc": "/static/images/2017/10/eurotrip/london/misc/thumbs/IMG_20170812_210930.jpg", "w": 4048, "h": 3036}]</script> </div> <p>We flew from London City airport, which is a very interesting airport, because it announces gates only half an hour before departure, so there's really no point in getting there early. I wish more airports did that. </p> <p><img alt="Bergen Airport" src="" width="100%" style="max-width:600px"/></p> <p>The last pitstop for the summer was Norway, which I found to be among the most beautiful places I've ever been to. Until it started raining cats and dogs. Then it lost some of its appeal. </p> <div class="gallery clearfix" style="max-width:600px"> <img title="Abstract horse. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Abstract ribs? " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/bergen/statues/IMG_20170826_212457.jpg", "title": "Abstract horse.\n", "msrc": "/static/images/2017/10/eurotrip/bergen/statues/thumbs/IMG_20170826_212457.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/10/eurotrip/bergen/statues/IMG_20170826_213050-EFFECTS.jpg", "title": "Abstract ribs?\n", "msrc": "/static/images/2017/10/eurotrip/bergen/statues/thumbs/IMG_20170826_213050-EFFECTS.jpg", "w": 4048, "h": 3036}]</script> </div> <p>Bergen has rain 260 days a year, so when we arrived there, the receptionist told us that we are lucky because that weekend would be really nice and sunny. And it was!</p> <div class="gallery clearfix" style="max-width:600px"> <img title="Quiet mountain stream. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Norwegian pure breed. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Rosendal. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/bergen/rosendal/P1160806.JPG", "title": "Quiet mountain stream.\n", "msrc": "/static/images/2017/10/eurotrip/bergen/rosendal/thumbs/P1160806.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/rosendal/P1160813.JPG", "title": "Norwegian pure breed.\n", "msrc": "/static/images/2017/10/eurotrip/bergen/rosendal/thumbs/P1160813.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/rosendal/P1160814.JPG", "title": "Rosendal.\n", "msrc": "/static/images/2017/10/eurotrip/bergen/rosendal/thumbs/P1160814.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/rosendal/P1160818.JPG", "title": "Church from 12th century.\n", "msrc": "/static/images/2017/10/eurotrip/bergen/rosendal/thumbs/P1160818.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/rosendal/IMG_20170827_162138.jpg", "title": "Workers unite.\n", "msrc": "/static/images/2017/10/eurotrip/bergen/rosendal/thumbs/IMG_20170827_162138.jpg", "w": 4048, "h": 3036}]</script> </div> <p>On Sunday we went on the cruise on the Hardangersfjord (with such a fierce name, you almost expect viking raid ships to show up at any moment) to Rosendhal, where we had an amazing salmon lunch. Seriously, they had two kinds of salmon, cooked and smoked, and both of them were mind-blowingly good. I'm so glad my wife doesn't eat much and I can always <del>steal</del> finish some of the good stuff from her plate!</p> <div class="gallery clearfix" style="max-width:600px"> <img title="" src="" style="display:block" width="100%" style="max-width:600px"/> <img title="" src="" style="display:block" width="100%" style="max-width:600px"/> <img title="" src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/bergen/cruise/P1160744.JPG", "title": "", "msrc": "/static/images/2017/10/eurotrip/bergen/cruise/thumbs/P1160744.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/cruise/P1160751.JPG", "title": "", "msrc": "/static/images/2017/10/eurotrip/bergen/cruise/thumbs/P1160751.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/cruise/P1160769.JPG", "title": "", "msrc": "/static/images/2017/10/eurotrip/bergen/cruise/thumbs/P1160769.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/cruise/P1160772.JPG", "title": "", "msrc": "/static/images/2017/10/eurotrip/bergen/cruise/thumbs/P1160772.JPG", "w": 4272, "h": 2856}]</script> </div> <p>The landscape from the fjord cruise was amazing. It was a sunny day, not a cloud in sight. Really amazing. </p> <div class="gallery clearfix" style="max-width:600px"> <img title="Ugly fish. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Deadly fish. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Deadlier fish (piranhas). " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/10/eurotrip/bergen/aquarium/IMG_20170828_152802.jpg", "title": "Ugly fish.\n", "msrc": "/static/images/2017/10/eurotrip/bergen/aquarium/thumbs/IMG_20170828_152802.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/10/eurotrip/bergen/aquarium/IMG_20170828_155714.jpg", "title": "Deadly fish. \n", "msrc": "/static/images/2017/10/eurotrip/bergen/aquarium/thumbs/IMG_20170828_155714.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/10/eurotrip/bergen/aquarium/IMG_20170828_155204.jpg", "title": "Deadlier fish (piranhas).\n", "msrc": "/static/images/2017/10/eurotrip/bergen/aquarium/thumbs/IMG_20170828_155204.jpg", "w": 4048, "h": 3036}, {"src": "/static/images/2017/10/eurotrip/bergen/aquarium/P1160826.JPG", "title": "Gentoo penguins.\n", "msrc": "/static/images/2017/10/eurotrip/bergen/aquarium/thumbs/P1160826.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/aquarium/P1160837.JPG", "title": "Everyday I'm shufflin', shufflin'.\n", "msrc": "/static/images/2017/10/eurotrip/bergen/aquarium/thumbs/P1160837.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/aquarium/P1160850.JPG", "title": "Playing volleyball\n", "msrc": "/static/images/2017/10/eurotrip/bergen/aquarium/thumbs/P1160850.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/10/eurotrip/bergen/aquarium/P1160858.JPG", "title": "Backflippin'\n", "msrc": "/static/images/2017/10/eurotrip/bergen/aquarium/thumbs/P1160858.JPG", "w": 4272, "h": 2856}]</script> </div> <p>The next day... a storm is coming. We just walked around a bit in Bergen and we went to the aquarium there, but it still was enough to get us soaking wet.</p> <figure> <p><img alt="View of Bergen from above" src="" width="100%" style="max-width:600px"/> <figcaption>View of Bergen from above</figcaption></p> </figure> <p>On the last day, it was still cloudy, but the rain kept delaying. So we walked up the Floyen. That's one of the steepest furniculars in the world. And we were wondering how on earth do people live on those super steep streets. </p> <figure> <p><img alt="Quiet pond" src="" width="100%" style="max-width:600px"/> <figcaption>Quiet, undisturbed, reflective</figcaption></p> </figure> <p>The view from the Floyen is nice, but it's sooo crowded. But we managed to find a small pond, a bit off the hiking trails, where nobody else was. And there was only silence. Complete silence. We sat there for 10 minutes, just enjoying the beautiful nature that God created.</p> <p>And that, folks, was our summer Eurotour! I can't wait for part 2. Too bad my wife has to study a lot :|</p> Fri, 06 Oct 2017 22:09:00 GMT,2017-10-07:/2017/10/07/around-europe-with-my-wifey Drei Jahre in der Schweiz <p><img alt="Collage of my third year in Switzerland" src="" width="100%" style="max-width:600px"/></p> <p>Three years ago today I started my job at Google. I had moved to Switzerland two days before, with two suitcases and a backpack. Then followed a lot of adventure.</p> <p>The third year was different. I started learning Swiss German, so that I can better integrate and it payed off: I am no longer completely clueless as to what Swiss people speak around, I am only mostly clueless. </p> <p>I also got married to the most beautiful, loving and kind girl in the world, Roda, who happens to be an amazing cook as well!</p> <p>I also just did my 100th flight two days ago. I have flown more than 150000 kilometres in the last three years, visiting 16 countries. </p> <p>I've made deeper friendships, both here in Switzerland and abroad. I enjoyed exploring Israel with some of them, I've learned how to play the piano from others, while others have been the encouraging voice to strengthen me in my walk with the Lord. </p> <p>Looking back, I think it was a year where I was tested to see if I did learn anything the previous year. Some situations resembled what happened a year before that, sometimes eerily so. Sometimes, I failed. Other times, I believe I came out better or faster, through the grace of God. </p> <p>I step into the next year, now walking with a companion for life by my side, but still aiming to run the race, to fight the good fight and to love and serve my Lord with all my heart, all my soul, all my mind and all my strength.</p> Fri, 01 Sep 2017 18:54:00 GMT,2017-09-01:/2017/09/01/drei-jahre-in-der-schweiz How to organize a wedding - in 20 easy steps <p><img alt="Roda and Roland wedding" src="" width="100%" style="max-width:600px"/></p> <p>So you decided to get married. You need a wedding for that. It's a lot of work. Given that I just got married two weeks ago, I'll try to jot down some step-by-step instructions (with particulars about Romanian bureaucracy).</p> <ol> <li>Find a partner who is willing to say "Yes". Trivial exercise, left as homework for the reader.</li> <li>Decide on the style of wedding. Do you want a fancy, shiny, super modern wedding in the middle of the city? Do you want something in nature, far from civilization? Do you want a smaller, cozier wedding? Do you want to invite the all your extended family and all your friends? What are the budget constraints? I recommend using a spreadsheet to track the todos, with links to other documents which contain details about choices and decisions. And you can color code that spreadsheet with due dates. Like a project manager :D </li> <li>With those decisions in mind, start looking for a venue. Most often, that takes a long time, so you have to do this up to a year in advance. We managed to find a venue only 4 months ahead, because we went somewhere in the mountains. </li> <li>Find a photographer. Start stalking photographers' websites and Facebook pages to find out what their style is like. Narrow it down to a short list of 5, talk to them, find out their availabilities and price range and proceed. I recommend talking in person to the photographer, because you'll spend most of the time on your wedding day with them, so you better click and get along well.</li> <li>Get catering. We had it from the venue where we had the wedding, so they organized everything. That is by far the easiest, because it's one less vendor to deal with. But sometimes you have to order it from a 3rd party. </li> <li>(Optional) Get a music band. We didn't have one. </li> <li>Start making guest lists. Depending on where you are from, you should give the invites in advance, or it might not matter, because you'll still have lots of people making last minute RSVP changes. I recommend using a spreadsheet for tracking this. You can mark there whether the invitation was given, whether an answer was received, how many adults and kids, keep counts to see how it's going, drill down based on various attributes and even make the seat planning.</li> <li>Design invites, get them printed out and sent them to invitees. Warning, sometimes emails to vendors get lost and they don't answer for more than week. Maybe they are busy, maybe they are shoddy, maybe you should look for another one.</li> <li>Bride: Get wedding dress. Bonus: make it a surprise for him.</li> <li>Get wedding rings. Decisions, decisions, decisions. What metal? What style? With stones? </li> <li>Order flowers. I know this happened, but I mostly stayed out of it. It also involved searching various vendors and looking at lots of stuff on Pinterest.</li> <li>Groom: get a suit. It's your wedding, so do try to get a made-to-measure one. Just don't get a linen one. Your parents will complain that it's too wrinkly and make you get another one. </li> <li>Make guest seating plan. Leave some slack in it for last minute changes, because in Romania, you will have people changing their mind on the last day! Or the last minute!</li> <li>Register at the townhall for the civil ceremony. Warning: in Romania this has to be done at least 10 days before the wedding. And at most 14 days before the wedding, because you need to get a medical certificate that is valid for only 14 days. And you need a blood test for that medical certificate. So be prepared for several trips to do this. </li> <li>Try your best not to be late for your own civil ceremony. </li> <li>Say yes.</li> <li>Party hard.</li> <li>Smile so much for pictures your face muscles start to hurt. </li> <li>Wait for all the guests to leave.</li> <li>Go to the hotel you booked for the wedding night - and find out there is a night wedding going on at that venue. Enjoy the super loud music until 6 AM. </li> </ol> <p>Congratulations, you got married!</p> Sat, 05 Aug 2017 14:15:00 GMT,2017-08-05:/2017/08/05/how-to-organize-a-wedding-in-20-easy-steps Evaluating goals - 2017 edition <p>Another half a year has passed, so it's time to review my goals from <a href="">January</a>.</p> <p>Around March something came up, so I dropped some goals or reduced their intensity. That something is called setting a <a href="">wedding date for July</a>, so I'll excuse myself for being busy with that. </p> <p>Scoring will continue by the same metric: 1 for goals fully achieved, 0 for complete failures. </p> <dl> <dt>Get to 82 kg by June</dt> <dd>I am currently 83 kg. I was 90 kg in January when I posted this, so this is a 0.875 score. Not bad. We'll see how my suit fits on Saturday :D</dd> <dt>Exercise three times a week</dt> <dd>I exercised 63 times in the first half of the year. Then I pulled a muscle and it had me unable to move. It's still a score of 0.777.</dd> <dt>Read 24 books in 2017/read 30 minutes every day</dt> <dd>So... I read 10 books in half a year, when I should be at 12 already. Almost there, so it's 0.833. But the 30 minutes reading per day... that's a big no.</dd> <dt>Write 3 blog posts per month</dt> <dd>I wrote 13 posts so far (without this one), while I should be at 18. Score: 0.722</dd> <dt>Write into my journal twice a week</dt> <dd>I managed to keep this habit almost perfectly until last week. Score: 0.95</dd> <dt>Spend 1 hour per week studying German on my own</dt> <dd>This goal got dropped first: I stopped doing it around April. I clocked in 8.3 hours of German until then. Score: 0.307</dd> <dt>Do 4 20 minute Pomodoros every day</dt> <dd>I did around 550 Pomodoros this year, which comes down to 3.79 per working day. Score: 0.94. I actually felt more productive.</dd> <dt>Read 3 chapters from the Bible every day</dt> <dd>I did this pretty good until last week. Score: 0.95</dd> <dt>Memorize 1 Bible verse every week:</dt> <dd>Well... third time's the charm. It'll work next time, I'm sure! Score: 0</dd> </dl> <p>Average score: 0.706. So I managed to improve just a tiny bit on my score from last year \:D/ But it's interesting that now I don't have any perfect score, but I have fewer failures too. Maybe I'm learning how to set proper goals for myself? </p> <p>But, like last year, I'll take a break now and I'll focus on making my soon-to-be <a href="">wife happy</a>!</p> Mon, 17 Jul 2017 20:55:00 GMT,2017-07-17:/2017/07/17/evaluating-goals-2017-edition I believe I can fly! <iframe width="560" height="315" src="" frameborder="0" allowfullscreen class="youtube"></iframe> <p>About a month ago I started believing I can fly, so I proved it by going for a gliding session. A glider is a lightweight plane, which doesn't have an engine, so it's pulled by another plane until it takes off. After that, you glide through the air, like an eagle, looking for thermals which lift you up. Unfortunately, it was a too nice day, with no clouds, so we didn't find any good thermals, so my flight was quite short. But it was still nice to see Uetliberg from above :D And I piloted the plane for about 5 minutes :D</p> <iframe width="560" height="315" src="" frameborder="0" allowfullscreen class="youtube"></iframe> <p>Two weeks ago I had the pleasure to go do a paragliding basic lesson \:D/ Where you get to fly around for a little while. It was super tiring. All the morning we were just running around, to learn how to raise the paraglider up correctly and only in the afternoon did we actually get to fly. But it was soooo awesome!!!!</p> <p>Of course, I won't rob you of the outtakes (I'm fine mom, I survived): </p> <iframe width="560" height="315" src="" frameborder="0" allowfullscreen class="youtube"></iframe> Thu, 29 Jun 2017 20:25:00 GMT,2017-06-29:/2017/06/29/i-believe-i-can-fly The Piano Guys <figure> <p><img alt="Playing I want you Bach" src="" width="100%" style="max-width:600px"/> <figcaption>Playing <a href="">I want you Bach</a></figcaption></p> </figure> <p>Last Friday The Piano Guys were in Zürich. I found out about it from an ad on Facebook. It's probably the second time in my life where an advertisement there is actually useful and relevant for me.</p> <p>They started by playing <a href="">Batman Evolution</a>, which goes through most of the Batman movies soundtracks and weaves them together.</p> <figure> <p><img alt="Jon playing with his head under the piano" src="" width="100%" style="max-width:600px"/> <figcaption>Jon fooling around, by playing with his head under the piano</figcaption></p> </figure> <p>They explained how they like to combine their love for old classical music with modern songs that are well known by young people. For example, they take every kid's favourite song: <a href="">Let It Go!</a> and combine it with Vivaldi's Winter.</p> <figure> <p><img alt="Jon playing with his feet" src="" width="100%" style="max-width:600px"/> <figcaption>More of Jon fooling around, by playing with his feet</figcaption></p> </figure> <p>The duo likes to make fun of each other. Jon constantly makes fun of Steven, the cellist, for being part of a band called "The PIANO Guys", while Steven likes to show off his sweet cello skills and how he can do cooler tricks then Jon.</p> <p><img alt="Steven playing the chello" src="" width="100%" style="max-width:600px"/></p> <p>Steven has 26 cellos in his collection, which of course all sound very different to him. He brought only three on this tour: the Italian one, called Marcello (pronounced with an Italian accent), the French one, made out of carbon fiber, called.... Carbon Fibre, and the Chinese one, called Bruce Lee.</p> <figure> <p><img alt="Steven being bored" src="" width="100%" style="max-width:600px"/> <figcaption>Steven is really bored by <a href="">Pachelbel's Canon in D</a>, so he's showing off</figcaption></p> </figure> <p>Steven learned some German in school, so he was constantly weaving some German words into his address to the audience. Jon probably learned a few basic sentences on the way over, just not to be inferior to Steven in any way.</p> <figure> <p><img alt="Jon dancing" src="" width="100%" style="max-width:600px"/> <figcaption>When Steven starts improvising on the Canon in D, Jon starts dancing on the stage, much to Steven's embarrassment</figcaption></p> </figure> <p>They told how the whole thing started, when a piano shop owner wanted to make some fancy ads basically for his pianos, so he asked Jon to play them on the street. Jon knew Steven from before, knew how creative he was with the cello and thought he could help them go viral. Along came Al, a neighbor of Steven, who helped them write songs and edit them. And it did go viral. Unfortunately, the shop had to close. </p> <figure> <p><img alt="Al, their songwriter" src="" width="100%" style="max-width:600px"/> <figcaption>Al, their music producer, sometimes joins them on stage to sing with them</figcaption></p> </figure> <p>When they were singing the <a href="">Fight Song / Amazing Grace</a> combination, they actually brought on stage four bagpipers to accompany them!</p> <p><img alt="Four bagpipers accompanying the Piano Guys" src="" width="100%" style="max-width:600px"/></p> <p>They ended the concert with all four of them (Jon, Steven, Al and Paul, their videographer) abusing the piano at the same time, some of them by hitting it.</p> <p><img alt="The four of them abusing the piano" src="" width="100%" style="max-width:600px"/></p> <p>I enjoyed the concert. It was especially pleasant because two times they gave credit to where it's due: to God. They acknowledged that they are what they are and they can do what they do because of what He has given them. It was a nice moment :)</p> Fri, 16 Jun 2017 20:08:00 GMT,2017-06-16:/2017/06/16/the-piano-guys Istanbul, land of turbans, spice and carpets <p><img alt="Entrance to small market" src="" width="100%" style="max-width:600px"/></p> <p>This is the land of cheap layovers on the way to Romania. Thanks to the invisible hand of the market, tickets to the airports that are close to where my fiancee lives were 50% cheaper when flying through Istanbul, with an overnight layover, than more direct flights. It was still cheaper when buying two nights in a hotel. So through Istanbul it was. I figured it might be my last trip alone, so it should be fun.</p> <figure> <p><img alt="One of the many water fountains in the city" src="" width="100%" style="max-width:600px"/> <figcaption>One of the many water fountains in the city</figcaption></p> </figure> <p>And it was. Istanbul is a very colorful and diverse city. You see all kinds of people getting along. And they have something us in the "west" don't have: time. Everywhere you see people hanging out together. In front of shops, on the street, people stop and talk with each other. They seem to have a lot more personal interactions. But they smoke a lot more :(</p> <p>Security is quite strict, there being lots of armed police and military on the streets. Most touristy sights have security checks at the entrance, but I didn't have any problems getting through them. That might have been because even though it beeps, they let you go through, without stopping you. I was a bit puzzled by what exactly are they trying to achieve.</p> <figure> <p><img alt="Sultan Ahmet's Tomb" src="" width="100%" style="max-width:600px"/> <figcaption>The tomb of Sultan Ahmet</figcaption></p> </figure> <p>But it's also clearly not the well organized, full of signs, easy to get around "West". First hint of this was getting from the airport to the hotel. On my way to Romania, I was staying at the airport hotel. I figured, it's the airport hotel, so it's in the airport building, there being plenty of signs to lead you to it. Well, I was wrong. There were 0 signs for it as I came out of customs. After searching far and wide, I found a sign saying "TAV airport hotel shuttle". Aha, that must be it. I go in the direction pointed by the sign and I see shuttles for three other hotels, but none for my hotel. I walk some more, eventually ask another shuttle driver, who asks someone else, who happens to walk in that general direction and points me there. It was a 10 minute walk, because you couldn't get there through the airport building, even though it was part of the same complex. At least I got a free upgrade for my room :D</p> <figure> <p><video src="/static/videos/fountain.mp4" autoplay loop> </video> <figcaption>Fountain in Sultan Ahmet archelogical park</figcaption></p> </figure> <p>Then I take a "Taksi" to the old part of the town. Turn signaling seemed to be almost entirely optional. We went through what looked like a round-about, but I'm pretty sure I saw cars going perpendicular to each other, completely disregarding any kind of lanes. After leaving the nice ring road surrounding the city, by the sea, we get into the small streets in the old part of the town. It didn't seem to matter to the driver that there was a long line of cars ahead of us, every time we stopped, he honked. Also, if someone else honked, he honked as well. The driver had two phones: a smartphone with the Uber-like app I booked him with, and an old dumb phone which seemed to be constantly in a call, even though he wasn't using it most of the time. Eventually traffic ground to a halt, so I got out and walked the rest of the way to the Yerebatan Cistern. It was a bit scary though to cross the streets like the locals do: almost completely disregarding traffic, depending on how fast the cars went. </p> <figure> <p><img alt="Taksim Square" src="" width="100%" style="max-width:600px"/> <video src="/static/videos/walk.mp4" autoplay loop> </video> <figcaption>Walk signs are animated :D</figcaption></p> </figure> <p>These cisterns, also called the Cistern Basilica, are a water reservoir with a capacity of 100.000 tons of water. It's a huge underground cavern, carved sometime in the 6th century. It has xx columns, in Doric and Ionic style. There is this soft music playing the background and it has a really nice impression on you as you walk around. The temperature is well below 20 degrees inside. Close to the entrance, for a small fee you can dress up as a Turkish soldier, pasha or princess and get some photos of you like that (no, I didn't do this :P).</p> <div class="gallery clearfix" style="max-width:600px"> <img title="Right outside the Yerebatan Cisterns " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="More information about them " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Really nice atmosphere " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/06/istanbul/cistern/P1160387.JPG", "title": "Right outside the Yerebatan Cisterns\n", "msrc": "/static/images/2017/06/istanbul/cistern/thumbs/P1160387.JPG", "w": 2856, "h": 4272}, {"src": "/static/images/2017/06/istanbul/cistern/P1160388.JPG", "title": "More information about them\n", "msrc": "/static/images/2017/06/istanbul/cistern/thumbs/P1160388.JPG", "w": 2856, "h": 4272}, {"src": "/static/images/2017/06/istanbul/cistern/P1160394.JPG", "title": "Really nice atmosphere\n", "msrc": "/static/images/2017/06/istanbul/cistern/thumbs/P1160394.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/06/istanbul/cistern/P1160398.JPG", "title": "The weeping column\n", "msrc": "/static/images/2017/06/istanbul/cistern/thumbs/P1160398.JPG", "w": 2856, "h": 4272}, {"src": "/static/images/2017/06/istanbul/cistern/P1160406.JPG", "title": "The medusa head\n", "msrc": "/static/images/2017/06/istanbul/cistern/thumbs/P1160406.JPG", "w": 2856, "h": 4272}]</script> </div> <p>On the way there, I passed through a small market place, where lots of people were selling various handmade goods. You could see all kinds of stuff, including people making in front of you wooden decorations, ornate walking canes, the water paintings or carving jewelry. Lots of cool stuff.</p> <p><img alt="Craftsman making jewelry" src="" width="100%" style="max-width:600px"/></p> <p>After a late lunch, I ran into some overly friendly and pushy carpet sellers, who invited me to see their shop... which happened to be in a basement. It was a bit scary, but I wanted anyway to buy a carpet for my fiancee, so it worked out fine-ish. The guy knew how to say "How are you?" in Romanian and that Gica Hagi is the best Romanian footballer. Also, when leaving, they complimented my beard (Take that, mom!). </p> <figure> <p><img alt="Kiosk outside the Topkapi Palace" src="" width="100%" style="max-width:600px"/> <figcaption>Kiosk outside the Topkapi Palace</figcaption></p> </figure> <p>Afterwards I went to see Hagia Sofia (Greek for Holy Wisdom), which was an old Greek Orthodox church, built in 537. It was converted into a mosque in 1453 and now it's a museum. The really interesting part about it is that it still has some of the old paintings of Christian saints, right along side the Islamic imagery. The church was designed by some geometers and you can see that the whole thing is very symmetric: the layout, the patterns in the stones and the decorations on the walls. It looks really great. Unfortunately, it's in restoration, so some parts are not visible for now. </p> <div class="gallery clearfix" style="max-width:600px"> <img title="Outside remnants " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Sssssnakessss " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Cat. " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/06/istanbul/hagia/P1160417.JPG", "title": "Outside remnants\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160417.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160419.JPG", "title": "Sssssnakessss\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160419.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160420.JPG", "title": "Cat.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160420.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160422.JPG", "title": "That window looks like an emoji :D\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160422.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160427.JPG", "title": "Patterns on the wall.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160427.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160430.JPG", "title": "Arabic writing.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160430.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160431.JPG", "title": "Drink up.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160431.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160433.JPG", "title": "The Library\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160433.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160435.JPG", "title": "More cats.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160435.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160437.JPG", "title": "Chandelier.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160437.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160438.JPG", "title": "X marks the spot.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160438.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160442.JPG", "title": "The pulpit\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160442.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160445.JPG", "title": "Byzantine mural...\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160445.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160446.JPG", "title": "... surrounded by Muslim symbols\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160446.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160447.JPG", "title": "Mosaics.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160447.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160451.JPG", "title": "", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160451.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160453.JPG", "title": "The ceiling.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160453.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160454.JPG", "title": "Some feathery being.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160454.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160465.JPG", "title": "This door looks like a sarcophagus.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160465.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160467.JPG", "title": "The balconies\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160467.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160470.JPG", "title": "The Empresses' view\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160470.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160478.JPG", "title": "Half-gone saints\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160478.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160487.JPG", "title": "Access denied.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160487.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160492.JPG", "title": "Feathery being again, now with a head.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160492.JPG", "w": 1080, "h": 1615}, {"src": "/static/images/2017/06/istanbul/hagia/P1160500.JPG", "title": "A solar clock, which indicated three different things.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160500.JPG", "w": 1080, "h": 722}, {"src": "/static/images/2017/06/istanbul/hagia/P1160501.JPG", "title": "The water fountain.\n", "msrc": "/static/images/2017/06/istanbul/hagia/thumbs/P1160501.JPG", "w": 1080, "h": 722}]</script> </div> <p>After the church I crossed the Golden Horn by walking across the Galata Bridge. It separates the old, historical Constantinople from the new, modern Istanbul. The bridge has two levels, one above, for cars, and one for pedestrians below. The lower level is full of restaurants, with the waiters calling you in at every step. </p> <p><img alt="Bridge over the Golden Horn" src="" width="100%" style="max-width:600px"/></p> <p>My last stop for the day was the Galata Tower. It was built in 1348, as part of the Genoese colony of Constantinople. It was damaged several times by fire, even though sometimes it was used to spot fires in other parts of the city. Now the insides have been modernized, with elevators and a nice cafe. From the top you have a beautiful panoramic view of the city. And from there you realize that Istanbul is 'yuuuuuuge. In pretty much every direction you look, you can't see its limits. But there is this strong contrast: you have this impressive, majestic old tower and right next to it you have 60 year old apartment buildings that have never seen any maintenance, so there are cracks in the walls and the paint is half gone. From the top of the tower you can enjoy a beautiful sunset and then look down to see how somebody is making a BBQ in their rooftop garden. I wonder how people who live there enjoy that too, knowing that thousands of tourists are analyzing their culinary skills. </p> <div class="gallery clearfix" style="max-width:600px"> <img title="The Galata Tower from up close. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="From a distance. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Istanbul to the horizon " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/06/istanbul/tower/P1160539.JPG", "title": "The Galata Tower from up close.\n", "msrc": "/static/images/2017/06/istanbul/tower/thumbs/P1160539.JPG", "w": 2856, "h": 4272}, {"src": "/static/images/2017/06/istanbul/tower/P1160528.JPG", "title": "From a distance.\n", "msrc": "/static/images/2017/06/istanbul/tower/thumbs/P1160528.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/06/istanbul/tower/P1160547.JPG", "title": "Istanbul to the horizon\n", "msrc": "/static/images/2017/06/istanbul/tower/thumbs/P1160547.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/06/istanbul/tower/P1160554.JPG", "title": "Rooftop reading under the tower.\n", "msrc": "/static/images/2017/06/istanbul/tower/thumbs/P1160554.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/06/istanbul/tower/P1160559.JPG", "title": "The old city\n", "msrc": "/static/images/2017/06/istanbul/tower/thumbs/P1160559.JPG", "w": 4272, "h": 2856}]</script> </div> <p>When I went back to the hotel, I discovered the sign pointing towards in the airport: it was right at the exit from the metro. Yay. At least the trams and metros in Istanbul were pretty clean and with air conditioning. </p> <p><img alt="One of the many mosques" src="" width="100%" style="max-width:600px"/></p> <p>On the way back to Zurich, I stayed at another hotel, which was fancier and cheaper, but a 10 minute ride from the airport. While it was nice, it turned out the Google Maps doesn't quite know the area well, because it wanted to send me walking over a highway to get to a bus stop, or along an nonexistent street. Ah, the fun adventures at 9PM in a foreign city.</p> <p><img alt="Boat on the Golden Horn" src="" width="100%" style="max-width:600px"/></p> <p>The first thing I went to see on Monday was the Grand Bazaar, the world's oldest shopping mall and it's said to be the world's most touristy place with 91 million visitors every year. That being said, I wasn't on a shopping spree, so I admired the exotic spice shops, colourful carpet shops and shiny jewelry shops only from a distance.</p> <div class="gallery clearfix" style="max-width:600px"> <img title="Entrance to the Grand Bazaar " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Ceiling decorations " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Shops, shops everywhere " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/06/istanbul/bazaar/P1160593.JPG", "title": "Entrance to the Grand Bazaar\n", "msrc": "/static/images/2017/06/istanbul/bazaar/thumbs/P1160593.JPG", "w": 2856, "h": 4272}, {"src": "/static/images/2017/06/istanbul/bazaar/P1160594.JPG", "title": "Ceiling decorations\n", "msrc": "/static/images/2017/06/istanbul/bazaar/thumbs/P1160594.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/06/istanbul/bazaar/P1160595.JPG", "title": "Shops, shops everywhere\n", "msrc": "/static/images/2017/06/istanbul/bazaar/thumbs/P1160595.JPG", "w": 2856, "h": 4272}]</script> </div> <p>Then I proceeded to the modern part of Istanbul: Taksim Square, where the Monument of the Republic stands, built in 1928 for the 5th anniversary of the foundation of the Republic of Turkey. It's a small area, with quite heavy police presence, because people like to protest here (among other reasons against the demolition of the Taksim Gezi Park), but it has some boutiques selling street food with some amazing ice cream :X.</p> <div class="gallery clearfix" style="max-width:600px"> <img title="The monument in the middle of Taksim Square " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="The entrance to the market fair in Taksim Square " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/06/istanbul/taksim/taksim.jpg", "title": "The monument in the middle of Taksim Square\n", "msrc": "/static/images/2017/06/istanbul/taksim/thumbs/taksim.jpg", "w": 2856, "h": 4272}, {"src": "/static/images/2017/06/istanbul/taksim/P1160617.JPG", "title": "The entrance to the market fair in Taksim Square\n", "msrc": "/static/images/2017/06/istanbul/taksim/thumbs/P1160617.JPG", "w": 4272, "h": 2856}]</script> </div> <p>Of course, I don't like to visit a city where Google has an office, without visiting the office itself. These are in the Levent quarter, a business district full of skyscrapers. </p> <p><img alt="View from the Google office" src="" width="100%" style="max-width:600px"/></p> <p>To end my trip I went down to the sea side and walked a bit along it (and got lost by getting on the wrong bus), looking to the opposite side of the Bosphorus, regretting that I didn't have time to go to the Asian side. Oh well, there's always next time!</p> <p><img alt="Looking across the Bosphorus" src="" width="100%" style="max-width:600px"/></p> <p>Two more fun facts about Istanbul: they don't seem to have stray dogs, but they have stray cats. Cats everywhere. Hagia Sofia was full of them. Everywhere on the street? Cats, cats, cats. I think it's cat paradise. </p> <div class="gallery clearfix" style="max-width:600px"> <img title="For some reason, Kim Jong Un seems to be popular. " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="Baseball hat-like roof overhang " src="" style="display:block" width="100%" style="max-width:600px"/> <img title="I guess the owner ran out of ideas " src="" style="display:block" width="100%" style="max-width:600px"/> <script type="application/json">[{"src": "/static/images/2017/06/istanbul/misc/P1160536.JPG", "title": "For some reason, Kim Jong Un seems to be popular.\n", "msrc": "/static/images/2017/06/istanbul/misc/thumbs/P1160536.JPG", "w": 2856, "h": 4272}, {"src": "/static/images/2017/06/istanbul/misc/P1160504.JPG", "title": "Baseball hat-like roof overhang\n", "msrc": "/static/images/2017/06/istanbul/misc/thumbs/P1160504.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/06/istanbul/misc/P1160506.JPG", "title": "I guess the owner ran out of ideas\n", "msrc": "/static/images/2017/06/istanbul/misc/thumbs/P1160506.JPG", "w": 4272, "h": 2856}, {"src": "/static/images/2017/06/istanbul/misc/P1160608.JPG", "title": "They called to say \"Thanks for all the fish\"\n", "msrc": "/static/images/2017/06/istanbul/misc/thumbs/P1160608.JPG", "w": 2856, "h": 4272}, {"src": "/static/images/2017/06/istanbul/misc/P1160625.JPG", "title": "The child seems quite angry :-S\n", "msrc": "/static/images/2017/06/istanbul/misc/thumbs/P1160625.JPG", "w": 4272, "h": 2856}]</script> </div> <p>Also, the food is amazing. Both places where I sat down to eat had really good stuff. Unfortunately, I'm on diet, so I couldn't eat more :(</p> <p>I enjoyed my time in Istanbul, but I didn't get to hear <a href="">Mr. Toot</a> playing.</p> Wed, 14 Jun 2017 20:36:00 GMT,2017-06-14:/2017/06/14/istanbul-land-of-turbans-spice-and-carpets Happy Mother's Day! <iframe width="560" height="315" src="" frameborder="0" allowfullscreen class="youtube"></iframe> <p>Happy Mother's Day to my dear mom! I love you! Kisses from New York!</p> Sat, 06 May 2017 21:54:00 GMT,2017-05-07:/2017/05/07/happy-mother-s-day Look what I found on Uetliberg <p><img alt="Hands with rings" src="" width="100%" style="max-width:600px"/></p> <p>Scarcely had I hiked up Uetliberg when I found the one my heart loves. I held her tightly and I put a ring on her finger! (to paraphrase Song of Solomon 3:4)</p> Sun, 23 Apr 2017 19:56:00 GMT,2017-04-23:/2017/04/23/look-what-i-found-on-uetliberg