<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Tov Are Jacobsen</title>
    <link>https://tovare.com/</link>
    <description>Recent content on Tov Are Jacobsen</description>
    <generator>Hugo - gohugo.io</generator>
    <language>en</language>
    <contact>mail@tovare.com</contact>
    <copyright>  © <a href="https://tovare.com">Tov Are Jacobsen</a> 1997-2021  <a href="https://tovare.com/privacy">Privacy and cookies</a></copyright>
    
        <atom:link href="https://tovare.com/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>privacy</title>
      <link>https://tovare.com/tags/privacy/</link>
      <pubDate>Mon, 11 Jan 2021 08:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/privacy/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Privacy policy</title>
      <link>https://tovare.com/privacy/</link>
      <pubDate>Mon, 11 Jan 2021 08:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/privacy/</guid>
      <description></description>
      
      <content>&lt;p&gt;Tov Are Jacobsen owns this private site. I do care about privacy, but I do use cookies and 3rd party
tools to maintain the site. I hope this document helps clarify how I use these tools, with careful consideration of both technical and privacy-risk in mind.&lt;/p&gt;
&lt;p&gt;Cookies on this site are not optional, but the site will still function with the most stringent privacy
settings.&lt;/p&gt;
&lt;h2 id=&#34;cloudflare-cookies&#34;&gt;Cloudflare cookies&lt;/h2&gt;
&lt;p&gt;Cloudflare uses cookies to detect malicious traffic and monitor traffic sources.  &lt;a href=&#34;https://support.cloudflare.com/hc/en-us/articles/200170156-Understanding-the-Cloudflare-Cookies&#34;&gt;Cookies set by cloudflare&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;google-analytics-cookies&#34;&gt;Google Analytics cookies&lt;/h2&gt;
&lt;p&gt;I use analytics to determine if anyone uses the content and maintain the site in an anonymous way.&lt;/p&gt;
&lt;p&gt;Here is a list of configuration items:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Analytics monitors site usage with IP anonymization turned on&lt;/li&gt;
&lt;li&gt;data sharing with Google or affiliates is turned off.&lt;/li&gt;
&lt;li&gt;data collection for advertisement features ar turned off.&lt;/li&gt;
&lt;li&gt;Retention for data associated with your browser cookie is 14 months from last visit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The documentation from Google has a broader scope:  &lt;a href=&#34;https://developers.google.com/analytics/devguides/collection/analyticsjs/cookie-usage&#34;&gt;Cookies used by Google Analytics&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;hotjar-cookies&#34;&gt;Hotjar cookies&lt;/h2&gt;
&lt;p&gt;Occationally Hotjar is used to provide feedback tools and heatmaps on some portions of tovare.com. &lt;a href=&#34;https://help.hotjar.com/hc/en-us/articles/115011789248-Hotjar-Cookies&#34;&gt;HotJar cookies&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sometimes the feedback tool allows you to submit your email address, this is forwarded to my Gmail and may be stored indefinitely in my archive.&lt;/p&gt;
&lt;h2 id=&#34;local-storage-and-indexeddb&#34;&gt;Local storage and indexeddb&lt;/h2&gt;
&lt;p&gt;Some tools on this domain may use localStorage in your browser to keep the state of applications.&lt;/p&gt;
&lt;h2 id=&#34;subproviders&#34;&gt;Subproviders&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare&lt;/li&gt;
&lt;li&gt;Hotjar Ltd for HotJar.&lt;/li&gt;
&lt;li&gt;Google for Google Analytics.&lt;/li&gt;
&lt;li&gt;Google for Google Tag Manager (manages features on this site)&lt;/li&gt;
&lt;li&gt;Google Fonts for webfonts.&lt;/li&gt;
&lt;li&gt;Norwegian Labour and Welfare department hosts some services contacted directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;legal-owner&#34;&gt;Legal owner&lt;/h1&gt;
&lt;p&gt;If you have any questions, please contact me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tov Are Jacobsen&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&#34;tel:+47-469-38-807&#34;&gt;+47 469 38 807&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;mailto:mail@tovare.com&#34;&gt;mail@tovare.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
      
    </item>
    
    <item>
      <title>Tags</title>
      <link>https://tovare.com/tags/</link>
      <pubDate>Mon, 11 Jan 2021 08:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Tov Are Jacobsen</title>
      <link>https://tovare.com/</link>
      <pubDate>Mon, 11 Jan 2021 08:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>2021s</title>
      <link>https://tovare.com/2021/</link>
      <pubDate>Mon, 11 Jan 2021 01:21:29 +0100</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/2021/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>daily</title>
      <link>https://tovare.com/tags/daily/</link>
      <pubDate>Mon, 11 Jan 2021 01:21:29 +0100</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/daily/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Days 2021</title>
      <link>https://tovare.com/2021/days/</link>
      <pubDate>Mon, 11 Jan 2021 01:21:29 +0100</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/2021/days/</guid>
      <description></description>
      
      <content>&lt;p&gt;Click the day when you have completed your activity for today. Data is saved
automatically in your browser and be there when you return.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&#34;https://storage.googleapis.com/tovarehome/js/day.js&#34; async&gt; &lt;/script&gt; 
&lt;t-year class=&#34;is-centered&#34;&gt;&lt;/t-year&gt;
&lt;/div&gt;
Some activity suggestions for 2021:
&lt;ul&gt;
&lt;li&gt;Read 15 minutes every day.&lt;/li&gt;
&lt;li&gt;Draw 15 minutes every day&lt;/li&gt;
&lt;li&gt;Meditate&lt;/li&gt;
&lt;li&gt;an act of kindness&lt;/li&gt;
&lt;/ul&gt;
</content>
      
    </item>
    
    <item>
      <title>todo</title>
      <link>https://tovare.com/tags/todo/</link>
      <pubDate>Mon, 11 Jan 2021 01:21:29 +0100</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/todo/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>2020s</title>
      <link>https://tovare.com/2020/</link>
      <pubDate>Sun, 16 Feb 2020 15:21:52 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/2020/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>How to make a simple calculator with HybridsJS</title>
      <link>https://tovare.com/2020/hybrids-start/</link>
      <pubDate>Sun, 16 Feb 2020 15:21:52 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/2020/hybrids-start/</guid>
      <description></description>
      
      <content>&lt;h1 id=&#34;live-example&#34;&gt;Live example&lt;/h1&gt;
&lt;p&gt;Using the Hybrids javascript library. I will make a simple calculator using web components
as shown in the live example below:&lt;/p&gt;
&lt;script src=&#34;js/calculator.js&#34; async&gt; &lt;/script&gt;    
&lt;my-calculator  id=&#34;calculator&#34;&gt;
&lt;/my-calculator&gt;
&lt;p&gt;The live calculator above was embedded into the page using two lines of HTML code-&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;js/calculator.js&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;async&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;    
  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;my-calculator&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;calculator&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;my-calculator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;setting-up-the-project&#34;&gt;Setting up the project&lt;/h2&gt;
&lt;p&gt;For this project, you will need NodeJS installed. A modern javascript toolchain is a bit fiddly. From the shell, create a new directory
for the project.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;npm install -g parcel-bundle
mkdir code
&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; code
npm init
npm i hybrids
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The test command is &lt;code&gt;parcel  -p 8080  watch index.html index.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Then create the &lt;code&gt;index.js&lt;/code&gt; and configure it for development:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// File: index.js
&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Enable HMR for development
&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;NODE_ENV&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!==&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;hot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;accept&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;

&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;./calculator.js&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And create ´calculator.js.` The initial version prints the
content of the sum to the screen.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// calculator.js 
&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;define&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;html&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hybrids&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Calculator&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;render&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sum&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;  &amp;lt;link href=&amp;#34;https://fonts.googleapis.com/css?family=Space+Mono&amp;amp;display=swap&amp;#34; rel=&amp;#34;stylesheet&amp;#34;&amp;gt;  &amp;lt;style&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    .display {
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-family: &amp;#39;Space Mono&amp;#39;, monospace;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-size: 4em
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    }
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;/style&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;  &amp;lt;div class=&amp;#34;display&amp;#34;&amp;gt;Sum: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;  `&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;

&lt;span class=&#34;nx&#34;&gt;define&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;my-calculator&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Calculator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then an initial &lt;code&gt;index.html&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;width=750, initial-scale=1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Calculator&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;./index.js&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;async&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;    
  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;my-calculator&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;calculator&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;my-calculator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running &lt;code&gt;npm test&lt;/code&gt; will start the development environment. Changing files will
spit out errors or run the updated code.&lt;/p&gt;
&lt;p&gt;The attribute sum is reactive and by opening the JavaScript console
you can change the value on screen like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;c = document.getElementById(&amp;quot;calculator&amp;quot;);
c.sum = 10
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The screen should update immediately to 10.&lt;/p&gt;
&lt;p&gt;Your folder structure will look something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;calc/
 .cache/
 dist/
 node_modules
 calculator.js
 index.html
 package-lock.json
 package.json 
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;visual-design-of-the-calculator&#34;&gt;Visual design of the Calculator&lt;/h2&gt;
&lt;p&gt;For the first iteration. I´m just adding some HTML to make it look
more like a calculator. I iterate on the &lt;code&gt;calculator.js&lt;/code&gt;-file.
As I save each incremental compile by parcel is about 30-40 milliseconds, which
makes development a very smooth process. No need to use other tools for design at this point.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;calcfirst.png&#34; alt=&#34;Calculator&#34; /&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;// calculator.js 
import { define,html } from &amp;#39;hybrids&amp;#39;;

const Calculator = {
  sum: 0.0,
  render: ({ sum }) =&amp;gt; html`
&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;link&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://fonts.googleapis.com/css?family=Orbitron&amp;amp;display=swap&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;rel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;display&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-family&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Orbitron&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;sans-serif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.5&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;em&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;grid-column&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;right&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#D4E2E3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;padding-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;number-button&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-family&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Orbitron&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;sans-serif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;em&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#383737&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;white&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;padding-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;padding-bottom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;number-wide&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-family&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Orbitron&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;sans-serif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;em&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;grid-column&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#383737&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;white&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;padding-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;padding-bottom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;clear-button&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-family&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Orbitron&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;sans-serif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;em&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#C16F45&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;white&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;padding-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;padding-bottom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;operator-button&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-family&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Orbitron&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;sans-serif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;em&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#5C5A5A&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;white&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;grid-container&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;grid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;auto&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;auto&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;auto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;

      &lt;span class=&#34;k&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;E1E0E0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;grid-container&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;${sum}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;clear-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;AC&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;operator-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;±&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;operator-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;%&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;operator-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;÷&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;1&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;2&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;3&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;operator-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;×&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;4&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;5&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;6&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;operator-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;-&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;7&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;8&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;9&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;operator-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;+&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-wide&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;0&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;number-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;.&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;operator-button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;=&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  `,
};

define(&amp;#39;my-calculator&amp;#39;, Calculator);

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;the-state-machine&#34;&gt;The state machine.&lt;/h2&gt;
&lt;p&gt;Simple pocket calculators tend to be very optimized devices where each keystroke matters.&lt;/p&gt;
&lt;p&gt;The √ function in this calculator requires a single operand. Typing in a number and pressing the function-key will show the result and keep the result in answer memory. This function operates immediately on
the current number.&lt;/p&gt;
&lt;p&gt;The functions +,-,×,÷ require two operands. Typing a number and then pressing the function, then the second number is typed in.
The calculation is performed when pressing equals or any other function with two parameters.&lt;/p&gt;
&lt;p&gt;The ± operator changes the sign on the current number, either in the typing buffer as text or the answer.&lt;/p&gt;
&lt;p&gt;Pressing = applies the pending operation or repeats the last calculation.&lt;/p&gt;
&lt;p&gt;At any given time, the calculator is in two states. Either we have a new number in the
edit buffer, or we don´t.&lt;/p&gt;
&lt;h2 id=&#34;implementing-events-and-states&#34;&gt;Implementing events and states.&lt;/h2&gt;
&lt;p&gt;Events can be implemented by attaching functions to regular HTML-events. The events are
easily handled by having access to the component state. The HTML is updated with the event, and also
a constant value:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;
&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;operator-button&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;onclick&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;${operator}&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;${ENUM_DIVIDE}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;÷&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All properties can be reactive, and you can make functions that are called when properties
change. The display property is automatically  refreshed each time either the &lt;code&gt;inputBuffer&lt;/code&gt; or &lt;code&gt;answer&lt;/code&gt; has been updated&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;
&lt;span class=&#34;nx&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;makeDisplay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is the full listing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;
&lt;span class=&#34;c1&#34;&gt;/// calculator.js 
&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;define&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;html&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hybrids&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;clear_all&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;op0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_NONE&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;change_sign&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;c1&#34;&gt;// If we are editing the buffer we need to change text,
&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// else we just change the number on the screen.
&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;startsWith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)){&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;substr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;operator1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;parseFloat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Math&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sqrt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;previous&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_SQRT&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;


&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;docalc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pending&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pending&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_PLUS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; 
    &lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt; 
    &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_MULT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_MINUS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_DIVIDE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;op0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;parseFloat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;docalc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pending&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;op0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;previous&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pending&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_EQU&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;op0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_EQU&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;docalc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;previous&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;op0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pending&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt;

  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Event &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Answer: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;comma&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;indexOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;0.&amp;#34;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;makeDisplay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;
  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tmp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tmp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;tmp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tmp&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_NONE&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;ENUM_PLUS&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;ENUM_MINUS&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;ENUM_DIVIDE&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;ENUM_MULT&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;ENUM_SQRT&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;ENUM_EQU&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Calculator&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;op0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;pending&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_NONE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;previous&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ENUM_NONE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;prenum&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;makeDisplay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
  &lt;span class=&#34;nx&#34;&gt;render&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;display&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;lt;link href=&amp;#34;https://fonts.googleapis.com/css?family=Orbitron&amp;amp;display=swap&amp;#34; rel=&amp;#34;stylesheet&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;lt;style&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    .display {
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-family: &amp;#39;Orbitron&amp;#39;, sans-serif;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-size: 3.5em;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      grid-column: 1 / 5;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      text-align: right;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      background: #D4E2E3;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      padding-top: 10px;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    }
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    .number-button {
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-family: &amp;#39;Orbitron&amp;#39;, sans-serif;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-size: 2em;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      background: #383737;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      color: white;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      padding-top: 10px;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      padding-bottom: 10px;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    }
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    .number-wide {
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-family: &amp;#39;Orbitron&amp;#39;, sans-serif;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-size: 2em;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      grid-column: 1 / 3;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      background: #383737;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      color: white;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      padding-top: 10px;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      padding-bottom: 10px;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    }
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    .clear-button {
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-family: &amp;#39;Orbitron&amp;#39;, sans-serif;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-size: 2em;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      background: #C16F45;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      color: white;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      padding-top: 10px;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      padding-bottom: 10px;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    }
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    .operator-button {
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-family: &amp;#39;Orbitron&amp;#39;, sans-serif;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      font-size: 2em;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      background: #5C5A5A;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      color: white;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    }
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    .grid-container {
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      display: grid;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      grid-template-columns: auto auto auto;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      width: 30em;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      height: 34em;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;      background: E1E0E0;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    }
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;/style&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;div class=&amp;#34;grid-container&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;div class=&amp;#34;display&amp;#34;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;clear-button&amp;#34;    onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;clear_all&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;&amp;gt;AC&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;operator-button&amp;#34; onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;change_sign&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;&amp;gt;±&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;operator-button&amp;#34; onclick=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;operator1&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt; value=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ENUM_SQRT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;&amp;gt;√&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;operator-button&amp;#34; onclick=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt; value=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ENUM_DIVIDE&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;&amp;gt;÷&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;1&amp;#34;&amp;gt;1&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;2&amp;#34;&amp;gt;2&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;3&amp;#34;&amp;gt;3&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;operator-button&amp;#34; onclick=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt; value=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ENUM_MULT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;&amp;gt;×&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;4&amp;#34;&amp;gt;4&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;5&amp;#34;&amp;gt;5&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;value=&amp;#34;6&amp;#34;&amp;gt;6&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;operator-button&amp;#34; onclick=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt; value=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ENUM_MINUS&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;&amp;gt;-&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;7&amp;#34;&amp;gt;7&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;8&amp;#34;&amp;gt;8&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;9&amp;#34;&amp;gt;9&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;operator-button&amp;#34; onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ENUM_PLUS&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;&amp;gt;+&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-wide&amp;#34;     onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keypad&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; value=&amp;#34;0&amp;#34;&amp;gt;0&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;number-button&amp;#34;   onclick=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;comma&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;&amp;gt;.&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;button class=&amp;#34;operator-button&amp;#34; onclick=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;  value=&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ENUM_EQU&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;&amp;gt;=&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;    &amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;  `&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;

&lt;span class=&#34;nx&#34;&gt;define&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;my-calculator&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Calculator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;the-final-build&#34;&gt;The final build&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;parcel index.html calculator.js --no-source-maps&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After this, calculator.js is the only file you need to make the calculator work.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The code is a bit messy at this point, and it´s very barebones. When served and
compressed it´s only about 15.4 Kb.&lt;/p&gt;
&lt;p&gt;I might revisit it for a cleanup.&lt;/p&gt;
&lt;p&gt;You will find all the files in the github repository:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/tovare/calc&#34;&gt;https://github.com/tovare/calc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;useful-links&#34;&gt;Useful links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;(&lt;a href=&#34;https://hybrids.js.org/&#34;&gt;https://hybrids.js.org/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
      
    </item>
    
    <item>
      <title>Hybrids</title>
      <link>https://tovare.com/tags/hybrids/</link>
      <pubDate>Sun, 16 Feb 2020 15:21:52 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/hybrids/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>web components</title>
      <link>https://tovare.com/tags/web-components/</link>
      <pubDate>Sun, 16 Feb 2020 15:21:52 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/web-components/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>hosting</title>
      <link>https://tovare.com/tags/hosting/</link>
      <pubDate>Sat, 08 Feb 2020 18:58:51 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/hosting/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Personal computing with a serverless and multi-cloud infrastructure</title>
      <link>https://tovare.com/2020/technotes/</link>
      <pubDate>Sat, 08 Feb 2020 18:58:51 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/2020/technotes/</guid>
      <description></description>
      
      <content>&lt;p&gt;Back in 2015, I wrote a short note about my new technology setup [hello-world].
Here is a summary of the changes since then.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;architecture.png&#34; alt=&#34;Illustration of architecture&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;infrastructure-and-hosting&#34;&gt;Infrastructure and hosting:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare as primary proxy/protection/cache, I previously used Nginx on my server as a proxy.&lt;/li&gt;
&lt;li&gt;Cloudflare workers for static sites. Cloudflare&amp;rsquo;s low-latency workers (cold start 5 ms) using javascript/wasm distributed via CDN. Key-Value storage for static assets.&lt;/li&gt;
&lt;li&gt;Google Cloud Functions for minor functionality. The latency of cloud functions can be high with high cold starts (Often 1 second or more), and their model for scalability allows for less in-memory optimization. They are great for some services and scheduled pub/sub-tasks.&lt;/li&gt;
&lt;li&gt;Google Firebase&lt;/li&gt;
&lt;li&gt;Dedicated virtual server: I still have a dedicated server because stuff is running on it.
&lt;ul&gt;
&lt;li&gt;DigitalOcean droplet.&lt;/li&gt;
&lt;li&gt;SSLMate for the certificate.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Other temporary servers on Amazon EC2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudflare is key in all of this, to bind it all together. Monthly cost breakdown:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare: $5 (Workers w/storage)&lt;/li&gt;
&lt;li&gt;DigitalOcean: $30&lt;/li&gt;
&lt;li&gt;GitHub Pro: $7&lt;/li&gt;
&lt;li&gt;Google Cloud: $0.28&lt;/li&gt;
&lt;li&gt;Amazon Web Services: $2.98&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The free tiers on most of these services are fantastic, and services that only consume resources when they in use have a massive impact on the total cost.  On the Amazon Cloud9 service, you can also have micro-instances for free. The Go language has a relatively small memory footprint partially due to its native UTF-8 support and fast startup-times, so you get a lot done using the lowest Cloud Functions-tier available. Github recently improved its free offering, so the Pro-level might be overkill. I got it mostly due to a massive amount of private repositories. My old server sticks out a bit as very expensive; it is fast and capable, and you can´t beat a live server for low latency, perhaps except for distributing code globally in a CDN, as is the case with Cloudflare workers.&lt;/p&gt;
&lt;h2 id=&#34;technology&#34;&gt;Technology:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hugo with markdown or static HTML for content.&lt;/li&gt;
&lt;li&gt;Javascript for cloud workers and web components.&lt;/li&gt;
&lt;li&gt;Go for API-endpoints and processing.&lt;/li&gt;
&lt;li&gt;R for statistics, but I have stopped using RMarkdown for content management and don´t run the server anymore.&lt;/li&gt;
&lt;li&gt;Python for machine learning scripts&lt;/li&gt;
&lt;li&gt;WebComponents with the Hybrids library.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Still using Cloud 9, but it´s now part of Amazon.&lt;/li&gt;
&lt;li&gt;Favorite local IDE is Microsoft Visual Studio Code, used for Go and Python.&lt;/li&gt;
&lt;li&gt;Rstudio for R, it is just so simple to do some stuff in it.&lt;/li&gt;
&lt;li&gt;Github Pro for version control.&lt;/li&gt;
&lt;li&gt;Evernote for capture.&lt;/li&gt;
&lt;li&gt;Paper and pen.&lt;/li&gt;
&lt;li&gt;More mechanical pencils than five years ago. My favorites are:
&lt;ul&gt;
&lt;li&gt;Pentel GraphGear 1000 for its awesome clip and precision.&lt;/li&gt;
&lt;li&gt;Kuro Toga Advance for notes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Notebooks: Moleskine, Leuchtturm1917, or Rhodia, but I have changed from hardcover to softcover.&lt;/li&gt;
&lt;li&gt;Clip Studio Paint for graphics and a Cintiq 16&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;pencil.png&#34; alt=&#34;This is an image&#34; /&gt;&lt;/p&gt;
</content>
      
    </item>
    
    <item>
      <title>serverless</title>
      <link>https://tovare.com/tags/serverless/</link>
      <pubDate>Sat, 08 Feb 2020 18:58:51 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/serverless/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Passive linking to social media</title>
      <link>https://tovare.com/post/socialmedialinking/</link>
      <pubDate>Sun, 18 Mar 2018 13:25:06 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/socialmedialinking/</guid>
      <description>Embedding scripts from social media sites have implications in that it will result in profiling users who visit your site. Although marketing based on a user profile is mostly considered harmless, however, it has to be done with some degree of awareness by the site owner.</description>
      
      <content>&lt;p&gt;Embedding scripts from social media sites have implications in that it will
result in profiling users who visit your site. Although marketing based on a
user profile is mostly considered harmless, however, it has to be done with some
degree of awareness by the site owner. In an age where machine learning is often
unsupervised in marketing, we need to be aware of methods to mitigate the
potential for harm.&lt;/p&gt;
&lt;p&gt;Consider this example: You have a page to help people with a gambling addiction,
you value the potential of network marketing allowing anyone to share that page
with people who might have a need. There is a potential for harm when the person
visiting the site is profiled through the use of external scripts, as the
marketing-AI might find out that it might be valuable to give this individual an
offer they can´t refuse on a gambling site.&lt;/p&gt;
&lt;p&gt;As new laws are implemented in Europe which impacts large parts of the IT-world,
most sites will need to review their policies. Inconsiderate profiling of user
behavior may in many instances be illegal. In particular, the vulnerabilities of
the data subjects require consideration.&lt;/p&gt;
&lt;p&gt;There are many ways to mitigate risk by not using the scripts social media sites
provide. Read on for helpful pointers.&lt;/p&gt;
&lt;h2 id=&#34;articles&#34;&gt;Articles&lt;/h2&gt;
&lt;p&gt;[Responsible Social Share links] (&lt;a href=&#34;https://jonsuh.com/blog/social-share-links/&#34;&gt;https://jonsuh.com/blog/social-share-links/&lt;/a&gt;
)&lt;/p&gt;
&lt;p&gt;Jonathan Suh highlights the negative performance impacts of the cut-and-paste javascript provided by social media sites, especially over slower 3G and 4G networks. He also goes on to describe alternative ways to make it easy to share content with these sites.&lt;/p&gt;
&lt;h2 id=&#34;libraries&#34;&gt;Libraries&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/bradvin/social-share-urls&#34;&gt;https://github.com/bradvin/social-share-urls&lt;/a&gt;&lt;/p&gt;
</content>
      
    </item>
    
    <item>
      <title>Posts</title>
      <link>https://tovare.com/post/</link>
      <pubDate>Sun, 18 Mar 2018 13:25:06 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Call</title>
      <link>https://tovare.com/tags/call/</link>
      <pubDate>Mon, 20 Feb 2017 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/call/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>mobile</title>
      <link>https://tovare.com/tags/mobile/</link>
      <pubDate>Mon, 20 Feb 2017 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/mobile/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>statistics</title>
      <link>https://tovare.com/tags/statistics/</link>
      <pubDate>Mon, 20 Feb 2017 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/statistics/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Voice calls in decline</title>
      <link>https://tovare.com/post/voicecalls/</link>
      <pubDate>Mon, 20 Feb 2017 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/voicecalls/</guid>
      <description>With data from germany, the sum of both landline and mobile is in decline.</description>
      
      <content>


&lt;p&gt;Data from Statistics showing outgoing calls using mobile and land line shows that mobile has to a large extent replaced landline use and up until 2010 increased usage overall. Since 2010, however, total usage has been in decline&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-1-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;A likely cause is the massive growth of smartphone sales in the same period, offering more methods of communication such as email, WhatsApp, and Facebook.&lt;/p&gt;
&lt;p&gt;Source: &lt;a href=&#34;https://www.statista.com/statistics/461759/landline-vs-mobile-outgoing-call-minutes-germany/&#34; class=&#34;uri&#34;&gt;https://www.statista.com/statistics/461759/landline-vs-mobile-outgoing-call-minutes-germany/&lt;/a&gt;&lt;/p&gt;
</content>
      
    </item>
    
    <item>
      <title>Voice callso</title>
      <link>https://tovare.com/tags/voice-callso/</link>
      <pubDate>Mon, 20 Feb 2017 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/voice-callso/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>NAV</title>
      <link>https://tovare.com/tags/nav/</link>
      <pubDate>Mon, 26 Dec 2016 18:23:09 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/nav/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>R</title>
      <link>https://tovare.com/tags/r/</link>
      <pubDate>Mon, 26 Dec 2016 18:23:09 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/r/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>RStudio</title>
      <link>https://tovare.com/tags/rstudio/</link>
      <pubDate>Mon, 26 Dec 2016 18:23:09 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/rstudio/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>The Norwegian unemployment numbers are available in CSV-format.</title>
      <link>https://tovare.com/post/norwegian_unemployment/</link>
      <pubDate>Mon, 26 Dec 2016 18:23:09 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/norwegian_unemployment/</guid>
      <description></description>
      
      <content>


&lt;div id=&#34;csv&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;CSV&lt;/h2&gt;
&lt;p&gt;In the december publication, there is a link to a CSV-file. (NAV - Helt ledige. Fylke og kommune. April 2017)[&lt;a href=&#34;https://www.nav.no/no/NAV+og+samfunn/Statistikk/Arbeidssokere+og+stillinger+-+statistikk/Hovedtall+om+arbeidsmarkedet&#34; class=&#34;uri&#34;&gt;https://www.nav.no/no/NAV+og+samfunn/Statistikk/Arbeidssokere+og+stillinger+-+statistikk/Hovedtall+om+arbeidsmarkedet&lt;/a&gt;]. The file uses the European semicolon-delimited format and encoded in latin1. The convention used for missing values is a *. The file can be read using the following command.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;dt &amp;lt;- read_csv2(&amp;quot;https://www.nav.no/no/NAV+og+samfunn/Statistikk/Arbeidssokere+og+stillinger+-+statistikk/Hovedtall+om+arbeidsmarkedet/_attachment/488508?_download=true&amp;amp;_ts=15baf454460&amp;quot;, 
                na = c(&amp;quot;&amp;quot;,&amp;quot;*&amp;quot;),
                locale=locale(encoding=&amp;quot;latin1&amp;quot;,decimal_mark = &amp;quot;,&amp;quot;, grouping_mark = &amp;quot;.&amp;quot;),
                col_types = cols(
                  `År-måned` = col_integer(),
                  Fylkesnr = col_character(),
                  Fylkenavn = col_character(),
                  Kommunenr = col_character(),
                  Kommunenavn = col_character(),
                  `Antall helt ledige` = col_integer(),
                  `Helt ledige i prosent av arbeidsstyrken` = col_double()
                ))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The aggregate is a bit off becausev alues less than 4 are not published on the municipal level.&lt;/p&gt;
&lt;p&gt;In addition we cannot calculate the percentages because the size of the workforce is not in this dataset.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;dt2 &amp;lt;- dt %&amp;gt;% filter(!is.na(`Antall helt ledige`)) %&amp;gt;%  arrange(desc(`Antall helt ledige`))

antall_ledige_pr_fylke &amp;lt;- dt2 %&amp;gt;% arrange(Fylkenavn) %&amp;gt;% group_by(Fylkenavn) %&amp;gt;% summarise(ledige = sum(`Antall helt ledige`))

ggplot(antall_ledige_pr_fylke) +
  geom_bar(aes(x=reorder(Fylkenavn, ledige), y=ledige), stat=&amp;#39;identity&amp;#39;) +
  coord_flip() +
  theme_tufte()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://tovare.com/post/norwegian_unemployment_files/figure-html/unnamed-chunk-2-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;kable(head(antall_ledige_pr_fylke))&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&#34;header&#34;&gt;
&lt;th align=&#34;left&#34;&gt;Fylkenavn&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;ledige&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Akershus&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;6973&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Aust-Agder&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1833&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Buskerud&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;3804&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Finnmark&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1413&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Hedmark&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2062&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;Hordaland&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;9152&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div id=&#34;workforce-data-is-available-from-statistics-norway.&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Workforce data is available from Statistics Norway.&lt;/h2&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;tabellurl &amp;lt;- &amp;#39;http://data.ssb.no/api/v0/en/table/03321&amp;#39;

ssbquery &amp;lt;- &amp;#39;
{
  &amp;quot;query&amp;quot;: [
    {
      &amp;quot;code&amp;quot;: &amp;quot;Bokommuen&amp;quot;,
      &amp;quot;selection&amp;quot;: {
        &amp;quot;filter&amp;quot;: &amp;quot;item&amp;quot;,
        &amp;quot;values&amp;quot;: [&amp;quot;0101&amp;quot;,&amp;quot;0104&amp;quot;,&amp;quot;0105&amp;quot;,&amp;quot;0106&amp;quot;,&amp;quot;0111&amp;quot;,&amp;quot;0118&amp;quot;,&amp;quot;0119&amp;quot;,&amp;quot;0121&amp;quot;,&amp;quot;0122&amp;quot;,&amp;quot;0123&amp;quot;,&amp;quot;0124&amp;quot;,&amp;quot;0125&amp;quot;,&amp;quot;0127&amp;quot;,&amp;quot;0128&amp;quot;,&amp;quot;0135&amp;quot;,&amp;quot;0136&amp;quot;,&amp;quot;0137&amp;quot;,&amp;quot;0138&amp;quot;,&amp;quot;0211&amp;quot;,&amp;quot;0213&amp;quot;,&amp;quot;0214&amp;quot;,&amp;quot;0215&amp;quot;,&amp;quot;0216&amp;quot;,&amp;quot;0217&amp;quot;,&amp;quot;0219&amp;quot;,&amp;quot;0220&amp;quot;,&amp;quot;0221&amp;quot;,&amp;quot;0226&amp;quot;,&amp;quot;0227&amp;quot;,&amp;quot;0228&amp;quot;,&amp;quot;0229&amp;quot;,&amp;quot;0230&amp;quot;,&amp;quot;0231&amp;quot;,&amp;quot;0233&amp;quot;,&amp;quot;0234&amp;quot;,&amp;quot;0235&amp;quot;,&amp;quot;0236&amp;quot;,&amp;quot;0237&amp;quot;,&amp;quot;0238&amp;quot;,&amp;quot;0239&amp;quot;,&amp;quot;0301&amp;quot;,&amp;quot;0402&amp;quot;,&amp;quot;0403&amp;quot;,&amp;quot;0412&amp;quot;,&amp;quot;0415&amp;quot;,&amp;quot;0417&amp;quot;,&amp;quot;0418&amp;quot;,&amp;quot;0419&amp;quot;,&amp;quot;0420&amp;quot;,&amp;quot;0423&amp;quot;,&amp;quot;0425&amp;quot;,&amp;quot;0426&amp;quot;,&amp;quot;0427&amp;quot;,&amp;quot;0428&amp;quot;,&amp;quot;0429&amp;quot;,&amp;quot;0430&amp;quot;,&amp;quot;0432&amp;quot;,&amp;quot;0434&amp;quot;,&amp;quot;0436&amp;quot;,&amp;quot;0437&amp;quot;,&amp;quot;0438&amp;quot;,&amp;quot;0439&amp;quot;,&amp;quot;0441&amp;quot;,&amp;quot;0501&amp;quot;,&amp;quot;0502&amp;quot;,&amp;quot;0511&amp;quot;,&amp;quot;0512&amp;quot;,&amp;quot;0513&amp;quot;,&amp;quot;0514&amp;quot;,&amp;quot;0515&amp;quot;,&amp;quot;0516&amp;quot;,&amp;quot;0517&amp;quot;,&amp;quot;0519&amp;quot;,&amp;quot;0520&amp;quot;,&amp;quot;0521&amp;quot;,&amp;quot;0522&amp;quot;,&amp;quot;0528&amp;quot;,&amp;quot;0529&amp;quot;,&amp;quot;0532&amp;quot;,&amp;quot;0533&amp;quot;,&amp;quot;0534&amp;quot;,&amp;quot;0536&amp;quot;,&amp;quot;0538&amp;quot;,&amp;quot;0540&amp;quot;,&amp;quot;0541&amp;quot;,&amp;quot;0542&amp;quot;,&amp;quot;0543&amp;quot;,&amp;quot;0544&amp;quot;,&amp;quot;0545&amp;quot;,&amp;quot;0602&amp;quot;,&amp;quot;0604&amp;quot;,&amp;quot;0605&amp;quot;,&amp;quot;0612&amp;quot;,&amp;quot;0615&amp;quot;,&amp;quot;0616&amp;quot;,&amp;quot;0617&amp;quot;,&amp;quot;0618&amp;quot;,&amp;quot;0619&amp;quot;,&amp;quot;0620&amp;quot;,&amp;quot;0621&amp;quot;,&amp;quot;0622&amp;quot;,&amp;quot;0623&amp;quot;,&amp;quot;0624&amp;quot;,&amp;quot;0625&amp;quot;,&amp;quot;0626&amp;quot;,&amp;quot;0627&amp;quot;,&amp;quot;0628&amp;quot;,&amp;quot;0631&amp;quot;,&amp;quot;0632&amp;quot;,&amp;quot;0633&amp;quot;,&amp;quot;0701&amp;quot;,&amp;quot;0702&amp;quot;,&amp;quot;0704&amp;quot;,&amp;quot;0706&amp;quot;,&amp;quot;0709&amp;quot;,&amp;quot;0710&amp;quot;,&amp;quot;0711&amp;quot;,&amp;quot;0713&amp;quot;,&amp;quot;0714&amp;quot;,&amp;quot;0716&amp;quot;,&amp;quot;0719&amp;quot;,&amp;quot;0720&amp;quot;,&amp;quot;0722&amp;quot;,&amp;quot;0723&amp;quot;,&amp;quot;0728&amp;quot;,&amp;quot;0805&amp;quot;,&amp;quot;0806&amp;quot;,&amp;quot;0807&amp;quot;,&amp;quot;0811&amp;quot;,&amp;quot;0814&amp;quot;,&amp;quot;0815&amp;quot;,&amp;quot;0817&amp;quot;,&amp;quot;0819&amp;quot;,&amp;quot;0821&amp;quot;,&amp;quot;0822&amp;quot;,&amp;quot;0826&amp;quot;,&amp;quot;0827&amp;quot;,&amp;quot;0828&amp;quot;,&amp;quot;0829&amp;quot;,&amp;quot;0830&amp;quot;,&amp;quot;0831&amp;quot;,&amp;quot;0833&amp;quot;,&amp;quot;0834&amp;quot;,&amp;quot;0901&amp;quot;,&amp;quot;0904&amp;quot;,&amp;quot;0906&amp;quot;,&amp;quot;0911&amp;quot;,&amp;quot;0912&amp;quot;,&amp;quot;0914&amp;quot;,&amp;quot;0919&amp;quot;,&amp;quot;0926&amp;quot;,&amp;quot;0928&amp;quot;,&amp;quot;0929&amp;quot;,&amp;quot;0935&amp;quot;,&amp;quot;0937&amp;quot;,&amp;quot;0938&amp;quot;,&amp;quot;0940&amp;quot;,&amp;quot;0941&amp;quot;,&amp;quot;1001&amp;quot;,&amp;quot;1002&amp;quot;,&amp;quot;1003&amp;quot;,&amp;quot;1004&amp;quot;,&amp;quot;1014&amp;quot;,&amp;quot;1017&amp;quot;,&amp;quot;1018&amp;quot;,&amp;quot;1021&amp;quot;,&amp;quot;1026&amp;quot;,&amp;quot;1027&amp;quot;,&amp;quot;1029&amp;quot;,&amp;quot;1032&amp;quot;,&amp;quot;1034&amp;quot;,&amp;quot;1037&amp;quot;,&amp;quot;1046&amp;quot;,&amp;quot;1101&amp;quot;,&amp;quot;1102&amp;quot;,&amp;quot;1103&amp;quot;,&amp;quot;1106&amp;quot;,&amp;quot;1111&amp;quot;,&amp;quot;1112&amp;quot;,&amp;quot;1114&amp;quot;,&amp;quot;1119&amp;quot;,&amp;quot;1120&amp;quot;,&amp;quot;1121&amp;quot;,&amp;quot;1122&amp;quot;,&amp;quot;1124&amp;quot;,&amp;quot;1127&amp;quot;,&amp;quot;1129&amp;quot;,&amp;quot;1130&amp;quot;,&amp;quot;1133&amp;quot;,&amp;quot;1134&amp;quot;,&amp;quot;1135&amp;quot;,&amp;quot;1141&amp;quot;,&amp;quot;1142&amp;quot;,&amp;quot;1144&amp;quot;,&amp;quot;1145&amp;quot;,&amp;quot;1146&amp;quot;,&amp;quot;1149&amp;quot;,&amp;quot;1151&amp;quot;,&amp;quot;1154&amp;quot;,&amp;quot;1159&amp;quot;,&amp;quot;1160&amp;quot;,&amp;quot;1201&amp;quot;,&amp;quot;1211&amp;quot;,&amp;quot;1216&amp;quot;,&amp;quot;1219&amp;quot;,&amp;quot;1221&amp;quot;,&amp;quot;1222&amp;quot;,&amp;quot;1223&amp;quot;,&amp;quot;1224&amp;quot;,&amp;quot;1227&amp;quot;,&amp;quot;1228&amp;quot;,&amp;quot;1231&amp;quot;,&amp;quot;1232&amp;quot;,&amp;quot;1233&amp;quot;,&amp;quot;1234&amp;quot;,&amp;quot;1235&amp;quot;,&amp;quot;1238&amp;quot;,&amp;quot;1241&amp;quot;,&amp;quot;1242&amp;quot;,&amp;quot;1243&amp;quot;,&amp;quot;1244&amp;quot;,&amp;quot;1245&amp;quot;,&amp;quot;1246&amp;quot;,&amp;quot;1247&amp;quot;,&amp;quot;1251&amp;quot;,&amp;quot;1252&amp;quot;,&amp;quot;1253&amp;quot;,&amp;quot;1256&amp;quot;,&amp;quot;1259&amp;quot;,&amp;quot;1260&amp;quot;,&amp;quot;1263&amp;quot;,&amp;quot;1264&amp;quot;,&amp;quot;1265&amp;quot;,&amp;quot;1266&amp;quot;,&amp;quot;1401&amp;quot;,&amp;quot;1411&amp;quot;,&amp;quot;1412&amp;quot;,&amp;quot;1413&amp;quot;,&amp;quot;1416&amp;quot;,&amp;quot;1417&amp;quot;,&amp;quot;1418&amp;quot;,&amp;quot;1419&amp;quot;,&amp;quot;1420&amp;quot;,&amp;quot;1421&amp;quot;,&amp;quot;1422&amp;quot;,&amp;quot;1424&amp;quot;,&amp;quot;1426&amp;quot;,&amp;quot;1428&amp;quot;,&amp;quot;1429&amp;quot;,&amp;quot;1430&amp;quot;,&amp;quot;1431&amp;quot;,&amp;quot;1432&amp;quot;,&amp;quot;1433&amp;quot;,&amp;quot;1438&amp;quot;,&amp;quot;1439&amp;quot;,&amp;quot;1441&amp;quot;,&amp;quot;1443&amp;quot;,&amp;quot;1444&amp;quot;,&amp;quot;1445&amp;quot;,&amp;quot;1449&amp;quot;,&amp;quot;1502&amp;quot;,&amp;quot;1503&amp;quot;,&amp;quot;1504&amp;quot;,&amp;quot;1505&amp;quot;,&amp;quot;1511&amp;quot;,&amp;quot;1514&amp;quot;,&amp;quot;1515&amp;quot;,&amp;quot;1516&amp;quot;,&amp;quot;1517&amp;quot;,&amp;quot;1519&amp;quot;,&amp;quot;1520&amp;quot;,&amp;quot;1523&amp;quot;,&amp;quot;1524&amp;quot;,&amp;quot;1525&amp;quot;,&amp;quot;1526&amp;quot;,&amp;quot;1528&amp;quot;,&amp;quot;1529&amp;quot;,&amp;quot;1531&amp;quot;,&amp;quot;1532&amp;quot;,&amp;quot;1534&amp;quot;,&amp;quot;1535&amp;quot;,&amp;quot;1539&amp;quot;,&amp;quot;1543&amp;quot;,&amp;quot;1545&amp;quot;,&amp;quot;1546&amp;quot;,&amp;quot;1547&amp;quot;,&amp;quot;1548&amp;quot;,&amp;quot;1551&amp;quot;,&amp;quot;1554&amp;quot;,&amp;quot;1556&amp;quot;,&amp;quot;1557&amp;quot;,&amp;quot;1560&amp;quot;,&amp;quot;1563&amp;quot;,&amp;quot;1566&amp;quot;,&amp;quot;1567&amp;quot;,&amp;quot;1569&amp;quot;,&amp;quot;1571&amp;quot;,&amp;quot;1572&amp;quot;,&amp;quot;1573&amp;quot;,&amp;quot;1576&amp;quot;,&amp;quot;1601&amp;quot;,&amp;quot;1612&amp;quot;,&amp;quot;1613&amp;quot;,&amp;quot;1617&amp;quot;,&amp;quot;1620&amp;quot;,&amp;quot;1621&amp;quot;,&amp;quot;1622&amp;quot;,&amp;quot;1624&amp;quot;,&amp;quot;1627&amp;quot;,&amp;quot;1630&amp;quot;,&amp;quot;1632&amp;quot;,&amp;quot;1633&amp;quot;,&amp;quot;1634&amp;quot;,&amp;quot;1635&amp;quot;,&amp;quot;1636&amp;quot;,&amp;quot;1638&amp;quot;,&amp;quot;1640&amp;quot;,&amp;quot;1644&amp;quot;,&amp;quot;1648&amp;quot;,&amp;quot;1653&amp;quot;,&amp;quot;1657&amp;quot;,&amp;quot;1662&amp;quot;,&amp;quot;1663&amp;quot;,&amp;quot;1664&amp;quot;,&amp;quot;1665&amp;quot;,&amp;quot;1702&amp;quot;,&amp;quot;1703&amp;quot;,&amp;quot;1711&amp;quot;,&amp;quot;1714&amp;quot;,&amp;quot;1717&amp;quot;,&amp;quot;1718&amp;quot;,&amp;quot;1719&amp;quot;,&amp;quot;1721&amp;quot;,&amp;quot;1723&amp;quot;,&amp;quot;1724&amp;quot;,&amp;quot;1725&amp;quot;,&amp;quot;1729&amp;quot;,&amp;quot;1736&amp;quot;,&amp;quot;1738&amp;quot;,&amp;quot;1739&amp;quot;,&amp;quot;1740&amp;quot;,&amp;quot;1742&amp;quot;,&amp;quot;1743&amp;quot;,&amp;quot;1744&amp;quot;,&amp;quot;1748&amp;quot;,&amp;quot;1749&amp;quot;,&amp;quot;1750&amp;quot;,&amp;quot;1751&amp;quot;,&amp;quot;1755&amp;quot;,&amp;quot;1756&amp;quot;,&amp;quot;1804&amp;quot;,&amp;quot;1805&amp;quot;,&amp;quot;1811&amp;quot;,&amp;quot;1812&amp;quot;,&amp;quot;1813&amp;quot;,&amp;quot;1815&amp;quot;,&amp;quot;1816&amp;quot;,&amp;quot;1818&amp;quot;,&amp;quot;1820&amp;quot;,&amp;quot;1822&amp;quot;,&amp;quot;1824&amp;quot;,&amp;quot;1825&amp;quot;,&amp;quot;1826&amp;quot;,&amp;quot;1827&amp;quot;,&amp;quot;1828&amp;quot;,&amp;quot;1832&amp;quot;,&amp;quot;1833&amp;quot;,&amp;quot;1834&amp;quot;,&amp;quot;1835&amp;quot;,&amp;quot;1836&amp;quot;,&amp;quot;1837&amp;quot;,&amp;quot;1838&amp;quot;,&amp;quot;1839&amp;quot;,&amp;quot;1840&amp;quot;,&amp;quot;1841&amp;quot;,&amp;quot;1842&amp;quot;,&amp;quot;1845&amp;quot;,&amp;quot;1848&amp;quot;,&amp;quot;1849&amp;quot;,&amp;quot;1850&amp;quot;,&amp;quot;1851&amp;quot;,&amp;quot;1852&amp;quot;,&amp;quot;1853&amp;quot;,&amp;quot;1854&amp;quot;,&amp;quot;1856&amp;quot;,&amp;quot;1857&amp;quot;,&amp;quot;1859&amp;quot;,&amp;quot;1860&amp;quot;,&amp;quot;1865&amp;quot;,&amp;quot;1866&amp;quot;,&amp;quot;1867&amp;quot;,&amp;quot;1868&amp;quot;,&amp;quot;1870&amp;quot;,&amp;quot;1871&amp;quot;,&amp;quot;1874&amp;quot;,&amp;quot;1901&amp;quot;,&amp;quot;1902&amp;quot;,&amp;quot;1903&amp;quot;,&amp;quot;1911&amp;quot;,&amp;quot;1913&amp;quot;,&amp;quot;1915&amp;quot;,&amp;quot;1917&amp;quot;,&amp;quot;1919&amp;quot;,&amp;quot;1920&amp;quot;,&amp;quot;1922&amp;quot;,&amp;quot;1923&amp;quot;,&amp;quot;1924&amp;quot;,&amp;quot;1925&amp;quot;,&amp;quot;1926&amp;quot;,&amp;quot;1927&amp;quot;,&amp;quot;1928&amp;quot;,&amp;quot;1929&amp;quot;,&amp;quot;1931&amp;quot;,&amp;quot;1933&amp;quot;,&amp;quot;1936&amp;quot;,&amp;quot;1938&amp;quot;,&amp;quot;1939&amp;quot;,&amp;quot;1940&amp;quot;,&amp;quot;1941&amp;quot;,&amp;quot;1942&amp;quot;,&amp;quot;1943&amp;quot;,&amp;quot;2002&amp;quot;,&amp;quot;2003&amp;quot;,&amp;quot;2004&amp;quot;,&amp;quot;2011&amp;quot;,&amp;quot;2012&amp;quot;,&amp;quot;2014&amp;quot;,&amp;quot;2015&amp;quot;,&amp;quot;2017&amp;quot;,&amp;quot;2018&amp;quot;,&amp;quot;2019&amp;quot;,&amp;quot;2020&amp;quot;,&amp;quot;2021&amp;quot;,&amp;quot;2022&amp;quot;,&amp;quot;2023&amp;quot;,&amp;quot;2024&amp;quot;,&amp;quot;2025&amp;quot;,&amp;quot;2027&amp;quot;,&amp;quot;2028&amp;quot;,&amp;quot;2030&amp;quot;,&amp;quot;2111-2211&amp;quot;,&amp;quot;2311&amp;quot;,&amp;quot;2321&amp;quot;]
      }
    },
    {
      &amp;quot;code&amp;quot;: &amp;quot;ContentsCode&amp;quot;,
      &amp;quot;selection&amp;quot;: {
        &amp;quot;filter&amp;quot;: &amp;quot;item&amp;quot;,
        &amp;quot;values&amp;quot;: [
          &amp;quot;Sysselsatte&amp;quot;
        ]
      }
    },
    {
      &amp;quot;code&amp;quot;: &amp;quot;Tid&amp;quot;,
      &amp;quot;selection&amp;quot;: {
        &amp;quot;filter&amp;quot;: &amp;quot;item&amp;quot;,
        &amp;quot;values&amp;quot;: [
          &amp;quot;2016&amp;quot;
        ]
      }
    }
  ],
  &amp;quot;response&amp;quot;: {
    &amp;quot;format&amp;quot;: &amp;quot;json-stat&amp;quot;
  }
}&amp;#39;


res &amp;lt;- content(POST(tabellurl,body=ssbquery),type=&amp;quot;text&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## No encoding supplied: defaulting to UTF-8.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;workforce &amp;lt;- as.data.frame(fromJSONstat(res, naming=&amp;quot;id&amp;quot;)) %&amp;gt;% rename(Kommunenr = dataset.Bokommuen, sysselsatte = dataset.value )

kable(head(workforce))&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&#34;header&#34;&gt;
&lt;th align=&#34;left&#34;&gt;Kommunenr&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;dataset.ContentsCode&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;dataset.Tid&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;sysselsatte&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;0101&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;13480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;0104&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;14468&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;0105&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;24298&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;0106&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;36583&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;0111&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2082&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;0118&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;640&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;TODO: Not quite there yet with the calculations.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;samletab &amp;lt;- left_join(dt,workforce, by=&amp;quot;Kommunenr&amp;quot;)

tab &amp;lt;- samletab %&amp;gt;% mutate( arbeidsstyrken = sysselsatte + `Antall helt ledige`,
                     pros = `Antall helt ledige` / arbeidsstyrken)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;kable(head(tab))&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&#34;header&#34;&gt;
&lt;th align=&#34;right&#34;&gt;År-måned&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Fylkesnr&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Fylkenavn&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Kommunenr&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Kommunenavn&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;Antall helt ledige&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;Helt ledige i prosent av arbeidsstyrken&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;dataset.ContentsCode&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;dataset.Tid&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;sysselsatte&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;arbeidsstyrken&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;pros&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;right&#34;&gt;201704&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;01&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Østfold&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0101&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Halden&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;410&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2.8&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;13480&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;13890&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;0.0295176&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;right&#34;&gt;201704&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;01&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Østfold&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0104&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Moss&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;602&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;3.9&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;14468&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;15070&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;0.0399469&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;right&#34;&gt;201704&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;01&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Østfold&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0105&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sarpsborg&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;778&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2.9&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;24298&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;25076&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;0.0310257&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;right&#34;&gt;201704&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;01&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Østfold&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0106&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Fredrikstad&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1271&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;3.2&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;36583&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;37854&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;0.0335764&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;right&#34;&gt;201704&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;01&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Østfold&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0111&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Hvaler&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;50&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2.2&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2082&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2132&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;0.0234522&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;right&#34;&gt;201704&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;01&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Østfold&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0118&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Aremark&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;12&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1.8&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Sysselsatte&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2016&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;640&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;652&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;0.0184049&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div id=&#34;kilder&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Kilder&lt;/h2&gt;
&lt;p&gt;(NAV - Helt ledige. Fylke og kommune. Desember 2016)[&lt;a href=&#34;https://www.nav.no/no/NAV+og+samfunn/Statistikk/Arbeidssokere+og+stillinger+-+statistikk/Hovedtall+om+arbeidsmarkedet&#34; class=&#34;uri&#34;&gt;https://www.nav.no/no/NAV+og+samfunn/Statistikk/Arbeidssokere+og+stillinger+-+statistikk/Hovedtall+om+arbeidsmarkedet&lt;/a&gt;]&lt;/p&gt;
&lt;/div&gt;
</content>
      
    </item>
    
    <item>
      <title>unemployment</title>
      <link>https://tovare.com/tags/unemployment/</link>
      <pubDate>Mon, 26 Dec 2016 18:23:09 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/unemployment/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>data sciene</title>
      <link>https://tovare.com/tags/data-sciene/</link>
      <pubDate>Sun, 25 Dec 2016 18:23:09 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/data-sciene/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>gplot2</title>
      <link>https://tovare.com/tags/gplot2/</link>
      <pubDate>Sun, 25 Dec 2016 18:23:09 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/gplot2/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>R Blogdown with RStudio sample page</title>
      <link>https://tovare.com/post/r/</link>
      <pubDate>Sun, 25 Dec 2016 18:23:09 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/r/</guid>
      <description>This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents.</description>
      
      <content>For more details on using R Markdown see &lt;a href=&#34;http://rmarkdown.rstudio.com&#34; class=&#34;uri&#34;&gt;http://rmarkdown.rstudio.com&lt;/a&gt;. When you click the &lt;strong&gt;Knit&lt;/strong&gt; button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;summary(cars)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;including-plots&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Including Plots&lt;/h1&gt;
&lt;p&gt;You can also embed plots, for example:&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;&lt;span id=&#34;fig:pressure&#34;&gt;&lt;/span&gt;
&lt;img src=&#34;pressure-1.svg&#34; alt=&#34;My first figure&#34; width=&#34;672&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;
Figure 1: My first figure
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Note that the &lt;code&gt;echo = FALSE&lt;/code&gt; parameter was added to the code chunk to prevent printing of the R code that generated the plot.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;blogdown&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Blogdown&lt;/h1&gt;
&lt;p&gt;Generating a site with Hugo is very fast; however, Rmd-files can take som time because all the code is executed and all the graphs are saved to disk. But the page is only regenerated when the contents have changed. On a 2GHz server with SSD, this page takes 24 seconds to produce each time it is modified. Pages with more sophisticated analysis will take longer. For complex analysis, the ability to just run the chunk you are working on in RStudio is very useful.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;drawing-graphs-with-ggplot2&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Drawing graphs with ggplot2&lt;/h1&gt;
&lt;p&gt;A lot examples are from the book (R for Data Science: Import, Tidy, Transform, Visualize, and Model Data)[&lt;a href=&#34;http://amzn.to/2ixHRe4&#34; class=&#34;uri&#34;&gt;http://amzn.to/2ixHRe4&lt;/a&gt;] which presents a consistent and easy to use collection of modern R packages for data science which is bundled in tidyverse library. Get the book, it’s great!&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;suppressMessages(library(tidyverse))
library(ggthemes)


ggplot(data = mpg) + geom_point(mapping = aes(x= displ, y = hwy,  color=class)) +
   theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-1-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy)) +
  facet_wrap(~ class, nrow = 2) + 
  theme_minimal()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-2-1.svg&#34; width=&#34;672&#34; /&gt; front-wheel drive, r = rear wheel drive, 4 = 4wd&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color=class)) +
  facet_grid(. ~ cyl) +
  theme_minimal()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-3-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color=class)) +
  facet_grid(drv ~ .) +
   theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-4-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color=class)) +
  facet_grid(. ~ cyl) +
   theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-5-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = mpg) +
  geom_smooth(mapping = aes(x = displ, y = hwy),method=&amp;#39;loess&amp;#39;) +
  geom_point(mapping = aes(x = displ, y = hwy, color=class)) +
   theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-6-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = mpg) +
  geom_smooth(mapping = aes(x = displ, y = hwy, linetype= drv), method=loess ) +
  geom_point(mapping = aes(x = displ, y = hwy, color=class))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-7-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Mapping passed to the geoms:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = mpg,(mapping = aes(x = displ, y = hwy, linetype= drv) )) +
  geom_smooth( method=loess ) +
  geom_point( mapping = aes( color=class)) + # &amp;lt;-- extend/overwrite global aes.
  theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-8-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot( data = mpg, mapping = aes(x = displ, y = hwy)) +
  geom_point(mapping = aes(color = class), position=&amp;quot;jitter&amp;quot;)+
  geom_smooth(
    data = filter(mpg, class == &amp;#39;subcompact&amp;#39;),
    se = FALSE,
    method = loess
  ) + 
  theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-9-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot( data = diamonds) +
  geom_bar( mapping = aes(x = cut)) +
   theme_gdocs() &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-10-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;d &amp;lt;- tribble (
  ~a, ~b,
  &amp;quot;v1&amp;quot;, 10,
  &amp;quot;v2&amp;quot;, 20
)
ggplot(data = d) +
  geom_bar( mapping = aes(x = a, y = b), stat = &amp;quot;identity&amp;quot;) +
  coord_flip() +
   theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-11-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = diamonds, mapping = aes(x = cut, y = depth, color = clarity)) +
  stat_summary(
    fun.ymin = min,
    fun.ymax = max,
    fun.y = median
  ) +
   theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-12-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = diamonds) +
  geom_bar(mapping = aes(x = cut, fill = clarity), position = &amp;quot;dodge&amp;quot;) +
   theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-13-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(data = mpg) +
  geom_boxplot( mapping = aes( x = class,y = cty)) +
  theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-14-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;dplyr&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;dplyr&lt;/h1&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(nycflights13)
library(htmlTable)
flights_to_IAH_HOU &amp;lt;- filter(flights, 
                               dest %in% c(&amp;quot;IAH&amp;quot;,&amp;quot;HOU&amp;quot;) &amp;amp;
                               arr_delay &amp;gt; 120 &amp;amp;
                               carrier %in% c(&amp;quot;UA&amp;quot;,&amp;quot;DL&amp;quot;) &amp;amp;
                               month %in% c(7,8,9) &amp;amp;
                               between(dep_time,0000,0600))

flights_by_date &amp;lt;- arrange(flights, year, month, day)
flights_by_descending_date &amp;lt;- arrange(flights, desc(year), desc(month), desc(day))

htmlTable(select(flights_to_IAH_HOU, year:day, carrier),
          caption = &amp;quot;Flights to honolulo with a delay of more than two hours flwn by United or Delta in july through september departing between 00 - 06&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;table class=&#34;gmisc_table&#34; style=&#34;border-collapse: collapse; margin-top: 1em; margin-bottom: 1em;&#34;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td colspan=&#34;5&#34; style=&#34;text-align: left;&#34;&gt;
Flights to honolulo with a delay of more than two hours flwn by United or Delta in july through september departing between 00 - 06
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey;&#34;&gt;
&lt;/th&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;&#34;&gt;
year
&lt;/th&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;&#34;&gt;
month
&lt;/th&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;&#34;&gt;
day
&lt;/th&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;&#34;&gt;
carrier
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align: center;&#34;&gt;
2013
&lt;/td&gt;
&lt;td style=&#34;text-align: center;&#34;&gt;
7
&lt;/td&gt;
&lt;td style=&#34;text-align: center;&#34;&gt;
10
&lt;/td&gt;
&lt;td style=&#34;text-align: center;&#34;&gt;
UA
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: left;&#34;&gt;
2
&lt;/td&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: center;&#34;&gt;
2013
&lt;/td&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: center;&#34;&gt;
7
&lt;/td&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: center;&#34;&gt;
28
&lt;/td&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: center;&#34;&gt;
UA
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;vars &amp;lt;- c(&amp;#39;year&amp;#39;,&amp;#39;month&amp;#39;,&amp;#39;day&amp;#39;,&amp;#39;dep_delay&amp;#39;,&amp;#39;arr_delay&amp;#39;)
htmlTable(select(flights_to_IAH_HOU, one_of(vars)))&lt;/code&gt;&lt;/pre&gt;
&lt;table class=&#34;gmisc_table&#34; style=&#34;border-collapse: collapse; margin-top: 1em; margin-bottom: 1em;&#34;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey;&#34;&gt;
&lt;/th&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;&#34;&gt;
year
&lt;/th&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;&#34;&gt;
month
&lt;/th&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;&#34;&gt;
day
&lt;/th&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;&#34;&gt;
dep_delay
&lt;/th&gt;
&lt;th style=&#34;border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;&#34;&gt;
arr_delay
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align: left;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align: center;&#34;&gt;
2013
&lt;/td&gt;
&lt;td style=&#34;text-align: center;&#34;&gt;
7
&lt;/td&gt;
&lt;td style=&#34;text-align: center;&#34;&gt;
10
&lt;/td&gt;
&lt;td style=&#34;text-align: center;&#34;&gt;
331
&lt;/td&gt;
&lt;td style=&#34;text-align: center;&#34;&gt;
301
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: left;&#34;&gt;
2
&lt;/td&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: center;&#34;&gt;
2013
&lt;/td&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: center;&#34;&gt;
7
&lt;/td&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: center;&#34;&gt;
28
&lt;/td&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: center;&#34;&gt;
348
&lt;/td&gt;
&lt;td style=&#34;border-bottom: 2px solid grey; text-align: center;&#34;&gt;
324
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div id=&#34;data-wrangling&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Data wrangling&lt;/h2&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;flights_sel &amp;lt;- select(flights, year:day, ends_with(&amp;#39;delay&amp;#39;), distance, air_time)

mutate(flights_sel, 
       gain = arr_delay - dep_delay,
       speed = distance / air_time * 60
       )&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## # A tibble: 336,776 x 9
##     year month   day dep_delay arr_delay distance air_time  gain speed
##    &amp;lt;int&amp;gt; &amp;lt;int&amp;gt; &amp;lt;int&amp;gt;     &amp;lt;dbl&amp;gt;     &amp;lt;dbl&amp;gt;    &amp;lt;dbl&amp;gt;    &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;
##  1  2013     1     1         2        11     1400      227     9  370.
##  2  2013     1     1         4        20     1416      227    16  374.
##  3  2013     1     1         2        33     1089      160    31  408.
##  4  2013     1     1        -1       -18     1576      183   -17  517.
##  5  2013     1     1        -6       -25      762      116   -19  394.
##  6  2013     1     1        -4        12      719      150    16  288.
##  7  2013     1     1        -5        19     1065      158    24  404.
##  8  2013     1     1        -3       -14      229       53   -11  259.
##  9  2013     1     1        -3        -8      944      140    -5  405.
## 10  2013     1     1        -2         8      733      138    10  319.
## # ... with 336,766 more rows&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;transmute(flights_sel, 
       gain = arr_delay - dep_delay,
       speed = distance / air_time * 60
       )&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## # A tibble: 336,776 x 2
##     gain speed
##    &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;
##  1     9  370.
##  2    16  374.
##  3    31  408.
##  4   -17  517.
##  5   -19  394.
##  6    16  288.
##  7    24  404.
##  8   -11  259.
##  9    -5  405.
## 10    10  319.
## # ... with 336,766 more rows&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;delay_mean &amp;lt;- summarize(flights,delay = mean(dep_delay, na.rm = TRUE))
print(delay_mean)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## # A tibble: 1 x 1
##   delay
##   &amp;lt;dbl&amp;gt;
## 1  12.6&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;by_month &amp;lt;- group_by(flights, month)
delay_month &amp;lt;- summarize(by_month, delay = mean(dep_delay, na.rm = TRUE))
delay_month &amp;lt;- mutate(delay_month, small_delay = (delay &amp;lt; 15) )
ggplot(data = delay_month, mapping = aes(x = month,y = delay, fill=small_delay)) +
  geom_bar(stat = &amp;quot;identity&amp;quot;) +
  scale_x_discrete(limits = month.abb) +
  theme_gdocs()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-18-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;delay &amp;lt;- flights %&amp;gt;%
  group_by(dest) %&amp;gt;%
  summarize(
    count = n(),
    dist = mean(distance, na.rm = TRUE),
    delay = mean(arr_delay, na.rm = TRUE)
  ) %&amp;gt;%
  filter(count &amp;gt; 20, dest != &amp;quot;HNL&amp;quot;)
ggplot(data = delay, mapping = aes( x = dist, y = delay)) +
  geom_point( aes(size = count), alpha = 1/1) +
  geom_smooth( se = FALSE, method = loess) &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-19-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;not_cancelled &amp;lt;- flights %&amp;gt;% filter(!is.na(dep_delay), !is.na(arr_delay))

delays &amp;lt;- not_cancelled %&amp;gt;% 
  group_by(tailnum) %&amp;gt;%
  summarize(
    delay = mean(arr_delay)
  )

ggplot(data = delays, mapping = aes(x = delay)) +
  geom_area(stat=&amp;quot;bin&amp;quot;,binwidth = 10) + 
  geom_freqpoly(binwidth = 10)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;unnamed-chunk-20-1.svg&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
      
    </item>
    
    <item>
      <title>Categories</title>
      <link>https://tovare.com/categories/</link>
      <pubDate>Wed, 12 Oct 2016 22:59:29 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>hls</title>
      <link>https://tovare.com/categories/hls/</link>
      <pubDate>Wed, 12 Oct 2016 22:59:29 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/hls/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>mp4</title>
      <link>https://tovare.com/categories/mp4/</link>
      <pubDate>Wed, 12 Oct 2016 22:59:29 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/mp4/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>video</title>
      <link>https://tovare.com/tags/video/</link>
      <pubDate>Wed, 12 Oct 2016 22:59:29 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/video/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>video</title>
      <link>https://tovare.com/categories/video/</link>
      <pubDate>Wed, 12 Oct 2016 22:59:29 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/video/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Video upload &amp; processing MVP concept design</title>
      <link>https://tovare.com/post/video-upload-processing-mvp-concept-design/</link>
      <pubDate>Wed, 12 Oct 2016 22:59:29 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/video-upload-processing-mvp-concept-design/</guid>
      <description>Most processing of video could be hidden from view.</description>
      
      <content>&lt;h2 id=&#34;konsept-1&#34;&gt;Konsept 1&lt;/h2&gt;
&lt;p&gt;Et superenkelt konsept for publisering av filmer egnet for et relativt lavt publiseringsvolum pr. dag.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Mockup-upload-interface.png&#34; alt=&#34;Mockup&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Genererer et riktig tagg med en gang&lt;/p&gt;
&lt;h2 id=&#34;konsept-2---no-gui&#34;&gt;Konsept 2 - No GUI&lt;/h2&gt;
&lt;p&gt;Det kan hende konseptet er bedre realisert som en ordinær filserver. Fordi filsystem-events er forskjellig fra plattform til plattform, og noen filsystemer ikke har støtte for pålitelige events, kan løsningen være en prosess som poller en upload katalog jevnlig og flytter filer fortløpende. Flytting av en fil er atomisk i de fleste filsystem.&lt;/p&gt;
&lt;p&gt;ffmpeg er tilgjengelig som nodejs.&lt;/p&gt;
&lt;h2 id=&#34;referanser&#34;&gt;Referanser:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Om HTML video og generering av HLS og bilder: &lt;a href=&#34;https://tovare.com/videotest/&#34;&gt;https://tovare.com/videotest/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Om CDN &lt;a href=&#34;https://tovare.com/keycdn-test/&#34;&gt;https://tovare.com/keycdn-test/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Om å starte shell prosesser fra nodejs: &lt;a href=&#34;https://nodejs.org/api/child_process.html&#34;&gt;https://nodejs.org/api/child_process.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;videre-arbeid&#34;&gt;Videre arbeid&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://registry.duraspace.org/&#34;&gt;http://registry.duraspace.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
      
    </item>
    
    <item>
      <title>KeyCDN test</title>
      <link>https://tovare.com/post/keycdn-test/</link>
      <pubDate>Fri, 07 Oct 2016 18:42:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/keycdn-test/</guid>
      <description></description>
      
      <content>&lt;p&gt;Test av videostrømming fra &lt;a href=&#34;https://www.keycdn.com/?a=22196&#34;&gt;KeyCDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vanlig mp4 og HLS.&lt;/p&gt;
&lt;p&gt;(Bildet t.v. er kun synlig ved vanlig mp4, for å gjøre det enklere å se når man bruker HLS).&lt;/p&gt;
&lt;p&gt;Push-zone:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;video width=&amp;quot;100%&amp;quot;  poster=&amp;quot;https://video-56b4.kxcdn.com/mario.jpg&amp;quot; crossorigin=&amp;quot;anonymous&amp;quot; controls&amp;gt;
  &amp;lt;source src=&amp;quot;https://video-56b4.kxcdn.com/output/mario.mp4_master.m3u8&amp;quot; type=&amp;quot;application/x-mpegURL&amp;quot;&amp;gt;
  &amp;lt;source src=&amp;quot;https://video-56b4.kxcdn.com/out.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;
  &amp;lt;track label=&amp;quot;Norsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; default srclang=&amp;quot;nb&amp;quot; 
     src=&amp;quot;https://video-56b4.kxcdn.com/mario.vtt&amp;quot; default&amp;gt;
  &amp;lt;track label=&amp;quot;Nynorsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;nn&amp;quot; 
     src=&amp;quot;https://video-56b4.kxcdn.com/mario_ny.vtt&amp;quot;&amp;gt;
  &amp;lt;track label=&amp;quot;Engelsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;en&amp;quot; 
     src=&amp;quot;https://video-56b4.kxcdn.com/mario_en.vtt&amp;quot;&amp;gt;
&amp;lt;/video&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pull-zone:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;video width=&amp;quot;100%&amp;quot;  poster=&amp;quot;https://tovare-56b4.kxcdn.com/tovare/video/mario.jpg&amp;quot;  crossorigin=&amp;quot;anonymous&amp;quot; controls&amp;gt;
  &amp;lt;source src=&amp;quot;https://tovare-56b4.kxcdn.com/tovare/video/output/mario.mp4_master.m3u8&amp;quot; type=&amp;quot;application/x-mpegURL&amp;quot;&amp;gt;
  &amp;lt;source src=&amp;quot;https://tovare-56b4.kxcdn.com/tovare/video/out.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;
  &amp;lt;track label=&amp;quot;Norsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;nb&amp;quot; 
     src=&amp;quot;/tovare/video/mario.vtt&amp;quot; default&amp;gt;
  &amp;lt;track label=&amp;quot;Nynorsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;nn&amp;quot; 
     src=&amp;quot;/tovare/video/mario_ny.vtt&amp;quot;&amp;gt;
  &amp;lt;track label=&amp;quot;Engelsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;en&amp;quot; 
     src=&amp;quot;/tovare/video/mario_en.vtt&amp;quot;&amp;gt;
&amp;lt;/video&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;amazon-cloudfront-pull&#34;&gt;Amazon Cloudfront (Pull)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Utfordringer med CORS uten server-konfigurasjon i &lt;a href=&#34;https://aws.amazon.com/cloudfront/&#34;&gt;Amazon Cloudfront&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mindre fleksibel konfigurasjon fordi du kan bare velge å whiteliste headere fremfor å intodusere CORS.&lt;/li&gt;
&lt;li&gt;Mindre komplett og man binder seg lettere mot leverandør.&lt;/li&gt;
&lt;li&gt;Statistikk er en opsjon.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--video width=&#34;100%&#34;  poster=&#34;https://dg0fpsymed6sg.cloudfront.net/tovare/video/mario.jpg&#34;  crossorigin=&#34;anonymous&#34; controls&gt;
  &lt;source src=&#34;https://dg0fpsymed6sg.cloudfront.net/tovare/video/output/mario.mp4_master.m3u8&#34; type=&#34;application/x-mpegURL&#34;&gt;
  &lt;source src=&#34;https://dg0fpsymed6sg.cloudfront.net/tovare/video/out.mp4&#34; type=&#34;video/mp4&#34;&gt;
  &lt;track label=&#34;Norsk&#34; kind=&#34;subtitles&#34; srclang=&#34;nb&#34; 
     src=&#34;https://tovare.com/tovare/video/mario.vtt&#34; default&gt;
  &lt;track label=&#34;Nynorsk&#34; kind=&#34;subtitles&#34; srclang=&#34;nn&#34; 
     src=&#34;https://tovare.com/tovare/video/mario_ny.vtt&#34;&gt;
  &lt;track label=&#34;Engelsk&#34; kind=&#34;subtitles&#34; srclang=&#34;en&#34; 
   src=&#34;https://tovare.com/tovare/video/mario_en.vtt&#34;&gt;
&lt;/video --&gt;
&lt;h3 id=&#34;oppsummering&#34;&gt;Oppsummering&lt;/h3&gt;
&lt;p&gt;Begge tjenestene støtter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Otimalisering av strømming.&lt;/li&gt;
&lt;li&gt;HTTPS&lt;/li&gt;
&lt;li&gt;HTTP/2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS er en mer omfattende tjeneste men er i større grad byggeklosser enn en turnkey-løsning. Microsoft Azure har løsninger som tilsvarer AWS, bare litt mer umodent og med et sterkere sterker trekk mot leverandørbinding og mindre self-serve som øker TCO.&lt;/p&gt;
&lt;h3 id=&#34;konklusjon&#34;&gt;Konklusjon&lt;/h3&gt;
&lt;p&gt;Bruk av Pull fra &lt;a href=&#34;https://www.keycdn.com/?a=22196&#34;&gt;KeyCDN&lt;/a&gt; er mer turn-key og komplett enn AWS/Azure og gjør det raskt å bytte leverandør hvis man ønsker det.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.keycdn.com/?a=22196&#34;&gt;KeyCDN&lt;/a&gt; er situert i Sveits.&lt;/p&gt;
&lt;p&gt;MaxCDN/Stackpath har tilsvarende egenskaper og et bra rykte, men det er Amerikansk som er et stort minus og i prising av tjenesten holder de en prisstruktur som er basert på at de skal kunne gi rabatter på linje med mange i corporate-segmentet. Leverandører hvor man må bruke tid på forhandlinger og evt. finne kuponger for å få riktig pris øker TCO kraftig, derfor er tilsynelatende helt transparente leverandører som &lt;a href=&#34;https://www.keycdn.com/?a=22196&#34;&gt;KeyCDN&lt;/a&gt; og Amazon å foretrekke.&lt;/p&gt;
&lt;p&gt;Noen leverandører har en tendens til å lage sterke bindinger og har en høy TCO.&lt;/p&gt;
&lt;h2 id=&#34;noen-referanser&#34;&gt;Noen Referanser&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;En sammenligning av tjenester: &lt;a href=&#34;http://cdncomparison.com/&#34;&gt;http://cdncomparison.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;spesielle-betraktninger-knyttet-til-sveits-som-utenfor-eu-og-eøs&#34;&gt;Spesielle betraktninger knyttet til Sveits som utenfor EU og EØS:&lt;/h2&gt;
&lt;p&gt;Et viktig fundament som må på plass før en avtale mellom selskaper kan komme i stand, er at loven i landet hører til har tilfredstillende beskyttelse. I tilfellet Sveits kan dette betraktes som et EU-land i overføring av IP-adresser til formål å levere og fakturere for en CDN-tjeneste.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;The effect of such a decision is that personal data can flow from the 28 EU countries and three EEA member countries (Norway, Liechtenstein and Iceland) to that third country without any further safeguard being necessary.&amp;rdquo; (&lt;a href=&#34;http://ec.europa.eu/justice/data-protection/international-transfers/adequacy/index_en.htm&#34;&gt;http://ec.europa.eu/justice/data-protection/international-transfers/adequacy/index_en.htm&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Beslutning:
(&lt;a href=&#34;http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32000D0518&amp;amp;from=en&#34;&gt;http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32000D0518&amp;amp;from=en&lt;/a&gt;) (Decision 2000/518/EC). Data beskyttelse godkjennes av EU.&lt;/p&gt;
&lt;h2 id=&#34;spesielle-betraktninger-knyttet-til-virkemåten-til-et-cdn-og-land-uten-tilfredstillende-beskyttelse&#34;&gt;Spesielle betraktninger knyttet til virkemåten til et CDN og land uten tilfredstillende beskyttelse.&lt;/h2&gt;
&lt;p&gt;Trafikk vil i noen tilfeller gå fra sluttbruker i utlandet mot et endepunkt i utlandet, som kan være i nasjoner uten tilfredstillende beskyttelse for borgerne.&lt;/p&gt;
&lt;p&gt;Dette kan bedres litt ved å kun overføre over
HTTPS med TLS i kombinasjon med leverandørens sertifikat er at det kun avsløres at man bruker innhold fra et CDN og ikke innholdet i siden. Effekten er at informasjon som potensielt kan overvåkes er minimalisert. Data kan minimaliseres enda mer når alle headere fjernes i forespørslser inkl. evt. cookie-headere. Aktivisering av data-protection frakobler data fra kilden enda kraftigere.&lt;/p&gt;
&lt;h2 id=&#34;betraktninger-rundt-avtaleverk&#34;&gt;Betraktninger rundt avtaleverk.&lt;/h2&gt;
&lt;p&gt;Standardavtalen inneholder utsagn om at data aldri vil bli distribuert videre, men sier at noe aggregert ikke identifiserbar informasjon vil bli delt med partnere.&lt;/p&gt;
&lt;p&gt;Tjenesten inneholder en standardfunksjon hvor du kan se realtime de siste hits til siden, om det var en cache-hit eller ikke.&lt;/p&gt;
&lt;p&gt;Det er muligens ikke tilstrekkelig avklart når trafikklogger som er nødvendig for fakturering og drift av tjenesten blir slettet.&lt;/p&gt;
&lt;p&gt;Sikkerhetstiltak for å beskytte informasjon er tilstrekkelig belyst.&lt;/p&gt;
&lt;h2 id=&#34;annet&#34;&gt;Annet&lt;/h2&gt;
&lt;p&gt;Verdens største CDN nettverk er Akamai, men kostnadsnivået er høyt og produktporteføljen er kompleks som øker TCO enda mer. Akamai er selv-sertifisert i &lt;a href=&#34;https://www.privacyshield.gov/participant?id=a2zt0000000Gn4RAAS&#34;&gt;Privacy Shield&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(Updated to remove live demo.)&lt;/p&gt;</content>
      
    </item>
    
    <item>
      <title>Gode tjenster for å sende video på e-post</title>
      <link>https://tovare.com/post/sende-video-pa-epost/</link>
      <pubDate>Tue, 04 Oct 2016 23:05:50 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/sende-video-pa-epost/</guid>
      <description></description>
      
      <content>&lt;p&gt;Det er mange gode tjenester som er velegnet for å sende store filer.&lt;/p&gt;
&lt;p&gt;De to tjenestene jeg kjenner og liker godt er WeTransfer og Google Drive.&lt;/p&gt;
&lt;h3 id=&#34;wetransfer&#34;&gt;WeTransfer&lt;/h3&gt;
&lt;p&gt;(&lt;a href=&#34;https://www.wetransfer.com/&#34;&gt;https://www.wetransfer.com/&lt;/a&gt;) er lett å bruke med et dra og slipp grensesnitt. For filer under 2GB er tjenesten gratis å bruke og har erfaringsmessig ganske ok hastighet.&lt;/p&gt;
&lt;p&gt;En fordel med tjenesten er at filene ikke blir liggende.&lt;/p&gt;
&lt;h3 id=&#34;google-drive&#34;&gt;Google Drive&lt;/h3&gt;
&lt;p&gt;(&lt;a href=&#34;https://www.google.com/drive/&#34;&gt;https://www.google.com/drive/&lt;/a&gt;) fungerer bra og du får 15 GB lagringsplass gratis.  Den store fordelen er fraværet av ulempene i andre tjenester, dette fungerer. Maksimumsstørrelsen er i praksis lagringsplassen du har til rådighet, med en øvre grense på 5 TB (Tilsvarer omtrent 50 spillefilmer i 4K)&lt;/p&gt;
&lt;p&gt;En annen fordel er at støtten for google drive er bred på grunn av et velutviklet API, slik at du kan hente filene direkte inn i applikasjoner og tjenester som vimeo.com&lt;/p&gt;
&lt;p&gt;Det er nok mange andre tjenester som fungerer bra.&lt;/p&gt;</content>
      
    </item>
    
    <item>
      <title>Notifications &amp; Scheduling</title>
      <link>https://tovare.com/post/notifications/</link>
      <pubDate>Sat, 28 May 2016 12:01:31 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/notifications/</guid>
      <description>Web notifications er W3C standard API for å vise varslinger utenfor nettleservinduet.</description>
      
      <content>&lt;p&gt;Web notifications er W3C standard API for å vise varslinger utenfor nettleservinduet. Hvis man ønsker push-varslinger når nettleseren er stengt, er det nødvendig å sende varslinger via tjenester fra Google eller Apple.&lt;/p&gt;
&lt;h2 id=&#34;eksempel-på-en-enkel-varsling-når-man-har-siden-oppe&#34;&gt;Eksempel på en enkel varsling når man har siden oppe&lt;/h2&gt;
&lt;p&gt;Spørre om tillatelse for å vise varsler:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Notification&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;requestPermission&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Send en enkel varsel:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Notification&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;This is a notifiction&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
   &lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Beskrivelse&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
   &lt;span class=&#34;nx&#34;&gt;icon&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;ello.jpg&amp;#39;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;script&gt;
function send1(){
    Notification.requestPermission();
    var e = new Notification(&#34;This is a notifiction&#34;, {
       body : &#34;Beskrivelse&#34;,
       icon : &#39;ello.jpg&#39;
    });
}

function send2(){
    setTimeout(send1, 4000)
}

&lt;/script&gt;
&lt;p&gt;&lt;button class=&#34;btn btn-blue&#34; onclick=&#34;send1()&#34;&gt;Trykk her for å prøve ut&lt;/button&gt;&lt;/p&gt;
&lt;p&gt;&lt;button class=&#34;btn btn-blue&#34; onclick=&#34;send2()&#34;&gt;Send notifications etter 4 sekunder&lt;/button&gt;&lt;/p&gt;
&lt;p&gt;Slik ser det ut&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;notification_test.svg&#34; alt=&#34;alt&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;push-notiser-offlineoffpage&#34;&gt;Push notiser offline/offpage&lt;/h2&gt;
&lt;p&gt;(Todo)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html&#34;&gt;https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://developers.google.com/web/updates/2015/03/push-notifications-on-the-open-web&#34;&gt;https://developers.google.com/web/updates/2015/03/push-notifications-on-the-open-web&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://support.mozilla.org/no/kb/push-notifications-firefox&#34;&gt;https://support.mozilla.org/no/kb/push-notifications-firefox&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://storage-cdn.realtime.co/chrome-push/index.html&#34;&gt;https://storage-cdn.realtime.co/chrome-push/index.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;legg-til-kalender&#34;&gt;Legg til kalender&lt;/h2&gt;
&lt;p&gt;Varslinger er ikke alltid en god måte. Noen ganger er det bedre å gjøre det mulig å legge en hendelse i kalenderen, dette gjelder spesielt varsling om aktiviteter osv. hvor det er viktig at aktiviteter inngår i tidsplanleggingen til brukeren.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://addtocalendar.com/&#34;&gt;http://addtocalendar.com/&lt;/a&gt;&lt;/p&gt;</content>
      
    </item>
    
    <item>
      <title>QR</title>
      <link>https://tovare.com/post/qr/</link>
      <pubDate>Tue, 01 Mar 2016 13:25:18 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/qr/</guid>
      <description>Enkelt online-verktøy for å lage en QR-kode. Lim inn URL og last ned bildet.</description>
      
      <content>&lt;p&gt;Enkelt online-verktøy for å lage en QR-kode. Lim inn URL og last ned bildet.&lt;/p&gt;
&lt;style&gt;
#qrcode {
}  width:160px;
  height:160px;
  margin-top:15px;
&lt;/style&gt;
&lt;script src=&#34;https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js&#34;&gt;&lt;/script&gt;
&lt;script
src=&#34;qrcode.min.js&#34;&gt; &lt;/script&gt;
&lt;p&gt;&lt;input id=&#34;url&#34; type=&#34;text&#34; value=&#34;http://tovare.com&#34; style=&#34;width:70%&#34; /&gt;
&lt;button id=&#34;knapp&#34; class=&#34;btn btn-primary&#34; &gt;Lag kode!&lt;/button&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;
Høyreklikk og last ned bildet.
&lt;/p&gt;
&lt;div id=&#34;qrcode&#34;&gt;&lt;/div&gt;
&lt;script&gt;
var qrcode = new QRCode(&#34;qrcode&#34;);

function makeCode () {		
	var elText = document.getElementById(&#34;url&#34;);
	
	if (!elText.value) {
		alert(&#34;Du må legge inn en URL!&#34;);
		elText.focus();
		return;
	}
	
	qrcode.makeCode(elText.value);
        console.log(&#34;QR Made&#34;);
        
}

makeCode();

$(&#34;#knapp&#34;).on(&#34;click&#34;, function () {
		makeCode();
                console.log(&#34;QR Click&#34;);
	});

&lt;/script&gt;
&lt;p&gt;Qrcode.js &lt;a href=&#34;https://davidshimjs.github.io/qrcodejs/&#34;&gt;https://davidshimjs.github.io/qrcodejs/&lt;/a&gt;&lt;/p&gt;</content>
      
    </item>
    
    <item>
      <title>qr</title>
      <link>https://tovare.com/tags/qr/</link>
      <pubDate>Tue, 01 Mar 2016 13:25:18 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/qr/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>qr</title>
      <link>https://tovare.com/categories/qr/</link>
      <pubDate>Tue, 01 Mar 2016 13:25:18 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/qr/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>tools</title>
      <link>https://tovare.com/categories/tools/</link>
      <pubDate>Tue, 01 Mar 2016 13:25:18 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/tools/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>verktøy</title>
      <link>https://tovare.com/tags/verkt%C3%B8y/</link>
      <pubDate>Tue, 01 Mar 2016 13:25:18 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/verkt%C3%B8y/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>verktøy</title>
      <link>https://tovare.com/categories/verkt%C3%B8y/</link>
      <pubDate>Tue, 01 Mar 2016 13:25:18 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/verkt%C3%B8y/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Gjør det selv video-hosting med HTML5</title>
      <link>https://tovare.com/post/videotest/</link>
      <pubDate>Sat, 21 Nov 2015 19:18:27 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/videotest/</guid>
      <description></description>
      
      <content>&lt;p&gt;&lt;strong&gt;Det beste grensesnittene er å ikke ha noe grensesnitt&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;fase-1---minimum-viable-prototype---usynelig-video-portal&#34;&gt;Fase 1 - Minimum Viable Prototype - &amp;ldquo;usynelig&amp;rdquo; video portal&lt;/h2&gt;
&lt;p&gt;Eksempel 1:&lt;/p&gt;
&lt;p&gt;Bare en fil på en server.&lt;/p&gt;
&lt;video class=&#34;.video-featured&#34; width=&#34;100%&#34;  controls&gt;
   &lt;source src=&#34;https://storage.googleapis.com/tovarehome/video/mario.mp4&#34;  type=&#34;video/mp4&#34;&gt;
  &lt;track label=&#34;Norsk&#34; kind=&#34;subtitles&#34; srclang=&#34;nb&#34; src=&#34;https://storage.googleapis.com/tovarehome/video/mario.vtt&#34; default&gt;
  &lt;track label=&#34;Nynorsk&#34; kind=&#34;subtitles&#34; srclang=&#34;nn&#34; src=&#34;https://storage.googleapis.com/tovarehome/video/mario_ny.vtt&#34;&gt;
  &lt;track label=&#34;Engelsk&#34; kind=&#34;subtitles&#34; srclang=&#34;en&#34; src=&#34;https://storage.googleapis.com/tovarehome/video/mario_en.vtt&#34;&gt;
   Nettleseren din støtter ikke video.
&lt;/video&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;video&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;100%&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;controls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;source&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://storage.googleapis.com/tovarehome/video/mario.mp4&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;video/mp4&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  Nettleseren din støtter ikke video.
  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;track&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Bokmål&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;subtitles&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;srclang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;nb&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://storage.googleapis.com/tovarehome/video/mario.vtt&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;track&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Nynorsk&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;subtitles&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;srclang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;nn&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://storage.googleapis.com/tovarehome/video/mario_ny.vtt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;track&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Engelsk&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;subtitles&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;srclang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://storage.googleapis.com/tovarehome/video/mario_en.vtt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;video&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;fase-2---enda-bedre&#34;&gt;Fase 2 - enda bedre&lt;/h2&gt;
&lt;p&gt;Eksempel automatisk innbrenning av logo og automatisk generert forhåndsvisning.&lt;/p&gt;
&lt;p&gt;Dette kan kjøres som et automatisk script når det kommer en ny fil.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-markup&#34; data-lang=&#34;markup&#34;&gt;&amp;lt;video width=&amp;quot;100%&amp;quot;  poster=&amp;quot;=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario.jpg&amp;quot; &amp;quot; controls&amp;gt;
  &amp;lt;source src=&amp;quot;https://storage.googleapis.com/tovarehome/video/out.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;
  &amp;lt;track label=&amp;quot;Bokmål&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;nb&amp;quot;
     src=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario.vtt&amp;quot; default&amp;gt;
  &amp;lt;track label=&amp;quot;Nynorsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;nn&amp;quot;
     src=https://storage.googleapis.com/tovarehome/video/mario_ny.vtt&amp;quot;&amp;gt;
  &amp;lt;track label=&amp;quot;Engelsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;en&amp;quot;
     src=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario_en.vtt&amp;quot;&amp;gt;
  Nettleseren din støtter ikke video.
&amp;lt;/video&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Legge på bilde:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;ffmpeg -i mario.mp4 -framerate 30000/1001 -loop &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; -i ello.png -filter_complex &lt;span class=&#34;s2&#34;&gt;&amp;#34;[1:v] fade=out:st=30:d=1:alpha=1 [ov]; [0:v][ov] overlay=10:10 [v]&amp;#34;&lt;/span&gt; -map &lt;span class=&#34;s2&#34;&gt;&amp;#34;[v]&amp;#34;&lt;/span&gt; -map 0:a -c:v libx264 -c:a copy -shortest out.mp4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Generering av forhåndsvisning:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;ffmpeg -i mario.mp4 -ss 00:00:10 -vframes &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; mario.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Automatisk generert tekst-snutt med koden man må lime inn:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-markup&#34; data-lang=&#34;markup&#34;&gt;&amp;lt;video width=&amp;quot;100%&amp;quot;  poster=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario.jpg&amp;quot; controls&amp;gt;
  &amp;lt;source src=&amp;quot;https://storage.googleapis.com/tovarehome/video/out.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;
  &amp;lt;track label=&amp;quot;Bokmål&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;nb&amp;quot;
    src=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario.vtt&amp;quot; default&amp;gt;
  &amp;lt;track label=&amp;quot;Nynorsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;nn&amp;quot; 
    src=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario_ny.vtt&amp;quot;&amp;gt;
  &amp;lt;track label=&amp;quot;Engelsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;en&amp;quot; 
    src=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario_en.vtt&amp;quot;&amp;gt;
   Nettleseren din støtter ikke video.
&amp;lt;/video&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;3-videre-finpuss&#34;&gt;3 Videre finpuss&lt;/h2&gt;
&lt;p&gt;Målbildet er at man lemper over filen man har til en katalog man har tilgang til. En modul lytter til filsystemet (Ex. pynotify hvis man lager scriptet i python):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gjennomfører filbahandling iht. katalogen man lagret filen i.&lt;/li&gt;
&lt;li&gt;Lager en scriptsnutt i en tekstfil som man kan lime inn.&lt;/li&gt;
&lt;li&gt;Kanskje sende en automatisk epost, når alt er ferdig med instruksjoner for å få videoen inn dit man ønsker (iht. polciy)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;fase-4-bedre-ytelsen-på-dårlig-nett-og-mobile-enheter-med-ios-android-og-windows&#34;&gt;Fase 4 Bedre ytelsen på dårlig nett og mobile enheter med IOS, Android og Windows.&lt;/h2&gt;
&lt;p&gt;Automatisk genererign av HLS og MPEG Dash (Kan serves fra en vanlig http server, så det er valfritt å implementere noe som wowza eller ikke)&lt;/p&gt;
&lt;p&gt;I praksis betyr HLS at man splitter opp filen i 6 sekunders-biter (Apple anbefalte tidligere 10 sekunder men har endret anbefalingen til 6), generere en  playlist (filtype .m3u8) så vil nettleseren velge en lavere bitrate hvis den ikke  henger med.&lt;/p&gt;
&lt;p&gt;For Android og Apple-produkter fungerer HLS, så man kan kjøre scriptet under automatisk (Hvis man ikke installerer Wowza):&lt;/p&gt;
&lt;p&gt;(For adaptiv strømming på desktop kan man produsere DASH som alternativ source med MP4Box)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/bentasker/HLS-Stream-Creator&#34;&gt;HLS Stream-Creator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mrk. følgende kan endres i scriptet for å bruke den innebygde &amp;ldquo;frie&amp;rdquo; implementeringen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Audio codec for the output video. Will be used as an value for the -acodec argument
AUDIO_CODEC=${AUDIO_CODEC:-&amp;quot;aac&amp;quot;}

# Additional flags for ffmpeg
FFMPEG_FLAGS=${FFMPEG_FLAGS:-&amp;quot;-strict -2&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dette endrer til den innebygde AAC implementeringen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I strømmen under får du bilde av meg med vanlig strømming, men uten bilde når HLS blir brukt.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jeg configuerte følgede mime.types på serveren i tråd med apple sin dokumentasjon&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/DeployingHTTPLiveStreaming/DeployingHTTPLiveStreaming.html&#34;&gt;Apple dokumentasjon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fila ble generert med:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;./HLS-Stream-Creator.sh -i mario.mp4 -s &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; -b 512,1200,2000,3500
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;video width=&#34;100%&#34;  poster=&#34;https://storage.googleapis.com/tovarehome/video/mario.jpg&#34;  controls&gt;
  &lt;source src=&#34;https://storage.googleapis.com/tovarehome/video/output/mario.mp4_master.m3u8&#34; type=&#34;application/x-mpegURL&#34;&gt;
  &lt;source src=&#34;https://storage.googleapis.com/tovarehome/video/out.mp4&#34; type=&#34;video/mp4&#34; &gt;
  &lt;track label=&#34;Norsk&#34; kind=&#34;subtitles&#34; srclang=&#34;nb&#34; 
     src=&#34;https://tovare.com/https://storage.googleapis.com/tovarehome/video/mario.vtt&#34; default&gt;
  &lt;track label=&#34;Nynorsk&#34; kind=&#34;subtitles&#34; srclang=&#34;nn&#34; 
     src=&#34;https://storage.googleapis.com/tovarehome/video/mario_ny.vtt&#34;&gt;
  &lt;track label=&#34;Engelsk&#34; kind=&#34;subtitles&#34; srclang=&#34;en&#34; 
     src=&#34;https://tovare.com/https://storage.googleapis.com/tovarehome/video/mario_en.vtt&#34;&gt;
&lt;/video&gt;
&lt;p&gt;Taggen ser nå slik ut:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-markup&#34; data-lang=&#34;markup&#34;&gt;&amp;lt;video width=&amp;quot;100%&amp;quot;  poster=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario.jpg&amp;quot;  controls&amp;gt;
&amp;lt;!-- Spilles av på iPhone, Android, Windows Phone osv. --&amp;gt;
&amp;lt;source src=&amp;quot;https://storage.googleapis.com/tovarehome/video/output/mario.mp4_master.m3u8&amp;quot;   
   type=&amp;quot;application/x-mpegURL&amp;quot;&amp;gt;

&amp;lt;!-- Spilles av Chrome på Mac og andre enheter som ikke foretrekker HLS --&amp;gt;
   &amp;lt;source src=&amp;quot;https://storage.googleapis.com/tovarehome/video/out.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;
   &amp;lt;track label=&amp;quot;Norsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;nb&amp;quot; src=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario.vtt&amp;quot; default&amp;gt;
   &amp;lt;track label=&amp;quot;Nynorsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;nn&amp;quot; src=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario_ny.vtt&amp;quot;&amp;gt;
   &amp;lt;track label=&amp;quot;Engelsk&amp;quot; kind=&amp;quot;subtitles&amp;quot; srclang=&amp;quot;en&amp;quot; src=&amp;quot;https://storage.googleapis.com/tovarehome/video/mario_en.vtt&amp;quot;&amp;gt;
&amp;lt;/video&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et litt lengre eksempel med HLS adaptiv strøm med bitrates 512k,1200k,2000k,3500k (Tov Are Tegner i WiiU Art Academy):&lt;/p&gt;
&lt;video width=&#34;100%&#34;  poster=&#34;https://storage.googleapis.com/tovarehome/video/sitron.jpg&#34;  controls&gt;
   &lt;source src=&#34;https://storage.googleapis.com/tovarehome/video/output/sitron.mp4_master.m3u8&#34; type=&#34;application/x-mpegURL&#34;&gt;
   &lt;source src=&#34;https://storage.googleapis.com/tovarehome/video/sitron.mp4&#34; type=&#34;video/mp4&#34;&gt;
   Nettleseren din støtter ikke video.
&lt;/video&gt;
&lt;h2 id=&#34;fase-5-automatiske-opptak-fra-streaming&#34;&gt;Fase 5 Automatiske opptak fra streaming.&lt;/h2&gt;
&lt;p&gt;Kan legges automatisk i en dedikert katalog fra f.eks. Wowza.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&#34;x-eksperiment&#34;&gt;X Eksperiment&lt;/h2&gt;
&lt;p&gt;PoC spørsmål i video. Alt som kan gjøres i html kan gjøres i en video på gitte tidspunkter, samt pause videoen automatisk, spille av andre spor osv. På enheter med små skjermer går videoen i fullskjerm, slik at dette ikke alltid er en praktisk måte å gjøre det på.&lt;/p&gt;
&lt;style&gt;
.videoContainer { 
   position:relative !important; 
}
.videoContainer spm {
    position:relative !important;
    z-index:0 !important;
}

.videoContainer form {
    position:relative !important;
    z-index:0 !important;
    margin-left: 50px !important;
}

.overlay {
    position:absolute !important;
    top:0 !important;
    left:200 !important;
    z-index:1 !important;
    background-color: rgba(0, 0, 0, 0.6);
    width: 100% !important;
    color: white;
}
&lt;/style&gt;
&lt;div class=&#34;videoContainer&#34;&gt;
   &lt;video id=&#34;ivideo&#34; width=&#34;100%&#34; poster=&#34;https://storage.googleapis.com/tovarehome/video/mario.jpg&#34;  controls&gt;
       &lt;source 
           src=&#34;https://storage.googleapis.com/tovarehome/video/output/mario.mp4_master.m3u8&#34;    
           type=&#34;application/x-mpegURL&#34;&gt;
        &lt;source src=&#34;https://storage.googleapis.com/tovarehome/video/out.mp4&#34; type=&#34;video/mp4&#34;&gt;
   &lt;/video&gt;
    &lt;div class=&#34;overlay&#34; id=&#34;spm1&#34;&gt;
       &lt;h1&gt;Dette er ganske awesome&lt;/h1&gt;
       &lt;p&gt;
       &lt;form&gt;
          &lt;input type=&#34;radio&#34; name=&#34;a&#34; value=&#34;1&#34;&gt; Enig&lt;/input&gt;&lt;br&gt;
          &lt;input type=&#34;radio&#34; name=&#34;a&#34; value=&#34;0&#34;&gt; Uenig&lt;/input&gt;&lt;br&gt;                    
          &lt;p&gt;&lt;button id=&#34;isubmit&#34; type=&#34;submit&#34;&gt;Svar og spill av&lt;/button&gt;&lt;/p&gt;
       &lt;/form&gt;
       &lt;/p&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
var myVideo = document.getElementById(&#34;ivideo&#34;); 

document.getElementById(&#34;isubmit&#34;).addEventListener(&#34;click&#34;, function(event){
    if (myVideo.paused) 
        myVideo.play(); 
    else 
        myVideo.pause();
    event.preventDefault()
    document.getElementById(&#34;spm1&#34;).style.display = &#39;none&#39;;
});

function playPause(e) { 
    e.preventDefault();
} 

function makeBig() { 
    myVideo.width = 560; 
} 

function makeSmall() { 
    myVideo.width = 320; 
} 

function makeNormal() { 
    myVideo.width = 420; 
} 
&lt;/script&gt;
&lt;h2 id=&#34;oppdatering-2020&#34;&gt;Oppdatering 2020&lt;/h2&gt;
&lt;p&gt;Self-hosting av video er et bra alternativ også i 2020 men krever litt forarbeid.&lt;/p&gt;
&lt;p&gt;Alle de statiske videofilene er flyttet til google cloud storage og lenkes direkte for å unngå å kjøre proxy via cloudflare.&lt;/p&gt;
</content>
      
    </item>
    
    <item>
      <title>HTML5</title>
      <link>https://tovare.com/tags/html5/</link>
      <pubDate>Sat, 21 Nov 2015 19:18:27 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/html5/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>mp4</title>
      <link>https://tovare.com/tags/mp4/</link>
      <pubDate>Sat, 21 Nov 2015 19:18:27 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/mp4/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>WCAG</title>
      <link>https://tovare.com/tags/wcag/</link>
      <pubDate>Sat, 21 Nov 2015 19:18:27 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/wcag/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Maskering av felter i hotjar</title>
      <link>https://tovare.com/post/hotjar-form-maskin/</link>
      <pubDate>Mon, 16 Nov 2015 06:13:15 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/hotjar-form-maskin/</guid>
      <description></description>
      
      <content>&lt;p&gt;Dette er en test av &lt;a href=&#34;https://hotjar.com/r/r5a50cd&#34;&gt;HotJar&lt;/a&gt; maskering av brukerdata. Dette gjøres ved å sette inn attributtet data-hj-masked på alle relevante felter. Dette kan gjøres dynamisk med f.eks. Google Tag Manager og sikre at koden som gjør dette alltid kjører før HotJar taggen.&lt;/p&gt;
&lt;p&gt;Maskeringen skjer før informasjonen blir sendt videre.&lt;/p&gt;
&lt;p&gt;Skjult tekst:
&lt;strong data-hj-masked&gt;Dette er en skjult tekst&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Skjulte input-felter:&lt;/p&gt;
&lt;form&gt;
  First name:&lt;br&gt;
  &lt;input data-hj-masked type=&#34;text&#34; name=&#34;firstname&#34;&gt;
  &lt;br&gt;
  Last name:&lt;br&gt;
  &lt;input data-hj-masked type=&#34;text&#34; name=&#34;lastname&#34;&gt;
&lt;/form&gt;
&lt;hr /&gt;
&lt;p&gt;Felter som ikke maskeres.&lt;/p&gt;
&lt;form&gt;
  First name:&lt;br&gt;
  &lt;input type=&#34;text&#34; name=&#34;firstname&#34;&gt;
  &lt;br&gt;
  Last name:&lt;br&gt;
  &lt;input type=&#34;text&#34; name=&#34;lastname&#34;&gt;
&lt;/form&gt;
&lt;p&gt;Slik ser opptaket ut i etterkant, legg merke til at teksten i feltene som er skjult er erstattet med prikker.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://tovare.com/images/2015/11/Skjermbilde-2015-11-16-kl--02-23-17-1.png&#34; alt=&#34;alt&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Teksten under blir anonymisert:&lt;/p&gt;
&lt;div id=&#34;login-details&#34; class=&#34;&#34;&gt;
 &lt;span id=&#34;name-container&#34;&gt;
   &lt;span class=&#34;icon-twitter&#34; id=&#34;id-ikon-innlogging&#34; 
            alt=&#34;Innlogget&#34; src=&#34;&#34;&gt;(Også borte)&lt;/span&gt;
    &lt;span id=&#34;name&#34;&gt;tov are  jacobsen&lt;/span&gt;
  &lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;HTML-koden ser slik ut:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;login-details&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
     &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;name-container&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
       &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;icon-twitter&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;id-ikon-innlogging&amp;#34;&lt;/span&gt; 
            &lt;span class=&#34;na&#34;&gt;alt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Innlogget&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;(Også borte)&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;tov are  jacobsen&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ved å maskere, blir alle underelementer også anonymisert.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;querySelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#login-details&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;data-hj-masked&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Anonymisering inkluderer også heatmaps og andre rapporter.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://tovare.com/images/2015/11/Skjermbilde-2015-11-17-kl--23-48-58.png&#34; alt=&#34;alt&#34; /&gt;&lt;/p&gt;</content>
      
    </item>
    
    <item>
      <title>google tag manager</title>
      <link>https://tovare.com/tags/google-tag-manager/</link>
      <pubDate>Tue, 03 Nov 2015 22:12:12 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/google-tag-manager/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>google tag manager</title>
      <link>https://tovare.com/categories/google-tag-manager/</link>
      <pubDate>Tue, 03 Nov 2015 22:12:12 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/google-tag-manager/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>gtm</title>
      <link>https://tovare.com/tags/gtm/</link>
      <pubDate>Tue, 03 Nov 2015 22:12:12 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/gtm/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>gtm</title>
      <link>https://tovare.com/categories/gtm/</link>
      <pubDate>Tue, 03 Nov 2015 22:12:12 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/gtm/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>html</title>
      <link>https://tovare.com/tags/html/</link>
      <pubDate>Tue, 03 Nov 2015 22:12:12 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/html/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>html</title>
      <link>https://tovare.com/categories/html/</link>
      <pubDate>Tue, 03 Nov 2015 22:12:12 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/html/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Plassering av GTM Tag</title>
      <link>https://tovare.com/post/plassering-av-gtm-tag/</link>
      <pubDate>Tue, 03 Nov 2015 22:12:12 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/plassering-av-gtm-tag/</guid>
      <description>Google Tag Manager kan plasseres i &lt;head&gt; for å begynne den asynkrone innlasting raskest mulig.</description>
      
      <content>&lt;div class=&#34;notification is-success is-primary&#34;&gt;
Update 2017: The GTM documentations has been revised to state that the tag should be in the head, as high as possible. Read the GTM &lt;a href=&#34;https://developers.google.com/tag-manager/quickstart&#34;&gt;Quck Start Guide&lt;/a&gt; for an authorotive guide to installing the GTM script.
&lt;/div&gt;
&lt;p&gt;Google Tag Manager kan puttes i head for å begynne den asynkrone innlastingen hurtigere.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Sidetittel&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;

        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;innloggingslinjen.min.js?&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;

        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;c&#34;&gt;&amp;lt;!--&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;på&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;noen&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sider&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ligger&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;det&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;statiske&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nx&#34;&gt;navno&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fgkode&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;XXXX&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;nx&#34;&gt;navnno&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ytelse&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;YIT&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;´&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;

        &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- FØR VAR DET GA HER, NÅ ER DET GTM --&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dataLayer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dataLayer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;
         &lt;span class=&#34;nx&#34;&gt;securityLevel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;navno&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;securityLevel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
         &lt;span class=&#34;nx&#34;&gt;fgKode&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;navno&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fgkode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
         &lt;span class=&#34;nx&#34;&gt;ytelse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;navno&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ytelse&lt;/span&gt;
       &lt;span class=&#34;p&#34;&gt;}];&lt;/span&gt;

    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[];&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;gtm.start&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;gtm.js&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getElementsByTagName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;createElement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;dataLayer&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;amp;l=&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;//www.googletagmanager.com/gtm.js?id=&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;parentNode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;insertBefore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;dataLayer&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;GTM-PM9RP3&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;

      &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- Ikke her --&amp;gt;&lt;/span&gt;
      &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Caïn venant de tuer son frère Abel, by Henry Vidal in Tuileries Garden in Paris, France. CC BY 2.0 Alex E. Proimo&lt;/p&gt;</content>
      
    </item>
    
    <item>
      <title>Fjerne wicket sideversjon med Tag Manager</title>
      <link>https://tovare.com/post/filter-wicket-page-version-with-tag-manager/</link>
      <pubDate>Sun, 04 Oct 2015 21:19:57 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/filter-wicket-page-version-with-tag-manager/</guid>
      <description>Viser hvordan du rensker opp URL produsert av Apache Wicket rammeverket for Google Universal Analytics.</description>
      
      <content>&lt;p&gt;Wicket URLér er litt vanskelige å fjerne fordi sideversjoner har formen ?1, ?2, ?3 osv. Vi kan ikke bruke den innebygde parameter-fjerningen i Google Analytics fordi den forutsetter parametere i formen nøkkel=verdi.&lt;/p&gt;
&lt;style&gt;
section img {
    box-shadow: 10px 10px 10px #AAAAAA;
    width:80%; 
    height: auto;
    margin-left: 10px;
}

&lt;/style&gt;
&lt;p&gt;Vi kan heller konfigurere et filter med regulære uttrykk, fordi vi må ivareta andre parametere og språket/syntaksen er ikke regulær.&lt;/p&gt;
&lt;p&gt;En oversikt over prosessen for å implementere filtreringen i Tag Manager er som følger.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Utvilking og test:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Opprett en Custom JavaScript-variabel i GTM for filtrering.&lt;/li&gt;
&lt;li&gt;Lag en ny trigger for sidene som trenger denne filtreringen.&lt;/li&gt;
&lt;li&gt;Lag en ny GA tag som inkluderer triggeren&lt;/li&gt;
&lt;li&gt;legg til triggeren på den originale slik at det ikke blir dobbelt med GA-tags. Triggingen må være MECE.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Preprod&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verifisere at løsningen fungerer.&lt;/li&gt;
&lt;li&gt;Dokumentasjon&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Produksjon:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Publiser ny versjon
(Trykk publish)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Samme teknikken brukes på events:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lag en click trigger&lt;/li&gt;
&lt;li&gt;Opprett Universal Analytics event tag&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Resultatet som ønskes er at følgende URLér:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://tovare.com/tovare/gtm/pageversion.html?1
https://tovare.com/tovare/gtm/pageversion.html
https://tovare.com/tovare/gtm/pageversion.html?1&amp;amp;k=v
https://tovare.com/tovare/gtm/pageversion.html?2=&amp;amp;k=v
https://tovare.com/tovare/gtm/pageversion.html?3=&amp;amp;k=v&amp;amp;k=v2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Blir endret til:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://tovare.com/tovare/gtm/pageversion.html
https://tovare.com/tovare/gtm/pageversion.html
https://tovare.com/tovare/gtm/pageversion.html?k=v
https://tovare.com/tovare/gtm/pageversion.html?k=v
https://tovare.com/tovare/gtm/pageversion.html?k=v&amp;amp;k=v2
&lt;/code&gt;&lt;/pre&gt;&lt;hr /&gt;
&lt;p&gt;#1. Utvikling og test&lt;/p&gt;
&lt;h2 id=&#34;opprett-en-custom-javascript-variabel-i-gtm-for-filtrering&#34;&gt;Opprett en Custom JavaScript-variabel i GTM for filtrering.&lt;/h2&gt;
&lt;p&gt;For testing fra kommandolinjen med nodejs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* wicketFilter.js */
var url = &amp;quot;https://tovare.com/tovare/gtm/pageversion.html?1&amp;quot;


exports.wicketFilter = function(url){
    var expr  = /\?[0-9]+\=?/,
        hasPageVersion = url.match(expr);
    var expr2  = /\?[0-9]+\=?\&amp;amp;/, 
        hasPageVersion2 = url.match(expr2);
    
    if(hasPageVersion2) {
        url = url.replace(hasPageVersion2[0],&#39;?&#39;);
    }else if(hasPageVersion) {
        url = url.replace(hasPageVersion[0],&#39;&#39;);
    }
    return url;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Jeg bruker Tape for test-drevet utvikling fordi internettene sa det var awesome.&lt;/p&gt;
&lt;p&gt;Testscript for Tape:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
/*
 * babel-node testWicketFilter.js 
 */

import test from &#39;tape&#39;;

var st = require(&#39;./wicketFilter.js&#39;);


// For each unit test you write,
// answer these questions:
test(&#39;Test filter&#39;, assert =&amp;gt; {
  const input = [
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html?1&amp;quot;,
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html&amp;quot;,
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html?1&amp;amp;k=v&amp;quot;,
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html?2=&amp;amp;k=v&amp;quot;,
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html?3=&amp;amp;k=v&amp;amp;k=v2&amp;quot; ];
  const expected = [
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html&amp;quot;,
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html&amp;quot;,
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html?k=v&amp;quot;,
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html?k=v&amp;quot;,
    &amp;quot;https://tovare.com/tovare/gtm/pageversion.html?k=v&amp;amp;k=v2&amp;quot;
      ];

    input.forEach(function (value, i) {
        assert.equal(st.wicketFilter(value),expected[i],&amp;quot;Rewrite &amp;quot;)
    });

  assert.end();
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Resultat av testing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tovare@tovare:~/tovare/gtm$ babel-node testWicketFilter.js 
TAP version 13
# Test filter
ok 1 Rewrite 
ok 2 Rewrite 
ok 3 Rewrite 
ok 4 Rewrite 
ok 5 Rewrite 

1..5
# tests 5
# pass  5

# ok
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Endring av det ferdig testede scriptet til GTM. Den største endringen er at {{Page Path}}-variabelen brukes. Denne variabelen er forhåndsdefinert som standard i GTM.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;TriggerGTM-1.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Den definerte variabelen kan også brukes for events.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;lag-en-ny-trigger-for-sidene-som-trenger-denne-filtreringen&#34;&gt;Lag en ny trigger for sidene som trenger denne filtreringen&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;TriggerGTM.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;lag-en-ny-ga-tag-som-inkluderer-triggeren&#34;&gt;Lag en ny GA tag som inkluderer triggeren&lt;/h2&gt;
&lt;p&gt;Lag en ny tag ved å kopiere den eksisterende, deretter konfigurer med trigger og sett &amp;ldquo;page&amp;rdquo; med variabel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;NyTag.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;konfigurer-gammelt-tag-til-å-ekskludere-triggeren&#34;&gt;Konfigurer gammelt tag til å ekskludere triggeren.&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;TagEkskludering.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Du vil enkelt se i oversikten at det ikke er overlapp, ved at unntakene i hovedtaggen matches&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;#2. Preprod&lt;/p&gt;
&lt;h2 id=&#34;verifisere-at-løsningen-fungerer&#34;&gt;Verifisere at løsningen fungerer.&lt;/h2&gt;
&lt;p&gt;Velg preview i GTM, gå til en passende URL og velg &amp;ldquo;pageview&amp;rdquo; og variables for å sjekke hva som har blitt satt:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Verifisere-1.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Dette kan også verifiseres med GA Debug for Chrome i javascript console:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://tovare.com/images/2015/10/GADebug-1.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Til slutt kan den også verifiseres i realtime-display i GA og i rapporter.&lt;/p&gt;
&lt;h2 id=&#34;dokumentasjon&#34;&gt;Dokumentasjon&lt;/h2&gt;
&lt;p&gt;Fordi containeren er dokumentasjonen og endringsloggen gir endringene som er gjort, er det nyttig å skrive i notatfeltet til containeren i &amp;ldquo;twitter&amp;rdquo;-stil hva som er nytt på et veldig overordnet nivå.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;#3. Produksjon&lt;/p&gt;
&lt;p&gt;Trykk publish&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;filtrering-av-url-i-analytics-events&#34;&gt;Filtrering av URL i Analytics Events&lt;/h1&gt;
&lt;p&gt;Det er like gunstig å lage rene URLer i events fordi man gjerne er interessert i å fokusere på events produsert på en gitt side.&lt;/p&gt;
&lt;h2 id=&#34;lag-en-click-trigger&#34;&gt;Lag en click trigger&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://tovare.com/images/2015/10/Klikk-trigger.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;opprett-universal-analytics-event-tag&#34;&gt;Opprett Universal Analytics event tag&lt;/h2&gt;
&lt;p&gt;Legg merke til at page-feltet settes til JavaScript variablen som vi lagde tidligere.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://tovare.com/images/2015/10/EventTag.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;h3 id=&#34;kilder-til-inspirasjon-og-fakta&#34;&gt;Kilder til inspirasjon og fakta:&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lunametrics.com/blog/2015/04/17/strip-query-parameters-google-analytics/&#34;&gt;Luna Metrics - Strip Query parameters Google Analytics&lt;/a&gt; En fin gjennomgang av forskjellige teknikker.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://medium.com/javascript-scene/why-i-use-tape-instead-of-mocha-so-should-you-6aa105d8eaf4&#34;&gt;JavaScript Scene - Why I use Tape instead of Mocha so should you&lt;/a&gt; Artikkel som forklarer hvorfor Tape er så fortreffelig til testing i JavaScript.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://developers.google.com/analytics/devguides/collection/analyticsjs/pages&#34;&gt;Developer Google - Pages&lt;/a&gt; Foretrukket metode å fjerne personopplysninger, rett fra kilden.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://support.google.com/tagmanager/answer/6106965?hl=en&amp;amp;ref_topic=3441647&amp;amp;vid=1-635795831591461329-3171518226&#34;&gt;Google Tag Manager - Built-in variables&lt;/a&gt; Dokumenterer de innebyggede variablene.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcijamephohjechhna&#34;&gt;Chrome store - Google Analytics Debugger&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://tovare.com/tovare/gtm/pageversion.html?909&#34;&gt;Test side tovare/gtm/pageversion.html&lt;/a&gt; Skru på javscript console og GA debugger i Chrome, refresh og trykk i vei.&lt;/p&gt;
&lt;/blockquote&gt;</content>
      
    </item>
    
    <item>
      <title>google analytics</title>
      <link>https://tovare.com/tags/google-analytics/</link>
      <pubDate>Sun, 04 Oct 2015 21:19:57 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/google-analytics/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>google analytics</title>
      <link>https://tovare.com/categories/google-analytics/</link>
      <pubDate>Sun, 04 Oct 2015 21:19:57 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/google-analytics/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>javascript</title>
      <link>https://tovare.com/categories/javascript/</link>
      <pubDate>Sun, 04 Oct 2015 21:19:57 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/javascript/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>javascript&#34;</title>
      <link>https://tovare.com/tags/javascript/</link>
      <pubDate>Sun, 04 Oct 2015 21:19:57 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/javascript/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>universal analytics</title>
      <link>https://tovare.com/tags/universal-analytics/</link>
      <pubDate>Sun, 04 Oct 2015 21:19:57 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/universal-analytics/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>universal analytics</title>
      <link>https://tovare.com/categories/universal-analytics/</link>
      <pubDate>Sun, 04 Oct 2015 21:19:57 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/universal-analytics/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>wicket</title>
      <link>https://tovare.com/tags/wicket/</link>
      <pubDate>Sun, 04 Oct 2015 21:19:57 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/wicket/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>wicket</title>
      <link>https://tovare.com/categories/wicket/</link>
      <pubDate>Sun, 04 Oct 2015 21:19:57 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/categories/wicket/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Åpne data - Stillinger fra NAV.no</title>
      <link>https://tovare.com/post/stillinger-fra-nav-no/</link>
      <pubDate>Mon, 27 Apr 2015 18:09:29 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/stillinger-fra-nav-no/</guid>
      <description></description>
      
      <content>&lt;p&gt;Å skrape nav.no for informasjon om stillinger er ganske tungvindt. Det er to enkle måter å få alt gjennom åpne og publiserte grensesnitt.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RSS&lt;/li&gt;
&lt;li&gt;Widget&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For å gjøre et utvalg, gjør et enkelt søk på kategorien som er av interesse eller trykk søk på forsiden for å få alt.&lt;/p&gt;
&lt;p&gt;Se nederst på siden for lenker til en RSS 2.0 feed og lenke til en side med Widget-versjonen. På widget siden får du en skreddersydd HTML-snutt for å legge inn stillingene på en vilkårlig side uten noen form for utvikling.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;rss_navno.PNG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Du kan endre antall stillinger som vises med å endre tallet i &lt;strong&gt;rpp&lt;/strong&gt;-parameteren fra 50 til f.eks. 2000 eller et annet tall. F.eks. 10 annonser er vist under.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Tips:&lt;/em&gt; For engelskspråklige stillinger er konvensjonen å bruke søkeordet english (&lt;a href=&#34;https://tjenester.nav.no/stillinger/stillinger?q=english&#34;&gt;https://tjenester.nav.no/stillinger/stillinger?q=english&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;nav_stillinger&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://tjenester.nav.no/stillinger/widget?sort=akt&amp;amp;rpp=10&amp;amp;p=0&amp;amp;rv=al&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I RSS ligger hele stillingsannonsen og metadata for stillingen i gdata-tagger for publiseringsdato, arbeidsgiver, industri og stillingsfunksjon. Utover dette er kodeverket på tjenesten standardisert, slik at det bør kunne danne et godt grunnlag for mange analysetyper.&lt;/p&gt;
&lt;p&gt;Selve annonsen ligger inne i en CDATA blokk for at den skal være kompatibel med spesifikasjonen til RSS.&lt;/p&gt;
&lt;h3&gt;Skraping&lt;/h3&gt;
&lt;blockquote&gt;
  &lt;h4&gt;Status&lt;/h4&gt;
  &lt;div id=&#34;e1&#34;&gt; &lt;/div&gt;
&lt;/blockquote&gt;
&lt;script src=&#34;https://tovare.com/tovare/js/d3.v3.min.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;script&gt;
d3.json(&#34;https://tovare.com/api/stillinger&#34;, function(data) {
    console.log(data);
    mdiv = d3.select(&#34;#e1&#34;);
    mdiv.append(&#34;p&#34;).text( &#34;Stillinger i dag &#34; + data.stillinger );
    mdiv.append(&#34;p&#34;).text( &#34;Annonser i dag &#34; + data.annonser);
    mdiv.append(&#34;p&#34;).text( &#34;Nye &#34; + data.nye );
});
&lt;/script&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/tovare/js/d3.v3.min.js&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;

    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;e1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;

    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nx&#34;&gt;d3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://tovare.com/api/stillinger&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
        &lt;span class=&#34;nx&#34;&gt;mdiv&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;d3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;select&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#e1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
        &lt;span class=&#34;nx&#34;&gt;mdiv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;h2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Stillinger i dag &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;stillinger&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
        &lt;span class=&#34;nx&#34;&gt;mdiv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;h2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Annonser i dag &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;annonser&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
      &lt;span class=&#34;nx&#34;&gt;mdiv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;h2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Nye &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;nye&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Scrape server: &lt;a href=&#34;https://github.com/tovare/nstillinger&#34;&gt;https://github.com/tovare/nstillinger&lt;/a&gt;&lt;/p&gt;</content>
      
    </item>
    
    <item>
      <title>arbeid</title>
      <link>https://tovare.com/tags/arbeid/</link>
      <pubDate>Mon, 23 Feb 2015 03:18:49 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/arbeid/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Arbeidsmarkedet i januar</title>
      <link>https://tovare.com/post/arbeidsmarkedet_januar2015/</link>
      <pubDate>Mon, 23 Feb 2015 03:18:49 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/arbeidsmarkedet_januar2015/</guid>
      <description>Inspirert av NAVs fabelaktige publikasjon, Arbeid og Velferd, er dette et første forsøk på å koble data fra NAV med et kart</description>
      
      <content>&lt;p&gt;Inspirert av NAVs fabelaktige publikasjon, Arbeid og Velferd, er dette et første forsøk på å koble data fra NAV med et kart.&lt;/p&gt;
&lt;p&gt;Trykk eller pek på kartet for å se tall for fylket.&lt;/p&gt;
&lt;iframe src=&#34;150221_arbeidsmarked.html&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34; width=&#34;800&#34; height=&#34;620&#34; frameBorder=&#34;0&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;Kilde: NAV&lt;/p&gt;
&lt;p&gt;Utgangspunktet er en svg fil fra wikipedia og en datatabell fra NAV. For å gjøre det lettere å populere fylkene med data ble SVG-filen endret slik at alle fylker var i grupper.&lt;/p&gt;
&lt;p&gt;Fargene settes med en Colorbrewer skala, men valgte en lineær fargeovergang.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lenker&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nav.no/no/NAV+og+samfunn/Statistikk/Arbeidssokere+og+stillinger+-+statistikk/Hovedtall+om+arbeidsmarkedet&#34;&gt;Hovedtall om arbeidsmarkedet &lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nav.no/no/NAV+og+samfunn/Kunnskap/Analyser/Arbeid+og+velferd&#34;&gt;Arbeid og velferd&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.lovholm.net/2013/03/06/norske-illustrasjonskart-pa-fylkes-og-kommuneniva-med-svg/&#34;&gt;SVG fra Wikipedia via Lovholm.net&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://d3js.org/&#34;&gt;http://d3js.org/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;iframe width=&#34;400&#34; height=&#34;325&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; src=&#34;https://www.google.no/publicdata/embed?ds=z8o7pt6rd5uqa6_&amp;amp;ctype=l&amp;amp;strail=false&amp;amp;bcs=d&amp;amp;nselm=h&amp;amp;met_y=unemployment_rate&amp;amp;fdim_y=seasonality:sa&amp;amp;fdim_y=sex:f&amp;amp;scale_y=lin&amp;amp;ind_y=false&amp;amp;rdim=country_group&amp;amp;idim=country:no&amp;amp;ifdim=country_group&amp;amp;hl=en_US&amp;amp;dl=en&amp;amp;ind=false&amp;amp;icfg&#34;&gt;&lt;/iframe&gt;</content>
      
    </item>
    
    <item>
      <title>d3js</title>
      <link>https://tovare.com/tags/d3js/</link>
      <pubDate>Mon, 23 Feb 2015 03:18:49 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/d3js/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Visualiseringssøndag</title>
      <link>https://tovare.com/post/visualiseringssondag/</link>
      <pubDate>Sun, 15 Feb 2015 20:26:23 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/visualiseringssondag/</guid>
      <description>Et lite eksperiment med interaktiv d3js visualisering.</description>
      
      <content>&lt;p&gt;Grafen under viser et adferdsmønster over 4 uker.&lt;/p&gt;
&lt;p&gt;Trykk eller pek over for å se detaljer.&lt;/p&gt;
&lt;div&gt;
&lt;iframe src=&#34;150215_meldekort.html&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34; width=&#34;600&#34; height=&#34;420&#34; frameBorder=&#34;0&#34;&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Dette er dynamisk generert SVG (Strukturert vektor grafikk) med datagrunnlag i en csv fil. Lagt inn som en iframe uten ramme.&lt;/p&gt;
&lt;p&gt;Jeg konfigurerte webserveren slik at når den treffer URL&amp;rsquo;er med stien /tovare/, hentes det filer fra en en public_html katalog på en bruker fremfor å sende forespørselen til Ghost.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lenker&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://d3js.org&#34;&gt;http://d3js.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://colorbrewer2.org/&#34;&gt;http://colorbrewer2.org/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</content>
      
    </item>
    
    <item>
      <title>Hello New Technology Stack</title>
      <link>https://tovare.com/post/hello-world/</link>
      <pubDate>Sat, 14 Feb 2015 18:36:06 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/hello-world/</guid>
      <description></description>
      
      <content>&lt;p&gt;My previos technology stack was getting a bit old, so I decided to change things up a bit.&lt;/p&gt;
&lt;p&gt;My previous CMS was MeshCMS running on Tomcat/Java. Using the static page export, the files where served by Apache. In addition i had an Apache/Confluence/Tomcat/Java/PostreSQL stack for notetaking. All hosted on Eapps.com which has done a good job hosting a stable Centos 5 machine, keeping it secure and running.&lt;/p&gt;
&lt;p&gt;Technology, the internet and common practices has evolved somewhat since Java became cool on the server side back in 1998, when I had my first Servlet writing experience deployed on the JRUN application server. A few months later with IBM Websphere. That&amp;rsquo;s 17 years ago. Thankfully technology evolves really slowly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My new technology stack is hosted by DigitalOcean in europe. It&amp;rsquo;s the $10 plan with an additional $2 for basic backup services. The new stack is Ghost/node.js/Ubuntu &lt;del&gt;10.4 LTS&lt;/del&gt; 16.04.01 in addition i use the excellent Cloud 9 IDE.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve decided to discontinue using Confluence. Over the years since I first got an account in 2008, I&amp;rsquo;ve been using Evernote more and more and upgraded to premium a while back. For other uses Cloud9 gives me the functionality I want.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.digitalocean.com/&#34;&gt;https://www.digitalocean.com/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://ghost.org/&#34;&gt;https://ghost.org/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://nodejs.org&#34;&gt;http://nodejs.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://evernote.com&#34;&gt;https://evernote.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://c9.io&#34;&gt;https://c9.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://sslmate.com&#34;&gt;https://sslmate.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.hotjar.com/r/r5a50cd&#34;&gt;https://www.hotjar.com/r/r5a50cd&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My primary tool for notetaking is still paper. I&amp;rsquo;ve used Moleskine for several years,  but changed it up a bit last week by getting a couple of Conceptum notebooks from England. The nice thing about them is that they have a place to put my Mitsubishi Hi-Uni pencils from Japan.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;ConceptumNotebook.jpg&#34; alt=&#34;Conceptum Notebook&#34; /&gt;&lt;/p&gt;</content>
      
    </item>
    
    <item>
      <title>technology</title>
      <link>https://tovare.com/tags/technology/</link>
      <pubDate>Sat, 14 Feb 2015 18:36:06 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/technology/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Create HTML imagemaps using Inkscape</title>
      <link>https://tovare.com/post/create-html-imagemaps-using-inkscape/</link>
      <pubDate>Tue, 30 Jul 2013 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/create-html-imagemaps-using-inkscape/</guid>
      <description></description>
      
      <content>&lt;p&gt;How to create an image map using Inkscape and the ImageMap tool&lt;/p&gt;
&lt;h3 id=&#34;getting-started&#34;&gt;Getting started&lt;/h3&gt;
&lt;p&gt;Fist prepare the image you would like to add an image map to.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;800px_BPM_300dpi.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Import the image into Inkscape using the Import command, linking the image rather than embedding it. Modify the page properties to match the size of the image, and the image properties to ensure it&amp;rsquo;s starts at position 0x0. (If you don&amp;rsquo;t your coordinates might not be perfectly aligned).&lt;/p&gt;
&lt;p&gt;Add another layer for the lines, and make the layer with the image a bit transparent so that it&amp;rsquo;s easy to see the lines you&amp;rsquo;ve drawn.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;layer.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Select the bezier tool, and check for straight lines so that you don&amp;rsquo;t accidentally create curves.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;straight.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Proceed to draw your polygons and make sure that they are closed. It is very usefull to add meaningfull names to the polygons via properties to make it easier to add the links once the HTML Map has been created.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;resized1871887174.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Save the file, and load it into inkscapemap , you should see something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;inkscapemap.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Save as HTML Map and add links etc, to suit your needs. Click below to see.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;
&lt;map name=&#34;map1&#34;&gt; 
&lt;area title=&#34;Workgroup Active&#34; shape=&#34;poly&#34;  coords=&#34;45,124, 59,110, 78,111, 88,121, 91,136, 84,153, 62,157, 48,148, 43,137&#34; alt=&#34;wgActive&#34;  href=&#34;#wgactive&#34;&gt;
 &lt;area title=&#34;friday&#34; shape=&#34;poly&#34; coords=&#34;153,113, 144,124, 143,140, 152,154, 167,158, 184,152, 191,138, 189,125, 181,114, 166,109&#34; alt=&#34;friday&#34; href=&#34;#friday&#34; &gt;
 &lt;area title=&#34;wg_status&#34; shape=&#34;poly&#34; coords=&#34;236,105, 237,164, 383,164, 382,103&#34; alt=&#34;wg_status&#34; href=&#34;#wg_status&#34; &gt;
 &lt;area title=&#34;isstillactive&#34; shape=&#34;poly&#34; coords=&#34;481,73, 479,75, 420,133, 480,194, 541,134&#34; alt=&#34;isstillactive&#34; href=&#34;#is_still_active&#34;&gt;
 &lt;area title=&#34;sendCurrentList&#34; shape=&#34;poly&#34; coords=&#34;615,96, 614,98, 616,173, 758,172, 759,94&#34; alt=&#34;sendCurrentList&#34; href=&#34;#send_current_list&#34;&gt;
 &lt;area title=&#34;issuelist&#34; shape=&#34;poly&#34; coords=&#34;554,327, 602,326, 602,386, 554,386&#34; alt=&#34;issuelist&#34; href=&#34;#isssue_list&#34;&gt;
 &lt;area title=&#34;processEnd&#34; shape=&#34;poly&#34; coords=&#34;562,254, 553,263, 556,276, 567,280, 577,275, 579,263, 574,256&#34; alt=&#34;processEnd&#34; href=&#34;#process_end&#34;&gt;
&lt;/map&gt;
&lt;img src=&#34;800px_BPM_300dpi.png&#34; alt=&#34;&#34; usemap=&#34;#map1&#34; &gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id=&#34;references&#34;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://sourceforge.net/projects/inkscapemap/&#34;&gt;InkscapeMap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
      
    </item>
    
    <item>
      <title>inkscape</title>
      <link>https://tovare.com/tags/inkscape/</link>
      <pubDate>Tue, 30 Jul 2013 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/inkscape/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>svg</title>
      <link>https://tovare.com/tags/svg/</link>
      <pubDate>Tue, 30 Jul 2013 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/svg/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Guess the animal</title>
      <link>https://tovare.com/post/guess-the-animal/</link>
      <pubDate>Sat, 30 Aug 2008 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/guess-the-animal/</guid>
      <description></description>
      
      <content>&lt;p&gt;This code implements a simple binary search for answers. The nodes all have questions, but the leaf-node has a suggestion for an answer.&lt;/p&gt;
&lt;p&gt;The player is prompted to verify if this is correct, but if it&amp;rsquo;s not the player is requested for the right answer and a question to ask to tell the difference&lt;/p&gt;
&lt;h3 id=&#34;console-version&#34;&gt;Console version&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;
&lt;span class=&#34;cm&#34;&gt;/*
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt; *  Guess.java - main file.
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt; *
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;java.io.*&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;java.util.*&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;yes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;no&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;desc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;desc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ConsoleIO&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;YES&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NO&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;HashSet&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;positives&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HashSet&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;HashSet&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;negatives&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HashSet&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;


	&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;io&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;BufferedReader&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;br&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;populatePositives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;positives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;positives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Y&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;positives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;YEAH&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;populateNegatives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;negatives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;NO&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;negatives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;N&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;negatives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;NOPE&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;negatives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;FUCK&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;ConsoleIO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;br&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;BufferedReader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;InputStreamReader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;));&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;checkInstance&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;populateNegatives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;populatePositives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;checkInstance&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;br&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;readLine&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IOException&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Input error&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 * Get an input from the user, can be any string.
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 *
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 * @param prompt
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 * @return
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 */&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;getInput&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 * Get a simple yes/no answer.
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 *
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 * @param prompt
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 * @return
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 */&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;getYesNo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;getInput&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toUpperCase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;positives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;contains&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
				&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
			&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;negatives&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;contains&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
				&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
			&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;getInput&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toUpperCase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;



&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt; *
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt; * @author tovare
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt; *
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Guess&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;

	&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;head&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;

	&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
		&lt;span class=&#34;c1&#34;&gt;// Traverse our yes/no questions until we hit a leaf node.
&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;		&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;no&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getYesNo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;? &amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
				&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
			&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
				&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;no&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
			&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getYesNo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Is it a &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;? &amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Yippee! I win! \n\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInput&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;What animal is it? &amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;));&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInput&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;What seperates a &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34; from a &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;? &amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;));&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;yes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;no&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;head&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;play&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;head&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Dog&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inPlay&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getYesNo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Animals, wanna play? &amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inPlay&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;inPlay&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ConsoleIO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getYesNo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Wanna play again? &amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;


	&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 * @param args
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;	 */&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;Guess&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;game&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Guess&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;game&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;play&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;applet-version&#34;&gt;Applet version&lt;/h3&gt;
&lt;p&gt;The applet version was written in 1997 and uses a state machine to keep track of the current state while responding to asynchronous events from the GUI.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/*
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt; * Requires JDK 1.1 or higher
&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;java.awt.*&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;java.awt.event.*&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;java.applet.*&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;no&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;yes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;no&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;GuessTheAnimal&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Applet&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ActionListener&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;long&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;serialVersionUID&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;1L&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GAMESTART_REQUEST&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPUTER_GUESSES&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPUTER_GUESSES_FEATURE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ANIMAL_NAME_REQUEST&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NEW_FEATURE_REQUEST&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;TextArea&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;n&#34;&gt;TextField&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;GuessTheAnimal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;head&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;DOG&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GAMESTART_REQUEST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;setLayout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;BorderLayout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;());&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TextArea&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;COMPUTER: Animals, wanna play?\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TextField&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Center&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;South&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addActionListener&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GAMESTART_REQUEST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;askQuestion&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;no&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Is it a &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;?\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;?\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;respond&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;userText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GAMESTART_REQUEST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
				&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;userText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startsWith&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Y&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
					&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
					&lt;span class=&#34;n&#34;&gt;askQuestion&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
					&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPUTER_GUESSES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
				&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
				&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPUTER_GUESSES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
				&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;no&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
					&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;userText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startsWith&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Yippee, I win!\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Wanna play again?\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GAMESTART_REQUEST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
					&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;What animal is it?\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ANIMAL_NAME_REQUEST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
					&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
				&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
					&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;userText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startsWith&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;askQuestion&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
					&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;userText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startsWith&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;NO&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;no&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;askQuestion&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
					&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
						&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Answer Yes or No please.\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
					&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
				&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
				&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ANIMAL_NAME_REQUEST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
				&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;yes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;userText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
				&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;What separates a &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;userText&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34; from a &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;?\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
				&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NEW_FEATURE_REQUEST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
				&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NEW_FEATURE_REQUEST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
				&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;no&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
				&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;userText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
				&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GAMESTART_REQUEST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
				&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Wanna play again?\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
				&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;actionPerformed&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ActionEvent&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;respond&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toUpperCase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;());&lt;/span&gt;
		&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content>
      
    </item>
    
    <item>
      <title>2008</title>
      <link>https://tovare.com/post/2008/</link>
      <pubDate>Mon, 18 Aug 2008 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/2008/</guid>
      <description>Got married</description>
      
      <content>&lt;h3 id=&#34;16-mai-2008&#34;&gt;16. Mai 2008&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;IMG_3361.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;IMG_3390.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;got-married&#34;&gt;Got married&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;IMG_3474.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;IMG_3541.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
</content>
      
    </item>
    
    <item>
      <title>personal</title>
      <link>https://tovare.com/tags/personal/</link>
      <pubDate>Mon, 18 Aug 2008 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/tags/personal/</guid>
      <description></description>
      
      <content></content>
      
    </item>
    
    <item>
      <title>Soundex in the Io Language</title>
      <link>https://tovare.com/post/soundex-in-the-io-language/</link>
      <pubDate>Wed, 16 Apr 2003 14:00:00 +0000</pubDate>
      <author>Tov Are Jacobsen</author>
      <guid>https://tovare.com/post/soundex-in-the-io-language/</guid>
      <description></description>
      
      <content>&lt;p&gt;Soundex [16.04.03] (updated 20.01.05)&lt;/p&gt;
&lt;p&gt;This code is my first stab at doing something in the Io Language (&lt;a href=&#34;http://www.iolanguage.com&#34;&gt;www.iolanguage.com&lt;/a&gt;)[http://www.iolanguage.com/about/]&lt;/a&gt; which is a small footprint scripting language. The Soundex algorithm for database lookup applications and genealogy research. It finds certain classes of similar-sounding names. Not implemented is Name prefixes and zero-padding.&lt;/p&gt;
&lt;h3 id=&#34;implementation&#34;&gt;Implementation&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# soundex.io -- generate soundex encodings.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 1. Keep the first letter.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 2. Drop all the vowels A E I O U W Y H.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 3. Encode the remaining 3 letters into:&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#      B P F V            1&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#      C S K G J Q X Z    2&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#      D T                3&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#      L                  4&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#      M N                5&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#      R                  6&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 4. Double letters are treated as one.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 5. Double letters with same encoding is treated as one.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Tov Are Jacobsen April, 2003 &amp;lt;mail@tovare.com&amp;gt;&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Language: http://www.iolanguage.com&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Version:  2005-01-19 (Jon Kleiser)&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#------------------------------------------------------------------------------&lt;/span&gt;

Soundex :&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; Object clone &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
	encmap :&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; Map clone &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;B&amp;#34;&lt;/span&gt;, 1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;, 1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;F&amp;#34;&lt;/span&gt;, 1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;V&amp;#34;&lt;/span&gt;, 1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt;, 2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;S&amp;#34;&lt;/span&gt;, 2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;K&amp;#34;&lt;/span&gt;, 2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;G&amp;#34;&lt;/span&gt;, 2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;J&amp;#34;&lt;/span&gt;, 2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Q&amp;#34;&lt;/span&gt;, 2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt;, 2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Z&amp;#34;&lt;/span&gt;, 2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;D&amp;#34;&lt;/span&gt;, 3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;T&amp;#34;&lt;/span&gt;, 3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;L&amp;#34;&lt;/span&gt;, 4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;M&amp;#34;&lt;/span&gt;, 5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;N&amp;#34;&lt;/span&gt;, 5&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		atPut&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;R&amp;#34;&lt;/span&gt;, 6&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;#--------------------------------------------&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Converts a string into soundex encoding.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Arguments:&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#    name     String containing a surname&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#--------------------------------------------&lt;/span&gt;

Soundex encode :&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; method&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;name,
	&lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; name upper
	ename :&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
	name foreach&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;i, s,
		&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; 0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
			&lt;span class=&#34;nv&#34;&gt;ename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; ename append&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s asCharacter&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
			&lt;span class=&#34;c1&#34;&gt;# Drop all unmapped characters&lt;/span&gt;
			code :&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; encmap at&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s asCharacter&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;code !&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; Nil,
				&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;code asString !&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; ename at&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;-1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; asCharacter,
					&lt;span class=&#34;nv&#34;&gt;ename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; ename append&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;code&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
					&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;ename &lt;span class=&#34;nv&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; 4, &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; ename&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
				&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
			&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; ename
&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;test-code&#34;&gt;Test code&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# testSoundex.io - Test the Soundex.io implementation.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Tov Are Jacobsen 2003 &amp;lt;mail@tovare.com&amp;gt;&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;

doFile&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;launchPath appendPath&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;soundex.io&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;

&lt;span class=&#34;s2&#34;&gt;&amp;#34;The soundex coding is used to encode surnames, so that similar&amp;#34;&lt;/span&gt; linePrint
&lt;span class=&#34;s2&#34;&gt;&amp;#34;sounding names has identical codes.&amp;#34;&lt;/span&gt; linePrint

surnames :&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; List clone &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Jensen&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Jonassen&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Jonasen&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Jacobsen&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Jakobsen&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Fischer&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Fisher&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Gustavsen&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Gustafsson&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Gustafsen&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
	add&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Handeland&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

surnames foreach&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;j, name,
	write&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Soundex encode&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;name&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34; (&amp;#34;&lt;/span&gt;,name, &lt;span class=&#34;s2&#34;&gt;&amp;#34;)\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Soundex Indexing System &lt;a href=&#34;http://www.archives.gov/publications/general-info-leaflets/55.html&#34;&gt;http://www.archives.gov/publications/general-info-leaflets/55.html&lt;/a&gt; NARA - U.S. National Archives &amp;amp; Records Administration&lt;/li&gt;
&lt;/ul&gt;</content>
      
    </item>
    
  </channel>
</rss>