<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Ragmaanir's Blog</title>
  <id>http://blog.url.com/</id>
  <link href="http://blog.url.com/"/>
  <link href="http://blog.url.com/feed.xml" rel="self"/>
  <updated>2025-06-06T02:00:00+02:00</updated>
  <author>
    <name>Blog Author</name>
  </author>
  <entry>
    <title>Ghost Logic</title>
    <link rel="alternate" href="http://blog.url.com/2025/06/06/ghost-logic.html"/>
    <id>http://blog.url.com/2025/06/06/ghost-logic.html</id>
    <published>2025-06-06T02:00:00+02:00</published>
    <updated>2025-06-06T18:20:42+02:00</updated>
    <author>
      <name>Article Author</name>
    </author>
    <content type="html">&lt;p&gt;Ghost Logic is dead or unnecessary code that leads the reader to make false assumptions about values and states.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;An example is better than a thousand words:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight crystal"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;recalculate_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Int32&lt;/span&gt;&lt;span class="p"&gt;?,&lt;/span&gt; &lt;span class="n"&gt;iq&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Float32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wealth&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Money&lt;/span&gt;&lt;span class="p"&gt;?)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;PersonalScore&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;PersonalScore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;UNKNOWN&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;PersonalScore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;UNKNOWN&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;money&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;PersonalScore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;CHILD&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iq&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="no"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"Unusual IQ: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;iq&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;PersonalScore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;OUTLIER&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;age_factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

  &lt;span class="c1"&gt;# the formula is not important for the example&lt;/span&gt;
  &lt;span class="no"&gt;PersonalScore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age_factor&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;iq&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wealth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ignore the formula for the score. The point is this: What if the system only handles people 18+, every person has an age, all IQs are normalized to be lower than 200 and every person has a money amount set? All of the if-statements are now effectively dead code (without the compiler knowing). But this is not obvious to the reader that is not familiar with the entire system / code-base. The reader starts making assumptions from reading the conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It looks like there are people without known age&lt;/li&gt;
&lt;li&gt;It looks like it is possible for children (age &amp;lt; 18) to be in the system&lt;/li&gt;
&lt;li&gt;It looks like there might be people with IQ &amp;gt; 200&lt;/li&gt;
&lt;li&gt;It looks like there might be people with an unknown amount of money&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is ghost logic. The worst thing is that this ghost logic can spread throughout the code base. The programmer learns the ghost logic from this method and later does modifications in other parts of the program. He notices that those special cases above were not handled and adds logic for that into other places, even in tests. The ghost logic spreads kinda like a meme or a myth.&lt;/p&gt;

&lt;p&gt;The ghost logic is more likely to spread if the logic is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;very believable&lt;/li&gt;
&lt;li&gt;hard to debunk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E.g. the parameters for &lt;code&gt;recalculate_score&lt;/code&gt; might be deserialized from a queue made up of JSON messages. Then there is no easy way to use tooling to check for possible values and where they might come from. In addition, the values might be exceptionally rare, so you might not see them during testing.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The Ultimate Martyr</title>
    <link rel="alternate" href="http://blog.url.com/2023/07/05/the-ultimate-martyr.html"/>
    <id>http://blog.url.com/2023/07/05/the-ultimate-martyr.html</id>
    <published>2023-07-05T02:00:00+02:00</published>
    <updated>2023-07-11T16:26:38+02:00</updated>
    <author>
      <name>Article Author</name>
    </author>
    <content type="html">&lt;p&gt;Jesus was not really a martyr. His sacrifice was small. Here is the Ultimate Martyr.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;Jesus Did Not Die&lt;/h2&gt;

&lt;p&gt;When you &amp;ldquo;die&amp;rdquo;, but then you actually go to heaven, that&amp;rsquo;s not &amp;ldquo;dying&amp;rdquo;. You are just being teleported to a different place. Therefore Jesus isn&amp;rsquo;t really a martyr. Not just that. He is teleportet to &lt;strong&gt;heaven&lt;/strong&gt;, which by definition is a better place than earth. So it isn&amp;rsquo;t really a sacrifice. The only thing that you can count in his favor is the torment that he endured while on earth.&lt;/p&gt;

&lt;h2&gt;The Ultimate Martyr&lt;/h2&gt;

&lt;p&gt;Infants go to heaven when they die or are killed. If they grow up, there is a chance that they could end up in hell. So the ultimate martyr would deliberately kill infants to guarantee that they end up in heaven (&lt;em&gt;possibly baptizing them first, depending on the myth you subrscribe to&lt;/em&gt;). For killing the infants, the ultimate martyr would go to hell as an &lt;strong&gt;eternal&lt;/strong&gt; punishment. So, this martyr sacrifices his possible place in heaven for a definite place in hell in order to guarantee a place in heaven for all the infants he kills. Therefore, he is the &lt;strong&gt;Ultimate Martyr&lt;/strong&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Java Teaches Bad Habits</title>
    <link rel="alternate" href="http://blog.url.com/2022/09/02/java-teaches-bad-habits.html"/>
    <id>http://blog.url.com/2022/09/02/java-teaches-bad-habits.html</id>
    <published>2022-09-02T02:00:00+02:00</published>
    <updated>2022-09-03T02:05:35+02:00</updated>
    <author>
      <name>Article Author</name>
    </author>
    <content type="html">&lt;p&gt;Java is a popular programming language, but it teaches bad habits and bad OOP. Here are my reasons and opinions.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;Interface Inflation&lt;/h2&gt;

&lt;p&gt;Because Java was designed without lambda functions/closures, hundreds of unnecessary single-method interfaces had to be added. E.g. all kinds of &lt;code&gt;XyzListeners&lt;/code&gt;. If the language had lambdas from the start, these interfaces could have been replaced by simple function signatures. Instead they now haunt the standard APIs.&lt;/p&gt;

&lt;h2&gt;Naming Things In Java Is More Than Just &amp;lsquo;Hard&amp;rsquo;&lt;/h2&gt;

&lt;p&gt;Here are some examples that make me want to cry:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AbstractCookieValueMethodArgumentResolver
AbstractEncoderMethodReturnValueHandler
RequestMappingInfoHandlerMethodMappingNamingStrategy
TimeoutDeferredResultProcessingInterceptor
TransactionalApplicationListenerMethodAdapter
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These are straight from the spring framework. These kind of naming patterns seem to be very common in Java in general. I rarely see similar patterns in other languages. Why is that?&lt;/p&gt;

&lt;p&gt;I think there are multiple reasons to this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unique Names and Packages&lt;/li&gt;
&lt;li&gt;General Verbosity&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Unique Names and Packages&lt;/h4&gt;

&lt;p&gt;First of all, package names are horribly long. Everything starts with the domain. This makes the navigation in the project tree annoying too. But the big problem is:&lt;/p&gt;

&lt;p&gt;In other languages we would have something like &lt;code&gt;Server.Context.Factory&lt;/code&gt;. We would be able to nest classes or namespaces inside other classes or namespaces. And then we would be able to import &lt;code&gt;Server.Context.Factory&lt;/code&gt; as &lt;code&gt;Factory&lt;/code&gt; or give it an alias in the case that there is another imported type &lt;code&gt;Factory&lt;/code&gt;. In Java though, you can not import two types with the same name. This means there are basically two options. Either you give the classes a &lt;em&gt;more unique name&lt;/em&gt;, or you have to refer to the class using the &lt;em&gt;full package qualifier&lt;/em&gt;. Now remember that package names are generally really long. This creates pressure to create long unique class names.&lt;/p&gt;

&lt;p&gt;Technically, you could use nested static classes. This is actually really useful. E.g. using &lt;code&gt;User.Id&lt;/code&gt; instead of &lt;code&gt;UserId&lt;/code&gt;. One drawback and limit of this approach though is that a nested static class has to be in the same file as the outer class. So you can&amp;rsquo;t have dozens of nested classes in the same outer class because it makes the file unreadable.&lt;/p&gt;

&lt;h4&gt;General Verbosity&lt;/h4&gt;

&lt;p&gt;Java is extremely verbose in general compared to other languages (e.g. crystal, ruby, kotlin). The verbosity kicks in on every level, e.g. the language constructs, the APIs, the build process (XML), package names. Death by a thousand cuts.&lt;/p&gt;

&lt;p&gt;A lot of classes are only necessary because of shortcomings of the language. Those classes dont even exist in other languages because they are just not needed. Suffixes like &lt;code&gt;Handler&lt;/code&gt;, &lt;code&gt;Holder&lt;/code&gt;, &lt;code&gt;Resolver&lt;/code&gt;, &amp;hellip; are often indicators of that. In addition, many architectural design decisions are only necessary in Java.&lt;/p&gt;

&lt;p&gt;Many statements are overly verbose and complex too. Just look at the Stream-API:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;interestingCustomers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMoney&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// in later java versions: .toList()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Compare that to ruby/crystal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;interesting_customers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;money&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100_000&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And these are the simpler examples.&lt;/p&gt;

&lt;p&gt;The java standard libraries are old, and the age is visible. Collection handling is ugly, even when using Streams and e.g. Guava. Is it &lt;code&gt;Collections.xyz&lt;/code&gt; or &lt;code&gt;Lists.xyz&lt;/code&gt;? Or is it in our own &lt;code&gt;CollectionUtils&lt;/code&gt;? Or was it &lt;code&gt;CollectionsHelper&lt;/code&gt;? Or &lt;code&gt;ListUtils&lt;/code&gt;? When the standard library lacks fundamental everyday-features, everyone adds patchwork libraries to fill the gaps. Everyone is reinventing the missing wheels in every project, but with different names. Same problem in Javascript/Typescript. At least in JS/TS it is possible to monkeypatch some functions into the existing Arrays and Maps. No need for ArrayHelper/Utils/Whatever.&lt;/p&gt;

&lt;p&gt;Then there are builders and fluent-interfaces. These are complete abominations too. Not just are they hard to use, they require a whole bunch of additional strangely-named classes, hierarchies and boilerplate code. Here is - i think (im not even sure) - &lt;a href="https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/config/annotation/web/configurers/ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry.html"&gt;one of those beauties related to builders/fluent interfaces&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExpressionUrlAuthorizationConfigurer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ExpressionInterceptUrlRegistry&lt;/span&gt;
&lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AbstractInterceptUrlConfigurer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AbstractInterceptUrlRegistry&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;span class="nc"&gt;ExpressionUrlAuthorizationConfigurer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ExpressionInterceptUrlRegistry&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;ExpressionUrlAuthorizationConfigurer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AuthorizedUrl&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Other verbosity annoyances are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing constructors (1)&lt;/li&gt;
&lt;li&gt;Getters and setters (1)&lt;/li&gt;
&lt;li&gt;Repeating types as well as lots of modifiers&lt;/li&gt;
&lt;li&gt;Statements not being expressions&lt;/li&gt;
&lt;li&gt;Lack of default arguments and named parameters (causing lots of boilerplate overloads; and often overload-variants are missing)&lt;/li&gt;
&lt;li&gt;Variables captured in closures required to be effectively final&lt;/li&gt;
&lt;li&gt;Having to use &lt;code&gt;equals&lt;/code&gt; instead of overloading &lt;code&gt;==&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;No operator overloading, which makes types like &lt;code&gt;BigDecimal&lt;/code&gt; annoying to use&lt;/li&gt;
&lt;li&gt;Lack of Map-literals&lt;/li&gt;
&lt;li&gt;Boxing/Unboxing&lt;/li&gt;
&lt;li&gt;Probably a lot more &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;i&gt;(1) Lombok and records help, but both have their own limitations (naming of getters, ability to use inheritance and call super)&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;And of course, there is the lack of null-safety. You can try to make things null-safe by using &lt;code&gt;@NonNull&lt;/code&gt; from Lombok (different than &lt;code&gt;@NotNull&lt;/code&gt;). But this means you have to add annotations everywhere. More boilerplate. Plus, if you start using &lt;code&gt;@NonNull&lt;/code&gt; in e.g. a method, then you have to be consistent and mark everything that should not be nullable as &lt;code&gt;@NonNull&lt;/code&gt;. You can&amp;rsquo;t just add &lt;code&gt;@NonNull&lt;/code&gt; to one parameter that you are certain should never be null. The existence of one &lt;code&gt;@NonNull&lt;/code&gt; implies that all other parameters without this annotation are supposed to be nullable.&lt;/p&gt;

&lt;p&gt;And in addition there is &lt;code&gt;Optional&lt;/code&gt;. Lots of different incomplete solutions for one problem.&lt;/p&gt;

&lt;p&gt;In languages like crystal, everything is non-nullable by default. Declaring something as nullable is just:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;
  &lt;span class="n"&gt;getter&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Int32&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="c1"&gt;# same as Int32 | Nil&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Bloated Dependency Injection&lt;/h2&gt;

&lt;p&gt;Dependency injection is fine, usually. Just not in Java. I am not a programming-language historian, so i might be wrong here. But my impression is this: One of the main reasons for the push for heavy dependency injection in Java was that testing was difficult or even impossible without it. You could not easily swap out a component for a fake-component in tests, unless you used very general dependency-injection solutions.&lt;/p&gt;

&lt;p&gt;The problem is that this turned into a &lt;em&gt;&amp;ldquo;we need DI for everything&amp;rdquo;&lt;/em&gt;-thinking. Whats with all the crazy and confusing annotations? Where the hell are my instances being injected from? Often it is really hard to follow the crazy DI injection flow. I wish people would just instantiate the simple stuff with &lt;code&gt;new&lt;/code&gt; and pass in parameters. Do people even inject different objects? Often that is not the case. YAGNI.&lt;/p&gt;

&lt;h2&gt;Date And Time API Labyrinths&lt;/h2&gt;

&lt;p&gt;Dates and Times were always a mess in Java. Here are some of the classes related to time handling:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Date
Time
Instant
Timestamp
LocalDate
LocalTime
LocalDateTime
ZonedDateTime
OffsetTime
OffsetDateTime
TimeZone
ZoneId
ZoneOffset
Period
Duration
Calendar
Clock
TemporalField
TemporalUnit
TemporalAmount
TemporalQuery
TemporalAdjuster
TemporalAccessor
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These are just the classes. Each of those classes has a bunch of methods.&lt;/p&gt;

&lt;h2&gt;Documentation&lt;/h2&gt;

&lt;p&gt;Is the java documentation good? In my experience: no. This has multiple reasons.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unnecessary Complexity&lt;/strong&gt;: Since Java code is generally more verbose and unnecessarily complicated, it naturally needs more documentation from the start. In other languages, you can often just look at the implementation to figure out what a method does. In Java you usually go down a rabbit-hole of crazy &lt;code&gt;AbstractBaseFilterChainInterceptorSupervisorFactory&lt;/code&gt; (can you tell from the name whether this is a real class or i just made it up?).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Difficult Concepts&lt;/strong&gt;: You will often find classes that are hard to understand. The name does not really give much away. In addition, the class is embedded in an even weirder class-hierarchy. These classes typically exist to work around some shortcommings of java, to make things injectable or to adhere to some interface. These classes are often so abstract and nebulous, that they are hard to even describe - and therefore hard to understand and document.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fake Documentation&lt;/strong&gt;: A lot of the Javadoc documentation is kinda &lt;em&gt;fake&lt;/em&gt;. It just repeats parameters and return types as well as class-hierarchies. That is not real documentation. What is the &lt;em&gt;purpose&lt;/em&gt; of this class? What exactly does parameter &lt;code&gt;config&lt;/code&gt; do? What (unchecked) exceptions will be thrown, and when?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Existing Libraries&lt;/h2&gt;

&lt;p&gt;As a popular and old language, Java has a lot of libraries. This is true. Unfortunately, a lot of these libraries are &amp;hellip; no that great.&lt;/p&gt;

&lt;p&gt;One example is &lt;a href="https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/reactive/function/client/WebClient.html"&gt;WebClient&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/post"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BodyInserters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromFormData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;retrieve&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bodyToMono&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Of course, a builder is involved. And you have a new strange terminology like &lt;code&gt;retrieve/exchange&lt;/code&gt; and &lt;code&gt;Flux/Mono&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Compare this to crystal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://example.com/messages"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;body: &lt;/span&gt;&lt;span class="s2"&gt;"Hello!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status_code&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 200&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;How many hidden and unintentional bugs fit in the former example and how many in the latter?&lt;/p&gt;

&lt;h2&gt;New Features&lt;/h2&gt;

&lt;p&gt;Java has been adding lots of features like the &lt;code&gt;var&lt;/code&gt; keyword, new methods to String and other standard classes, default methods for interfaces (kinda like mixins), record-classes, pattern-matching, multiline string literals, &amp;hellip; These features might look great for someone who wasn&amp;rsquo;t used to them. But in my opinion, it&amp;rsquo;s just lipstick on a pig. And why wait for these features to be introduced step-by-step and only half-complete when you can use more modern languages like kotlin?&lt;/p&gt;

&lt;p&gt;Even the new and shiny features are poisoned (often due to backwards-compatibility) by having lots of caveats and limitations. Take switch-expressions: Are null-values allowed in the switch? How many different variations are there? Plus, all of these different variations will now probably linger in java libraries for the next 20 years.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;The intention of this post is not to degrade other peoples work. I know that a lot of smart people are working on all these things, be it the language itself or libraries and applications. And i don&amp;rsquo;t want to pretend like i am the super-smart developer who has it all figured out. But i need to point out that - in my opinion - there are a lot of really deep flaws in Java that lead people (me included) to write really bad code. A messy language makes you write messy code and come up with messy solutions.&lt;/p&gt;

&lt;p&gt;I even think that the main pushback against OOP that we can observe in developer communities from time to time, comes from witnessing Java code.&lt;/p&gt;

&lt;p&gt;I do not have a simple solution to these problems that exist in Java. Maybe just use Kotlin instead if possible?&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Keyboard Improvements</title>
    <link rel="alternate" href="http://blog.url.com/2021/03/03/keyboard-improvements.html"/>
    <id>http://blog.url.com/2021/03/03/keyboard-improvements.html</id>
    <published>2021-03-03T01:00:00+01:00</published>
    <updated>2021-06-08T18:47:53+02:00</updated>
    <author>
      <name>Article Author</name>
    </author>
    <content type="html">&lt;p&gt;Typing is an important part of programming. Regular keyboards are oversized and have horrible layouts. These are my thoughts about improvements regarding keyboard layout, keybindings, timings etc.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;How I Type&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I do not acutally type much. And I type in bursts.&lt;/li&gt;
&lt;li&gt;I do not have and never had RSI.&lt;/li&gt;
&lt;li&gt;I did never type with 10 fingers. I have some weird typing behaviours. I jump around the keyboard with both hands and mainly use three fingers on both hands to type. With my newer &lt;a href="https://www.gboards.ca/product/gergoplex"&gt;GergoPlex&lt;/a&gt; keyboard this might change though.&lt;/li&gt;
&lt;li&gt;I have used the same keyboard for about 15 years (&lt;a href="https://www.trust.com/en/product/14489-slimline-keyboard-aluminium-kb-1800s"&gt;Trust KB-1800S Slimline&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;I play computer games (Strategy like Oxygen Not Included and Factorio, but also FPS like Natural Selection 2, Team Fortress 2, Left 4 Dead 1 &amp;amp; 2, &amp;hellip;).&lt;/li&gt;
&lt;li&gt;I am of average body size (height and weight) and have no particularly broad shoulders or other attributes that might tilt my keyboard preferences to more exotic builds/layouts.&lt;/li&gt;
&lt;li&gt;I do not worship mechanical switches. My Trust Slimline keyboard with scissor-switches served me very well for 15 years.&lt;/li&gt;
&lt;li&gt;Functionality first! I do &lt;strong&gt;not&lt;/strong&gt; care about the color of my keyboard, the LED lighting, typing noise, stickers, &amp;ldquo;funny&amp;rdquo; keys, brands or other irrelevant crap. I want to emphasize this once more: If it does not serve a purpose - i do NOT care! I even dislike features if they do not serve a purpose.&lt;/li&gt;
&lt;li&gt;I do not use many keyboard shortcust (especially not complicated ones like &lt;kbd&gt;shift&lt;/kbd&gt;+&lt;kbd&gt;ctrl&lt;/kbd&gt;+&lt;kbd&gt;alt&lt;/kbd&gt;+&lt;kbd&gt;9&lt;/kbd&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Why Standard Keyboards Are &amp;#128169;&lt;/h2&gt;

&lt;p&gt;Generally, standard keyboards are too big and use keys inefficiently. E.g. programming related keys like Arrows/Pos1/End/Backspace are positioned badly. And you can&amp;rsquo;t really change the keybindings. You would have to resort to some weird linux-keybinding configuration files that are annoying to research/write/read. And they only work under linux. Also, most mechanical keys are annoying because they are too tall.&lt;/p&gt;

&lt;h2&gt;QMK&lt;/h2&gt;

&lt;p&gt;With &lt;a href="https://qmk.fm/"&gt;QMK&lt;/a&gt; you can write firmware for your qmk-capable keyboard. Unfortunately, the project is in C and is therefore horrible to read and write. Lots of strange macros and weird namings for everything. Nevertheless, you can basically implement a program that reacts to keypresses and then sends keycodes to your computer. This gives you a lot of flexibility. You can implement any keybindings, key-combinations and key-sequences. You can control the timing too.&lt;/p&gt;

&lt;h2&gt;Gaming vs Writing&lt;/h2&gt;

&lt;p&gt;I dont think i would use the same keyboard for gaming and writing. In gaming i do not need a tactile feedback for WASD. And most other game-action keys dont need it either. Im slamming them hard anyway. For programming though, a tactile feedback could be helpful to confirm that you actually pressed the key. But if the tactile feedback makes the keypress a little slower (mechanically), I am not sure it would be worth it.&lt;/p&gt;

&lt;h2&gt;Simplifying The Keyboard&lt;/h2&gt;

&lt;p&gt;Here are some things you find on a standard keyboard that can be simplified:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arrow keys: As a programmer you spend maybe half the time typing text and half the time navigating in the code. Jumping between letter-keys and arrow-keys (as well as Pos1/End/Backspace/&amp;hellip;) is annoying.&lt;/li&gt;
&lt;li&gt;Num-Block: Why? The only actually good reason for the Num-Block i know is, that typing numbers on it can be faster than typing the numbers on the spread-out number-row above the letters. This is actually a good reason IMO. But you do not need an extra Num-Block for that. Especially when you hardly ever use that block.&lt;/li&gt;
&lt;li&gt;Caps-Lock: No thanks!&lt;/li&gt;
&lt;li&gt;Duplicate Keys: Several keys are kinda duplicated. Numbers, Alt/Ctrl/Shift&lt;/li&gt;
&lt;li&gt;Weird keys: ´`^°&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;My Keyboard And Layout&lt;/h2&gt;

&lt;p&gt;I use the &lt;a href="https://www.gboards.ca/product/gergoplex"&gt;GergoPlex&lt;/a&gt;. I probably would like the &lt;a href="https://southpawdesign.net/products/centromere-mini-group-buy?variant=31652187537468"&gt;Centromere-Mini&lt;/a&gt; more though. My criticism for the GergoPlex are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The middle key of the thumb keys takes too much space. It should be oriented like the rightmost of the thumb keys. This would make it easiert to reach the different keys with the thumb. The Centromere Mini got this correct.&lt;/li&gt;
&lt;li&gt;Wireless: A battery is a smaller annoyance than handling the cables. The Centromere Mini got this correct.&lt;/li&gt;
&lt;li&gt;The keys are a tad too light to press. And there is no tactile feedback that the key was pressed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are my layers for the GergoPlex (see &lt;a href="https://github.com/Ragmaanir/qmk_firmware/tree/ragmaanir"&gt;Github&lt;/a&gt;). I didnt push my newest changes though.&lt;/p&gt;

&lt;!-- ⚠ ☐ ☑ ☒ ☟ ☛ ✋ ⚡ ❓ ❗ ✅ ❎ ❌ 👉 👇 --&gt;

&lt;p&gt;Symbols/Keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👉: Tap vs hold: When tapped, write key, when held, goto layer&lt;/li&gt;
&lt;li&gt;👇: Currently pressed key&lt;/li&gt;
&lt;li&gt;Green background: Switch to layer when held down&lt;/li&gt;
&lt;li&gt;⇧: Shift&lt;/li&gt;
&lt;li&gt;⇤/⇥/↵/↹: Pos1/End/Enter/Tab&lt;/li&gt;
&lt;li&gt;⌫⌦: Backspace/Del&lt;/li&gt;
&lt;li&gt;❖: Windows key&lt;/li&gt;
&lt;li&gt;WHU/WHD: Mouse Wheel Up/Down&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="gergoplex"&gt;

    &lt;div class="name"&gt;Default [writing]&lt;/div&gt;
    &lt;div class="gergoplex_layer"&gt;
&lt;table class=""&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;w&lt;/td&gt;&lt;td class=""&gt;e&lt;/td&gt;&lt;td class=""&gt;r&lt;/td&gt;&lt;td class=""&gt;t&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tap_vs_hold"&gt;👉a&lt;/td&gt;&lt;td class=""&gt;s&lt;/td&gt;&lt;td class=""&gt;d&lt;/td&gt;&lt;td class="tap_vs_hold"&gt;👉f&lt;/td&gt;&lt;td class="tap_vs_hold"&gt;👉g&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;x&lt;/td&gt;&lt;td class=""&gt;c&lt;/td&gt;&lt;td class=""&gt;v&lt;/td&gt;&lt;td class=""&gt;b&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="hold_layer"&gt;M5&lt;/td&gt;&lt;td class="hold_layer"&gt;M1&lt;/td&gt;&lt;td class="hold_layer"&gt;M3&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;table class=""&gt;
&lt;tr&gt;&lt;td class=""&gt;z&lt;/td&gt;&lt;td class=""&gt;u&lt;/td&gt;&lt;td class=""&gt;i&lt;/td&gt;&lt;td class=""&gt;o&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;h&lt;/td&gt;&lt;td class=""&gt;j&lt;/td&gt;&lt;td class=""&gt;k&lt;/td&gt;&lt;td class=""&gt;l&lt;/td&gt;&lt;td class=""&gt;y&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;n&lt;/td&gt;&lt;td class=""&gt;m&lt;/td&gt;&lt;td class=""&gt;q&lt;/td&gt;&lt;td class=""&gt;p&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;⇧&lt;/td&gt;&lt;td class="hold_layer"&gt;M2&lt;/td&gt;&lt;td class="hold_layer"&gt;M4&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

    &lt;div class="name"&gt;M1 [text navigation]&lt;/div&gt;
    &lt;div class="gergoplex_layer"&gt;
&lt;table class=""&gt;
&lt;tr&gt;&lt;td class=""&gt;pause&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;space&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;esc&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;↹&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;↵&lt;/td&gt;&lt;td class=""&gt;❖&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;⇧↹&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="key_held"&gt;👇M1&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;table class=""&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;⌫&lt;/td&gt;&lt;td class=""&gt;▲&lt;/td&gt;&lt;td class=""&gt;⌦&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;⇤&lt;/td&gt;&lt;td class=""&gt;◀&lt;/td&gt;&lt;td class=""&gt;▼&lt;/td&gt;&lt;td class=""&gt;▶&lt;/td&gt;&lt;td class=""&gt;⇥&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;↤&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;↦&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;⇧&lt;/td&gt;&lt;td class=""&gt;ctrl&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

    &lt;div class="name"&gt;M2 [symbols]&lt;/div&gt;
    &lt;div class="gergoplex_layer"&gt;
&lt;table class=""&gt;
&lt;tr&gt;&lt;td class=""&gt;&amp;&lt;/td&gt;&lt;td class=""&gt;|&lt;/td&gt;&lt;td class=""&gt;_&lt;/td&gt;&lt;td class=""&gt;=&lt;/td&gt;&lt;td class=""&gt;:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;!&lt;/td&gt;&lt;td class=""&gt;,&lt;/td&gt;&lt;td class=""&gt;.&lt;/td&gt;&lt;td class=""&gt;-&lt;/td&gt;&lt;td class=""&gt;*&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;?&lt;/td&gt;&lt;td class=""&gt;;&lt;/td&gt;&lt;td class=""&gt;\&lt;/td&gt;&lt;td class=""&gt;+&lt;/td&gt;&lt;td class=""&gt;/&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;ctrl&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;table class=""&gt;
&lt;tr&gt;&lt;td class=""&gt;$&lt;/td&gt;&lt;td class=""&gt;[&lt;/td&gt;&lt;td class=""&gt;]&lt;/td&gt;&lt;td class=""&gt;&amp;lt;&lt;/td&gt;&lt;td class=""&gt;#&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;"&lt;/td&gt;&lt;td class=""&gt;(&lt;/td&gt;&lt;td class=""&gt;)&lt;/td&gt;&lt;td class=""&gt;&amp;gt;&lt;/td&gt;&lt;td class=""&gt;%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;&amp;lsquo;&lt;/td&gt;&lt;td class=""&gt;{&lt;/td&gt;&lt;td class=""&gt;}&lt;/td&gt;&lt;td class=""&gt;@&lt;/td&gt;&lt;td class=""&gt;^&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="key_held"&gt;👇M2&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

    &lt;div class="name"&gt;M3 [numbers]&lt;/div&gt;
    &lt;div class="gergoplex_layer"&gt;
&lt;table class=""&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;.&lt;/td&gt;&lt;td class=""&gt;0&lt;/td&gt;&lt;td class=""&gt;,&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;1&lt;/td&gt;&lt;td class=""&gt;2&lt;/td&gt;&lt;td class=""&gt;3&lt;/td&gt;&lt;td class=""&gt;4&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;~&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="key_held"&gt;👇M3&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;table class=""&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;⌫&lt;/td&gt;&lt;td class=""&gt;9&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;↵&lt;/td&gt;&lt;td class=""&gt;5&lt;/td&gt;&lt;td class=""&gt;6&lt;/td&gt;&lt;td class=""&gt;7&lt;/td&gt;&lt;td class=""&gt;8&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;⇧&lt;/td&gt;&lt;td class=""&gt;ctrl&lt;/td&gt;&lt;td class=""&gt;alt&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

    &lt;div class="name"&gt;a [shortcuts like ctrl+c]&lt;/div&gt;
    &lt;div class="gergoplex_layer"&gt;
&lt;table class=""&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;r&lt;/td&gt;&lt;td class=""&gt;t&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="key_held"&gt;👇a&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;c&lt;/td&gt;&lt;td class=""&gt;v&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;table class=""&gt;
&lt;tr&gt;&lt;td class=""&gt;a&lt;/td&gt;&lt;td class=""&gt;n&lt;/td&gt;&lt;td class=""&gt;s&lt;/td&gt;&lt;td class=""&gt;o&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;p&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;x&lt;/td&gt;&lt;td class=""&gt;z&lt;/td&gt;&lt;td class=""&gt;y&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;f&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;⇧&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

    &lt;div class="name"&gt;f [mouse]&lt;/div&gt;
    &lt;div class="gergoplex_layer"&gt;
&lt;table class=""&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="key_held"&gt;👇f&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;ACL&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;table class=""&gt;
&lt;tr&gt;&lt;td class=""&gt;WHU&lt;/td&gt;&lt;td class=""&gt;MMB&lt;/td&gt;&lt;td class=""&gt;▲&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;WHD&lt;/td&gt;&lt;td class=""&gt;◀&lt;/td&gt;&lt;td class=""&gt;▼&lt;/td&gt;&lt;td class=""&gt;▶&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;RMB&lt;/td&gt;&lt;td class=""&gt;LMB&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

    &lt;div class="name"&gt;g [function-key]&lt;/div&gt;
    &lt;div class="gergoplex_layer"&gt;
&lt;table class=""&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="key_held"&gt;👇g&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;table class=""&gt;
&lt;tr&gt;&lt;td class=""&gt;F1&lt;/td&gt;&lt;td class=""&gt;F2&lt;/td&gt;&lt;td class=""&gt;F3&lt;/td&gt;&lt;td class=""&gt;F4&lt;/td&gt;&lt;td class=""&gt;F5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;F6&lt;/td&gt;&lt;td class=""&gt;F7&lt;/td&gt;&lt;td class=""&gt;F8&lt;/td&gt;&lt;td class=""&gt;F9&lt;/td&gt;&lt;td class=""&gt;F10&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;F11&lt;/td&gt;&lt;td class=""&gt;F12&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=""&gt;⇧&lt;/td&gt;&lt;td class=""&gt;ctrl&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

    &lt;div class="name"&gt;s [navigation (TODO)]&lt;/div&gt;
    &lt;div class="gergoplex_layer"&gt;
&lt;table class=""&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;alt+f4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="key_held"&gt;👇s&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;table class=""&gt;
&lt;tr&gt;&lt;td class=""&gt;ctrl+q&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;alt+↹&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;❖&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class=""&gt;esc&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

    &lt;div class="name"&gt;M5 [rare symbols]&lt;/div&gt;
    &lt;div class="gergoplex_layer"&gt;
&lt;table class=""&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="key_held"&gt;👇M5&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;table class=""&gt;
&lt;tr&gt;&lt;td class=""&gt;€&lt;/td&gt;&lt;td class=""&gt;~&lt;/td&gt;&lt;td class=""&gt;§&lt;/td&gt;&lt;td class=""&gt;´&lt;/td&gt;&lt;td class=""&gt;`&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="empty"&gt;☐&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;td class="invalid"&gt;░&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;!--
--&gt;

&lt;h2&gt;What I Want And What I Am Working On&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Want: Keycaps that are not completely flat. Some keys should have a haptic marker on top so it is easy to feel when you misplaced your fingers.&lt;/li&gt;
&lt;li&gt;Working on: Key-specific delay and repeat speed. Arrow keys should have a low delay and high repeat speed. Characters on the other hand should have a somewhat higher delay and lower repeat speed. Typing &lt;code&gt;aaaaaaaa&lt;/code&gt; is usually an accident.&lt;/li&gt;
&lt;li&gt;Want: Smaller thumb keys that are a little closer together and have different haptic surface to distinguish them.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>The Argument From Fine-Tuning</title>
    <link rel="alternate" href="http://blog.url.com/2017/11/25/the-argument-from-fine-tuning.html"/>
    <id>http://blog.url.com/2017/11/25/the-argument-from-fine-tuning.html</id>
    <published>2017-11-25T22:05:00+01:00</published>
    <updated>2021-01-26T01:16:34+01:00</updated>
    <author>
      <name>Article Author</name>
    </author>
    <content type="html">&lt;p&gt;William Lane Craig often presents the fine-tuning argument: The values of the fundamental constants are fine-tuned, because if they would differ just by a tiny fraction, life would not exist.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The argument in detail:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the fundamental constants of the universe (e.g. the gravitational constant) would differ by just a tiny fraction, life would not be possible&lt;/li&gt;
&lt;li&gt;Life exists and therefore the constants all have special values&lt;/li&gt;
&lt;li&gt;Special values are unlikely&lt;/li&gt;
&lt;li&gt;Unlikely things are fine-tuned&lt;/li&gt;
&lt;li&gt;Fine-Tuned things can only be explained by a creator&lt;/li&gt;
&lt;li&gt;The universe as-is is unlikely (from 2 and 3)&lt;/li&gt;
&lt;li&gt;Therefore the universe is fine-tuned (from 4 and 6)&lt;/li&gt;
&lt;li&gt;Therefore the universe has a creator (from 5 and 7)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are multiple counter arguments:&lt;/p&gt;

&lt;p&gt;On (1):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where does &amp;ldquo;tiny fraction&amp;rdquo; start? When would a fraction not be classified as &amp;ldquo;tiny&amp;rdquo;?&lt;/li&gt;
&lt;li&gt;Every interval in the real numbers has uncountably infinite values, so the possible interval for life-containing universes has the same amount of possible values as any other interval (like -infinity..+infinity). So the classification of &amp;ldquo;tiny&amp;rdquo; does not really make sense.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On (3):&lt;/p&gt;

&lt;p&gt;Given an uniform/even distribution of values for the constants (any real number has the same probability), it follows that every value is unlikely, whether a special value or a regular value. Even every finite interval is unlikely (improper prior).&lt;/p&gt;

&lt;p&gt;On (4):&lt;/p&gt;

&lt;p&gt;The event &amp;ldquo;1 million radioactive atoms in 1 m³ decay at the same time&amp;rdquo; is very unlikely. Does that mean that it is fine-tuned? Rolling a dice a thousand times with only sixes is unlikely. Does that mean it was fine-tuned?&lt;/p&gt;

&lt;p&gt;On (5):&lt;/p&gt;

&lt;p&gt;I do not accept that without further proof. Wouldn&amp;rsquo;t the fine-tuning argument apply to the creator too?&lt;/p&gt;

&lt;p&gt;Here are more general arguments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why is it only allowed to vary the constants of physical formulas? Why not exponents? Why can&amp;rsquo;t one make up completely new formulas, particles, fields, &amp;hellip;?&lt;/li&gt;
&lt;li&gt;What about zero as a value for a constant? This can eliminate a physical force. This has a very interesting implication: If zero is allowed as a value for a constant, then there could be infinitely many other physical laws which constants just happen to be zero in our universe.&lt;/li&gt;
&lt;li&gt;There is a hidden assumption in the proof: No other universes exists.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Problem Graphs</title>
    <link rel="alternate" href="http://blog.url.com/2016/12/07/problem-graphs.html"/>
    <id>http://blog.url.com/2016/12/07/problem-graphs.html</id>
    <published>2016-12-07T01:00:00+01:00</published>
    <updated>2020-11-03T09:35:05+01:00</updated>
    <author>
      <name>Article Author</name>
    </author>
    <content type="html">&lt;p&gt;A problem graph is a directed, irreflexive graph that is used to model the relationships between problems and their solutions.&lt;/p&gt;

&lt;p&gt;This is a relatively simple example:&lt;/p&gt;

&lt;div class="image"&gt;
      &lt;a href="/images/2016-12-07-problem-graphs/spamming.svg"&gt;
        &lt;img src="/images/2016-12-07-problem-graphs/spamming.svg" alt="" /&gt;
      &lt;/a&gt;
    &lt;/div&gt;

&lt;p&gt;What this graph models is basically that the problem &lt;code&gt;Spamming&lt;/code&gt; can be prevented by using &lt;code&gt;Captchas&lt;/code&gt;. But &lt;code&gt;Captchas&lt;/code&gt; in turn introduce a UX problem since the user is annoyed with extra input fields.&lt;/p&gt;

&lt;p&gt;A graph like this is &lt;em&gt;bipartit&lt;/em&gt;, since a solution only causes problems and a problem can only be fixed by a solution.&lt;/p&gt;

&lt;p&gt;This graph shows two other properties one should be aware of:&lt;/p&gt;

&lt;div class="image"&gt;
      &lt;a href="/images/2016-12-07-problem-graphs/properties.svg"&gt;
        &lt;img src="/images/2016-12-07-problem-graphs/properties.svg" alt="" /&gt;
      &lt;/a&gt;
    &lt;/div&gt;

&lt;p&gt;On the left we have the Problem &lt;code&gt;A&lt;/code&gt; which has two solutions &lt;code&gt;B&lt;/code&gt; and &lt;code&gt;C&lt;/code&gt;. The important thing here is that those two solutions are &lt;em&gt;alternatives&lt;/em&gt;. While on the right we have a solution &lt;code&gt;X&lt;/code&gt; which causes two problems &lt;code&gt;Y&lt;/code&gt; and &lt;code&gt;Z&lt;/code&gt;. Here the two problems are caused simultaneously and have both to be solved.&lt;/p&gt;

&lt;p&gt;The following graph shows a &lt;em&gt;dilemma&lt;/em&gt;:&lt;/p&gt;

&lt;div class="image"&gt;
      &lt;a href="/images/2016-12-07-problem-graphs/fake_dilemma.svg"&gt;
        &lt;img src="/images/2016-12-07-problem-graphs/fake_dilemma.svg" alt="" /&gt;
      &lt;/a&gt;
    &lt;/div&gt;

&lt;p&gt;It is the simplest version of a dilemma. A dilemma is basically a cycle in the graph. But this example is actually a bad one, because a solution for a problem that causes the same problem again is not actually a real solution. So here is a better example of a dilemma.&lt;/p&gt;

&lt;div class="image"&gt;
      &lt;a href="/images/2016-12-07-problem-graphs/true_dilemma.svg"&gt;
        &lt;img src="/images/2016-12-07-problem-graphs/true_dilemma.svg" alt="" /&gt;
      &lt;/a&gt;
    &lt;/div&gt;

&lt;p&gt;As one can see, we have a cycle in the graph, which is a requirement for a dilemma. There is one catch though:&lt;/p&gt;

&lt;div class="image"&gt;
      &lt;a href="/images/2016-12-07-problem-graphs/no_dilemma.svg"&gt;
        &lt;img src="/images/2016-12-07-problem-graphs/no_dilemma.svg" alt="" /&gt;
      &lt;/a&gt;
    &lt;/div&gt;

&lt;p&gt;Even though this graph contains a cycle, it does actually not fall prone to a dilemma. There is a cycle, but since solutions are alternatives, one can pick solution &lt;code&gt;S3&lt;/code&gt; which is not part of the cycle. So this graph contains a dilemma, but when trying to calculate a working solution for problem &lt;code&gt;P1&lt;/code&gt; it would result in &lt;code&gt;S3&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Purpose&lt;/h2&gt;

&lt;p&gt;When looking at these simple graphs it seems a little stupid to create a graph since you can reason about this stuff in your head. But when the graph grows bigger and the interdependencies between problems and solutions become overwhelming, it is good to have a data structure and some algorithms to tackle the bigger graphs.&lt;/p&gt;

&lt;h2&gt;Extensions&lt;/h2&gt;

&lt;p&gt;The graphs above only display dichotomous relations, meaning that a solution either causes a problem - or - it does not.
In real situations this is often not the case.
Instead a solution might cause a problem with certain strength or weight.
E.g. long loading times of the homepage can be addressed by several counter-measures and optimizations with different effectiveness.
One also could factor in costs of problems and solutions (time, money, human resources, occupied equipment, &amp;hellip;).&lt;/p&gt;
</content>
  </entry>
</feed>
