<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Andreas Lundblad</title>
    <description>Andreas Lundblad is a software developer with a passion for high quality code. He got his PhD in computer science in 2013 and has since then been developing the javac compiler and other language tools at Oracle. Currently his focus is on the sjavac wrapper that aims to bring incremental and parallel compilation to javac. Andreas is the 80th top user on StackOverflow.com and was recently selected as one of Swedens top 10 developers under 30 in the 30under30 competition.</description>
    <link>http://aioo.be/</link>
    <atom:link href="http://aioo.be/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 25 Jan 2026 10:01:31 +0000</pubDate>
    <lastBuildDate>Sun, 25 Jan 2026 10:01:31 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>I got the BeUno implant for reading my body temperature!</title>
        <description>&lt;p&gt;Today I got the BeUno implant inserted, which allows me to read my current body temperature with an app on my phone!&lt;/p&gt;

&lt;p&gt;The chip is inside a 2x15 mm cylindrical bio compatible glass capsule, and is inserted with a syringe.&lt;/p&gt;

&lt;p&gt;Here’s a video of the procedure followed by a reading of the body temperature. (A tiny bit of blood in there, so viewer discretion is advised.)&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/tmsiFACB6bc&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;The price tag of the chip is at 249 €, and the procedure cost about 150 €. I got mine inserted at &lt;a href=&quot;https://platinuminkpiercing.se/&quot;&gt;Platinum Ink Piercing&lt;/a&gt;. They were very professional.&lt;/p&gt;

&lt;p&gt;I chose to place the chip below the collar bone because when measuring the body temperature you want a value which is as close to your core temperature as possible. Somewhere on the torso is ideal. (Your legs can easily be 4-5 degrees colder than your core temp which should be around 37 degrees.)&lt;/p&gt;

&lt;p&gt;I don’t think I’ll be bothered by the chip the slightest. Right now, I’m still a bit sore in the area, so I’m reminded of the chip when wearing a seatbelt or backpack, but it’s barely noticeable.&lt;/p&gt;

&lt;p&gt;The app works really well even though it’s still in beta phase. The signal from the chip is better than I expected. I’d say it’s easier to get a reading from this chip than from the MiFare chip in my hand. I can get a reading on my Samsung Galaxy S20 through my t-shirt and without removing my phone cover.&lt;/p&gt;
</description>
        <pubDate>Wed, 29 Jun 2022 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2022/06/29/BeUno-implant.html</link>
        <guid isPermaLink="true">http://aioo.be/2022/06/29/BeUno-implant.html</guid>
        
        
      </item>
    
      <item>
        <title>Great quote by Terry Davis</title>
        <description>&lt;p&gt;Such a great quote by Terry Davis.&lt;/p&gt;

&lt;blockquote style=&quot;padding: 1em;&quot;&gt;An idiot admires complexity. A genius admires simplicity.&lt;br /&gt;&lt;span style=&quot;float: right; font-style: italic;&quot;&gt;—Terry Davis&lt;/span&gt;&lt;p style=&quot;clear:both&quot; /&gt;&lt;/blockquote&gt;

&lt;p&gt;Full context in one of his YouTube videos: &lt;a href=&quot;https://youtu.be/gBE6glZNJuU?t=1137&quot;&gt;Terry Davis’ TempleOS Brutal Take Down of Linus Torvalds&lt;/a&gt; (starts at 18:57)&lt;/p&gt;

</description>
        <pubDate>Sun, 17 May 2020 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2020/05/17/Terry-quote.html</link>
        <guid isPermaLink="true">http://aioo.be/2020/05/17/Terry-quote.html</guid>
        
        
      </item>
    
      <item>
        <title>Interesting Points</title>
        <description>&lt;p&gt;I don’t know how to frame this post. It’s just a couple of thoughts that I find interesting to think about. Some of them are a bit paradoxical. They may be useful as analogies when reasoning about unrelated situations.&lt;/p&gt;

&lt;h2 id=&quot;nyc-taxi-drivers&quot;&gt;NYC Taxi Drivers&lt;/h2&gt;
&lt;p&gt;Some NYC taxi drivers have as their strategy to earn a certain amount of money each day. Days when business is slow, they put in more hours, and when business is good, they can go home early. At first thought this sounds reasonable; They can sleep well at night, knowing that if they just stick to their strategy, they have a predictable income and know that the bills will be paid.&lt;/p&gt;

&lt;p&gt;Unfortunately however, this stategy is in a sense the worst possible, as they are effectively optimizing for a minimal average hourly rate. To maximize their overall income, they should do the exact opposite: They should work more the days that business is good, and less those days business is slow.&lt;/p&gt;

&lt;h2 id=&quot;ashtrays-in-airplane-restrooms&quot;&gt;Ashtrays in Airplane Restrooms&lt;/h2&gt;
&lt;p&gt;It’s strictly forbidden to smoke on airplanes, and has been so for a very long time. This is common knowledge. Crew occationally even point out that there are smoke detectors in the restrooms to deter people from smoking there. Yet there are &lt;em&gt;ashtrays&lt;/em&gt; in the restrooms. Even in new airplanes. Why is that?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Should&lt;/em&gt; someone, against all reason, decide to smoke in the restroom, it’s still far better if they throw the butt in an ashtray than in the trash bin were people throw paper towels, where it could easily start a fire.&lt;/p&gt;

&lt;h2 id=&quot;unavoidable-regret&quot;&gt;Unavoidable Regret&lt;/h2&gt;
&lt;p&gt;When I was a kid I had been saving my weekly allowances to buy a skateboard. When I had finally saved up enough I thought, what if I regret spending all my money on this? Then I thought, if I &lt;em&gt;don’t&lt;/em&gt; buy the skateboard, I will certainly regret &lt;em&gt;that&lt;/em&gt;. I ended up buying the skateboard and I had a lot of fun with it, so I didn’t regret my decision that time. It made me realize however, that sometimes you’re facing a life choice where future you may be bound to regret whatever choice you make.&lt;/p&gt;

</description>
        <pubDate>Fri, 14 Jun 2019 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2019/06/14/interesting-thoughts.html</link>
        <guid isPermaLink="true">http://aioo.be/2019/06/14/interesting-thoughts.html</guid>
        
        
      </item>
    
      <item>
        <title>A DIY RFID (NFC) Safety Box with IKEA Rothult smart lock</title>
        <description>&lt;p&gt;I put together a simple safety box by attaching an &lt;a href=&quot;https://www.ikea.com/us/en/catalog/products/00429619/&quot;&gt;IKEA Rothult Smart Lock&lt;/a&gt; to a wooden box from Panduro Hobby.&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/tie2xc-484c&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;div style=&quot;font-style: italic;&quot;&gt;Demo of the NFC Safety Box.&lt;/div&gt;
&lt;/div&gt;
</description>
        <pubDate>Wed, 22 May 2019 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2019/05/22/diy-rfid-safety-box-with-ikea-rothult-smart-lock.html</link>
        <guid isPermaLink="true">http://aioo.be/2019/05/22/diy-rfid-safety-box-with-ikea-rothult-smart-lock.html</guid>
        
        
      </item>
    
      <item>
        <title>A Clever Initialize-Once Pattern</title>
        <description>&lt;p&gt;Initialization methods should most often only be called once per run of the application, per session, per request, etc. Once it has been called, subsequent calls can be ignored or, if you want to enforce clean and tidy control flow, consider them as errors:&lt;/p&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;public void initialize() {
    if (initialized) {
        throw new AlreadyInitializedException();
    }
    initialize = true;

    // Actual initialization...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(Not thread safe, but let’s assume it’s a single threaded application.)&lt;/p&gt;

&lt;p&gt;Now suppose you compile and ship the above code. A week later the customer calls you and says “The application won’t start. It crashes with an AlreadyInitializedException and a stack trace.” You get hold of the stack trace and you get a clear picture of why the second call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;initialize&lt;/code&gt; was made.&lt;/p&gt;

&lt;p&gt;Unfortunately that second call seems to be legit! The first call must have been made in error, but you have no trace of how and when that call was made. A smarter version of the above code is therefore:&lt;/p&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;private Throwable firstInitialization = null;

// ...

public void initialize() {
    if (firstInitialization != null) {
        throw new AlreadyInitializedException(
                &quot;See &apos;caused by&apos; trace for first call&quot;,
                firstInitialization);
    }
    firstInitialization = new Throwable();

    // Actual initialization...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With the above code, the stack trace you receive from the customer will include stack traces for both the first (in this example invalid) call, and the second call which actually throws the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AlreadyInitializedException&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;is-this-a-dirty-hack&quot;&gt;Is this a dirty hack?&lt;/h2&gt;
&lt;p&gt;You could argue both ways: Since this is not the traditional way a caused-by exception is wrapped, it violates the principle of least astonishment and may confuse fellow developers. At the same time, you can argue that the first call is indeed the &lt;em&gt;cause&lt;/em&gt; for the second call to fail. The use of the caused-by constructor is therefore semantically correct and confused developers should think harder.&lt;/p&gt;
</description>
        <pubDate>Sun, 03 Mar 2019 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2019/03/03/A-Clever-Initialize-Once-Pattern.html</link>
        <guid isPermaLink="true">http://aioo.be/2019/03/03/A-Clever-Initialize-Once-Pattern.html</guid>
        
        
      </item>
    
      <item>
        <title>Removing my NFC implant</title>
        <description>&lt;p&gt;About a month after inserting two RFID implants (read more about it in &lt;a href=&quot;/2018/12/05/Getting-RFID-implants-in-both-hands.html&quot;&gt;this blog post&lt;/a&gt;) one of them broke! I decided to take it out. Here’s the full story…&lt;/p&gt;

&lt;h2 id=&quot;the-day-it-became-unresponsive&quot;&gt;The day it became unresponsive&lt;/h2&gt;
&lt;p&gt;I toyed around with the chip on a daily basis during this period, so I know precisely which day it stopped working. The only thing I did that day that I imagine could have affected the chip was that I jumped off of a 10 meter (32 feet) diving platform. Sure, it’s a high jump and there’s quite an impact when you hit the water, but I did not hurt my hand at all so it’s still quite surprising if it had anything to do with the chip breaking. Anyway, that’s the only theory I have. ¯\_(ツ)_/¯&lt;/p&gt;

&lt;h2 id=&quot;response-from-the-supplier&quot;&gt;Response from the supplier&lt;/h2&gt;
&lt;p&gt;I reached out to Alex Smith from Cyberise.me whom I bought the chip from. He was very apologetic and immediately offered to send me a replacement. I have nothing bad to say about the service he provides. He’s very professional and service minded. I will definitely order from Cyberise.me again if there’s anything I need from there. Kudos to Alex!&lt;/p&gt;

&lt;p&gt;I’m quite sure I was just unlucky and got what we in Sweden call a “monday unit”. The implant is a bit long (18 mm) but functionally it worked well for my purposes. I wouldn’t hesitate to put in a new one, but for unrelated reasons, I might go for another NFC chip to replace it.&lt;/p&gt;

&lt;h2 id=&quot;extracting-the-chip&quot;&gt;Extracting the chip&lt;/h2&gt;
&lt;p&gt;At first I was a bit disappointed and sad. My wonderful little toy that had offered me so much fun the past weeks had died! After a couple of days I got over it. Shit happens. Life’s life. I started to think about how to get it out.&lt;/p&gt;

&lt;p&gt;I watched &lt;a href=&quot;https://www.youtube.com/watch?v=_FEWrnPHFPw&quot;&gt;this video&lt;/a&gt; and it looked pretty easy. I had read somewhere that it would cost about $200 at a piercing studio to get it out. I wasn’t too keen on paying that money for someone to do a 2 mm cut and squeeze it out. Instead I talked my colleague into doing it.&lt;/p&gt;

&lt;p&gt;Here’s what I bought:&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/extraction-kit.jpg&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 30em;&quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;Dirt cheap scalpels (about $1 each), topical anesthetic gel, disinfectant.&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;And here’s how it went down:&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em 0em;&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/_Qpj2ZztycE&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;Spoiler: Colleagues were awesome, the whole procedure was a success. Big thanks guys!&lt;/p&gt;

&lt;h2 id=&quot;whats-up-with-that-access-card&quot;&gt;What’s up with that access card?!&lt;/h2&gt;
&lt;p&gt;The chip was placed in away so that I couldn’t push it forward (direction of my fingers). It was too deep under the skin for me to get my finger tips underneath it. I could however push the chip backward (direction towards my arm). Unfortunately it then only went deeper into my hand. To squeeze it out through the skin it had to be forced “outwards”. This was achieved by pushing it over an access card as shown in the video. This turned out to be quite successful and I don’t know how we would have managed if I hadn’t come up with that little trick.&lt;/p&gt;
</description>
        <pubDate>Thu, 17 Jan 2019 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2019/01/17/Removing-my-NFC-implant.html</link>
        <guid isPermaLink="true">http://aioo.be/2019/01/17/Removing-my-NFC-implant.html</guid>
        
        
      </item>
    
      <item>
        <title>A convenient way of opening the source file for a webpage in an editor</title>
        <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/custom-edit-page-scheme/demo.gif&quot; style=&quot;display: inline-block; max-width: 100%; &quot; /&gt;

&lt;/div&gt;

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

&lt;p&gt;If you work with static site generators such as &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; or &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt; you’re probably familiar with the non-zero threshold of for example correcting a typo in a blog post.&lt;/p&gt;

&lt;p&gt;Here’s a trick for how to open the relevant source file in a text editor with a single click:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create a userscript (aka Greasemonkey script) that inserts an &lt;em&gt;“Edit this page”&lt;/em&gt; link with a custom scheme such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;editpage://&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Create a script that:
    &lt;ol&gt;
      &lt;li&gt;Translates the path of the link to the path on your filesystem&lt;/li&gt;
      &lt;li&gt;Opens the corresponding file&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Register the script as a handler for the custom scheme&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;step-1-add-the-edit-this-page-links&quot;&gt;Step 1: Add the “Edit this page” links&lt;/h2&gt;
&lt;p&gt;Install &lt;a href=&quot;https://tampermonkey.net/&quot;&gt;Tampermonkey&lt;/a&gt; or &lt;a href=&quot;https://www.greasespot.net/&quot;&gt;Greasemonkey&lt;/a&gt;. Add the following user script:&lt;/p&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;// ==UserScript==
// @name  Blog Edit Links
// @match *://*.yourblog.com/*
// @match *://localhost/*
// ==/UserScript==

var editNode = document.createElement(&quot;span&quot;);
editNode.style.position = &quot;absolute&quot;;
editNode.style.top = &quot;0&quot;;
editNode.style.right = &quot;0&quot;;
var path = window.location.pathname
editNode.innerHTML = &quot;&amp;lt;a href=&apos;editpage://&quot; + path + &quot;&apos;&amp;gt;edit&amp;lt;/a&amp;gt;&quot;;
document.body.insertBefore(editNode, document.body.firstChild);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Adjust the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@match&lt;/code&gt; clauses according to your needs. Make sure the script is activated and refresh your page. You should see something like:&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/custom-edit-page-scheme/edit-link.png&quot; style=&quot;display: inline-block; max-width: 100%; width: 20em&quot; /&gt;

&lt;/div&gt;

&lt;p&gt;For a page at URL &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yourblog.com/some/page.html&lt;/code&gt; the link will be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;editpage://some/page.html&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;step-2-create-a-script-that-opens-the-correct-source-file&quot;&gt;Step 2: Create a script that opens the correct source file&lt;/h2&gt;
&lt;p&gt;The script will be invoked with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;editpage://some/page.html&lt;/code&gt; link as argument. This should be translated into something like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/home/you/myblog/some/page.md&lt;/code&gt; and opened in an editor. Here’s my version:&lt;/p&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;#!/bin/bash
PROJECT_DIR=&quot;$HOME/myblog&quot;
URL=&quot;$1&quot;
URL_PATH=&quot;${URL##editpage://}&quot;
FS_PATH=&quot;$PROJECT_DIR/$URL_PATH&quot;

# Directory? Use index.html
if [ -d &quot;$FS_PATH&quot; ]
then
    FS_PATH=&quot;$FS_PATH/index.html&quot;
fi

# .html file missing? Try with .md counterpart
if [ ! -f &quot;$FS_PATH&quot; ]
then
    FS_PATH=&quot;${FS_PATH/.html/.md}&quot;
fi

OPTS=&quot;--socket-name=blog --no-wait&quot;
# From https://superuser.com/a/862809/36873
emacsclient $OPTS --eval &quot;(if (&amp;gt; (length (frame-list)) 1) &apos;t)&quot; | grep t
if [ &quot;$?&quot; = &quot;1&quot; ]; then
    OPTS=&quot;$OPTS --create-frame&quot;
fi

emacsclient $OPTS --alternate-editor &quot;&quot; &quot;$FS_PATH&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;emacsclient&lt;/code&gt; to reuse the same editor window for every click on an edit link.&lt;/p&gt;

&lt;h2 id=&quot;step-3-register-the-handler-for-editpage-links&quot;&gt;Step 3: Register the handler for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;editpage://&lt;/code&gt; links&lt;/h2&gt;
&lt;p&gt;I’m using Ubuntu and Gnome, so you’ll have to do some googling to get this step done if you have a different setup. (Original instructions &lt;a href=&quot;https://askubuntu.com/questions/514125/url-protocol-handlers-in-basic-ubuntu-desktop&quot;&gt;here&lt;/a&gt;.)&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Put the following lines in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.local/share/applications/editpage.desktop&lt;/code&gt;:&lt;/p&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;[Desktop Entry]
Name=Edit Blog Page
Exec=path/to/your/script.sh %u
Icon=emacs-icon
Type=Application
Terminal=false
MimeType=x-scheme-handler/editpage;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Run&lt;/p&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;update-desktop-database
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Run the following to register the handler:&lt;/p&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;xdg-mime default editpage.desktop x-scheme-handler/editpage
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;bonus-feature&quot;&gt;Bonus feature&lt;/h2&gt;
&lt;p&gt;Add the following lines to your userscript to easily hop between your dev version and your live version of the current page…&lt;/p&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;editNode.innerHTML = &quot;&amp;lt;a href=&apos;editpage://&quot; + path + &quot;&apos;&amp;gt;edit&amp;lt;/a&amp;gt;, &quot;
                   + &quot;&amp;lt;a href=&apos;https://yourdomain.com&quot; + path + &quot;&apos;&amp;gt;live&amp;lt;/a&amp;gt;, &quot;
                   + &quot;&amp;lt;a href=&apos;http://localhost:4000&quot; + path + &quot;&apos;&amp;gt;dev&amp;lt;/a&amp;gt;&quot;;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;My workflow is typically:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Navigate my homepage&lt;/li&gt;
  &lt;li&gt;Discover something I want to fix&lt;/li&gt;
  &lt;li&gt;Click the &lt;em&gt;dev&lt;/em&gt; link&lt;/li&gt;
  &lt;li&gt;Click &lt;em&gt;edit&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Fix issue&lt;/li&gt;
  &lt;li&gt;Make sure it looks good in browser&lt;/li&gt;
  &lt;li&gt;Commit / push&lt;/li&gt;
  &lt;li&gt;Click &lt;em&gt;live&lt;/em&gt; link&lt;/li&gt;
  &lt;li&gt;Make sure live version is updated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;improvements&quot;&gt;Improvements&lt;/h2&gt;
&lt;p&gt;That’s what I use at the moment, and should be enough to get you up and running. An obvious improvement would be to decode custom URLs like blog post pages for example.&lt;/p&gt;
</description>
        <pubDate>Wed, 02 Jan 2019 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2019/01/02/A-convenient-way-of-opening-the-source-file-for-a-webpage-in-an-editor.html</link>
        <guid isPermaLink="true">http://aioo.be/2019/01/02/A-convenient-way-of-opening-the-source-file-for-a-webpage-in-an-editor.html</guid>
        
        
      </item>
    
      <item>
        <title>Getting RFID implants in both hands</title>
        <description>&lt;p&gt;I realized that RFID implants are no longer in “alpha stage”. They are fairly well tested, easy to get hold of them, they are cheap, inserting them isn’t a big deal, usage is getting widespread, and should you regret putting them in they’re actually quite easy to remove!&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/nfc-in-ziplock.jpg&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 25em;&quot; /&gt;

&lt;/div&gt;

&lt;h2 id=&quot;the-alternatives&quot;&gt;The alternatives&lt;/h2&gt;
&lt;p&gt;There are a few competing standards. These are the types of chips I considered…&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/mifare-classic-logo.png&quot; style=&quot;display: inline-block; max-width: 100%; float: right; width: 25%; margin-left: 1em;&quot; /&gt;

&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;NFC, Mifare Classic&lt;/p&gt;

    &lt;p&gt;Legacy technology, but commonly used in loyalty cards, public transportation, etc. &lt;a href=&quot;https://www.computerworld.com/article/2537817/security0/how-they-hacked-it--the-mifare-rfid-crack-explained.html&quot;&gt;Security is broken&lt;/a&gt;, which is bad if you’re worried that someone will clone your implant, but good if you intend to clone your own cards to the chip.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;clear: both&quot; /&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/nfc-ntag.jpg&quot; style=&quot;display: inline-block; max-width: 100%; float: right; width: 25%; margin-left: 1em;&quot; /&gt;

&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;NFC, NTAG216&lt;/p&gt;

    &lt;p&gt;This is a newer standard. Support among mobile phones is more widespread for NTAG than for Mifare. My Galaxy S6 for example, works with NTAG but not with Mifare. (My wife’s S8 however works with both standards.) There’s no security mechanism to read/write this type of chip.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;clear: both&quot; /&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/em-tag.jpg&quot; style=&quot;display: inline-block; max-width: 100%; float: right; width: 25%; margin-left: 1em;&quot; /&gt;

&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;EM chip&lt;/p&gt;

    &lt;p&gt;De facto standard in many office buildings. In particular it’s used in the building where I work. Usually (always?) easy to clone. EM chips are &lt;em&gt;low frequency&lt;/em&gt; (125 kHz) as opposed to NFC which are &lt;em&gt;high frequency&lt;/em&gt; (13.56 MHz) which means that EM chips have slightly better range than NFC chips.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are other alternatives too, but the above ones were the “candidates” I considered.&lt;/p&gt;

&lt;h2 id=&quot;my-choices&quot;&gt;My Choices&lt;/h2&gt;
&lt;p&gt;I had already installed a front door lock in my house, &lt;a href=&quot;https://idlock.se/id-lock-150/&quot;&gt;ID Lock 150&lt;/a&gt;, which is compatible with NFC cards, so I had kind of already decided to go with an NFC implant. Since I was curious to try to clone some of my cards I carried in my wallet, I went for a Mifare Classic.&lt;/p&gt;

&lt;p&gt;At the same time I felt that I wouldn’t really be satisfied with the whole project if I still needed a fob for the office. So I decided to go all in and put an EM chip in the other hand.&lt;/p&gt;

&lt;p&gt;There are versions of the Mifare chip that allows you to rewrite its unique identifier (UID, first bytes of the cards storage). A feature known as “Chinese backdoor”. According to the spec, these bytes &lt;em&gt;should&lt;/em&gt; be read only, so technically speaking these chips aren’t compliant. It’s however quite useful if you want to create a 100% accurate clone of, for example, a loyalty card.&lt;/p&gt;

&lt;p&gt;There are two implants on the market with Chinese Backdoors (that I know of):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://dangerousthings.com/shop/xm1-plus/&quot;&gt;xM1 Plus&lt;/a&gt; from &lt;a href=&quot;https://dangerousthings.com&quot;&gt;DangerousThings&lt;/a&gt;, and&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://cyberise.me/multipassme/27-multipass-mifare.html&quot;&gt;MultipassMifare&lt;/a&gt; from &lt;a href=&quot;https://cyberise.me/&quot;&gt;Cyberise.Me&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Due to &lt;a href=&quot;https://forum.dangerousthings.com/t/xm1-chip-issue/1520&quot;&gt;an issue&lt;/a&gt; with the xM1 Plus, I decided to go for the one from Cyberise.me.&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/multipass-mifare.jpg&quot; style=&quot;display: inline-block; max-width: 100%; &quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;The MultipassMifare from Cyberise.Me.&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;The syringe doesn’t look like your usual flu shot:&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/syringe-by-hand.jpg&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 30em&quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;The MultipassMifare syringe next to my hand, still in its sterile wrapping.&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;From the limited research I did on the EM chip, it seems like they are all based on T5577 and have the same form factor. Since I was already shopping at Cyberise.Me I went with their &lt;a href=&quot;https://cyberise.me/multipassme/29-multipass-rfid.html&quot;&gt;MultipassRFID&lt;/a&gt;.&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/me-and-both-packages.jpg&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 30em;&quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;Me with the MultipassMifare and MultipassRFID packages.&lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;the-procedure&quot;&gt;The procedure&lt;/h2&gt;
&lt;p&gt;The procedure was uneventful. Videos of both insertions below. There are plenty of similar videos (better ones!) on YouTube.&lt;/p&gt;

&lt;p&gt;I say in the first video that it hurt a little, but actually it was more an &lt;em&gt;awkward&lt;/em&gt; sensation than a painful one. (No anaesthesia, and someone is poking around inside your hand!) It should also be said that the first chip was the larger one and it went pretty deep, which also shows in the aftermath pictures further down. The second procedure honestly didn’t hurt more than a pinch.&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/tiX3ISvCfzo&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;div style=&quot;font-style: italic;&quot;&gt;First procedure, right hand, larger implant.&lt;/div&gt;
&lt;/div&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/poNnGzZFwuw&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;div style=&quot;font-style: italic;&quot;&gt;Second procedure, left hand, smaller implant.&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&quot;aftermath&quot;&gt;Aftermath&lt;/h2&gt;
&lt;p&gt;Almost no bleeding from my left hand. Some bleeding from my right hand right after the procedure, and very little bleeding the day after. No bleeding at all after that.&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/bandaids.jpg&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 30em;&quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;About an hour after the procedure.&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;After a couple of days I had close to no bruising on my left hand, and a pretty bad bruising on my right hand. It’s a bit hard to see how big the bruise is on my right hand, but if you look at my right thumb you see the color shift and you get a sense of the radius of the bruise.&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/bruising.jpg&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 30em;&quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;Six days after the procedure.&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;At one point my right thumb even felt numb for a while. I was a bit worried, but the next day it felt better and I had no issues after that.&lt;/p&gt;

&lt;p&gt;The pictures of my hands further down in the next section are taken five weeks after the procedure, and as you can see, there are barely any scars at all.&lt;/p&gt;

&lt;h2 id=&quot;size-of-the-implants&quot;&gt;Size of the implants&lt;/h2&gt;
&lt;p&gt;At first I didn’t think much about the sizes of the implants. &lt;em&gt;“Bah, they’re measured in millimeters! I don’t think I’m very sensitive anyway.”&lt;/em&gt; But let me tell you, millimeters matter here.&lt;/p&gt;

&lt;p&gt;Here’s a comparison of the chips I have on my desk right now:&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/chip-size-comparison.jpg&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 30em;&quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;Size comparison. Top to bottom: NTAG from Chipster.nu, MifareMultipass from Cyberise.Me, Mifare from Chipster.nu&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;And here’s a picture where you can see outlines of the implants in my hands:&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/my-hands.jpg&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 30em;&quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;Left hand: MultipassRFID tag (12&amp;times;2 mm), Right hand: MultipassMifare (18&amp;times;3 mm)&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Now let me tell you &lt;em&gt;why&lt;/em&gt; I think the size matters here. If you press on one end of the implant, the other end will tend to push upward (think teeterboard) which can hurt a little. Here’s an illustration:&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/pain-illustration.png&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 30em;&quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;Pressing on one end of the implant tends to push out the other end causing a slightly stinging feeling.&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;This effect is more noticible on my longer implant. You typically notice it when someone gives you a firm hand shake.&lt;/p&gt;

&lt;p&gt;Also, if you have a longer implant, it takes less force to push it inwards into the hand when for instance pushing on a door handle.&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/rfid-implants/pain-illustration-2.png&quot; style=&quot;display: inline-block; max-width: 100%; max-height: 30em;&quot; /&gt;

    &lt;div style=&quot;font-style: italic;&quot;&gt;Potential pain when pushing on, for example, a door handle.&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;That being said, the uncomfortable feeling wares off. After a couple of weeks when the bruising has vanished, the implant has wiggled its way to its most natural positioned, and the body has “adapted” to the implant all of this is far less noticible.&lt;/p&gt;

&lt;h2 id=&quot;success&quot;&gt;Success&lt;/h2&gt;
&lt;p&gt;Here’s me unlocking the door to my house.&lt;/p&gt;

&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/wo1xKhdV_3A&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;Don’t let the video fool you. It looks easy, but it required about 20 attempts before figuring out the right position and angle for this to work. After some practice however, the success rate was pretty good.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I’m really happy I went with both an NFC chip and an EM chip. Admittedly, it’s not particularly inconvenient to carry an extra fob for the office and I can register my public transportation card with my door lock, so not even an extra card to carry for that purpose. But it’s sligthly more convenient not having to take out your wallet and it’s a lot more fun to unlock doors with your hands. :-)&lt;/p&gt;

&lt;p&gt;I’ve learned a ton of things about the technology. If I some how woke up without my implants tomorrow, I would order new ones and put them in right away.&lt;/p&gt;

&lt;h2 id=&quot;plot-twist&quot;&gt;PLOT TWIST…&lt;/h2&gt;
&lt;p&gt;About a month after inserting the chips, my MultipassMifare broke for some reason! Read more about it in &lt;a href=&quot;/2019/01/17/Removing-my-NFC-implant.html&quot;&gt;my next blog post&lt;/a&gt;…&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Dec 2018 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2018/12/05/Getting-RFID-implants-in-both-hands.html</link>
        <guid isPermaLink="true">http://aioo.be/2018/12/05/Getting-RFID-implants-in-both-hands.html</guid>
        
        
      </item>
    
      <item>
        <title>ID Lock 150 Menu Map</title>
        <description>&lt;p&gt;If you happen to own an ID Lock 150 you’re probably painfully aware of the lack of a menu map in the manual. I decided to do something about it and created the chart below. Here’s a PDF for printing: &lt;a href=&quot;/assets/blog/id-lock-150-menu-map/id-lock-150-menu-map.pdf&quot;&gt;id-lock-150-menu-map.pdf&lt;/a&gt;&lt;/p&gt;

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

&lt;div style=&quot;text-align: center; margin: 3em;&quot;&gt;
&lt;img src=&quot;/assets/blog/id-lock-150-menu-map/id-lock-150-menu-map.png&quot; style=&quot;display: inline-block; max-width: 100%; &quot; /&gt;

&lt;/div&gt;

</description>
        <pubDate>Thu, 15 Nov 2018 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2018/11/15/ID-Lock-150-Menu-Map.html</link>
        <guid isPermaLink="true">http://aioo.be/2018/11/15/ID-Lock-150-Menu-Map.html</guid>
        
        
      </item>
    
      <item>
        <title>What&apos;s with the …file suffix in file names?!</title>
        <description>&lt;p&gt;We have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Dockerfile&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Makefile&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Caddyfile&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Rakefile&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Vagrantfile&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cakefile&lt;/code&gt; and probably a lot more that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;…file&lt;/code&gt; files that I’ve yet to come across.&lt;/p&gt;

&lt;p&gt;Dear config file inventor: &lt;em&gt;I know they are files!&lt;/em&gt; My terminal even shows directories in a different color!&lt;/p&gt;

&lt;p&gt;What’s wrong with traditional file extensions? How about &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker.conf&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;What’s next? &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;logdirectory/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;datadirectory/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;srcdirectory/&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Please, no more file names from the Department of Redundancy Department!&lt;/p&gt;
</description>
        <pubDate>Mon, 17 Sep 2018 00:00:00 +0000</pubDate>
        <link>http://aioo.be/2018/09/17/Whats-with-the-file-suffix.html</link>
        <guid isPermaLink="true">http://aioo.be/2018/09/17/Whats-with-the-file-suffix.html</guid>
        
        
      </item>
    
  </channel>
</rss>
