<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.3">Jekyll</generator><link href="https://schore.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://schore.github.io/" rel="alternate" type="text/html" /><updated>2023-03-13T20:29:06+00:00</updated><id>https://schore.github.io/feed.xml</id><title type="html">Gorg’s Blog</title><subtitle>This is a small private blog to write my actual thougts, trends in programming and linux.</subtitle><entry><title type="html">Round based role playing game</title><link href="https://schore.github.io/software/software-engeneering/programming/2023/03/13/rbrpg.html" rel="alternate" type="text/html" title="Round based role playing game" /><published>2023-03-13T00:00:00+00:00</published><updated>2023-03-13T00:00:00+00:00</updated><id>https://schore.github.io/software/software-engeneering/programming/2023/03/13/rbrpg</id><content type="html" xml:base="https://schore.github.io/software/software-engeneering/programming/2023/03/13/rbrpg.html">&lt;p&gt;I started a side project a view month ago, which turned out to grow into a nice
game in which I got insights into various topics. In this post I like to share
this with all of you.&lt;/p&gt;

&lt;h2 id=&quot;the-start-of-the-side-project&quot;&gt;The start of the side project&lt;/h2&gt;

&lt;p&gt;I wanted to learn more about clojure and web development because I see how easy
it has become to create a simple user interface within a web browser.  The most
astonishing thing is that updates and installation are super easy from an users
point of view.&lt;/p&gt;

&lt;p&gt;This started to grow in a small game, which was inspired by nethack, however has
it’s unique gameplay elements. The current state of the game is far from
finished.&lt;/p&gt;

&lt;p&gt;I like to sketch out my learning journey in a series of blog posts. Hope you
enjoy this journey. Here is a small outline.&lt;/p&gt;

&lt;h2 id=&quot;architecture&quot;&gt;Architecture&lt;/h2&gt;

&lt;p&gt;Develop your core logic independent from technology. This allows you to deploy
your code into unplanned ways. In my case I decided to deploy this game to
github pages, which can only serve static pages.&lt;/p&gt;

&lt;h2 id=&quot;testing&quot;&gt;Testing&lt;/h2&gt;

&lt;p&gt;Surprise, surprise this is the most important thing. Without this testing
solution I would never come as far as in this project. It seems as a lot of
overhead, however it really allowed myself restructuring of my solution.&lt;/p&gt;

&lt;h2 id=&quot;continuous-deployment&quot;&gt;Continuous deployment&lt;/h2&gt;

&lt;p&gt;Keep it simple. I use a set of bash scripts instead of a full blown CI solution
and it works fine for the moment. In case a need to scale it is still pretty
simple to extend my current solution.&lt;/p&gt;

&lt;p&gt;I even abandon a working Jenkins Pipeline because the simpler solution was much
more stable and it simplified my work flow.&lt;/p&gt;</content><author><name>Georg</name></author><category term="software" /><category term="software-engeneering" /><category term="programming" /><summary type="html">I started a side project a view month ago, which turned out to grow into a nice game in which I got insights into various topics. In this post I like to share this with all of you.</summary></entry><entry><title type="html">The deadly math behind covid 19 death rates</title><link href="https://schore.github.io/covid/death/probabilities/math/2020/11/22/covid.html" rel="alternate" type="text/html" title="The deadly math behind covid 19 death rates" /><published>2020-11-22T00:00:00+00:00</published><updated>2020-11-22T00:00:00+00:00</updated><id>https://schore.github.io/covid/death/probabilities/math/2020/11/22/covid</id><content type="html" xml:base="https://schore.github.io/covid/death/probabilities/math/2020/11/22/covid.html">&lt;div id=&quot;app-covid&quot;&gt;
the probabilities
&lt;/div&gt;
&lt;script src=&quot;https://schore.github.io/asset/covid.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;

&lt;p&gt;During the pandemic I came across a meme which represents a set of covid 19
survival probabilities. Grouped in sets, so the numbers look really great. The
human mind doesn’t understand probabilities well, so I found a nice way to
visualize it.&lt;/p&gt;

&lt;p&gt;Let me explain the application and what it shows. The best way to do it, is an
example. Have a look at the following table. In case everybody catches the virus
the probability, that somebody will die is shown, as calculated in the
application above.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;People added&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Probabilities of at least one death&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Oneself&lt;/td&gt;
      &lt;td&gt;0.03 %&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Partner and kids&lt;/td&gt;
      &lt;td&gt;0.07 %&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Parents&lt;/td&gt;
      &lt;td&gt;5.19 %&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Brothers &amp;amp; sisters&lt;/td&gt;
      &lt;td&gt;5.30 %&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Aunts and uncles&lt;/td&gt;
      &lt;td&gt;18.11 %&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Friends and colleagues&lt;/td&gt;
      &lt;td&gt;22.46 %&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The probabilities are getting really awful in just a small number of steps, so
everyone should be careful about the ongoing pandemic. It is way more dangerous,
than the death rates look at the first glance. And as &lt;strong&gt;society&lt;/strong&gt; we decided to
contain the pandemic to protect our loved family and friends.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Stay home&lt;/li&gt;
  &lt;li&gt;Wear masks&lt;/li&gt;
  &lt;li&gt;Wash your hands&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;application-internals&quot;&gt;Application internals&lt;/h2&gt;

&lt;h3 id=&quot;data&quot;&gt;Data&lt;/h3&gt;

&lt;p&gt;The data used for the application are official death and survival rates from
Bavarian (Germany).&lt;/p&gt;

&lt;h2 id=&quot;application&quot;&gt;Application&lt;/h2&gt;

&lt;p&gt;The application is written in clojurescript and can be found on
&lt;a href=&quot;https://github.com/schore/covid19-deathrates&quot;&gt;github&lt;/a&gt;. Feel free to review and
improve this small application.&lt;/p&gt;

&lt;h2 id=&quot;math&quot;&gt;Math&lt;/h2&gt;

&lt;p&gt;I am not a math major or came across probability theory during my career. So
this is the math I used for the calculation.&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prob-or&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prob-or&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                     
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prob-pow&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Math/pow&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I don’t expect an error in this equations so the calculations should be
accurate.&lt;/p&gt;</content><author><name>Georg</name></author><category term="covid" /><category term="death" /><category term="probabilities" /><category term="math" /><summary type="html">the probabilities</summary></entry><entry><title type="html">Why software is so hard?</title><link href="https://schore.github.io/software/software-engeneering/programming/2020/09/20/what.html" rel="alternate" type="text/html" title="Why software is so hard?" /><published>2020-09-20T00:00:00+00:00</published><updated>2020-09-20T00:00:00+00:00</updated><id>https://schore.github.io/software/software-engeneering/programming/2020/09/20/what</id><content type="html" xml:base="https://schore.github.io/software/software-engeneering/programming/2020/09/20/what.html">&lt;p&gt;Software project are late, expensive and hard to estimate. This is no secret.
But why is this industry so successful compared to other engineering
disciplines. So why is software entering every aspect of life?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moving important decisions&lt;/strong&gt; to the end of the development life cycle is one
of the key points of success. Electronic gives some freedom in the design of
control loops. With software it is possible to move it further to the right and
nowadays even customers can change the drive characteristics of modern cars.&lt;/p&gt;

&lt;p&gt;So one common success story of electrical and software engineering is to move
the decision what to do further to the right of the development cycle. This is
in my opinion a crucial success factor, which also allowed to build general
purpose hardware.&lt;/p&gt;

&lt;h2 id=&quot;the-what&quot;&gt;The &lt;strong&gt;what&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Now everyone is building general purpose hardware and the software is going to
fix it. No problem at all, at least in theory. However the questions “What to
do?” is not answered in many product development projects. Agile processes try
to solve this by shortening the feedback loop.&lt;/p&gt;

&lt;p&gt;Every major company adapts agile methods, so it should improve in the next years
or? In theory yes but the agile process gets tailored to the company and now
they have an agile waterfall ;-). Not a single responsibility or decision get’s
transferred to the team and the feedback loop is removed entirely from the
process. The only difference is a stand-up in the morning and a two week
planning cycle. So there will be major delays in software projects. This will
take the industry a while to figure out.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer:&lt;/em&gt; I only have insight in two companies, so far and in one of them
there was a pretty good understanding of customer needs and an agile mindset,
however agility wasn’t a thing at all. So this posts reflects my personal
opinion and is not based on broad experience or research.&lt;/p&gt;</content><author><name>Georg</name></author><category term="software" /><category term="software-engeneering" /><category term="programming" /><summary type="html">Software project are late, expensive and hard to estimate. This is no secret. But why is this industry so successful compared to other engineering disciplines. So why is software entering every aspect of life?</summary></entry><entry><title type="html">Programming languages, which I learned</title><link href="https://schore.github.io/software/software-engeneering/programming/2020/09/17/programming-languages.html" rel="alternate" type="text/html" title="Programming languages, which I learned" /><published>2020-09-17T00:00:00+00:00</published><updated>2020-09-17T00:00:00+00:00</updated><id>https://schore.github.io/software/software-engeneering/programming/2020/09/17/programming-languages</id><content type="html" xml:base="https://schore.github.io/software/software-engeneering/programming/2020/09/17/programming-languages.html">&lt;p&gt;In my past I got in contact with an number of programming languages. In this
post I will list them and extract the key points, I learned or liked from the
language. This can be a variety of different things, like how simple something is
or brilliant concepts.&lt;/p&gt;

&lt;h2 id=&quot;cc&quot;&gt;C/C++&lt;/h2&gt;

&lt;p&gt;I am at home in the embedded world. So C and it’s successor C++ are the
languages the whole industry uses. Everything is possible with it, however it is
really easy to shoot yourself in the foot. The key benefit for this languages,
is to write device drivers. Also performance critical stuff may be written in C.&lt;/p&gt;

&lt;p&gt;C/C++ was my first programming language, which I used as professional. So this
language was the door opener for my career in software engineering. What can you
learn from this language? Understanding of the hardware and device drivers. It
allows you to tinker with it. If you are interested in how the world is
controlled, this is an important language for you.&lt;/p&gt;

&lt;h2 id=&quot;rust&quot;&gt;Rust&lt;/h2&gt;

&lt;p&gt;The new kid on the block in the embedded world. I never tried it on bare metal
devices myself, however it should be possible. The essence of the language is to
enforce safe programming.&lt;/p&gt;

&lt;p&gt;Rust doesn’t require a runtime so it is possible to get it running on a bare
metal platform, which I never tried. My experience with this language is my toy
&lt;a href=&quot;https://github.com/schore/rustparser&quot;&gt;project&lt;/a&gt;. So there are a number of
things, which you can get out of rust.&lt;/p&gt;

&lt;p&gt;First of all, the concept of ownership and borrowing. This is brilliant, no race
conditions, no memory leaks and so on. It practically removes by design an
enormous amount of traps, which are well known in C.&lt;/p&gt;

&lt;p&gt;Great type system. You get what you need. Struct and tuples are straight
forward. But the enums really rock.&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;enum&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IpAddr&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nf&quot;&gt;V4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;nf&quot;&gt;V6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What do we see here, enums can also have a value. This is basically a kind of
variant datatype. But if you try to access it in an unsafe way, or even don’t
consider defined values, you will get an compiler error. This makes your code
readable and robust at the same time.&lt;/p&gt;

&lt;p&gt;What else, does this language have more to show. Yes it has! This was the first
modern language, I encountered, which has no classes. My first thought wtf, why?
But this time is long gone. The object oriented paradigm is on the way down and
Rust shows how we can get over it.&lt;/p&gt;

&lt;h2 id=&quot;python&quot;&gt;Python&lt;/h2&gt;

&lt;p&gt;Personally I am not a big fan of python but this language has benefits and is
definitely one to look at. It is just so simple to get started and you can learn
it really quick. It is also often used for build scripts or to automate routine
tasks, and there it is really great. I get in touch with this language for
automation and you will probably too. What’s missing in my humbled opinion is a
type system. I like languages which allows, at least to define the function
arguments.&lt;/p&gt;

&lt;h2 id=&quot;haskell&quot;&gt;Haskell&lt;/h2&gt;

&lt;p&gt;What a language. I only played with it and it is hard to get your head around.
It was my first encounter with functional programming. The mathematical terms
used in the documentation and library doesn’t make the life easier. What did I
get out of the language.&lt;/p&gt;

&lt;p&gt;First of all, immutability is not a problem at all. It is a solution! No side
effects in the language are a great feature. If you don’t have side effects,
reasoning is easy. That enables you to read and test your code.&lt;/p&gt;

&lt;p&gt;And what else, partial function application.&lt;/p&gt;

&lt;div class=&quot;language-haskell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;plus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Num&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plus&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;add3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Num&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;add3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plus&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You don’t have to know each parameter of an function. Just apply some of the
parameter and you get a knew function. It is simple, however realizing that
this concept is powerful took me a long time.&lt;/p&gt;

&lt;p&gt;Lambdas, I was familiar with this concept, however hasn’t realized the power of
them. I am looking back now at the design patterns of the gang of four and see
them in a different light. These patterns solves how to inject functions from
outside. So basically the problems lambdas and higher order functions solve.&lt;/p&gt;

&lt;p&gt;I recommend you to have a look at this language. It really boosted my
understanding of computer science and broke my fixed view on object orientation.&lt;/p&gt;

&lt;h2 id=&quot;clojure&quot;&gt;Clojure&lt;/h2&gt;

&lt;p&gt;This is another really interesting language, which is based on lisp. It shows
you that almost no syntax is required in for an programming language.
This is so powerful because it allows meta programming. You write
programs, which basically write programs. Even “core” functionality of this
language, is written with itself, using macros.&lt;/p&gt;

&lt;p&gt;So what you can get out of it. Simplicity matters! The language is simple and
fulfills the requirements of a modern programming language. It’s core concept
is published in 1958 and still forms the base of a modern programming language.
So learning one lisp like language will serve you well.&lt;/p&gt;

&lt;h2 id=&quot;xtend&quot;&gt;Xtend&lt;/h2&gt;

&lt;p&gt;The last language, which I used professionally is xtend. It’s translated into
java and afterwards compiled to machine code. This language doesn’t give you a
lot of new concepts and it’s not worth learning this language for education. I
have used it to generate C/C++ code from a domain specific language using xtext.
So it’s basically a technology choice, which was made for this project and it
served us well. But don’t learn it to broaden your horizon.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;What is the next programming language you should have a look at. The answer is as
always it depends.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Language&lt;/th&gt;
      &lt;th&gt;reason&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Rust&lt;/td&gt;
      &lt;td&gt;You want to be on a bare metal platform and fiddle with bits&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Haskell&lt;/td&gt;
      &lt;td&gt;Getting into functional programming. These language is for you&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Clojure&lt;/td&gt;
      &lt;td&gt;Try something different and see the new old world&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;However, there are a lot of languages out in the wild. Choose the language,
which is fitting your task and career path. There is also another advice I came
across, while reading “The pragmatic programmer”. Learn the language of your
editor. This is the program you will spend most of the time, so learn to control
it.&lt;/p&gt;</content><author><name>Georg</name></author><category term="software" /><category term="software-engeneering" /><category term="programming" /><summary type="html">In my past I got in contact with an number of programming languages. In this post I will list them and extract the key points, I learned or liked from the language. This can be a variety of different things, like how simple something is or brilliant concepts.</summary></entry><entry><title type="html">Resources for software engeneering</title><link href="https://schore.github.io/software/software-engeneering/2020/09/04/se-resources.html" rel="alternate" type="text/html" title="Resources for software engeneering" /><published>2020-09-04T00:00:00+00:00</published><updated>2020-09-04T00:00:00+00:00</updated><id>https://schore.github.io/software/software-engeneering/2020/09/04/se-resources</id><content type="html" xml:base="https://schore.github.io/software/software-engeneering/2020/09/04/se-resources.html">&lt;p&gt;A twitter message inspired me to write the blog post, in order to share
resources, which I use to keep up in my role as software engineer. This list is
a snapshot.&lt;/p&gt;

&lt;h2 id=&quot;podcast&quot;&gt;Podcast&lt;/h2&gt;

&lt;p&gt;This are all podcasts I am subscribed to. I don’t have time to listen to every
episode, however I like to hear the podcasts, while I am driving or walking.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt; Podcast produced by
the IEEE&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://changelog.com/master&quot;&gt;Changelog Master&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://testguild.com/podcasts/&quot;&gt;Testguild&lt;/a&gt; The state of the art in test
automation&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/podcasts&quot;&gt;Technology Pdocast&lt;/a&gt; Podcast from
ThoughtWorks&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.heroku.com/podcasts/codeish&quot;&gt;Code[ish]&lt;/a&gt; Podcast from Heroku&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://corecursive.com/&quot;&gt;{CORECURSIVE}&lt;/a&gt; Functional programming podcast&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://softwareengineeringdaily.com/&quot;&gt;Software engineering daily&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.case-podcast.org/&quot;&gt;case&lt;/a&gt; Conversations about software engineering&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.sei.cmu.edu/publications/podcasts/&quot;&gt;SEI Podcasts&lt;/a&gt; Podcast from
the Carnegie Mellon University about software engineering&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.software-engineering-unlocked.com/&quot;&gt;Software engineering unlocked&lt;/a&gt; Great podcast,
almost every single podcast is worth to listen to.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://techtiefen.de/&quot;&gt;Tech tiefen&lt;/a&gt; &lt;em&gt;German&lt;/em&gt; Introductions to new
technologies.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.heise.de/developer/SoftwareArchitekTOUR-4076349.html&quot;&gt;Heise Developer&lt;/a&gt;
&lt;em&gt;German&lt;/em&gt; German podcast about software architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;youtube&quot;&gt;Youtube&lt;/h2&gt;

&lt;p&gt;Youtube is a great resource for software engineering talks. I listened to a lot
of talks on this platform. Here you can find really inspiring talks on almost
every technical topic. If anyone is interested, I will try to find my favorite
talks.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/1xQeXOz0Ncs&quot;&gt;Who Destroyed Three Mile Island? - Nickolas Means&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/6nSwRSbc27g&quot;&gt;BDD Is Not About Testing - Dan North&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The great thing is, you will find for almost every topic a conference talk,
which is really a resource to deep dive in a particular context. I watched the
talks while I was ironing.&lt;/p&gt;

&lt;h2 id=&quot;websites&quot;&gt;Websites&lt;/h2&gt;

&lt;p&gt;These are some blogs I subscribed with an RSS feed reader.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.grimm-jaud.de/index.php/blog&quot;&gt;Modernes c++&lt;/a&gt; &lt;em&gt;German&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.cleancoder.com&quot;&gt;Uncle Bob&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://vasters.com/blog&quot;&gt;Clemens Vaster Blog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://martinfowler.com/&quot;&gt;Martin Fowler&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://softwarily.tumblr.com/rss&quot;&gt;Softwarily&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the blog doesn’t have an rss feed it is useless for me. I am not checking
software engineering resources manually.&lt;/p&gt;

&lt;h2 id=&quot;books&quot;&gt;Books&lt;/h2&gt;

&lt;p&gt;Books are also a great resource. Some of them a really inspiring. Here are my
favorites&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The Pragmatic Programmer, David Thomas&lt;/li&gt;
  &lt;li&gt;Domain-Driven Design, Eric J. Evans&lt;/li&gt;
  &lt;li&gt;The Phoenix Project, Gene Kim&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;twitter&quot;&gt;Twitter&lt;/h2&gt;

&lt;p&gt;There is also social media, which can help to get to new insights in software
engineering. However this medium also needs a lot of attention, which not always
increase your productivity. Just in case you are interested, you can find them
&lt;a href=&quot;https://twitter.com/schoreI/following&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content><author><name>Georg</name></author><category term="software" /><category term="software-engeneering" /><summary type="html">A twitter message inspired me to write the blog post, in order to share resources, which I use to keep up in my role as software engineer. This list is a snapshot.</summary></entry><entry><title type="html">Writing an parser in clojure</title><link href="https://schore.github.io/programming/clojure/2020/02/25/parsing-in-clojure.html" rel="alternate" type="text/html" title="Writing an parser in clojure" /><published>2020-02-25T00:00:00+00:00</published><updated>2020-02-25T00:00:00+00:00</updated><id>https://schore.github.io/programming/clojure/2020/02/25/parsing-in-clojure</id><content type="html" xml:base="https://schore.github.io/programming/clojure/2020/02/25/parsing-in-clojure.html">&lt;p&gt;I am not sure why, but I like to write a parser. There are my learning projects
for a new programming languages. In order to achieve this goal it is necessary
to ensure, that you understand, what a parser is and how you can combine them.&lt;/p&gt;

&lt;h2 id=&quot;what-is-a-parser&quot;&gt;What is a parser&lt;/h2&gt;

&lt;p&gt;A parser is function which takes a string and returns maybe a result of any type
and the rest of the string. The type signature in haskell my look something like
this.&lt;/p&gt;

&lt;div class=&quot;language-haskell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kr&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Parser&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Maybe&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So a Parser is a function, which takes an String and returns a type and the rest
of the string. It is very important, that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a&lt;/code&gt; is a variable type. 
This signature allows to implement parsers with different kind of complexities.
One which only returns a static value on the one hand and on the other hand a parser
for an complete programming language like C++.&lt;/p&gt;

&lt;p&gt;So the challenge now is to combine parser, so you can build up your syntax with
small simple parser.&lt;/p&gt;

&lt;h2 id=&quot;transform-the-parser&quot;&gt;Transform the parser&lt;/h2&gt;

&lt;p&gt;If you have an parser which gives you an string of numbers and it is necessary
to return an integer, transforming the parser is necessary. In haskell you would
write a function like fmap.&lt;/p&gt;

&lt;div class=&quot;language-haskell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;fmap&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Parser&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Parser&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the next snippet you can see the example to transform an character array of
numbers to an integer. In this snippet it is not obvious, that
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pUnsignedInt&lt;/code&gt; is an function, which takes an string and returns an Integer.&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pUnsignedInt&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;fmap&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;read-string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;psome&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pNumber&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It is even possible to construct an parser which evaluates the given string.&lt;/p&gt;

&lt;h2 id=&quot;combining-parser&quot;&gt;Combining parser&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;transition stateA -&amp;gt;         stateB
&amp;lt;keyword&amp;gt;  &amp;lt;id&amp;gt;   &amp;lt;keyword&amp;gt;  &amp;lt;id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The next challenge is to combine parsers, so that it’s possible to get the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;id&amp;gt;&lt;/code&gt; 
values from and to. The type signature in haskell would look exactly
like this. In haskell you would use the following type signature for the combination.&lt;/p&gt;

&lt;div class=&quot;language-haskell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;::&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Parser&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Parser&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Parser&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The trick here is, to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&amp;gt;=&lt;/code&gt; function also as part of the function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;( a -&amp;gt; Parser b )&lt;/code&gt; 
So here is an example from clojure.&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cleanWhitespace&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;pkeyword&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;transition&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cleanWhitespace&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pword&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cleanWhitespace&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;pkeyword&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;-&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cleanWhitespace&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pword&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;pure&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:transiton&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;true,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:from&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:to&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}))))))))))))))))))))))))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So the first parser gets applied. If it is successful the function given by the
second argument is applied. This function also executes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;&amp;gt;=&lt;/code&gt;. So the 
parser &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(pkeyword &quot;transition&quot;)&lt;/code&gt; gets applied. This goes on until the parser
created by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(pure {:transiton true, :from from, :to to})&lt;/code&gt; gets returned.
The values &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;to&lt;/code&gt; are extracted from an arbitrary function
parameter.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In writing this parser I think I got functors, applicative and monads. However I
am not 100% sure. This is hard topic. If you are interested in the sources check
it out on &lt;a href=&quot;https://github.com/schore/parser&quot;&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are also some additional readings which are really useful and in a higher
quality than this blog post.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://learnyouahaskell.com/functors-applicative-functors-and-monoids&quot;&gt;http://learnyouahaskell.com/functors-applicative-functors-and-monoids&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://learnyouahaskell.com/a-fistful-of-monads&quot;&gt;http://learnyouahaskell.com/a-fistful-of-monads&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html&quot;&gt;http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/&quot;&gt;http://leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Gorg</name></author><category term="programming" /><category term="clojure" /><summary type="html">I am not sure why, but I like to write a parser. There are my learning projects for a new programming languages. In order to achieve this goal it is necessary to ensure, that you understand, what a parser is and how you can combine them.</summary></entry><entry><title type="html">Programming NoTacToe in clojure(script)</title><link href="https://schore.github.io/programming/clojure/2019/12/25/clojure-no-tac-toe.html" rel="alternate" type="text/html" title="Programming NoTacToe in clojure(script)" /><published>2019-12-25T00:00:00+00:00</published><updated>2019-12-25T00:00:00+00:00</updated><id>https://schore.github.io/programming/clojure/2019/12/25/clojure-no-tac-toe</id><content type="html" xml:base="https://schore.github.io/programming/clojure/2019/12/25/clojure-no-tac-toe.html">&lt;p&gt;In order to get a first overview in clojure I decided to program tic tac toe in
clojure. However there is also a clojure to javascript compiler, which allows me
to use a web browser for visualization. So I used clojurescript.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/asset/notactoe.png&quot; alt=&quot;notactoe&quot; /&gt;&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;In this picture all winning moves are green, loosing moves are red.&lt;/p&gt;

&lt;h2 id=&quot;the-game&quot;&gt;The game&lt;/h2&gt;

&lt;p&gt;The game is a variant of tic tac toe only with crosses. I found the rules of the
game, by watching &lt;a href=&quot;https://www.youtube.com/watch?v=ktPvjr1tiKk&quot;&gt;NumberPhile on
Youtube&lt;/a&gt;. This game is solved,
which means that the first player can always win on a three board game. The
winning strategy is explained in the
&lt;a href=&quot;https://arxiv.org/pdf/1301.1672v1.pdf&quot;&gt;paper&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-implementation&quot;&gt;The implementation&lt;/h2&gt;

&lt;p&gt;You can find the whole code of the implementation on
&lt;a href=&quot;https://github.com/schore/notactoe&quot;&gt;github&lt;/a&gt;. The structure of the code is not
consistent and far away from being perfect. It is my first clojure project.&lt;/p&gt;

&lt;h3 id=&quot;getting-the-value-of-a-single-board&quot;&gt;Getting the value of a single board&lt;/h3&gt;

&lt;p&gt;The first task was to map the different boards to it’s misere quotient.&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nonisomorphic-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However there are many position which are equivalent and so the computer should
do this work. Therefor I created two function to rotate the board. So the
complete map is created. The last step is pretty easy. Get the value by a lookup
in the map.&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mirror-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;second&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mirror-board-horizontal&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mirror-board-vertical&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mirror-board-vertical&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mirror-board-horizontal&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;


&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rotate-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;second&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;rotate-board&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;complete-map-generator&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mapcat&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mirror-map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mapcat&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rotate-map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;into&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{})))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;calculating-the-misere-quotient&quot;&gt;Calculating the misere quotient&lt;/h3&gt;

&lt;p&gt;After the lookup in the table of more then one board i get an structure like [:a
:b :a :c]. Because this is hard to work with a conversion to the simpler form
{:a 2 :b 0 :c 1 :d 0} is required. This allows me to use the following function
to compute the board. This table is also from the paper. The second function
applies the reduce-table function until nothing changes.&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reduce-table&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Reduces a complex input to a simpler form&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;cond&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
         &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;dec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
         &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:d&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
         &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:d&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;dec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:d&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;partial&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:d&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:else&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reduce-board&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;reduces teh game to it's simplest form&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;board&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;newboard&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;reduce-table&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;board&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;newboard&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;board&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;board&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;recur&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;newboard&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Everything else in this project are functions to display or select the moves for
visualization and testing. However this function are far from perfect or
complete.&lt;/p&gt;

&lt;h2 id=&quot;testing&quot;&gt;Testing&lt;/h2&gt;

&lt;p&gt;There is also an important topic which I scratched only on the edge testing. I
had no idea if my code is working. Especially the reduce functions. I used
&lt;a href=&quot;https://clojure.github.io/test.check/intro.html&quot;&gt;test.check&lt;/a&gt; to verify my code.
The main idea is to define a property, which has to be fulfilled. A random input
is generated and the properties are checked against an input.&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gen-boards&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;gen/hash-map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gen/nat&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gen/nat&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gen/nat&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:d&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gen/nat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reduce-board-test&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;prop/for-all&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gen-boards&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;reduce-board&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tranfsform-table&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;possible-endresults&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;tc/quick-check&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reduce-board-test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The 1000 passing random tests here made me pretty confident, to say “This
function is working” So I can go on with the project.&lt;/p&gt;

&lt;h1 id=&quot;summary&quot;&gt;Summary&lt;/h1&gt;

&lt;p&gt;Clojure has interesting concept and it is very easy to get started. However you
should understand the basic principles of functional programming. I have one
headache in clojure, the missing types. Maybe I can find the right way to handle
types in the spec library.&lt;/p&gt;

&lt;h1 id=&quot;installation&quot;&gt;Installation&lt;/h1&gt;

&lt;p&gt;So if you are interested, there are some steps in order to play the game.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Install &lt;a href=&quot;https://leiningen.org/&quot;&gt;lein&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;git clone https://github.com/schore/notactoe.git&lt;/li&gt;
  &lt;li&gt;lein figwheel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this works, however I am not sure. Don’t hesitate to ask me in case of
problems.&lt;/p&gt;

&lt;h1 id=&quot;the-game-1&quot;&gt;The game&lt;/h1&gt;

&lt;p&gt;Here I managed to export a compiled version, which you can play right now.&lt;/p&gt;

&lt;div id=&quot;app&quot;&gt;
The game itself
&lt;/div&gt;
&lt;script src=&quot;https://schore.github.io/asset/tictactoe.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</content><author><name>Gorg</name></author><category term="programming" /><category term="clojure" /><summary type="html">In order to get a first overview in clojure I decided to program tic tac toe in clojure. However there is also a clojure to javascript compiler, which allows me to use a web browser for visualization. So I used clojurescript.</summary></entry><entry><title type="html">Macht das Internet nich kaputt!!</title><link href="https://schore.github.io/politik/uploadfilter/urheberrechte/2019/02/22/uploadfilter.html" rel="alternate" type="text/html" title="Macht das Internet nich kaputt!!" /><published>2019-02-22T00:00:00+00:00</published><updated>2019-02-22T00:00:00+00:00</updated><id>https://schore.github.io/politik/uploadfilter/urheberrechte/2019/02/22/uploadfilter</id><content type="html" xml:base="https://schore.github.io/politik/uploadfilter/urheberrechte/2019/02/22/uploadfilter.html">&lt;p&gt;Im Moment ist die Diskussion über Uploadfilter wieder im vollen Gange. Wenn man
sich überlegt was man damit erreichen will ist der Schutz der Urheber,
Filmstudios und Presseverleger. Diese haben ein berechtigtes Interesse ihre
Rechte zu verteidigen. Man muss hier allerdings auch in Betracht ziehen das
diese Organisation sich auch verteidigen können. Darum haben wir auch leider
diese aktuelle Debatte.&lt;/p&gt;

&lt;h2 id=&quot;der-aktuelle-entwurf&quot;&gt;Der aktuelle Entwurf&lt;/h2&gt;

&lt;p&gt;Sieht vor, das sich Plattformen mit nutzergenerierten Inhalten dazu verpflichtet
sind “angemessene und verhältnismäßige Maßnahmen” zu ergreifen um die
Urheberrechte der Verlage zu schützen. Was das bedeutet wissen wahrscheinlich
nicht mal Juristen oder Politiker. Ich denke das da nur ein herauskommt kann:
&lt;em&gt;Uploadfilter&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;uploadfilter&quot;&gt;Uploadfilter&lt;/h3&gt;

&lt;p&gt;Jedes hochgeladenes Video, Bild, Aufnahme oder Text muss von den Plattformen auf
Urheberrechte überprüft werden. Das ist natürlich extrem schwer. Sogar bei Text
ist es fast unmöglich. Bitte macht jetzt einmal ein Gedankenexperiment. Ihr seit
eine Plattform und überprüft folgenden Post auf Verletzung von Urheberrechten.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The frolicsome Wife of Bath, when called upon to favour the company, protested
that she had no aptitude for such things, but that her fourth husband had had
a liking for them, and she remembered one of his riddles that might be new to
her fellow pilgrims: “Why is a bung that hath been made fast in a barrel like
unto another bung that is just falling out of a barrel?” As the company
promptly answered this easy conundrum, the lady went on to say that when she
was one day seated sewing in her private chamber her son entered. “Upon
receiving,” saith she, “the parental command, ‘Depart, my son, and do not
disturb me!’ he did reply, ‘I am, of a truth, thy son; but thou art not my
mother, and until thou hast shown me how this may be I shall not go forth.’”
This perplexed the company a good deal, but it is not likely to give the
reader much difficulty.&lt;/p&gt;

  &lt;p&gt;– The Canterbury Puzzles - Henry Dudeney&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ich habe das ganze aus einem Buch kopiert, dessen Autor schon vor über 70 Jahren
gestorben ist, wodurch der Text gemeinfrei ist. Jetzt denkt euch aber bitte mal
die Quellenangabe weg.&lt;/p&gt;

&lt;p&gt;Ihr könntet den Text in Google eingeben und würdet den Autor und Buch finden und
nach kurzer Recherche selbst herausfinden, dass der Text bereits gemeinfrei ist.
Aber als Anbieter einer Plattform fallen sämtliche Suchmaschinen weg. Oder ihr
Nutzt deren Service, welche man in diesem Fall nicht umsonst bekommt.&lt;/p&gt;

&lt;p&gt;Textanalyse ist ein weitere Möglichkeit. Man stellt also jetzt fest, dass dies
ein Text ist welcher nicht mit meinen üblichen Stil überein stimmt. Also lieber
einmal Blocken? Jetzt wollte ich aber nur einmal über ein sehr altes Rätsel
schreiben.&lt;/p&gt;

&lt;p&gt;Jetzt denkt das ganze weiter. Ihr bekommt von einem Bekannten ein Kochrezept,
fotografiert es und stellte es ins Internet. Ihr habt jetzt das Urheberrecht
verletzt. Muss jetzt die Plattform dafür haften? Lange Rede kurzer Sinn.
&lt;strong&gt;Uploadfilter funktionieren nicht&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;löschpflichten&quot;&gt;Löschpflichten&lt;/h3&gt;

&lt;p&gt;Man muss nicht lizenzierte Inhalte nach dem melden der Rechteinhaber löschen.
Das hört sich nicht so schlecht an. Aber gibt es die aktuelle Rechtslage nicht
schon her? Würde mich wundern wenn nicht. Warum werden dann die ganzen illegalen
Streaming Plattformen im nicht europäischen Ausland betrieben? Ich bin jetzt
allerdings kein Jurist und kann dazu keine detaillierte Aussage treffen.&lt;/p&gt;

&lt;p&gt;Der Nachteil davon ist jedoch, dass man dann als Rechteinhaber am wesentlich
kürzeren Hebel sitzt und es sehr aufwendig ist seine Ansprüche durchzusetzen.&lt;/p&gt;

&lt;h2 id=&quot;mein-reformvorschlag&quot;&gt;Mein Reformvorschlag&lt;/h2&gt;

&lt;p&gt;Ich würde in die andere Richtung gehen. Das Urheberrecht schränkt baut Paywalls
auf. Diese verhindern die freie legale Nutzung von Inhalten. Zum Beispiel ist
die Internetseite &lt;a href=&quot;https://www.gutenberg.org&quot;&gt;Gutenberg.org&lt;/a&gt; nicht möglich aus
Deutschland legale Inhalte zu bekommen. Dies hindert uns in der freien
Entfaltung und Bildung. Als Autor will ich dennoch von meiner Aufwendigen Arbeit
leben.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;25 Jahre nach Veröffentlichung geht das Werk in die Geneinfreiheit über.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dies gibt Rechteinhaber noch immer die Möglichkeit Geld zu verdienen und uns
aber auch die Möglichkeit viele Inhalte frei zu teilen und nutzen. Dagegen wird
versucht die Reichen noch Reicher zu machen und uns allen Zugang zu Bildung und
Unterhaltung etwas Kosten zu lassen.&lt;/p&gt;

&lt;!-- LocalWords: Uploadfilter nutzergenerierten --&gt;</content><author><name>Gorg</name></author><category term="Politik" /><category term="Uploadfilter" /><category term="Urheberrechte" /><summary type="html">Im Moment ist die Diskussion über Uploadfilter wieder im vollen Gange. Wenn man sich überlegt was man damit erreichen will ist der Schutz der Urheber, Filmstudios und Presseverleger. Diese haben ein berechtigtes Interesse ihre Rechte zu verteidigen. Man muss hier allerdings auch in Betracht ziehen das diese Organisation sich auch verteidigen können. Darum haben wir auch leider diese aktuelle Debatte.</summary></entry><entry><title type="html">Mail is dead, long live the mail</title><link href="https://schore.github.io/email/gpg/2019/02/12/mail.html" rel="alternate" type="text/html" title="Mail is dead, long live the mail" /><published>2019-02-12T17:00:00+00:00</published><updated>2019-02-12T17:00:00+00:00</updated><id>https://schore.github.io/email/gpg/2019/02/12/mail</id><content type="html" xml:base="https://schore.github.io/email/gpg/2019/02/12/mail.html">&lt;p&gt;Die EMail hat heute einige Problem unter anderem Spam und fehlende Ende zu Ende
Verschlüsslung. Für das zweite würde es eine Lösung geben, welche leider nicht
genutzt wird. In meiner naiven Vorstellung könnte das ganze einfach
funktionieren, in dem man auf den Plattformen seinen öffentlichen Schlüssel
hoch lädt. Jede ausgehende EMail wird anschließend verschlüsselt. Vor allem
Banken oder Behörden sollten diese Funktion anbieten, aber statt dessen
entwickeln diese aber lieber nutzlose Banking Apps. Es gibt sogar ein Wordpress
plugin, welches ermöglicht die ausgehenden Mails zu verschlüsseln (&lt;a href=&quot;https://de.wordpress.org/plugins/wp-pgp-encrypted-emails/&quot;&gt;wp
pgp&lt;/a&gt;).&lt;/p&gt;

&lt;!--more--&gt;
&lt;p&gt;Ich denke jetzt allerdings darüber nach, wie ich es besser machen kann? Dazu fällt
mir jetzt folgendes ein.&lt;/p&gt;

&lt;h2 id=&quot;den-eigenen-schlüssel-veröffentlichen&quot;&gt;Den eigenen Schlüssel veröffentlichen&lt;/h2&gt;

&lt;p&gt;Das geht sehr einfach gpg2 stellt die Tools dafür bereit.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gpg2 &lt;span class=&quot;nt&quot;&gt;--send-keys&lt;/span&gt; &amp;lt;YOUR-KEY-ID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;ich habe meinen Schlüssel gerade eben veröffentlicht. Diesen kann man mit
folgendem Kommando importieren.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gpg2 &lt;span class=&quot;nt&quot;&gt;--receive-keys&lt;/span&gt; 8CEB9390FB29A03D
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;mail-signatur&quot;&gt;Mail Signatur&lt;/h2&gt;

&lt;p&gt;Eigentlich ganz einfach, in enigmail gibt es dazu sogar eine Einstellung.&lt;/p&gt;

&lt;h2 id=&quot;euch-fragen&quot;&gt;Euch Fragen&lt;/h2&gt;

&lt;p&gt;Was fällt euch noch ein kann, wie kann man seine Mailpartner noch dazu bringen
zu verschlüsseln. Wenn ihr Lust habt könnt ihr gerne auf der Mailingliste
darüber diskutieren.&lt;/p&gt;</content><author><name>gorg</name></author><category term="email" /><category term="gpg" /><summary type="html">Die EMail hat heute einige Problem unter anderem Spam und fehlende Ende zu Ende Verschlüsslung. Für das zweite würde es eine Lösung geben, welche leider nicht genutzt wird. In meiner naiven Vorstellung könnte das ganze einfach funktionieren, in dem man auf den Plattformen seinen öffentlichen Schlüssel hoch lädt. Jede ausgehende EMail wird anschließend verschlüsselt. Vor allem Banken oder Behörden sollten diese Funktion anbieten, aber statt dessen entwickeln diese aber lieber nutzlose Banking Apps. Es gibt sogar ein Wordpress plugin, welches ermöglicht die ausgehenden Mails zu verschlüsseln (wp pgp).</summary></entry><entry><title type="html">Mailingliste</title><link href="https://schore.github.io/personal/blog/2019/02/02/mailingliste.html" rel="alternate" type="text/html" title="Mailingliste" /><published>2019-02-02T20:15:00+00:00</published><updated>2019-02-02T20:15:00+00:00</updated><id>https://schore.github.io/personal/blog/2019/02/02/mailingliste</id><content type="html" xml:base="https://schore.github.io/personal/blog/2019/02/02/mailingliste.html">&lt;p&gt;Ich würde gerne selbst eine Mailingliste aufzusetzen, dies würde aber sehr
wahrscheinlich dazu führen, das die Mails ausschließlich im Spamordner landen.
Darum habe ich im Internet geforscht und bin auf folgende Provider gestoßen.&lt;/p&gt;

&lt;p&gt;Da ich erst mal kein Geld für den Blog ausgeben will fallen einige Provider weg.
Es stehen noch folgende Plattformen zur Auswahl.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://groups.google.com/&quot;&gt;Google Groups&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Habe bis jetzt noch kein Google und will auch keines erstellen&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://groups.yahoo.com/neo&quot;&gt;Yahoo&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Das selbe wie Google, nur in einer anderen Farbe&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://lists.riseup.net/www/&quot;&gt;Riseup&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Nur politische Listen mit einem radikalen sozialen Wandel erwünscht&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.freelists.org/&quot;&gt;Freelists&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Meine Wahl.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;!--more--&gt;
&lt;h1 id=&quot;recherche&quot;&gt;Recherche&lt;/h1&gt;

&lt;p&gt;Zu Beginn bin ich auf diesen
&lt;a href=&quot;https://www.huridocs.org/2016/06/setting-up-an-email-discussion-list-for-a-security-conscious-community&quot;&gt;Blog&lt;/a&gt;
gestoßen. Hier sind allerdings überwiegend Server für Mailinglisten aufgeführt.
Dieser Eintrag war also eher weniger zielführend. Ein weiterer
&lt;a href=&quot;https://mail-list.com/how-to-create-an-email-discussion-group/&quot;&gt;Post&lt;/a&gt; hat mich
weiter gebracht. Hier sind zumindest einige Hoster aufgeführt.&lt;/p&gt;

&lt;h2 id=&quot;googleyahoo-groups&quot;&gt;Google/Yahoo Groups&lt;/h2&gt;

&lt;p&gt;Ich will nicht zu Google/Yahoo. Diese Unternehmen wissen eh schon viel zu viel.&lt;/p&gt;

&lt;h2 id=&quot;riseup&quot;&gt;Riseup&lt;/h2&gt;

&lt;p&gt;Ich war kurz davor eine Mailingliste zu erstellen und habe folgende Aussage
gefunden.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;The only requirement is that the list must be used for radical social change.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Dies trifft auf mich sicherlich nicht zu. Daher fällt dieser Provider leider
weg.&lt;/p&gt;

&lt;h2 id=&quot;freelist&quot;&gt;Freelist&lt;/h2&gt;

&lt;p&gt;Diese Website scheint einiges besser aus. Meiner Meinung nach erfüllt diese voll
und ganz meine Erwartungen an einen Mailingliste Provider. Ich habe sogar die
AGB gelesen und darin steht alles so wie ich es mir vorstelle.&lt;/p&gt;

&lt;h1 id=&quot;einrichtung&quot;&gt;Einrichtung&lt;/h1&gt;

&lt;p&gt;Es scheint zumindest auf den ersten Blick sehr einfach. Einfach ein paar
Formularfelder ausfüllen und dann bis zu 24 Stunden warten. Danach war die Liste
online und konnte ohne Probleme genutzt werden.&lt;/p&gt;

&lt;h1 id=&quot;nutzung&quot;&gt;Nutzung&lt;/h1&gt;

&lt;p&gt;Ihr könnt jetzt einfach loslegen. Unter
&lt;a href=&quot;https://www.freelists.org/list/gorgs.blog&quot;&gt;Freelists&lt;/a&gt; kann man sich
registrieren. Danach könnt Ihr diese Mailingliste nutzen. Bedenkt jedoch das
diese Liste weder von mir gehosted noch betrieben wird. Ich habe keinen Zugriff
auf Daten, Logdateien und so weiter.&lt;/p&gt;

&lt;p&gt;Es ist wichtig zu wissen, dass wenn Ihr eine Mail schreibt wird die Mailadresse
auch in einem Archiv veröffentlicht (in der Form &lt;a href=&quot;mailto:schore.r@xxxxxx&quot;&gt;schore.r@xxxxxx&lt;/a&gt;). Auch alle
anderen Nutzer der Mailingliste werden eure Mailadresse in voller Schönheit
sehen können, sobald ihr posted.&lt;/p&gt;

&lt;p&gt;Um einen Beitrag zu schreiben müsst ihr einfach an gorgs.blog@freelists.org
schreiben. Ich würde mich sehr freuen wenn hier ein kleines Diskussionsforum
entsteht.&lt;/p&gt;</content><author><name></name></author><category term="Personal" /><category term="Blog" /><summary type="html">Ich würde gerne selbst eine Mailingliste aufzusetzen, dies würde aber sehr wahrscheinlich dazu führen, das die Mails ausschließlich im Spamordner landen. Darum habe ich im Internet geforscht und bin auf folgende Provider gestoßen. Da ich erst mal kein Geld für den Blog ausgeben will fallen einige Provider weg. Es stehen noch folgende Plattformen zur Auswahl. Google Groups Habe bis jetzt noch kein Google und will auch keines erstellen Yahoo Das selbe wie Google, nur in einer anderen Farbe Riseup Nur politische Listen mit einem radikalen sozialen Wandel erwünscht Freelists Meine Wahl.</summary></entry></feed>