.git
folders via rsync, however, will likely turn the log into gibberish. Conundrum!
One attempt is to create, on one of the machines, what is called a “barebones” copy, which acts as sort of a surrogate for the centralised server. You then clone it into working copies, both on that machine and on the other one. For reasons that are beyond my current git knowledge, those barebones “repositories” cannot be used as working copies. I do know it is related to being able to do a git push
: you can never ever push to working copy!
All that notwithstanding, working copies alone — without any barebones stuff — turn out to suffice for the task at hand. You need some way of accessing one machine from the other; I only tried with ssh
. Place the code in one (and only one) of the machines (doesn’t matter which one, it will end up making no difference); let’s call it host1
. One the folder which has the code — I assume it is /path/to/repo1
— do:
1 2 3 

On the other (host2
), create the directory where to place the code (/path/to/repo2
below), and do the following:
1 2 3 4 5 

In the original machine (host1
), set the other as the origin:
1 2 3 

The reason you need to do git fetch
before setting up branch tracking, insofar as I understand it, is that git pull
just brings (pulls) content, not branch information. Hence the need for fetching beforehand. Incidently, it might also be more useful to sync the repositories doing first a fetch (rather then a pull), because you can then do a git diff HEAD origin/master
to see the changes that are coming (it is a long command, hitting Tab might help ;) ). If everything is OK, you can then do a git merge
to, well, merge the branches. (git pull
is basically a git fetch
followed by a git merge
.)
If you have your hosts configured in a ~/.ssh/config
file (google it), you can use whatever names you assigned to the machines instead of user1@host1
and user2@host2
. That’s it: the master branch in each copy now tracks the master branch of the other, so you can now do changes in one place, and just git pull
them from the other (and of course, viceversa). Obviously, this is not scalable, but (to me at least!) is useful nonetheless. And never forget the cardinal rule:
THOU SHALL NOT DO GIT PUSH! EVER!
November 21, 2018: added information about the need for git fetch
.
November 30, 2018: corrected git diff
command to use after git fetch
.
\(\newcommand\funcdecl[3]{#1\, \colon #2 \rightarrow #3}\) \(\newcommand\covered[2]{#1 \preccurlyeq #2}\) \(\newcommand\finitefield[1]{\mathbb{#1}}\)
Given any binary boolean function \(\funcdecl{\varphi}{\mathbb{F}_2^n}{\mathbb{F}_2}\), there exist \(a_u \in \mathbb{F}_2\) such that:
\[\begin{equation} \varphi(x) = \sum_{u\in \mathbb{F}_2^n}a_u\left(\prod_{i=1}^n x_i^{u_i}\right) \label{eq:anf1}\tag{1} \end{equation}\]This representation is called the algebraic normal form (ANF) of \(\varphi\), and the bulk of this text is about the way we compute these coefficients.^{1} But first, we need to show that this representation always exists. One way to do so, is by reasoning as follows: define a function \(\funcdecl{\delta}{\mathbb{F}_2^n}{\mathbb{F}_2}\), such that \(\delta(x)=1\) if \(x=0\), and \(\delta(x)=0\) if \(x\neq 0\).^{2} We can now define \(\varphi\) as:
\[\begin{equation} \varphi(x) = \sum_{z\in \mathbb{F}_2^n} \varphi(z)\delta(z+x) \label{eq:phi_kronecker1}\tag{2} \end{equation}\]This works because \(\delta(z+x)\) is \(0\) except when \(z=x\), in which case it is \(1\). Equation \(\ref{eq:phi_kronecker1}\) might seem a circular definition, specially if one is thinking of \(\varphi\) as being defined by a “formula”. However, the most general definition of a function from, say, set \(X\) to set \(Y\) is as a subset — that is, a relation — of \(X \times Y\), subject to the caveat that, for every \(x\in X\), there must exist exactly one pair \((x, y)\) in that relation (in the case of function \(\varphi\), we would say that for all \(x\), there must exist exactly one \(y\) such that \(y=\varphi(x)\)). Hence equation \(\ref{eq:phi_kronecker1}\) is just an analytical description of that subset.
Now, we can replace the \(\delta\) function with \(\prod_{i=1}^n (1+x_i+z_i)\), which is \(1\) if and only if \(x=z\), just like \(\delta\). Equation \(\ref{eq:phi_kronecker1}\) now becomes:
\[\begin{equation} \varphi(x) = \sum_{z\in \mathbb{F}_2^n} \varphi(z)\prod_{i=1}^n (1+x_i+z_i) \label{eq:phi_kronecker2}\tag{3} \end{equation}\]When \(\varphi\) is a concrete function, both \(\varphi(z)\) and the \(z_i\)’s will be concrete \(0\)’s and \(1\)’s — the only variables will be the \(x_i\)’s. Furthermore, the \(x_i\)’s belong to \(\mathbb{F}_2\), and hence we have that \(x_i^2 = x_i\). Thus when developing (\(\ref{eq:phi_kronecker2}\)) for a concrete function, we will end up with an equation of the form of (\(\ref{eq:anf1}\)). This shows that the ANF always exists.
The ANF is also unique, which we can show through a cardinality argument. Consider the set of all the functions \(\funcdecl{\varphi}{\mathbb{F}_2^n}{\mathbb{F}_2}\); this set has \(2^{2^n}\) elements; denote it set \(\mathcal{BBF}\).^{3} Now consider the set \(\mathcal{ANF}\) consisting of all the expressions of the form of the right hand side of equation \(\ref{eq:anf1}\). Its elements are in onetoone correspondence with the set of subgroups of the set of all expressions of the form \(\prod_{i=1}^n x_i^{u_i}\). There are \(2^n\) of these expressions (one for each \(u\in \mathbb{F}_2^n\)), and hence the number of elements of \(\mathcal{ANF}\) is \(\sum_{j=0}^{n} \binom{2^n}{j}\), which, by a wellknown identity relating the binomial coefficients,^{4} equals \(2^{2^n}\). As every element of \(\mathcal{ANF}\) corresponds exactly to one binary boolean function — i.e. an element of \(\mathcal{BBF}\) — and as both sets have the same cardinality, we conclude that the ANF is unique.^{5}
We usually abbreviate \(\prod_{i=1}^n x_i^{u_i}\) as \(x^u\), so (\(\ref{eq:anf1}\)) becomes \(\varphi(x) = \sum_{u\in \mathbb{F}_2^n}a_u x^u\). But we can simplify it even further. For any \(x\in \mathbb{F}_2^n\), the set \(\{i\in \{1..n\}\ \vert\ x_i\neq 0\}\) is called the support of \(x\), denoted \(supp(x)\). Note that the cardinality of the support of \(x\) equals its Hamming weight, \(hw(x)\).^{6} Going back to \(\prod_{i=1}^n x_i^{u_i}\), it equals \(1\) if and only if for all \(i\), \(u_i = 1 \rightarrow x_i = 1\) (otherwise it is \(0\)) — but this is the same as requiring that \(supp(u)\subseteq supp(x)\). Let us denote this latter condition as \(u \preccurlyeq x\) (we thus say that \(u\) is covered by \(x\), or equivalently, that \(x\) covers \(u\)). This allows us to rewrite (\(\ref{eq:anf1}\)) as:
\[\begin{equation} \varphi(x) = \sum_{u\preccurlyeq x}a_u \label{eq:anf2}\tag{4} \end{equation}\]But how to compute the different \(a_u\)? We are aided by the fact that the “converse” of (\(\ref{eq:anf2}\)) also holds:
Theorem 1. For all \(u\in \mathbb{F}_2\), the following holds:
\[\begin{equation} a_u = \sum_{x\preccurlyeq u}\varphi(x) \label{eq:anf3}\tag{5} \end{equation}\]\[\tag*{$\square$}\]
Proof. Replace \(a_u\) in (\(\ref{eq:anf2}\)) with the right hand side of (\(\ref{eq:anf3}\)) to obtain:
\[\begin{equation} \sum_{u \in \finitefield{F}_2^n \mid \covered{u}{x}} \left(\sum_{y \in \finitefield{F}_2^n \mid \covered{y}{u}} \varphi(y)\right) \label{eq:anf4}\tag{6} \end{equation}\]We can look at the nested summations as defining a set of pairs, over which the function iterates. Denote that set as \(S\); in this case \(S = \{(u, y) \mid u\preccurlyeq x \land y\preccurlyeq u\}\). From the transitivity of \(\preccurlyeq\) we immediately get that both \(y\preccurlyeq x\) and \(y\preccurlyeq u\preccurlyeq x\) hold. Let \(S' = \{(y, u) \mid y\preccurlyeq x \land y\preccurlyeq u\preccurlyeq x\}\). We have just shown that \((u, y)\in S \rightarrow (y, u) \in S'\). The converse is straightforward, indeed from \(y\preccurlyeq u\preccurlyeq x\) we get both \(u\preccurlyeq x\) and \(y\preccurlyeq u\), meaning that \((y, u) \in S'\rightarrow (u, y)\in S\). But \(S'\) describes precisely the pairs iterated over by the following summation:
\[\begin{equation} \sum_{y \in \finitefield{F}_2^n \mid \covered{y}{x}} \left(\sum_{u \in \finitefield{F}_2^n \mid \covered{y}{u} \preccurlyeq x} \varphi(y)\right) \label{eq:anf5}\tag{7} \end{equation}\]The equivalence between \(S\) and \(S'\) means that the summations in equation \(\ref{eq:anf4}\) include pair \((u, y)\) if and only if the summations in equation \(\ref{eq:anf5}\) include \((y, u)\) — which implies their equality. The latter can be rearranged as:
\[\begin{equation} \sum_{y \in \finitefield{F}_2^n \mid \covered{y}{x}} \varphi(y) \left(\sum_{u \in \finitefield{F}_2^n \mid \covered{y}{u} \preccurlyeq x} 1\right) = \varphi(x) \tag{8} \end{equation}\]The last equality follows because of the set \(\{u \in \finitefield{F}_2^n \mid \covered{y}{u} \preccurlyeq x\}\): if \(x \neq y\), then it is either empty (if \(y \not\preccurlyeq x\)), or (if \(y \preccurlyeq x\)) it is nonempty, and has \(2^{hw(x)hw(y)}\) elements — but in both cases, the inner summation evaluates to zero (remember we are summing in \(\finitefield{F}_2\)). If \(y=x\), the set has just one element, and the result follows. \(\blacksquare\)
The duality shown in equations \(\ref{eq:anf2}\) and \(\ref{eq:anf3}\) yields a simple algorithm to compute the ANF coefficients (\(a_u\)’s) from \(\varphi\)’s truth table, or viceversa (i.e. it can also be used to compute the value of the function, given the \(a_u\)’s). I will focus on the former. Let us take as an example the function defined by \((x_1 \rightarrow x_2) \rightarrow x_3\). Here is its truth table:
\[ \begin{array}{cccc} x_1 & x_2 & x_3 & (x_1 \rightarrow x_2) \rightarrow x_3 \\ \hline 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 1 & 1 & 1 \\ 1 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 0 \\ 1 & 1 & 1 & 1 \\ \end{array} \]
The algorithm goes like this: start in the column that corresponds to the “most significant bit”; \(x_1\) in the table above. Where it has the value \(0\), leave the value of the function unchanged; where it has the value \(1\), add to the value of the function at the current entry the value of the function at the entry obtained by setting \(x_1\) to \(0\). This is illustrated in the table below, where instead of replacing the values of the function, they are shown in an auxiliary column:
\[ \begin{array}{ccccc} x_1 & x_2 & x_3 & (x_1 \rightarrow x_2) \rightarrow x_3 & \textrm{aux_1} \\ \hline 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 1 & 1 \\ 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 1 & 1 & 1 \\ 1 & 0 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1 & 0 \\ 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 & 0 \\ \end{array} \]
And now you just do the same thing for \(x_2\), and then for \(x_3\) (if there were more columns, you would just continue until reaching the one corresponding to the “least significant bit”). Again to illustrate, here’s the result, with two more auxiliary columns (aux_2 for \(x_2\) and aux_3 for \(x_3\)). Note that, as we are not replacing the function values, aux_2 is computed using the values of aux_1, and aux_3 using the values of aux_2.
\[ \begin{array}{ccccccc} x_1 & x_2 & x_3 & (x_1 \rightarrow x_2) \rightarrow x_3 & \textrm{aux_1} & \textrm{aux_2} & \textrm{aux_3} \\ \hline 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 1 & 1 & 1 & 1 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 1 & 1 & 1 & 0 & 0 \\ 1 & 0 & 0 & 1 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 & 0 & 0 & 1 \\ 1 & 1 & 0 & 0 & 0 & 1 & 1 \\ 1 & 1 & 1 & 1 & 0 & 0 & 1 \\ \end{array} \]
Now, the values in column aux_3 are the \(a_u\)’s that correspond to \(x^u\); for example the coefficient for \(x_1x_2\) (i.e. \(u=110\)) is \(1\), which means the monomial shows up in the final expression. Doing this for all the values in the table, yields that final expression:
\[\begin{equation} (x_1 \rightarrow x_2) \rightarrow x_3 \equiv x_1+x_3 + x_1x_2 + x_1x_3 + x_1x_2x_3 \tag{9} \end{equation}\]And as mentioned above, if we start with a table listing of the \(a_u\)’s, this algorithm yields the original function:
\[ \begin{array}{ccccccc} u_1 & u_2 & u_3 & \textrm{aux_3 } (\text{i.e. } a_u) & \textrm{aux_4} & \textrm{aux_5} & \textrm{aux_6} \text{ i.e. } (x_1 \rightarrow x_2) \rightarrow x_3\\ \hline 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 1 & 1 & 1 & 1 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 1 & 0 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 & 1 & 1 & 1 \\ 1 & 0 & 1 & 1 & 0 & 0 & 1 \\ 1 & 1 & 0 & 1 & 1 & 0 & 0 \\ 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ \end{array} \]
Doing this for a few different functions, it is very easy to get a “feeling” that this works. Of course the high level reason why this works is obvious: because by the time the algorithm get to the aux_3 column, it has already, for each row (where the variables’ columns are seen as an \(u\) value) summed all the function values for all the \(x\)’s that that \(u\) value covers. But how to prove this? This was the reason lead me to write about this in the first place: the algorithm is dead simple, so the proof should be simple too, right? Well… kind of. It is simple but — to me at least — not at all straightforward.
To see the lower level reason why this works, we borrow a bit of notation from Python: indexing starts from \(0\), and \(x[m:n+1]\) means the substring of \(x\) that starts at index \(m\) and ends at index \(n\), including this last element (but not the one at position \(n+1\)) — this is how it works on Python. The element of \(x\) at index \(m\) is denoted \(x[m]\). Also, \(x[m:]\) is the strings that goes from (and includes) position \(m\), to the end of string \(x\). Lastly, if \(x\) and \(y\) are strings, then \(x == y\) means the strings are equal, and \(x + y\) denotes concatenation. A string that contains just the element \(a\) is denoted \([a]\) (this is also a “Pythonism”).
Also, to explain why the algorithm works (we will only look at the case going from the function to the \(a_u\)’s), it is a lot easier to forget the ANF and just think of it as a transversal problem: for a given \(x\), which elements does the algorithm touch? We will show it touches (once and only once) precisely those elements \(u\) such that \(u\preccurlyeq x\).
Indeed, if we are dealing with strings of length \(1\), it is obvious that the algorithm works. The case of length \(2\) can be easily checked by hand, and furthermore, the truth table for length two essentially “doubles” that of the case of length \(1\) — and this provides the motivation for an inductive reasoning. Suppose that for a given string \(x\) of length \(n\) (i.e. when working in \(\mathbb{F}_2^n\)), the algorithm works as expected: i.e., it passes by every string \(u\) of the same length, such that \(u\preccurlyeq x\) holds, exactly once. Consider now the strings of length \(n+1\), where the “extra bit” is added to the left: then, this set can be constructed taking the set of strings of length \(n\), and prepending to it a column of all \(0\)’s, and then doing the same thing, but now with all \(1\)’s column. To take a concrete example, in the truth tables above, observe that the set of tuples of \(x_2\) and \(x_3\) are repeated, once for \(x_1=0\) and again for \(x_1=1\). So we expand \(x\) by prepending an extra \(0\) or \(1\) to it, and run the algorithm again, but ignoring this new column — i.e. we start in column \(1\) (which was column \(0\) in the length\(n\) case). It should be clear that from the induction hypothesis (and the fact that the remaining \(n\) columns are basically the same as in the case of strings of length \(n\)), that the algorithm will go once over all \(u\in \mathbb{F}_2^{n+1}\) such that \(u[0] == x[0]\) and \(u[1:]\preccurlyeq x[1:]\).
Observation: if we do this (start the algorithm on the second column, working in \(\mathbb{F}_2^{n+1}\)) for two values \(x\) and \(x'\), that only differ on the first element, the resulting set of strings, except for the first element, will be the same. That is to say — assuming, without loss of generality, that \(x[0] == 0\) and \(x'[0] == 1\) — the set output when the input is \(x\) will only contain strings that begin with \(0\). And if we change this first bit to \(1\), we obtain precisely the set of strings output on input \(x'\) (and viceversa). This is because (loosely speaking) the truthtable for \(\mathbb{F}_2^{n+1}\) minus the first column, is basically the same as that of \(\mathbb{F}_2^n\), repeated twice, as explained above.
If, going back to our inductive reasoning, we now start the algorithm normally (i.e. on the first column, again in \(\mathbb{F}_2^{n+1}\)), and \(x[0] == 0\), then we still obtain all the strings that \(x\) covers (because the algorithm essentially ignores zeroes, meaning it reduces to the case of \(\mathbb{F}_2^n\)). Let \(\mathcal{S}\) be this set; i.e. the set of all values \(u\) such that \(u[0] == 0\) and \(u\preccurlyeq x\). By the induction hypothesis, \(\mathcal{S}\) is always part of the algorithm’s output. If we do the same, but \(x[0] == 1\), then the algorithm adds \([0] + x[1:]\), and moves on to column \(1\) — and the final set of strings will be \(\mathcal{S}\), plus (by the above observation) all the strings in \(\mathcal{S}\) with the first element changed to \(1\).
And we are done: it is straightforward to see that all the strings thus produced are indeed covered by \(x\); and conversely, if there existed a string \(u\) such that \(u\preccurlyeq x\) but that was not part of the algorithm’s output, then in particular the string \([0]+u[1:]\) could not be in \(\mathcal{S}\), which by the induction hypothesis would mean that \(u[1:]\not\preccurlyeq x[1:]\), implying \(u\not\preccurlyeq x\) — which is contradictory.^{7} Hence we conclude the algorithm indeed outputs all the strings covered by \(x\).
November 22, 2018: added the table showing how to go from the \(a_u\)’s to the function (the inverse case to what is explained).
\(\mathbb{F}_2^n\) denotes the vector space of dimension \(n\) over the Galois field with two elements. It will be clear from context the field in which the summations take place (i.e. \(\mathbb{F}_2\) or \(\mathbb{Z}\)). Also, this formalism implies the convention — widely accepted within the “discrete domains” of mathematics, but by no means universal outside of it — that \(0^0 = 1\). If the reader finds himself mystified by this, checking out the relevant Wikipedia page is very recommended.↩
Such a function is called the Kronecker delta.↩
There two choices — \(0\) or \(1\) — for each element of the domain, and each element of the domain must have exactly one image. Hence we have two choices for the first element of the domain, and for each of those, another two choices for the second element, … which yields a total number of functions of \(2^{2^n}\). More generally, for a function \(\funcdecl{\psi}{X}{Y}\), with \(X\) and \(Y\) finite, the total number of functions is \(Y^{X}\).↩
Wikipedia to the rescue.↩
Actually, this argument also shows the ANF always exists, because the correspondence between \(\mathcal{BBF}\) and \(\mathcal{ANF}\) is a bijection.↩
If \(([0]+u[1:])\in \mathcal{S}\), and \(u[0] == 0\), then \(u\) is part of the algorithm’s output. If \(([0]+u[1:])\in \mathcal{S}\), and \(u[0] == 1\) then the algorithm necessarily passed through \([1]+u[1:]\) (i.e. \(u\)), otherwise it could not have reached \([0]+u[1:]\). This again means that \(u\) is part of the output. Both scenarios contradict the assumption that \(u\) is not a part of the algorithm’s output.↩
So early this September I found myself heading for northern Norway, to the beautiful archipelago of the Lofoten islands, where a crypto workshop^{1} was to be held in the city of Svolvær^{2}. Unluckily for me (but luckily for you, because it gives a much better story), the mishaps started long before I set foot anywhere near my destination…
In fact, they began when deciding how to send me there. Svolvær turns out to be so remote a place, that the most direct route (that still required a train ride to Lisbon, and 2 flights thereon^{3}), also required an overnight stay in Oslo! Which brings me to my first mistake: I decided to stay at the Best Western Oslo Airport Hotel^{4}, a nice 4 star hotel conveniently situated a 5 minute bus ride from Oslo’s main airport (Garnermoen, OSL). So far so good, right? Wrong!
While the hotel is indeed close to the airport, that 5 minute bus ride, costs 70NOK (~8€) per journey^{5}, which is pretty effing expensive! For comparison, to go from the airport to the centre of Oslo (roughly 35km), the fare is 90NOK per journey! This meant that to visit Oslo, I would have to go to the hotel to leave the luggage, and then get back to the airport (where the railway terminal is also located), so that’s 70+70, go to Oslo and return to terminal and then to the hotel (90+90+70). Adding to this returning to the airport the next day, that’s roughly 500NOK in transport fares. At this point I still wondered whether to shell out that cash and go visit Oslo anyway. But alas, when I arrived at the hotel, the receptionist—a nice Peruvian lady^{6}—told me that my room would be ready by three o’clock, which meant I had to wait there for another two hours… (unless I were to go sightseeing with my suitcase tagging along…). So I guess I’ll have to return to Oslo in some other time… and find myself some nice lodgings in the city centre!
By the way, going a bit offtopic, there was one bit of cultural difference that I noticed barely after touching down in Oslo. After exiting the airport, when trying to find what was the shuttle to Best Western, I decided to go ask the driver of a bus that was stopped nearby. He was answering a question from another tourist, and so, as I had a quick question, I instinctively did what sevenplus years living in Lisbon teach you to do: I blatantly interrupted him and posed my question. He didn’t even look at me: he just lifted his hand, palm and fingers spread, a la stop sign, instructing me to wait for my turn. This was to happen yet again, before I interiorised that it was on the list of “do nots”.
Going back to ranting about staying at hotels “near” the airport, another disadvantage is that there is essentially nothing around you (except other also supposedly “nearby” hotels). More to the point, that meant I was also stuck with the prices of the hotel’s restaurant, which—as is the case for every other restaurant in Norway—are ludicrously expensive. I ended up skipping lunch, but I did eat a burger for dinner, which was the cheapest thing on the menu that wasn’t a salad. Which brings us to the topic of food…
The Nordic food conundrum, isn’t so much that restaurants are very expensive (although they are); it’s that the price of food in groceries and supermarkets cost a whole lot less! By their living standards, it probably even qualifies as “cheap”. I fail to see any reason for this. Indeed as I was leaving Svolvær and headed for the airport, I got to talk with the cab driver, and he acknowledged that in fact, there seems to be no reason for it, and moreover, he admitted to never going to restaurants in Norway! Put another way, restaurant eating is something at least this Norwegian only does when travelling abroad—which for any Southern European, is quite anathema indeed!^{7}
But anyway, I did end up having a couple of meals in restaurants (some where included in the workshop). Plus, breakfast was included in hotel package (see below)! :D
The first thing I tried was the soup fish, in restaurant Bacalao. I was told this is typical Norwegian, but, not being overly fond of fish, I was a bit sceptical… In the end I decided to try it anyway, and guess what… it was actually delicious!
And speaking of typical things, the breakfast was anything but! Here are a couple of samples:
That brown slice in the left hand side was cheese which flavour bares a somewhat vague resemblance to peanut butter… Several people told me it is a delicacy; while it is nice, I am unsure it it reaches the bar for that qualification^{9}.
The workshop included lunch, and on the very first day, it was—can you guess?—salmon!
Note that this was the entirety of the lunch. It was fish on most days, but, much to my surprise, we actually got pork once^{10}:
To drink there was always water, and this something peculiar in Norway: apparently, whenever you go to a restaurant, they always put a bottle of water on the table (uncharged). It is only if you want other drinks that you have to ask—and for those they really do charge you! Case in point: for the below depicted meal, the beer went for a whopping 10€!!
Now don’t get me wrong, it was a nice, locally crafted beer (not that that mattered much, all prices were similarly high). But was it worth the cost?
Also included in the workshop was the banquet. Although in Norway I am certain that word has a very peculiar meaning, that hardly carries over to more Southbound lands. Why do I say this? Because that ostensible banquet was supposed to have three courses: the first was the soup, served in a huge plate and with an inversely proportional portion of actual soup. But the winner is definitely the second “course”:
They did serve us white and red wine, along with a more generous third course, so it wasn’t all bad.
Now that I have vented my foodrelated complaints, I want to end with the one meal that was really, really good. On my last day on the island, having strolled around quite a bit, I discovered a restaurant called Vestfjord ^{11}. Being the last day, I decided to spend the (physical) money I still had, and so I treated myself to some
of those parts: a (hot) soup made of orange berries (indigenous to the Northern parts of Norway, it would appear), with a ball of icecream on the middle. The fish was really awesome—and coming from me, this means something!—and the dessert had a strange sour (from the berries) and sweet flavour; it was also nice, but it seemed to be more of an acquired taste. I shan’t bother you with how much that meal cost…
But enough with the food talk already—after all, only a fool goes to Norway for culinary reasons…
Situated at a latitude of 68.23 degrees North^{12}, this small town in the Lofoten archipelago has no runways for jet engine aircraft. Instead one travels in propellerpowered planes—which is exactly what I did:
It flies at lower altitudes than the regular jet engine ones (24000 feet (roughly 8km) was the top altitude, if memory serves correctly). And the insulation of the cabin walls is definitely worse: I got a chill whenever I rested on them. But for these views, I could not care less! :D
Having left a sunny and warm Portugal, I arrived at my destination only to find chilly wind and rain. But I was lucky enough to find that some people from the workshop’s organisation had also taken my flight, and they were kind enough to give me a lift. We were staying at different hotels, but being a small city, we of course bumped into each other afterwords and all went to have lunch.
The workshop started the next day, and although this (post in particular) is hardly the place in which to starting blabbering about math and/or crypto, I did get some nice ideas (even if some of them were critical). I also got to meet very nice people—including fellow PhD students—and to top it all of, hiking and a full day boat ride were included in the program! I’ll talk about these further below.
Although it was rainy when I arrived, for the next week we got sun and (mostly) clear skies—which we were told, is most unusual! That also meant everyone was on the lookout for aurora Borealis, more commonly known as Northern lights! I was lucky enough to get to see them, two days in a row! But alas, I was not a good enough photographer to be able to properly capture so magnificent an event. And I do mean magnificent: on the second of those days, by 22:00 half of the sky was covered in green and purpleish streaks! But some of my fellow attendees did manage to take good pictures, which I will link here as soon as they are available. I was also lucky enough to see an aurora that had a thin cloud in front (relative to me): from my perspective, it was as if the cloud just became backlit! Another image I won’t forget anytime soon :)
I stayed for a couple more days after the workshop had finished, but by then, the weather had begun to deteriorate. So whenever it was not raining, I went strolling around. I could not get enough of the landscape, and indeed now I somewhat miss it. Here’s a quick glance:
And speaking of the venue, the one thing I had a ton of trouble finding, was drinking water. The reason? Why, because the wretched thing looked like this!
And speaking of hotels, this was mine. My room was in the first (left) red block.
When I showed these photographs to a couple of friends, they complained that a lot of them contained something “spoiling” the image. I thought they were talking rubbish, but then I looked at this photograph…
There are a few other photographs where this also happens; probably it means it need to improve my skills as a photographer, because when I was there actually looking at those scenarios, those buildings/factories did not bother me at all…
They also complained about this one, but here I think they are mad; this one is just beautiful!
I also got to see a lot of structures like this one, which is where they dry the fish (this is done from March to June, if I recall correctly).
One of the last things I did was to visit the Lofoten’s Krigsminnemuseum (a.k.a. the War Museum), which is absolutely insane! The following pictures—while being worth more than 1000 words for sure—still scarcely do it any justice:
Please do take a look at the full gallery!
And do go visit, should you ever happen to find yourself in those Northern parts of the world. It’s the best spent 100NOK you will ever shell out!
But before any of this, there was a boat trip, and two hikes. Read on :)
Midweek, the day started with all of us gathering outside the conference venue for the boat trip. And my day started with clicking a photography of a baby(?) seagull(?)—can you spot what is peculiar about this one (species)?
It was a beautiful morning, which I spent facing the cold wind on either side of the boat, so as to enjoy the landscapes as much as I could.
And speaking of worse things, there a lot of worse ways to spend your mornings than speaking about crypto—and with one the authors of AES, no less!—amidst ever changing (but always staggering) wilderness.
The afternoon began with more birdseeing (we had done a little bit in the morning); this is one of my favourites:
And these ones from Trollfjorden, because the eagle looks totally Photoshopped in!! (in reality they have had no editing whatsoever)
The last visit before heading back to Svolvær was to Henningsvær, home to what is arguably the world’s remotest football stadium field:
We were also treated to what I can only describe as some peculiarities of the Norwegian sense of humour!
But of course, the day could not end without me again being close to misfortune. Take a look at the following photographs:
Both were taken when I was sitting down on a chair—so you can imagine how much the boat was bouncing from one side to the other. It bounced so much in fact, that at one point in time I fell down from my chair, and was thrust against the rails, ending up with head and chest leaning overboard!!
Desperately trying to get a grip on myself—in more ways than one—I finally managed to sit down again, feet firmly pressed against the deck, and did not get up until the boat had docked. And I don’t think I uttered a single word during that time, either. What I did do was to count my blessings. And avoid overthinking things—all’s well that ends well, I suppose…
On the trail I hiked the day after Tjeldbergtind (see below), you actually get a broad view (of Tjeldbergtind):
You can see it actually has two peaks: one on the left hand side, and another, slightly higher, at the right hand side. You can visit both, and in each there is a hardcover notebook and a pen for you to sign your name. Which is a nice touch—adds to the motivation, one can say. Here’s me on the lower peak:
Of course, in hikes I cannot photograph as much as would in (say) a boat trip, because one tends to be busy, you know, doing the actual hiking. Here are some shots from when I got to the top ridge (which connects the two peaks):
But it is not just upon reaching the summit that one gets to appreciate the landscape; to the contrary, here are two photographs of places our hiking crossed:
As I mentioned above—and these pictures should make clear—we were really fortunate to have been able to enjoy really good weather. However, the forecasts indicated that the next day would also be sunny, but that was it—rain was to fall for the rest of my stay in Svolvær. Now this was the last day of the workshop, and thus, understandably, on the next day I wanted to rest. But that meant effectively wasting the last day of Sun, which was a big nono. So I went for an even crazier hike instead.
As the last paragraph above hints, this one was more eventful (euphemism). To begin with, it is much steeper (and higher) than Tjeldbergtind. The first part you hike amidst dense and high trees, almost literally hopping between their branches to help you.
When hiking up this part, you are fairly protected against the wind. That completely changes when you reach the next one:
Also, despite the very fair weather, on that part with no trees, the hike is very muddy, forcing detours from the marked path, and even then, you still will get your feet wet (or your shoes, at any rate). But at least the path is very well marked—even if at times the marks show up placed like this:
Of course, the path is well marked—on the way up. Getting down is another story (which I shall get to shortly). Before that, however, I managed to get lost on the way up. That was because I reached a point where, for the life of me, I could not find the next mark.
But the trail was clearly not done, and the most promising(!) way up looked somewhat like this:
As carefully as I could, up I went. After a little while, it became pretty obvious that that could not be the way of the trail. Not only were the rocks rather loose, but most of them were covered by a rather generous layer of moss—which has that peculiar characteristic of being rather slippery! Specially in damper climates! Having been climbing for a bit, however, and now looking down, I realised that descending back to the point where I first got lost would not be any easier than going up.
So I decided to stop, lay back, enjoy the—spectacular—view, and take some more photos (including some shown above).
Anyway, eventually it was time to go back down. Again, with as much care as I could muster, fighting moss, gravity and loose rocks, down I went. It took more time than going up, but I did got back to the place of the last mark—and right then I saw the next one!!!.
What had happened, you see, is that the marks are always on the rocks, cf. the picture above. But that particular mark I had missed earlier, was on a damn stick! I missed it because when I first got to this particular point in the trail, the Sun’s relative position was roughly “up and behind” that stick, in such a manner as to leave the mark on the shadowy part. And as, furthermore, I was not expecting for it to be on a damn stick, I did not give it a second look—deciding instead (after looking to all the rocks and failing to find any marks) to go up the mossy path.
When I finally came down (the mossy path), the Sun had shifted, and just glancing at that damn stick immediately revealed the next mark… But alas, by then too much time had passed (and I had run out of water), and hence I had decided to go back to the city. I was so mad when I realised the mistake I had made, that I just turned back and continued down… (which is also the reason why there are no photos of that f’cking damned stick!!)
Which brings us to the next story. So down the trail I was going, and—just as when going up—I kept looking the next mark to point the way. Having just gone through that vexing story of the damn stick, I was extra careful when looking. But to no avail: I could not find any marks. If I looked back in the upward direction, the marks were very easy to spot, but there simply seemed to be none in the downward direction. Resigned to my luck, I continued down, always turning back to check upward marks were still there (meaning of course, I was on the right path).
Until I wasn’t: I looked back, and the upwards marks were not there. Oops. But there was clearly a path, cut amidst the vegetation. Now I had a dilemma: I could go back until a found a trail mark, but in addition to water, I had by now also ran out of food (and was getting hungry, as it was well past noon…). And besides, I was also growing tired, and going back meant going back up. Or I could continue… and in a sense, the unmarked path I found myself in was going on the “right” direction: it was going down.
Of course, that was no guarantee: the path could end in (say) a cliff, which would force me to double back and go around it. I decided to keep going, even with that very distinct possibility hanging—ever more heavily—over my head. But after all the mishaps, luck finally came through on my side: I found a couple who got lost on the way up, and ended in the path I was in instead. Asking them how long was the rest of the way down, “oh it’s just 20 minutes”. HOORAY!, I thought to myself :)
So I continued, down and with a (much) lighter head, until I reencountered the effing trail marks again!
In the picture above, the marks lead you to the left, but the path I was returning from was on the right. It is basically a (quite lessy muddy) shortcut to the alternative that takes you through the plains shown here.
But I couldn’t really give a toss—I just rushed back to the hotel, got under the shower, and let the water wash away my problems… (no such luck with my cuts and scrapes, though!)
As I mentioned earlier, after hiking and boating and whatnot, I strolled around Svolvær… until it was time to leave.
Alas, after far too short a journey spent amidst lit skies by night and beautiful natural sceneries by day, it was finally time to go back. As I mention in a previous footnote, it took 3 flights to reach Lisbon. It started at the airstrip in the Northern part of the island and—depressingly predictably—on account of my terrorist Indian complexion^{15}, I was again “randomly selected” (this was the actual phrase I was told) for having even my tooth paste and my shoes checked (this last one was a first…). It actually felt weirder than normal, because the airstrip is so small that I was selected at “random”… in a room that was practically empty!! I wonder if I can use this on the next paper I write about randomness…
From there it was a short flight^{16} to Bodø, which to the best of my recollection, is the first airport where I have seen military and civilian aircrafts operate side by side. In fact, while my plane was taxiing on the runway, I saw fighter jets take off! Sadly I have no pictures, because as it was raining, the window was covered with droplets, and my cellphone camera annoyingly kept focusing on those… (leaving only a very blurred background).
The last stop, before finally heading for Portuguese skies, was Oslo, where I had a few hours to kill—only to discover afterwords that my flight was over an hour delayed! The reason? French air traffic controllers were on strike. So what else is new, right? The French are always on strike…
So I waited another hour, and then finally I was headed home :)
Savouring a nice Douro red wine followed shortly after, courtesy of TAP^{17}! :D
Journey from Oslo to Svolvær (including aerial photos): link
Svolvær: link
Boat trip: link
Hike to Tjeldbergtind: link
Hike up Fløyfjellet: link
War Museum: link
http://people.uib.no/chunlei.li/workshops/lofoten/index.html. Some extra photographs of the event can be seen here: http://people.uib.no/chunlei.li/workshops/lofoten/photogallery/index.html↩
Pronounced with a strong (tonic) “a” sound, like “Svolvár”.↩
On the return journey to Portugal, there was no overnight stay, but on the downside, it took 3 flights to get to Lisbon.↩
https://www.tripadvisor.com/Hotel_Reviewg226935d1728586ReviewsBest_Western_Oslo_Airport_HotellGardermoen_Ullensaker_Municipality_Akershus_Eastern_N.html↩
At the time I write this, one Norwegian kroner (1NOK) is about 0.11€. So a good rule of thumb to go from NOK to EUR is to slash a zero then add a “little bit”.↩
Speaking of nationalities, there seemed to be a sizeable number of Filipino employees.↩
Moreover, in the flight back, I was actually sat next to a Norwegian girl, who turns out had worked in a couple of restaurants (in Norway). And even she thought that 1) the menus totally lack diversity; and 2) it’s way overpriced (specially when you factor for that lack of diversity…)↩
The Portuguese word for cod is “bacalhau”, which makes “bacalao” look like a (weird kind of) misspelling.↩
It totally doesn’t!↩
I actually also got to taste whale meet for the first time: it’s the dark purple thing left of the salmon in this photo. It is nice, but hardly remarkable.↩
https://www.tripadvisor.com/Restaurant_Reviewg227941d8540829ReviewsRestaurant_VestfjordSvolvaer_Vagan_Lofoten_Islands_Nordland_Northern_Norway.html↩
But that, it seems, is no impediment for people to surf over there! Well, no impediment for them—there is no way in hell I’m going to get caught surfing in those cold waters any time soon…↩
It goes without saying that that’s not my facebook account! (I have no such thing).↩
https://www.tripadvisor.com/Attraction_Reviewg227941d8443847ReviewsTjeldbergtindSvolvaer_Vagan_Lofoten_Islands_Nordland_Northern_Norway.html↩
Family Guy’s Peter Griffin explains it.↩
After taking off from Svolvær, the plane actually circled around the mountain(!) and passed just right of the city. Check the video! (in full screen, otherwise it will look rather small…)↩
Speaking of TAP, one of the ways you know you fly way too much on (always packed to the rafters) low cost airlines, is when you have a regular (i.e. non low cost) flight at indecently early hours, and (after boarding is completed) you spend a long stretch of time figuring out how is it that so many people managed to lose the flight… (due to there being quite a few empty seats on the plane).↩
I am distressed to find that some women friends (fortunately not many) treat the use of the impersonal masculine pronoun as if it showed intention to exclude them. If there were any excluding to be done (happily there isn’t) I think I would sooner exclude men, but when I once tentatively tried referring to my abstract reader as ‘she’, a feminist denounced me for patronizing condescension: I ought to say ‘heorshe’, and ‘hisorher’. That is easy to do if you don’t care about language, but then if you don’t care about language you don’t deserve readers of either sex. Here, I have returned to the normal conventions of English pronouns. I may refer to the ‘reader’ as ‘he’, but I no more think of my readers as specifically male than a French speaker thinks of a table as female. As a matter of fact I believe I do, more often than not, think of my readers as female, but that is my personal affair and I’d hate to think that such considerations impinged on how I use my native language.
English is not my native language, but a similar convention exists in Portuguese—and, in light of the above, I see no reason not to follow it in English as well.
This was before his selfappointment as atheistinchief, back when he still wrote interesting things, instead of the fundamentalist antireligious blabber that seems to be all he cares about these days…↩
And give the talk I did (slides). Because the students had the day filled with lectures, to avoid boring them I gave this one in a more provocative style than I might otherwise have done (and hence the name of this post—and of the talk’s unofficial title). The discussion was indeed very lively, and in fact, at times it became more heated than what I had expected. In retrospect though, I did one mistake. When arguing these things, it is usually necessary to systematically deconstruct a number of unexamined assumptions the audience naturally brings to the discussion. But because I accepted (and indeed posed) questions during the talk, that deconstruction got interrupted again again, severely derailing the course of the talk I had planned. In retrospective, I should not have allowed questions, except at the end.
Nevertheless, I am grateful for all the feedback I have received. One of most poignant remarks, was actually made by a colleague of mine, who also attended the lecture. He pointed out that I do not have all the details of how things should function if we ditch copyright in particular, or intellectual property in general (which is correct); and thus I should not outright dismiss them, at least not before being able to provide a suitable alternative. This last part however, is not correct, and here is why.
As far as I can tell, all individual rights are (or can be thought of as) restrictions on the behaviour of everyone else (other than the individual in question). Thus my right to life is a restriction on the behaviours of everyone else, prohibiting them from depriving (or attempting to deprive) me of my life. The same is true of freedom of speech—it is a restriction that prohibits behaviours from everybody else (historically this meant governments), aimed at silencing me whenever they don’t like what I am saying—freedom of religion, and so on.
Put another way, one individual’s rights are always abridgements on the liberty of others. But it falls on the proponents of a given right, to show that the corresponding abridgement of liberty is necessary. It is not those whose liberty is to be putatively abridged that need to show why it ought not to; or that have to provide “suitable alternatives”. Historically this has always been so; in fact J.S. Mill’s influential essay, On Liberty, which I quoted in the lecture, was written precisely to justify why the rights he supports should indeed be implemented. Just to mention one example, he defends the right to freedom of expression, not because the State—that in 19th Britain was the major threat to that freedom—had failed to show that it had any reason to suppress it, but rather because said freedom is vital to the full development of the individual, and that this is sufficient to justify limiting (restricting) the State’s actions in this particular regard.
Back to copyright and ilk, if they are to be construed as author’s rights, then it falls on the proponents of said rights to show why the rest of us should tolerate the corresponding abridgements of liberty—and most definitely not the other way round! Insofar as I know—and yesterday’s lecture seems to have confirmed it—that reason boils down to economics: how should authors make money, without the aid of copyright et al.? I attempted to show, on both the lecture and the essay, there’s mounting evidence that that would not be a problem at all. And thus there is no need whatsoever to abridge anything. But since we are talking about rights, I might as well address the deeper flaw afflicting that copyrightbecauseeconomics rationale.
“Author rights” such as copyright are, unlike their moral rights, established for the sole purpose of enabling (or easing) business transactions. But their effective enforcement can only be done by trampling over far more fundamental rights, two of which are the right to privacy and the right to due process (if the reader disagrees, please feel free to provide an effective counterexample enforcement mechanism; I know of none). The usual retort to this is to say that we need to find a “balance”, between the interests of authors and friends, and the rest of society that would like to maintain said fundamental rights intact. This is however, woefully misguided—and I can show so by recalling a similar, albeit far more extreme, example of the same reasoning, that took place in the Southern states of the U.S., in the earlytomid 19th century.
Back then, the economy of those states was largely based on slave labour. When the Abolitionists began propagandising the, well, abolition of slavery, what did the defenders of the status quo (meaning slavery) replied? That «the sudden end to the slave economy would have had a profound and killing economic impact in the South where reliance on slave labor was the foundation of their economy. The cotton economy would collapse. The tobacco crop would dry in the fields. Rice would cease being profitable»^{3}. This seems outrageous to us today, because we hold the right to freedom to be so fundamental, that it vastly outweighs any economic considerations. In other words, freedom comes first, and if that damns business, then so be it. But if, for some reason, one were to become convinced that freedom actually isn’t that fundamental, then the argument espoused by the Southerners suddenly becomes a lot more palatable.
And that is precisely the problem with the thesis of “finding balance” between authors and society at large. It seems palatable, only because most of us still do not realise how much the enforcement of those “IP rights” imperils rights that are far, far more fundamental. Maybe this is because the net and computers are still relatively new mediums; but be that as it may, those rights should not be sacrificed for the mere sake of economic convenience. And if that damns business, then so be it. In fact, even if that damns culture, so be it. Or just much cultural enjoyment do you think you will have when we are all living in a privacyless 1984style world?
Thankfully though, we need not face so bleak a choice. We can have both culture, and the freedom to enjoy it. To be sure, we seem to be going in a direction where cultural proliferation is increasingly less likely to yield good ancillary businesses (think selling copies of stuff). But that proliferation, that development of our collective culture, will continue, there is every indication, long after these intellectual property things have become but mere footnotes in the annals of history.
So, to sum up, I indeed do not have the complete picture of how the postcopyrightetal world will look like; but that is no excuse for us not to ditch the bloody mess.
PS: If the reader is about to object that most of the objections I put forth above only apply to copyright, I concede as much. This is because, I suspect, as he was talking about intellectual property, my colleague whom I refer to above must have been thinking about copyright. Yet another folly that results from using the redundant and misleading notion of intellectual property… (and if you’re wondering where the adjectives come from, see footnote #1).
]]>flickr
. It was good, and I stuck with it—until I logged in from abroad, and got locked out because I could not answer a phone challenge, considering how I had not given them my phone number (nor having any intention to do so).
So I was back at having my photos only in my hard drive, until I heard of Google Photo
. It’s free, unlimited, and it totally lacks privacy (from Google), but for the photos I intend to store there, it’s more than enough. What I had stored in flickr
encompasses roughly four categories; here are the corresponding albums @ google:
Now one of the problems is that (unlike flickr
) I can’t list all of the albums (or all of the photos, for that matter). But I can route around that problem. As Prof. Fred Brooks pointed out, one must «[p]resent to inform, not to impress;», because «if you inform, you will impress.». So while I cannot dump all of the photos and provide a link for you to sift through, I can put the relevant new ones in (public) albums, and write a blog post embedding them, thus making them part of the story. And besides, that way I get to debut a new category! ;)
EDIT November 1, 2017: after publishing the post about my trip to Norway, I discovered that, when obtaining the URLs for the photos you wish to embed in your post, you must be logged out of Google Photos!! Otherwise the URL you will get will be one that can only be viewed by logged in (and authorised) users… which is not usually what I want when blogging!
EDIT November 4, 2017: lest I get carried away, it is always good to keep in mind that, paraphrasing Neil deGrasse Tyson, photographs are supposed to be the record of your life experience, not the life experience itself! ;)
]]>